· 2 years ago · Oct 23, 2022, 08:40 AM
1/*
2
3Esse projeto foi criado dia 22/10/2022, iniciado as 14h e finalizado as 18h.
4
5Foi criado por Carlos Victor(Carlos Victor#6045), dada iniciativa para iniciantes na linguagem aprenderem ou estudarem a linguagem SQL, e...
6principalmente SQLite, algo que está esquecido no SA:MP e funciona muito bem!
7
8Você pode usar esse código para o que quiser, seja iniciar um servidor, modificar, alterar, enfim faça o que quiser.
9
10Programas para acessar arquivos .db: DB Browser (SQLite) -- (Eu acredito que seja apenas para computador.)
11
12Informações que são salvadas:
13
14ID - ID fixo, de acordo com a função AUTOINCREMENT
15Name - Nome do jogador, variável usada para evitar o consumo de memória em funções que sempre criam variáveis.
16Password - Senha do jogador.
17IP - Atual IP do jogador.
18
19Skin - A roupa(skin) do jogador.
20Money - O dinheiro do jogador.
21Score - O level do jogador
22
23Pos[1], [2], [3], [4] - As posições x, y, z, a(angle) do jogador.
24
25Caso você queira adicionar novas colunas de salvamento, siga o padrão já criado
26
27Boa sorte.
28*/
29
30#include <a_samp>
31
32#define MAX_LENGHT_PASS (32)
33#define MAX_LENGHT_IP (16)
34
35enum {
36 dialog_unknown,
37 dialog_login,
38 dialog_register,
39 dialog_skin
40};
41
42enum 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};
57new e_Info[MAX_PLAYERS][e_InfoPlayer];
58new 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
64main(){}
65
66public 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
99public OnGameModeExit() {
100 db_close(db);
101 return 1;
102}
103
104public 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
113forward OnShowLogin(playerid);
114public 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
137public OnPlayerDisconnect(playerid, reason) {
138 Save_Player(playerid);
139 Reset_Player(playerid);
140 return 1;
141}
142
143public OnPlayerSpawn(playerid) {
144 SetPlayerSkin(playerid, e_Info[playerid][e_Skin]);
145 return 1;
146}
147
148public 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
207Create_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
218Load_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
250Save_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
280Reset_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
301clearChat(playerid) {
302 for(new i = 0; i < 60; i++)
303 SendClientMessage(playerid, -1, " ");
304
305 return 1;
306}
307
308GetName(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
320stock 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