Advertisement
Chainksain

tutorial11.pwn

Apr 23rd, 2020
1,933
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 15.45 KB | None | 1 0
  1. #include <a_samp>
  2. #include <a_mysql>
  3. #include <sscanf2>
  4. #include <zcmd>
  5. #include <DOF2>
  6.  
  7. #define function%0(%1) forward %0(%1); public %0(%1)
  8.  
  9. #define MAX_PASS_LEN 65
  10. #define SALT_LEN 13
  11.  
  12. enum //Dialogs
  13. {
  14.     DIALOG_LOGIN,
  15.     DIALOG_REGISTRO
  16. };
  17.  
  18. new MySQL:DBConn, host[16], username[MAX_PLAYER_NAME], database[MAX_PLAYER_NAME], pass[16];
  19.  
  20. enum PLAYER_DATA
  21. {
  22.     accid,
  23.     nome[MAX_PLAYER_NAME],
  24.     senha[MAX_PASS_LEN],
  25.     admin,
  26.     Float:posX,
  27.     Float:posY,
  28.     Float:posZ,
  29.     Float:angulo,
  30.     Float:health,
  31.     Float:armor,
  32.     money,
  33.     interior,
  34.     vw,
  35.     skin,
  36.     score,
  37.     ORM:ormid,
  38.     bool:logado,
  39.     pSalt[SALT_LEN],
  40. };
  41. new PlayerData[MAX_PLAYERS][PLAYER_DATA];
  42.  
  43. main()
  44. {
  45.     print("\n----------------------------------");
  46.     print(" Blank Gamemode by your name here");
  47.     print("----------------------------------\n");
  48. }
  49.  
  50. public OnGameModeInit()
  51. {
  52.     SetGameModeText("Blank Script");
  53.     LoadMap("maps/favela_objects.txt");
  54.     DataBaseInit();
  55.     return 1;
  56. }
  57.  
  58. public OnGameModeExit()
  59. {
  60.     DOF2_Exit();
  61.     mysql_close(DBConn);
  62.     return 1;
  63. }
  64.  
  65. public OnPlayerRequestClass(playerid, classid)
  66. {
  67.     return 1;
  68. }
  69.  
  70. public OnPlayerConnect(playerid)
  71. {
  72.     RemoveBuildingFromFile(playerid, "maps/favela_buildings.txt");
  73.     LoadPlayerData(playerid);
  74.     return 1;
  75. }
  76.  
  77. public OnPlayerDisconnect(playerid, reason)
  78. {
  79.     if(PlayerData[playerid][logado] == true)
  80.     {
  81.         SavePlayerData(playerid);
  82.  
  83.         new rsnstr[3][] =
  84.         {
  85.             "Timeout/Crash",
  86.             "Saiu",
  87.             "Kickado/Banido"
  88.         };
  89.         new string[64];
  90.         format(string, sizeof(string), "%s foi desconectado (%s)", GetPlayerNameEx(playerid), rsnstr[reason]);
  91.         SendClientMessageToAll(-1, string);
  92.     }
  93.  
  94.     orm_destroy(PlayerData[playerid][ormid]);
  95.     for(new PLAYER_DATA:i; i < PLAYER_DATA; i++)
  96.         PlayerData[playerid][i] = 0;
  97.  
  98.     return 1;
  99. }
  100.  
  101. public OnPlayerSpawn(playerid)
  102. {
  103.     if(PlayerData[playerid][logado] == false)
  104.     {
  105.         SetPlayerData(playerid);
  106.         PlayerData[playerid][logado] = true;
  107.     }
  108.     return 1;
  109. }
  110.  
  111. public OnPlayerDeath(playerid, killerid, reason)
  112. {
  113.     return 1;
  114. }
  115.  
  116. public OnVehicleSpawn(vehicleid)
  117. {
  118.     return 1;
  119. }
  120.  
  121. public OnVehicleDeath(vehicleid, killerid)
  122. {
  123.     return 1;
  124. }
  125.  
  126. public OnPlayerText(playerid, text[])
  127. {
  128.     return 1;
  129. }
  130.  
  131. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  132. {
  133.     return 1;
  134. }
  135.  
  136. public OnPlayerExitVehicle(playerid, vehicleid)
  137. {
  138.     return 1;
  139. }
  140.  
  141. public OnPlayerStateChange(playerid, newstate, oldstate)
  142. {
  143.     return 1;
  144. }
  145.  
  146. public OnPlayerEnterCheckpoint(playerid)
  147. {
  148.     return 1;
  149. }
  150.  
  151. public OnPlayerLeaveCheckpoint(playerid)
  152. {
  153.     return 1;
  154. }
  155.  
  156. public OnPlayerEnterRaceCheckpoint(playerid)
  157. {
  158.     return 1;
  159. }
  160.  
  161. public OnPlayerLeaveRaceCheckpoint(playerid)
  162. {
  163.     return 1;
  164. }
  165.  
  166. public OnRconCommand(cmd[])
  167. {
  168.     return 1;
  169. }
  170.  
  171. public OnPlayerRequestSpawn(playerid)
  172. {
  173.     return 1;
  174. }
  175.  
  176. public OnObjectMoved(objectid)
  177. {
  178.     return 1;
  179. }
  180.  
  181. public OnPlayerObjectMoved(playerid, objectid)
  182. {
  183.     return 1;
  184. }
  185.  
  186. public OnPlayerPickUpPickup(playerid, pickupid)
  187. {
  188.     return 1;
  189. }
  190.  
  191. public OnVehicleMod(playerid, vehicleid, componentid)
  192. {
  193.     return 1;
  194. }
  195.  
  196. public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
  197. {
  198.     return 1;
  199. }
  200.  
  201. public OnVehicleRespray(playerid, vehicleid, color1, color2)
  202. {
  203.     return 1;
  204. }
  205.  
  206. public OnPlayerSelectedMenuRow(playerid, row)
  207. {
  208.     return 1;
  209. }
  210.  
  211. public OnPlayerExitedMenu(playerid)
  212. {
  213.     return 1;
  214. }
  215.  
  216. public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  217. {
  218.     return 1;
  219. }
  220.  
  221. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  222. {
  223.     return 1;
  224. }
  225.  
  226. public OnRconLoginAttempt(ip[], password[], success)
  227. {
  228.     return 1;
  229. }
  230.  
  231. public OnPlayerUpdate(playerid)
  232. {
  233.     return 1;
  234. }
  235.  
  236. public OnPlayerStreamIn(playerid, forplayerid)
  237. {
  238.     return 1;
  239. }
  240.  
  241. public OnPlayerStreamOut(playerid, forplayerid)
  242. {
  243.     return 1;
  244. }
  245.  
  246. public OnVehicleStreamIn(vehicleid, forplayerid)
  247. {
  248.     return 1;
  249. }
  250.  
  251. public OnVehicleStreamOut(vehicleid, forplayerid)
  252. {
  253.     return 1;
  254. }
  255.  
  256. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  257. {
  258.     switch(dialogid)
  259.     {
  260.         case DIALOG_LOGIN:
  261.         {
  262.             if(!response)
  263.                 Kick(playerid);
  264.             else
  265.             {
  266.                 new hash[MAX_PASS_LEN];
  267.                 SHA256_PassHash(inputtext, PlayerData[playerid][pSalt], hash, MAX_PASS_LEN);
  268.                 if(strlen(inputtext) < 1 || strcmp(PlayerData[playerid][senha], hash))
  269.                 {
  270.                     SendClientMessage(playerid, -1, "ERRO: Senha incorreta!");
  271.                     ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", "Digite sua senha para logar:", "Logar", "Sair");
  272.                 }
  273.                 else
  274.                 {
  275.                     SendClientMessage(playerid, -1, "Logado com sucesso!");
  276.                     SetSpawnInfo(playerid, NO_TEAM, PlayerData[playerid][skin],
  277.                     PlayerData[playerid][posX], PlayerData[playerid][posY],PlayerData[playerid][posZ],
  278.                     PlayerData[playerid][angulo],
  279.                     0, 0, 0, 0, 0, 0);
  280.                     SpawnPlayer(playerid);
  281.                 }
  282.             }
  283.         }
  284.         case DIALOG_REGISTRO:
  285.         {
  286.             if(!response)
  287.                 Kick(playerid);
  288.             else
  289.             {
  290.                 if(strlen(inputtext) < 1 || strlen(inputtext) > 16)
  291.                 {
  292.                     SendClientMessage(playerid, -1, "ERRO: Sua senha deve conter entre 1 e 16 caracteres!");
  293.                     ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", "Entre com uma senha para se registrar:", "Registrar", "Sair");
  294.                 }
  295.                 else
  296.                 {
  297.                     PlayerData[playerid][pSalt] = Salt();
  298.                     SendClientMessage(playerid, -1, "Registrado com sucesso!");
  299.                     SHA256_PassHash(inputtext, PlayerData[playerid][pSalt], PlayerData[playerid][senha], MAX_PASS_LEN);
  300.                     orm_insert(PlayerData[playerid][ormid]);
  301.                     PlayerData[playerid][logado] = true;
  302.                     SetSpawnInfo(playerid, NO_TEAM, 0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
  303.                     SpawnPlayer(playerid);
  304.                 }
  305.             }
  306.         }
  307.     }
  308.  
  309.     return 1;
  310. }
  311.  
  312. public OnPlayerClickPlayer(playerid, clickedplayerid, source)
  313. {
  314.     return 1;
  315. }
  316.  
  317. public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
  318. {
  319.     return 1;
  320. }
  321.  
  322. // FUNCOES
  323.  
  324. function OnPlayerLogin(playerid)
  325. {
  326.     orm_setkey(PlayerData[playerid][ormid], "id");
  327.  
  328.     if(orm_errno(PlayerData[playerid][ormid]) == ERROR_OK) // jogador ja existe na database
  329.         ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", "Digite sua senha para logar:", "Logar", "Sair");
  330.     else // jogador não encontrado na database
  331.         ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", "Entre com uma senha para se registrar:", "Registrar", "Sair");
  332.     return 1;
  333. }
  334.  
  335. function DataBaseInit()
  336. {
  337.     //new MYSQL:DBConn, host[16], username[MAX_PLAYER_NAME], database[MAX_PLAYER_NAME], pass[16];
  338.     LoadDBSettings("dbconfig.ini");
  339.     DBConn = mysql_connect(host, username, pass, database);
  340.     if(mysql_errno() == 0)
  341.     {
  342.         printf("[MySQL] Database '%s' conectada com sucesso!", database);
  343.         print("[MySQL] Verificando tabelas...");
  344.  
  345.         mysql_query(DBConn, "CREATE TABLE IF NOT EXISTS Player (\
  346.         id int NOT NULL AUTO_INCREMENT,\
  347.         nome varchar(25) NOT NULL,\
  348.         senha varchar(255) NOT NULL,\
  349.         admin int DEFAULT 0,\
  350.         PRIMARY KEY(id));", false);
  351.  
  352.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS health float DEFAULT 100;", false);
  353.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS armor float DEFAULT 100;", false);
  354.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS dinheiro int DEFAULT 100;", false);
  355.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS posX double DEFAULT 0;", false);
  356.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS posY double DEFAULT 0;", false);
  357.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS posZ double DEFAULT 0;", false);
  358.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS angulo double DEFAULT 0;", false);
  359.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS interior int DEFAULT 0;", false);
  360.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS vw int DEFAULT 0;", false);
  361.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS score int DEFAULT 0;", false);
  362.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS skin int DEFAULT 0;", false);
  363.         mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS salt varchar(65) DEFAULT 0;", false);
  364.  
  365.         print("[MySQL] Tabela 'Players' verificada com sucesso!");
  366.     }
  367.     else
  368.     {
  369.         printf("[MySQL] ERRO: Não foi possível se conectar a database '%s'!", database);
  370.         SendRconCommand("exit");
  371.     }
  372.  
  373.     return 1;
  374. }
  375.  
  376. function RemoveBuildingFromFile(playerid, const file[])
  377. {
  378.     new File:map = fopen(file, io_read);
  379.     if(map)
  380.     {
  381.         new string[256];
  382.         while(fread(map, string))
  383.         {
  384.             new modelid, Float:pos[3], Float:rad;
  385.             if(!sscanf(string, "dffff", modelid, pos[0], pos[1], pos[2], rad))
  386.                 RemoveBuildingForPlayer(playerid, modelid, pos[0], pos[1], pos[2], rad);
  387.             else
  388.                 return printf("Carregamento do mapa '%s' falhou para o jogador %s(%d).", file, GetPlayerNameEx(playerid), playerid);
  389.         }
  390.     }
  391.     return printf("Jogador %s(%d) carregou o mapa '%s' com êxito.", GetPlayerNameEx(playerid), playerid, file);
  392. }
  393.  
  394. function LoadMap(const file[])
  395. {
  396.     printf("Carregando Mapa '%s'...", file);
  397.     new File:map = fopen(file, io_read);
  398.     if(map)
  399.     {
  400.         new string[256];
  401.         while(fread(map, string))
  402.         {
  403.             new modelid, Float:pos[3], Float:rot[3];
  404.             if(sscanf(string, "dffffff", modelid, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2]))
  405.                 return printf("Erro ao carregar o mapa '%s'!",file);
  406.             else
  407.                 CreateObject(modelid, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2]);
  408.                
  409.         }
  410.         return printf("Mapa '%s' carregado com sucesso!",file);
  411.     }
  412.     else return printf("Erro ao carregar o mapa '%s'!",file);
  413. }
  414.  
  415. // COMANDOS
  416.  
  417. CMD:pos(playerid, const params[])
  418. {
  419.     new Float:pos[3], giveplayerid;
  420.     if(sscanf(params, "ufff", giveplayerid, pos[0], pos[1], pos[2]))
  421.         return SendClientMessage(playerid, -1, "USO: /pos [id] [x] [y] [z]");
  422.  
  423.     if(!IsPlayerConnected(giveplayerid) || giveplayerid == INVALID_PLAYER_ID)
  424.         return SendClientMessage(playerid, -1, "ERRO: ID Inválido!");
  425.  
  426.     SetPlayerPos(giveplayerid, pos[0], pos[1], pos[2]);
  427.     return 1;
  428. }
  429.  
  430. CMD:info(playerid, const params[])
  431. {
  432.     new giveplayerid, string[64];
  433.    
  434.     if(sscanf(params, "u", giveplayerid))
  435.         return SendClientMessage(playerid, -1, "USO: /info [id]");
  436.    
  437.     if(!IsPlayerConnected(giveplayerid) || giveplayerid == INVALID_PLAYER_ID)
  438.         return SendClientMessage(playerid, -1, "ERRO: ID Inválido!");
  439.  
  440.     format(string, sizeof(string), "Jogador: %s", GetPlayerNameEx(giveplayerid));
  441.     SendClientMessage(playerid, -1, string);
  442.  
  443.     format(string, sizeof(string), "ID: %d", giveplayerid);
  444.     SendClientMessage(playerid, -1, string);
  445.  
  446.     format(string, sizeof(string), "Score: %d", GetPlayerScore(giveplayerid));
  447.     SendClientMessage(playerid, -1, string);
  448.  
  449.     format(string, sizeof(string), "Dinheiro: %d", GetPlayerMoney(giveplayerid));
  450.     SendClientMessage(playerid, -1, string);
  451.        
  452.     format(string, sizeof(string), "Life: %f", GetPlayerHealthEx(giveplayerid));
  453.     SendClientMessage(playerid, -1, string);
  454.  
  455.     format(string, sizeof(string), "Armor: %f", GetPlayerArmourEx(giveplayerid));
  456.     SendClientMessage(playerid, -1, string);
  457.  
  458.     new Float:pos[3];
  459.     GetPlayerPos(giveplayerid, pos[0], pos[1], pos[2]);
  460.     format(string, sizeof(string), "PosX: %f PosY: %f PosZ: %f", pos[0], pos[1], pos[2]);
  461.     SendClientMessage(playerid, -1, string);
  462.  
  463.     format(string, sizeof(string),"Int: %d", GetPlayerInterior(giveplayerid));
  464.     SendClientMessage(playerid, -1, string);
  465.  
  466.     format(string, sizeof(string),"Virtual World: %d", GetPlayerVirtualWorld(giveplayerid));
  467.     SendClientMessage(playerid, -1, string);
  468.  
  469.     return 1;
  470. }
  471.  
  472. // PROCEDIMENTOS
  473.  
  474. stock SavePlayerData(playerid)
  475. {
  476.     PlayerData[playerid][armor] = GetPlayerArmourEx(playerid);
  477.     PlayerData[playerid][health] = GetPlayerHealthEx(playerid);
  478.     PlayerData[playerid][money] = GetPlayerMoney(playerid);
  479.     PlayerData[playerid][skin] = GetPlayerSkin(playerid);
  480.     PlayerData[playerid][interior] = GetPlayerInterior(playerid);
  481.     PlayerData[playerid][vw] = GetPlayerVirtualWorld(playerid);
  482.     PlayerData[playerid][score] = GetPlayerScore(playerid);
  483.     GetPlayerFacingAngle(playerid, PlayerData[playerid][angulo]);
  484.     GetPlayerPos(playerid,
  485.     PlayerData[playerid][posX],
  486.     PlayerData[playerid][posY],
  487.     PlayerData[playerid][posZ]);
  488.  
  489.     orm_update(PlayerData[playerid][ormid]);
  490. }
  491.  
  492. stock SetPlayerData(playerid)
  493. {
  494.     SetPlayerScore(playerid, PlayerData[playerid][score]);
  495.     SetPlayerHealth(playerid, PlayerData[playerid][health]);
  496.     SetPlayerArmour(playerid, PlayerData[playerid][armor]);
  497.     GivePlayerMoney(playerid, PlayerData[playerid][money]);
  498.     SetPlayerInterior(playerid, PlayerData[playerid][interior]);
  499.     SetPlayerVirtualWorld(playerid, PlayerData[playerid][vw]);
  500. }
  501.  
  502. stock LoadPlayerData(playerid)
  503. {
  504.     PlayerData[playerid][logado] = false;
  505.     format(PlayerData[playerid][nome], MAX_PLAYER_NAME, "%s", GetPlayerNameEx(playerid));
  506.  
  507.     PlayerData[playerid][ormid] = orm_create("Player", DBConn);
  508.  
  509.     orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][accid], "id");
  510.     orm_addvar_string(PlayerData[playerid][ormid], PlayerData[playerid][nome], MAX_PLAYER_NAME, "nome");
  511.     orm_addvar_string(PlayerData[playerid][ormid], PlayerData[playerid][senha], MAX_PASS_LEN, "senha");
  512.     orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][admin], "admin");
  513.     orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][posX], "posX");
  514.     orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][posY], "posY");
  515.     orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][posZ], "posZ");
  516.     orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][angulo], "angulo");
  517.     orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][health], "health");
  518.     orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][armor], "armor");
  519.     orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][money], "dinheiro");
  520.     orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][score], "score");
  521.     orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][skin], "skin");
  522.     orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][interior], "interior");
  523.     orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][vw], "vw");
  524.     orm_addvar_string(PlayerData[playerid][ormid], PlayerData[playerid][pSalt], SALT_LEN, "salt");
  525.  
  526.     orm_setkey(PlayerData[playerid][ormid], "nome");
  527.     orm_select(PlayerData[playerid][ormid], "OnPlayerLogin", "d", playerid);
  528. }
  529.  
  530. stock LoadDBSettings(filename[])
  531. {
  532.     //new host[16], username[MAX_PLAYER_NAME], database[MAX_PLAYER_NAME], pass[16];
  533.     if(DOF2_FileExists(filename))
  534.     {
  535.         format(host, sizeof(host), "%s", DOF2_GetString(filename,"address"));
  536.         format(username, sizeof(username), "%s", DOF2_GetString(filename,"username"));
  537.         format(database, sizeof(database), "%s", DOF2_GetString(filename,"database"));
  538.         format(pass, sizeof(pass), "%s", DOF2_GetString(filename,"password"));
  539.     }
  540.     else
  541.     {
  542.         DOF2_CreateFile(filename);
  543.         DOF2_SetString(filename,"address","127.0.0.1");
  544.         DOF2_SetString(filename,"username","root");
  545.         DOF2_SetString(filename,"database", " ");
  546.         DOF2_SetString(filename,"password", " ");
  547.         DOF2_SaveFile();
  548.     }
  549. }
  550.  
  551. stock Salt()
  552. {
  553.     new salt[SALT_LEN];
  554.     for(new i; i < SALT_LEN-1; i++)
  555.         salt[i] = random(79) + 47;
  556.     salt[SALT_LEN-1] = 0;
  557.     return salt;
  558. }
  559.  
  560. stock GetPlayerNameEx(playerid)
  561. {
  562.     new PlayerName[MAX_PLAYER_NAME];
  563.     GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
  564.     return PlayerName;
  565. }
  566.  
  567. function Float:GetPlayerHealthEx(playerid)
  568. {
  569.     new Float:playerhealth;
  570.     GetPlayerHealth(playerid, playerhealth);
  571.     return playerhealth;
  572. }
  573.  
  574. function Float:GetPlayerArmourEx(playerid)
  575. {
  576.     new Float:playerarmor;
  577.     GetPlayerArmour(playerid, playerarmor);
  578.     return playerarmor;
  579. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement