· 7 years ago · Jan 03, 2019, 12:02 AM
1#include <a_samp>
2#include <a_mysql>
3#include <foreach>
4#include <streamer>
5#include <sscanf2>
6#include <CMD>
7
8
9#define MYSQL_HOST "localhost"
10#define MYSQL_USER "root"
11#define MYSQL_DATABASE "vehsys"
12#define MYSQL_PASSWORD ""
13
14
15#define red 0xFFFF00FF
16#define green 0x00FF00FF
17#define SCM SendClientMessage
18
19
20#define DIALOG_BUY_VEHICLE 5413
21#define DIALOG_VEHICLES 5513
22#define MAX_SERVER_VEHICLES 2000
23
24enum
25{
26 MODE_NOLOCK,
27 MODE_LOCK,
28};
29
30enum VehiclesData
31{
32 vehID,
33 vehSessionID,
34 vehModel,
35 vehName[25],
36 vehOwner[26],
37 vehPlate[16],
38 vehPrice,
39 vehLock,
40 vehMod[14],
41 vehColorOne,
42 vehColorTwo,
43 Text3D:vehLabel,
44 Float:vehX,
45 Float:vehY,
46 Float:vehZ,
47 Float:vehA
48};
49
50new vInfo[MAX_VEHICLES][VehiclesData],
51 Iterator: ServerVehicles<MAX_VEHICLES>,
52 Iterator: PrivateVehicles[MAX_PLAYERS]<MAX_SERVER_VEHICLES>;
53
54new MySQL:mysql;
55
56new VehicleNames[212][] =
57{
58 "Landstalker", "Bravura", "Buffalo", "Linerunner", "Pereniel", "Sentinel", "Dumper", "Firetruck", "Trashmaster", "Stretch", "Manana", "Infernus","Voodoo", "Pony",
59 "Mule", "Cheetah", "Ambulance", "Leviathan", "Moonbeam", "Esperanto", "Taxi", "Washington", "Bobcat", "Mr Whoopee", "BF Injection", "Hunter", "Premier", "Enforcer",
60 "Securicar", "Banshee", "Predator", "Bus", "Rhino", "Barracks", "Hotknife", "Trailer", "Previon", "Coach", "Cabbie", "Stallion", "Rumpo", "RC Bandit", "Romero",
61 "Packer", "Monster", "Admiral", "Squalo", "Seasparrow", "Pizzaboy", "Tram", "Trailer 2", "Turismo", "Speeder", "Reefer", "Tropic", "Flatbed", "Yankee", "Caddy",
62 "Solair", "Berkley's RC Van", "Skimmer", "PCJ-600", "Faggio", "Freeway", "RC Baron", "RC Raider", "Glendale", "Oceanic", "Sanchez", "Sparrow", "Patriot", "Quad",
63 "Coastguard", "Dinghy", "Hermes", "Sabre", "Rustler", "ZR3 50", "Walton", "Regina", "Comet", "BMX", "Burrito", "Camper", "Marquis", "Baggage", "Dozer", "Maverick",
64 "News Chopper", "Rancher", "FBI Rancher", "Virgo", "Greenwood", "Jetmax", "Hotring", "Sandking", "Blista Compact", "Police Maverick", "Boxville", "Benson", "Mesa",
65 "RC Goblin", "Hotring Racer A", "Hotring Racer B", "Bloodring Banger", "Rancher", "Super GT", "Elegant", "Journey", "Bike", "Mountain Bike", "Beagle", "Cropdust",
66 "Stunt", "Tanker", "RoadTrain", "Nebula", "Majestic", "Buccaneer", "Shamal", "Hydra", "FCR-900", "NRG-500", "HPV1000", "Cement Truck", "Tow Truck", "Fortune",
67 "Cadrona", "FBI Truck", "Willard", "Forklift", "Tractor", "Combine", "Feltzer", "Remington", "Slamvan", "Blade", "Freight", "Streak", "Vortex", "Vincent", "Bullet",
68 "Clover", "Sadler", "Firetruck", "Hustler", "Intruder", "Primo", "Cargobob", "Tampa", "Sunrise", "Merit", "Utility", "Nevada", "Yosemite", "Windsor", "Monster A",
69 "Monster B", "Uranus", "Jester", "Sultan", "Stratum", "Elegy", "Raindance", "RC Tiger", "Flash", "Tahoma", "Savanna", "Bandito", "Freight", "Trailer", "Kart", "Mower",
70 "Duneride", "Sweeper", "Broadway", "Tornado", "AT-400", "DFT-30", "Huntley", "Stafford", "BF-400", "Newsvan", "Tug", "Trailer A", "Emperor", "Wayfarer", "Euros",
71 "Hotdog", "Club", "Trailer B", "Trailer C", "Andromada", "Dodo", "RC Cam", "Launch", "Police Car (LSPD)", "Police Car (SFPD)", "Police Car (LVPD)", "Police Ranger",
72 "Picador", "S.W.A.T. Van", "Alpha", "Phoenix", "Glendale", "Sadler", "Luggage Trailer A", "Luggage Trailer B", "Stair Trailer", "Boxville", "Farm Plow", "Utility Trailer"
73};
74
75
76forward LoadDealerVehicles();
77forward LoadPlayerVehicles(playerid);
78
79
80public OnFilterScriptInit() {
81
82 mysql_log(ALL);
83 mysql = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE);
84 if(mysql_errno() != 0)
85 print("[MySQL] Failed Connection");
86 else
87 print("[MySQL] Successfully Connected");
88
89 mysql_tquery(mysql, "CREATE TABLE IF NOT EXISTS `Vehicles` (\
90 `vehID` int(11) NOT NULL,\
91 `vehModel` int(11) NOT NULL,\
92 `vehName` varchar(25) NOT NULL,\
93 `vehOwner` varchar(25) NOT NULL default '-',\
94 `vehPlate` varchar(16) NOT NULL default 'UG',\
95 `vehPrice` int(11) NOT NULL,\
96 `vehLock` int(11) NOT NULL,\
97 `vehMod_1` int(11) NOT NULL,\
98 `vehMod_2` int(11) NOT NULL,\
99 `vehMod_3` int(11) NOT NULL,\
100 `vehMod_4` int(11) NOT NULL,\
101 `vehMod_5` int(11) NOT NULL,\
102 `vehMod_6` int(11) NOT NULL,\
103 `vehMod_7` int(11) NOT NULL,\
104 `vehMod_8` int(11) NOT NULL,\
105 `vehMod_9` int(11) NOT NULL,\
106 `vehMod_10` int(11) NOT NULL,\
107 `vehMod_11` int(11) NOT NULL,\
108 `vehMod_12` int(11) NOT NULL,\
109 `vehMod_13` int(11) NOT NULL,\
110 `vehMod_14` int(11) NOT NULL,\
111 `vehColorOne` int(11) NOT NULL,\
112 `vehColorTwo` int(11) NOT NULL,\
113 `vehX` float NOT NULL,\
114 `vehY` float NOT NULL,\
115 `vehZ` float NOT NULL,\
116 `vehA` float NOT NULL,\
117 UNIQUE KEY `vehID` (`vehID`))");
118
119 Iter_Init(PrivateVehicles);
120 mysql_tquery(mysql, "SELECT * FROM `Vehicles` WHERE `vehOwner` = '-'", "LoadDealerVehicles", "");
121 return 1;
122}
123
124public OnFilterScriptExit() {
125
126 foreach(new i : ServerVehicles) {
127
128 if(!strcmp(vInfo[i][vehOwner], "-") || strcmp(vInfo[i][vehOwner], "-")) {
129
130 SaveVehicle(i);
131 DestroyVehicle(vInfo[i][vehSessionID]);
132 DestroyDynamic3DTextLabel(vInfo[i][vehLabel]);
133 }
134 }
135 return 1;
136}
137
138public OnPlayerConnect(playerid) {
139
140 new query[65];
141 mysql_format(mysql, query, sizeof(query), "SELECT * FROM `Vehicles` WHERE `vehOwner` = '%e'", GetName(playerid));
142 mysql_tquery(mysql, query, "LoadPlayerVehicles", "i", playerid);
143 return 1;
144}
145
146public OnPlayerDisconnect(playerid, reason) {
147
148 foreach(new i : PrivateVehicles[playerid]) {
149
150 if(!strcmp(vInfo[i][vehOwner], GetName(playerid))) {
151
152 SaveVehicle(i);
153 DestroyVehicle(vInfo[i][vehSessionID]);
154 Iter_Remove(ServerVehicles, i);
155 }
156 }
157 return 1;
158}
159
160public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
161
162 switch(dialogid) {
163
164 case DIALOG_BUY_VEHICLE: {
165
166 if(response) {
167
168 new i = GetPVarInt(playerid, "buyVehicle");
169 if(GetPlayerMoney(playerid) < vInfo[i][vehPrice]) return SCM(playerid, red, "You don't have enough money");
170 if(strcmp(vInfo[i][vehOwner], "-")) return SCM(playerid, red, "Vehicle is already owned by a player");
171
172 DestroyDynamic3DTextLabel(vInfo[i][vehLabel]);
173 SetVehicleToRespawn(vInfo[i][vehSessionID]);
174
175 GivePlayerMoney(playerid, -vInfo[i][vehPrice]);
176 GetPlayerName(playerid, vInfo[i][vehOwner], MAX_PLAYER_NAME);
177
178 SetVehicleParamsForPlayer(vInfo[i][vehSessionID], playerid, 0, 0);
179 vInfo[i][vehLock] = MODE_NOLOCK;
180
181 format(vInfo[i][vehOwner], MAX_PLAYER_NAME, GetName(playerid));
182
183 Iter_Add(PrivateVehicles[playerid], i);
184 SaveVehicle(i);
185 return 1;
186 }
187 }
188 case DIALOG_VEHICLES: {
189
190 if(response) {
191
192 new count = 0;
193 foreach(new i : PrivateVehicles[playerid]) {
194
195 if(!strcmp(vInfo[i][vehOwner], GetName(playerid))) {
196
197 if(count == listitem) {
198
199 SetPVarInt(playerid, "playerVehID", i);
200 ShowPlayerDialog(playerid, DIALOG_VEHICLES+1, DIALOG_STYLE_LIST, "Vehicles", "Spawn Car\nChange Number Plate\nLock\nUnlock\nEmpty", "Select", "Close");
201 break;
202 }
203 else count++;
204 }
205 }
206 }
207 }
208 case DIALOG_VEHICLES+1: {
209
210 if(response) {
211
212 switch(listitem){
213
214 case 0: {
215
216 new i = GetPVarInt(playerid, "playerVehID");
217
218 GetPlayerPos(playerid, vInfo[i][vehX], vInfo[i][vehY], vInfo[i][vehZ]);
219 GetPlayerFacingAngle(playerid, vInfo[i][vehA]);
220
221 createVehicle(i, vInfo[i][vehX]+3, vInfo[i][vehY], vInfo[i][vehZ], vInfo[i][vehA], true);
222 SaveVehicle(i);
223 }
224 case 1: ShowPlayerDialog(playerid, DIALOG_VEHICLES+2, DIALOG_STYLE_INPUT, "Vehicle Plate", "{FFFFFF}Enter the new vehicle number plate below", "Next", "Close");
225 case 2: {
226
227 new i = GetPVarInt(playerid, "playerVehID");
228
229 foreach(new x : Player) if(x != playerid) SetVehicleParamsForPlayer(vInfo[i][vehSessionID], x, 0, 1);
230
231 vInfo[i][vehLock] = MODE_LOCK;
232 SaveVehicle(i);
233 SCM(playerid, green, "You have locked your vehicle");
234 }
235 case 3: {
236
237 new i = GetPVarInt(playerid, "playerVehID");
238
239 foreach(new x : Player) if(x != playerid) SetVehicleParamsForPlayer(vInfo[i][vehSessionID], x, 0, 0);
240 vInfo[i][vehLock] = MODE_NOLOCK;
241 SaveVehicle(i);
242 SCM(playerid, green, "You have unlocked your vehicle");
243 }
244 case 4: {
245
246 new i = GetPVarInt(playerid, "playerVehID");
247
248 foreach(new x : Player) {
249
250 if(IsPlayerInVehicle(x, vInfo[i][vehSessionID])) {
251
252 RemovePlayerFromVehicle(x);
253 }
254 }
255 SCM(playerid, green, "You have ejected all the players from your vehicle");
256 }
257 }
258 }
259 }
260 case DIALOG_VEHICLES+2: {
261
262 if(response) {
263
264 new i = GetPVarInt(playerid, "playerVehID");
265
266 SetVehicleNumberPlate(vInfo[i][vehSessionID], inputtext);
267 format(vInfo[i][vehPlate], 16, inputtext);
268
269 SetVehicleToRespawn(vInfo[i][vehSessionID]);
270
271 if(IsPlayerInVehicle(playerid, vInfo[i][vehSessionID])) {
272
273 new Float:playerX, Float:playerY, Float:playerZ;
274 GetPlayerPos(playerid, playerX, playerY, playerZ);
275
276 SetVehiclePos(vInfo[i][vehSessionID], playerX, playerY, playerZ);
277 PutPlayerInVehicle(playerid, vInfo[i][vehSessionID], 0);
278 }
279
280 SaveVehicle(i);
281 }
282 }
283 }
284 return 0;
285}
286
287public OnVehicleMod(playerid, vehicleid, componentid) {
288
289 foreach(new i : PrivateVehicles[playerid]) {
290
291 if(IsPlayerInVehicle(playerid, vInfo[i][vehSessionID])) {
292
293 if(!strcmp(vInfo[i][vehOwner], GetName(playerid))) {
294
295 for(new x; x < 14; x++) {
296
297 if(GetVehicleComponentType(componentid) == x) {
298
299 vInfo[i][vehMod][x] = componentid;
300 }
301 }
302 SaveVehicle(i);
303 }
304 }
305 }
306 return 1;
307}
308
309public OnVehicleSpawn(vehicleid) {
310
311 foreach(new playerid : Player) {
312
313 foreach(new i : PrivateVehicles[playerid]) {
314
315 for(new x = 0; x < 14; x++) {
316
317 if(!strcmp(vInfo[i][vehOwner], GetName(playerid))) {
318
319 if(vInfo[i][vehMod][x] > 0) AddVehicleComponent(vInfo[i][vehSessionID], vInfo[i][vehMod][x]);
320 }
321 }
322 }
323 }
324 return 1;
325}
326
327public OnVehicleRespray(playerid, vehicleid, color1, color2)
328{
329 foreach(new i : PrivateVehicles[playerid]) {
330
331 if(IsPlayerInVehicle(playerid, vInfo[i][vehSessionID])) {
332
333 if(!strcmp(vInfo[i][vehOwner], GetName(playerid))) {
334
335 vInfo[i][vehColorOne] = color1;
336 vInfo[i][vehColorTwo] = color2;
337 ChangeVehicleColor(vInfo[i][vehSessionID], vInfo[i][vehColorOne], vInfo[i][vehColorTwo]);
338 SaveVehicle(i);
339 }
340 }
341 }
342 return 0;
343}
344
345CMD:buyvehicle(playerid, params[])
346{
347 new id, string[100];
348 if(sscanf(params, "i", id)) return SCM(playerid, red, "Buy vehicle: /buyvehicle <VehicleID>");
349 if(!Iter_Contains(ServerVehicles, id)) return SendClientMessage(playerid, red, "Invalid vehicle ID");
350
351 if(!strcmp(vInfo[id][vehOwner], "-")) {
352
353 SetPVarInt(playerid, "buyVehicle", id);
354 format(string, sizeof(string), "{FFFFFF}Vehicle: {00FF00}%s \n{FFFFFF}Price: {00FF00}$%s \n{FFFFFF}Buy it?", vInfo[id][vehName], cNumber(vInfo[id][vehPrice]));
355 ShowPlayerDialog(playerid, DIALOG_BUY_VEHICLE, DIALOG_STYLE_MSGBOX, "Buy Vehicle", string, "Buy", "Close");
356 return 1;
357 }
358 else return SCM(playerid, red, "Vehicle is already owned by a player");
359}
360
361CMD:vehicles(playerid, params[])
362{
363 new bool:found = false, list[512];
364 list = "ID\tVehicle\tNumber Plate\n";
365 foreach(new i : PrivateVehicles[playerid]) {
366
367 if(!strcmp(vInfo[i][vehOwner], GetName(playerid))) {
368
369 found = true;
370 format(list, sizeof(list), "%s%d\t%s\t%s\n", list, i, vInfo[i][vehName], vInfo[i][vehPlate]);
371 }
372 }
373 if(found == true) return ShowPlayerDialog(playerid, DIALOG_VEHICLES, DIALOG_STYLE_TABLIST_HEADERS, "Vehicles", list, "Select", "Close");
374 else return ShowPlayerDialog(playerid, 2114, DIALOG_STYLE_MSGBOX, "Vehicles", "{FF0000}No vehicles found", "Close", "");
375}
376CMD:v(playerid, params[]) return cmd_vehicles(playerid, params);
377
378CMD:changeplate(playerid, params[])
379{
380 new txt[16];
381 if(sscanf(params, "s[16]", txt)) return SCM(playerid, red, "Change vehicle number plate: /changeplate <Text>");
382 if(strlen(txt) > 16) return SCM(playerid, red, "Input text is too long");
383 if(!IsPlayerInAnyVehicle(playerid)) return SCM(playerid, red, "You are not inside any vheicle");
384 if(GetPlayerState(playerid) == PLAYER_STATE_PASSENGER) return SCM(playerid, red, "You must be the driver to use this command");
385
386 foreach(new i : PrivateVehicles[playerid]) {
387
388 if(IsPlayerInVehicle(playerid, vInfo[i][vehSessionID])) {
389
390 if(!strcmp(vInfo[i][vehOwner], GetName(playerid))) {
391
392 SetVehicleNumberPlate(vInfo[i][vehSessionID], txt);
393 vInfo[i][vehPlate] = txt;
394
395 new Float:playerX, Float:playerY, Float:playerZ;
396 GetPlayerPos(playerid, playerX, playerY, playerZ);
397
398 SetVehicleToRespawn(vInfo[i][vehSessionID]);
399 SetVehiclePos(vInfo[i][vehSessionID], playerX, playerY, playerZ);
400 PutPlayerInVehicle(playerid, vInfo[i][vehSessionID], 0);
401
402 SaveVehicle(i);
403 }
404 else return SCM(playerid, red, "You are not the owner of this vehicle");
405 }
406 }
407
408 SCM(playerid, red, "You have changed your vehicle's number plate");
409 return 1;
410}
411CMD:cplate(playerid, params[]) return cmd_changeplate(playerid, params);
412
413CMD:lock(playerid, params[])
414{
415 if(isnull(params))
416 {
417 foreach(new i : ServerVehicles) {
418
419 if(IsPlayerInVehicle(playerid, vInfo[i][vehSessionID])) {
420
421 if(!strcmp(vInfo[i][vehOwner], GetName(playerid))) {
422
423 foreach(new x : Player) if(x != playerid) SetVehicleParamsForPlayer(vInfo[i][vehSessionID], x, 0, 1);
424
425 GameTextForPlayer(playerid, "~w~LOCKED", 2000, 3);
426 vInfo[i][vehLock] = MODE_LOCK;
427 SaveVehicle(i);
428 }
429 else return SCM(playerid, red, "You are not the owner of this vehicle");
430 }
431 }
432 return 1;
433 }
434
435 new id;
436 if(sscanf(params, "i", id)) return SCM(playerid, red, "Unlock vehicle: /unlock <VehicleID>");
437 if(!Iter_Contains(ServerVehicles, id)) return SendClientMessage(playerid, red, "Invalid vehicle ID");
438 if(strcmp(vInfo[id][vehOwner], GetName(playerid))) return SCM(playerid, red, "You are not the owner of this vehicle");
439
440 if(vInfo[id][vehLock] == MODE_NOLOCK) {
441
442 foreach(new x : Player) if(x != playerid) SetVehicleParamsForPlayer(vInfo[id][vehSessionID], x, 0, 1);
443
444 GameTextForPlayer(playerid, "~w~LOCKED", 2000, 3);
445 vInfo[id][vehLock] = MODE_LOCK;
446 SaveVehicle(id);
447 return 1;
448 }
449 else return SCM(playerid, red, "Vehicles is already locked");
450}
451
452CMD:unlock(playerid, params[])
453{
454 if(isnull(params)){
455
456 foreach(new i : ServerVehicles) {
457
458 if(IsPlayerInVehicle(playerid, vInfo[i][vehSessionID])) {
459
460 if(!strcmp(vInfo[i][vehOwner], GetName(playerid))) {
461
462 foreach(new x : Player) if(x != playerid) SetVehicleParamsForPlayer(vInfo[i][vehSessionID], x, 0, 0);
463
464 GameTextForPlayer(playerid, "~w~UNLOCKED", 2000, 3);
465 vInfo[i][vehLock] = MODE_NOLOCK;
466 SaveVehicle(i);
467 }
468 else return SCM(playerid, red, "You are not the owner of this vehicle");
469 }
470 }
471 return 1;
472 }
473
474 new id;
475 if(sscanf(params, "i", id)) return SCM(playerid, red, "Unlock vehicle: /unlock <VehicleID>");
476 if(!Iter_Contains(ServerVehicles, id)) return SendClientMessage(playerid, red, "Invalid vehicle ID");
477 if(strcmp(vInfo[id][vehOwner], GetName(playerid))) return SCM(playerid, red, "You are not the owner of this vehicle");
478
479 if(vInfo[id][vehLock] == MODE_LOCK) {
480
481 foreach(new x : Player) if(x != playerid) SetVehicleParamsForPlayer(vInfo[id][vehSessionID], x, 0, 0);
482
483 GameTextForPlayer(playerid, "~w~UNLOCKED", 2000, 3);
484 vInfo[id][vehLock] = MODE_NOLOCK;
485 SaveVehicle(id);
486 return 1;
487 }
488 else return SCM(playerid, red, "Vehicles is already unlocked");
489}
490
491CMD:createvehicle(playerid, params[])
492{
493 if(!IsPlayerAdmin(playerid)) return SCM(playerid, red, "You must be administrator to use this command");
494
495 new modelid[30], vehid, color1, color2, price;
496 if(sscanf(params, "s[30]iid", modelid, color1, color2, price)) return SCM(playerid, red, "Create vehicle: /createvehicle <ModelID/Vehicle Name> <Color1> <Color2> <Price>");
497
498 if(IsNumeric(modelid)) vehid = strval(modelid);
499 else vehid = ReturnVehicleModelID(modelid);
500
501 if(vehid < 400 || vehid > 611) return SCM(playerid, red, "Invalid vehicle model!");
502
503 new index = Iter_Free(ServerVehicles);
504 if(index == -1) return SCM(playerid, red, "You can't create more vehicle!");
505
506 if(IsPlayerInAnyVehicle(playerid)) DestroyVehicle(GetPlayerVehicleID(playerid));
507
508 GetPlayerPos(playerid, vInfo[index][vehX], vInfo[index][vehY], vInfo[index][vehZ]);
509 GetPlayerFacingAngle(playerid, vInfo[index][vehA]);
510
511 SetPlayerPos(playerid, vInfo[index][vehX] + 3, vInfo[index][vehY], vInfo[index][vehZ]);
512
513 vInfo[index][vehSessionID] = CreateVehicle(vehid, vInfo[index][vehX], vInfo[index][vehY], vInfo[index][vehZ], vInfo[index][vehA], color1, color2, 10);
514 SetVehicleParamsEx(vInfo[index][vehSessionID], 0, 0, 0, 1, 0, 0, 0);
515 SetVehicleNumberPlate(vInfo[index][vehSessionID], "OMAR");
516
517 format(vInfo[index][vehName], MAX_PLAYER_NAME, GetVehicleName(vehid));
518 format(vInfo[index][vehOwner], MAX_PLAYER_NAME, "-");
519 format(vInfo[index][vehPlate], 16, "OMAR");
520
521 vInfo[index][vehModel] = vehid;
522 vInfo[index][vehPrice] = price;
523 vInfo[index][vehLock] = MODE_LOCK;
524 vInfo[index][vehColorOne] = color1;
525 vInfo[index][vehColorTwo] = color2;
526
527 new query[220];
528 format(query, sizeof(query), "VehicleID: %d\nVehicle: %s\nPrice: $%s\nType /buyvehicle to buy!", index, vInfo[index][vehName], cNumber(vInfo[index][vehPrice]));
529
530 vInfo[index][vehLabel] = CreateDynamic3DTextLabel(query, 0xFFFF00FF, vInfo[index][vehX], vInfo[index][vehY], vInfo[index][vehZ], 10.0, INVALID_PLAYER_ID, vInfo[index][vehSessionID]);
531
532
533 mysql_format(mysql, query, sizeof(query),
534 "INSERT INTO `Vehicles` (vehModel, vehPrice, vehName, vehPlate, vehColorOne, vehColorTwo, vehX, vehY, vehZ, vehA) VALUES (%d, %d, '%e', '%e', %d, %d, %f, %f, %f, %f)",
535 vInfo[index][vehModel], vInfo[index][vehPrice], vInfo[index][vehName], vInfo[index][vehPlate], vInfo[index][vehColorOne], vInfo[index][vehColorTwo], vInfo[index][vehX],
536 vInfo[index][vehY], vInfo[index][vehZ], vInfo[index][vehA]);
537 mysql_tquery(mysql, query, "OnDealerVehicleCreated", "i", index);
538
539 format(query, sizeof(query), "You have created a vehicle - ModelID: %d, VehicleID: %d, Price: %d", vInfo[index][vehModel], index, vInfo[index][vehPrice]);
540 SCM(playerid, red, query);
541 return 1;
542}
543CMD:vcreate(playerid, params[]) return cmd_createvehicle(playerid, params);
544
545CMD:gotovehicle(playerid, params[])
546{
547 if(!IsPlayerAdmin(playerid)) return SCM(playerid, red, "You must be administrator to use this command");
548
549 new id;
550 if(sscanf(params, "i", id)) return SCM(playerid, red, "Teleport to vehicle: /gotovehicle <VehicleID>");
551 if(!Iter_Contains(ServerVehicles, id)) return SendClientMessage(playerid, red, "Invalid vehicle ID");
552
553 GetVehiclePos(vInfo[id][vehSessionID], vInfo[id][vehX], vInfo[id][vehY], vInfo[id][vehZ]);
554
555 SetPlayerPos(playerid, vInfo[id][vehX], vInfo[id][vehY], vInfo[id][vehZ]+3);
556 SetPlayerInterior(playerid, 0);
557 SetPlayerVirtualWorld(playerid, 0);
558 return 1;
559}
560
561CMD:setvehicleprice(playerid, params[])
562{
563 if(!IsPlayerAdmin(playerid)) return SCM(playerid, red, "You must be administrator to use this command");
564
565 new id, price;
566 if(sscanf(params, "ii", id, price)) return SCM(playerid, red, "Set vehicle price: /setvehicleprice <VehicleID> <Price>");
567 if(!Iter_Contains(ServerVehicles, id)) return SendClientMessage(playerid, red, "Invalid vehicle ID");
568
569 new query[64];
570 mysql_format(mysql, query, sizeof(query), "UPDATE `Vehicles` SET `vehPrice` = %i WHERE `vehID` = %d", price, vInfo[id][vehID]);
571 mysql_tquery(mysql, query);
572
573 SCM(playerid, red, "Price updated");
574 return 1;
575}
576CMD:setvprice(playerid, params[]) return cmd_setvehicleprice(playerid, params);
577
578CMD:deletevehicle(playerid, params[])
579{
580 if(!IsPlayerAdmin(playerid)) return SCM(playerid, red, "You must be administrator to use this command");
581
582 new id;
583 if(sscanf(params, "i", id)) return SCM(playerid, red, "Delete vehicle: /deletevehicle <VehicleID>");
584 if(!Iter_Contains(ServerVehicles, id)) return SendClientMessage(playerid, red, "Invalid vehicle ID");
585
586 ResetVehicle(id);
587
588 Iter_Remove(ServerVehicles, id);
589
590 new query[45];
591 mysql_format(mysql, query, sizeof(query), "DELETE FROM `Vehicles` WHERE `vehID` = %d", vInfo[id][vehID]);
592 mysql_tquery(mysql, query);
593
594 SCM(playerid, red, "Vehicle deleted");
595 return 1;
596}
597CMD:vdel(playerid, params[]) return cmd_deletevehicle(playerid, params);
598
599
600public LoadDealerVehicles() {
601
602 new rows = cache_num_rows();
603 if(rows) {
604
605 new string[75];
606 for(new i; i < rows; i++) {
607
608 new id = Iter_Free(ServerVehicles);
609
610 cache_get_value_name(i, "vehOwner", vInfo[id][vehOwner], .max_len = MAX_PLAYER_NAME);
611 cache_get_value_name_int(i, "vehModel", vInfo[id][vehModel]);
612 cache_get_value_name(i, "vehName", vInfo[id][vehName]);
613 cache_get_value_name(i, "vehPlate", vInfo[id][vehPlate]);
614 cache_get_value_name_int(i, "vehPrice", vInfo[id][vehPrice]);
615 cache_get_value_name_int(i, "vehColorOne", vInfo[id][vehColorOne]);
616 cache_get_value_name_int(i, "vehColorTwo", vInfo[id][vehColorTwo]);
617 cache_get_value_name_float(i, "vehX", vInfo[id][vehX]);
618 cache_get_value_name_float(i, "vehY", vInfo[id][vehY]);
619 cache_get_value_name_float(i, "vehZ", vInfo[id][vehZ]);
620 cache_get_value_name_float(i, "vehA", vInfo[id][vehA]);
621
622 vInfo[id][vehSessionID] = CreateVehicle(vInfo[id][vehModel], vInfo[id][vehX], vInfo[id][vehY], vInfo[id][vehZ], vInfo[id][vehA], vInfo[id][vehColorOne], vInfo[id][vehColorTwo], -1);
623
624 cache_get_value_name_int(i, "vehID", vInfo[id][vehID]);
625
626 SetVehicleToRespawn(vInfo[id][vehSessionID]);
627 SetVehicleParamsEx(vInfo[id][vehSessionID], 0, 0, 0, 1, 0, 0, 0);
628 SetVehicleNumberPlate(vInfo[id][vehSessionID], "OMAR");
629
630 format(string, sizeof(string), "VehicleID: %d\nVehicle: %s\nPrice: $%s\nType /buyvehicle to buy!", id, vInfo[id][vehName], cNumber(vInfo[id][vehPrice]));
631
632 vInfo[id][vehLabel] = CreateDynamic3DTextLabel(string, 0xFFFF00FF, vInfo[id][vehX], vInfo[id][vehY], vInfo[id][vehZ], 10.0, INVALID_PLAYER_ID, vInfo[id][vehSessionID]);
633 Iter_Add(ServerVehicles, id);
634 }
635 printf("Loaded %d vehicles for dealership", rows);
636 }
637 return 1;
638}
639
640public LoadPlayerVehicles(playerid) {
641
642 new rows = cache_num_rows();
643 if(rows) {
644
645 for(new i; i < rows; i++) {
646
647 new id = Iter_Free(ServerVehicles);
648
649 cache_get_value_name(i, "vehOwner", vInfo[id][vehOwner], .max_len = MAX_PLAYER_NAME);
650 cache_get_value_name_int(i, "vehModel", vInfo[id][vehModel]);
651 cache_get_value_name(i, "vehName", vInfo[id][vehName]);
652 cache_get_value_name(i, "vehPlate", vInfo[id][vehPlate]);
653 cache_get_value_name_int(i, "vehPrice", vInfo[id][vehPrice]);
654 cache_get_value_name_int(i, "vehLock", vInfo[id][vehLock]);
655 cache_get_value_name_int(i, "vehColorOne", vInfo[id][vehColorOne]);
656 cache_get_value_name_int(i, "vehColorTwo", vInfo[id][vehColorTwo]);
657 cache_get_value_name_int(i, "vehMod_1", vInfo[id][vehMod][0]);
658 cache_get_value_name_int(i, "vehMod_2", vInfo[id][vehMod][1]);
659 cache_get_value_name_int(i, "vehMod_3", vInfo[id][vehMod][2]);
660 cache_get_value_name_int(i, "vehMod_4", vInfo[id][vehMod][3]);
661 cache_get_value_name_int(i, "vehMod_5", vInfo[id][vehMod][4]);
662 cache_get_value_name_int(i, "vehMod_6", vInfo[id][vehMod][5]);
663 cache_get_value_name_int(i, "vehMod_7", vInfo[id][vehMod][6]);
664 cache_get_value_name_int(i, "vehMod_8", vInfo[id][vehMod][7]);
665 cache_get_value_name_int(i, "vehMod_9", vInfo[id][vehMod][8]);
666 cache_get_value_name_int(i, "vehMod_10", vInfo[id][vehMod][9]);
667 cache_get_value_name_int(i, "vehMod_11", vInfo[id][vehMod][10]);
668 cache_get_value_name_int(i, "vehMod_12", vInfo[id][vehMod][11]);
669 cache_get_value_name_int(i, "vehMod_13", vInfo[id][vehMod][12]);
670 cache_get_value_name_int(i, "vehMod_14", vInfo[id][vehMod][13]);
671 cache_get_value_name_float(i, "vehX", vInfo[id][vehX]);
672 cache_get_value_name_float(i, "vehY", vInfo[id][vehY]);
673 cache_get_value_name_float(i, "vehZ", vInfo[id][vehZ]);
674 cache_get_value_name_float(i, "vehA", vInfo[id][vehA]);
675
676 vInfo[id][vehSessionID] = CreateVehicle(vInfo[id][vehModel], vInfo[id][vehX], vInfo[id][vehY], vInfo[id][vehZ], vInfo[id][vehA], vInfo[id][vehColorOne], vInfo[id][vehColorTwo], -1);
677
678 cache_get_value_name_int(i, "vehID", vInfo[id][vehID]);
679
680 format(vInfo[id][vehName], MAX_PLAYER_NAME, GetVehicleName(vInfo[id][vehModel]));
681 format(vInfo[id][vehPlate], 16, vInfo[id][vehPlate]);
682 format(vInfo[id][vehOwner], MAX_PLAYER_NAME, GetName(playerid));
683
684 SetVehicleToRespawn(vInfo[id][vehSessionID]);
685 SetVehicleParamsEx(vInfo[id][vehSessionID], 0, 0, 0, vInfo[id][vehLock], 0, 0, 0);
686 SetVehicleNumberPlate(vInfo[id][vehSessionID], vInfo[id][vehPlate]);
687 for(new x = 0; x < 14; x++) if(vInfo[id][vehMod][x] > 0) AddVehicleComponent(vInfo[id][vehSessionID], vInfo[id][vehMod][x]);
688
689 Iter_Add(PrivateVehicles[playerid], id);
690 Iter_Add(ServerVehicles, id);
691 }
692 printf("Loaded %d vehicles for %s", rows, GetName(playerid));
693 }
694 return 1;
695}
696
697SaveVehicle(vehicleid) {
698
699 if(!Iter_Contains(ServerVehicles, vehicleid)) return 0;
700
701 format(vInfo[vehicleid][vehName], 16, GetVehicleName(vInfo[vehicleid][vehModel]));
702 GetVehiclePos(vInfo[vehicleid][vehSessionID], vInfo[vehicleid][vehX], vInfo[vehicleid][vehY], vInfo[vehicleid][vehZ]);
703 GetVehicleZAngle(vInfo[vehicleid][vehSessionID], vInfo[vehicleid][vehA]);
704
705 new query[500];
706 mysql_format(mysql, query, sizeof(query), "UPDATE `Vehicles` SET `vehName` = '%e', `vehOwner` = '%e', `vehLock` = %i, `vehModel` = %i,\
707 `vehPlate` = '%e', `vehMod_1` = %i, `vehMod_2` = %i, `vehMod_3` = %i, `vehMod_4` = %i, `vehMod_5` = %i, `vehMod_6` = %i, `vehMod_7` = %i,\
708 `vehMod_8` = %i, `vehMod_9` = %i, `vehMod_10` = %i, `vehMod_11` = %i, `vehMod_12` = %i, `vehMod_13` = %i, `vehMod_14` = %i, `vehColorOne` = %i,\
709 `vehColorTwo` = %i, `vehX` = %f, `vehY` = %f, `vehZ` = %f, `vehA` = %f WHERE `vehID` = %d", vInfo[vehicleid][vehName], vInfo[vehicleid][vehOwner],
710 vInfo[vehicleid][vehLock], vInfo[vehicleid][vehModel], vInfo[vehicleid][vehPlate], vInfo[vehicleid][vehMod][0], vInfo[vehicleid][vehMod][1], vInfo[vehicleid][vehMod][2],
711 vInfo[vehicleid][vehMod][3], vInfo[vehicleid][vehMod][4], vInfo[vehicleid][vehMod][5], vInfo[vehicleid][vehMod][6], vInfo[vehicleid][vehMod][7], vInfo[vehicleid][vehMod][8],
712 vInfo[vehicleid][vehMod][9], vInfo[vehicleid][vehMod][10], vInfo[vehicleid][vehMod][11], vInfo[vehicleid][vehMod][12], vInfo[vehicleid][vehMod][13], vInfo[vehicleid][vehColorOne],
713 vInfo[vehicleid][vehColorTwo], vInfo[vehicleid][vehX], vInfo[vehicleid][vehY], vInfo[vehicleid][vehZ], vInfo[vehicleid][vehA], vInfo[vehicleid][vehID]);
714 mysql_tquery(mysql, query);
715 return 1;
716}
717
718ResetVehicle(vehicleid)
719{
720 if(!Iter_Contains(ServerVehicles, vehicleid)) return 0;
721
722 foreach(new i : Player) {
723
724 if(!strcmp(vInfo[vehicleid][vehOwner], GetName(i))) {
725
726 Iter_Remove(PrivateVehicles[i], vehicleid);
727 }
728 }
729
730 format(vInfo[vehicleid][vehOwner], MAX_PLAYER_NAME, "-");
731 format(vInfo[vehicleid][vehPlate], 16, "UG");
732 vInfo[vehicleid][vehModel] = -1;
733 vInfo[vehicleid][vehLock] = MODE_NOLOCK;
734 vInfo[vehicleid][vehPrice] = 0;
735 vInfo[vehicleid][vehColorOne] = -1;
736 vInfo[vehicleid][vehColorTwo] = -1;
737
738 for(new i = 0; i < 14; i++) {
739
740 if(vInfo[vehicleid][vehMod][i] > 0) {
741
742 RemoveVehicleComponent(vInfo[vehicleid][vehSessionID], vInfo[vehicleid][vehMod][i]);
743 vInfo[vehicleid][vehMod][i] = 0;
744 }
745 }
746
747 if(IsValidDynamic3DTextLabel(vInfo[vehicleid][vehLabel])) DestroyDynamic3DTextLabel(vInfo[vehicleid][vehLabel]);
748 DestroyVehicle(vInfo[vehicleid][vehSessionID]);
749 return 1;
750}
751
752forward OnDealerVehicleCreated(vehicleid);
753public OnDealerVehicleCreated(vehicleid) {
754
755 vInfo[vehicleid][vehID] = cache_insert_id();
756 Iter_Add(ServerVehicles, vehicleid);
757 return 1;
758}
759
760createVehicle(vehicleid, Float:itsX, Float:itsY, Float:itsZ, Float:itsA, bool:removeold = false) {
761
762 if(removeold == true) {
763
764 DestroyVehicle(vInfo[vehicleid][vehSessionID]);
765 }
766
767 vInfo[vehicleid][vehSessionID] = CreateVehicle(vInfo[vehicleid][vehModel], itsX, itsY, itsZ, itsA, vInfo[vehicleid][vehColorOne], vInfo[vehicleid][vehColorTwo], -1);
768 format(vInfo[vehicleid][vehName], MAX_PLAYER_NAME, GetVehicleName(vInfo[vehicleid][vehModel]));
769 SetVehicleParamsEx(vInfo[vehicleid][vehSessionID], 0, 0, 0, 1, 0, 0, 0);
770 SetVehicleNumberPlate(vInfo[vehicleid][vehSessionID], vInfo[vehicleid][vehPlate]);
771 for(new x = 0; x < 14; x++) if(vInfo[vehicleid][vehMod][x] > 0) AddVehicleComponent(vInfo[vehicleid][vehSessionID], vInfo[vehicleid][vehMod][x]);
772 ChangeVehicleColor(vInfo[vehicleid][vehSessionID], vInfo[vehicleid][vehColorOne], vInfo[vehicleid][vehColorTwo]);
773 SetVehicleToRespawn(vInfo[vehicleid][vehSessionID]);
774 return 1;
775}
776
777GetVehicleName(modelid) {
778
779 new string[20];
780 format(string,sizeof(string),"%s",VehicleNames[modelid - 400]);
781 return string;
782}
783
784GetName(playerid) {
785
786 new pName[MAX_PLAYER_NAME+1];
787 GetPlayerName(playerid, pName, MAX_PLAYER_NAME);
788 return pName;
789}
790
791cNumber(integer, const separator[] = ",") {
792
793 new string[16];
794 format(string, sizeof(string), "%i", integer);
795
796 if(integer >= 1000) {
797
798 for(new i = (strlen(string) - 3); i > 0; i -= 3) {
799
800 strins(string, separator, i);
801 }
802 }
803 return string;
804}
805
806IsNumeric(string[]) {
807
808 for (new i = 0, j = strlen(string); i < j; i++) {
809
810 if (string[i] > '9' || string[i] < '0') return 0;
811 }
812 return 1;
813}
814
815ReturnVehicleModelID(Name[]) {
816
817 for(new i; i != 211; i++) if(strfind(VehicleNames[i], Name, true) != -1) return i + 400;
818 return INVALID_VEHICLE_ID;
819}