· 9 years ago · Aug 21, 2016, 01:30 PM
1main() { }
2// ================ [ Инклуды ] ================ //
3#include <a_samp> //Инклуд в котором хранÑÑ‚ÑÑ Ð²Ñе оÑновные функции SA:MP'a
4#include <a_mysql> //СобÑтвенно, инклуд, в котором хранитÑÑ Ð¾Ð±ÑŠÑвление вÑех функций Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼
5// ================ [ МакроÑÑ‹ ] ================ //
6#define MYSQL_HOST "127.0.0.1"// ÐдреÑ, по которому раÑположен MySQL-Сервер
7#define MYSQL_USER "gs993"// Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, на которого была Ñоздана база данных
8#define MYSQL_DATABASE "gs993"// Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных
9#define MYSQL_PASSWORD "Fl22WWmS17"// Пароль Ð´Ð»Ñ Ð´Ð¾Ñтупа к Ñерверу MySQL
10#define publics%0(%1) forward%0(%1); public%0(%1) // Юзать паблики без форвардов
11#define SPD ShowPlayerDialog // Ð”Ð»Ñ ÑƒÐ´Ð¾Ð±Ñтва
12#define SCM SendClientMessage // Ð”Ð»Ñ ÑƒÐ´Ð¾Ð±Ñтва
13#define DSI DIALOG_STYLE_INPUT // Ð”Ð»Ñ ÑƒÐ´Ð¾Ð±Ñтва
14#define DSM DIALOG_STYLE_MSGBOX // Ð”Ð»Ñ ÑƒÐ´Ð¾Ð±Ñтва
15#define random_spawn_1 rsp1 //Рандом Ñпавн
16/*------------------------------- К реге -------------------------------*/
17#define IsPlayerAuthorized(%0) player_is_authorized{%0}
18#define SetPlayerAuthorized(%0,%1) player_is_authorized{%0} = %1
19//МакроÑÑ‹ Ð´Ð»Ñ ÑƒÐ´Ð¾Ð±Ñтва
20#define PLAYER_OFFLINE 0
21#define PLAYER_ONLINE 1
22// ================ [ Переменные ] ================ //
23new mysql_connect_id; //Ðто целочиÑÐ»ÐµÐ½Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ, в которой хранитÑÑ ID подключениÑ,
24 //которое потребуетÑÑ Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ большинÑтва функций.
25new player_is_authorized[MAX_PLAYERS char]; //Ðта проверка может пригодитÑÑ Ð² ÑлучаÑÑ…,
26 //когда нужно запретить игроку выполнÑть какие-либо дейÑтвиÑ
27 //пока он не авторизировалÑÑ.
28new Float:SpawnCoords[][4] = { //рандом Ñпавн
29 {1756.1600,-1897.6012,13.5612,268.9965},
30 {1216.2673,-1813.9586,16.5938,267.4066} // x,y,z,угол поворота.
31};
32new registr[MAX_PLAYERS];//
33// ================ [ Enum's ] ================ //
34enum e_PLAYER_INFO //Хранение данных игрока //ОбъÑвление перечиÑлениÑ
35{
36 pID, //Первый член перечиÑлениÑ. Так как значение не указано, по-умолчанию имеет ID 0
37 pName[MAX_PLAYER_NAME], //Ðик Игрока //Второй член перечиÑлениÑ. Имеет ID 1
38 pPassword[31], // Пароль игрока //Третий член перечиÑлениÑ. Имеет ID 2
39 pReferal[MAX_PLAYER_NAME], // ПриглаÑивший игрок //Четвертый член перечиÑлениÑ. Имеет ID 3
40 pEmail[40], // ÐмÑйл игрока //ПÑтый член перечиÑлениÑ. Имеет ID 4
41 pSex, // Пол игрока //ШеÑтой член перечиÑлениÑ. Имеет ID 5
42 pSkin, // Скин игрока //Седьмой член перечиÑлениÑ. Имеет ID 6
43 pLevel // Уровень игрока //Седьмой член перечиÑлениÑ. Имеет ID 7
44};
45new pInfo[MAX_PLAYERS][e_PLAYER_INFO]; //Двумерный маÑÑив,
46 //где Ð¿ÐµÑ€Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° Ñчеек подразумевает разделение на 1000 Ñчеек (под каждого игрока),
47 //а Ð²Ñ‚Ð¾Ñ€Ð°Ñ - обращение к членам перечиÑлениÑ
48/*---------------------
49enum - оператор
50e_PLAYER_INFO - название перечиÑлениÑ
51-----------------------*/
52enum
53{
54 dKickMessage,//ÐвтоматичеÑки займёт ID 0
55 dRegister,//ID 1
56 dLogin,//ID 2
57 dRules,//ID 3
58 dReferal,//ID 4
59 dEmail,//ID 5
60 dSex//ID 6
61};
62// ================ [ МаÑÑивы ] ================ //
63 //ЧаÑть 1
64static const rules_1[] = "\
65 1. Игровой процеÑÑ\n\
66 Запрещено:\n\
67 - ИÑпользование любых программ, Ñкриптов, читов и Ñ‚.п. дающих нечеÑтное преимущеÑтво в игре.\n\
68 - ИÑпользование багов (ошибок,неиÑправноÑтей мода).\n\
69 - ИÑпользовать ESC в целÑÑ… ухода от погони/Ñмерти.\n\
70 - Убивать игроков на Ñпавне (МеÑто возраждениÑ, базы организаций).\n\
71 - Убивать игроков при помощи транÑпорта (Давить, ÑтрелÑть Ñ Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого меÑта).\n\
72 - УбийÑтво/нанеÑение физичеÑкого вреда игрокам без причины (ДМ - Death Match).\n\
73 - Развод игроков на деньги.\n\
74 - ПроÑьбы, вымогательÑтва паролей от акканута.\n\
75 - Выдача ÑÐµÐ±Ñ Ð·Ð° членов админиÑтрации\n\
76 - Злоупотребление игровыми возможноÑÑ‚Ñми Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½ÐµÑƒÐ´Ð¾Ð±Ñтва игрокам.\n\n\
77 2. Ðик в игре\n\
78 (Ñменить ник можно через /mm >> ÐаÑтройки >> Сменить ник)\n\
79 - Ðик должен ÑоÑтоÑть из Имени_Фамилии Ñ Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ñ‹Ñ… букв.\n\
80 Запрещено:\n\
81 - ИÑпользовать чужие (Уже кем-то занÑтые) ники.\n\
82 - ИÑпользовать ники Ñодержащие Ðецензурные или оÑкорбительные Ñлова.\n\
83 - ОтправлÑть более одной заÑвки в Ñ‡Ð°Ñ (ИÑключение: ПроÑьба админиÑтрации).\n\
84 - ЕÑли вам отказали в Ñмене ника, Значит нельзÑ.";
85 //ЧаÑть 2
86static const rules_2[] = "\
87 3. Чат Ñервера.\n\
88 OOC (Out Of Character) - Ñто вÑе, что каÑаетÑÑ Ñ€ÐµÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ мира.\n\
89 IC (In Character) - Ñто вÑе, что каÑаетÑÑ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ мира, то еÑть игры\n\
90 Запрещено:\n\
91 - РугательÑтво, оÑÐºÐ¾Ñ€Ð±Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð½ÐµÑ†ÐµÐ½Ð·ÑƒÑ€Ð½Ð°Ñ Ñ€ÐµÑ‡ÑŒ.\n\
92 - Угрозы игрокам (Ðе отноÑÑщиеÑÑ Ðº игровому процеÑÑу).\n\
93 - ПиÑать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² верхнем региÑтре (Caps Lock).\n\
94 - ПиÑать в чат объÑвлений ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ отноÑÑщихÑÑ Ðº Role Play.\n\
95 - ИÑпользование OOC информации в IC (Metagaming).\n\
96 - ПиÑать одно и тоже Ñообщение Ñлишком чаÑто.\n\
97 - ОбÑуждать, критиковать дейÑÑ‚Ð²Ð¸Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтрации.\n\
98 - Реклама Ñторонних реÑурÑов.\n\n\
99 4. ÐдминÑтрациÑ.\n\
100 - Сообщать админÑтрации о каких либо нарушениÑÑ… из данных правил (/mm >> Репорт).\n\
101 - ÐдминиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑамоÑтоÑтельно выбирает штрафные Ñанкции Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из Ñлучаев.\n\
102 - Запрещено препÑÑ‚Ñтвовать админиÑтрации в работе.\n\
103 - Решение админиÑтрации ÑвлÑетÑÑ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ и не подлежит обÑуждению.\n\n\
104 5. ТорговлÑ.\n\
105 - Запрещены любые денежные махинации.\n\
106 - Запрещена продажа / покупка чего либо, за реальные деньги.\n\
107 - Запрещен обмен внеигровых предметов в любой форме, на игровые.\n\
108 - Запрещен обмен чего либо между игровыми Ñерверами.\n\
109 - Запрещена продажа / передача аккаунов.";
110// ================ [ Паблики ] ================ //
111public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
112{
113 switch(dialogid)
114 {
115 case dRegister:
116 {
117 if(!response)
118 {
119 Kick(playerid);
120 }
121 if(!strlen(inputtext)) return SPD(playerid, dKickMessage, DSM, "Ошибка", "{FF0000}Длинна Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть от 6 до 15 Ñимволов.", "", "Повтор");
122 else if(strlen(inputtext) < 6) return SPD(playerid, dKickMessage, DSM, "Ошибка", "{FF0000}Длинна Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть от 6 до 15 Ñимволов.", "", "Повтор");
123 else if(strlen(inputtext) > 15) return SPD(playerid, dKickMessage, DSM, "Ошибка", "{FF0000}Длинна Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть от 6 до 15 Ñимволов.", "", "Повтор");
124 for(new i = strlen(inputtext)-1; i != -1; i--)
125 {
126 switch(inputtext[i])
127 {
128 case '0'..'9', 'а'..'Ñ', 'a'..'z', 'Ð'..'Я', 'A'..'Z', '_', '-': continue;
129 default: return ShowPlayerDialog(playerid, dKickMessage, DIALOG_STYLE_MSGBOX, "Ошибка", "{1DCF91}Пароль не должен Ñодержать руÑÑкие буквы и Ñимволы!", "Повтор", "Отмена");
130 }
131 }
132 pInfo[playerid][pPassword][0] = EOS;
133 strins(pInfo[playerid][pPassword], inputtext, 0);
134 //CreateNewAccount(playerid, pInfo[playerid][pPassword]);
135 new rules_mes_1[sizeof(rules_1)];
136 format(rules_mes_1, sizeof(rules_mes_1),rules_1);
137 SPD(playerid, dRules, DSM, !"{CFCFCF}Правила Ñервера", rules_mes_1, !"СоглаÑен", !"Выйти");
138 return 1;
139 }
140 case dLogin:
141 {
142 if(!response)
143 {
144 Kick(playerid);
145 }
146 if(!strlen(inputtext))
147 return
148 SendClientMessage(playerid, 0xFFFF00FF, "Ошибка: Ðеверный пароль. ПодÑказка: Recover - воÑÑтановить пароль через E-Mail адреÑ.");
149 for(new i = strlen(inputtext)-1; i != -1; i--)
150 {
151 switch(inputtext[i])
152 {
153 case '0'..'9', 'а'..'Ñ', 'a'..'z', 'Ð'..'Я', 'A'..'Z', '_', '-': continue;
154 default:
155 return
156 SendClientMessage(playerid, 0xFFFF00FF, "Ошибка: Ðеверный пароль. ПодÑказка: Recover - воÑÑтановить пароль через E-Mail адреÑ.");
157 }
158 }
159 if(!strcmp(pInfo[playerid][pPassword], inputtext))
160 {
161 new query_string[49+MAX_PLAYER_NAME];
162 format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]);
163 mysql_function_query(mysql_connect_id, query_string, true, "UploadPlayerAccount","i", playerid);
164 }
165 else
166 {
167 switch(GetPVarInt(playerid, "WrongPassword"))
168 {
169 case 0: SendClientMessage(playerid, 0xFFFF00FF, !"Ошибка: Ðеверный пароль. ПодÑказка: Recover - воÑÑтановить пароль через E-Mail адреÑ.");
170 case 1: SendClientMessage(playerid, 0xFFFF00FF, !"Ошибка: Ðеверный пароль. ПодÑказка: Recover - воÑÑтановить пароль через E-Mail адреÑ.");
171 case 2: SendClientMessage(playerid, 0xFFFF00FF, !"Ошибка: Ðеверный пароль. ПодÑказка: Recover - воÑÑтановить пароль через E-Mail адреÑ.");
172 case 3: SendClientMessage(playerid, 0xFFFF00FF, !"Ошибка: Ðеверный пароль. Сервер закрыл Ñоединение.");
173 default:
174 {
175 SendClientMessage(playerid, 0xFFFF00FF, !"Ошибка: Ðеверный пароль. Сервер закрыл Ñоединение.");
176 return Kick(playerid);
177 }
178 }
179 SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")+1);
180 }
181 return 1;
182 }
183 case dRules:
184 {
185 if(!response)
186 return
187 Kick(playerid);
188 new rules_mes_2[sizeof(rules_2)];
189 format(rules_mes_2, sizeof(rules_mes_2),rules_2);
190 SPD(playerid, dReferal, DSM, !"{CFCFCF}Правила Ñервера", rules_mes_2, !"СоглаÑен", !"Выйти");
191 return 1;
192 }
193 case dReferal:
194 {
195 if(!response)
196 {
197 SPD(playerid, dEmail, DSI, !"E-Mail", "Введите Ваш дейÑтвующий Ñлектронный адреÑ\n\n\
198 ПодÑказка: ИÑпользуйте почтовый ÑÐµÑ€Ð²Ð¸Ñ @Yandex.ru, Mail.ru или Gmail.com", !"Далее", !"ПропуÑтить");
199 return 1;
200 }
201 new lentxt = strlen(inputtext);
202 if(lentxt < 1 || lentxt > 24)
203 {
204 SPD(playerid, dReferal, DSI, !"{CFCFCF}Ðик приглаÑившего",
205 !"{CFCFCF}Введите ник приглаÑившего Ð²Ð°Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ°:\n\n\
206 ИнформациÑ: При доÑтижении 3-го уровнÑ, Ñтот игрок получит 100 000 вирт.",
207 !"Далее", !"ПропуÑтить");
208 //return SCM(playerid, 0xE8954F, !"Ошибка: Ðик не может быть длиннее 24 Ñиволов и меньше 3");
209 }
210 for(new i; i < lentxt; i++)
211 {
212 switch(inputtext[i])
213 {
214 case 'A'..'Z', 'a'..'z', '_': continue;
215 default:
216 {
217 SPD(playerid, dReferal, DSI, !"{CFCFCF}Ðик приглаÑившего",
218 !"{CFCFCF}Введите ник приглаÑившего Ð²Ð°Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ°:\n\n\
219 ИнформациÑ: При доÑтижении 3-го уровнÑ, Ñтот игрок получит 100 000 вирт.",
220 !"Далее", !"ПропуÑтить"),
221 SCM(playerid, 0xE8954F, !"Ошибка: Ðик не должен Ñодержать руÑÑкие буквы и/или Ñимволы.");
222 return 1;
223 }
224 }
225 }
226 if(!strcmp(pInfo[playerid][pReferal], inputtext))
227 {
228 new query_string[47+1-2+MAX_PLAYER_NAME+1];
229 format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `referal` = '%s'", pInfo[playerid][pName]);
230 mysql_function_query(mysql_connect_id, query_string, true, "UploadPlayerAccount","i", playerid);
231 }
232 strmid(pInfo[playerid][pReferal], inputtext, 0, lentxt, 25);
233 SPD(playerid, dEmail, DSI, !"E-Mail", !"Введите Ваш дейÑтвующий Ñлектронный адреÑ\n\n\
234 ПодÑказка: ИÑпользуйте почтовый ÑÐµÑ€Ð²Ð¸Ñ @Yandex.ru, Mail.ru или Gmail.com",
235 !"Далее", !"ПропуÑтить");
236 }
237 case dEmail:
238 {
239 if(!response)
240 {
241 SPD(playerid, dSex, DSM, !"РегиÑтрациÑ", !"Какого пола будет Ваш перÑонаж?", !"МужÑкой", !"ЖенÑкий");
242 }
243 if(!strlen(inputtext))
244 return SPD(playerid, dEmail, DSI,
245 !"E-Mail", !"Введите Ваш дейÑтвующий Ñлектронный адреÑ\n\n\
246 ПодÑказка: ИÑпользуйте почтовый ÑÐµÑ€Ð²Ð¸Ñ @Yandex.ru, Mail.ru или Gmail.com",
247 "Далее", !"ПропуÑтить"),
248 SCM(playerid,0xE66363, !"Ошибка: Ðеверный формат Ñлектронного адреÑа"), SCM(playerid,-1,"7");
249 for(new i = strlen(inputtext)-1; i != -1; i--)
250 {
251 switch(inputtext[i])
252 {
253 case '0'..'9',/* 'а'..'Ñ', */'a'..'z',/* 'Ð'..'Я', */'A'..'Z', '_', '-'/*, '@', '.'*/: continue;
254 default:
255 return SPD(playerid, dEmail, DSI,
256 !"E-Mail", !"Введите Ваш дейÑтвующий Ñлектронный адреÑ\n\n\
257 ПодÑказка: ИÑпользуйте почтовый ÑÐµÑ€Ð²Ð¸Ñ @Yandex.ru, Mail.ru или Gmail.com",
258 "Далее", !"ПропуÑтить"),
259 SCM(playerid,0xE66363, !"Ошибка: Ðеверный формат Ñлектронного адреÑа"), SCM(playerid,-1,"6");
260 }
261 }
262 if(!strcmp(pInfo[playerid][pEmail], inputtext))
263 {
264 new query_string[45+1-2+40];
265 format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `email` = '%s'", pInfo[playerid][pEmail]);
266 mysql_function_query(mysql_connect_id, query_string, true, "UploadPlayerAccount","i", playerid);
267 }
268 else
269 {
270 switch(GetPVarInt(playerid, "WrongEmail"))
271 {
272 case 0: SCM(playerid,0xE66363, !"Ошибка: Ðеверный формат Ñлектронного адреÑа"), SCM(playerid,-1,"1");
273 case 1: SCM(playerid,0xE66363, !"Ошибка: Ðеверный формат Ñлектронного адреÑа"), SCM(playerid,-1,"2");
274 case 2: SCM(playerid,0xE66363, !"Ошибка: Ðеверный формат Ñлектронного адреÑа"), SCM(playerid,-1,"3");
275 case 3: SCM(playerid,0xE66363, !"Ошибка: Ðеверный формат Ñлектронного адреÑа"), SCM(playerid,-1,"4");
276 default:
277 {
278 SCM(playerid,0xE66363, !"Ошибка: Ðеверный формат Ñлектронного адреÑа");
279 SCM(playerid,-1,"5");
280 }
281 }
282 SetPVarInt(playerid, "WrongEmail", GetPVarInt(playerid, "WrongEmail")+1);
283 }
284 }
285 case dSex:
286 {
287 if(response)
288 {
289 pInfo[playerid][pSex] = 1;
290 pInfo[playerid][pSkin] = 137;
291 }
292 else
293 {
294 pInfo[playerid][pSex] = 2;
295 pInfo[playerid][pSkin] = 77;
296 }
297 pInfo[playerid][pLevel] = 1;
298 CreateNewAccount(playerid, pInfo[playerid][pPassword]);
299 SpawnPlayer(playerid);
300 SPD(playerid, 0, DSM, "{CFCFCF}Завершение региÑтрации",
301 "{CFCFCF}ПоздравлÑем Ñ ÑƒÑпешной региÑтрацией на Ñервере проекта Samp Virtual Life\n\n\
302 ИÑпользуйте Ñледующие команды Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹ игры на Ñервере: {FCFF00}/gps, /mm, /dir, /donate\n\n\
303 {2BFF00}Первые шаги:{CFCFCF} подберите чемонданчик (рюкзак), откройте КПК и начните выполнÑть Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¸Ñ‡ÐºÐ°!",
304 "Скрыть", "");
305 }
306 }
307 return 1;
308}
309public OnGameModeInit()
310{
311 mysql_connect_id = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD);
312 russian_text_mysql();
313 SetGameModeText("Role Play | Russian");
314 return 1;
315}
316public OnPlayerConnect(playerid)
317{
318 GetPlayerName(playerid, pInfo[playerid][pName], MAX_PLAYER_NAME);
319 //С помощью функции GetPlayerName мы запиÑали Ð¸Ð¼Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ° в наш маÑÑив,
320 //дабы в будущем получить возможноÑть брать Ð¸Ð¼Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ° из Ñтого маÑÑива,
321 //а не вызывать повторно функцию GetPlayerName.
322 new query_string[49+MAX_PLAYER_NAME-4];
323 format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]);
324 //С помощью функции format мы вÑтавили Ð¸Ð¼Ñ Ð² наш запроÑ,
325 //который заÑтавит плагин проÑмотреть таблицу на предмет Ñтрок,
326 //в которых данные Ñтолбца "player_name" Ñовпадают Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ игрока.
327 mysql_function_query(mysql_connect_id, query_string, true, "FindPlayerInTable","i", playerid);
328 /* Ð Ñто и еÑть та ÑÐ°Ð¼Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»Ñет команду таблице через плагин.
329 ----------------------------------------------------------------------------------------------
330 mysql_function_query - название функции
331 mysql_connect_id - Первый параметр функции, в котором указываетÑÑ ID базы данных, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ идёт работа
332 query_string - Второй параметр функции, в котором пишетÑÑ Ñам Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ плагин обратитÑÑ Ðº базе данных
333 true - Третий параметр, который отвечает за кÑширование запроÑа. КÑширование нужно только Ð´Ð»Ñ Ñ‚ÐµÑ… запроÑов, в результате которых из таблицы должно вернуть какие-либо данные (например, найдена ли Ð½ÑƒÐ¶Ð½Ð°Ñ Ñтрока или же какие данные запиÑаны в той или иной Ñтроке. ЕÑли мы обновлÑем данные в таблице - кÑширование не требуетÑÑ)
334 "FindPlayerInTable" - Четвёртый параметр, в котором указываетÑÑ Ð¸Ð¼Ñ Ð¿Ð°Ð±Ð»Ð¸ÐºÐ°, в который будут помещены данные, возвращённые из базы данных (требуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в Ñлучае запроÑов Ñ ÐºÑшированием)
335 "i" - ПÑтый параметр, который позволÑет передать в паблик, указанный в четвёртом параметре, какие-либо данные из того учаÑтка кода, в котором был отправлен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð² базу данных. Работает точно так же, как SetTimerEx (в Ñтом параметре указываютÑÑ Ñ‚Ð¸Ð¿Ñ‹ данных, которые будут переданы. Сами данные указываютÑÑ Ð² Ñледующем параметре)
336 playerid - ШеÑтой параметр, в котором и указываютÑÑ Ð²Ñе данные Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ в указанный паблик. Ðто может быть любой тип данных из тех, кто доÑтупны в Pawn.*/
337 TogglePlayerSpectating(playerid, 1);
338 return 1;
339}
340public OnGameModeExit()
341{
342 mysql_close(mysql_connect_id);//Отключение от базы данных
343 return 1;
344}
345public OnPlayerDisconnect(playerid, reason)
346{
347 SaveAccount(playerid);//Сохранение аккаунта
348 RemovePlayerInfo(playerid);//Обнуление маÑива Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸
349 return 1;
350}
351
352public OnPlayerSpawn(playerid)
353{
354 SetPlayerSpawn(playerid);
355 return 1;
356}
357public OnPlayerRequestClass(playerid, classid)
358{
359 return 1;
360}
361public OnPlayerDeath(playerid, killerid, reason)
362{
363 return 1;
364}
365
366public OnVehicleSpawn(vehicleid)
367{
368 return 1;
369}
370
371public OnVehicleDeath(vehicleid, killerid)
372{
373 return 1;
374}
375
376public OnPlayerText(playerid, text[])
377{
378 if(IsPlayerAuthorized(playerid) == PLAYER_OFFLINE)
379 {
380 SendClientMessage(playerid, -1, "Ð’Ñ‹ не авторизировалиÑÑŒ и не можете пиÑать в чат!");
381 return 0;
382 }
383 return 1;
384}
385
386public OnPlayerCommandText(playerid, cmdtext[])
387{
388 if(!IsPlayerAuthorized(playerid))
389 return SendClientMessage(playerid, -1, "Ð’Ñ‹ не авторизировалиÑÑŒ и не можете иÑпользовать команды!");
390 return 0;
391}
392
393public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
394{
395 return 1;
396}
397
398public OnPlayerExitVehicle(playerid, vehicleid)
399{
400 return 1;
401}
402
403public OnPlayerStateChange(playerid, newstate, oldstate)
404{
405 return 1;
406}
407
408public OnPlayerEnterCheckpoint(playerid)
409{
410 return 1;
411}
412
413public OnPlayerLeaveCheckpoint(playerid)
414{
415 return 1;
416}
417
418public OnPlayerEnterRaceCheckpoint(playerid)
419{
420 return 1;
421}
422
423public OnPlayerLeaveRaceCheckpoint(playerid)
424{
425 return 1;
426}
427
428public OnRconCommand(cmd[])
429{
430 return 1;
431}
432
433public OnPlayerRequestSpawn(playerid)
434{
435 return 0;
436}
437
438public OnObjectMoved(objectid)
439{
440 return 1;
441}
442
443public OnPlayerObjectMoved(playerid, objectid)
444{
445 return 1;
446}
447
448public OnPlayerPickUpPickup(playerid, pickupid)
449{
450 return 1;
451}
452
453public OnVehicleMod(playerid, vehicleid, componentid)
454{
455 return 1;
456}
457
458public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
459{
460 return 1;
461}
462
463public OnVehicleRespray(playerid, vehicleid, color1, color2)
464{
465 return 1;
466}
467
468public OnPlayerSelectedMenuRow(playerid, row)
469{
470 return 1;
471}
472
473public OnPlayerExitedMenu(playerid)
474{
475 return 1;
476}
477
478public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
479{
480 return 1;
481}
482
483public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
484{
485 return 1;
486}
487
488public OnRconLoginAttempt(ip[], password[], success)
489{
490 return 1;
491}
492
493public OnPlayerUpdate(playerid)
494{
495 return 1;
496}
497
498public OnPlayerStreamIn(playerid, forplayerid)
499{
500 return 1;
501}
502
503public OnPlayerStreamOut(playerid, forplayerid)
504{
505 return 1;
506}
507
508public OnVehicleStreamIn(vehicleid, forplayerid)
509{
510 return 1;
511}
512
513public OnVehicleStreamOut(vehicleid, forplayerid)
514{
515 return 1;
516}
517
518
519public OnPlayerClickPlayer(playerid, clickedplayerid, source)
520{
521 return 1;
522}
523// ================ [ Паблики Ñозданные в ручную ] ================ //
524/*-----------------
525Создание аккаунта:
526-----------------*/
527publics FindPlayerInTable(playerid)
528{
529 new rows, fields;
530 new register_str[229];
531 new login_str[224];
532 cache_get_data(rows, fields);
533 if(!rows)
534 {
535 registr[playerid] = 1;
536 format(register_str, sizeof(register_str),
537 "{CFCFCF}____________________________________\n\n\
538 Добро пожаловать на Samp Virtual Life\n РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ перÑонажа\n\n\
539 Логин: %s\nВведите пароль:\n____________________________________",pInfo[playerid][pName]);
540 ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, !"РегиÑтрациÑ",
541 register_str, !"Готово", !"Выход");
542 }
543 else
544 {
545 format(login_str, sizeof(login_str),
546 "{CFCFCF}____________________________________\n\n\
547 Добро пожаловать на Samp Virtual Life\n Ðтот аккаунт зарегиÑтрирован\n\n\
548 Логин: %s\nВведите пароль:\n____________________________________",pInfo[playerid][pName]);
549 ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, !"ÐвторизациÑ",
550 login_str, !"Войти", !"Recover");
551 cache_get_field_content(0, "password", pInfo[playerid][pPassword], mysql_connect_id, 16);
552 }
553 return 1;
554}
555/*-----------------
556Рвот и Ñам коллбÑк, который вернёт ID аккаунта:
557-----------------*/
558publics UploadPlayerAccountNumber(playerid) pInfo[playerid][pID] = cache_insert_id(mysql_connect_id);
559/*-----------------
560Загрузка аккаунта:
561-----------------*/
562publics UploadPlayerAccount(playerid)
563{
564 pInfo[playerid][pID] = cache_get_field_content_int(0, "id", mysql_connect_id);
565 //pInfo[playerid][pSex] = cache_get_field_content_int(0, "sex", mysql_connect_id);
566 //pInfo[playerid][pSkin] = cache_get_field_content_int(0, "skin", mysql_connect_id);
567 //pInfo[playerid][pLevel] = cache_get_field_content_int(0, "level", mysql_connect_id);
568 //Login[playerid] = true;
569 SendClientMessage(playerid, 0xFFFFFF00, "Ð’Ñ‹ уÑпешно авторизировалиÑÑŒ!");
570 SetPlayerAuthorized(playerid, PLAYER_ONLINE);
571 SetPlayerSpawn(playerid);
572 return 1;
573}
574// ================ [ Стоки ] ================ //
575stock russian_text_mysql()//ЗапиÑÑŒ руÑÑкого текÑта в базу данных MySQL
576{
577 mysql_function_query(mysql_connect_id, !"SET CHARACTER SET 'utf8'", false, "", "");
578 mysql_function_query(mysql_connect_id, !"SET NAMES 'utf8'", false, "", "");
579 mysql_function_query(mysql_connect_id, !"SET character_set_client = 'cp1251'", false, "", "");
580 mysql_function_query(mysql_connect_id, !"SET character_set_connection = 'cp1251'", false, "", "");
581 mysql_function_query(mysql_connect_id, !"SET character_set_results = 'cp1251'", false, "", "");
582 mysql_function_query(mysql_connect_id, !"SET SESSION collation_connection = 'utf8_general_ci'", false, "", "");
583 connect_to_mysql();
584}
585stock connect_to_mysql()//Удачный коннект, либо нет
586{
587 switch(mysql_errno())
588 {
589 case 0: print("Подключение к базе данных удалоÑÑŒ");
590 case 1044: print("Подключение к базе данных не удалоÑÑŒ [Указано неизвеÑтное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ]");
591 case 1045: print("Подключение к базе данных не удалоÑÑŒ [Указан неизвеÑтный пароль]");
592 case 1049: print("Подключение к базе данных не удалоÑÑŒ [Указана неизвеÑÑ‚Ð½Ð°Ñ Ð±Ð°Ð·Ð° данных]");
593 case 2003: print("Подключение к базе данных не удалоÑÑŒ [ХоÑтинг Ñ Ð±Ð°Ð·Ð¾Ð¹ данных недоÑтупен]");
594 case 2005: print("Подключение к базе данных не удалоÑÑŒ [Указан неизвеÑтный Ð°Ð´Ñ€ÐµÑ Ñ…Ð¾Ñтинга]");
595 default: printf("Подключение к базе данных не удалоÑÑŒ [ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Код ошибки: %d]", mysql_errno());
596 //Где mysql_errno - функциÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ ID ошибки при отправке запроÑов к базе данных.
597 }
598}
599stock CreateNewAccount(playerid, password[])//Созданиe аккаунта
600{ //ÐžÐ±Ñ‰Ð°Ñ Ñтрока+проценты-Ñимволы(%d,%s)+id+Ðик(+1)+пароль+ник реферала+ÑмÑил+пол+Ñкин+уровень
601 new query_string[400];
602 format(query_string, sizeof(query_string),
603 "INSERT INTO `accounts` (`id`, `player_name`, `password`, `referal`, `email`, `sex`, `skin`) VALUES ('%d', '%s', '%s', '%s', '%s', '%d', '%d')",
604 pInfo[playerid][pID],
605 pInfo[playerid][pName],
606 password,
607 pInfo[playerid][pReferal],
608 pInfo[playerid][pEmail],
609 pInfo[playerid][pSex],
610 pInfo[playerid][pSkin]);/*,
611 pInfo[playerid][pLevel]);*/
612 mysql_function_query(mysql_connect_id, query_string, true, "UploadPlayerAccountNumber", "i", playerid);
613 print(query_string);
614 printf("%i Create",strlen(query_string));
615 //
616 SendClientMessage(playerid, 0xFFFFFF00, !"РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно.");
617 SendClientMessage(playerid, 0xFFFFFF00, !"ИÑпользуйте Ñледующие команды Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹ игры на Ñервере: /gps, /mm, /dir, /donate");//query_string);
618 SetPlayerAuthorized(playerid, PLAYER_ONLINE);
619 SetPlayerSpawn(playerid);
620 return 1;
621}
622stock SaveAccount(playerid)//Сохранение аккаунта
623{
624 new query_string[400];
625 // "UPDATE `accounts` SET" - (21)
626 mysql_format(mysql_connect_id, query_string, sizeof(query_string),
627 "UPDATE `accounts` SET `player_name` = '%s', `password` = '%s', `referal` = '%s', `email` = '%s', `sex` = '%i', `skin` = '%i' WHERE `id` = '%i'", pInfo[playerid][pName], pInfo[playerid][pPassword], pInfo[playerid][pReferal], pInfo[playerid][pEmail], pInfo[playerid][pSex], pInfo[playerid][pSkin]);
628 mysql_function_query(mysql_connect_id, query_string, false, "", "");
629 print(query_string);
630 printf("%i Save",strlen(query_string));
631 return 1;
632}
633stock RemovePlayerInfo(playerid)//Обнуление данных
634{
635 pInfo[playerid][pID] = 0;
636 pInfo[playerid][pName][0] = EOS;
637 pInfo[playerid][pPassword][0] = EOS;
638 pInfo[playerid][pReferal][0] = EOS;
639 pInfo[playerid][pEmail][0] = EOS;
640 pInfo[playerid][pSex] = 0;
641 pInfo[playerid][pSkin] = 0;
642 pInfo[playerid][pLevel] = 0;
643 return 1;
644}
645stock SetPlayerSpawn(playerid)//Спавн игрока
646{
647 SetPlayerSkin(playerid, pInfo[playerid][pSkin]);
648 SetPlayerScore(playerid, pInfo[playerid][pLevel]);
649 if(!registr[playerid])
650 //if(Player[playerid][pLevel] <=5)
651 {
652 new rsp1 = random(sizeof(SpawnCoords));
653 SetPlayerPos(playerid, SpawnCoords[rsp1][0], SpawnCoords[rsp1][1], SpawnCoords[rsp1][2]);
654 SetPlayerFacingAngle(playerid, SpawnCoords[rsp1][3]);
655 SetPlayerInterior(playerid, 0);
656 SetPlayerVirtualWorld(playerid, 0);
657 SetCameraBehindPlayer(playerid);
658 //return true;
659 }
660}