Advertisement
Pedro_Miranda

[PAWN] - Los Santos RPG (Game Mode)

May 8th, 2012
869
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 47.90 KB | None | 0 0
  1. /*
  2.     Concluido:
  3.    
  4. - Registro/Login
  5. - Cameras
  6. - Sistema de ban
  7. - TextDraws
  8. - Gasolina
  9. - Mensagens Randomicas
  10. - Controle de veículo
  11.  
  12.     Fazer:
  13.    
  14. - Clima dinâmico
  15. - Sistema de propriedades
  16. - Sistema de organizações
  17. - Sistema de roubo
  18. - Sistema de administração
  19. - Sistema VIP
  20.  
  21. */
  22.  
  23. #include <a_samp>
  24. #include <a_mysql>
  25. #include <a_zones>
  26. //#include <sscanf2>
  27. #include <foreach>
  28. #include <zcmd>
  29. //#include <streamer>
  30.  
  31. #if defined MAX_PLAYERS
  32.     #undef MAX_PLAYERS
  33. #endif
  34.  
  35. native WP_Hash(buffer[], len, const string[]);
  36.  
  37. new const
  38.     SERVER_NAME[] = "Los Santos RPG",
  39.     SERVER_VERSION[] = "0.1 (Rev. 3)",
  40.     //Dados da conexão ao banco de dados
  41.     DB_HOST[] = "127.0.0.1",
  42.     DB_USER[] = "root",
  43.     DB_NAME[] = "ls_rpg",
  44.     DB_PASS[] = "";
  45.    
  46. enum
  47. {
  48.     //Players
  49.     MAX_PLAYERS = 101,
  50.     //Properties
  51.     MAX_PROPERTIES = 1000,
  52.     PROPERTY_TYPE_HOUSE = 1,
  53.     PROPERTY_TYPE_BUSINESS = 2,
  54.     //Factions
  55.     MAX_FACTIONS = 11,
  56.     FACTION_TYPE_COP = 1,
  57.     FACTION_TYPE_GANG = 2,
  58.     FACTION_TYPE_MAFIA = 3,
  59.     FACTION_TYPE_TERRORIST = 4
  60. }
  61.    
  62. //Sistema de registro
  63. enum E_PLAYER_INFO
  64. {
  65.     bool: gPlayerLogged,
  66.     bool: gPlayerRegistered,
  67.     gPlayerLoginTries,
  68.     //Identificação
  69.     gPlayerID,
  70.     gPlayerName[24],
  71.     gPlayerIP[16],
  72.     //Registro
  73.     gPlayerPassword[129],
  74.     gPlayerPasswordTip[64],
  75.     gPlayerSecretAsk[64],
  76.     gPlayerSecretAnswer[64],
  77.     //Informações pessoais
  78.     gPlayerGender,
  79.     gPlayerBirth[3],
  80.     gPlayerAge,
  81.     gPlayerMoney,
  82.     gPlayerSkin,
  83.     //Sistema de administração
  84.     gPlayerAdminLevel,
  85.     gPlayerAdminRepPoints,
  86.     gPlayerAdminDuty,
  87.     //Sistema vip
  88.     gPlayerVipLevel,
  89.     //Sistema de drogas
  90.     gPlayerMarijuana,
  91.     gPlayerCocaine,
  92.     gPlayerCrack,
  93.     gPlayerMats,
  94.     //Sistema de Level
  95.     Float: gPlayerExp,
  96.     gPlayerLevel,
  97.     //Salvar posição após crash
  98.     gPlayerLeaveReason,
  99.     gPlayerInterior,
  100.     gPlayerWorld,
  101.     Float: gPlayerPos[4],
  102.     Float: gPlayerHealth,
  103.     Float: gPlayerArmour,
  104.     //TextDraws
  105.     Text: gPlayerStatsTD,
  106.     Text: gPlayerNetStatsTD,
  107.     Text: gPlayerSpeedoTD,
  108.     //Timers
  109.     gPlayerUpTimer
  110. }
  111. new gPlayerInfo[MAX_PLAYERS][E_PLAYER_INFO];
  112.  
  113. //Sistema de cameras
  114. enum E_CAM_INFO
  115. {
  116.     Float: cam_Pos[3],
  117.     Float: cam_LookAt[3]
  118. }
  119.    
  120. //Variáveis globais
  121. new Float: gDefaultSpawn[4] = { 1568.2737, -1892.3541, 13.5595, 0.8003 };
  122.  
  123. new cam_Info[][E_CAM_INFO] = { //Créditos aos criadores do MyRPG pelas coordenadas
  124.     {{719.8196, -1984.5413, 0.8574   }, {719.7933,  -1983.5378, 0.7499  }},
  125.     {{842.0169, -1772.2430, 365.1170 }, {841.0131,  -1772.2399, 362.0245}},
  126.     {{1085.8168, -1507.1821, 32.6435 }, {1086.4247, -1506.3833, 32.2360 }},
  127.     {{1138.8068, -1400.2664, 22.4200 }, {1139.8031, -1400.1439, 22.3171 }},
  128.     {{1532.3412, -1361.0857, 341.1450}, {1532.7753, -1361.9911, 339.6769}},
  129.     {{1518.8756, -1628.3341, 18.7397 }, {1519.3651, -1629.2109, 18.6616 }},
  130.     {{1834.7419, -1303.5442, 120.2275}, {1835.5393, -1304.1547, 119.9244}},
  131.     {{1935.7708, -1395.2288, 342.9268}, {1935.7756, -1394.2245, 341.1788}},
  132.     {{2200.1458, -1106.1829, 107.0125}, {2200.9858, -1105.6324, 106.6644}},
  133.     {{2571.9436, -1278.1204, 131.3794}, {2572.5393, -1278.9288, 130.8064}}
  134.  
  135. };
  136.  
  137. new gSecretAsks[][] =
  138. {
  139.     "Qual o nome da sua primeira professora?\n",
  140.     "Qual o nome do seu time do coração?\n",
  141.     "Qual o nome da rua aonde você mora?\n",
  142.     "Qual o nome do seu primeiro animal de estimação?\n",
  143.     "Qual o seu super herói favorito?"
  144. };
  145.  
  146. new random_Messages[][] = {
  147.     "LS-RPG:{FFFFFF} Gostou do servidor? Seja vip e faça parte do nosso crescimento!",
  148.     "LS-RPG:{FFFFFF} Mantenha-se informado visitando o fórum, ls-rpg.com",
  149.     "LS-RPG:{FFFFFF} Precisa de ajuda? Consulte um administrador. {1E90FF}/relato",
  150.     "LS-RPG:{FFFFFF} Novo no servidor? Use {1E90FF}/ajuda{FFFFFF} e receba um amplo suporte!",
  151.     "LS-RPG:{FFFFFF} Obrigado por jogar aqui, sua presença faz o nosso crescimento!",
  152.     "LS-RPG:{FFFFFF} A equipe {1E90FF}Los Santos RPG{FFFFFF} agradece a sua preferência.",
  153.     "LS-RPG:{FFFFFF} Ajude na divulgação do servidor e vamos crescer juntos!",
  154.     "LS-RPG:{FFFFFF} Promoção de inauguração: Chame {1E90FF}10{FFFFFF} amigos e receba Vip Ouro!",
  155.     "LS-RPG:{FFFFFF} Para ver os créditos do game mode em geral use {1E90FF}/creditos",
  156.     "LS-RPG:{FFFFFF} Nunca peça para ser administrador, isso não se pede, se conquista!"
  157. };
  158.  
  159. new VehiclesName[][] =
  160. {
  161.     "Landstalker","Bravura","Buffalo","Linerunner","Pereniel","Sentinel","Dumper","Firetruck","Trashmaster",
  162.     "Limosine","Manana","Infernus","Voodoo","Pony","Mule","Cheetah","Ambulancia","Leviathan","Moonbeam","Esperanto",
  163.     "Taxi","Washington","Bobcat","Mr Whoopee","BF Injection","Hunter","Premier","Enforcer","Securicar","Banshee",
  164.     "Predator","Bus","Rhino","Barracks","Hotknife","Trailer","Previon","Coach","Cabbie","Stallion","Rumpo",
  165.     "RC Bandit","Romero","Packer","Monster","Admiral","Squalo","Seasparrow","Pizzaboy","Tram","Trailer",
  166.     "Turismo","Speeder","Reefer","Tropic","Flatbed","Yankee","Caddy","Solair","Berkley's RC Van","Skimmer",
  167.     "PCJ-600","Faggio","Freeway","RC Baron","RC Raider","Glendale","Oceanic","Sanchez","Sparrow","Patriot",
  168.     "Quad","Coastguard","Dinghy","Hermes","Sabre","Rustler","ZR-350","Walton","Regina","Comet","BMX",
  169.     "Burrito","Camper","Marquis","Baggage","Dozer","Maverick","News Chopper","Rancher","FBI Rancher","Virgo",
  170.     "Greenwood","Jetmax","Hotring","Sandking","Blista Compact","Maverick Policial","Boxville","Benson","Mesa",
  171.     "RC Goblin","Hotring Racer A","Hotring Racer B","Bloodring Banger","Rancher","Super GT","Elegant",
  172.     "Journey","Bike","Mountain Bike","Beagle","Cropdust","Stunt","Tanker","RoadTrain","Nebula","Majestic",
  173.     "Buccaneer","Shamal","Hydra","FCR-900","NRG-500","HPV1000","Cement Truck","Tow Truck","Fortune","Cadrona",
  174.     "FBI Truck","Willard","Forklift","Tractor","Combine","Feltzer","Remington","Slamvan","Blade","Freight",
  175.     "Streak","Vortex","Vincent","Bullet","Clover","Sadler","Firetruck","Hustler","Intruder","Primo","Cargobob",
  176.     "Tampa","Sunrise","Merit","Utility","Nevada","Yosemite","Windsor","Monster A","Monster B","Uranus",
  177.     "Jester","Sultan","Stratum","Elegy","Raindance","RC Tiger","Flash","Tahoma","Savanna","Bandito","Freight",
  178.     "Trailer","Kart","Mower","Duneride","Sweeper","Broadway","Tornado","AT-400","DFT-30","Huntley","Stafford",
  179.     "BF-400","Newsvan","Tug","Trailer A","Emperor","Wayfarer","Euros","Hotdog","Club","Trailer B","Trailer C",
  180.     "Andromada","Dodo","RC Cam","Launch","Viatura (LSPD)","Viatura (SFPD)","Viatura (LVPD)","Police Ranger",
  181.     "Picador","S.W.A.T. Van","Alpha","Phoenix","Glendale","Sadler","Luggage Trailer A","Luggage Trailer B",
  182.     "Stair Trailer","Boxville","Farm Plow","Utility Trailer"
  183. };
  184.  
  185. //Sistema de gasolina by Drakins
  186. new gVehicleGas[MAX_VEHICLES];
  187. new Float:gVehicleSpeed[3];
  188. new gConsumedGas[MAX_PLAYERS];
  189.  
  190. new Text: g_tdMain;
  191.  
  192. new db;
  193. new gstring[1024];
  194.  
  195. //Main
  196. main()
  197.     print("\n| (main) LS-RPG Script by Pedro Miranda, inicializado!\n");
  198.  
  199. //Callbacks
  200. public OnGameModeInit()
  201. {
  202.     new tick = tickcount();
  203.    
  204.     db = mysql_connect(DB_HOST, DB_USER, DB_NAME, DB_PASS);
  205.     if(mysql_ping(db) < 1)
  206.         return printf("\n| Falha na conexão com o banco de dados %s, o script não pôde ser inicializado.", DB_NAME), SendRconCommand("exit");
  207.    
  208.     SendRconCommand("mapname Los Santos");
  209.     SetGameModeText("LS-RPG v0.1 (Rev. 3)");
  210.     SendRconCommand("hostname [BR-PT] Los Santos RPG v0.1 (Rev. 3)");
  211.    
  212.     ShowNameTags(1);
  213.     UsePlayerPedAnims();
  214.     AllowInteriorWeapons(1);
  215.     EnableStuntBonusForAll(0);
  216.     DisableInteriorEnterExits();
  217.     ManualVehicleEngineAndLights();
  218.    
  219.     g_tdMain = TextDrawCreate(3, 429, "Los Santos RPG                ls-rpg.com                 00/00/0000 - 00:00:00");
  220.     TextDrawSetOutline(g_tdMain, 1);
  221.     TextDrawFont(g_tdMain, 2);
  222.     TextDrawLetterSize(g_tdMain, 0.389999, 1.7);
  223.     TextDrawUseBox(g_tdMain, 1);
  224.     TextDrawBoxColor(g_tdMain, 80);
  225.     TextDrawTextSize(g_tdMain, 650, 0);
  226.    
  227.     SetTimer("RandomMessages", 90000, 1);
  228.     SetTimer("Player_Updates", 1000, 1);
  229.     SetTimer("UpdateTime", 1000, 1);
  230.    
  231.     printf("\n| Script: %s by Pedro Miranda", SERVER_NAME);
  232.     printf("| Versão: %s", SERVER_VERSION);
  233.     print ("| Status: Dados importados, aguardando main()...");
  234.    
  235.     printf("\n[DEBUG] OnGameModeInit() - Tempo: %i ms.", (tickcount() - tick));
  236.     return 1;
  237. }
  238.  
  239. public OnGameModeExit()
  240. {
  241.     new tick = tickcount();
  242.    
  243.     mysql_close(db);
  244.    
  245.     printf("[DEBUG] OnGameModeExit() - Tempo: %i ms.", (tickcount() - tick));
  246.     return 1;
  247. }
  248.  
  249. public OnPlayerConnect(playerid)
  250. {
  251.     new tick = tickcount();
  252.  
  253.     GameTextForPlayer(playerid, "~w~Los Santos ~b~RPG", 5000, 1);
  254.    
  255.     gPlayerInfo[playerid][gPlayerLogged] = false;
  256.     gPlayerInfo[playerid][gPlayerLoginTries] = 0;
  257.    
  258.     GetPlayerName(playerid, gPlayerInfo[playerid][gPlayerName], 24);
  259.     GetPlayerIp(playerid, gPlayerInfo[playerid][gPlayerIP], 16);
  260.    
  261.     //Checando ban
  262.     mysql_format(db, gstring,
  263.         "SELECT * FROM `ban_info` WHERE `ban_name` = '%s' OR `ban_ip` = '%s'",
  264.         gPlayerInfo[playerid][gPlayerName],
  265.         gPlayerInfo[playerid][gPlayerIP]
  266.     );
  267.     mysql_function_query(db, gstring, true, "r@Player_BanCheck", "i", playerid);
  268.    
  269.     printf("[DEBUG] OnPlayerConnect(%i) - Tempo: %i ms.", playerid, (tickcount() - tick));
  270.     return 1;
  271. }
  272.  
  273. public OnPlayerDisconnect(playerid, reason)
  274. {
  275.     if(gPlayerInfo[playerid][gPlayerLogged])
  276.     {
  277.         new tick = tickcount();
  278.         TextDrawHideForPlayer(playerid, gPlayerInfo[playerid][gPlayerStatsTD]);
  279.         TextDrawHideForPlayer(playerid, gPlayerInfo[playerid][gPlayerNetStatsTD]);
  280.         TextDrawHideForPlayer(playerid, g_tdMain);
  281.        
  282.         KillTimer(gPlayerInfo[playerid][gPlayerUpTimer]);
  283.    
  284.         gPlayerInfo[playerid][gPlayerLeaveReason] = reason;
  285.         gPlayerInfo[playerid][gPlayerInterior] = GetPlayerInterior(playerid);
  286.         gPlayerInfo[playerid][gPlayerWorld] = GetPlayerVirtualWorld(playerid);
  287.         GetPlayerPos(playerid, gPlayerInfo[playerid][gPlayerPos][0], gPlayerInfo[playerid][gPlayerPos][1], gPlayerInfo[playerid][gPlayerPos][2]);
  288.         GetPlayerFacingAngle(playerid, gPlayerInfo[playerid][gPlayerPos][3]);
  289.         GetPlayerHealth(playerid, gPlayerInfo[playerid][gPlayerHealth]);
  290.         GetPlayerArmour(playerid, gPlayerInfo[playerid][gPlayerArmour]);
  291.    
  292.         Player_Save(playerid);
  293.    
  294.         printf("[DEBUG] OnPlayerDisconnect(%i, %i) - Tempo: %i ms.", playerid, reason, (tickcount() - tick));
  295.     }
  296.     return 1;
  297. }
  298.  
  299. public OnPlayerRequestClass(playerid, classid)
  300. {
  301.     new tick = tickcount();
  302.     new rand = random(sizeof cam_Info);
  303.    
  304.     SetPlayerVirtualWorld(playerid, 0);
  305.     SetPlayerInterior(playerid, 0);
  306.     SetPlayerCameraPos(playerid, cam_Info[rand][cam_Pos][0], cam_Info[rand][cam_Pos][1], cam_Info[rand][cam_Pos][2]);
  307.     SetPlayerCameraLookAt(playerid, cam_Info[rand][cam_LookAt][0], cam_Info[rand][cam_LookAt][1], cam_Info[rand][cam_LookAt][2]);
  308.  
  309.     printf("[DEBUG] OnPlayerRequestClass(%i, %i) - Tempo: %i ms.", playerid, classid, (tickcount() - tick));
  310.     return 1;
  311. }
  312.  
  313. public OnPlayerDeath(playerid, killerid, reason)
  314. {
  315.     if(gPlayerInfo[playerid][gPlayerLogged])
  316.     {
  317.         TextDrawHideForPlayer(playerid, g_tdMain);
  318.         TextDrawHideForPlayer(playerid, gPlayerInfo[playerid][gPlayerStatsTD]);
  319.         TextDrawHideForPlayer(playerid, gPlayerInfo[playerid][gPlayerNetStatsTD]);
  320.     }
  321.     return 1;
  322. }
  323.  
  324. public OnPlayerSpawn(playerid)
  325. {
  326.     new tick = tickcount();
  327.    
  328.     if(!gPlayerInfo[playerid][gPlayerLogged])
  329.     {
  330.         SendClientMessage(playerid, 0xFFFFFFFF, " ** Você foi kickado, motivo: {1E90FF}Spawn antes do login.");
  331.         Kick(playerid);
  332.     }
  333.     Player_Spawn(playerid);
  334.    
  335.     TextDrawShowForPlayer(playerid, gPlayerInfo[playerid][gPlayerStatsTD]);
  336.     TextDrawShowForPlayer(playerid, gPlayerInfo[playerid][gPlayerNetStatsTD]);
  337.     TextDrawShowForPlayer(playerid, g_tdMain);
  338.     printf("[DEBUG] OnPlayerSpawn(%i) - Tempo: %i ms.", playerid, (tickcount() - tick));
  339.     return 1;
  340. }
  341.  
  342. public OnPlayerText(playerid, text[])
  343. {
  344.     new tick = tickcount();
  345.    
  346.     format(gstring, sizeof gstring,
  347.         "%s: %s",
  348.         gPlayerInfo[playerid][gPlayerName], text
  349.     );
  350.     ProxDetector(20.0, playerid, 0xFFFFFFAA, gstring);
  351.     SetPlayerChatBubble(playerid, text, 0xFFFFFFAA, 15.0, 5000);
  352.    
  353.     printf("[DEBUG] OnPlayerText(%i, %s) - Tempo: %i ms.", playerid, text, (tickcount() - tick));
  354.     return 0;
  355. }
  356.  
  357. public OnPlayerStateChange(playerid, newstate, oldstate)
  358. {
  359.     new tick = tickcount();
  360.    
  361.     switch(newstate)
  362.     {
  363.         case PLAYER_STATE_DRIVER: TextDrawShowForPlayer(playerid, gPlayerInfo[playerid][gPlayerSpeedoTD]);
  364.         case PLAYER_STATE_ONFOOT:
  365.         {
  366.             if(oldstate == PLAYER_STATE_DRIVER)
  367.             {
  368.                 TextDrawHideForPlayer(playerid, gPlayerInfo[playerid][gPlayerSpeedoTD]);
  369.             }
  370.         }
  371.     }
  372.     printf("[DEBUG] OnPlayerStateChange(%i, %i, %i) - Tempo: %i ms.", playerid, newstate, oldstate, (tickcount() - tick));
  373.     return 1;
  374. }
  375.    
  376. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  377. {
  378.     new tick = tickcount();
  379.     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Key: {1E90FF}%i", newkeys);
  380.     new engine, lights, alarm, doors, bonnet, boot, objective;
  381.     switch(newkeys)
  382.     {
  383.         case 4: //Alt - Motor (Engine)
  384.         {
  385.             if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
  386.             {
  387.                 new vehicleid = GetPlayerVehicleID(playerid);
  388.                 if(gVehicleGas[vehicleid] > 0)
  389.                 {
  390.                     GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
  391.                     format(gstring, sizeof gstring,
  392.                         " ** %s %s a chave e %s o motor de seu veículo.",
  393.                         gPlayerInfo[playerid][gPlayerName],
  394.                         (engine) ? ("gira") : ("engata"),
  395.                         (engine) ? ("desliga") : ("liga")
  396.                     );
  397.                     ProxDetector(5.0, playerid, 0x828282AA, gstring);
  398.                     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Motor %s.", (engine) ? ("{E31919}desligado") : ("{32CD32}ligado"));
  399.                     SetVehicleParamsEx(vehicleid, (engine) ? (VEHICLE_PARAMS_OFF) : (VEHICLE_PARAMS_ON), lights, alarm, doors, bonnet, boot, objective);
  400.                 }
  401.             }
  402.         }
  403.         case 132: //CTRL Direito - Capô (Bonnet)
  404.         {
  405.             if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
  406.             {
  407.                 new vehicleid = GetPlayerVehicleID(playerid);
  408.                 GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
  409.                 format(gstring, sizeof gstring,
  410.                     " ** %s %s o capô de seu veículo.",
  411.                     gPlayerInfo[playerid][gPlayerName],
  412.                     (bonnet) ? ("fecha") : ("abre")
  413.                 );
  414.                 ProxDetector(5.0, playerid, 0x828282AA, gstring);
  415.                 SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Capô %s.", (bonnet) ? ("{E31919}fechado") : ("{32CD32}aberto"));
  416.                 SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, (bonnet) ? (VEHICLE_PARAMS_OFF) : (VEHICLE_PARAMS_ON), boot, objective);
  417.             }
  418.         }
  419.         case 1: //CTRL Esquerdo - Porta malas (Boot)
  420.         {
  421.             if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
  422.             {
  423.                 new vehicleid = GetPlayerVehicleID(playerid);
  424.                 GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
  425.                 format(gstring, sizeof gstring,
  426.                     " ** %s %s o porta-malas de seu veículo.",
  427.                     gPlayerInfo[playerid][gPlayerName],
  428.                     (boot) ? ("fecha") : ("abre")
  429.                 );
  430.                 ProxDetector(5.0, playerid, 0x828282AA, gstring);
  431.                 SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Porta-malas %s.", (boot) ? ("{E31919}fechado") : ("{32CD32}aberto"));
  432.                 SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, (boot) ? (VEHICLE_PARAMS_OFF) : (VEHICLE_PARAMS_ON), objective);
  433.             }
  434.         }
  435.         case 131072: //N - Farol (Lights)
  436.         {
  437.             if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
  438.             {
  439.                 new vehicleid = GetPlayerVehicleID(playerid);
  440.                 GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
  441.                 format(gstring, sizeof gstring,
  442.                     " ** %s %s o farol de seu veículo.",
  443.                     gPlayerInfo[playerid][gPlayerName],
  444.                     (lights) ? ("apaga") : ("acende")
  445.                 );
  446.                 ProxDetector(5.0, playerid, 0x828282AA, gstring);
  447.                 SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Farol %s.", (lights) ? ("{E31919}apagado") : ("{32CD32}aceso"));
  448.                 SetVehicleParamsEx(vehicleid, engine, (lights) ? (VEHICLE_PARAMS_OFF) : (VEHICLE_PARAMS_ON), alarm, doors, bonnet, boot, objective);
  449.             }
  450.         }
  451.     }
  452.     printf("[DEBUG] OnPlayerKeyStateChange(%i, %i, %i) - Tempo: %i ms.", playerid, newkeys, oldkeys, (tickcount() - tick));
  453.     return 1;
  454. }
  455.  
  456. enum
  457. {
  458.     //Registro
  459.     DIALOG_REGISTER,
  460.     DIALOG_PASSWORD_CONFIRMATION,
  461.     DIALOG_PASSWORD_TIP,
  462.     DIALOG_SECRET_ASK,
  463.     DIALOG_SECRET_ANSWER,
  464.     DIALOG_GENDER_SELECTION,
  465.     DIALOG_BIRTH,
  466.     DIALOG_LOGIN
  467. }
  468.  
  469. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  470. {
  471.     new tick = tickcount();
  472.    
  473.     new buffer[129];
  474.     new string[300];
  475.    
  476.     switch(dialogid)
  477.     {
  478.         //Registro
  479.         case DIALOG_REGISTER:
  480.         {
  481.             if(!response)
  482.             {
  483.                 SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Muito bem {1E90FF}%s{FFFFFF}, você pode registrar-se posteriormente pelo {1E90FF}/registro.");
  484.             }
  485.             else
  486.             {
  487.                 if(1 < (strlen(inputtext)) > 32)
  488.                 {
  489.                     //Senha inválida
  490.                     format(gstring, sizeof gstring,
  491.                         "{FFFFFF}Olá {1E90FF}%s{FFFFFF}\nÉ um prazer recebê-lo no {1E90FF}%s{FFFFFF}\nParece que você ainda não é registrado em nosso servidor\nDigite uma senha abaixo para iniciar seu registro.\n\n{E31919}ERRO: Sua senha deve conter entre 1 e 32 caracteres.",
  492.                         gPlayerInfo[playerid][gPlayerName],
  493.                         SERVER_NAME
  494.                     );
  495.                     ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{FFFFFF}Registrando...", gstring, "Prosseguir", "Cancelar");
  496.                 }
  497.                 else
  498.                 {
  499.                     WP_Hash(gPlayerInfo[playerid][gPlayerPassword], 129, inputtext);
  500.                     format(gstring, sizeof gstring,
  501.                         "{FFFFFF}Muito bem {1E90FF}%s{FFFFFF}\nAgora, digite sua senha abaixo novamente.\nPara termos certeza de que a senha foi digitada corretamente.",
  502.                         gPlayerInfo[playerid][gPlayerName]
  503.                     );
  504.                     ShowPlayerDialog(playerid, DIALOG_PASSWORD_CONFIRMATION, DIALOG_STYLE_PASSWORD, "{FFFFFF}Registrando...", gstring, "Prosseguir", "Voltar");
  505.                 }
  506.             }
  507.         }
  508.         case DIALOG_PASSWORD_CONFIRMATION:
  509.         {
  510.             if(!response)
  511.             {
  512.                 format(gstring, sizeof gstring,
  513.                     "{FFFFFF}Olá {1E90FF}%s{FFFFFF}\nÉ um prazer recebê-lo no {1E90FF}%s{FFFFFF}\nParece que você ainda não é registrado em nosso servidor\nDigite uma senha abaixo para iniciar seu registro.",
  514.                     gPlayerInfo[playerid][gPlayerName],
  515.                     SERVER_NAME
  516.                 );
  517.                 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{FFFFFF}Registrando...", gstring, "Prosseguir", "Cancelar");
  518.             }
  519.             else
  520.             {
  521.                 WP_Hash(buffer, 129, inputtext);
  522.                 if(strcmp(buffer, gPlayerInfo[playerid][gPlayerPassword], false, 129))
  523.                 {
  524.                     //Senha incorreta
  525.                     format(gstring, sizeof gstring,
  526.                         "{FFFFFF}Muito bem {1E90FF}%s{FFFFFFF}\nAgora, digite sua senha abaixo novamente.\nPara termos certeza de que a senha foi digitada corretamente.\n\n{E31919}ERRO: Senha e confirmação diferem, digite sua senha corretamente ou troque-a.",
  527.                         gPlayerInfo[playerid][gPlayerName]
  528.                     );
  529.                     ShowPlayerDialog(playerid, DIALOG_PASSWORD_CONFIRMATION, DIALOG_STYLE_PASSWORD, "{FFFFFF}Registrando...", gstring, "Prosseguir", "Voltar");
  530.                 }
  531.                 else
  532.                 {
  533.                     format(gstring, sizeof gstring,
  534.                         "{FFFFFF}Muito bem {1E90FF}%s{FFFFFF}\nAgora, digite abaixo uma dica de senha.\nEla poderá lhe servir caso você esqueça sua senha.",
  535.                         gPlayerInfo[playerid][gPlayerName]
  536.                     );
  537.                     ShowPlayerDialog(playerid, DIALOG_PASSWORD_TIP, DIALOG_STYLE_INPUT, "{FFFFFF}Registrando...", gstring, "Prosseguir", "Cancelar");
  538.                 }
  539.             }
  540.         }
  541.         case DIALOG_PASSWORD_TIP:
  542.         {
  543.             if(!response)
  544.             {
  545.                 SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Muito bem {1E90FF}%s{FFFFFF}, você pode registrar-se posteriormente pelo {1E90FF}/registro.");
  546.             }
  547.             else
  548.             {
  549.                 if(1 < (strlen(inputtext)) > 64)
  550.                 {
  551.                     format(gstring, sizeof gstring,
  552.                         "{FFFFFF}Muito bem {1E90FF}%s{FFFFFF}\nAgora, digite abaixo uma dica de senha.\nEla poderá lhe servir caso você esqueça sua senha.\n\n{E31919}ERRO: Sua dica de senha deve conter entre 1 e 64 caracteres.",
  553.                         gPlayerInfo[playerid][gPlayerName]
  554.                     );
  555.                     ShowPlayerDialog(playerid, DIALOG_PASSWORD_TIP, DIALOG_STYLE_INPUT, "{FFFFFF}Registrando...", gstring, "Prosseguir", "Cancelar");
  556.                 }
  557.                 else
  558.                 {
  559.                     format(gPlayerInfo[playerid][gPlayerPasswordTip], 129, inputtext, 0);
  560.                     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Muito bem {1E90FF}%s{FFFFFF}, Você agora precisa escolher uma das seguintes perguntas abaixo.", gPlayerInfo[playerid][gPlayerName]);
  561.                     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Em seguida, você fornecerá a resposta dessa pergunta a nós da equipe {1E90FF}%s.", SERVER_NAME);
  562.                     SendClientMessage         (playerid, 0xFFFFFFFF, " ** Em caso de perda de senha, você poderá responder futuramente esta pergunta para recuperá-la.");
  563.  
  564.                     for(new i = 0; i < sizeof gSecretAsks; ++i)
  565.                     {
  566.                         strcat(string, gSecretAsks[i]);
  567.                     }
  568.                     ShowPlayerDialog(playerid, DIALOG_SECRET_ASK, DIALOG_STYLE_LIST, "{FFFFFF}Registrando...", string, "Responder", "Cancelar");
  569.                 }
  570.             }
  571.         }
  572.         case DIALOG_SECRET_ASK:
  573.         {
  574.             if(!response)
  575.             {
  576.                 SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Muito bem {1E90FF}%s{FFFFFF}, você pode registrar-se posteriormente pelo {1E90FF}/registro.");
  577.             }
  578.             else
  579.             {
  580.                 format(gPlayerInfo[playerid][gPlayerSecretAsk], 64, gSecretAsks[listitem], 0);
  581.                 format(gstring, sizeof string,
  582.                     "{FFFFFF}Muito bem {1E90FF}%s{FFFFFF}\nAgora digite abaixo a resposta de sua pergunta secreta:\n{1E90FF}%s",
  583.                     gPlayerInfo[playerid][gPlayerName],
  584.                     gPlayerInfo[playerid][gPlayerSecretAsk]
  585.                 );
  586.                 ShowPlayerDialog(playerid, DIALOG_SECRET_ANSWER, DIALOG_STYLE_INPUT, "{FFFFFF}Registrando...", gstring, "Prosseguir", "Voltar");
  587.             }
  588.         }
  589.         case DIALOG_SECRET_ANSWER:
  590.         {
  591.             if(!response)
  592.             {
  593.                 for(new i = 0; i < sizeof gSecretAsks; ++i)
  594.                 {
  595.                     strcat(string, gSecretAsks[i]);
  596.                 }
  597.                 ShowPlayerDialog(playerid, DIALOG_SECRET_ASK, DIALOG_STYLE_LIST, "{FFFFFF}Registrando...", gstring, "Responder", "Cancelar");
  598.             }
  599.             else
  600.             {
  601.                 format(gPlayerInfo[playerid][gPlayerSecretAnswer], 64, inputtext, 0);
  602.                 ClearChat(playerid, 10);
  603.                 SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Certo {1E90FF}%s{FFFFFF}, chegamos a uma nova parte de seu registro.", gPlayerInfo[playerid][gPlayerName]);
  604.                 SendClientMessage         (playerid, 0xFFFFFFFF, " ** Agora lhe pediremos algumas informações pessoais, feito isso, seu registro estará concluído.");
  605.                 format(gstring, sizeof gstring,
  606.                     "{FFFFFF}Muito bem {1E90FF}%s{FFFFFF}\nVamos começar com a segunda e última etapa do seu registro: {1E90FF}Informações pessoais.\n{FFFFFF}Responda: Você é {32CD32}Homem{FFFFFF} ou {FF00FF}Mulher{FFFFFF}?",
  607.                     gPlayerInfo[playerid][gPlayerName]
  608.                 );
  609.                 ShowPlayerDialog(playerid, DIALOG_GENDER_SELECTION, DIALOG_STYLE_MSGBOX, "{FFFFFF}Registrando...", gstring, "Homem", "Mulher");
  610.             }
  611.         }
  612.         case DIALOG_GENDER_SELECTION:
  613.         {
  614.             gPlayerInfo[playerid][gPlayerGender] = (response) ? (1) : (2);
  615.             gPlayerInfo[playerid][gPlayerSkin] = (response) ? (23) : (12);
  616.             //Última etapa
  617.             format(gstring, sizeof gstring,
  618.                 "{FFFFFF}Muito bem {1E90FF}%s{FFFFFF}\nChegamos ao passo final de seu registro\nDigite abaixo sua data de nascimento.\nUtilize o formato {1E90FF}dd/mm/aaaa{FFFFFF} para evitar erros.",
  619.                 gPlayerInfo[playerid][gPlayerName]
  620.             );
  621.             ShowPlayerDialog(playerid, DIALOG_BIRTH, DIALOG_STYLE_INPUT, "{FFFFFF}Registrando...", gstring, "Registrar", "Cancelar");
  622.         }
  623.         case DIALOG_BIRTH:
  624.         {
  625.             if(!response)
  626.             {
  627.                 SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Muito bem {1E90FF}%s{FFFFFF}, você pode registrar-se posteriormente pelo {1E90FF}/registro.");
  628.             }
  629.             else
  630.             {
  631.                 //Créditos à equipe que criou o Godfather pelo código abaixo
  632.                 new year, month,day;
  633.                 getdate(year, month, day);
  634.                 new DateInfo[3][20];
  635.                 split(inputtext, DateInfo, '/');
  636.                 if(year - strval(DateInfo[2]) > 100 || strval(DateInfo[2]) < 1 || strval(DateInfo[2]) >= year)
  637.                 {
  638.                     format(gstring, sizeof gstring,
  639.                         "{FFFFFF}Muito bem {1E90FF}%s{FFFFFF}\nChegamos ao passo final de seu registro\nDigite abaixo sua data de nascimento.\nUtilize o formate {1E90FF}dd/mm/aaaa{FFFFFF} para evitar erros.\n\n{E31919}ERRO: Data em formato incorreto.",
  640.                         gPlayerInfo[playerid][gPlayerName]
  641.                     );
  642.                     ShowPlayerDialog(playerid, DIALOG_BIRTH, DIALOG_STYLE_INPUT, "{FFFFFF}Registrando...", gstring, "Registrar", "Cancelar");
  643.                 }
  644.                 else
  645.                 {
  646.                     new check = year - strval(DateInfo[2]);
  647.                     if(check == year)
  648.                     {
  649.                         format(gstring, sizeof gstring,
  650.                             "{FFFFFF}Muito bem {1E90FF}%s{FFFFFF}\nChegamos ao passo final de seu registro\nDigite abaixo sua data de nascimento.\nUtilize o formate {1E90FF}dd/mm/aaaa{FFFFFF} para evitar erros.\n\n{E31919}ERRO: Data em formato incorreto.",
  651.                             gPlayerInfo[playerid][gPlayerName]
  652.                         );
  653.                         ShowPlayerDialog(playerid, DIALOG_BIRTH, DIALOG_STYLE_INPUT, "{FFFFFF}Registrando...", gstring, "Registrar", "Cancelar");
  654.                     }
  655.                     else
  656.                     {
  657.                         if(strval(DateInfo[1]) > month)
  658.                         {
  659.                             check -= 1;
  660.                         }
  661.                         else if(strval(DateInfo[1]) == month && strval(DateInfo[0]) > day)
  662.                         {
  663.                             check -= 1;
  664.                         }
  665.                         //Fim do código
  666.                         gPlayerInfo[playerid][gPlayerBirth][0] = strval(DateInfo[0]);
  667.                         gPlayerInfo[playerid][gPlayerBirth][1] = strval(DateInfo[1]);
  668.                         gPlayerInfo[playerid][gPlayerBirth][2] = strval(DateInfo[2]);
  669.                         gPlayerInfo[playerid][gPlayerAge] = check;
  670.                         //Inserindo...
  671.                         mysql_format(db, gstring,
  672.                         "INSERT INTO `player_info` (`name`,`password`,`password_tip`,`secret_ask`,`secret_answer`,`gender`,`day`,`month`,`year`,`age`,`skin`) VALUES ('%s','%s','%s','%s','%s',%i,%i,%i,%i,%i,%i)",
  673.                             gPlayerInfo[playerid][gPlayerName],
  674.                             gPlayerInfo[playerid][gPlayerPassword],
  675.                             gPlayerInfo[playerid][gPlayerPasswordTip],
  676.                             gPlayerInfo[playerid][gPlayerSecretAsk],
  677.                             gPlayerInfo[playerid][gPlayerSecretAnswer],
  678.                             gPlayerInfo[playerid][gPlayerGender],
  679.                             gPlayerInfo[playerid][gPlayerBirth][0],
  680.                             gPlayerInfo[playerid][gPlayerBirth][1],
  681.                             gPlayerInfo[playerid][gPlayerBirth][2],
  682.                             gPlayerInfo[playerid][gPlayerAge],
  683.                             gPlayerInfo[playerid][gPlayerSkin]
  684.                         );
  685.                         mysql_function_query(db, gstring, false, "r@Player_Register", "i", playerid);
  686.                     }
  687.                 }
  688.             }
  689.         }
  690.         case DIALOG_LOGIN:
  691.         {
  692.             if(!response)
  693.             {
  694.                 SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Muito bem {1E90FF}%s{FFFFFF}, você pode registrar-se posteriormente pelo {1E90FF}/login.");
  695.             }
  696.             else
  697.             {
  698.                 WP_Hash(buffer, 129, inputtext);
  699.                 Player_Login(playerid, buffer);
  700.             }
  701.         }
  702.     }
  703.     printf("[DEBUG] OnDialogResponse(%i, %i, %i, %i, %s) - Tempo: %i ms.", playerid, dialogid, response, listitem, inputtext, (tickcount() - tick));
  704.     return 1;
  705. }
  706.  
  707. public OnPlayerUpdate(playerid)
  708. {
  709.     //Gasolina by DraKiNs
  710.     if(IsPlayerInAnyVehicle(playerid))
  711.     {
  712.         new carid = GetPlayerVehicleID(playerid);
  713.         new engine, lights, alarm, doors, bonnet, boot, objective;
  714.         GetVehicleParamsEx(carid, engine, lights, alarm, doors, bonnet, boot, objective);
  715.         if(engine) //Só consumirá gasolina com motor ligado (by Pedro Miranda)
  716.         {
  717.             GetVehicleVelocity(carid, gVehicleSpeed[0], gVehicleSpeed[1], gVehicleSpeed[2]);
  718.             if(floatround(((floatsqroot(((gVehicleSpeed[0] * gVehicleSpeed[0]) + (gVehicleSpeed[1] * gVehicleSpeed[1]) + (gVehicleSpeed[2] * gVehicleSpeed[2]))) * (170.0))) * 1) > 5)
  719.             {
  720.                 if(gVehicleGas[carid] == 0)
  721.                 {
  722.                     SetVehicleParamsEx(carid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
  723.                     SendClientMessage(playerid, 0xE31919FF, " ** A Gasolina de seu carro acabou, chame um guincho, arraste o carro até um posto, ou compre um galão na 24/7 mais próxima.");
  724.                 }
  725.                 if(gVehicleGas[carid] > 0)
  726.                 {
  727.                     gConsumedGas[playerid]+=1;
  728.                     if(gConsumedGas[playerid] >= (45 * 13))
  729.                     {
  730.                         gVehicleGas[carid]--;
  731.                         gConsumedGas[playerid] = 0;
  732.                     }
  733.                 }
  734.             }
  735.         }
  736.     }
  737.     //Fim sistema de gasolina
  738.    
  739.     //Sem debug pra não poluir visualmente o console
  740.     return 1;
  741. }
  742.  
  743. public OnQueryError(errorid, error[], callback[], query[], connectionHandle)
  744. {
  745.     return printf("\n\nQuery Error: %s - Query ( %s )\n\n", error, query);
  746. }
  747.  
  748. //Local functions
  749. #define function%0(%1) forward%0(%1);public%0(%1)
  750.  
  751. //Sistema de bans
  752. new adminname[24];
  753. function Player_Ban(playerid, adminid, reason[])
  754. {
  755.     if(adminid == INVALID_PLAYER_ID) adminname = "{1E90FF}Los Santos RPG";
  756.     else GetPlayerName(adminid, adminname, sizeof adminname);
  757.    
  758.     new day, month, year, hour, minute, second;
  759.     gettime(hour, minute, second);
  760.     getdate(year, month, day);
  761.    
  762.     mysql_format(db, gstring,
  763.         "INSERT INTO `ban_info` (`ban_name`,`ban_admin`,`ban_reason`,`ban_date`,`ban_ip`) VALUES ('%s','%s','%s','%02i/%02i/%04i - %02i:%02i:%02i','%s')",
  764.         gPlayerInfo[playerid][gPlayerName],
  765.         adminname,
  766.         reason,
  767.         day, month, year,
  768.         hour, minute, second,
  769.         gPlayerInfo[playerid][gPlayerIP]
  770.     );
  771.     mysql_function_query(db, gstring, false, "r@Player_Ban", "is", playerid, reason);
  772.     return 1;
  773. }
  774.  
  775. function r@Player_Ban(playerid, reason[])
  776. {
  777.     format(gstring, sizeof gstring,
  778.         "AdmCmd:{FFFFFF} O jogador {1E90FF}%s{FFFFFF} foi banido pelo administrador {1E90FF}%s{FFFFFF}, motivo: {1E90FF}%s",
  779.         gPlayerInfo[playerid][gPlayerName],
  780.         adminname,
  781.         reason
  782.     );
  783.     SendClientMessageToAll(0x1E90FFFF, gstring);
  784.     return Kick(playerid);
  785. }
  786.  
  787. function r@Player_BanCheck(playerid)
  788. {
  789.     new rows, fields;
  790.     cache_get_data(rows, fields, db);
  791.     if(rows)
  792.     {
  793.         //Banido
  794.         enum ban_info
  795.         {
  796.             name[24],
  797.             admin[24],
  798.             reason[64],
  799.             date[30],
  800.             ip[16]
  801.         }
  802.         new ban_record[ban_info];
  803.        
  804.         cache_get_field_content(0, "ban_name", ban_record[name], db);
  805.         cache_get_field_content(0, "ban_admin", ban_record[admin], db);
  806.         cache_get_field_content(0, "ban_reason", ban_record[reason], db);
  807.         cache_get_field_content(0, "ban_date", ban_record[date], db);
  808.         cache_get_field_content(0, "ban_ip", ban_record[ip], db);
  809.        
  810.         SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Você está banido do {1E90FF}%s.", SERVER_NAME);
  811.         SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Seguem abaixo as informações do seu banimento, {1E90FF}%s.", gPlayerInfo[playerid][gPlayerName]);
  812.         SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Conta: {1E90FF}%s.", ban_record[name]);
  813.         SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Administrador: {1E90FF}%s.", ban_record[admin]);
  814.         SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Motivo: {1E90FF}%s.", ban_record[reason]);
  815.         SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} Data/Hora: {1E90FF}%s.", ban_record[date]);
  816.         SendClientMessageFormatted(playerid, 0x1E90FFFF, "(!){FFFFFF} IP: {1E90FF}%s.", ban_record[ip]);
  817.         return 1;
  818.     }
  819.     //Livre, checando registro
  820.     mysql_format(db, gstring,
  821.         "SELECT * FROM `player_info` WHERE `name` = '%s' LIMIT 1",
  822.         gPlayerInfo[playerid][gPlayerName]
  823.     );
  824.     mysql_function_query(db, gstring, true, "r@Player_Connect", "i", playerid);
  825.     return 1;
  826. }
  827.  
  828. //Sistema de registro
  829. function r@Player_Connect(playerid)
  830. {
  831.     new rows, fields;
  832.     cache_get_data(rows, fields, db);
  833.     ClearChat(playerid, 10);
  834.     if(!rows)
  835.     {
  836.         //Não registrado
  837.         gPlayerInfo[playerid][gPlayerRegistered] = false;
  838.         format(gstring, sizeof gstring,
  839.             "{FFFFFF}Olá {1E90FF}%s{FFFFFF}\nÉ um prazer recebê-lo no {1E90FF}%s{FFFFFF}\nParece que você ainda não é registrado em nosso servidor\nDigite uma senha abaixo para iniciar seu registro.",
  840.             gPlayerInfo[playerid][gPlayerName],
  841.             SERVER_NAME
  842.         );
  843.         ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{FFFFFF}Registrando...", gstring, "Prosseguir", "Cancelar");
  844.         return 1;
  845.     }
  846.     //Registrado
  847.     gPlayerInfo[playerid][gPlayerRegistered] = true;
  848.     format(gstring, sizeof gstring,
  849.         "{FFFFFF}Olá {1E90FF}%s{FFFFFF}\nÉ um prazer recebê-lo novamente no {1E90FF}%s{FFFFFF}\nDigite sua senha abaixo para fazer login no servidor.",
  850.         gPlayerInfo[playerid][gPlayerName],
  851.         SERVER_NAME
  852.     );
  853.     ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{FFFFFF}Login", gstring, "Login", "Cancelar");
  854.     return 1;
  855. }
  856.  
  857. function r@Player_Register(playerid)
  858. {
  859.     mysql_store_result(db);
  860.     gPlayerInfo[playerid][gPlayerID] = mysql_insert_id(db);
  861.     mysql_free_result(db);
  862.    
  863.     gPlayerInfo[playerid][gPlayerRegistered] = true;
  864.     ClearChat(playerid, 30);
  865.    
  866.     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Parabéns {1E90FF}%s{FFFFFF}, você acaba de se registrar no {1E90FF}%s.", gPlayerInfo[playerid][gPlayerName], SERVER_NAME);
  867.     SendClientMessage         (playerid, 0xFFFFFFFF, " ** Aqui vão seus dados pessoais registrados...");
  868.     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Sexo: %s.", (gPlayerInfo[playerid][gPlayerGender] == 1) ? ("{32CD32}Masculino") : ("{FF00FF}Feminino"));
  869.     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Data de nascimento: {1E90FF}%02i/%02i/%02i{FFFFFF}, Idade: {1E90FF}%i{FFFFFF} anos.", gPlayerInfo[playerid][gPlayerBirth][0], gPlayerInfo[playerid][gPlayerBirth][1], gPlayerInfo[playerid][gPlayerBirth][2], gPlayerInfo[playerid][gPlayerAge]);
  870.     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Você acaba de receber seu ID interno: {1E90FF}%i.", gPlayerInfo[playerid][gPlayerID]);
  871.     SendClientMessage         (playerid, 0xFFFFFFFF, " ** Você acaba de fazer login automaticamente no servidor pelo seu registro.");
  872.     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Aguarde enquanto você é redirecionado ao incrível mundo de {1E90FF}%s{FFFFFF}...", SERVER_NAME);
  873.    
  874.     Player_Login(playerid, gPlayerInfo[playerid][gPlayerPassword]);
  875.     return 1;
  876. }
  877.  
  878. function Player_Login(playerid, password[])
  879. {
  880.     mysql_format(db, gstring,
  881.         "SELECT * FROM `player_info` WHERE `name` = '%s' AND `password` = '%s'",
  882.         gPlayerInfo[playerid][gPlayerName],
  883.         password
  884.     );
  885.     mysql_function_query(db, gstring, true, "r@Player_Login", "i", playerid);
  886.     return 1;
  887. }
  888.  
  889. function r@Player_Login(playerid)
  890. {
  891.     new rows, fields;
  892.     cache_get_data(rows, fields, db);
  893.     if(!rows)
  894.     {
  895.         //Senha incorreta
  896.         gPlayerInfo[playerid][gPlayerLoginTries] ++;
  897.         if(gPlayerInfo[playerid][gPlayerLoginTries] == 5)
  898.             return Kick(playerid);
  899.            
  900.         format(gstring, sizeof gstring,
  901.             "{FFFFFF}Caro {1E90FF}%s{FFFFFF}\nSenha incorreta.\nDigite sua verdadeira senha para fazer login.\n\nCaso precise de ajuda para recuperar sua senha, podes utilizar os seguintes comandos:\n{E31919}/dicasenha\n/pergunta",
  902.             gPlayerInfo[playerid][gPlayerName]
  903.         );
  904.         ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{FFFFFF}Login", gstring, "Login", "Cancelar");
  905.         return 1;
  906.     }
  907.     //Login
  908.     gPlayerInfo[playerid][gPlayerLogged] = true;
  909.     //Carregando dados
  910.     //Registro
  911.     cache_get_field_content(0, "password", gPlayerInfo[playerid][gPlayerPassword], db);
  912.     cache_get_field_content(0, "password_tip", gPlayerInfo[playerid][gPlayerPasswordTip], db);
  913.     cache_get_field_content(0, "secret_ask", gPlayerInfo[playerid][gPlayerSecretAsk], db);
  914.     cache_get_field_content(0, "secret_answer", gPlayerInfo[playerid][gPlayerSecretAnswer], db);
  915.     //Informações pessoais
  916.     cache_get_field_content(0, "gender", gstring, db); gPlayerInfo[playerid][gPlayerGender] = strval(gstring);
  917.     cache_get_field_content(0, "day", gstring, db); gPlayerInfo[playerid][gPlayerBirth][0] = strval(gstring);
  918.     cache_get_field_content(0, "month", gstring, db); gPlayerInfo[playerid][gPlayerBirth][1] = strval(gstring);
  919.     cache_get_field_content(0, "year", gstring, db); gPlayerInfo[playerid][gPlayerBirth][2] = strval(gstring);
  920.     cache_get_field_content(0, "skin", gstring, db); gPlayerInfo[playerid][gPlayerSkin] = strval(gstring);
  921.     //Sistema de nível
  922.     cache_get_field_content(0, "exp", gstring, db); gPlayerInfo[playerid][gPlayerExp] = floatstr(gstring);
  923.     cache_get_field_content(0, "level", gstring, db); gPlayerInfo[playerid][gPlayerLevel] = strval(gstring);
  924.     //Salvar posição após crash
  925.     cache_get_field_content(0, "leave_reason", gstring, db); gPlayerInfo[playerid][gPlayerLeaveReason] = strval(gstring);
  926.     cache_get_field_content(0, "interior", gstring, db); gPlayerInfo[playerid][gPlayerInterior] = strval(gstring);
  927.     cache_get_field_content(0, "world", gstring, db); gPlayerInfo[playerid][gPlayerWorld] = strval(gstring);
  928.     cache_get_field_content(0, "x", gstring, db); gPlayerInfo[playerid][gPlayerPos][0] = floatstr(gstring);
  929.     cache_get_field_content(0, "y", gstring, db); gPlayerInfo[playerid][gPlayerPos][1] = floatstr(gstring);
  930.     cache_get_field_content(0, "z", gstring, db); gPlayerInfo[playerid][gPlayerPos][2] = floatstr(gstring);
  931.     cache_get_field_content(0, "angle", gstring, db); gPlayerInfo[playerid][gPlayerPos][3] = floatstr(gstring);
  932.     cache_get_field_content(0, "health", gstring, db); gPlayerInfo[playerid][gPlayerHealth] = floatstr(gstring);
  933.     cache_get_field_content(0, "armour", gstring, db); gPlayerInfo[playerid][gPlayerArmour] = floatstr(gstring);
  934.     //TextDraws
  935.     Player_TextDrawCreate(playerid);
  936.     TextDrawShowForPlayer(playerid, gPlayerInfo[playerid][gPlayerStatsTD]);
  937.     TextDrawShowForPlayer(playerid, gPlayerInfo[playerid][gPlayerNetStatsTD]);
  938.     TextDrawShowForPlayer(playerid, g_tdMain);
  939.     //Timers
  940.     gPlayerInfo[playerid][gPlayerUpTimer] = SetTimerEx("Player_LevelUp", 60000, 1, "i", playerid);
  941.     //Spawn...
  942.     SetSpawnInfo(playerid, 0, gPlayerInfo[playerid][gPlayerSkin], gDefaultSpawn[0], gDefaultSpawn[1], gDefaultSpawn[2], gDefaultSpawn[3], 0, 0, 0, 0, 0, 0);
  943.     SpawnPlayer(playerid);
  944.     SendClientMessageFormatted(playerid, 0xFFFFFFFF, " ** Bem vindo {1E90FF}%s.", gPlayerInfo[playerid][gPlayerName]);
  945.     return 1;
  946. }
  947.  
  948. function Player_Save(playerid)
  949. {
  950.     mysql_format(db, gstring,
  951.         "UPDATE `player_info` SET skin = %d, exp = %.1f, level = %d, leave_reason = %d, interior = %d, world = %d, x = %.1f, y = %.1f, z = %.1f, angle = %.1f, health = %.1f, armour = %.1f WHERE `name` = '%s'",
  952.         GetPlayerSkin(playerid), gPlayerInfo[playerid][gPlayerExp], gPlayerInfo[playerid][gPlayerLevel], gPlayerInfo[playerid][gPlayerLeaveReason], gPlayerInfo[playerid][gPlayerInterior], gPlayerInfo[playerid][gPlayerWorld], gPlayerInfo[playerid][gPlayerPos][0], gPlayerInfo[playerid][gPlayerPos][1], gPlayerInfo[playerid][gPlayerPos][2], gPlayerInfo[playerid][gPlayerPos][3], gPlayerInfo[playerid][gPlayerHealth], gPlayerInfo[playerid][gPlayerArmour], gPlayerInfo[playerid][gPlayerName]
  953.     );
  954.     mysql_function_query(db, gstring, false, "r@Player_Save", "i", playerid);
  955.     return 1;
  956. }
  957.  
  958. function r@Player_Save(playerid)
  959. {
  960.     return printf("\n[REGISTER SYSTEM]: Conta de %s salva.", gPlayerInfo[playerid][gPlayerName]);
  961. }
  962.  
  963. function Player_Spawn(playerid)
  964. {
  965.     if(gPlayerInfo[playerid][gPlayerLeaveReason] == 0)
  966.     {
  967.         SetPlayerVirtualWorld(playerid, gPlayerInfo[playerid][gPlayerWorld]);
  968.         SetPlayerInterior(playerid, gPlayerInfo[playerid][gPlayerInterior]);
  969.         SetPlayerPos(playerid, gPlayerInfo[playerid][gPlayerPos][0], gPlayerInfo[playerid][gPlayerPos][1], gPlayerInfo[playerid][gPlayerPos][2]);
  970.         SetPlayerFacingAngle(playerid, gPlayerInfo[playerid][gPlayerPos][3]);
  971.         SetPlayerHealth(playerid, gPlayerInfo[playerid][gPlayerHealth]);
  972.         SetPlayerArmour(playerid, gPlayerInfo[playerid][gPlayerArmour]);
  973.         SendClientMessage(playerid, 0xFFFFFFFF, " ** Você retornou ao ponto onde saiu por crash.");
  974.         return 1;
  975.     }
  976.     return 1;
  977. }
  978.  
  979. function Player_TextDrawCreate(playerid)
  980. {
  981.     //Estatísticas
  982.     gPlayerInfo[playerid][gPlayerStatsTD] = TextDrawCreate(401, 374, "Nome:~n~Experiencia:~n~Nivel:~n~Emprego:~n~Faccao:");
  983.     TextDrawSetOutline(gPlayerInfo[playerid][gPlayerStatsTD], 1);
  984.     TextDrawFont(gPlayerInfo[playerid][gPlayerStatsTD], 2);
  985.     TextDrawLetterSize(gPlayerInfo[playerid][gPlayerStatsTD], 0.48, 1.1);
  986.     TextDrawUseBox(gPlayerInfo[playerid][gPlayerStatsTD], 1);
  987.     TextDrawBoxColor(gPlayerInfo[playerid][gPlayerStatsTD], 80);
  988.     TextDrawTextSize(gPlayerInfo[playerid][gPlayerStatsTD], 637, 0);
  989.     //Ping & FPS
  990.     gPlayerInfo[playerid][gPlayerNetStatsTD] = TextDrawCreate(547, 23, "Ping:~n~FPS:");
  991.     TextDrawSetOutline(gPlayerInfo[playerid][gPlayerNetStatsTD], 1);
  992.     TextDrawFont(gPlayerInfo[playerid][gPlayerNetStatsTD], 2);
  993.     TextDrawLetterSize(gPlayerInfo[playerid][gPlayerNetStatsTD], 0.35, 1.1);
  994.     //Velocímetro
  995.     gPlayerInfo[playerid][gPlayerSpeedoTD] = TextDrawCreate(401, 305, "            Painel~n~Veiculo:~n~Motor:~n~Combustivel:~n~Lataria:~n~Velocidade:~n~GPS:");
  996.     TextDrawSetOutline(gPlayerInfo[playerid][gPlayerSpeedoTD], 1);
  997.     TextDrawFont(gPlayerInfo[playerid][gPlayerSpeedoTD], 2);
  998.     TextDrawLetterSize(gPlayerInfo[playerid][gPlayerSpeedoTD], 0.4, 1);
  999.     TextDrawUseBox(gPlayerInfo[playerid][gPlayerSpeedoTD], 1);
  1000.     TextDrawBoxColor(gPlayerInfo[playerid][gPlayerSpeedoTD], 80);
  1001.     TextDrawTextSize(gPlayerInfo[playerid][gPlayerSpeedoTD], 640, 0);
  1002.     return 1;
  1003. }
  1004.  
  1005. function Player_Updates()
  1006. {
  1007.     new string[200];
  1008.     foreach(Player, i)
  1009.     {
  1010.         if(gPlayerInfo[i][gPlayerLogged])
  1011.         {
  1012.             //Ping & FPS
  1013.             format(string, sizeof(string),
  1014.                 "~w~Ping: ~b~%i~n~~w~FPS: ~b~%i",
  1015.                 GetPlayerPing(i), GetPlayerFPS(i)
  1016.             );
  1017.             TextDrawSetString(gPlayerInfo[i][gPlayerNetStatsTD], string);
  1018.             //Estatísticas
  1019.             format(string, sizeof(string),
  1020.                 "~w~Nome: ~b~%s~n~~w~Experiencia: ~b~%.1f~n~~w~Nivel:~b~ %i~n~~w~Emprego:~b~ %s~n~~w~Faccao:~b~ %s",
  1021.                 gPlayerInfo[i][gPlayerName], gPlayerInfo[i][gPlayerExp], gPlayerInfo[i][gPlayerLevel], ("Nenhum"), ("Nenhuma")
  1022.             );
  1023.             TextDrawSetString(gPlayerInfo[i][gPlayerStatsTD], string);
  1024.             //Velocímetro
  1025.             if(IsPlayerInAnyVehicle(i) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
  1026.             {
  1027.                 new vehicleid = GetPlayerVehicleID(i);
  1028.                 new Float: health; GetVehicleHealth(vehicleid, health);
  1029.                 new zone[28]; GetPlayer2DZone(i, zone, sizeof zone);
  1030.                 new model = GetVehicleModel(vehicleid);
  1031.                 new engine, lights, alarm, doors, bonnet, boot, objective;
  1032.                 GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
  1033.                 format(string, sizeof string,
  1034.                     "            ~r~Painel~n~~w~Veiculo: ~b~%s~n~~w~Motor: %s~n~~w~Combustivel: ~b~%i ~g~L~n~~w~Lataria: ~b~%i ~g~%%~n~~w~Velocidade: ~b~%i ~g~KM/H~n~~w~GPS: ~b~%s",
  1035.                     VehiclesName[model - 400],
  1036.                     engine ? ("~g~Ligado") : ("~r~Desligado"),
  1037.                     gVehicleGas[vehicleid],
  1038.                     floatround(health) / 10,
  1039.                     GetPlayerSpeed(i),
  1040.                     zone
  1041.                 );
  1042.                 TextDrawSetString(gPlayerInfo[i][gPlayerSpeedoTD], string);
  1043.             }
  1044.         }
  1045.     }
  1046.     return 1;
  1047. }
  1048.  
  1049. function Player_LevelUp(playerid)
  1050. {
  1051.     if(gPlayerInfo[playerid][gPlayerLogged])
  1052.     {
  1053.         gPlayerInfo[playerid][gPlayerExp] += 0.1;
  1054.         if(gPlayerInfo[playerid][gPlayerExp] == 100.0)
  1055.         {
  1056.             gPlayerInfo[playerid][gPlayerExp] = 0.0;
  1057.             gPlayerInfo[playerid][gPlayerLevel]++;
  1058.             SetPlayerScore(playerid, gPlayerInfo[playerid][gPlayerLevel]);
  1059.             GameTextForPlayer(playerid, "~w~Level ~r~UP", 1000, 1);
  1060.         }
  1061.     }
  1062.     return 1;
  1063. }
  1064.  
  1065. //Mensagens randomicas
  1066. function RandomMessages()
  1067. {
  1068.     return SendClientMessageToAll(0x1E90FFFF, random_Messages[random(sizeof random_Messages)]);
  1069. }
  1070.  
  1071. //Relogio
  1072. function UpdateTime()
  1073. {
  1074.     new string[128];
  1075.     new day, month, year, hour, minute, second;
  1076.  
  1077.     gettime(hour, minute, second);
  1078.     getdate(year, month, day);
  1079.    
  1080.     format(string, sizeof string,
  1081.         "Los Santos ~b~RPG                ~w~ls-~b~rpg~w~.com                 ~w~%02i~b~/~w~%02i~b~/~w~%04i ~w~- %02i~b~:~w~%02i~b~:~w~%02i",
  1082.         day, month, year, hour, minute, second
  1083.     );
  1084.     TextDrawSetString(g_tdMain, string);
  1085.     SetWorldTime(hour);
  1086.     foreach(Player, i)
  1087.     {
  1088.         if(gPlayerInfo[i][gPlayerLogged])
  1089.         {
  1090.             SetPlayerTime(i, hour, minute);
  1091.         }
  1092.     }
  1093.     return 1;
  1094. }
  1095.  
  1096. //Useful functions
  1097. ProxDetector(Float:radi, playerid, color, string[])
  1098. {
  1099.     new Float:x, Float:y, Float:z;
  1100.     GetPlayerPos(playerid, x, y, z);
  1101.     foreach(Player, i)
  1102.     {
  1103.         if(gPlayerInfo[i][gPlayerLogged])
  1104.         {
  1105.             if(GetPlayerVirtualWorld(i) == GetPlayerVirtualWorld(playerid) && GetPlayerInterior(i) == GetPlayerInterior(playerid))
  1106.             {
  1107.                 if(IsPlayerInRangeOfPoint(i, radi, x, y, z))
  1108.                 {
  1109.                     SendClientMessage(i, color, string);
  1110.                 }
  1111.             }
  1112.         }
  1113.     }
  1114.     return 1;
  1115. }
  1116.  
  1117. GetPlayerFPS(playerid)
  1118. {
  1119.     SetPVarInt(playerid, "DrunkL", GetPlayerDrunkLevel(playerid));
  1120.     if(GetPVarInt(playerid, "DrunkL") < 100)
  1121.     {
  1122.         SetPlayerDrunkLevel(playerid, 2000);
  1123.     }
  1124.     else
  1125.     {
  1126.         if(GetPVarInt(playerid, "LDrunkL") != GetPVarInt(playerid, "DrunkL"))
  1127.         {
  1128.             SetPVarInt(playerid, "FPS", (GetPVarInt(playerid, "LDrunkL") - GetPVarInt(playerid, "DrunkL")));
  1129.             SetPVarInt(playerid, "LDrunkL", GetPVarInt(playerid, "DrunkL"));
  1130.             if((GetPVarInt(playerid, "FPS") > 0) && (GetPVarInt(playerid, "FPS") < 256))
  1131.             {
  1132.                 return GetPVarInt(playerid, "FPS") - 1;
  1133.             }
  1134.         }
  1135.     }
  1136.     return 0;
  1137. }
  1138.  
  1139. GetPlayerSpeed(playerid)
  1140. {
  1141.     new Float:ST[4];
  1142.     if(IsPlayerInAnyVehicle(playerid))
  1143.     GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
  1144.     else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
  1145.     ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 100.3;
  1146.     return floatround(ST[3]);
  1147. }
  1148.  
  1149. split(const strsrc[], strdest[][], delimiter)
  1150. {
  1151.     new i, li;
  1152.     new aNum;
  1153.     new len;
  1154.     while(i <= strlen(strsrc))
  1155.     {
  1156.         if(strsrc[i] == delimiter || i == strlen(strsrc))
  1157.         {
  1158.             len = strmid(strdest[aNum], strsrc, li, i, 128);
  1159.             strdest[aNum][len] = 0;
  1160.             li = i+1;
  1161.             aNum++;
  1162.         }
  1163.         i++;
  1164.     }
  1165.     return 1;
  1166. }
  1167.  
  1168. ClearChat(playerid, lines)
  1169. {
  1170.     for(new i = 0; i != lines; ++i)
  1171.     {
  1172.         SendClientMessage(playerid, -1, " ");
  1173.     }
  1174.     return 1;
  1175. }
  1176.  
  1177. SendClientMessageFormatted(playerid, color, fstring[], {Float, _}:...) //Y_Less
  1178. {
  1179.     new n = numargs() * 4;
  1180.  
  1181.     if (n == 3 * 4)
  1182.     {
  1183.         return SendClientMessage(playerid, color, fstring);
  1184.     }
  1185.     else
  1186.     {
  1187.         new message[128];
  1188.         new arg_start;
  1189.         new arg_end;
  1190.         new i = 0;
  1191.  
  1192.         #emit CONST.pri  fstring
  1193.         #emit ADD.C    0x4
  1194.         #emit STOR.S.pri arg_start // first parameters's offset
  1195.  
  1196.         #emit LOAD.S.pri n
  1197.         #emit ADD.C    0x8
  1198.         #emit STOR.S.pri arg_end  // last parameters's offset
  1199.  
  1200.         // pushing variable arguments
  1201.         for (i = arg_end; i >= arg_start; i -= 4)
  1202.         {
  1203.             #emit LCTRL    5
  1204.             #emit LOAD.S.alt i
  1205.             #emit ADD
  1206.             #emit LOAD.I
  1207.             #emit PUSH.pri
  1208.         }
  1209.         // pushing normal arguments
  1210.         #emit PUSH.S  fstring // format string
  1211.         #emit PUSH.C  128   // sizeof(message)
  1212.         #emit PUSH.ADR message // the string which format() will write in
  1213.         #emit PUSH.S  n    // number of arguments * 4, always must be passed for natives
  1214.         #emit SYSREQ.C format
  1215.  
  1216.         // clearing the stack
  1217.         i = n / 4 + 1;
  1218.         while (--i >= 0)
  1219.         {
  1220.             #emit STACK 0x4
  1221.         }
  1222.  
  1223.         return SendClientMessage(playerid, color, message);
  1224.     }
  1225. }
  1226.  
  1227. CMD:crash(playerid) return GameTextForPlayer(playerid, "~k~~INVALID_KEY~", 100, 5);
  1228.  
  1229. CMD:carro(playerid)
  1230. {
  1231.     new Float:x, Float:y, Float:z;
  1232.     GetPlayerPos(playerid, x, y, z);
  1233.     new v = CreateVehicle(429, x, y, z + 10, 0, 0, 3, -1);
  1234.     gVehicleGas[v] = 5;
  1235.     return 1;
  1236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement