· 6 years ago · Jul 30, 2019, 08:04 PM
1#include <amxmodx>
2#include <fakemeta>
3#include <sqlx>
4#include <colorchat>
5
6new g_iMedaleGracza[33][3];
7new g_iRankingGracza[33];
8
9new bool:g_bDaneWczytane[33];
10
11new Handle:g_hSqlTuple;
12new g_pCvarMinIloscGraczy;
13new g_iHUD;
14
15forward on_map_change();
16
17public plugin_init()
18{
19 register_plugin("Medale", "1.0", "d0naciak");
20
21 register_clcmd("say /medale", "cmd_MenuMedali");
22 register_clcmd("say /top15medale", "cmd_Top15");
23 register_clcmd("say /top15m", "cmd_Top15");
24
25 register_event("ResetHUD", "ev_ResetHUD", "b");
26
27 g_pCvarMinIloscGraczy = register_cvar("medale_miniloscgraczy", "6");
28
29 PrzygotujSQL();
30 g_iHUD = CreateHudSyncObj();
31}
32
33public plugin_natives() {
34 register_native("pobierz_medale", "nat_PobierzMedale", 1);
35}
36
37public client_authorized(id) {
38 for(new i = 0; i < 3; i++) {
39 g_iMedaleGracza[id][i] = 0;
40 }
41
42 g_iRankingGracza[id] = 0;
43 g_bDaneWczytane[id] = false;
44
45 WczytajDaneGracza(id);
46}
47/*
48public client_putinserver(id) {
49 set_task(1.0, "task_HUD", id, _, _, "b");
50}*/
51
52public client_disconnect(id) {
53 ZapiszDaneGracza(id);
54 remove_task(id);
55}
56
57public task_HUD(id) {
58 new iTarget;
59
60 if(is_user_alive(id)) {
61 iTarget = id;
62 } else {
63 iTarget = pev(id, pev_iuser2);
64 }
65
66 if(!iTarget) {
67 return PLUGIN_CONTINUE;
68 }
69
70 set_hudmessage(0, 255, 0, 0.01, 0.17, 0, 3.0, 3.0, 0.01, 0.01, 2);
71 ShowSyncHudMsg(id, g_iHUD, "^n^n^n^n| [Zloto]: %d [Srebro]: %d [Braz]: %d",
72 g_iMedaleGracza[iTarget][0], g_iMedaleGracza[iTarget][1], g_iMedaleGracza[iTarget][2]);
73
74 return PLUGIN_CONTINUE;
75}
76
77public on_map_change() {
78 if(get_playersnum() < get_pcvar_num(g_pCvarMinIloscGraczy)) {
79 return;
80 }
81
82 new id[3], iNajlepszyWynik[3][2], iFragi, iSmierci, iIloscSlotow = get_maxplayers();
83
84 for(new i = 1; i <= iIloscSlotow; i++) {
85 if(!is_user_connected(i)) {
86 continue;
87 }
88
89 iFragi = get_user_frags(i);
90 iSmierci = get_user_deaths(i);
91
92 for(new j = 0; j < 3; j++) {
93 if(iFragi > iNajlepszyWynik[j][0] || (iFragi == iNajlepszyWynik[j][0] && iSmierci < iNajlepszyWynik[j][1])) {
94 for(new k = 1; k >= j; k--) {
95 id[k+1] = id[k];
96 iNajlepszyWynik[k+1][0] = iNajlepszyWynik[k][0];
97 iNajlepszyWynik[k+1][1] = iNajlepszyWynik[k][1];
98 }
99
100 id[j] = i;
101 iNajlepszyWynik[j][0] = iFragi;
102 iNajlepszyWynik[j][1] = iSmierci;
103 break;
104 }
105 }
106 }
107
108 if(!id[0]) {
109 return;
110 }
111
112 new szNick[32];
113
114 ColorChat(0, GREEN, "~^x01 Rozdanie nagrĂłd dla najlepszych graczy: ");
115
116 for(new i = 0; i < 3; i++) {
117 if(!id[i]) {
118 break;
119 }
120
121 get_user_name(id[i], szNick, 31);
122
123 g_iMedaleGracza[id[i]][i] ++;
124 ColorChat(0, GREEN, "%d.^x03 %s^x01 -^x03 %d fragow", i+1, szNick, iNajlepszyWynik[i]);
125 }
126}
127
128
129public ev_ResetHUD(id) {
130 RankingGracza(id);
131}
132
133public cmd_MenuMedali(id) {
134 if(!g_bDaneWczytane[id]) {
135 ColorChat(id, GREEN, "*^x01 Medale nie zostaly jeszcze zaladowane, sprobuj ponownie za moment...");
136 return PLUGIN_HANDLED;
137 }
138
139 new iMenu = menu_create("Menu medali: ", "MenuMedali_Handler");
140
141 menu_additem(iMenu, "Twoj ranking medali");
142 menu_additem(iMenu, "TOP 15 medali");
143 menu_setprop(iMenu, MPROP_EXITNAME, "Wyjscie");
144 menu_display(id, iMenu);
145
146 return PLUGIN_HANDLED;
147}
148
149public MenuMedali_Handler(id, iMenu, iItem) {
150 switch(iItem) {
151 case MENU_EXIT: {
152 menu_destroy(iMenu);
153 return PLUGIN_CONTINUE;
154 }
155
156 case 0: {
157 new iRank = g_iRankingGracza[id];
158
159 if(iRank > 0) {
160 ColorChat(id, GREEN, "*^x01 W rankingu zajmujesz pozycje^x03 %d^x01 majac^x03 %d zlotych medali, %d srebrnych medali oraz %d brazowych medali", iRank, g_iMedaleGracza[id][0], g_iMedaleGracza[id][1], g_iMedaleGracza[id][2]);
161 } else {
162 ColorChat(id, GREEN, "*^x01 Wystapil blad, sprobuj ponownie na nastepnej mapie...");
163 }
164 }
165
166 case 1: {
167 cmd_Top15(id);
168 }
169 }
170
171 menu_display(id, iMenu);
172 return PLUGIN_CONTINUE;
173}
174
175RankingGracza(id) {
176 new szPytanie[256], iDane[2];
177
178 iDane[0] = id;
179 iDane[1] = get_user_userid(id);
180 formatex(szPytanie, 255, "SELECT COUNT(*) FROM ranking WHERE (medale_zlote*3+medale_srebrne*2+medale_brazowe*1)>=%d;", g_iMedaleGracza[id][0]*3+g_iMedaleGracza[id][1]*2+g_iMedaleGracza[id][2]*1);
181
182 SQL_ThreadQuery(g_hSqlTuple, "RankingGracza_Handler", szPytanie, iDane, 2);
183}
184
185public RankingGracza_Handler(iFailState, Handle:hPytanie, szBlad, iKodBledu, iDane[], iDaneLen)
186{
187 new id = iDane[0];
188
189 if(!is_user_connected(id) || get_user_userid(id) != iDane[1])
190 return PLUGIN_CONTINUE;
191
192 if(iKodBledu)
193 log_amx("Blad: %s (RankingGracza_Handler).", szBlad);
194
195 if(iFailState == TQUERY_CONNECT_FAILED)
196 {
197 log_amx("Nie mozna podlaczyc sie do bazy danych.");
198 return PLUGIN_CONTINUE;
199 }
200 else if(iFailState == TQUERY_QUERY_FAILED)
201 {
202 log_amx("Zapytanie anulowane (RankingGracza_Handler).");
203 return PLUGIN_CONTINUE;
204 }
205
206 if(SQL_NumRows(hPytanie)) {
207 g_iRankingGracza[id] = SQL_ReadResult(hPytanie, 0);
208 }
209
210 return PLUGIN_CONTINUE;
211}
212
213public cmd_Top15(id) {
214 Top15(id);
215 return PLUGIN_HANDLED;
216}
217
218public Top15(id) {
219 new szPytanie[256], iDane[2];
220
221 iDane[0] = id;
222 iDane[1] = get_user_userid(id);
223 formatex(szPytanie, 255, "SELECT nick, medale_zlote, medale_srebrne, medale_brazowe FROM ranking ORDER BY (medale_zlote*3+medale_srebrne*2+medale_brazowe*1) DESC LIMIT 15;");
224
225 SQL_ThreadQuery(g_hSqlTuple, "Top15_Handler", szPytanie, iDane, 2);
226}
227
228public Top15_Handler(iFailState, Handle:hPytanie, szBlad, iKodBledu, iDane[], iDaneLen)
229{
230 new id = iDane[0];
231
232 if(!is_user_connected(id) || get_user_userid(id) != iDane[1])
233 return PLUGIN_CONTINUE;
234
235 if(iKodBledu)
236 log_amx("Blad: %s (Top15_Handler).", szBlad);
237
238 if(iFailState == TQUERY_CONNECT_FAILED)
239 {
240 log_amx("Nie mozna podlaczyc sie do bazy danych.");
241 return PLUGIN_CONTINUE;
242 }
243 else if(iFailState == TQUERY_QUERY_FAILED)
244 {
245 log_amx("Zapytanie anulowane (Top15_Handler).");
246 return PLUGIN_CONTINUE;
247 }
248
249 new szNick[64], szMotd[1024], iLen, i;
250
251 iLen = formatex(szMotd, 1023, "<head><style>table{border-collapse:collapse;background-color:#3D5450}td{border:0.2em solid #2F413E;text-align:center;height:1.2em;font-size: 0.8em}body{background-image:url(http://goldwallpapers.com/uploads/posts/battlefield-2-wallpaper/battlefield_2_wallpaper_001.jpg);background-size:auto;color:#DADADA;}</style></head><body><br><br><center><table width=80%%><tr style=^"background-color:#2F413E;^"><td>#. Gracz<td>Zloto<td>Srebro<td>Braz");
252
253 if(SQL_NumRows(hPytanie)) {
254 while(SQL_MoreResults(hPytanie)) {
255 i ++;
256 SQL_ReadResult(hPytanie, 0, szNick, 63);
257 replace_all(szNick, 63, "<", "<");
258 replace_all(szNick, 63, ">", "&rt;");
259
260 switch(i) {
261 case 1: {
262 iLen += formatex(szMotd[iLen], 1023 - iLen, "<tr style=^"color: #D9D919;^"><td>%d. %s<td>%d<td>%d<td>%d", i, szNick, SQL_ReadResult(hPytanie, 1), SQL_ReadResult(hPytanie, 2), SQL_ReadResult(hPytanie, 3));
263 }
264
265 case 2: {
266 iLen += formatex(szMotd[iLen], 1023 - iLen, "<tr style=^"color: #8A8A8A;^"><td>%d. %s<td>%d<td>%d<td>%d", i, szNick, SQL_ReadResult(hPytanie, 1), SQL_ReadResult(hPytanie, 2), SQL_ReadResult(hPytanie, 3));
267 }
268
269 case 3: {
270 iLen += formatex(szMotd[iLen], 1023 - iLen, "<tr style=^"color: #BC8362;^"><td>%d. %s<td>%d<td>%d<td>%d", i, szNick, SQL_ReadResult(hPytanie, 1), SQL_ReadResult(hPytanie, 2), SQL_ReadResult(hPytanie, 3));
271 }
272
273 default: {
274 iLen += formatex(szMotd[iLen], 1023 - iLen, "<tr><td>%d. %s<td>%d<td>%d<td>%d", i, szNick, SQL_ReadResult(hPytanie, 1), SQL_ReadResult(hPytanie, 2), SQL_ReadResult(hPytanie, 3));
275 }
276 }
277
278 SQL_NextRow(hPytanie);
279 }
280
281 }
282
283 show_motd(id, szMotd, "Top 15 medali");
284 return PLUGIN_CONTINUE;
285}
286
287public WczytajDaneGracza(id) {/*
288 if(!is_user_connected(id) && !is_user_connecting(id)) {
289 return;
290 }*/
291
292 /*if(!g_hSqlTuple) {
293 set_task(1.0, "WczytajDaneGracza", id);
294 } else {*/
295 new szNick[64], szPytanie[256], iDane[2];
296
297 iDane[0] = id;
298 iDane[1] = get_user_userid(id);
299 get_user_name_to_sql(id, szNick, 63);
300 formatex(szPytanie, 255, "SELECT medale_zlote, medale_srebrne, medale_brazowe FROM ranking WHERE nick='%s';", szNick);
301
302 SQL_ThreadQuery(g_hSqlTuple, "WczytajDaneGracza_Handler", szPytanie, iDane, 2);
303 //}
304}
305
306public WczytajDaneGracza_Handler(iFailState, Handle:hPytanie, szBlad, iKodBledu, iDane[], iDaneLen)
307{
308 new id = iDane[0];
309
310 if((!is_user_connected(id) && !is_user_connecting(id)) || get_user_userid(id) != iDane[1])
311 return PLUGIN_CONTINUE;
312
313 if(iKodBledu)
314 log_amx("Blad: %s (WczytajDaneGracza_Handler).", szBlad);
315
316 if(iFailState == TQUERY_CONNECT_FAILED)
317 {
318 log_amx("Nie mozna podlaczyc sie do bazy danych.");
319 return PLUGIN_CONTINUE;
320 }
321 else if(iFailState == TQUERY_QUERY_FAILED)
322 {
323 log_amx("Zapytanie anulowane (WczytajDaneGracza_Handler).");
324 return PLUGIN_CONTINUE;
325 }
326
327 if(SQL_NumRows(hPytanie)) {
328 for(new i = 0; i < 3; i++) {
329 g_iMedaleGracza[id][i] = SQL_ReadResult(hPytanie, i);
330 }
331
332 g_bDaneWczytane[id] = true;
333
334 RankingGracza(id);
335 } else {
336 new szNick[64], szPytanie[256];
337
338 get_user_name_to_sql(id, szNick, 63);
339 formatex(szPytanie, 255, "INSERT INTO ranking (nick) VALUES ('%s');", szNick);
340
341 SQL_ThreadQuery(g_hSqlTuple, "WpiszDaneGracza_Handler", szPytanie, iDane, 2);
342 }
343
344 return PLUGIN_CONTINUE;
345}
346
347
348public WpiszDaneGracza_Handler(iFailState, Handle:hPytanie, szBlad, iKodBledu, iDane[], iDaneLen)
349{
350 new id = iDane[0];
351
352 if((!is_user_connected(id) && !is_user_connecting(id)) || get_user_userid(id) != iDane[1])
353 return PLUGIN_CONTINUE;
354
355 if(iKodBledu)
356 log_amx("Blad: %s (WpiszDaneGracza_Handler).", szBlad);
357
358 if(iFailState == TQUERY_CONNECT_FAILED)
359 {
360 log_amx("Nie mozna podlaczyc sie do bazy danych.");
361 return PLUGIN_CONTINUE;
362 }
363 else if(iFailState == TQUERY_QUERY_FAILED)
364 {
365 log_amx("Zapytanie anulowane (WpiszDaneGracza_Handler).");
366 return PLUGIN_CONTINUE;
367 }
368
369 g_bDaneWczytane[id] = true;
370
371 RankingGracza(id);
372 return PLUGIN_CONTINUE;
373}
374
375
376ZapiszDaneGracza(id) {
377 if(!g_bDaneWczytane[id]) {
378 return;
379 }
380
381 new szNick[64], szPytanie[256];
382
383 get_user_name_to_sql(id, szNick, 63);
384 formatex(szPytanie, 255, "UPDATE ranking SET medale_zlote=%d, medale_srebrne=%d, medale_brazowe=%d WHERE nick='%s';", g_iMedaleGracza[id][0], g_iMedaleGracza[id][1], g_iMedaleGracza[id][2], szNick);
385
386 SQL_ThreadQuery(g_hSqlTuple, "ZapiszDaneGracza_Handler", szPytanie);
387}
388
389public ZapiszDaneGracza_Handler(iFailState, Handle:hPytanie, szBlad, iKodBledu, iDane[], iDaneLen)
390{
391 if(iKodBledu)
392 log_amx("Blad: %s (ZapiszDaneGracza_Handler).", szBlad);
393
394 if(iFailState == TQUERY_CONNECT_FAILED)
395 {
396 log_amx("Nie mozna podlaczyc sie do bazy danych.");
397 return PLUGIN_CONTINUE;
398 }
399 else if(iFailState == TQUERY_QUERY_FAILED)
400 {
401 log_amx("Zapytanie anulowane (ZapiszDaneGracza_Handler).");
402 return PLUGIN_CONTINUE;
403 }
404
405 return PLUGIN_CONTINUE;
406}
407
408
409public PrzygotujSQL()
410{
411 new pCvarHost = register_cvar("medale_sql_host", "127.0.0.1", FCVAR_PROTECTED|FCVAR_SPONLY);
412 new pCvarUzytkownik = register_cvar("medale_sql_user", "admin", FCVAR_PROTECTED|FCVAR_SPONLY);
413 new pCvarHaslo = register_cvar("medale_sql_password", "admin", FCVAR_PROTECTED|FCVAR_SPONLY);
414 new pCvarBaza = register_cvar("medale_sql_db", "dbname", FCVAR_PROTECTED|FCVAR_SPONLY);
415 new szHost[32], szUzytkownik[32], szHaslo[32], szBaza[32];
416
417 server_cmd("exec addons/amxmodx/configs/medale_sql.cfg");
418 server_exec();
419
420 get_pcvar_string(pCvarHost, szHost, 31);
421 get_pcvar_string(pCvarUzytkownik, szUzytkownik, 31);
422 get_pcvar_string(pCvarHaslo, szHaslo, 31);
423 get_pcvar_string(pCvarBaza, szBaza, 31);
424
425 g_hSqlTuple = SQL_MakeDbTuple(szHost, szUzytkownik, szHaslo, szBaza);
426
427 new szPytanie[1028];
428 formatex(szPytanie, 1027, "CREATE TABLE IF NOT EXISTS ranking\
429 ( \
430 nick varchar(32) NOT NULL, \
431 medale_zlote int UNSIGNED DEFAULT 0, \
432 medale_srebrne int UNSIGNED DEFAULT 0, \
433 medale_brazowe int UNSIGNED DEFAULT 0, \
434 PRIMARY KEY (nick) \
435 )");
436
437 SQL_ThreadQuery(g_hSqlTuple, "StworzBaze_Handler", szPytanie);
438}
439
440public StworzBaze_Handler(iFailState, Handle:hPytanie, szBlad[], iKodBledu, iDane[], iDaneLen)
441{
442 if(iKodBledu)
443 log_amx("Blad: %s (StworzBaze_Handler)", szBlad);
444
445 if(iFailState == TQUERY_CONNECT_FAILED)
446 {
447 log_amx("Nie mozna podlaczyc sie do bazy danych.");
448 return PLUGIN_CONTINUE;
449 }
450 else if(iFailState == TQUERY_QUERY_FAILED)
451 {
452 log_amx("Zapytanie anulowane (StworzBaze_Handler).");
453 return PLUGIN_CONTINUE;
454 }
455
456 return PLUGIN_CONTINUE
457}
458
459public nat_PobierzMedale(id, iKtore) {
460 return g_iMedaleGracza[id][iKtore-1];
461}
462
463stock get_user_name_to_sql(id, szNick[], iLen) {
464 get_user_name(id, szNick, iLen);
465
466 replace_all(szNick, iLen, "'", "\'");
467 replace_all(szNick, iLen, "`", "\`");
468}