· 6 months ago · Mar 15, 2025, 10:50 AM
1#include <a_samp>
2#include <samp_bcrypt>
3#include <sscanf2>
4#include <zcmd>
5#define SERVER_DATABASE "server.db"
6
7#define REGISTER_DIALOG 0
8#define LOGIN_DIALOG 1
9#define MAX_HOUSES 100
10#define PLAYER 0
11#define HELPER 1
12#define ADMIN 2
13#define OWNER 3
14
15#define VIP_BRONZE 0
16#define VIP_SILVER 1
17#define VIP_GOLD 2
18#define VIP_DIAMOND 3
19#define REWARD_INTERVAL (3600000)
20#define REWARD_MONEY 2000
21#define REWARD_SCORE 1
22
23#define GAMESTATE_FREEROAM 0
24#define GAMESTATE_ROLEPLAY 1
25#define VIP_CHAT_COLOR F72585
26
27#define COLOR_YELLOW 0xFFFF00AA
28#define COLOR_RED 0xAA3333AA
29#define COLOR_MAGENTA 0xFF00FFFF
30#define COLOR_GOLD 0xFFD700FF
31#define COLOR_GREEN 0x008000FF
32
33new DB:server_database;
34new DBResult:database_result;
35new rpName[MAX_PLAYERS][24];
36new Text:PublicTD[1];
37
38enum player_data
39{
40 player_kills,
41 player_deaths,
42 player_admin_level,
43 player_vip_level,
44
45 bool:player_logged
46};
47
48new PlayerData[MAX_PLAYERS][player_data];
49new gamestate=GAMESTATE_FREEROAM;
50
51stock GetName(playerid)
52{
53 new name[MAX_PLAYER_NAME];
54 GetPlayerName(playerid, name, sizeof(name));
55 return name;
56}
57
58stock DB_Escape(text[])//Credits: Y_Less
59{
60 new ret[80 * 2], ch, i, j;
61 while ((ch = text[i++]) && j < sizeof (ret))
62 {
63 if (ch == '\'')
64 {
65 if (j < sizeof (ret) - 2)
66 {
67 ret[j++] = '\'';
68 ret[j++] = '\'';
69 }
70 }
71 else if (j < sizeof (ret))
72 {
73 ret[j++] = ch;
74 }
75 else
76 {
77 j++;
78 }
79 }
80 ret[sizeof (ret) - 1] = '\0';
81 return ret;
82}
83
84stock SaveAccount(playerid)
85{
86 new query[256];
87 if(PlayerData[playerid][player_logged] == true)
88 {
89 format(query, sizeof(query),
90 "UPDATE USERS SET SCORE = '%d', KILLS = '%d', DEATHS = '%d',ADMIN_LEVEL = '%d', VIP_LEVEL = '%d' WHERE NAME = '%s' COLLATE NOCASE",
91 GetPlayerScore(playerid), PlayerData[playerid][player_kills], PlayerData[playerid][player_deaths],
92 PlayerData[playerid][player_admin_level], PlayerData[playerid][player_vip_level],GetName(playerid));
93 database_result = db_query(server_database, query);
94 db_free_result(database_result);
95 }
96 return 1;
97}
98
99
100main() { }
101
102public OnGameModeInit()
103{
104 SetGameModeText("Blank Script");
105 SetTimer("GiveHourlyReward",REWARD_INTERVAL,true);
106 ManualVehicleEngineAndLights();
107 AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
108
109 server_database = db_open(SERVER_DATABASE);
110
111 db_query(server_database, "CREATE TABLE IF NOT EXISTS USERS (`NAME`, `PASS`, `SCORE`, `KILLS`, `DEATHS`,`ADMIN_LEVEL`,`VIP_LEVEL`)");
112 PublicTD[0] = TextDrawCreate(480.000000, 316.000000, "~y~NAME:_~g~INFERNUS~n~~y~SPEED:_~b~0KM/h~n~~y~HEALTH:_~r~100~n~~y~FUEL:_~w~64L");
113 TextDrawFont(PublicTD[0], 1);
114 TextDrawLetterSize(PublicTD[0], 0.229166, 1.950000);
115 TextDrawTextSize(PublicTD[0], 572.500000, 15.500000);
116 TextDrawSetOutline(PublicTD[0], 1);
117 TextDrawSetShadow(PublicTD[0], 0);
118 TextDrawAlignment(PublicTD[0], 1);
119 TextDrawColor(PublicTD[0], -1);
120 TextDrawBackgroundColor(PublicTD[0], 255);
121 TextDrawBoxColor(PublicTD[0], 100);
122 TextDrawUseBox(PublicTD[0], 1);
123 TextDrawSetProportional(PublicTD[0], 1);
124 TextDrawSetSelectable(PublicTD[0], 0);
125 return 1;
126}
127
128public OnGameModeExit()
129{
130 db_close(server_database);
131 return 1;
132}
133
134public OnPlayerConnect(playerid)
135{
136 SetPlayerScore(playerid, 0);
137
138 PlayerData[playerid][player_kills] = 0;
139 PlayerData[playerid][player_deaths] = 0;
140 PlayerData[playerid][player_admin_level] = 0;
141 PlayerData[playerid][player_logged] = false;
142 GivePlayerMoney(playerid, 500000);
143
144 new query[128];
145 format(query, sizeof(query), "SELECT NAME FROM USERS WHERE NAME = '%s' COLLATE NOCASE", DB_Escape(GetName(playerid)));
146 database_result = db_query(server_database, query);
147 if(db_num_rows(database_result))
148 {
149 ShowPlayerDialog(playerid, LOGIN_DIALOG, DIALOG_STYLE_PASSWORD, "{FFFFFF}Account Login", "{FFFFFF}Please enter your password below to login to your account:", "Enter", "Leave");
150 }
151 else
152 {
153 ShowPlayerDialog(playerid, REGISTER_DIALOG, DIALOG_STYLE_PASSWORD, "{FFFFFF}Register Account", "{FFFFFF}Please enter a password below to register an account:", "Enter", "Leave");
154 }
155 return 1;
156}
157
158public OnPlayerDisconnect(playerid, reason)
159{
160 SaveAccount(playerid);
161 return 1;
162}
163
164public OnPlayerStateChange(playerid, newstate, oldstate)
165{
166 if (newstate == PLAYER_STATE_DRIVER) // Player entered a vehicle as a driver
167 {
168 TextDrawShowForPlayer(playerid, PublicTD[0]);
169 }
170 else if (oldstate == PLAYER_STATE_DRIVER) // Player exited the vehicle
171 {
172 TextDrawHideForPlayer(playerid, PublicTD[0]);
173 }
174 return 1;
175}
176
177public OnPlayerDeath(playerid, killerid, reason)
178{
179 if(killerid != INVALID_PLAYER_ID)
180 {
181 SetPlayerScore(killerid, GetPlayerScore(killerid) + 1);
182 PlayerData[killerid][player_kills]++;
183 }
184
185 SetPlayerScore(playerid, GetPlayerScore(playerid) - 1);
186 PlayerData[playerid][player_deaths]++;
187 return 1;
188}
189
190public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
191{
192 if(dialogid == REGISTER_DIALOG)
193 {
194 if(response)
195 {
196 if(strlen(inputtext) < 3 || strlen(inputtext) > 24)
197 {
198 SendClientMessage(playerid, -1, "SERVER: Your password must be from 3-24 characters.");
199 return ShowPlayerDialog(playerid, REGISTER_DIALOG, DIALOG_STYLE_PASSWORD, "{FFFFFF}Register Account", "{FFFFFF}Please enter a password below to register an account:", "Enter", "Leave");
200 }
201
202 bcrypt_hash(playerid, "OnPlayerRegister", inputtext, 12);
203 return 1;
204 }
205 else
206 {
207 Kick(playerid);
208 }
209 }
210 else if(dialogid == LOGIN_DIALOG)
211 {
212 if(response)
213 {
214 new query[256], field[64];
215 format(query, sizeof(query), "SELECT PASS FROM USERS WHERE NAME = '%s' COLLATE NOCASE", DB_Escape(GetName(playerid)));
216 database_result = db_query(server_database, query);
217 if(db_num_rows(database_result))
218 {
219 db_get_field_assoc(database_result, "PASS", field, sizeof(field));
220 bcrypt_verify(playerid, "OnPlayerLogin", inputtext, field);
221 }
222 return 1;
223 }
224 else
225 {
226 Kick(playerid);
227 }
228 }
229 return 1;
230}
231
232forward OnPlayerLogin(playerid, bool:success);
233public OnPlayerLogin(playerid, bool:success)
234{
235 if(success)
236 {
237 new query[256], field[24];
238 format(query, sizeof(query), "SELECT * FROM USERS WHERE NAME = '%s' COLLATE NOCASE", DB_Escape(GetName(playerid)));
239 database_result = db_query(server_database, query);
240 if(db_num_rows(database_result))
241 {
242 db_get_field_assoc(database_result, "SCORE", field, sizeof(field));
243 SetPlayerScore(playerid, strval(field));
244
245 db_get_field_assoc(database_result, "KILLS", field, sizeof(field));
246 PlayerData[playerid][player_kills] = strval(field);
247
248 db_get_field_assoc(database_result, "DEATHS", field, sizeof(field));
249 PlayerData[playerid][player_deaths] = strval(field);
250
251 db_get_field_assoc(database_result, "ADMIN_LEVEL", field, sizeof(field));
252 PlayerData[playerid][player_admin_level] = strval(field);
253 db_get_field_assoc(database_result, "VIP_LEVEL", field, sizeof(field));
254 PlayerData[playerid][player_vip_level] = strval(field);
255 }
256
257 db_free_result(database_result);
258
259 PlayerData[playerid][player_logged] = true;
260
261 SendClientMessage(playerid, -1, "SERVER: You have successfully logged into your account.");
262 return 1;
263 }
264 else
265 {
266 Kick(playerid);
267 }
268 return 1;
269}
270
271forward OnPlayerRegister(playerid);
272public OnPlayerRegister(playerid)
273{
274 new password[64];
275 bcrypt_get_hash(password);
276
277 new query[256];
278 format(query, sizeof(query), "INSERT INTO USERS (NAME, PASS, SCORE, KILLS, DEATHS,ADMIN_LEVEL,VIP_LEVEL,last_x,last_y,last_z,last_angle,INT,WORLD) VALUES ('%s', '%s', '%d', '%d', '%d','%d','%d')", DB_Escape(GetName(playerid)), password, GetPlayerScore(playerid), PlayerData[playerid][player_kills], PlayerData[playerid][player_deaths],PlayerData[playerid][player_admin_level],PlayerData[playerid][player_vip_level]);
279 database_result = db_query(server_database, query);
280 db_free_result(database_result);
281
282 PlayerData[playerid][player_logged] = true;
283
284 SendClientMessage(playerid, -1, "SERVER: You have successfully registered an account.");
285 return 1;
286}
287forward GiveHourlyReward();
288public GiveHourlyReward()
289{
290 new i;
291 for(i=0;i<MAX_PLAYERS;i++)
292 {
293 GivePlayerMoney(i,REWARD_MONEY);
294 SetPlayerScore(i,GetPlayerScore(i)+REWARD_SCORE);
295 SendClientMessage(i, 0x00FF00FF, "You have received your hourly reward: $2000 and +1 Score!");
296 }
297 return 1;
298}
299public OnPlayerText(playerid,text[])
300{
301 if(text[0]=='#')
302 {
303 if (PlayerData[playerid][player_vip_level] < VIP_BRONZE)
304 {
305 SendClientMessage(playerid, COLOR_RED, "You are not a VIP!");
306 return 0; // Block message from being sent to normal chat
307 }
308 new message[128];
309 format(message, sizeof(message), "[VIP Chat] %s: %s", GetPlayerNameEx(playerid), text[1]); // Remove #
310
311 for (new i = 0; i < MAX_PLAYERS; i++)
312 {
313 if (IsPlayerConnected(i) && PlayerData[i][player_vip_level] >= VIP_BRONZE)
314 {
315 SendClientMessage(i, COLOR_GOLD, message);
316 }
317 }
318
319 return 0; // Block original message from going to normal chat
320 }
321
322 return 1;
323}
324
325public OnPlayerUpdate(playerid)
326{
327 if (GetPlayerState(playerid) == PLAYER_STATE_DRIVER) // Only update if player is driving
328 {
329 new vehicleid = GetPlayerVehicleID(playerid);
330 new vehicleModel = GetVehicleModel(vehicleid);
331 new Float:vehicleHealth;
332 GetVehicleHealth(vehicleid, vehicleHealth);
333
334 // Get speed
335 new str[64], speed = GetPlayerSpeed(playerid);
336 format(str, sizeof(str), "~y~NAME:_~g~%s~n~~y~SPEED:_~b~%dKM/h~n~~y~HEALTH:_~r~%d~n~~y~FUEL:_~w~64L",
337 GetVehicleName(vehicleModel), speed, vehicleHealth);
338
339 TextDrawSetString(PublicTD[0], str);
340 }
341 return 1;
342}
343stock GetPlayerSpeed(playerid)
344{
345 new Float:x, Float:y, Float:z, Float:speed;
346 GetPlayerVelocity(playerid, x, y, z);
347
348 // Approximate square root without floatsqrt
349 new Float:sum = (x * x + y * y + z * z);
350 new Float:approx = sum / (1.0 + sum / 2.0); // Simple approximation
351
352 speed = floatmul(approx, 180.0); // Convert to km/h
353 return floatround(speed);
354}
355stock GetVehicleName(vehicleid)
356{
357 new name[32];
358 switch (vehicleid)
359 {
360 case 411: name = "INFERNUS";
361 case 451: name = "TURISMO";
362 case 400: name = "LANDSTALKER";
363 default: name = "UNKNOWN";
364 }
365 return name;
366}
367stock GetPlayerNameEx(playerid)
368{
369 new name[MAX_PLAYER_NAME];
370 GetPlayerName(playerid, name, sizeof(name));
371 return name;
372}
373CMD:setlevel(playerid, params[])
374{
375 new targetid, name[MAX_PLAYER_NAME], level[16], string[128], query[256], admin;
376
377 if (!IsPlayerAdmin(playerid))
378 return SendClientMessage(playerid, -1, "You are not authorized to use this command.");
379
380 // Parse the parameters using sscanf
381 if (sscanf(params, "us[16]", targetid, level))
382 return SendClientMessage(playerid, -1, "Syntax: /setlevel [playerid] [level]");
383
384 // Check if target player is valid
385 if (!IsPlayerConnected(targetid))
386 return SendClientMessage(playerid, -1, "Invalid player ID.");
387
388 // Determine admin level
389 if (!strcmp(level, "player", true)) admin = PLAYER;
390 else if (!strcmp(level, "helper", true)) admin = HELPER;
391 else if (!strcmp(level, "admin", true)) admin = ADMIN;
392 else if (!strcmp(level, "owner", true)) admin = OWNER;
393 else
394 return SendClientMessage(playerid, -1, "Invalid admin level.");
395
396 // Get player's name
397 GetPlayerName(targetid, name, sizeof(name));
398
399 // Check if database is connected
400 if (!server_database)
401 return SendClientMessage(playerid, -1, "Database connection error.");
402
403 // Query to check if player exists in DB
404 format(query, sizeof(query), "SELECT ADMIN_LEVEL FROM USERS WHERE NAME = '%s' COLLATE NOCASE", DB_Escape(name));
405 new DBResult:result = db_query(server_database, query);
406
407 if (db_num_rows(result))
408 {
409 db_free_result(result);
410
411 // Update admin level in database
412 format(query, sizeof(query), "UPDATE USERS SET ADMIN_LEVEL = %d WHERE NAME = '%s' COLLATE NOCASE", admin, DB_Escape(name));
413 db_query(server_database, query);
414
415 // Update player's admin level in memory
416 PlayerData[targetid][player_admin_level] = admin;
417
418 format(string, sizeof(string), "SERVER: You have successfully set the admin level of %s to %s.", name, level);
419 SendClientMessage(playerid, -1, string);
420 }
421 else
422 {
423 SendClientMessage(playerid, -1, "Player not found in database.");
424 db_free_result(result);
425 }
426
427 return 1;
428}
429
430CMD:setvip(playerid, params[])
431{
432 new targetid, name[24], vip[16], string[128], query[256], vip_level;
433
434 if (!IsPlayerAdmin(playerid))
435 return SendClientMessage(playerid, -1, "You are not authorized to use this command.");
436
437 // Corrected sscanf format
438 if (sscanf(params, "us[16]", targetid, name, vip))
439 return SendClientMessage(playerid, -1, "Syntax: /setvip [playerid] [vip level]");
440
441 if (!IsPlayerConnected(targetid))
442 return SendClientMessage(playerid, -1, "Invalid player ID.");
443
444 if (!strcmp(vip, "bronze", true)) vip_level = VIP_BRONZE;
445 else if (!strcmp(vip, "silver", true)) vip_level = VIP_SILVER;
446 else if (!strcmp(vip, "gold", true)) vip_level = VIP_GOLD;
447 else if (!strcmp(vip, "diamond", true)) vip_level = VIP_DIAMOND;
448 else
449 return SendClientMessage(playerid, -1, "Invalid VIP level.");
450
451 format(query, sizeof(query), "UPDATE USERS SET VIP_LEVEL = %d WHERE NAME = '%s' COLLATE NOCASE", vip_level, DB_Escape(name));
452 db_query(server_database, query);
453
454 PlayerData[targetid][player_vip_level] = vip_level;
455
456 format(string, sizeof(string), "SERVER: You have successfully set the VIP level of %s to %s.", name, vip);
457 SendClientMessage(playerid, -1, string);
458
459 return 1;
460}
461
462CMD:v(playerid,params[])
463{
464 if(PlayerData[playerid][player_vip_level]<VIP_BRONZE)
465 {
466 return SendClientMessage(playerid, -1, "You are not a VIP player.");
467 }
468 if(isnull(params))
469 {
470 return SendClientMessage(playerid, -1, "Usage: /v [message]");
471 }
472 new color, msg[128], name[MAX_PLAYER_NAME];
473 GetPlayerName(playerid, name, sizeof(name));
474 switch(PlayerData[playerid][player_vip_level])
475 {
476 case VIP_BRONZE: color = 0xCD7F32FF; // Bronze
477 case VIP_SILVER: color = 0xC0C0C0FF; // Silver
478 case VIP_GOLD: color = 0xFFD700FF; // Gold
479 case VIP_DIAMOND: color = 0xFFF72585; // Diamond
480 default: color = 0xFFFFFFAA;
481 }
482 format(msg, sizeof(msg), "[VIP Chat] %s: %s", name, params);
483 for(new i = 0; i < MAX_PLAYERS; i++)
484 {
485 if(PlayerData[i][player_vip_level] >= VIP_BRONZE)
486 {
487 SendClientMessage(i, color, msg);
488 }
489 }
490 return 1;
491}
492CMD:checkstatus(playerid, params[])
493{
494 new targetid, name[MAX_PLAYER_NAME], string[128], adminTitle[32], vipTitle[32];
495
496 // If no parameters are provided, check the player's own status
497 if (sscanf(params, "u", targetid))
498 targetid = playerid;
499
500 if (!IsPlayerConnected(targetid))
501 return SendClientMessage(playerid, -1, "Invalid player ID.");
502
503 GetPlayerName(targetid, name, sizeof(name));
504
505 // Assign Admin Titles
506 switch (PlayerData[targetid][player_admin_level])
507 {
508 case 0: adminTitle = "None";
509 case 1: adminTitle = "Moderator";
510 case 2: adminTitle = "Administrator";
511 case 3: adminTitle = "Senior Admin";
512 case 4: adminTitle = "Head Admin";
513 case 5: adminTitle = "Owner";
514 default: adminTitle = "Unknown";
515 }
516
517 // Assign VIP Titles
518 switch (PlayerData[targetid][player_vip_level])
519 {
520 case 0: vipTitle = "None";
521 case 1: vipTitle = "Silver VIP";
522 case 2: vipTitle = "Gold VIP";
523 case 3: vipTitle = "Platinum VIP";
524 case 4: vipTitle = "Diamond VIP";
525 default: vipTitle = "Unknown";
526 }
527
528 format(string, sizeof(string), "Player: %s | Admin: %s | VIP: %s", name, adminTitle, vipTitle);
529 SendClientMessage(playerid, -1, string);
530
531 return 1;
532}
533/*CMD:ban(playerid,params[])
534{
535 new targetid,reason;
536 if(PlayerData[playerid][player_admin_level]<5) return SendClientMessage(playerid,-1,"You are not authorized to use this command");
537 if(sscanf(params,"uz",targetid,reason))return SendClientMessage(playerid,-1,"Usage: /ban [playerid] [reason]");
538 if(!IsPlayerConnected(playerid))return SendClientMessage(playerid,-1,"Player is not connected");
539
540
541}*/
542CMD:cca(playerid, params[])
543{
544 if (!IsPlayerAdmin(playerid) && PlayerData[playerid][player_admin_level]<0) // Check if the player is an admin
545 {
546 SendClientMessage(playerid, 0xFF0000FF, "You don't have permission to use this command!");
547 return 1;
548 }
549
550 for (new i = 0; i < 50; i++) // Sends 50 empty messages to clear the chat for all players
551 {
552 SendClientMessageToAll(-1, " ");
553 }
554
555 SendClientMessageToAll(0x00FF00FF, "The chat has been cleared by an admin!");
556 return 1;
557}
558CMD:engine(playerid, params[])
559{
560 if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not in a vehicle!");
561
562 new vehicleid = GetPlayerVehicleID(playerid);
563 new engine, lights, alarm, doors, bonnet, boot, objective;
564 GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
565
566 if(engine == VEHICLE_PARAMS_OFF) {
567 SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_ON, lights, alarm, doors, bonnet, boot, objective);
568 SendClientMessage(playerid, COLOR_YELLOW, "Engine started!");
569 } else {
570 SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
571 SendClientMessage(playerid, -1, "Engine turned off!");
572 }
573 return 1;
574}
575
576CMD:lights(playerid, params[])
577{
578 if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not in a vehicle!");
579
580 new vehicleid = GetPlayerVehicleID(playerid);
581 new engine, lights, alarm, doors, bonnet, boot, objective;
582 GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
583
584 if(lights == VEHICLE_PARAMS_OFF) {
585 SetVehicleParamsEx(vehicleid, engine, VEHICLE_PARAMS_ON, alarm, doors, bonnet, boot, objective);
586 SendClientMessage(playerid, COLOR_YELLOW, "Lights turned on!");
587 } else {
588 SetVehicleParamsEx(vehicleid, engine, VEHICLE_PARAMS_OFF, alarm, doors, bonnet, boot, objective);
589 SendClientMessage(playerid, -1, "Lights turned off!");
590 }
591 return 1;
592}
593
594CMD:bonnet(playerid, params[])
595{
596 if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not in a vehicle!");
597
598 new vehicleid = GetPlayerVehicleID(playerid);
599 new engine, lights, alarm, doors, bonnet, boot, objective;
600 GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
601
602 if(bonnet == VEHICLE_PARAMS_OFF) {
603 SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, VEHICLE_PARAMS_ON, boot, objective);
604 SendClientMessage(playerid, COLOR_YELLOW, "Bonnet opened!");
605 } else {
606 SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, VEHICLE_PARAMS_OFF, boot, objective);
607 SendClientMessage(playerid, -1, "Bonnet closed!");
608 }
609 return 1;
610}
611
612CMD:boot(playerid, params[])
613{
614 if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not in a vehicle!");
615
616 new vehicleid = GetPlayerVehicleID(playerid);
617 new engine, lights, alarm, doors, bonnet, boot, objective;
618 GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
619
620 if(boot == VEHICLE_PARAMS_OFF) {
621 SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, VEHICLE_PARAMS_ON, objective);
622 SendClientMessage(playerid, COLOR_YELLOW, "Boot opened!");
623 } else {
624 SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, VEHICLE_PARAMS_OFF, objective);
625 SendClientMessage(playerid, -1, "Boot closed!");
626 }
627 return 1;
628}
629
630CMD:doors(playerid, params[])
631{
632 if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_RED, "You are not in a vehicle!");
633
634 new vehicleid = GetPlayerVehicleID(playerid);
635 new engine, lights, alarm, doors, bonnet, boot, objective;
636 GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
637
638 if(doors == VEHICLE_PARAMS_OFF) {
639 SetVehicleParamsEx(vehicleid, engine, lights, alarm, VEHICLE_PARAMS_ON, bonnet, boot, objective);
640 SendClientMessage(playerid, COLOR_YELLOW, "Doors locked!");
641 } else {
642 SetVehicleParamsEx(vehicleid, engine, lights, alarm, VEHICLE_PARAMS_OFF, bonnet, boot, objective);
643 SendClientMessage(playerid, -1, "Doors unlocked!");
644 }
645 return 1;
646}
647CMD:viphelp(playerid, params[])
648{
649 if(PlayerData[playerid][player_vip_level]<VIP_BRONZE) return SendClientMessage(playerid, COLOR_RED, "You are not a VIP!");
650
651 SendClientMessage(playerid, COLOR_GOLD, "[VIP COMMANDS]");
652 SendClientMessage(playerid, COLOR_YELLOW, "/vipheal - Fully restores your health & armor");
653 SendClientMessage(playerid, COLOR_YELLOW, "/vipcar - Spawns a luxury VIP vehicle");
654 SendClientMessage(playerid, COLOR_YELLOW, "/vipskin - Change to exclusive VIP skins");
655 SendClientMessage(playerid, COLOR_YELLOW, "/vipweapons - Get special weapons");
656 SendClientMessage(playerid, COLOR_YELLOW, "/vipjetpack - Get a jetpack");
657 SendClientMessage(playerid,COLOR_YELLOW,"/viprepair - Repairs the car");
658 return 1;
659}
660CMD:vipheal(playerid, params[])
661{
662 if(PlayerData[playerid][player_vip_level] > 0)
663 {
664 SetPlayerHealth(playerid, 100.0);
665 SendClientMessage(playerid, COLOR_YELLOW, "VIP: You have been healed!");
666 }
667 else
668 {
669 SendClientMessage(playerid, COLOR_RED, "VIP: This command is only for VIP players!");
670 }
671 return 1;
672}
673
674CMD:vipweapons(playerid, params[])
675{
676 if(PlayerData[playerid][player_vip_level] > 0)
677 {
678 GivePlayerWeapon(playerid, 24, 100); // Deagle with 100 ammo
679 GivePlayerWeapon(playerid, 31, 200); // M4 with 200 ammo
680 SendClientMessage(playerid, COLOR_YELLOW, "VIP: You have received your VIP weapons!");
681 }
682 else
683 {
684 SendClientMessage(playerid, COLOR_RED, "VIP: This command is only for VIP players!");
685 }
686 return 1;
687}
688
689CMD:vipcar(playerid, params[])
690{
691 if (PlayerData[playerid][player_vip_level] < VIP_BRONZE) // Check if player is VIP
692 {
693 SendClientMessage(playerid, COLOR_RED, "You are not a VIP!");
694 return 1;
695 }
696
697 new vehicleid;
698 if(sscanf(params, "d", vehicleid))
699 {
700 SendClientMessage(playerid, COLOR_YELLOW, "Usage: /vipcar [vehicle ID]");
701 return 1;
702 }
703
704 SpawnVIPCar(playerid, vehicleid);
705 return 1;
706}
707
708CMD:vipcolor(playerid, params[])
709{
710 if(PlayerData[playerid][player_vip_level] > 0)
711 {
712 new color;
713 switch (PlayerData[playerid][player_vip_level])
714 {
715 case VIP_BRONZE: color = 0xCD7F32FF;
716 case VIP_SILVER: color = 0xC0C0C0FF;
717 case VIP_GOLD: color = 0xFFD700FF;
718 case VIP_DIAMOND: color = 0x1E90FFFF;
719 }
720 SetPlayerColor(playerid, color);
721 SendClientMessage(playerid, COLOR_YELLOW, "VIP: Your player color has been updated!");
722 }
723 else
724 {
725 SendClientMessage(playerid, COLOR_RED, "VIP: This command is only for VIP players!");
726 }
727 return 1;
728}
729CMD:viprepair(playerid, params[])
730{
731 if (PlayerData[playerid][player_vip_level] < VIP_BRONZE)
732 {
733 SendClientMessage(playerid, COLOR_RED, "You are not a VIP!");
734 return 1;
735 }
736
737 new vehicleid = GetPlayerVehicleID(playerid);
738 if (!vehicleid)
739 {
740 SendClientMessage(playerid, COLOR_YELLOW, "You are not in a vehicle!");
741 return 1;
742 }
743
744 RepairVehicle(vehicleid);
745 SendClientMessage(playerid, COLOR_GREEN, "Your vehicle has been repaired!");
746 return 1;
747}
748
749CMD:vipjetpack(playerid, params[])
750{
751 if(PlayerData[playerid][player_vip_level] > 0)
752 {
753 GivePlayerWeapon(playerid, 370, 1); // Jetpack
754 SendClientMessage(playerid, COLOR_YELLOW, "VIP: You have received a Jetpack!");
755 }
756 else
757 {
758 SendClientMessage(playerid, COLOR_RED, "VIP: This command is only for VIP players!");
759 }
760 return 1;
761}
762stock SpawnVIPCar(playerid, vehicleid)
763{
764 new Float:x, Float:y, Float:z, Float:angle;
765
766 // Get player position and facing angle
767 GetPlayerPos(playerid, x, y, z);
768 GetPlayerFacingAngle(playerid, angle);
769
770 // Calculate position in front of the player
771 x += 3.0 * floatsin(-angle, degrees);
772 y += 3.0 * floatcos(-angle, degrees);
773
774 // Spawn the VIP car in front of the player
775 new carid = CreateVehicle(vehicleid, x, y, z, angle, -1, -1, 100);
776
777 // Put player in the driver's seat
778 PutPlayerInVehicle(playerid, carid, 0);
779
780 SendClientMessage(playerid, 0x00FF00FF, "VIP car has been spawned in front of you!");
781
782 return carid;
783}
784CMD:vipskin(playerid, params[])
785{
786 if (PlayerData[playerid][player_vip_level] < VIP_BRONZE)
787 {
788 SendClientMessage(playerid, COLOR_RED, "You are not a VIP!");
789 return 1;
790 }
791
792 new skinid;
793 if(sscanf(params, "d", skinid))
794 {
795 SendClientMessage(playerid, COLOR_YELLOW, "Usage: /vipskin [skin ID]");
796 return 1;
797 }
798
799 if (skinid < 0 || skinid > 311) // San Andreas has skins from 0 to 311
800 {
801 SendClientMessage(playerid, COLOR_RED, "Invalid skin ID! Choose between 0-311.");
802 return 1;
803 }
804
805 SetPlayerSkin(playerid, skinid);
806 SendClientMessage(playerid, COLOR_GREEN, "Your VIP skin has been changed!");
807
808 return 1;
809}
810CMD:freeroam(playerid, params[])
811{
812 if (gamestate == GAMESTATE_FREEROAM) return SendClientMessage(playerid, COLOR_RED, "You are already in Freeroam mode.");
813 gamestate = GAMESTATE_FREEROAM;
814 SendClientMessageToAll(COLOR_YELLOW, "Game state changed to Freeroam.");
815 return 1;
816}
817
818CMD:roleplay(playerid, params[])
819{
820 if (gamestate == GAMESTATE_ROLEPLAY) return SendClientMessage(playerid, COLOR_RED, "You are already in Roleplay mode.");
821 gamestate = GAMESTATE_ROLEPLAY;
822 SendClientMessageToAll(COLOR_YELLOW, "Game state changed to Roleplay.");
823 return 1;
824}
825CMD:me(playerid, params[])
826{
827 if (gamestate != GAMESTATE_ROLEPLAY)
828 return SendClientMessage(playerid, COLOR_RED, "Roleplay mode is not enabled!");
829 if (isnull(params))
830 return SendClientMessage(playerid, COLOR_YELLOW, "USAGE: /me [action]");
831 new str[128];
832 format(str, sizeof(str), "* %s %s", rpName[playerid], params);
833 SendClientMessageToAll(COLOR_YELLOW, str);
834 return 1;
835}
836
837CMD:do(playerid, params[])
838{
839 if (gamestate != GAMESTATE_ROLEPLAY)
840 return SendClientMessage(playerid, COLOR_RED, "Roleplay mode is not enabled!");
841 if (isnull(params))
842 return SendClientMessage(playerid, COLOR_YELLOW, "USAGE: /do [description]");
843 new str[128];
844 format(str, sizeof(str), "* %s", params);
845 SendClientMessageToAll(COLOR_YELLOW, str);
846 return 1;
847}
848
849CMD:b(playerid, params[])
850{
851 if (gamestate != GAMESTATE_ROLEPLAY)
852 return SendClientMessage(playerid, COLOR_RED, "Roleplay mode is not enabled!");
853 if (isnull(params))
854 return SendClientMessage(playerid, COLOR_YELLOW, "USAGE: /b [message]");
855 new str[128];
856 format(str, sizeof(str), "(OOC) %s: %s", rpName[playerid], params);
857 SendClientMessageToAll(COLOR_YELLOW, str);
858 return 1;
859}
860CMD:shout(playerid, params[])
861{
862 if (gamestate != GAMESTATE_ROLEPLAY)
863 return SendClientMessage(playerid, COLOR_RED, "Roleplay mode is not enabled!");
864 if (isnull(params))
865 return SendClientMessage(playerid, COLOR_YELLOW, "USAGE: /shout [message]");
866 new str[128];
867 format(str, sizeof(str), "%s shouts: %s!", rpName[playerid], strupr(params));
868 SendClientMessageToAll(COLOR_YELLOW, str);
869 return 1;
870}
871stock strupr(string[])
872{
873 for (new i = 0; i < strlen(string); i++)
874 {
875 if (string[i] >= 'a' && string[i] <= 'z')
876 {
877 string[i] -= 32; // Convert to uppercase
878 }
879 }
880 return string;
881}
882