Advertisement
cL_

SQLite² SA-MP

cL_
Oct 23rd, 2022
2,259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.04 KB | Science | 0 0
  1. /*
  2.  
  3. Esse projeto foi criado dia 22/10/2022, iniciado as 14h e finalizado as 18h.
  4.  
  5. Foi criado por Carlos Victor(Carlos Victor#6045), dada iniciativa para iniciantes na linguagem aprenderem ou estudarem a linguagem SQL, e...
  6. principalmente SQLite, algo que está esquecido no SA:MP e funciona muito bem!
  7.  
  8. Você pode usar esse código para o que quiser, seja iniciar um servidor, modificar, alterar, enfim faça o que quiser.
  9.  
  10. Programas para acessar arquivos .db: DB Browser (SQLite)  -- (Eu acredito que seja apenas para computador.)
  11.  
  12. Informações que são salvadas:
  13.  
  14. ID          - ID fixo, de acordo com a função AUTOINCREMENT
  15. Name        - Nome do jogador, variável usada para evitar o consumo de memória em funções que sempre criam variáveis.
  16. Password    - Senha do jogador.
  17. IP          - Atual IP do jogador.
  18.  
  19. Skin        - A roupa(skin) do jogador.
  20. Money       - O dinheiro do jogador.
  21. Score       - O level do jogador
  22.  
  23. Pos[1], [2], [3], [4] - As posições x, y, z, a(angle) do jogador.
  24.  
  25. Caso você queira adicionar novas colunas de salvamento, siga o padrão já criado
  26.  
  27. Boa sorte.
  28. */
  29.  
  30. #include <a_samp>
  31.  
  32. #define MAX_LENGHT_PASS     (32)
  33. #define MAX_LENGHT_IP       (16)
  34.  
  35. enum {
  36.     dialog_unknown,
  37.     dialog_login,
  38.     dialog_register,
  39.     dialog_skin
  40. };
  41.  
  42. enum e_InfoPlayer {
  43.     e_ID,
  44.     e_Name[MAX_PLAYER_NAME + 1],
  45.     e_Password[MAX_LENGHT_PASS + 1],
  46.     e_IP[MAX_LENGHT_IP + 1],
  47.  
  48.     e_Skin,
  49.     e_Money,
  50.     e_Score,
  51.  
  52.     Float:e_Pos[4],
  53.  
  54.     e_Wrong,
  55.     bool:e_Logged
  56. };
  57. new e_Info[MAX_PLAYERS][e_InfoPlayer];
  58. new DB:db;
  59.  
  60. #define SERVER_NAME     "hostname       Server Login/Register in SQLite."
  61. #define SERVER_MODE     "gamemodetext   Freeroam, v0.1 BETA"
  62. #define SERVER_LANGUAGE "language       Português Brasil"
  63.  
  64. main(){}
  65.  
  66. public OnGameModeInit() {
  67.     SendRconCommand(SERVER_NAME);
  68.     SendRconCommand(SERVER_MODE);
  69.     SendRconCommand(SERVER_LANGUAGE);
  70.  
  71.     if((db = db_open("database.db")) == DB:0) {
  72.         print("[ERRO] Falha ao tentar abrir a database.");
  73.         SendRconCommand("exit");
  74.     }
  75.     else {
  76.         print("[SERVER] Sucesso ao tentar abrir a database.");
  77.  
  78.         /*
  79.            
  80.             Essa função cria a tabela 'contas' caso ela não esteja criada e insere as colunas id, name, password...
  81.    
  82.         */
  83.         db_free_result(db_query(db, "CREATE TABLE IF NOT EXISTS `contas`(\
  84.             `id` INTEGER PRIMARY KEY AUTOINCREMENT,\
  85.             `name` TEXT NOT NULL,\
  86.             `password` TEXT NOT NULL,\
  87.             `ip` TEXT DEFAULT '127.0.0.1',\
  88.             `skin` INTEGER NOT NULL,\
  89.             `money` INTEGER DEFAULT 600,\
  90.             `score` INTEGER DEFAULT 0,\
  91.             `posX` REAL DEFAULT 1223.8545,\
  92.             `posY` REAL DEFAULT -1814.2209,\
  93.             `posZ` REAL DEFAULT 16.5961,\
  94.             `posA` REAL DEFAULT 180.5629);"));
  95.     }
  96.     return 1;
  97. }
  98.  
  99. public OnGameModeExit() {
  100.     db_close(db);
  101.     return 1;
  102. }
  103.  
  104. public OnPlayerConnect(playerid) {
  105.     GetPlayerName(playerid, e_Info[playerid][e_Name], MAX_PLAYER_NAME + 1);
  106.     GetPlayerIp(playerid, e_Info[playerid][e_IP], MAX_LENGHT_IP + 1);
  107.  
  108.     TogglePlayerSpectating(playerid, true);
  109.     SetTimerEx("OnShowLogin", 1000 * 2, false, "i", playerid);
  110.     return 1;
  111. }
  112.  
  113. forward OnShowLogin(playerid);
  114. public OnShowLogin(playerid) {
  115.     static
  116.         DBResult:result,
  117.         query[64];
  118.  
  119.     format(query, sizeof(query), "SELECT * FROM `contas` WHERE `name`='%q';", e_Info[playerid][e_Name]);
  120.     result = db_query(db, query);
  121.  
  122.     if(db_num_rows(result)) {
  123.         db_get_field_assoc(result, "password", e_Info[playerid][e_Password], MAX_LENGHT_PASS + 1);
  124.         e_Info[playerid][e_ID] = db_get_field_assoc_int(result, "id");
  125.  
  126.         ShowPlayerDialog(playerid, dialog_login, DIALOG_STYLE_PASSWORD, "Conectando-se...", "Insira sua senha para logar:", "Confirmar", "X");
  127.     }
  128.     else {
  129.         ShowPlayerDialog(playerid, dialog_register, DIALOG_STYLE_INPUT, "Conectando-se...", "Insira uma senha para logar:", "Confirmar", "X");
  130.     }
  131.  
  132.     clearChat(playerid);
  133.     SendClientMessage(playerid, -1, "* Seja bem-vindo(a) ao servidor, faça o login ou registro para conectar-se.");
  134.     return 1;
  135. }
  136.  
  137. public OnPlayerDisconnect(playerid, reason) {
  138.     Save_Player(playerid);
  139.     Reset_Player(playerid);
  140.     return 1;
  141. }
  142.  
  143. public OnPlayerSpawn(playerid) {
  144.     SetPlayerSkin(playerid, e_Info[playerid][e_Skin]);
  145.     return 1;
  146. }
  147.  
  148. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
  149.     switch(dialogid) {
  150.         case dialog_login: {
  151.             if(!response) {
  152.                 Kick(playerid);
  153.             }
  154.             if(response) {
  155.                 if(!strlen(inputtext))
  156.                     return ShowPlayerDialog(playerid, dialog_login, DIALOG_STYLE_PASSWORD, "Conectando-se...", "ERRO: Insira algo na box.\nInsira sua senha para logar:", "Confirmar", "X");
  157.  
  158.                 if(!strcmp(e_Info[playerid][e_Password], inputtext, true)) {
  159.                     TogglePlayerSpectating(playerid, false);
  160.                     clearChat(playerid);
  161.  
  162.                     Load_Player(playerid);
  163.                 }
  164.                 else {
  165.                     ShowPlayerDialog(playerid, dialog_login, DIALOG_STYLE_PASSWORD, "Conectando-se...", "ERRO: Senha incorreta.\nInsira sua senha para logar:", "Confirmar", "X");
  166.  
  167.                     e_Info[playerid][e_Wrong]++;
  168.  
  169.                     if(e_Info[playerid][e_Wrong] >= 3)
  170.                         return Kick(playerid);
  171.                 }
  172.             }
  173.         }
  174.         case dialog_register: {
  175.             if(!response) {
  176.                 Kick(playerid);
  177.             }
  178.             if(response) {
  179.                 if(!strlen(inputtext))
  180.                     return ShowPlayerDialog(playerid, dialog_register, DIALOG_STYLE_INPUT, "Conectando-se...", "ERRO: Insira algo na box.\nInsira uma senha para logar:", "Confirmar", "X");
  181.  
  182.                 if(strlen(inputtext) < 6 || strlen(inputtext) > MAX_LENGHT_PASS)
  183.                     return ShowPlayerDialog(playerid, dialog_register, DIALOG_STYLE_INPUT, "Conectando-se...", "ERRO: Senha muito grande ou muito pequena!\nInsira uma senha para logar:", "Confirmar", "X");
  184.  
  185.                 format(e_Info[playerid][e_Password], MAX_LENGHT_PASS + 1, inputtext);
  186.  
  187.                 ShowPlayerDialog(playerid, dialog_skin, DIALOG_STYLE_INPUT, "Conectando-se...", "Insira o ID de uma skin:", "Confirmar", "X");
  188.             }
  189.         }
  190.         case dialog_skin: {
  191.             if(response) {
  192.                 if(!strval(inputtext))
  193.                     return ShowPlayerDialog(playerid, dialog_skin, DIALOG_STYLE_INPUT, "Conectando-se...", "ERRO: Insira algo na box.\nInsira o ID de uma skin:", "Confirmar", "X");
  194.  
  195.                 if(strval(inputtext) < 1 || strval(inputtext) > 311)
  196.                     return ShowPlayerDialog(playerid, dialog_skin, DIALOG_STYLE_INPUT, "Conectando-se...", "ERRO: O ID da skin deve ser entre 1-311.\nInsira o ID de uma skin:", "Confirmar", "X");
  197.  
  198.                 e_Info[playerid][e_Skin] = strval(inputtext);
  199.  
  200.                 Create_Player(playerid, e_Info[playerid][e_Name], e_Info[playerid][e_Password], e_Info[playerid][e_Skin]);
  201.             }
  202.         }
  203.     }
  204.     return 1;
  205. }
  206.  
  207. Create_Player(playerid, const name[], const password[], skin) {
  208.     static
  209.         query[128];
  210.  
  211.     format(query, sizeof(query), "INSERT INTO `contas`(name, password, skin) VALUES('%q', '%q', '%d');", name, password, skin);
  212.     db_free_result(db_query(db, query));
  213.  
  214.     SetTimerEx("OnShowLogin", 1000, false, "i", playerid);
  215.     return (printf("[SERVER] Os dados do jogador %s(ID: %d) foi inserido na tabela com sucesso.", GetName(playerid), playerid));
  216. }
  217.  
  218. Load_Player(playerid) {
  219.     static
  220.         DBResult:result,
  221.         query[64];
  222.  
  223.     format(query, sizeof(query), "SELECT * FROM `contas` WHERE `id`='%d'", e_Info[playerid][e_ID]);
  224.     result = db_query(db, query);
  225.  
  226.     if(db_num_rows(result)) {      
  227.         e_Info[playerid][e_Logged]      = true;
  228.         e_Info[playerid][e_Wrong]       = 0;
  229.  
  230.         e_Info[playerid][e_Skin]        = db_get_field_assoc_int(result, "skin");
  231.         e_Info[playerid][e_Money]       = db_get_field_assoc_int(result, "money");
  232.         e_Info[playerid][e_Score]       = db_get_field_assoc_int(result, "score");
  233.  
  234.         e_Info[playerid][e_Pos][0]      = db_get_field_assoc_float(result, "posX");
  235.         e_Info[playerid][e_Pos][1]      = db_get_field_assoc_float(result, "posY");
  236.         e_Info[playerid][e_Pos][2]      = db_get_field_assoc_float(result, "posZ");
  237.         e_Info[playerid][e_Pos][3]      = db_get_field_assoc_float(result, "posA");
  238.  
  239.         GivePlayerMoney(playerid, e_Info[playerid][e_Money]);
  240.         SetPlayerScore(playerid, e_Info[playerid][e_Score]);
  241.  
  242.         SetSpawnInfo(playerid, NO_TEAM, e_Info[playerid][e_Skin], e_Info[playerid][e_Pos][0], e_Info[playerid][e_Pos][1], e_Info[playerid][e_Pos][2], e_Info[playerid][e_Pos][3], 0, 0, 0, 0, 0, 0);
  243.         SpawnPlayer(playerid);
  244.     }
  245.  
  246.     db_free_result(result);
  247.     return (printf("[SERVER] Os dados do jogador %s(ID: %d) foi carregado com sucesso.", GetName(playerid), playerid));
  248. }
  249.  
  250. Save_Player(playerid) {
  251.     static
  252.         query[256];
  253.  
  254.     GetPlayerPos(playerid, e_Info[playerid][e_Pos][0], e_Info[playerid][e_Pos][1], e_Info[playerid][e_Pos][2]);
  255.     GetPlayerFacingAngle(playerid, e_Info[playerid][e_Pos][3]);
  256.  
  257.     format(query, sizeof(query), "UPDATE `contas` SET \
  258.         `ip`='%q',\
  259.         `skin`='%d',\
  260.         `money`='%d',\
  261.         `score`='%d',\
  262.         `posX`='%f',\
  263.         `posY`='%f',\
  264.         `posZ`='%f',\
  265.         `posA`='%f' WHERE `id`='%d'",
  266.                                     e_Info[playerid][e_IP],
  267.                                     e_Info[playerid][e_Skin],
  268.                                     e_Info[playerid][e_Money],
  269.                                     e_Info[playerid][e_Score],
  270.                                     e_Info[playerid][e_Pos][0],
  271.                                     e_Info[playerid][e_Pos][1],
  272.                                     e_Info[playerid][e_Pos][2],
  273.                                     e_Info[playerid][e_Pos][3],
  274.                                     e_Info[playerid][e_ID]);
  275.  
  276.     db_free_result(db_query(db, query));
  277.     return (printf("[SERVER] Os dados do jogador %s(ID: %d) foi salvo com sucesso.", GetName(playerid), playerid));
  278. }
  279.  
  280. Reset_Player(playerid) {
  281.     e_Info[playerid][e_ID]              = 0;
  282.     e_Info[playerid][e_Name]            = EOS;
  283.     e_Info[playerid][e_Password]        = EOS;
  284.     e_Info[playerid][e_IP]              = EOS;
  285.  
  286.     e_Info[playerid][e_Skin]            = 0;
  287.     e_Info[playerid][e_Money]           = 0;
  288.     e_Info[playerid][e_Score]           = 0;
  289.  
  290.     e_Info[playerid][e_Pos][0]          = 0.0;
  291.     e_Info[playerid][e_Pos][1]          = 0.0;
  292.     e_Info[playerid][e_Pos][2]          = 0.0;
  293.     e_Info[playerid][e_Pos][3]          = 0.0;
  294.  
  295.     e_Info[playerid][e_Wrong]           = 0;
  296.     e_Info[playerid][e_Logged]          = false;
  297.  
  298.     return (printf("[SERVER] Os dados do jogador %s(ID: %d) foram resetados com sucesso.", GetName(playerid), playerid));
  299. }
  300.  
  301. clearChat(playerid) {
  302.     for(new i = 0; i < 60; i++)
  303.         SendClientMessage(playerid, -1, " ");
  304.  
  305.     return 1;
  306. }
  307.  
  308. GetName(playerid, underline = 1) {
  309.     static
  310.         sub[MAX_PLAYER_NAME + 1];
  311.  
  312.     format(sub, sizeof(sub), e_Info[playerid][e_Name]);
  313.  
  314.     if(!underline)
  315.         strreplace(sub, '_', ' ');
  316.  
  317.     return (sub);
  318. }
  319.  
  320. stock strreplace(string[], find, replace) {
  321.     for(new i = 0; string[i]; i++) {
  322.         if(string[i] == find) {
  323.             string[i] = replace;
  324.         }
  325.     }
  326. }
  327.  
Tags: pawn
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement