· 8 years ago · Jul 06, 2018, 01:22 PM
1//=============CREDITS ZBSAMP
2//=============PREVEO TE ISPRAVIO GRESKE IVAN
3//(INCLUDE)
4#include <a_samp>
5#include <a_mysql>
6#include <zcmd>
7#include <sscanf2>
8
9//(DEFINEOVI=
10#define MYSQL_HOST "localhost"
11#define MYSQL_USER "root"
12#define MYSQL_PASS ""
13#define MYSQL_DATA "databaza"
14
15#define Dialog_Login (0)
16#define Dialog_Register (1)
17#pragma tabsize 0
18//(NEW)
19new MySQL: handle;
20//(ENUMATORI)
21enum PLAYER_DATA{
22 SQLID,
23 Password[65],
24 Salt[11],
25 RegDate[65],
26 Money,
27 Level,
28 Skin
29}
30
31new PlayerData[MAX_PLAYERS][PLAYER_DATA];
32//(PUBLIC)
33public OnGameModeInit()
34{
35 handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATA);
36 if(mysql_errno(handle) != 0 || handle == MYSQL_INVALID_HANDLE)
37 {
38 print("Konekcija sa databazom nije uspesna, pogledajte da li su sve informacije ispravne.");
39 SendRconCommand("exit");
40 return 1;
41 }
42
43 // CREATE TABLE (kreiranje tabele baze podataka)
44 // IF NOT EXISTS (ako postoje vec tablice, ne moramo da ih kreiramo.)
45 mysql_tquery(handle, "CREATE TABLE IF NOT EXISTS `players` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(24) NOT NULL , `password` VARCHAR(65) NOT NULL , `salt` VARCHAR(11) NOT NULL, `regdate` DATETIME NOT NULL , PRIMARY KEY (`id`))");
46 return 1;
47}
48
49public OnGameModeExit()
50{
51 mysql_close(handle);
52 return 1;
53}
54
55public OnPlayerRequestClass(playerid, classid)
56{
57 SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
58 SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
59 SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
60 return 1;
61}
62
63public OnPlayerConnect(playerid)
64{
65 // Query ce napraviti upit i pretrazivanje.
66
67 static
68 query[128],
69 name[MAX_PLAYER_NAME];
70
71 GetPlayerName(playerid, name, sizeof(name));
72
73 mysql_format(handle, query, sizeof(query), "SELECT * FROM `players` WHERE `name` = '%e' LIMIT 1", name);
74 mysql_tquery(handle, query, "CheckPlayerData", "i", playerid);
75 return 1;
76}
77
78public OnPlayerDisconnect(playerid, reason)
79{
80 // Query ce napraviti upit za update i sve ce sacuvati varijable kad izadjes sa servera.
81
82 static
83 query[128];
84
85 mysql_format(handle, query, sizeof(query), "UPDATE `players` SET `money` = '%d', `level` = '%d', `skin` = '%d' WHERE `id` = '%d'",
86 PlayerData[playerid][Money], PlayerData[playerid][Level], PlayerData[playerid][Skin], PlayerData[playerid][SQLID]);
87 mysql_tquery(handle, query);
88 return 1;
89}
90public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
91{
92 switch(dialogid)
93 {
94 case Dialog_Login:
95 {
96 if(!response) return Kick(playerid);
97
98 static
99 buf[65],
100 query[128],
101 name[MAX_PLAYER_NAME];
102
103 SHA256_PassHash(inputtext, PlayerData[playerid][Salt], buf, 65);
104
105 if(strcmp(buf, PlayerData[playerid][Password]) == 0)
106 {
107 // Password se podudara sa unesenim
108 // Sada treba da uzmemo ostale podatke
109
110 GetPlayerName(playerid, name, sizeof(name));
111
112 mysql_format(handle, query, sizeof(query), "SELECT * FROM `players` WHERE `name` = '%e' LIMIT 1", name);
113 mysql_tquery(handle, query, "OnAccountLoad", "i", playerid);
114
115 // sve smo zavrsili, u funkciji OnAccountLoad idemo dalje
116 }
117 else
118 {
119 // ukoliko lozinka nije ispravna vracamo dialog
120 ShowPlayerDialog(playerid, Dialog_Login, DIALOG_STYLE_PASSWORD, "Prijava", "Lozinka koju ste uneli nije ispravna, pokusajte ponovo:", "Dalje", "Izlaz");
121 }
122 }
123 case Dialog_Register:
124 {
125 if(!response) return Kick(playerid);
126
127 if(strlen(inputtext) < 6 || strlen(inputtext) > 20) // ako je lozinka kraca od 6 i duza od 20 karaktera vraca dialog
128 {
129 ShowPlayerDialog(playerid, Dialog_Register, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
130 return true;
131 }
132 // kao sto sam rekao salt je random generisan key, sada cemo ga random:
133 for (new i = 0; i < 10; i++)
134 {
135 PlayerData[playerid][Salt][i] = random(100) + 50;
136 }
137 PlayerData[playerid][Salt][10] = 0;
138 SHA256_PassHash(inputtext, PlayerData[playerid][Salt], PlayerData[playerid][Password], 65);
139
140 // sada unosimo u bazu podatke igraca
141 static
142 query[128],
143 name[MAX_PLAYER_NAME];
144
145 GetPlayerName(playerid, name, sizeof(name));
146
147 mysql_format(handle, query, sizeof(query), "INSERT INTO `players` (`name`, `password`, `salt`, `regdate`) VALUES ('%e', '%e', '%e', NOW())",
148 name, PlayerData[playerid][Password], PlayerData[playerid][Salt]);
149 mysql_tquery(handle, query, "OnPlayerRegister", "d", playerid);
150 }
151 }
152 return 1;
153}
154
155public OnPlayerClickPlayer(playerid, clickedplayerid, source)
156{
157 return 1;
158}
159//(KOMANDE)
160COMMAND:givemoney(playerid, params[])
161{
162 // Napravimo varijable
163 // static zauzima manje prostora memorija od new-a
164 static
165 id,
166 money,
167 query[128];
168
169 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "Nisi RCON Admin!");
170 if(sscanf(params, "ui", id, money)) return SendClientMessage(playerid, -1, "Koristi: /givemoney [playerid] [money]");
171
172 PlayerData[id][Money] += money;
173 GivePlayerMoney(id, money);
174
175 // Napravimo nove upite da updatujemo novac igracima u databazu.
176 mysql_format(handle, query, sizeof(query), "UPDATE `players` SET `money` = '%d' WHERE `id` = '%d'", PlayerData[id][Money], PlayerData[id][SQLID]);
177 mysql_tquery(handle, query);
178 return 1;
179}
180//(FORWARDOVI)
181forward CheckPlayerData(playerid);
182public CheckPlayerData(playerid)
183{
184 if(cache_num_rows() > 0)
185 {
186 // cache_num_rows > 0 znaci da u tablici postoji bar jedan rezultat sa tim imenom
187 // sada cemo uzimati password iz tablice i posaljemo igraca na prijavu
188
189 cache_get_value(0, "password", PlayerData[playerid][Password], 65);
190 cache_get_value(0, "salt", PlayerData[playerid][Salt], 11);
191
192 ShowPlayerDialog(playerid, Dialog_Login, DIALOG_STYLE_PASSWORD, "Prijava", "Vas racun je pronadjen, molimo vas upisite lozinku da se prijavite:", "Dalje", "Izlaz");
193 }
194 else
195 {
196 ShowPlayerDialog(playerid, Dialog_Register, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
197 }
198 return 1;
199}
200forward OnAccountLoad(playerid);
201public OnAccountLoad(playerid)
202{
203 if(cache_num_rows() > 0)
204 {
205 cache_get_value_int(0, "id", PlayerData[playerid][SQLID]);
206 cache_get_value(0, "regdate", PlayerData[playerid][RegDate], 65);
207
208 cache_get_value_int(0, "money", PlayerData[playerid][Money]);
209 GivePlayerMoney(playerid, PlayerData[playerid][Money]);
210
211 cache_get_value_int(0, "level", PlayerData[playerid][Level]);
212 SetPlayerScore(playerid, PlayerData[playerid][Level]);
213
214 // ovde cemo napraviti spawn, skin, novac i dalje nove varijable...
215 // cache_get_value_float za koordinate..
216 // cache_get_value za datum ili slova..
217
218 printf("SQLID: %d | Register date: %s", PlayerData[playerid][SQLID], PlayerData[playerid][RegDate]);
219
220 SendClientMessage(playerid, -1, "Dobrodosli nazad.");
221 }
222 return 1;
223}
224forward OnPlayerRegister(playerid);
225public OnPlayerRegister(playerid)
226{
227 PlayerData[playerid][SQLID] = cache_insert_id(); // uzimamo id igraca koji je unesen u bazu
228 SendClientMessage(playerid, -1, "Registrovali ste se na server.");
229 return 1;
230}