· 10 years ago · Sep 05, 2016, 04:10 AM
1// Dynamic Bank System
2// Scripted & Designed by Ne[X]oR - Niv
3// Based on MySQL
4// -------------
5// MySQL Defines
6#include <a_mysql>
7#define mysql_host "localhost"
8#define mysql_user "root"
9#define mysql_pass ""
10#define mysql_db "bank"
11static mysql;
12// Defines
13#define MAX_ATMs 50
14#define REQUIRE_POSITION (1)
15#define RESET_ON_DEATH (1)
16#define ATM_OBJECT (19324)
17#define COLOR_LIGHTGREEN 0x00FF00FF
18#define COLOR_RED 0xFF0000FF
19#define FILTERSCRIPT
20// Includes
21#include <a_samp>
22#include <foreach>
23#include <zcmd>
24#include <sscanf2>
25// Variables
26enum bInfo
27{
28 bLogged = 0,
29 bIP[16],
30 bPass[128],
31 bMoney,
32 bCash
33}
34new PlayerInfo[MAX_PLAYERS][bInfo];
35enum aInfo
36{
37 Float:xPos,
38 Float:yPos,
39 Float:zPos,
40 Float:rPos
41}
42new ATMInfo[MAX_ATMs+1][aInfo];
43new ATM[MAX_ATMs+1];
44new Editing[MAX_PLAYERS];
45// Publics
46#if defined FILTERSCRIPT
47public OnFilterScriptInit()
48{
49 print("\n--------------------------------------");
50 print(" NexBank - Dynamic Bank System by Ne[X]oR is now loading.");
51 print("--------------------------------------\n");
52 mysql = mysql_connect(mysql_host, mysql_user, mysql_db, mysql_pass);
53 mysql_log(LOG_ALL);
54 if(mysql_errno(mysql) != 0) print("NexBank: Can't access MySQL database, Loading has failed.");
55 else print("NexBank Filterscript has been loaded successfully.");
56 // User Table Creation
57 mysql_tquery(mysql, "CREATE TABLE IF NOT EXISTS `Users` ( "\
58 "`Username` varchar(24) NOT NULL," \
59 "`Password` varchar(128) NOT NULL," \
60 "`Money` int(1) NOT NULL," \
61 "`IP` varchar(16) NOT NULL," \
62 " PRIMARY KEY (`Username`)" \
63 ") ENGINE = InnoDB DEFAULT CHARSET = latin1");
64 // Load online users
65 foreach(new i : Player)
66 {
67 if(IsPlayerConnected(i))
68 {
69 new query[128];
70 mysql_format(mysql, query, sizeof(query), "SELECT * FROM `Users` WHERE `Username`='%e' LIMIT 1", RPN(i));
71 mysql_tquery(mysql, query, "BankCheck", "i", i);
72 }
73 }
74 // ATM Table Creation
75 mysql_tquery(mysql, "CREATE TABLE IF NOT EXISTS `ATMs` ( "\
76 "`ATMID` int(3) NOT NULL," \
77 "`xPos` float NOT NULL," \
78 "`yPos` float NOT NULL," \
79 "`zPos` float NOT NULL," \
80 "`rPos` float NOT NULL," \
81 " PRIMARY KEY (`ATMID`)" \
82 ") ENGINE = InnoDB DEFAULT CHARSET = latin1");
83 // ATM Loading
84 for(new i = 0; i <= MAX_ATMs; i++)
85 {
86 new query[128];
87 mysql_format(mysql, query, sizeof(query), "SELECT * From `ATMs` WHERE `ATMID`='%d' LIMIT 1", i);
88 mysql_tquery(mysql, query, "ATMLoad", "i", i);
89 }
90 SetTimer("MoneyCheck", 5000, 1);
91 return 1;
92}
93
94public OnFilterScriptExit()
95{
96 print(" Dynamic Bank System has been un-loaded.");
97 for(new idx = 0; idx <= MAX_ATMs; idx++) if(ATM[idx])
98 {
99 new query[128];
100 mysql_format(mysql, query, sizeof(query), "UPDATE `ATMs` SET `xPos`='%f', `yPos`='%f', `zPos`='%f', `rPos`='%f' WHERE `ATMID`='%d'", ATMInfo[idx][xPos], ATMInfo[idx][yPos], ATMInfo[idx][zPos], ATMInfo[idx][rPos], idx);
101 mysql_tquery(mysql, query);
102 DestroyObject(ATM[idx]);
103 ATM[idx] = 0;
104 ATMInfo[idx][xPos] = 0;
105 ATMInfo[idx][yPos] = 0;
106 ATMInfo[idx][zPos] = 0;
107 ATMInfo[idx][rPos] = 0;
108 }
109 print(" NexBank: ATMs saved successfully.");
110 foreach(new i : Player)
111 {
112 if(IsPlayerConnected(i))
113 {
114 new query[128];
115 mysql_format(mysql, query, sizeof(query), "UPDATE `Users` SET `Money`='%i' WHERE `Username`='%e'", PlayerInfo[i][bMoney], RPN(i));
116 mysql_tquery(mysql, query);
117 }
118 }
119 print(" NexBank: Users saved successfully.");
120 mysql_close(mysql);
121 return 1;
122}
123#endif
124forward BankCheck(playerid);
125public BankCheck(playerid)
126{
127 new rows, fields;
128 cache_get_data(rows, fields, mysql);
129 if(rows)
130 {
131 cache_get_field_content(0, "Password", PlayerInfo[playerid][bPass], mysql, 128);
132 cache_get_field_content(0, "IP", PlayerInfo[playerid][bIP], mysql, 16);
133 PlayerInfo[playerid][bMoney] = cache_get_field_content_int(0, "Money", mysql);
134 if(!strcmp(PlayerInfo[playerid][bIP], RPIP(playerid)))
135 {
136 PlayerInfo[playerid][bLogged] = 1;
137 SendClientMessage(playerid, COLOR_RED, "You have been automatically logged into your bank account.");
138 return 1;
139 }
140 else return SendClientMessage(playerid, COLOR_RED, "To log into your bank account please type /BLogin.");
141 }
142 else return SendClientMessage(playerid, COLOR_RED, "You are not registered to the Bank System, Register using /BRegister.");
143}
144
145forward ATMLoad(atmid);
146public ATMLoad(atmid)
147{
148 new rows, fields;
149 cache_get_data(rows, fields, mysql);
150 if(rows)
151 {
152 ATMInfo[atmid][xPos] = cache_get_field_content_float(0, "xPos");
153 ATMInfo[atmid][yPos] = cache_get_field_content_float(0, "yPos");
154 ATMInfo[atmid][zPos] = cache_get_field_content_float(0, "zPos");
155 ATMInfo[atmid][rPos] = cache_get_field_content_float(0, "rPos");
156 ATM[atmid] = CreateObject(ATM_OBJECT, ATMInfo[atmid][xPos], ATMInfo[atmid][yPos], ATMInfo[atmid][zPos], 0, 0, ATMInfo[atmid][rPos]);
157 }
158 return 1;
159}
160
161public OnPlayerConnect(playerid)
162{
163 new query[128];
164 mysql_format(mysql, query, sizeof(query), "SELECT * FROM `Users` WHERE `Username`='%e' LIMIT 1", RPN(playerid));
165 mysql_tquery(mysql, query, "BankCheck", "i", playerid);
166 return 1;
167}
168
169public OnPlayerDisconnect(playerid, reason)
170{
171 new query[128];
172 mysql_format(mysql, query, sizeof(query), "UPDATE `Users` SET `Money`='%i' WHERE `Username`='%e'", PlayerInfo[playerid][bMoney], RPN(playerid));
173 mysql_tquery(mysql, query);
174 PlayerInfo[playerid][bCash] = 0;
175 PlayerInfo[playerid][bMoney] = 0;
176 format(PlayerInfo[playerid][bPass], 128, "");
177 format(PlayerInfo[playerid][bIP], 16, "");
178 PlayerInfo[playerid][bLogged] = 0;
179 Editing[playerid] = 0;
180 CancelEdit(playerid);
181 return 1;
182}
183
184public OnPlayerDeath(playerid, killerid, reason)
185{
186 #if RESET_ON_DEATH == 1
187 GiveNexMoney(playerid, -GetPlayerMoney(playerid));
188 #endif
189 return 1;
190}
191
192public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
193{
194 return 1;
195}
196
197public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
198{
199 if(!response) for(new idx = 0; idx <= MAX_ATMs; idx++) if(ATM[idx] == objectid)
200 {
201 if(ATMInfo[idx][xPos] == 0)
202 {
203 DestroyObject(ATM[idx]);
204 ATM[idx] = 0;
205 Editing[playerid] = 0;
206 SendClientMessage(playerid, COLOR_RED, "You have cancelled the ATM edition, therefore the ATM has been deleted.");
207 return 1;
208 }
209 else
210 {
211 SendClientMessage(playerid, COLOR_RED, "You have cancelled the ATM edition, it was returned to it's original position.");
212 Editing[playerid] = 0;
213 SetObjectPos(ATM[idx], ATMInfo[idx][xPos], ATMInfo[idx][yPos], ATMInfo[idx][zPos]);
214 SetObjectRot(ATM[idx], 0, 0, ATMInfo[idx][rPos]);
215 return 1;
216 }
217 }
218 if(response == 1) for(new idx = 0; idx <= MAX_ATMs; idx++) if(ATM[idx] == objectid)
219 {
220 if(ATMInfo[idx][xPos] == 0)
221 {
222 new query[128], string[80];
223 ATMInfo[idx][xPos] = fX;
224 ATMInfo[idx][yPos] = fY;
225 ATMInfo[idx][zPos] = fZ;
226 ATMInfo[idx][rPos] = fRotZ;
227 SetObjectPos(ATM[idx], ATMInfo[idx][xPos], ATMInfo[idx][yPos], ATMInfo[idx][zPos]);
228 SetObjectRot(ATM[idx], 0, 0, ATMInfo[idx][rPos]);
229 mysql_format(mysql, query, sizeof(query), "INSERT INTO `ATMs` (`ATMID`, `xPos`, `yPos`, `zPos`, `rPos`) VALUES ('%d', '%f', '%f', %f, %f)", idx, fX, fY, fZ, fRotZ);
230 mysql_tquery(mysql, query);
231 format(string, sizeof(string), "You have successfully created & saved ATM ID: %d.", idx);
232 SendClientMessage(playerid, COLOR_RED, string);
233 Editing[playerid] = 0;
234 return 1;
235 }
236 else
237 {
238 new string[80], query[128];
239 Editing[playerid] = 0;
240 ATMInfo[idx][xPos] = fX;
241 ATMInfo[idx][yPos] = fY;
242 ATMInfo[idx][zPos] = fZ;
243 ATMInfo[idx][rPos] = fRotZ;
244 SetObjectPos(ATM[idx], ATMInfo[idx][xPos], ATMInfo[idx][yPos], ATMInfo[idx][zPos]);
245 SetObjectRot(ATM[idx], 0, 0, ATMInfo[idx][rPos]);
246 mysql_format(mysql, query, sizeof(query), "UPDATE `ATMs` SET `xPos`='%f', `yPos`='%f', `zPos`='%f', `rPos`='%f' WHERE `ATMID`='%d' LIMIT 1", fX, fY, fZ, fRotZ, idx);
247 mysql_tquery(mysql, query);
248 format(string, sizeof(string), "You have finished editing ATM ID: %d, it was saved & synced automatically.", idx);
249 SendClientMessage(playerid, COLOR_LIGHTGREEN, string);
250 return 1;
251 }
252 }
253 return 1;
254}
255
256public OnQueryError(errorid, error[], callback[], query[], connectionHandle) print(error);
257
258forward MoneyCheck();
259public MoneyCheck()
260{
261 foreach(new i : Player) if(GetPlayerMoney(i) != PlayerInfo[i][bCash])
262 {
263 GivePlayerMoney(i, -GetPlayerMoney(i));
264 GiveNexMoney(i, PlayerInfo[i][bCash]);
265 }
266 return 1;
267}
268// Commands
269CMD:bankhelp(playerid)
270{
271 SendClientMessage(playerid, COLOR_RED, "List of Bank System related Commands:");
272 SendClientMessage(playerid, COLOR_LIGHTGREEN, "/bregister | /(bl)ogin | /deposit | /withdraw | /balance | /transfer | /changebpass | /pay");
273 SendClientMessage(playerid, COLOR_RED, "--------------------------------------------------------------------");
274 return 1;
275}
276
277CMD:abankhelp(playerid)
278{
279 SendClientMessage(playerid, COLOR_LIGHTGREEN, "List of Bank System Administration related Commands:");
280 SendClientMessage(playerid, COLOR_RED, "/(g)ive(m)oney(all) | /(g)ive(b)ank(m)oney(all) | /depositall | /fine(all) | /atmhelp");
281 SendClientMessage(playerid, COLOR_LIGHTGREEN, "--------------------------------------------------------------------");
282 return 1;
283}
284
285CMD:atmhelp(playerid)
286{
287 SendClientMessage(playerid, COLOR_LIGHTGREEN, "ATM Setup related Commands:");
288 SendClientMessage(playerid, COLOR_RED, "/createatm | /deleteatm | /atms | /gotoatm | /editatm | /saveatms | /reloadatms");
289 SendClientMessage(playerid, COLOR_LIGHTGREEN, "--------------------------------------------------------------------");
290 return 1;
291}
292
293CMD:bregister(playerid, params[])
294{
295 if(strlen(PlayerInfo[playerid][bPass]) > 0) return SendClientMessage(playerid, COLOR_RED, "You are already registered to the Bank System, use /BLogin to log in.");
296 new pass[128];
297 if(sscanf(params, "s[128]", pass)) return SendClientMessage(playerid, COLOR_RED, "USAGE: /BRegister [Bank Password]");
298 new query[248];
299 mysql_format(mysql, query, sizeof(query), "INSERT INTO `Users` (`Username`, `Password`, `Money`, `IP`) VALUES ('%e', '%e', '%i', '%e')", RPN(playerid), pass, PlayerInfo[playerid][bMoney], RPIP(playerid));
300 mysql_tquery(mysql, query);
301 SendClientMessage(playerid, COLOR_LIGHTGREEN, "You have registered to the Bank System, therefore you've been auto-logged in.");
302 format(PlayerInfo[playerid][bPass], 128, "%s", pass);
303 PlayerInfo[playerid][bLogged] = 1;
304 PlayerInfo[playerid][bMoney] = 10000;
305 return 1;
306}
307
308CMD:blogin(playerid, params[])
309{
310 return cmd_bl(playerid, params);
311}
312
313CMD:bl(playerid, params[])
314{
315 if(strlen(PlayerInfo[playerid][bPass]) == 0) return SendClientMessage(playerid, COLOR_RED, "You are not registered at the bank, register using /bregister.");
316 if(PlayerInfo[playerid][bLogged]) return SendClientMessage(playerid, COLOR_RED, "You are already logged into your bank account.");
317 new pass[128];
318 if(sscanf(params, "s[128]", pass)) return SendClientMessage(playerid, -1, "USAGE: /BLogin [Password]");
319 if(!strcmp(pass, PlayerInfo[playerid][bPass], false))
320 {
321 PlayerInfo[playerid][bLogged] = 1;
322 SendClientMessage(playerid, COLOR_LIGHTGREEN, "You have successfully logged into your bank account.");
323 new query[80];
324 mysql_format(mysql, query, sizeof(query), "UPDATE `Users` SET `IP`='%e' WHERE `Username`='%e' LIMIT 1", RPIP(playerid), RPN(playerid));
325 mysql_tquery(mysql, query);
326 return 1;
327 }
328 else return SendClientMessage(playerid, COLOR_RED, "Wrong bank password.");
329}
330
331CMD:deposit(playerid, params[])
332{
333 if(!PlayerInfo[playerid][bLogged]) return SendClientMessage(playerid, COLOR_RED, "You have to be logged into your bank account to perform this command.");
334 #if REQUIRE_POSITION == 1
335 if(!IsPlayerNearATM(playerid, 3)) return SendClientMessage(playerid, -1, "You must be near an ATM to perform this command.");
336 #endif
337 new amount;
338 if(sscanf(params, "i", amount)) return SendClientMessage(playerid, -1, "USAGE: /deposit [amount]");
339 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
340 if(GetPlayerMoney(playerid) < amount) return SendClientMessage(playerid, COLOR_RED, "You don't have this amount of money on you.");
341 GiveNexMoney(playerid, -amount);
342 PlayerInfo[playerid][bMoney] += amount;
343 new string[80];
344 format(string, sizeof(string), "You have deposited $%d into your bank account.", amount);
345 SendClientMessage(playerid, COLOR_LIGHTGREEN, string);
346 return 1;
347}
348
349CMD:withdraw(playerid, params[])
350{
351 if(!PlayerInfo[playerid][bLogged]) return SendClientMessage(playerid, COLOR_RED, "You have to be logged into your bank account to perform this command.");
352 #if REQUIRE_POSITION == 1
353 if(!IsPlayerNearATM(playerid, 3)) return SendClientMessage(playerid, -1, "You must be near an ATM to perform this command.");
354 #endif
355 new amount;
356 if(sscanf(params, "i", amount)) return SendClientMessage(playerid, -1, "USAGE: /withdraw [amount]");
357 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
358 if(PlayerInfo[playerid][bMoney] < amount) return SendClientMessage(playerid, COLOR_RED, "You don't have this amount of money in your bank account.");
359 GiveNexMoney(playerid, amount);
360 PlayerInfo[playerid][bMoney] -= amount;
361 new string[80];
362 format(string, sizeof(string), "You have withdrawn $%d from your bank account.", amount);
363 SendClientMessage(playerid, COLOR_LIGHTGREEN, string);
364 return 1;
365}
366
367CMD:transfer(playerid, params[])
368{
369 if(!PlayerInfo[playerid][bLogged]) return SendClientMessage(playerid, COLOR_RED, "You have to be logged into your bank account to perform this command.");
370 #if REQUIRE_POSITION == 1
371 if(!IsPlayerNearATM(playerid, 3)) return SendClientMessage(playerid, -1, "You must be near an ATM to perform this command.");
372 #endif
373 new amount, playerb;
374 if(sscanf(params, "ui", playerb, amount)) return SendClientMessage(playerid, -1, "USAGE: /pay [playerid] [amount]");
375 if(!IsPlayerConnected(playerb)) return SendClientMessage(playerid, COLOR_RED, "Invalid ID.");
376 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
377 if(PlayerInfo[playerid][bMoney] < amount) return SendClientMessage(playerid, COLOR_RED, "You don't have this amount of money in your bank account.");
378 PlayerInfo[playerid][bMoney] -= amount;
379 PlayerInfo[playerb][bMoney] += amount;
380 new string[80];
381 format(string, sizeof(string), "You have transfered $%d from your bank account to %s's bank account.", amount, RPN(playerb));
382 SendClientMessage(playerid, COLOR_LIGHTGREEN, string);
383 format(string, sizeof(string), "You have received a $%d transfer from %s's bank account.", amount, RPN(playerid));
384 SendClientMessage(playerb, COLOR_LIGHTGREEN, string);
385 return 1;
386}
387
388CMD:balance(playerid, params[])
389{
390 if(!PlayerInfo[playerid][bLogged]) return SendClientMessage(playerid, COLOR_RED, "You have to be logged into your bank account to perform this command.");
391 #if REQUIRE_POSITION == 1
392 if(!IsPlayerNearATM(playerid, 3)) return SendClientMessage(playerid, -1, "You must be near an ATM to perform this command.");
393 #endif
394 new string[80];
395 format(string, sizeof(string), "Your bank balance is $%d", PlayerInfo[playerid][bMoney]);
396 SendClientMessage(playerid, COLOR_LIGHTGREEN, string);
397 return 1;
398}
399
400CMD:changebpass(playerid, params[])
401{
402 if(!PlayerInfo[playerid][bLogged]) return SendClientMessage(playerid, COLOR_RED, "You have to be logged into your bank account to perform this command.");
403 new pass[128];
404 if(sscanf(params, "s[128]", pass)) return SendClientMessage(playerid, -1, "USAGE: /changebpass [new password]");
405 new query[128];
406 mysql_format(mysql, query, sizeof(query), "UPDATE `Users` SET `Password`='%e' WHERE `Username`='%e' LIMIT 1", pass, RPN(playerid));
407 mysql_tquery(mysql, query);
408 SendClientMessage(playerid, COLOR_LIGHTGREEN, "You have changed your bank password.");
409 return 1;
410}
411
412CMD:pay(playerid, params[])
413{
414 if(!PlayerInfo[playerid][bLogged]) return SendClientMessage(playerid, COLOR_RED, "You have to be logged into your bank account to perform this command.");
415 new amount, playerb;
416 if(sscanf(params, "ui", playerb, amount)) return SendClientMessage(playerid, -1, "USAGE: /transfer [playerid] [amount]");
417 if(!IsPlayerConnected(playerb)) return SendClientMessage(playerid, COLOR_RED, "Invalid ID.");
418 #if REQUIRE_POSITION == 1
419 if(!IsPlayerNearPlayer(playerid, playerb, 3)) return SendClientMessage(playerid, COLOR_RED, "You must be near this player to perform this command.");
420 #endif
421 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
422 if(GetPlayerMoney(playerid) < amount) return SendClientMessage(playerid, COLOR_RED, "You don't have this amount of money on you.");
423 GiveNexMoney(playerid, -amount);
424 GiveNexMoney(playerb, amount);
425 new string[80];
426 format(string, sizeof(string), "%s has paid you $%d.", RPN(playerid), amount);
427 SendClientMessage(playerb, COLOR_LIGHTGREEN, string);
428 format(string, sizeof(string), "You have paid %s $%d.", RPN(playerb), amount);
429 SendClientMessage(playerid, COLOR_LIGHTGREEN, string);
430 return 1;
431}
432// Administrator Commands (Give Money etc)
433CMD:givemoney(playerid, params[])
434{
435 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
436 new playerb, amount;
437 if(sscanf(params, "ud", playerb, amount)) return SendClientMessage(playerid, -1, "USAGE: /givemoney [playerid] [amount]");
438 if(!IsPlayerConnected(playerb)) return SendClientMessage(playerid, COLOR_RED, "Invalid ID.");
439 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
440 new string[80];
441 GiveNexMoney(playerb, amount);
442 format(string, sizeof(string), "Administrator %s has given you $%d.", RPN(playerid), amount);
443 SendClientMessage(playerb, COLOR_LIGHTGREEN, string);
444 format(string, sizeof(string), "You have given %s $%d.", RPN(playerb), amount);
445 SendClientMessage(playerb, COLOR_LIGHTGREEN, string);
446 return 1;
447}
448
449CMD:gm(playerid, params[])
450{
451 return cmd_givemoney(playerid, params);
452}
453
454CMD:givemoneyall(playerid, params[])
455{
456 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
457 new amount;
458 if(sscanf(params, "d", amount)) return SendClientMessage(playerid, -1, "USAGE: /givemoneyall [amount]");
459 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
460 new string[80];
461 foreach(new i : Player) if(IsPlayerConnected(i)) GiveNexMoney(i, amount);
462 format(string, sizeof(string), "Administrator %s has given everyone $%d.", RPN(playerid), amount);
463 SendClientMessageToAll(COLOR_LIGHTGREEN, string);
464 return 1;
465}
466
467CMD:gmall(playerid, params[])
468{
469 return cmd_givemoneyall(playerid, params);
470}
471
472CMD:fine(playerid, params[])
473{
474 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
475 new playerb, amount;
476 if(sscanf(params, "ui", playerb, amount)) return SendClientMessage(playerid, -1, "USAGE: /fine [playerid] [amount]");
477 if(!IsPlayerConnected(playerb)) return SendClientMessage(playerid, COLOR_RED, "Invalid ID.");
478 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
479 new string[80];
480 GiveNexMoney(playerb, -amount);
481 format(string, sizeof(string), "Administrator %s has fined $%d from your money.", RPN(playerid), amount);
482 SendClientMessage(playerb, COLOR_RED, string);
483 format(string, sizeof(string), "You have fined %d from %s's money.", amount, RPN(playerb));
484 SendClientMessage(playerb, COLOR_RED, string);
485 return 1;
486}
487
488CMD:fineall(playerid, params[])
489{
490 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
491 new amount;
492 if(sscanf(params, "d", amount)) return SendClientMessage(playerid, -1, "USAGE: /fineall [amount]");
493 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
494 new string[80];
495 foreach(new i : Player) if(IsPlayerConnected(i)) GiveNexMoney(i, -amount);
496 format(string, sizeof(string), "Administrator %s has fined $%d from everyone's money.", RPN(playerid), amount);
497 SendClientMessageToAll(COLOR_RED, string);
498 return 1;
499}
500
501CMD:givebankmoney(playerid, params[])
502{
503 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
504 new playerb, amount;
505 if(sscanf(params, "ud", playerb, amount)) return SendClientMessage(playerid, -1, "USAGE: /givebankmoney [playerid] [amount]");
506 if(!IsPlayerConnected(playerb)) return SendClientMessage(playerid, COLOR_RED, "Invalid ID.");
507 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
508 new string[80];
509 PlayerInfo[playerid][bMoney] += amount;
510 format(string, sizeof(string), "Administrator %s has added $%d to your bank account.", RPN(playerid), amount);
511 SendClientMessage(playerb, COLOR_LIGHTGREEN, string);
512 format(string, sizeof(string), "You have added $%d into %s's bank account.", amount, RPN(playerb));
513 SendClientMessage(playerid, COLOR_LIGHTGREEN, string);
514 return 1;
515}
516
517CMD:gbm(playerid, params[])
518{
519 return cmd_givebankmoney(playerid, params);
520}
521
522CMD:givebankmoneyall(playerid, params[])
523{
524 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
525 new amount;
526 if(sscanf(params, "d", amount)) return SendClientMessage(playerid, -1, "USAGE: /givebankmoneyall [amount]");
527 if(amount <= 0) return SendClientMessage(playerid, COLOR_RED, "Amount of money must be above $1.");
528 new string[80];
529 foreach(new i : Player) if(IsPlayerConnected(i)) PlayerInfo[i][bMoney] += amount;
530 format(string, sizeof(string), "Administrator %s has added $%d into everyone's bank account.", RPN(playerid), amount);
531 SendClientMessageToAll(COLOR_LIGHTGREEN, string);
532 return 1;
533}
534
535CMD:gbmall(playerid, params[])
536{
537 return cmd_givebankmoneyall(playerid, params);
538}
539
540CMD:depositall(playerid, params[])
541{
542 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
543 foreach(new i : Player) if(IsPlayerConnected(i))
544 {
545 PlayerInfo[i][bMoney] += GetPlayerMoney(i);
546 GiveNexMoney(i, -GetPlayerMoney(i));
547 }
548 new string[80];
549 format(string, sizeof(string), "Administrator %s has deposited everyone's money into their banks.", RPN(playerid));
550 SendClientMessageToAll(COLOR_LIGHTGREEN, string);
551 return 1;
552}
553// ATM related commands
554CMD:reloadatms(playerid)
555{
556 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
557 for(new i = 0; i <= MAX_ATMs; i++) if(ATM[i])
558 {
559 DestroyObject(ATM[i]);
560 ATM[i] = 0;
561 ATMInfo[i][xPos] = 0;
562 ATMInfo[i][yPos] = 0;
563 ATMInfo[i][zPos] = 0;
564 ATMInfo[i][rPos] = 0;
565 }
566 for(new i = 0; i <= MAX_ATMs; i++)
567 {
568 new query[128];
569 mysql_format(mysql, query, sizeof(query), "SELECT * From `ATMs` WHERE `ATMID`='%d' LIMIT 1", i);
570 mysql_tquery(mysql, query, "ATMLoad", "i", i);
571 }
572 new string[50];
573 format(string, sizeof(string), "Administrator %s has reloaded the ATMs.", RPN(playerid));
574 SendClientMessageToAll(COLOR_RED, string);
575 return 1;
576}
577
578CMD:saveatms(playerid)
579{
580 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
581 for(new idx = 0; idx <= MAX_ATMs; idx++) if(ATM[idx])
582 {
583 new query[128];
584 mysql_format(mysql, query, sizeof(query), "UPDATE `ATMs` SET `xPos`='%f', `yPos`='%f', `zPos`='%f', `rPos`='%f' WHERE `ATMID`='%d'", ATMInfo[idx][xPos], ATMInfo[idx][yPos], ATMInfo[idx][zPos], ATMInfo[idx][rPos], idx);
585 mysql_tquery(mysql, query);
586 }
587 new string[80];
588 format(string, sizeof(string), "Administrator %s has initiated an ATM saving, completed successfully.", RPN(playerid));
589 SendClientMessageToAll(COLOR_RED, string);
590 return 1;
591}
592
593CMD:createatm(playerid)
594{
595 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
596 if(ATM[MAX_ATMs]) return SendClientMessage(playerid, COLOR_RED, "The server has passed the maximum amount of ATMs.");
597 if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_RED, "You have to be on foot in order to create an ATM.");
598 if(Editing[playerid]) return SendClientMessage(playerid, COLOR_RED, "First finish editing your current ATM.");
599 for(new idx = 0; idx <= MAX_ATMs; idx++) if(!ATM[idx])
600 {
601 new Float:pos[3], string[80];
602 GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
603 ATM[idx] = CreateObject(ATM_OBJECT, pos[0]-1.0, pos[1], pos[2], 0, 0, 0);
604 EditObject(playerid, ATM[idx]);
605 format(string, sizeof(string), "You have created a new ATM with the ID: %d, Edit it as you wish.", idx);
606 SendClientMessage(playerid, COLOR_RED, string);
607 Editing[playerid] = 1;
608 return 1;
609 }
610 return 1;
611}
612
613CMD:deleteatm(playerid, params[])
614{
615 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
616 new idx;
617 if(sscanf(params, "i", idx)) return SendClientMessage(playerid, -1, "USAGE: /deleteatm [ATM ID]");
618 if( idx < 0 || idx > MAX_ATMs) return SendClientMessage(playerid, COLOR_RED, "Invalid ATM ID.");
619 if(!ATM[idx]) return SendClientMessage(playerid, COLOR_RED, "Invalid ATM ID.");
620 new query[128], string[80];
621 mysql_format(mysql, query, sizeof(string), "DELETE FROM `ATMs` WHERE `ATMID`='%d' LIMIT 1", idx);
622 mysql_tquery(mysql, query);
623 DestroyObject(ATM[idx]);
624 ATM[idx] = 0;
625 ATMInfo[idx][xPos] = 0;
626 ATMInfo[idx][yPos] = 0;
627 ATMInfo[idx][zPos] = 0;
628 ATMInfo[idx][rPos] = 0;
629 format(string, sizeof(string), "You have successfully deleted ATM ID: %d.", idx);
630 SendClientMessage(playerid, COLOR_RED, string);
631 return 1;
632}
633
634CMD:editatm(playerid, params[])
635{
636 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
637 if(Editing[playerid]) return SendClientMessage(playerid, COLOR_RED, "First finish edit the current ATM you're editing.");
638 new idx;
639 if(sscanf(params, "i", idx)) return SendClientMessage(playerid, -1, "USAGE: /editatm [ATM ID]");
640 if( idx < 0 || idx > MAX_ATMs) return SendClientMessage(playerid, COLOR_RED, "Invalid ATM ID.");
641 if(!ATM[idx]) return SendClientMessage(playerid, COLOR_RED, "Invalid ATM ID.");
642 Editing[playerid] = 1;
643 EditObject(playerid, ATM[idx]);
644 new string[80];
645 format(string, sizeof(string), "You are now editing ATM ID: %d", idx);
646 SendClientMessage(playerid, COLOR_LIGHTGREEN, string);
647 return 1;
648}
649
650CMD:atms(playerid)
651{
652 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
653 SendClientMessage(playerid, COLOR_LIGHTGREEN, "List of ATMs (IDs & Positions)");
654 new string[80];
655 for(new i = 0; i <= MAX_ATMs; i++) if(ATM[i])
656 {
657 format(string, sizeof(string), "ATM ID: %d || X Pos: %f || Y Pos: %f || Z Pos: %f", i, ATMInfo[i][xPos], ATMInfo[i][yPos], ATMInfo[i][zPos]);
658 SendClientMessage(playerid, COLOR_RED, string);
659 }
660 SendClientMessage(playerid, COLOR_LIGHTGREEN, "--------------------------------");
661 return 1;
662}
663
664CMD:gotoatm(playerid, params[])
665{
666 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not authorized to use this command.");
667 new atm;
668 if(sscanf(params, "i", atm)) return SendClientMessage(playerid, -1, "USAGE: /gotoatm [ATM ID]");
669 if(atm < 0 || atm > MAX_ATMs) return SendClientMessage(playerid, COLOR_RED, "Invalid ATM ID.");
670 if(!ATM[atm]) return SendClientMessage(playerid, COLOR_RED, "Invalid ATM ID.");
671 SetPlayerPos(playerid, ATMInfo[atm][xPos] - 1, ATMInfo[atm][yPos], ATMInfo[atm][zPos]);
672 new string [56];
673 format(string, sizeof(string), "You have teleported to ATM ID: %d.", atm);
674 SendClientMessage(playerid, COLOR_RED, string);
675 return 1;
676}
677// Stocks
678stock RPN(playerid)
679{
680 new name[MAX_PLAYER_NAME];
681 GetPlayerName(playerid, name, sizeof(name));
682 return name;
683}
684
685stock RPIP(playerid)
686{
687 new ip[16];
688 GetPlayerIp(playerid, ip, sizeof(ip));
689 return ip;
690}
691
692stock GiveNexMoney(playerid, amount)
693{
694 new string[128];
695 if(amount < 0) format(string, sizeof(string), "~r~-$%d", amount*-1);
696 else if(amount > 0) format(string, sizeof(string), "~g~+$%d", amount);
697 GameTextForPlayer(playerid, string, 3000, 1);
698 PlayerPlaySound(playerid, 1052, 0.0, 0.0, 0.0);
699 PlayerInfo[playerid][bCash] += amount;
700 GivePlayerMoney(playerid, amount);
701 return 1;
702}
703
704stock IsPlayerNearATM(playerid, Float:range)
705{
706 for(new i = 0; i <= MAX_ATMs; i++)
707 {
708 if(IsPlayerInRangeOfPoint(playerid, range, ATMInfo[i][xPos], ATMInfo[i][yPos], ATMInfo[i][zPos])) return true;
709 }
710 return false;
711}
712
713stock IsPlayerNearPlayer(playerid, n_playerid, Float:radius)
714{
715 new Float:npx, Float:npy, Float:npz;
716 GetPlayerPos(n_playerid, npx, npy, npz);
717 if(IsPlayerInRangeOfPoint(playerid, radius, npx, npy, npz)) return true;
718 else return false;
719}