· 8 years ago · Jan 31, 2018, 09:44 AM
1/* CREDITS
2 * BulletRaja: Main
3 *
4 *
5 * Includes : To All
6 *
7 *BBBBBBBBBBBBBBBBB RRRRRRRRRRRRRR
8 *BB BB RR RR
9 *BB BB RR RR
10 *BB BB RR RR
11 *BB BB RR RR
12 *BBBBBBBBBBBBB RRRRRRRRRR
13 *BB BB RR RR
14 *BB BB RR RR
15 *BB BB RR RR
16 *BB BB RR RR
17 *BBBBBBBBBBBBBBBBB RR RR
18 *BULLET RAJA Presents bR Simple Sqlite Gamemode
19 *
20 *=================>>>> Change Log <<<<=================
21 *>>>>>>>>>>>>>>> Version 1 <<<<<<<<<<<<<<<
22 *>> Added SQLITE Login/Register System
23 *>> Added New Style In Login/Register System
24 *>>>>>>>>>>>>>>> Version 2 <<<<<<<<<<<<<<<
25 *>> Added Admin System With Simple Cmds
26 *>> Added Online Admins Cmd
27 *>> Rleased
28 */
29
30//== Includes ==//
31#include <a_samp>
32#include <sscanf2>
33#include <utils>
34#include <zcmd>
35
36//== Server Entities ==//
37#define SV_VER "(0.3.7)"//here you can add your server version
38#define SV_GM "bR Simple Sqlite Gamemode ["SCRIPT_V"]"//here add your gamemode text
39#define SV_LANG "English"//here add your server language
40#define SV_RCON "BulletR"//here add server rcon
41#define SV_SNAME "Check /rules, /updates"//here add your server second name
42#define SV_NAME "bR Simple Sqlite Gamemode "SV_VER""//here add server name
43#define SV_URL "www.BulletRaja.Com"//here put server url
44#define SV_MAP "San Andreas"//here server map name
45#define SCRIPT_V "v2"
46
47//== Max Defines ==//
48#define MAX_INI_ENTRY_TEXT 80
49#define MAX_CLIENT_MSG_LENGTH 144
50
51//== Dialogs ==//
52#define DIALOG_LOGIN 1
53#define DIALOG_REGISTER 2
54
55//== Colours ==//
56#define COLOR_WHITE 0xFFFFFFFF
57#define COLOR_WHITEP 0xFFE4C4FF
58#define COLOR_ORANGE 0xDB881AFF
59#define COLOR_ORANGE2 0xFF5000FF
60#define COLOR_IVORY 0xFFFF82FF
61#define COLOR_LIME 0xD2D2ABFF
62#define COLOR_BLUE 0x004BFFFF
63#define COLOR_SBLUE 0x56A4E4FF
64#define COLOR_RCONBLUE 0x0080FF99
65#define COLOR_PURPLE 0x5A00FFFF
66#define COLOR_RED 0xFF0000FF
67#define COLOR_LRED 0xE65555FF
68#define COLOR_LIGHTGREEN 0x00FF00FF
69#define COLOR_YELLOW 0xFFFF00FF
70#define COLOR_YELLOW2 0xF5DEB3FF
71#define COLOR_LB 0x15D4EDFF
72#define COLOR_PINK 0xEE82EEFF
73#define COLOR_GOLD 0xFFD700FF
74#define COLOR_FIREBRICK 0xB22222FF
75#define COLOR_GREEN 0x3BBD44FF
76#define COLOR_GREY2 0x778899FF
77#define COLOR_GREY3 0xC8C8C8FF
78#define COLOR_DARK 0x7A7A7AFF
79#define COLOR_BROWN 0x8B4513FF
80#define COLOR_SYSTEM 0xEFEFF7FF
81#define COLOR_PURPLE2 0xC2A2DAFF
82#define COLOR_DARKRED 0xAA3333FF
83#define COLOR_GREY 0xAFAFAFFF
84#define COLOR_ASAY 0xFF0000FF
85#define COLOR_OSAY 0x007700FF
86#define COLOR_HSAY 0x1684CAFF
87#define COLOR_MSAY 0x1684CAFF
88#define COLOR_WHITE 0xFFFFFFFF
89#define COLOR_YELLOW 0xFFFF00FF
90#define COLOR_DARKMAUVE 0x623778FF
91#define COLOR_MAUVE 0x845F96FF
92#define COLOR_GREENYELLOW 0xADFF2FAA
93#define COLOR_LBLUE 0x99FFFFFF
94#define COLOR_LIGHTBLUE 0x99FFFFFF
95#define COLOR_PEACH 0xFFCC66FF
96#define COLOR_SILVER 0xDDDDDDFF
97#define COLOR_WANTEDBLUE 0x0055CCFF
98#define COLOR_DARK_VIOLET 0x9400D3FF
99#define COLOR_VIP1 0x9400D3FF
100#define COLOR_HELP 0x00E5EEFF
101#define COLOR_ADMIN 0x0066FFFF
102#define COLOR_ADMIN2 0x008FD6FF
103#define COLOR_PLAYER 0xFFCC33FF
104#define COLOR_RP 0xFFFFFFFF
105#define COLOR_ULTRAADMIN 0x993300FF
106#define COLOR_EVENT 0x00CC66FF
107#define COLOR_VIP2 0xFF33CCFF
108#define COLOR_VIPCHAT 0xCC66CCFF
109#define COL_WHITE "{FFFFFF}"
110#define COL_BLACK "{0E0101}"
111#define COL_GREY "{C3C3C3}"
112#define COL_GREEN "{6EF83C}"
113#define COL_RED "{F81414}"
114#define COL_YELLOW "{F3FF02}"
115#define COL_ORANGE "{FFAF00}"
116#define COL_LIME "{B7FF00}"
117#define COL_CYAN "{00FFEE}"
118#define COL_BLUE "{0049FF}"
119#define COL_MAGENTA "{F300FF}"
120#define COL_VIOLET "{B700FF}"
121#define COL_PINK "{FF00EA}"
122#define COL_MARONE "{A90202}"
123#define RED_E "{FF0000}"
124#define BLUE_E "{004BFF}"
125#define SBLUE_E "{56A4E4}"
126#define PINK_E "{FFB6C1}"
127#define YELLOW_E "{FFFF00}"
128#define LG_E "{00FF00}"
129#define LB_E "{15D4ED}"
130#define LB2_E "{87CEFA}"
131#define GREY_E "{BABABA}"
132#define GREY2_E "{778899}"
133#define GREY3_E "{C8C8C8}"
134#define DARK_E "{7A7A7A}"
135#define WHITE_E "{FFFFFF}"
136#define WHITEP_E "{FFE4C4}"
137#define IVORY_E "{FFFF82}"
138#define ORANGE_E "{DB881A}"
139#define GREEN_E "{3BBD44}"
140#define PURPLE_E "{5A00FF}"
141#define LIME_E "{D2D2AB}"
142#define LRED_E "{E65555}"
143
144//== Class Selection Defines ==//
145#define CLASS_X 1088.1422
146#define CLASS_Y 1074.0307
147#define CLASS_Z 10.8382
148
149//== Natives ==//
150native WP_Hash(buffer[], len, const str[]);
151
152//== Enumerators ==//
153enum USER_DATA
154{
155 PlayerID,
156 UserName[MAX_PLAYER_NAME],
157 Password[129],
158 UserLevel,
159 UserVip,
160 UserMoney,
161 UserScore,
162 UserKills,
163 UserDeaths,
164 UserK,
165
166 bool: Logged
167};
168new User[PLAYERS][USER_DATA];
169new DB: Database;
170new pldialog[PLAYERS];
171new isconnected[PLAYERS];
172
173//== Stocks ==//
174stock RPN(playerid)
175{
176 new name[MAX_PLAYER_NAME];
177 GetPlayerName(playerid, name, sizeof(name));
178 return name;
179}
180stock DB_Escape(text[])
181{
182 new ret[ 80 * 2 ], ch, i, j;
183 while((ch = text[i++]) && j < sizeof(ret))
184 {
185 if(ch == '\'')
186 {
187 if(j < sizeof(ret) - 2)
188 {
189 ret[j++] = '\'';
190 ret[j++] = '\'';
191 }
192 }
193 else if(j < sizeof(ret))
194 {
195 ret[j++] = ch;
196 }
197 else
198 {
199 j++;
200 }
201 }
202 ret[sizeof(ret) - 1] = '\0';
203 return ret;
204}
205SendMessageToAdmins(color, message[])
206{
207 for (new i = 0; i < PLAYERS; i++)
208 {
209 if (IsPlayerConnected2(i) && User[i][UserLevel] != 0) SendClientMessage2(i, color, message);
210 }
211}
212SendClientMessage2(playerid, color, message[])
213{
214 if (strlen(message) <= MAX_CLIENT_MSG_LENGTH)
215 {
216 SendClientMessage(playerid, color, message);
217 }
218 else
219 {
220 new string[MAX_CLIENT_MSG_LENGTH + 1];
221 strmid(string, message, 0, MAX_CLIENT_MSG_LENGTH);
222 SendClientMessage(playerid, color, string);
223 }
224 return 1;
225}
226
227SendClientMessageToAll2(color, message[])
228{
229 for (new i = 0; i < PLAYERS; i++)
230 {
231 if (IsPlayerConnected2(i)) SendClientMessage2(i, color, message);
232 }
233 return 1;
234}
235IsPlayerConnected2(playerid)
236{
237 return IsPlayerNPC(playerid) == 0 && playerid < sizeof(isconnected) ? isconnected[playerid] : 0;
238}
239ShowPlayerDialog2(playerid, dialogid, style, caption[], info[], button1[], button2[])
240{
241 ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
242 pldialog[playerid] = dialogid;
243}
244SendPlayerFormattedText(playerid, color, str[], define1[], define2[])
245{
246 new tstr[256];
247 format(tstr, 256, str, define1, define2);
248 SendClientMessage2(playerid, color, tstr);
249 return 1;
250}
251
252SendAllFormattedText(color, str[], define1[], define2[])
253{
254 new tstr[256];
255 format(tstr, 256, str, define1, define2);
256 SendClientMessageToAll2(color, tstr);
257 return 1;
258}
259//== Main ==//
260main()
261{
262 print("//=============Credits=============\\");
263 print("|=========== BulletRaja ===========|");
264 print("|=========== Includes ===========|");
265 print("|=========== Thanks All ===========|");
266 print("//=============Credits=============\\");
267}
268
269public OnGameModeInit()
270{
271 Database = db_open("SDataBase.db");
272 db_query(Database, "CREATE TABLE IF NOT EXISTS users (UserLevel INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR(24) COLLATE NOCASE, password VARCHAR(129), admin INTEGER DEFAULT 0 NOT NULL, vip INTEGER DEFAULT 0 NOT NULL, money INTEGER DEFAULT 0 NOT NULL, score INTEGER DEFAULT 0 NOT NULL, kills INTEGER DEFAULT 0 NOT NULL, deaths INTEGER DEFAULT 0 NOT NULL, kd INTEGER DEFAULT 0 NOT NULL)");
273 SetGameModeText(""SV_GM""SCRIPT_V"");
274 SendRconCommand("language "SV_LANG"");
275 SendRconCommand("rcon_password "SV_RCON"");
276 SendRconCommand("hostname "SV_NAME"");
277 SendRconCommand("weburl "SV_URL"");
278 SendRconCommand("mapname "SV_MAP"");
279
280 for (new c = 1; c < 300; c++)
281 {
282 if (c == 74) continue;
283 AddPlayerClass(c, CLASS_X, CLASS_Y, CLASS_Z, 0.0, 0, 0, 0, 0, 0, 0);
284 }
285 return 1;
286}
287
288public OnGameModeExit()
289{
290 db_close(Database);
291 return 1;
292}
293
294public OnPlayerRequestClass(playerid, classid)
295{
296 new playername[MAX_PLAYER_NAME], str[270];
297 GetPlayerName(playerid, playername, MAX_PLAYER_NAME);
298 if (isconnected[playerid] == 0)
299 {
300 isconnected[playerid] = 1;
301 SetPlayerColor(playerid, COLOR_PLAYER);
302 TogglePlayerSpectating(playerid, 1);
303 SetPlayerVirtualWorld(playerid, 1);
304
305 for(new i; i < _: USER_DATA; ++i) User[playerid][USER_DATA: i] = 0;
306
307 GetPlayerName(playerid, User[playerid][UserName], MAX_PLAYER_NAME);
308 new Query[71], DBResult: Result;
309 format(Query, sizeof(Query), "SELECT password FROM users WHERE username = '%s' LIMIT 0, 1", DB_Escape(User[playerid][UserName]));
310 Result = db_query(Database, Query);
311 if(db_num_rows(Result))
312 {
313 db_get_field_assoc(Result, "password", User[playerid][Password], 129);
314 format(str, sizeof(str), "Welcome to {00FFF3}%s.\n\n"COL_RED"Account:{FFFFFF} %s\n\nPlease enter your password below:", SV_SNAME, RPN(playerid));
315 ShowPlayerDialog2(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login to your account", str, "Login", "Cancel");
316 SendPlayerFormattedText(playerid, COLOR_LBLUE, "Welcome back %s to {FF33CC}"SV_SNAME"{FFFFFF}.", playername, "");
317 }
318 else
319 {
320 format(str, sizeof(str), "Welcome to {FFB900}%s.\n\n"COL_RED"Account:{FFFFFF} %s\n\nRegister an account to play.\n\nPlease put the password below:", SV_SNAME, RPN(playerid));
321 ShowPlayerDialog2(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register an account", str, "Continue", "Cancel");
322 SendPlayerFormattedText(playerid, COLOR_WHITE, "Welcome %s to {FF33CC}"SV_SNAME"{FFFFFF}.", playername, "");
323 }
324 db_free_result(Result);
325 return 0;
326 }
327 return 1;
328}
329
330public OnPlayerConnect(playerid)
331{
332 return 1;
333}
334
335public OnPlayerDisconnect(playerid, reason)
336{
337 if(User[playerid][Logged] == true)
338 {
339 new Query[128];
340 format(Query, sizeof(Query), "UPDATE users SET aLevel = %d, vLevel = %d, money = %d, score = %d, kills = %d, deaths = %d, kd = %d WHERE username = '%s'", User[playerid][UserLevel], User[playerid][UserVip], GetPlayerMoney(playerid), GetPlayerScore(playerid), User[playerid][UserKills], User[playerid][UserDeaths], User[playerid][UserK], DB_Escape(User[playerid][UserName]));
341 db_query(Database, Query);
342 }
343 for(new i; i < _: USER_DATA; ++i) User[playerid][USER_DATA: i] = 0;
344 return 1;
345}
346
347public OnPlayerSpawn(playerid)
348{
349 return 1;
350}
351
352public OnPlayerDeath(playerid, killerid, reason)
353{
354 User[killerid][UserKills]++;
355 User[playerid][UserDeaths]++;
356 return 1;
357}
358
359public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
360{
361 new name[MAX_PLAYER_NAME], playername[25], temp1, tmp2[256], tmp[256], str[270];
362 GetPlayerName(playerid, name, sizeof(name));
363 GetPlayerName(playerid, playername, sizeof(playername));
364 if(dialogid == DIALOG_LOGIN)
365 {
366 if(response)
367 {
368 if(!inputtext[0])
369 {
370 format(str, sizeof(str), "Welcome to {00FFF3}%s.\n\n"COL_RED"Account:{FFFFFF} %s\n\nPlease enter your password below:", SV_SNAME, RPN(playerid));
371 ShowPlayerDialog2(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login to your account", str, "Login", "Cancel");
372 SendPlayerFormattedText(playerid, COLOR_LBLUE, "Welcome back %s to {FF33CC}"SV_SNAME"{FFFFFF}.", playername, "");
373 return 1;
374 }
375 new buf[129];
376 WP_Hash(buf, 129, inputtext);
377 if(!strcmp(buf, User[playerid][Password], false))
378 {
379 new Query[75], DBResult: Result;
380 format(Query, sizeof(Query), "SELECT * FROM users WHERE username = '%s' LIMIT 0, 1", DB_Escape(User[playerid][UserName]));
381 Result = db_query(Database, Query);
382 if(db_num_rows(Result))
383 {
384 db_get_field_assoc(Result, "UserID", Query, 7);
385 User[playerid][PlayerID] = strval(Query);
386
387 db_get_field_assoc(Result, "aLevel", Query, 3);
388 User[playerid][UserLevel] = strval(Query);
389
390 db_get_field_assoc(Result, "vLevel", Query, 3);
391 User[playerid][UserVip] = strval(Query);
392
393 db_get_field_assoc(Result, "money", Query, 10);
394 User[playerid][UserMoney] = strval(Query);
395
396 db_get_field_assoc(Result, "score", Query, 7);
397 User[playerid][UserScore] = strval(Query);
398
399 db_get_field_assoc(Result, "kills", Query, 10);
400 User[playerid][UserKills] = strval(Query);
401
402 db_get_field_assoc(Result, "deaths", Query, 10);
403 User[playerid][UserDeaths] = strval(Query);
404
405 db_get_field_assoc(Result, "kd", Query, 10);
406 User[playerid][UserK] = strval(Query);
407
408 User[playerid][Logged] = true;
409 TogglePlayerSpectating(playerid, 0);
410
411 GivePlayerMoney(playerid, User[playerid][UserMoney]);
412 SetPlayerScore(playerid, User[playerid][UserScore]);
413
414 SendClientMessage2(playerid, COLOR_WHITE, "Login successful, your status has been restored!");
415 printf("[logged] %s (Id%d) has logged in.", playername, playerid);
416 }
417 db_free_result(Result);
418 }
419 else
420 {
421 temp1 = GetPVarInt(playerid, "loginattempts")+1;
422 if (temp1 == 3)
423 {
424 SendClientMessage2(playerid, COLOR_RED, "Bad password threshold reached. You have been kicked!");
425 SetTimerEx("KickBanTimer", 50, 0, "dd", playerid, 1);
426 }
427 else
428 {
429 if (temp1 == 1)
430 {
431 SendClientMessage2(playerid, COLOR_HELP, "If you need support please say what help you need in chat, and our admins will be informed.");
432 }
433 SetPVarInt(playerid, "loginattempts", temp1);
434 format(tmp, 32, "Login to your account (%d/3)", temp1);
435 format(tmp2, 280, "Type your password below to login to your account.\n\n"COL_RED"Account:{FFFFFF} %s\n\n{E60026}Password incorrect. Attempts remaining - %d.",RPN(playerid), 3 - temp1);
436 ShowPlayerDialog2(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, tmp, tmp2, "Login", "Cancel");
437 format(tmp2, 280, "Password incorrect. Attempts remaining - %d.", 3 - temp1);
438 SendClientMessage2(playerid, COLOR_RED, tmp2);
439 }
440 }
441 }
442 //else Kick(playerid);
443 return 1;
444 }
445 if(dialogid == DIALOG_REGISTER)
446 {
447 if(response)
448 {
449 if(strlen(inputtext) < 3 || strlen(inputtext) > 24)
450 {
451 format(str, sizeof(str), "Welcome to {FFB900}%s.\n\n"COL_RED"Account:{FFFFFF} %s\n\nRegister an account to play.\nThe password is invalid, Its lenght should be 3-24 characters\n\nPlease put the password below:", SV_SNAME, RPN(playerid));
452 ShowPlayerDialog2(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register an account", str, "Continue", "Cancel");
453 return 1;
454 }
455 new Query[208];
456 WP_Hash(User[playerid][Password], 129, inputtext);
457 format(Query, sizeof(Query), "INSERT INTO users (username, password) VALUES ('%s', '%s')", DB_Escape(User[playerid][UserName]), DB_Escape(User[playerid][Password]));
458 db_query(Database, Query);
459
460 User[playerid][Logged] = true;
461 TogglePlayerSpectating(playerid, 0);
462 SendPlayerFormattedText(playerid, COLOR_YELLOW, "Account '%s' created, you have been logged in automatically!", playername, "");
463 SendAllFormattedText(COLOR_GREEN, "%s has registered a new account. Welcome to our server!", playername, "");
464 printf("[registered] %s (Id%d) has registered a new account.", playername, playerid);
465 }
466 return 1;
467 }
468 return 1;
469}
470/** Commands **/
471CMD:setadmin(playerid, params[])
472{
473 new giveplayerid, moneys1, giveplayer[25], playername[25], string[256];
474 if (User[playerid][UserLevel] < 6 && !IsPlayerAdmin(playerid)) return 0;
475 if (sscanf(params, "ud", giveplayerid, moneys1)) return SendClientMessage2(playerid, COLOR_WHITE, "Usage: /setadmin [playerid] [level 1-6]");
476 if (!IsPlayerConnected2(giveplayerid)) return SendClientMessage2(playerid, COLOR_RED, "Error: Inactive player id!");
477 if (moneys1 < 0 || moneys1 > 6) return SendClientMessage2(playerid, COLOR_RED, "Error: Invalid admin level.");
478 GetPlayerName(giveplayerid, giveplayer, MAX_PLAYER_NAME);
479 if (User[playerid][UserLevel] >= User[playerid][UserLevel] && User[playerid][UserLevel] < 6 && !IsPlayerAdmin(playerid)) return SendPlayerFormattedText(playerid, COLOR_RED, "Error: You cannot Make admin %s", giveplayer, "");
480 GetPlayerName(giveplayerid, giveplayer, MAX_PLAYER_NAME);
481 if (moneys1 == User[playerid][UserLevel])
482 {
483 format(string, 64, "%s is already admin level %d.", giveplayer, moneys1);
484 SendClientMessage2(playerid, COLOR_WHITE, string);
485 return 1;
486 }
487 GetPlayerName(playerid, playername, MAX_PLAYER_NAME);
488 User[playerid][UserLevel] = moneys1;
489 format(string, 64, "You have been set as admin level %d.", moneys1);
490 SendClientMessage2(giveplayerid, COLOR_YELLOW, string);
491 format(string, 64, "You have set %s as admin level %d.", giveplayer, moneys1);
492 SendClientMessage2(playerid, COLOR_YELLOW, string);
493 return 1;
494}
495
496CMD:ac(playerid, params[])
497{
498 new string[172];
499 if(User[playerid][UserLevel] < 1) return 0;
500 if(isnull(params)) return SendClientMessage(playerid, -1, "Please use /ac [Message]");
501 new PName[MAX_PLAYER_NAME+1];
502 GetPlayerName(playerid, PName, sizeof(PName));
503 format(string, sizeof(string), "[Admin Chat][%s] %s: %s", PName, params);
504 SendMessageToAdmins(COLOR_RED, string);
505 return 1;
506}
507
508CMD:asay(playerid, params[])
509 {
510 if(User[playerid][UserLevel] < 1) return 0;
511 new text[128];
512 if(sscanf(params, "s[128]",text)) return SendClientMessage(playerid, 0xFFFFFFFF, "Usage: /asay [text]");
513 new string[128];
514 new pName[128];
515 GetPlayerName(playerid,pName,128);
516 format(string,sizeof string,"[%s]%s: %s",pName,text);
517 SendClientMessageToAll(COLOR_GREEN,string);
518 return 1;
519}
520CMD:admins(playerid, params[])
521{
522 new admins, strings[270];
523 if(User[playerid][UserScore] < 100) return SendClientMessage(playerid, COLOR_WHITE,"[Server]: You must have 100 Scores to see online admins");
524 SendClientMessage(playerid, COLOR_BLUE, "Online Admins");
525 for(new i = 0; i < PLAYERS; i++)
526 {
527 if (IsPlayerConnected(i))
528 {
529 if(User[i][UserLevel] >= 1)
530 {
531 new string[128], pname[24];
532 GetPlayerName(i, pname, sizeof(pname));
533 admins++;
534 format(string, sizeof(string), "%s {00FF00} Admin Level: {FF0000}%d", pname, User[i][UserLevel]);
535 SendClientMessage(playerid, COLOR_RED, string);
536 }
537 }
538 }
539 if (admins == 0)
540 {
541 SendClientMessage(playerid, COLOR_RED, "[Server]: Their are no admins online.");
542 }
543 else
544 {
545 format(strings, sizeof(strings), "[Server]: There are currently %d Admins online.", admins);
546 SendClientMessage(playerid, COLOR_GREEN, strings);
547 }
548 return 1;
549}