BulletRja

Simple Script

Apr 19th, 2018
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 32.25 KB | None | 0 0
  1. #define FILTERSCRIPT
  2.  
  3. /* Includes */
  4. #include <a_samp>
  5. #include <streamer>
  6. #include <sscanf2>
  7. #include <dini>
  8. #include <utils>
  9. #include <dutils>
  10. #include <zcmd>
  11.  
  12. #define GM_NAME "Server Name"
  13. /* Dialogs */
  14. #define DIALOG_REGISTER         0
  15. #define DIALOG_REG_CONFIRM      1
  16. #define DIALOG_LOGIN            2
  17. #define DIALOG_RULES            3
  18.  
  19. /* Max Defines */
  20. #define MAX_CLIENT_MSG_LENGTH 144
  21.  
  22. /* Colours */
  23. #define COLOR_PURPLE2 0xC2A2DAFF
  24. #define COLOR_DARKRED 0xAA3333FF
  25. #define COLOR_GREY 0xAFAFAFFF
  26. #define COLOR_ASAY 0xFF0000FF
  27. #define COLOR_OSAY 0x007700FF
  28. #define COLOR_HSAY 0x1684CAFF
  29. #define COLOR_MSAY 0x1684CAFF
  30. #define COLOR_WHITE 0xFFFFFFFF
  31. #define COLOR_YELLOW 0xFFFF00FF
  32. #define COLOR_LIGHTGREEN 0xFF0000A
  33. #define COLOR_RED 0xFF0000FF
  34. #define RED 0xFF0000FF
  35. #define COLOR_LRED 0xFF4747FF
  36. #define COLOR_GREEN 0x00FF00FF
  37. #define COLOR_DARKMAUVE 0x623778FF
  38. #define COLOR_MAUVE 0x845F96FF
  39. #define COLOR_GREENYELLOW 0xADFF2FAA
  40. #define GREY \
  41.     0xAFAFAFAA
  42.  
  43. #define GREEN \
  44.     0x9FFF00FF
  45.  
  46. #define YELLOW \
  47.     0xFFFF00AA
  48.  
  49. #define WHITE \
  50.     0xFFFFFFAA
  51. #define COLOR_BLUE 0x0000FFFF
  52. #define COLOR_LBLUE 0x99FFFFFF
  53. #define COLOR_LIGHTBLUE 0x99FFFFFF
  54. #define COLOR_ORANGE 0xFF9900FF
  55. #define COLOR_PURPLE 0xCC00DDFF
  56. #define COLOR_PEACH 0xFFCC66FF
  57. #define COLOR_SILVER 0xDDDDDDFF
  58. #define COLOR_WANTEDBLUE 0x0055CCFF
  59. #define COLOR_DARK_VIOLET 0x9400D3FF
  60. #define COLOR_VIP1 0x9400D3FF
  61. #define COLOR_HELP 0x00E5EEFF
  62. #define COLOR_ADMIN 0x0066FFFF
  63. #define COLOR_ADMIN2 0x008FD6FF
  64. #define COLOR_PLAYER 0xFFCC33FF
  65. #define COLOR_RP 0xFFFFFFFF
  66. #define COLOR_ULTRAADMIN 0x993300FF
  67. #define COLOR_EVENT 0x00CC66FF
  68. #define COLOR_VIP2 0xFF33CCFF
  69. #define COLOR_VIPCHAT 0xCC66CCFF
  70. #define COLOR_BROWNY 0xB32D00FF
  71. #define COLOR_PURPLE_1 0x993366FF
  72. #define COLOR_ERROR 0xAA3333AA
  73. #define COLOR_NOTIFICATION 0x33CCFFAA
  74. #define     COL_WHITE       "{FFFFFF}"
  75. #define     COL_BLACK       "{0E0101}"
  76. #define     COL_GREY        "{C3C3C3}"
  77. #define     COL_GREEN       "{6EF83C}"
  78. #define     COL_RED         "{F81414}"
  79. #define     COL_YELLOW      "{F3FF02}"
  80. #define     COL_ORANGE      "{FFAF00}"
  81. #define     COL_LIME        "{B7FF00}"
  82. #define     COL_CYAN        "{00FFEE}"
  83. #define     COL_BLUE        "{0049FF}"
  84. #define     COL_MAGENTA     "{F300FF}"
  85. #define     COL_VIOLET      "{B700FF}"
  86. #define     COL_PINK        "{FF00EA}"
  87. #define     COL_MARONE      "{A90202}"
  88. #define     COL_VIP1        "{0x9400D3FF}"
  89. #define     COL_VIP2        "{0xFF33CCFF}"
  90. #define     COL_SILVER      "{0xDDDDDDFF}"
  91. #define     COL_PURPLE      "{0xCC00DDFF}"
  92. #define COL_NICEGREEN      "{6EF83C}"
  93. #define COL_NICERED        "{FF0606}"
  94. #define COL_ORANGE         "{FFAF00}"
  95. #define COL_EASY           "{FFF1AF}"
  96. #define COL_WHITE          "{FFFFFF}"
  97. #define COL_BLACK          "{0E0101}"
  98. #define COL_YELLOW         "{F3FF02}"
  99. #define COL_YELLOW2        "{DAE368}"
  100. #define COL_BYELLOW        "{FFFF80}"
  101. #define COL_LIME           "{B7FF00}"
  102. #define COL_CYAN           "{00FFEE}"
  103. #define COL_LIGHTBLUE      "{00C0FF}"
  104. #define COL_BLUE           "{0049FF}"
  105. #define COL_MAGENTA        "{F300FF}"
  106. #define COL_VIOLET         "{B700FF}"
  107. #define COL_PINK           "{FF00EA}"
  108. #define COL_MARONE         "{A90202}"
  109. #define COL_CMD            "{B8FF02}"
  110. #define COL_PARAM          "{3FCD02}"
  111. #define COL_SERVER         "{AFE7FF}"
  112. #define COL_VALUE          "{A3E4FF}"
  113. #define COL_RULE           "{F9E8B7}"
  114. #define COL_RULE2          "{FBDF89}"
  115. #define COL_RWHITE         "{FFFFFF}"
  116. #define COL_LGREEN         "{C9FFAB}"
  117. #define COL_LRED           "{FFA1A1}"
  118. #define COL_LRED2          "{C77D87}"
  119. #define COL_LBLUE          "{00A5FF}"
  120. #define COL_GRAD2          "{BFC0C2}"
  121. #define COL_REALRED        "{FF0606}"
  122. #define COLOR_LIMEGREEN 0x32CD32AA
  123.  
  124. /* Files */
  125. #define FILE_TOTALSTAT "totalstat"
  126. #define FILE_REC       "records"
  127. #define FILE_ADMINS    "alist"
  128. /* Folders */
  129. #define dir_datafiles "datafiles"
  130. #define dir_userfiles "userfiles"
  131.  
  132. /* Class Position */
  133. #define SELECTION_X 1088.1422
  134. #define SELECTION_Y 1074.0307
  135. #define SELECTION_Z 10.8382
  136.  
  137. /* Enumerators */
  138. enum PlayerInfo
  139. {
  140.  pAdmin,
  141.  pMoney,
  142.  pScore,
  143.  pIP,
  144.  pYear,
  145.  pMonth,
  146.  pDay,
  147.  pKills,
  148.  pDeaths,
  149.  pLogged,
  150.  pDialog
  151. }
  152. new pInfo[MAX_PLAYERS][PlayerInfo];
  153.  
  154. /* New Defines */
  155. new pConnected[MAX_PLAYERS];
  156.  
  157. /* Defines */
  158. LoadPlayer(playerid)
  159. {
  160.  new year, month, day, playerip[16], string[270];
  161.  getdate(year, month, day);
  162.  GetPlayerIp(playerid, playerip, 16);
  163.  pInfo[playerid][pAdmin] = dini_Int(AddFile(dir_userfiles, RPN(playerid)), "pAdmin");
  164.  pInfo[playerid][pKills] = dini_Int(AddFile(dir_userfiles, RPN(playerid)), "pKills");
  165.  pInfo[playerid][pDeaths] = dini_Int(AddFile(dir_userfiles, RPN(playerid)), "pDeaths");
  166.  pInfo[playerid][pMoney] = SetPlayerMoney(playerid, dini_Int(AddFile(dir_userfiles, RPN(playerid)), "pMoney"));
  167.  pInfo[playerid][pScore] = SetPlayerScore(playerid, dini_Int(AddFile(dir_userfiles, RPN(playerid)), "pScore"));
  168.  pInfo[playerid][pIP] = dini_Set(AddFile(dir_userfiles, RPN(playerid)), "pIP", playerip);
  169.  pInfo[playerid][pYear] = dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pYear", year);
  170.  pInfo[playerid][pMonth] = dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pMonth", month);
  171.  pInfo[playerid][pDay] = dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pDay", day);
  172.  format(string, sizeof(string), "Server: Admin Level : %d", dini_Int(AddFile(dir_userfiles, RPN(playerid)), "pAdmin"));
  173.  SendClientMessage(playerid, COLOR_YELLOW, string);
  174. }
  175. SavePlayer(playerid)
  176. {
  177.  new year, month, day, playerip[16];
  178.  getdate(year, month, day);
  179.  GetPlayerIp(playerid, playerip, 16);
  180.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pMoney", GetPlayerMoney(playerid));
  181.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pScore", GetPlayerScore(playerid));
  182.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pAdmin", pInfo[playerid][pAdmin]);
  183.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pKills", pInfo[playerid][pKills]);
  184.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pDeaths", pInfo[playerid][pDeaths]);
  185.  dini_Set(AddFile(dir_userfiles, RPN(playerid)), "pIP", playerip);
  186.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pYear", year);
  187.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pMonth", month);
  188.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pDay", day);
  189. }
  190. SaveAllPlayer()
  191. {
  192.  new year, month, day, playerip[16];
  193.  getdate(year, month, day);
  194.  for(new i=0;i<MAX_PLAYERS;i++)
  195.  {
  196.   GetPlayerIp(i, playerip, 16);
  197.   dini_IntSet(AddFile(dir_userfiles, RPN(i)), "pMoney", GetPlayerMoney(i));
  198.   dini_IntSet(AddFile(dir_userfiles, RPN(i)), "pScore", GetPlayerScore(i));
  199.   dini_IntSet(AddFile(dir_userfiles, RPN(i)), "pAdmin", pInfo[i][pAdmin]);
  200.   dini_IntSet(AddFile(dir_userfiles, RPN(i)), "pKills", pInfo[i][pKills]);
  201.   dini_IntSet(AddFile(dir_userfiles, RPN(i)), "pDeaths", pInfo[i][pDeaths]);
  202.   dini_Set(AddFile(dir_userfiles, RPN(i)), "pIP", playerip);
  203.   dini_IntSet(AddFile(dir_userfiles, RPN(i)), "pYear", year);
  204.   dini_IntSet(AddFile(dir_userfiles, RPN(i)), "pMonth", month);
  205.   dini_IntSet(AddFile(dir_userfiles, RPN(i)), "pDay", day);
  206.  }
  207. }
  208.  
  209. AddFile(directory[], filename[])
  210. {
  211.     new newname[128];
  212.     format(newname, sizeof(newname), "%s/%c/%s.ini", directory, filename[0] != '.' ? filename[0] : '#', filename);
  213.     return newname;
  214. }
  215.  
  216. SendClientMessageToClient(playerid, color, message[])
  217. {
  218.     if (strlen(message) <= MAX_CLIENT_MSG_LENGTH)
  219.     {
  220.         SendClientMessage(playerid, color, message);
  221.     }
  222.     else
  223.     {
  224.         new string[MAX_CLIENT_MSG_LENGTH + 1];
  225.         strmid(string, message, 0, MAX_CLIENT_MSG_LENGTH);
  226.         SendClientMessage(playerid, color, string);
  227.     }
  228.     return 1;
  229. }
  230.  
  231. SendClientMessageToPlayer(color, message[])
  232. {
  233.     for (new i = 0; i < PLAYERS; i++)
  234.     {
  235.         if (IsPlayerConnected2(i)) SendClientMessageToClient(i, color, message);
  236.     }
  237.     return 1;
  238. }
  239.  
  240. IsPlayerConnected2(playerid)
  241. {
  242.     return IsPlayerNPC(playerid) == 0 && playerid < sizeof(pConnected) ? pConnected[playerid] : 0;
  243. }
  244.  
  245. ShowPlayerDialog2(playerid, dialogid, style, caption[], info[], button1[], button2[])
  246. {
  247.     ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
  248.     pInfo[playerid][pDialog] = dialogid;
  249. }
  250.  
  251. HidePlayerDialog(playerid)
  252. {
  253.     ShowPlayerDialog(playerid, -1, 0, " ", " ", "", "");
  254.     pInfo[playerid][pDialog][playerid] = -1;
  255. }
  256.  
  257. GetPlayerDialog(playerid)
  258. {
  259.     return pInfo[playerid][pDialog][playerid];
  260. }
  261.  
  262. SaveAccount(playerid, text[])
  263. {
  264.     new name[MAX_PLAYER_NAME];
  265.     GetPlayerName(playerid, name, sizeof(name));
  266.     dini_Set(AddFile(dir_datafiles, FILE_REC), name, text);
  267. }
  268.  
  269. SaveAccount2(text[], text2[])
  270. {
  271.     dini_Set(AddFile(dir_datafiles, FILE_REC), text, text2);
  272. }
  273.  
  274. SendPlayerFormattedText(playerid, color, str[], define1[], define2[])
  275. {
  276.     new tstr[256];
  277.     format(tstr, 256, str, define1, define2);
  278.     SendClientMessageToClient(playerid, color, tstr);
  279.     return 1;
  280. }
  281.  
  282. SendAllFormattedText(color, str[], define1[], define2[])
  283. {
  284.     new tstr[256];
  285.     format(tstr, 256, str, define1, define2);
  286.     SendClientMessageToPlayer(color, tstr);
  287.     return 1;
  288. }
  289.  
  290. RPN(playerid)
  291. {
  292.  new name[25];
  293.  GetPlayerName(playerid, name, sizeof(name));
  294.  return name;
  295. }
  296.  
  297. PlayerConnect(playerid)
  298. {
  299.     new tmp3[50],pNames[MAX_PLAYER_NAME],string[128];
  300.     GetPlayerName(playerid,pNames,MAX_PLAYER_NAME);
  301.     GetPlayerIp(playerid,tmp3,50);
  302.     if(strlen(dini_Get("checkrecords.cfg", tmp3)) == 0)
  303.     dini_Set("checkrecords.cfg", tmp3, pNames);
  304.     else
  305.     {
  306.         if( strfind( dini_Get("checkrecords.cfg", tmp3), pNames, true) == -1 )
  307.         {
  308.             format(string,sizeof(string),"%s,%s", dini_Get("checkrecords.cfg",tmp3), pNames);
  309.             dini_Set("checkrecords.cfg", tmp3, string);
  310.         }
  311.     }
  312.     new File: file = fopen("usernames.cfg", io_append);
  313.     format(string,sizeof(string),"%s\r\n",pNames);
  314.     fwrite(file,string);
  315.     fclose(file);
  316.     return 1;
  317. }
  318.  
  319. SetPlayerAdmin(playerid, level)
  320. {
  321.  pInfo[playerid][pAdmin] =level;
  322.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pAdmin", level);
  323. }
  324.  
  325. SetPlayerKills(playerid, kills)
  326. {
  327.  pInfo[playerid][pKills] =kills;
  328.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pKills", kills);
  329. }
  330.  
  331. GivePlayerKills(playerid, kills)
  332. {
  333.  pInfo[playerid][pKills] +=kills;
  334.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pKills", pInfo[playerid][pKills]+kills);
  335. }
  336.  
  337. SetPlayerDeaths(playerid, deaths)
  338. {
  339.  pInfo[playerid][pDeaths] =deaths;
  340.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pDeaths", deaths);
  341. }
  342.  
  343. GivePlayerDeaths(playerid, deaths)
  344. {
  345.  pInfo[playerid][pDeaths] +=deaths;
  346.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pDeaths", pInfo[playerid][pDeaths]+deaths);
  347. }
  348.  
  349. GivePlayerScore(playerid, score)
  350. {
  351.  pInfo[playerid][pAdmin] = SetPlayerScore(playerid, GetPlayerScore(playerid)+score);
  352.  dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pScore", SetPlayerScore(playerid, GetPlayerScore(playerid)+score));
  353. }
  354. public OnFilterScriptInit()
  355. {
  356.     if (!dini_Exists(AddFile(dir_datafiles, FILE_TOTALSTAT)))
  357.     {
  358.         dini_Create(AddFile(dir_datafiles, FILE_TOTALSTAT));
  359.     }
  360.  
  361.     if (!dini_Exists(AddFile(dir_datafiles, FILE_REC)))
  362.     {
  363.         dini_Create(AddFile(dir_datafiles, FILE_REC));
  364.     }
  365.    
  366.     if (!dini_Exists(AddFile(dir_datafiles, FILE_ADMINS)))
  367.     {
  368.         dini_Create(AddFile(dir_datafiles, FILE_ADMINS));
  369.     }
  370.  
  371.     if (!dini_Exists(AddFile(dir_datafiles, "None")))
  372.     {
  373.         dini_Create(AddFile(dir_userfiles, "None"));
  374.     }
  375.     if(!fexist("records.cfg"))return dini_Create("records.cfg");
  376.     if(!fexist("accounts.cfg"))return dini_Create("accounts.cfg");
  377.    
  378.     for (new i = 1; i < 300; i++)
  379.     {
  380.         if (i == 74) continue;
  381.         AddPlayerClass(i, SELECTION_X, SELECTION_Y, SELECTION_Z, 0.0, 0, 0, 0, 0, 0, 0);
  382.     }
  383.    
  384.     SetTimer("SaveAllPlayers", 100, 1);
  385.     return 1;
  386. }
  387.  
  388. public OnFilterScriptExit()
  389. {
  390.     return 1;
  391. }
  392.  
  393. SetPlayerClassPosition(playerid, classid)
  394. {
  395.     new Float:angle = (360.0 / 50) * (50 - classid);
  396.     SetPlayerInterior(playerid, 0);
  397.     SetPlayerFacingAngle(playerid, angle);
  398.     SetPlayerPos(playerid, SELECTION_X, SELECTION_Y, SELECTION_Z);
  399.     SetPlayerCameraPos(playerid, SELECTION_X + floatsin(-angle, degrees) * 4.0, SELECTION_Y + floatcos(-angle, degrees) * 4.0, SELECTION_Z + 1.0);
  400.     SetPlayerCameraLookAt(playerid, SELECTION_X, SELECTION_Y, SELECTION_Z);
  401. }
  402.  
  403. public OnPlayerRequestClass(playerid, classid)
  404. {
  405.     new playeridname[25], playername[MAX_PLAYER_NAME], str[270];
  406.     GetPlayerName(playerid, playeridname, sizeof(playeridname));
  407.     GetPlayerName(playerid, playername, MAX_PLAYER_NAME);
  408.     if (IsPlayerNPC(playerid)) return 1;
  409.     SetPlayerColor(playerid, COLOR_YELLOW);
  410.     if (pConnected[playerid] == 0)
  411.     {
  412.         pConnected[playerid] = 1;
  413.         SetPlayerColor(playerid, COLOR_PLAYER);
  414.         TogglePlayerSpectating(playerid, 1);
  415.         SetPlayerVirtualWorld(playerid, 1);
  416.        
  417.         if (dini_Exists(AddFile(dir_userfiles, playername)))
  418.         {
  419.             format(str, sizeof(str), "{B35900}Welcome to {669900}%s.\n\n{FFFF00}Account:{FFFFFF} %s is already "COL_GREEN"registered\n\n"COL_WHITE"Please enter your password below:", GM_NAME, RPN(playerid));
  420.             ShowPlayerDialog2(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login to your account", str, "Login", "Cancel");
  421.             SendPlayerFormattedText(playerid, COLOR_WHITE, "Welcome back {00FF7F}%s"COL_WHITE",Login to your account to play.", playername, "");
  422.         }
  423.         else
  424.         {
  425.             format(str, sizeof(str), "{B35900}Welcome to {669900}%s.\n\n{FFFF00}Account:{FFFFFF} %s is not "COL_RED"registered\n\n"COL_WHITE"Register an account to play.\n\nPlease put the password below:", GM_NAME, RPN(playerid));
  426.             ShowPlayerDialog2(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register an account", str, "Continue", "Cancel");
  427.             SendPlayerFormattedText(playerid, COLOR_WHITE, "Account {00FF7F}%s "COL_WHITE"isn't registered. Register your account below to play.", playername, "");
  428.         }
  429.          
  430.         return 0;
  431.     }
  432.     SetPlayerClassPosition(playerid, classid);
  433.     return 1;
  434. }
  435.  
  436. public OnPlayerConnect(playerid)
  437. {
  438.     pConnected[playerid] = 0;
  439.     pInfo[playerid][pAdmin] = 0;
  440.     pInfo[playerid][pKills] = 0;
  441.     pInfo[playerid][pDeaths] = 0;
  442.     return 1;
  443. }
  444.  
  445. public OnPlayerDisconnect(playerid, reason)
  446. {
  447.     if(pInfo[playerid][pLogged] == 1)
  448.     {
  449.      SavePlayer(playerid);
  450.     }
  451.     return 1;
  452. }
  453.  
  454. public OnPlayerSpawn(playerid)
  455. {
  456.     if (pInfo[playerid][pLogged] == 1)
  457.     {
  458.      dini_Unset((AddFile(dir_userfiles, RPN(playerid))), "firstspawn");
  459.     }
  460.     return 1;
  461. }
  462.  
  463. public OnPlayerDeath(playerid, killerid, reason)
  464. {
  465.     pInfo[playerid][pKills] ++;
  466.     pInfo[playerid][pDeaths] ++;
  467.     return 1;
  468. }
  469.  
  470. public OnVehicleSpawn(vehicleid)
  471. {
  472.     return 1;
  473. }
  474.  
  475. public OnVehicleDeath(vehicleid, killerid)
  476. {
  477.     return 1;
  478. }
  479.  
  480. public OnPlayerText(playerid, text[])
  481. {
  482.     if (pInfo[playerid][pLogged] == 0) {
  483.         printf("[Chats] [%s]: %s", RPN(playerid), text);
  484.         if (dini_Exists(AddFile(dir_userfiles, RPN(playerid))))
  485.         {
  486.             SendClientMessageToClient(playerid, COLOR_WHITE, "You must login to play! Type /login to continue.");
  487.         }
  488.         else
  489.         {
  490.             SendClientMessageToClient(playerid, COLOR_WHITE, "You must register to play! Type /register to continue.");
  491.         }
  492.         return 0;
  493.     }
  494.     if (!IsPlayerConnected2(playerid)) return 0;
  495.     return 1;
  496. }
  497.  
  498. public OnPlayerCommandText(playerid, cmdtext[])
  499. {
  500.     if (strcmp("/mycommand", cmdtext, true, 10) == 0)
  501.     {
  502.         // Do something here
  503.         return 1;
  504.     }
  505.     return 0;
  506. }
  507.  
  508. public OnPlayerCommandPerformed(playerid, cmdtext[], success)
  509. {
  510.     if(!success) return 0;
  511.     return 1;
  512. }
  513. public OnPlayerCommandReceived(playerid, cmdtext[])
  514. {
  515.     if (!IsPlayerConnected2(playerid)) return 0;
  516.     new playername[MAX_PLAYER_NAME], hidcmd;
  517.     new cstring[100],playerids[MAX_PLAYER_NAME];
  518.     GetPlayerName(playerid, playerids, sizeof(playerids));
  519.     format(cstring, sizeof(cstring), "[Command] [%s]: %s", playerids, cmdtext);
  520.     for(new i=0; i<PLAYERS; i++)
  521.     {
  522.         if(pInfo[i][pAdmin] >= 1)
  523.         {
  524.             if(pInfo[playerid][pAdmin] <= pInfo[i][pAdmin])
  525.             {
  526.                 if(i != playerid && hidcmd == 1) SendClientMessage(i, -1, cstring);
  527.             }
  528.         }
  529.     }
  530.     if((strfind(cmdtext, "/register", true) != 0) && (strfind(cmdtext, "/login", true) != 0) && (strfind(cmdtext, "/areply", true) != 0))
  531.     {
  532.         if (pInfo[playerid][pLogged] == 0)
  533.         {
  534.             if (dini_Exists(AddFile(dir_userfiles, playername))) SendClientMessageToClient(playerid, COLOR_WHITE, "You must login to play! Type /login to continue.");
  535.             else SendClientMessageToClient(playerid, COLOR_WHITE, "You must register to play! Type /register to continue.");
  536.             return 0;
  537.         }
  538.     }
  539.     return 1;
  540. }
  541. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  542. {
  543.     return 1;
  544. }
  545.  
  546. public OnPlayerExitVehicle(playerid, vehicleid)
  547. {
  548.     return 1;
  549. }
  550.  
  551. public OnPlayerStateChange(playerid, newstate, oldstate)
  552. {
  553.     return 1;
  554. }
  555.  
  556. public OnPlayerEnterCheckpoint(playerid)
  557. {
  558.     return 1;
  559. }
  560.  
  561. public OnPlayerLeaveCheckpoint(playerid)
  562. {
  563.     return 1;
  564. }
  565.  
  566. public OnPlayerEnterRaceCheckpoint(playerid)
  567. {
  568.     return 1;
  569. }
  570.  
  571. public OnPlayerLeaveRaceCheckpoint(playerid)
  572. {
  573.     return 1;
  574. }
  575.  
  576. public OnRconCommand(cmd[])
  577. {
  578.     return 1;
  579. }
  580.  
  581. public OnPlayerRequestSpawn(playerid)
  582. {
  583.     if (IsPlayerNPC(playerid)) return 1;
  584.  
  585.     if (pInfo[playerid][pLogged] == 0) return 0;
  586.  
  587.     if (dini_Isset(AddFile(dir_userfiles, RPN(playerid)), "firstspawn"))
  588.     {
  589.         TogglePlayerSpectating(playerid, 1);
  590.         ShowPlayerDialog2(playerid, DIALOG_RULES, DIALOG_STYLE_MSGBOX, "Server Rules", "Welcome To "GM_NAME".\n\nYou must have to follow rules of the server.", "Accept", "Cancel");
  591.         return 1;
  592.     }
  593.     return 1;
  594. }
  595.  
  596. public OnObjectMoved(objectid)
  597. {
  598.     return 1;
  599. }
  600.  
  601. public OnPlayerObjectMoved(playerid, objectid)
  602. {
  603.     return 1;
  604. }
  605.  
  606. public OnPlayerPickUpPickup(playerid, pickupid)
  607. {
  608.     return 1;
  609. }
  610.  
  611. public OnVehicleMod(playerid, vehicleid, componentid)
  612. {
  613.     return 1;
  614. }
  615.  
  616. public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
  617. {
  618.     return 1;
  619. }
  620.  
  621. public OnVehicleRespray(playerid, vehicleid, color1, color2)
  622. {
  623.     return 1;
  624. }
  625.  
  626. public OnPlayerSelectedMenuRow(playerid, row)
  627. {
  628.     return 1;
  629. }
  630.  
  631. public OnPlayerExitedMenu(playerid)
  632. {
  633.     return 1;
  634. }
  635.  
  636. public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  637. {
  638.     return 1;
  639. }
  640.  
  641. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  642. {
  643.     return 1;
  644. }
  645.  
  646. public OnRconLoginAttempt(ip[], password[], success)
  647. {
  648.     return 1;
  649. }
  650.  
  651. public OnPlayerUpdate(playerid)
  652. {
  653.     return 1;
  654. }
  655.  
  656. public OnPlayerStreamIn(playerid, forplayerid)
  657. {
  658.     return 1;
  659. }
  660.  
  661. public OnPlayerStreamOut(playerid, forplayerid)
  662. {
  663.     return 1;
  664. }
  665.  
  666. public OnVehicleStreamIn(vehicleid, forplayerid)
  667. {
  668.     return 1;
  669. }
  670.  
  671. public OnVehicleStreamOut(vehicleid, forplayerid)
  672. {
  673.     return 1;
  674. }
  675.  
  676. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  677. {
  678.     pInfo[playerid][pDialog] = -1;
  679.     new tmp2[256], playername[MAX_PLAYER_NAME], tmp[256], temp1;
  680.     GetPlayerName(playerid, playername, MAX_PLAYER_NAME);
  681.     if (dialogid == DIALOG_REGISTER)
  682.     {
  683.         if (response)
  684.         {
  685.             if (dini_Isset(AddFile(dir_datafiles, FILE_TOTALSTAT), "regdis"))
  686.                 return SendClientMessageToClient(playerid, COLOR_RED, ""COL_LIME"Server: "COL_RED"Registration is currently disabled. Please try again later.");
  687.             temp1 = dini_Int(AddFile(dir_datafiles, FILE_TOTALSTAT), "users");
  688.             if (temp1 == 99999999)
  689.                 return SendClientMessageToClient(playerid, COLOR_RED, ""COL_LIME"Server: "COL_RED"Max account limit reached.");
  690.             if (strlen(inputtext) < 6 || strlen(inputtext) > 18) {
  691.                 ShowPlayerDialog2(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register an account", "You must register an account to play in this server.\n\nType a password below to register an account.\n\n{E60026}Password length must be between 6-18 chars.", "Continue", "Cancel");
  692.                 SendClientMessageToClient(playerid, COLOR_RED, ""COL_LIME"Server: "COL_RED"Your password must be between 6-18 characters.");
  693.                 return 1;
  694.             }
  695.             SetPVarInt(playerid, "confirmpass", num_hash(inputtext));
  696.             ShowPlayerDialog2(playerid, DIALOG_REG_CONFIRM, DIALOG_STYLE_PASSWORD, "Register an account", "Please confirm your password.", "Register", "Cancel");
  697.         }
  698.         else {
  699.             SendClientMessageToClient(playerid, COLOR_WHITE, "You must register to play! Type /register to continue.");
  700.         }
  701.         return 1;
  702.     }
  703.  
  704.     if (dialogid == DIALOG_REG_CONFIRM)
  705.     {
  706.         if (response)
  707.         {
  708.             if (dini_Isset(AddFile(dir_datafiles, FILE_TOTALSTAT), "regdis"))
  709.                 return SendClientMessageToClient(playerid, COLOR_RED, ""COL_LIME"Server: "COL_RED""COL_LIME"Server: "COL_GREEN"Registration is currently disabled. Please try again later.");
  710.             if (GetPVarInt(playerid, "confirmpass") != num_hash(inputtext)) {
  711.                 ShowPlayerDialog2(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register an account", "You must register an account to play in this server.\n\nType a password below to register an account.\n\n{E60026}The passwords you entered didn't match.", "Continue", "Cancel");
  712.                 SendClientMessage(playerid, COLOR_RED, ""COL_LIME"Server: "COL_RED"The passwords you entered didn't match.");
  713.                 return 1;
  714.             }
  715.             temp1 = dini_Int(AddFile(dir_datafiles, FILE_TOTALSTAT), "users");
  716.             dini_IntSet(AddFile(dir_datafiles, FILE_TOTALSTAT), "users", temp1+1);
  717.             dini_Create(AddFile(dir_userfiles, playername));
  718.             dini_IntSet(AddFile(dir_userfiles, playername), "password", num_hash(inputtext));
  719.             SaveAccount(playerid, inputtext);
  720.             dini_IntSet(AddFile(dir_userfiles, playername), "account", temp1+1);
  721.             SetPVarInt(playerid, "IsNew", 1);
  722.             SetPlayerMoney(playerid, 10000);
  723.             dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "pMoney", 10000);
  724.             dini_IntSet(AddFile(dir_userfiles, RPN(playerid)), "firstspawn", 1);
  725.             dini_Set(AddFile(dir_userfiles, playername), "ChatColor", "FFFFFF");
  726.             pInfo[playerid][pLogged] = 1;
  727.             TogglePlayerSpectating(playerid, 0);
  728.             SendPlayerFormattedText(playerid, COLOR_YELLOW, ""COL_LIME"Server: "COL_YELLOW"Account '%s' created, you have been logged in automatically!", playername, "");
  729.             SendAllFormattedText(COLOR_GREEN, ""COL_LIME"Server: "COL_GREEN"%s has registered a new account. Welcome to our server!", playername, "");
  730.             printf("[Register] %s (Id%d) has registered a new account.", playername, playerid);
  731.         }
  732.         else {
  733.             SendClientMessageToClient(playerid, COLOR_WHITE, "You must register to play! Type /register to continue.");
  734.         }
  735.         return 1;
  736.     }
  737.     if (dialogid == DIALOG_LOGIN)
  738.     {
  739.         if (response)
  740.         {
  741.             if (num_hash(inputtext) != dini_Int(AddFile(dir_userfiles, playername), "password")) {
  742.                 temp1 = GetPVarInt(playerid, "loginattempts")+1;
  743.                 if (temp1 == 3) {
  744.                     SendClientMessageToClient(playerid, COLOR_RED, ""COL_LIME"Server: "COL_RED"Bad password threshold reached. You have been kicked!");
  745.                     SetTimerEx("KickBanTimer", 50, 0, "dd", playerid, 1);
  746.                 }
  747.                 else {
  748.                     SetPVarInt(playerid, "loginattempts", temp1);
  749.                     format(tmp, 32, "Login to your account (%d/3)", temp1);
  750.                     format(tmp2, 280, "Type your password below to login to your account.\n\n{FFFF00}Account:{FFFFFF} %s\n\n{E60026}Password incorrect. Attempts remaining - %d.",RPN(playerid), 3 - temp1);
  751.                     ShowPlayerDialog2(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, tmp, tmp2, "Login", "Cancel");
  752.                     format(tmp2, 280, ""COL_LIME"Server: "COL_RED"Password incorrect. Attempts remaining - %d.", 3 - temp1);
  753.                     SendClientMessageToClient(playerid, COLOR_RED, tmp2);
  754.                 }
  755.                 return 1;
  756.             }
  757.             pInfo[playerid][pLogged] = 1;
  758.             TogglePlayerSpectating(playerid, 0);
  759.             LoadPlayer(playerid);
  760.             SendClientMessageToClient(playerid, COLOR_WHITE, "Login successful, your status has been restored!");
  761.             dini_Set(AddFile(dir_userfiles, playername), "ChatColor", "FFFFFF");
  762.             printf("[Logged] %s (Id%d) has logged in.", playername, playerid);
  763.             PlayerConnect(playerid);
  764.         }
  765.         else {
  766.             SendClientMessageToClient(playerid, COLOR_WHITE, "You must login to play! Type /login to continue.");
  767.         }
  768.         return 1;
  769.     }
  770.     if(dialogid == DIALOG_RULES)
  771.     {
  772.      if(!response) Kick(playerid);
  773.      {
  774.       SendClientMessage(playerid, COLOR_LBLUE, "Thanks for joining the server.");
  775.       TogglePlayerSpectating(playerid, 0);
  776.      }
  777.     }
  778.     return 1;
  779. }
  780.  
  781. public OnPlayerClickPlayer(playerid, clickedplayerid, source)
  782. {
  783.     return 1;
  784. }
  785.  
  786. /* Commands */
  787. CMD:cmds(playerid, params[])
  788. {
  789.  SendClientMessage(playerid, COLOR_YELLOW, "Server Commands");
  790.  SendClientMessage(playerid, COLOR_WHITE, "/register, /login, /stats");
  791.  return 1;
  792. }
  793. CMD:stats(playerid, params[])
  794. {
  795.  new string[200];
  796.  SendClientMessage(playerid, COLOR_LBLUE, "*Your Stats!");
  797.  format(string, sizeof(string), "*Admin Level: %d", pInfo[playerid][pAdmin]);
  798.  SendClientMessage(playerid, COLOR_YELLOW, string);
  799.  format(string, sizeof(string), "*Scores: %d", pInfo[playerid][pScore]);
  800.  SendClientMessage(playerid, COLOR_YELLOW, string);
  801.  format(string, sizeof(string), "*Kills: %d", pInfo[playerid][pKills]);
  802.  SendClientMessage(playerid, COLOR_YELLOW, string);
  803.  format(string, sizeof(string), "*Deaths: %d", pInfo[playerid][pDeaths]);
  804.  SendClientMessage(playerid, COLOR_YELLOW, string);
  805.  format(string, sizeof(string), "*Kills/Deaths Ratio: %.2f", floatdiv(pInfo[playerid][pKills], pInfo[playerid][pDeaths]));
  806.  SendClientMessage(playerid, COLOR_YELLOW, string);
  807.  return 1;
  808. }
  809. /* Admin Script */
  810. CMD:acmds(playerid, params[])
  811. {
  812.  if(!pInfo[playerid][pAdmin]) return 0;
  813.  if(pInfo[playerid][pAdmin] == 1)
  814.  {
  815.   SendClientMessage(playerid, COLOR_YELLOW, "Admin Commands");
  816.   SendClientMessage(playerid, COLOR_WHITE, "/Soon");
  817.  }
  818.  if(pInfo[playerid][pAdmin] == 2)
  819.  {
  820.   SendClientMessage(playerid, COLOR_YELLOW, "Admin Commands");
  821.   SendClientMessage(playerid, COLOR_WHITE, "/Soon");
  822.  }
  823.  if(pInfo[playerid][pAdmin] == 3)
  824.  {
  825.   SendClientMessage(playerid, COLOR_YELLOW, "Admin Commands");
  826.   SendClientMessage(playerid, COLOR_WHITE, "/Soon");
  827.  }
  828.  if(pInfo[playerid][pAdmin] == 4)
  829.  {
  830.   SendClientMessage(playerid, COLOR_YELLOW, "Admin Commands");
  831.   SendClientMessage(playerid, COLOR_WHITE, "/Soon");
  832.  }
  833.  if(pInfo[playerid][pAdmin] == 5)
  834.  {
  835.   SendClientMessage(playerid, COLOR_YELLOW, "Admin Commands");
  836.   SendClientMessage(playerid, COLOR_WHITE, "/Soon");
  837.  }
  838.  if(pInfo[playerid][pAdmin] == 6)
  839.  {
  840.   SendClientMessage(playerid, COLOR_YELLOW, "Admin Commands");
  841.   SendClientMessage(playerid, COLOR_WHITE, "/setadmin, /setscore, /setkills, /setdeaths, /giveallscore, /givealldeaths, /giveallkills");
  842.  }
  843.  if(pInfo[playerid][pAdmin] == 7)
  844.  {
  845.   SendClientMessage(playerid, COLOR_YELLOW, "Admin Commands");
  846.   SendClientMessage(playerid, COLOR_WHITE, "/setadmin, /setscore, /setkills, /setdeaths, /giveallscore, /givealldeaths, /giveallkills");
  847.  }
  848.  return 1;
  849. }
  850. CMD:setadmin(playerid, params[])
  851. {
  852.  new id, level, string[200];
  853.  if(pInfo[playerid][pAdmin] < 6 && !IsPlayerAdmin(playerid)) return 0;
  854.  if(sscanf(params, "ud", id, level)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /setadmin [playerid] [level]");
  855.  if(!IsPlayerConnected2(id)) return SendClientMessage(playerid, COLOR_RED, "Server: That player is not connected.");
  856.  if(level < 0 || level > 7) return SendClientMessage(playerid, COLOR_RED, "Server: please enter valid admin level [Level 1 - 7].");
  857.  if (level == pInfo[id][pAdmin])
  858.  {
  859.     format(string, 64, "%s is already admin level %d.", RPN(id), level);
  860.     SendClientMessageToClient(playerid, COLOR_WHITE, string);
  861.     return 1;
  862.  }
  863.  if (level != 0)
  864.  {
  865.     dini_IntSet(AddFile(dir_userfiles, RPN(id)), "pAdmin", level);
  866.     dini_IntSet(AddFile(dir_datafiles, FILE_ADMINS), RPN(id), level);
  867.  }
  868.  else
  869.  {
  870.     dini_Unset(AddFile(dir_userfiles, RPN(id)), "pAdmin");
  871.     dini_Unset(AddFile(dir_datafiles, FILE_ADMINS), RPN(id));
  872.  }
  873.  pInfo[id][pAdmin] =level;
  874.  format(string, sizeof(string), "Server: You have been set as admin level %d.", level);
  875.  SendClientMessage(id, COLOR_YELLOW, string);
  876.  format(string, sizeof(string), "Server: You have set %s as admin level %d.", RPN(id), level);
  877.  SendClientMessage(playerid, COLOR_YELLOW, string);
  878.  return 1;
  879. }
  880. CMD:setscore(playerid, params[])
  881. {
  882.  new id, score, string[200];
  883.  if(pInfo[playerid][pAdmin] < 6 && !IsPlayerAdmin(playerid)) return 0;
  884.  if(sscanf(params, "ud", id, score)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /setscore [playerid] [score]");
  885.  if(!IsPlayerConnected2(id)) return SendClientMessage(playerid, COLOR_RED, "Server: That player is not connected.");
  886.  if(score < 0 || score > cellmax) return SendClientMessage(playerid, COLOR_RED, "Server: please enter valid scores.");
  887.  if (score == pInfo[id][pScore])
  888.  {
  889.     format(string, 64, "%s is already have score %d.", RPN(id), score);
  890.     SendClientMessageToClient(playerid, COLOR_WHITE, string);
  891.     return 1;
  892.  }
  893.  dini_IntSet(AddFile(dir_userfiles, RPN(id)), "pScore", score);
  894.  pInfo[id][pScore] = score;
  895.  SetPlayerScore(playerid, score);
  896.  format(string, sizeof(string), "Server: Your score has been set to %d.", score);
  897.  SendClientMessage(id, COLOR_YELLOW, string);
  898.  format(string, sizeof(string), "Server: You have set %s's score to %d.", RPN(id), score);
  899.  SendClientMessage(playerid, COLOR_YELLOW, string);
  900.  return 1;
  901. }
  902. CMD:setkills(playerid, params[])
  903. {
  904.  new id, kills, string[200];
  905.  if(pInfo[playerid][pAdmin] < 6 && !IsPlayerAdmin(playerid)) return 0;
  906.  if(sscanf(params, "ud", id, kills)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /setkills [playerid] [kills]");
  907.  if(!IsPlayerConnected2(id)) return SendClientMessage(playerid, COLOR_RED, "Server: That player is not connected.");
  908.  if(kills < 0 || kills > cellmax) return SendClientMessage(playerid, COLOR_RED, "Server: please enter valid kills.");
  909.  if (kills == pInfo[id][pKills])
  910.  {
  911.     format(string, 64, "%s is already have kills %d.", RPN(id), kills);
  912.     SendClientMessageToClient(playerid, COLOR_WHITE, string);
  913.     return 1;
  914.  }
  915.  SetPlayerKills(id, kills);
  916.  format(string, sizeof(string), "Server: Your kills has been set to %d.", kills);
  917.  SendClientMessage(id, COLOR_YELLOW, string);
  918.  format(string, sizeof(string), "Server: You have set %s's kills to %d.", RPN(id), kills);
  919.  SendClientMessage(playerid, COLOR_YELLOW, string);
  920.  return 1;
  921. }
  922. CMD:setdeaths(playerid, params[])
  923. {
  924.  new id, deaths, string[200];
  925.  if(pInfo[playerid][pAdmin] < 6 && !IsPlayerAdmin(playerid)) return 0;
  926.  if(sscanf(params, "ud", id, deaths)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /setdeaths [playerid] [deaths]");
  927.  if(!IsPlayerConnected2(id)) return SendClientMessage(playerid, COLOR_RED, "Server: That player is not connected.");
  928.  if(deaths < 0 || deaths > cellmax) return SendClientMessage(playerid, COLOR_RED, "Server: please enter valid deaths.");
  929.  if (deaths == pInfo[id][pDeaths])
  930.  {
  931.     format(string, 64, "%s is already have deaths %d.", RPN(id), deaths);
  932.     SendClientMessageToClient(playerid, COLOR_WHITE, string);
  933.     return 1;
  934.  }
  935.  SetPlayerDeaths(playerid, deaths);
  936.  format(string, sizeof(string), "Server: Your deaths has been set to %d.", deaths);
  937.  SendClientMessage(id, COLOR_YELLOW, string);
  938.  format(string, sizeof(string), "Server: You have set %s's deaths to %d.", RPN(id), deaths);
  939.  SendClientMessage(playerid, COLOR_YELLOW, string);
  940.  return 1;
  941. }
  942. CMD:giveallscore(playerid, params[])
  943. {
  944.  new amount, string[270];
  945.  if(!IsPlayerAdmin(playerid) && pInfo[playerid][pAdmin] < 6) return 0;
  946.  if(sscanf(params, "d", amount)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /giveallscore [score]");
  947.  if(amount < 0 || amount > cellmax) return SendClientMessage(playerid, COLOR_RED, "Server: invalid amount please enter valid amount.");
  948.  for(new i=0;i<MAX_PLAYERS;i++)
  949.  {
  950.   GivePlayerScore(i, amount);
  951.  }
  952.  format(string, sizeof(string), "%s gave you %d score.", RPN(playerid), amount);
  953.  SendClientMessageToAll(COLOR_YELLOW, string);
  954.  return 1;
  955. }
  956.  
  957. CMD:giveallkills(playerid, params[])
  958. {
  959.  new amount, string[270];
  960.  if(!IsPlayerAdmin(playerid) && pInfo[playerid][pAdmin] < 6) return 0;
  961.  if(sscanf(params, "d", amount)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /giveallkills [kills]");
  962.  if(amount < 0 || amount > cellmax) return SendClientMessage(playerid, COLOR_RED, "Server: invalid amount please enter valid amount.");
  963.  for(new i=0;i<MAX_PLAYERS;i++)
  964.  {
  965.   GivePlayerKills(i, amount);
  966.  }
  967.  format(string, sizeof(string), "%s gave you %d kills.", RPN(playerid), amount);
  968.  SendClientMessageToAll(COLOR_YELLOW, string);
  969.  return 1;
  970. }
  971.  
  972. CMD:givealldeaths(playerid, params[])
  973. {
  974.  new amount, string[270];
  975.  if(!IsPlayerAdmin(playerid) && pInfo[playerid][pAdmin] < 6) return 0;
  976.  if(sscanf(params, "d", amount)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /givealldeaths [deaths]");
  977.  if(amount < 0 || amount > cellmax) return SendClientMessage(playerid, COLOR_RED, "Server: invalid amount please enter valid amount.");
  978.  for(new i=0;i<MAX_PLAYERS;i++)
  979.  {
  980.   GivePlayerDeaths(i, amount);
  981.  }
  982.  format(string, sizeof(string), "%s gave you %d kills.", RPN(playerid), amount);
  983.  SendClientMessageToAll(COLOR_YELLOW, string);
  984.  return 1;
  985. }
  986. /* Timers */
  987. forward SaveAllPlayers();
  988. public SaveAllPlayers()
  989. {
  990.  SaveAllPlayer();
  991. }
Add Comment
Please, Sign In to add comment