· 3 years ago · Oct 06, 2022, 12:40 AM
1/*
2
3Sistema básico de salvamento de dados em SQLite no SA-MP.
4
5O sistema é simples e salva as seguintes informações: ID Fixo, nome, senha, IP, skin, dinheiro, nivel.
6OBS: Apenas tem o salvamento, a parte simples que é anexar isso em sua gamemode fica por sua parte.
7
8Pode usar? Pode, portanto eu recomendo que você estude e crie um do zero pra si com suas mãos etc...
9
10
11O sistema cria automaticamente a database que ficará localizada em 'scriptfiles/database.db' que também poderá ser acessada através de um DB Browser.
12
13by: Carlos Victor#6045
14-> Eu não coloquei o sistema em prática, mas visualmente é funcional, só basta uma adaptação.
15
16*/
17
18#include <a_samp>
19
20enum
21{
22 dialog_register,
23 dialog_login
24};
25
26enum E_PLAYER
27{
28 E_ID,
29 E_NAME[24],
30 E_PASSWORD[32],
31 E_IP[16],
32 E_SKIN,
33 E_MONEY,
34 E_SCORE,
35
36 E_WRONG,
37 bool:E_LOGGED
38};
39new E_DATA[MAX_PLAYERS][E_PLAYER];
40
41new DB:database;
42
43main(){}
44
45public OnGameModeInit()
46{
47 if((database = db_open("database.db")) == DB:0)
48 {
49 print("Falha ao conectar com o banco de dados.");
50 }
51 else
52 {
53 print("Sucesso ao conectar com o banco de dados.");
54
55 db_free_result(db_query(database, "CREATE TABLE IF NOT EXISTS `accounts`(\
56 `id` INTEGER PRIMARY KEY AUTOINCREMENT,\
57 `name` TEXT NOT NULL,\
58 `password` TEXT NOT NULL,\
59 `ip` TEXT NOT NULL,\
60 `skin` INTEGER DEFAULT 60,\
61 `money` INTEGER DEFAULT 250,\
62 `score` INTEGER DEFAULT 0)"));
63 }
64 return 1;
65}
66
67public OnGameModeExit()
68{
69 db_close(database);
70 return 1;
71}
72
73public OnPlayerRequestClass(playerid, classid)
74{
75 SetSpawnInfo(playerid, NO_TEAM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
76 SpawnPlayer(playerid);
77
78 TogglePlayerSpectating(playerid, true);
79 return 1;
80}
81
82public OnPlayerConnect(playerid)
83{
84 GetPlayerName(playerid, E_DATA[playerid][E_NAME], 24);
85 GetPlayerIp(playerid, E_DATA[playerid][E_IP], 16);
86
87 SetTimerEx("OnPlayerMessage", 100, false, "i", playerid);
88 return 1;
89}
90
91public OnPlayerDisconnect(playerid, reason)
92{
93 destroyAllPlayerTextDraw(playerid);
94
95 saveData(playerid);
96 return 1;
97}
98
99function OnPlayerMessage(playerid)
100{
101 clearChat(playerid);
102 SendClientMessage(playerid, -1, "* Carregando informações, aguarde...");
103
104 SetTimerEx("OnLoadingScreen", 1000 * 2, false, "i", playerid);
105 return 1;
106}
107
108function OnLoadingScreen(playerid)
109{
110 new query[90];
111 format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `name`='%q'", E_DATA[playerid][E_NAME]);
112
113 new DBResult:result = db_query(database, query);
114 if(db_num_rows(result))
115 {
116 db_get_field_assoc(result, "password", E_DATA[playerid][E_PASSWORD], 32);
117 E_DATA[playerid][E_ID] = db_get_field_assoc_int(result, "id");
118
119 ShowPlayerDialog(playerid, dialog_login, DIALOG_STYLE_PASSWORD, "Entrando...", "{FFFFFF}Sua conta está {90EE90}REGISTRADA {FFFFFF}no servidor, digite sua senha no campo abaixo:", "Confirmar", "X");
120 }
121 else
122 {
123 ShowPlayerDialog(playerid, dialog_register, DIALOG_STYLE_INPUT, "Entrando...", "{FFFFFF}Sua conta não está {FF6347}REGISTRADA {FFFFFF}no servidor, portanto digite uma senha de 6-32 caracateres no campo abaixo:", "Confirmar", "X");
124 }
125 db_free_result(result);
126 return 1;
127}
128
129public OnPlayerSpawn(playerid)
130{
131 SetPlayerSkin(playerid, E_DATA[playerid][E_SKIN]);
132
133 SetPlayerPos(playerid, 1088.2767, 1074.3389, 10.8382);
134 SetPlayerFacingAngle(playerid, 126.0655);
135 return 0;
136}
137
138public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
139{
140 switch(dialogid)
141 {
142 case dialog_register:
143 {
144 if(!response)
145 return Kick(playerid);
146
147 if(!strlen(inputtext))
148 return ShowPlayerDialog(playerid, dialog_register, DIALOG_STYLE_INPUT, "Entrando...", "{FFFFFF}Sua conta não está {FF6347}REGISTRADA {FFFFFF}no servidor, portanto digite uma senha de 6-32 caracateres no campo abaixo:", "Confirmar", "X");
149
150 if(strlen(inputtext) < 6 || strlen(inputtext) > 32)
151 return ShowPlayerDialog(playerid, dialog_register, DIALOG_STYLE_INPUT, "Entrando...", "{FFFFFF}Sua conta não está {FF6347}REGISTRADA {FFFFFF}no servidor, portanto digite uma senha de 6-32 caracateres no campo abaixo:", "Confirmar", "X");
152
153 new query[256];
154 format(query, sizeof(query), "INSERT INTO `accounts`(name, password, ip) VALUES('%q', '%q', '%q')", E_DATA[playerid][E_NAME], inputtext, E_DATA[playerid][E_IP]);
155 db_query(database, query);
156
157 loadData(playerid);
158 }
159 case dialog_login:
160 {
161 if(!response)
162 return Kick(playerid);
163
164 if(!strlen(inputtext))
165 return ShowPlayerDialog(playerid, dialog_login, DIALOG_STYLE_PASSWORD, "Entrando...", "{FFFFFF}Sua conta está {90EE90}REGISTRADA {FFFFFF}no servidor, digite sua senha no campo abaixo:", "Confirmar", "X");
166
167 if(!strcmp(E_DATA[playerid][E_PASSWORD], inputtext, true))
168 {
169 loadData(playerid);
170 }
171 else
172 {
173 ShowPlayerDialog(playerid, dialog_login, DIALOG_STYLE_PASSWORD, "Entrando...", "{FFFFFF}Sua conta está {90EE90}REGISTRADA {FFFFFF}no servidor, digite sua senha no campo abaixo:", "Confirmar", "X");
174
175 E_DATA[playerid][E_WRONG]++;
176 SendErrorMessage(playerid, "Você errou sua senha, portanto possui %d tentativas restantes.", 4 - E_DATA[playerid][E_WRONG]);
177
178 if(E_DATA[playerid][E_WRONG] >= 4)
179 return Kick(playerid);
180 }
181 }
182 }
183 return 1;
184}
185
186stock loadData(playerid)
187{
188 TogglePlayerSpectating(playerid, false);
189
190 clearChat(playerid);
191
192 new query[140], DBResult:result;
193 format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `name`='%q'", E_DATA[playerid][E_NAME]);
194
195 result = db_query(database, query);
196
197 E_DATA[playerid][E_LOGGED] = true;
198
199 E_DATA[playerid][E_SKIN] = db_get_field_assoc_int(result, "skin");
200 E_DATA[playerid][E_MONEY] = db_get_field_assoc_int(result, "money");
201 E_DATA[playerid][E_SCORE] = db_get_field_assoc_int(result, "score");
202
203 db_free_result(result);
204
205 SetPlayerSkin(playerid, E_DATA[playerid][E_SKIN]);
206 GivePlayerMoney(playerid, E_DATA[playerid][E_MONEY]);
207 SetPlayerColor(playerid, 0xFFFFFFFF);
208
209 SendClientMessage(playerid, -1, "* Seus dados foram carregados com sucesso.");
210 return 1;
211}
212
213stock saveData(playerid)
214{
215 if(!E_DATA[playerid][E_LOGGED])
216 return 1;
217
218 new query[140];
219 format(query, sizeof(query), "UPDATE `accounts` SET \
220 `ip`='%q',\
221 `skin`='%d',\
222 `money`='%d',\
223 `score`='%d' WHERE `id`='%d'",
224 E_DATA[playerid][E_IP],
225 E_DATA[playerid][E_ADMIN],
226 E_DATA[playerid][E_SKIN],
227 E_DATA[playerid][E_MONEY],
228 E_DATA[playerid][E_SCORE],
229 E_DATA[playerid][E_KILLS],
230 E_DATA[playerid][E_FIGHT],
231 E_DATA[playerid][E_DEATH],
232 E_DATA[playerid][E_ID]);
233
234 db_free_result(db_query(database, query));
235
236 resetData(playerid);
237 return 1;
238}
239
240stock resetData(playerid)
241{
242 new dummy[E_PLAYER];
243 E_DATA[playerid] = dummy;
244 return 1;
245}
246
247stock clearChat(playerid)
248{
249 for(new i; i != 30; i++)
250 SendClientMessage(playerid, -1, " ");
251
252 return 1;
253}
254