· 7 years ago · Dec 29, 2018, 08:18 PM
1
2#define MAX_EDIT_CARS 10
3#define MAX_CAR_OBJECTS 30
4#define MAX_CAR_COMPONENTS 14
5
6#define NOMODSHOP 0
7#define TRANSFENDER 1
8#define LOCOLOWCO 2
9#define WHEELARCHANGELS 3
10
11
12// Edit check makes sure the player is actually has a vehicle selected
13#define VehicleCheck(%0); if(CurrVehicle[%0] == -1) { \
14 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________"); \
15 return SendClientMessage(playerid, STEALTH_YELLOW, "You need to select an vehicle to use this command"); }
16
17enum CARINFO
18{
19 CarID,
20 CarModel,
21 Text3D:CarText,
22 CarColor1,
23 CarColor2,
24 CarPaintJob,
25 CarSiren,
26 Float:CarSpawnX,
27 Float:CarSpawnY,
28 Float:CarSpawnZ,
29 Float:CarSpawnFA,
30 CarComponents[MAX_CAR_COMPONENTS],
31 CarObjectRef[MAX_CAR_OBJECTS],
32 Float:COX[MAX_CAR_OBJECTS],
33 Float:COY[MAX_CAR_OBJECTS],
34 Float:COZ[MAX_CAR_OBJECTS],
35 Float:CORX[MAX_CAR_OBJECTS],
36 Float:CORY[MAX_CAR_OBJECTS],
37 Float:CORZ[MAX_CAR_OBJECTS],
38}
39
40new Iterator:Cars<MAX_EDIT_CARS>;
41new CarData[MAX_EDIT_CARS][CARINFO];
42
43new CurrVehicle[MAX_PLAYERS] = { -1, ... };
44static TempVehicle[MAX_PLAYERS] = { -1, ... };
45static bool:IsTempVehicle[MAX_VEHICLES] = { false, ... };
46
47static VehicleNames[212][] = {
48 {"Landstalker"},{"Bravura"},{"Buffalo"},{"Linerunner"},{"Perrenial"},{"Sentinel"},{"Dumper"},
49 {"Firetruck"},{"Trashmaster"},{"Stretch"},{"Manana"},{"Infernus"},{"Voodoo"},{"Pony"},{"Mule"},
50 {"Cheetah"},{"Ambulance"},{"Leviathan"},{"Moonbeam"},{"Esperanto"},{"Taxi"},{"Washington"},
51 {"Bobcat"},{"Mr Whoopee"},{"BF Injection"},{"Hunter"},{"Premier"},{"Enforcer"},{"Securicar"},
52 {"Banshee"},{"Predator"},{"Bus"},{"Rhino"},{"Barracks"},{"Hotknife"},{"Trailer 1"},{"Previon"},
53 {"Coach"},{"Cabbie"},{"Stallion"},{"Rumpo"},{"RC Bandit"},{"Romero"},{"Packer"},{"Monster"},
54 {"Admiral"},{"Squalo"},{"Seasparrow"},{"Pizzaboy"},{"Tram"},{"Trailer 2"},{"Turismo"},
55 {"Speeder"},{"Reefer"},{"Tropic"},{"Flatbed"},{"Yankee"},{"Caddy"},{"Solair"},{"Berkley's RC Van"},
56 {"Skimmer"},{"PCJ-600"},{"Faggio"},{"Freeway"},{"RC Baron"},{"RC Raider"},{"Glendale"},{"Oceanic"},
57 {"Sanchez"},{"Sparrow"},{"Patriot"},{"Quad"},{"Coastguard"},{"Dinghy"},{"Hermes"},{"Sabre"},
58 {"Rustler"},{"ZR-350"},{"Walton"},{"Regina"},{"Comet"},{"BMX"},{"Burrito"},{"Camper"},{"Marquis"},
59 {"Baggage"},{"Dozer"},{"Maverick"},{"News Chopper"},{"Rancher"},{"FBI Rancher"},{"Virgo"},{"Greenwood"},
60 {"Jetmax"},{"Hotring"},{"Sandking"},{"Blista Compact"},{"Police Maverick"},{"Boxville"},{"Benson"},
61 {"Mesa"},{"RC Goblin"},{"Hotring Racer A"},{"Hotring Racer B"},{"Bloodring Banger"},{"Rancher"},
62 {"Super GT"},{"Elegant"},{"Journey"},{"Bike"},{"Mountain Bike"},{"Beagle"},{"Cropdust"},{"Stunt"},
63 {"Tanker"}, {"Roadtrain"},{"Nebula"},{"Majestic"},{"Buccaneer"},{"Shamal"},{"Hydra"},{"FCR-900"},
64 {"NRG-500"},{"HPV1000"},{"Cement Truck"},{"Tow Truck"},{"Fortune"},{"Cadrona"},{"FBI Truck"},
65 {"Willard"},{"Forklift"},{"Tractor"},{"Combine"},{"Feltzer"},{"Remington"},{"Slamvan"},
66 {"Blade"},{"Freight"},{"Streak"},{"Vortex"},{"Vincent"},{"Bullet"},{"Clover"},{"Sadler"},
67 {"Firetruck LA"},{"Hustler"},{"Intruder"},{"Primo"},{"Cargobob"},{"Tampa"},{"Sunrise"},{"Merit"},
68 {"Utility"},{"Nevada"},{"Yosemite"},{"Windsor"},{"Monster A"},{"Monster B"},{"Uranus"},{"Jester"},
69 {"Sultan"},{"Stratum"},{"Elegy"},{"Raindance"},{"RC Tiger"},{"Flash"},{"Tahoma"},{"Savanna"},
70 {"Bandito"},{"Freight Flat"},{"Streak Carriage"},{"Kart"},{"Mower"},{"Duneride"},{"Sweeper"},
71 {"Broadway"},{"Tornado"},{"AT-400"},{"DFT-30"},{"Huntley"},{"Stafford"},{"BF-400"},{"Newsvan"},
72 {"Tug"},{"Trailer 3"},{"Emperor"},{"Wayfarer"},{"Euros"},{"Hotdog"},{"Club"},{"Freight Carriage"},
73 {"Trailer 3"},{"Andromada"},{"Dodo"},{"RC Cam"},{"Launch"},{"Police Car (LSPD)"},{"Police Car (SFPD)"},
74 {"Police Car (LVPD)"},{"Police Ranger"},{"Picador"},{"S.W.A.T. Van"},{"Alpha"},{"Phoenix"},{"Glendale"},
75 {"Sadler"},{"Luggage Trailer A"},{"Luggage Trailer B"},{"Stair Trailer"},{"Boxville"},{"Farm Plow"},
76 {"Utility Trailer"}
77};
78
79static CarModShops[212] = {
80 1,1,1,0,0,1,0,0,0,1,1,1,2,0,0,1,0,0,1,1,
81 1,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,1,
82 0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
83 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,1,1,1,
84 1,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,0,
85 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,0,
86 0,0,0,0,0,0,1,1,0,1,0,0,0,1,2,2,2,0,0,0,
87 1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,1,0,0,3,3,
88 3,3,3,0,0,3,2,2,0,0,0,0,0,0,0,2,2,0,0,1,
89 1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,
90 1,0,1,1,0,0,0,0,0,0,0,0
91};
92
93static Float:ModCarPos[MAX_PLAYERS][4];
94
95YCMD:avmodcar(playerid, arg[], help)
96{
97 if(help)
98 {
99 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
100 SendClientMessage(playerid, STEALTH_GREEN, "Modify car components using modshop.");
101 return 1;
102 }
103
104 new vid = GetPlayerVehicleID(playerid);
105 foreach(new i : Cars)
106 {
107 if(CarData[i][CarID] == vid)
108 {
109 switch(CarModShops[GetVehicleModel(vid) - 400])
110 {
111 case NOMODSHOP:
112 {
113 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
114 SendClientMessage(playerid, STEALTH_YELLOW, "This model can not be modded.");
115 return 1;
116 }
117 case TRANSFENDER:
118 {
119 GetVehiclePos(vid, ModCarPos[playerid][0], ModCarPos[playerid][1], ModCarPos[playerid][2]);
120 GetVehicleZAngle(vid, ModCarPos[playerid][3]);
121 SetVehiclePos(vid, -1935.8020,247.0903,34.5477);
122 EditingMode[playerid] = true;
123 SetEditMode(playerid, EDIT_MODE_MODCAR);
124 }
125 case LOCOLOWCO:
126 {
127 GetVehiclePos(vid, ModCarPos[playerid][0], ModCarPos[playerid][1], ModCarPos[playerid][2]);
128 GetVehicleZAngle(vid, ModCarPos[playerid][3]);
129 SetVehiclePos(vid, 2645.0527,-2044.9419,13.4548);
130 EditingMode[playerid] = true;
131 SetEditMode(playerid, EDIT_MODE_MODCAR);
132 }
133 case WHEELARCHANGELS:
134 {
135 GetVehiclePos(vid, ModCarPos[playerid][0], ModCarPos[playerid][1], ModCarPos[playerid][2]);
136 GetVehicleZAngle(vid, ModCarPos[playerid][3]);
137 SetVehiclePos(vid, -2720.8887,217.4109,4.1550);
138 EditingMode[playerid] = true;
139 SetEditMode(playerid, EDIT_MODE_MODCAR);
140 }
141 }
142 ResetPlayerMoney(playerid);
143 GivePlayerMoney(playerid, 50000);
144 return 1;
145 }
146 }
147 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
148 SendClientMessage(playerid, STEALTH_YELLOW, "You must be in a car created by texture studio to mod a car.");
149
150 return 1;
151}
152
153YCMD:avsetspawn(playerid, arg[], help)
154{
155 if(help)
156 {
157 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
158 SendClientMessage(playerid, STEALTH_GREEN, "Set vehicle's spawn point to current position.");
159 return 1;
160 }
161
162 new vid = GetPlayerVehicleID(playerid);
163 foreach(new i : Cars)
164 {
165 if(CarData[i][CarID] == vid)
166 {
167 GetVehiclePos(CarData[i][CarID], CarData[i][CarSpawnX], CarData[i][CarSpawnY], CarData[i][CarSpawnZ]);
168 GetVehicleZAngle(CarData[i][CarID], CarData[i][CarSpawnFA]);
169 sqlite_SaveVehicleData(i);
170 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
171 SendClientMessage(playerid, STEALTH_YELLOW, "Vehicle spawn has been set (Note vehicle won't respawn here until reloading map!).");
172 return 1;
173 }
174 }
175 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
176 SendClientMessage(playerid, STEALTH_YELLOW, "You must be in a car created by texture studio set a spawn position.");
177
178 return 1;
179}
180
181YCMD:avdeletecar(playerid, arg[], help)
182{
183 if(help)
184 {
185 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
186 SendClientMessage(playerid, STEALTH_GREEN, "Destroy current vehicle.");
187 return 1;
188 }
189
190 MapOpenCheck();
191
192 NoEditingMode(playerid);
193
194 EditCheck(playerid);
195
196 VehicleCheck(playerid);
197
198 inline DeleteVehicleObjects(pid, dialogid, response, listitem, string:text[])
199 {
200 #pragma unused listitem, dialogid, pid, text
201 if(response) DestroyEditCar(CurrVehicle[playerid], true, true);
202 else DestroyEditCar(CurrVehicle[playerid], true);
203 CurrVehicle[playerid] = -1;
204 }
205 Dialog_ShowCallback(playerid, using inline DeleteVehicleObjects, DIALOG_STYLE_LIST, "Texture Studio", "Delete Vehicles Objects?", "Yes", "No");
206
207 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
208 SendClientMessage(playerid, STEALTH_GREEN, "Vehicle has been deleted.");
209
210 return 1;
211}
212
213
214static VehicleList[4096];
215SSCANF:vehiclemodel(string[])
216{
217 if('0' <= string[0] <= '9')
218 {
219 new ret = strval(string);
220 if (400 <= ret <= 611)
221 {
222 return ret;
223 }
224 }
225 else for(new i; i < sizeof(VehicleNames); i++)
226 {
227 if(strfind(string, VehicleNames[i], true) != -1)
228 {
229 return i + 400;
230 }
231 }
232
233 return -1;
234}
235
236public OnFilterScriptInit()
237{
238 for(new i = 0; i < 212; i++) format(VehicleList, sizeof(VehicleList), "%s(%i) %s\n", VehicleList, i+400, VehicleNames[i]);
239
240 #if defined VH_OnFilterScriptInit
241 VH_OnFilterScriptInit();
242 #endif
243 return 1;
244}
245#if defined _ALS_OnFilterScriptInit
246 #undef OnFilterScriptInit
247#else
248 #define _ALS_OnFilterScriptInit
249#endif
250#define OnFilterScriptInit VH_OnFilterScriptInit
251#if defined VH_OnFilterScriptInit
252 forward VH_OnFilterScriptInit();
253#endif
254
255public OnFilterScriptExit()
256{
257 DeleteAllCars();
258
259 #if defined VH_OnFilterScriptExit
260 VH_OnFilterScriptExit();
261 #endif
262 return 1;
263}
264#if defined _ALS_OnFilterScriptExit
265 #undef OnFilterScriptExit
266#else
267 #define _ALS_OnFilterScriptExit
268#endif
269#define OnFilterScriptExit VH_OnFilterScriptExit
270#if defined VH_OnFilterScriptExit
271 forward VH_OnFilterScriptExit();
272#endif
273
274public OnPlayerDisconnect(playerid, reason)
275{
276 CurrVehicle[playerid] = -1;
277
278 #if defined VH_OnPlayerDisconnect
279 VH_OnPlayerDisconnect(playerid, reason);
280 #endif
281 return 1;
282}
283#if defined _ALS_OnPlayerDisconnect
284 #undef OnPlayerDisconnect
285#else
286 #define _ALS_OnPlayerDisconnect
287#endif
288#define OnPlayerDisconnect VH_OnPlayerDisconnect
289#if defined VH_OnPlayerDisconnect
290 forward VH_OnPlayerDisconnect(playerid, reason);
291#endif
292
293public OnEnterExitModShop(playerid,enterexit,interiorid)
294{
295 if(enterexit == 1) EditingMode[playerid] = true;
296 if(enterexit == 0)
297 {
298 new vid = GetPlayerVehicleID(playerid);
299 foreach(new i : Cars)
300 {
301 if(CarData[i][CarID] == vid)
302 {
303 for(new j = 0; j < MAX_CAR_COMPONENTS; j++)
304 {
305 CarData[i][CarComponents][j] = GetVehicleComponentInSlot(vid, j);
306 }
307 sqlite_SaveVehicleData(i);
308
309 if(GetEditMode(playerid) == EDIT_MODE_MODCAR)
310 {
311 SetVehiclePos(vid, ModCarPos[playerid][0], ModCarPos[playerid][1], ModCarPos[playerid][2]);
312 SetVehicleZAngle(vid, ModCarPos[playerid][3]);
313 SetEditMode(playerid, EDIT_MODE_NONE);
314 }
315 EditingMode[playerid] = false;
316 return 1;
317 }
318 }
319 }
320 return 1;
321}
322
323public OnVehicleRespray(playerid, vehicleid, color1, color2)
324{
325 foreach(new i : Cars)
326 {
327 if(CarData[i][CarID] == vehicleid)
328 {
329 CarData[i][CarColor1] = color1;
330 CarData[i][CarColor2] = color2;
331 return 1;
332 }
333 }
334 return 1;
335}
336
337public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
338{
339 foreach(new i : Cars)
340 {
341 if(CarData[i][CarID] == vehicleid)
342 {
343 CarData[i][CarPaintJob] = paintjobid;
344 return 1;
345 }
346 }
347 return 1;
348}
349
350public OnVehicleSpawn(vehicleid)
351{
352 if(IsTempVehicle[vehicleid])
353 {
354 foreach(new i: Player)
355 {
356 if(vehicleid == TempVehicle[i])
357 {
358 TempVehicle[i] = -1;
359 break;
360 }
361 }
362 IsTempVehicle[vehicleid] = false;
363
364 DestroyVehicle(vehicleid);
365 }
366
367 foreach(new i : Cars)
368 {
369 if(CarData[i][CarID] == vehicleid)
370 {
371 ChangeVehicleColor(CarData[i][CarID], CarData[i][CarColor1], CarData[i][CarColor2]);
372 ChangeVehiclePaintjob(CarData[i][CarID], CarData[i][CarPaintJob]);
373 for(new j = 0; j < MAX_CAR_COMPONENTS; j++)
374 {
375 if(CarData[i][CarComponents][j] > 0) AddVehicleComponent(CarData[i][CarID], CarData[i][CarComponents][j]);
376 }
377 return 1;
378 }
379 }
380
381 return 1;
382}
383
384public OnPlayerStateChange(playerid, newstate, oldstate)
385{
386 if(oldstate == PLAYER_STATE_DRIVER && TempVehicle[playerid] != -1)
387 {
388 IsTempVehicle[TempVehicle[playerid]] = false;
389 DestroyVehicle(TempVehicle[playerid]);
390 TempVehicle[playerid] = -1;
391 }
392 return 1;
393}
394
395YCMD:tcar(playerid, arg[], help)
396{
397 if(help)
398 {
399 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
400 SendClientMessage(playerid, STEALTH_GREEN, "Gives you a temporary vehicle.");
401 return 1;
402 }
403
404 new model;
405 sscanf(arg, "K<vehiclemodel>(0)", model);
406
407 if(model)
408 {
409 if(model != -1)
410 {
411 new Float:X, Float:Y, Float:Z, Float:R;
412 GetPlayerPos(playerid, X, Y, Z);
413 GetPlayerFacingAngle(playerid, R);
414 TempVehicle[playerid] = CreateVehicle(model, X + 5.0 * floatcos(R + 180.0, degrees), Y + 5.0 * floatsin(R + 180.0, degrees), Z, R, 0, 0, 1);
415 IsTempVehicle[TempVehicle[playerid]] = true;
416 PutPlayerInVehicle(playerid, TempVehicle[playerid], 0);
417 return 1;
418 }
419 else
420 {
421 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
422 SendClientMessage(playerid, STEALTH_YELLOW, "Invalid vehicle name/ID.");
423 }
424 }
425 else
426 {
427 inline SelectModel(pid, dialogid, response, listitem, string:text[])
428 {
429 #pragma unused listitem, dialogid, pid, text
430 if(response)
431 {
432 new Float:X, Float:Y, Float:Z, Float:R;
433 GetPlayerPos(playerid, X, Y, Z);
434 GetPlayerFacingAngle(playerid, R);
435 TempVehicle[playerid] = CreateVehicle(listitem+400, X, Y, Z, R, 0, 0, 1);
436 IsTempVehicle[TempVehicle[playerid]] = true;
437 PutPlayerInVehicle(playerid, TempVehicle[playerid], 0);
438 return 1;
439 }
440 }
441 Dialog_ShowCallback(playerid, using inline SelectModel, DIALOG_STYLE_LIST, "Texture Studio", VehicleList, "Ok", "Cancel");
442 }
443
444 return 1;
445}
446
447YCMD:avselectcar(playerid, arg[], help)
448{
449 if(help)
450 {
451 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
452 SendClientMessage(playerid, STEALTH_GREEN, "Adds a vehicle to the loaded map.");
453 return 1;
454 }
455
456 inline SelectID(pid, dialogid, response, listitem, string:text[])
457 {
458 #pragma unused listitem, dialogid, pid, text
459 if(response)
460 {
461 new id = strval(text);
462 foreach(new i : Cars)
463 {
464 if(CarData[i][CarID] == id)
465 {
466 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
467 SendClientMessage(playerid, STEALTH_YELLOW, "This vehicle is already in Texture Studio!");
468 return 1;
469 }
470 }
471 new index = Iter_Free(Cars);
472 if(index > -1)
473 {
474 Iter_Add(Cars, id);
475 GetVehiclePos(id, CarData[index][CarSpawnX], CarData[index][CarSpawnY], CarData[index][CarSpawnZ]);
476 GetVehicleZAngle(id, CarData[index][CarSpawnFA]);
477 CarData[index][CarID] = id;
478 CarData[index][CarModel] = GetVehicleModel(id);
479
480 new line[32];
481 format(line, sizeof(line), "Car Index: %i", index);
482 CarData[index][CarText] = CreateDynamic3DTextLabel(line, -1, CarData[index][CarSpawnX], CarData[index][CarSpawnY], CarData[index][CarSpawnZ], 20.0, INVALID_PLAYER_ID, CarData[index][CarID]);
483 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CarData[index][CarText], E_STREAMER_ATTACH_OFFSET_Z, 2.0);
484
485 for(new i = 0; i < MAX_CAR_OBJECTS; i++) CarData[index][CarObjectRef][i] = -1;
486 CarData[index][CarPaintJob] = 3;
487
488 sqlite_InsertCar(index);
489
490 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
491 SendClientMessage(playerid, STEALTH_GREEN, "Vehicle can now be edited!");
492 }
493 }
494 }
495 Dialog_ShowCallback(playerid, using inline SelectID, DIALOG_STYLE_INPUT, "Texture Studio", "Input vehicle ID to select", "Ok", "Cancel");
496 return 1;
497}
498
499
500YCMD:avnewcar(playerid, arg[], help)
501{
502 if(help)
503 {
504 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
505 SendClientMessage(playerid, STEALTH_GREEN, "Add a vehicle to map.");
506 return 1;
507 }
508
509 MapOpenCheck();
510
511 NoEditingMode(playerid);
512
513 new model;
514 sscanf(arg, "K<vehiclemodel>(0)", model);
515
516 if(model)
517 {
518 new index = Iter_Free(Cars);
519 if(index > -1)
520 {
521 if(model != -1)
522 {
523 GetPlayerPos(playerid, CarData[index][CarSpawnX], CarData[index][CarSpawnY], CarData[index][CarSpawnZ]);
524 GetXYInFrontOfPlayer(playerid, CarData[index][CarSpawnX], CarData[index][CarSpawnY], 2.0);
525 GetPlayerFacingAngle(playerid, CarData[index][CarSpawnFA]);
526
527 CurrVehicle[playerid] = AddNewCar(model, index, true);
528
529 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
530 SendClientMessage(playerid, STEALTH_GREEN, "Vehicle can now be edited!");
531
532 return 1;
533 }
534 else
535 SendClientMessage(playerid, STEALTH_YELLOW, "Invalid vehicle name or ID");
536 }
537 else
538 SendClientMessage(playerid, STEALTH_YELLOW, "Too many cars");
539 }
540 else
541 {
542 inline SelectModel(pid, dialogid, response, listitem, string:text[])
543 {
544 #pragma unused listitem, dialogid, pid, text
545 if(response)
546 {
547 new index = Iter_Free(Cars);
548 if(index > -1)
549 {
550 GetPlayerPos(playerid, CarData[index][CarSpawnX], CarData[index][CarSpawnY], CarData[index][CarSpawnZ]);
551 GetXYInFrontOfPlayer(playerid, CarData[index][CarSpawnX], CarData[index][CarSpawnY], 2.0);
552 GetPlayerFacingAngle(playerid, CarData[index][CarSpawnFA]);
553 CurrVehicle[playerid] = AddNewCar(listitem+400, index, true);
554 return 1;
555 }
556 SendClientMessage(playerid, STEALTH_YELLOW, "Too many cars");
557 }
558 }
559 Dialog_ShowCallback(playerid, using inline SelectModel, DIALOG_STYLE_LIST, "Texture Studio", VehicleList, "Ok", "Cancel");
560 }
561
562 return 1;
563}
564
565static AddNewCar(modelid, index = -1, bool:sqlsave = true, bool:clearref = true)
566{
567 if(index == -1) index = Iter_Free(Cars);
568
569 if(index > -1)
570 {
571 Iter_Add(Cars, index);
572 CarData[index][CarID] = CreateVehicle(modelid, CarData[index][CarSpawnX], CarData[index][CarSpawnY], CarData[index][CarSpawnZ], CarData[index][CarSpawnFA], CarData[index][CarColor1], CarData[index][CarColor2], -1, CarData[index][CarSiren]);
573 CarData[index][CarModel] = modelid;
574
575 new line[32];
576 format(line, sizeof(line), "Car Index: %i", index);
577 CarData[index][CarText] = CreateDynamic3DTextLabel(line, -1, CarData[index][CarSpawnX], CarData[index][CarSpawnY], CarData[index][CarSpawnZ], 20.0, INVALID_PLAYER_ID, CarData[index][CarID]);
578 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CarData[index][CarText], E_STREAMER_ATTACH_OFFSET_Z, 2.0);
579
580 ChangeVehiclePaintjob(CarData[index][CarID], CarData[index][CarPaintJob]);
581 for(new i; i < MAX_CAR_COMPONENTS; i++)
582 if(CarData[index][CarComponents][i])
583 AddVehicleComponent(CarData[index][CarID], CarData[index][CarComponents][i]);
584
585 if(clearref)
586 {
587 for(new i = 0; i < MAX_CAR_OBJECTS; i++) CarData[index][CarObjectRef][i] = -1;
588 CarData[index][CarPaintJob] = 3;
589 }
590 if(sqlsave) sqlite_InsertCar(index);
591 return index;
592 }
593 return -1;
594}
595
596Update3DAttachCarPos(objindex, carindex)
597{
598 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
599 {
600 if(CarData[carindex][CarObjectRef][i] == objindex)
601 {
602 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, ObjectData[objindex][oTextID], E_STREAMER_ATTACH_OFFSET_X, CarData[carindex][COX][i]);
603 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, ObjectData[objindex][oTextID], E_STREAMER_ATTACH_OFFSET_Y, CarData[carindex][COY][i]);
604 Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, ObjectData[objindex][oTextID], E_STREAMER_ATTACH_OFFSET_Z, CarData[carindex][COZ][i]);
605 return 1;
606 }
607 }
608 return 0;
609}
610
611static NewVehicleString[512];
612sqlite_CreateVehicle()
613{
614 if(!NewVehicleString[0])
615 {
616 strimplode(" ",
617 NewVehicleString,
618 sizeof(NewVehicleString),
619 "CREATE TABLE IF NOT EXISTS `Vehicles`",
620 "(IndexID INTEGER,",
621 "CarModel INTEGER,",
622 "CarColor1 INTEGER,",
623 "CarColor2 INTEGER,",
624 "CarPaintJob INTEGER,",
625 "CarSpawnX REAL,",
626 "CarSpawnY REAL,",
627 "CarSpawnZ REAL,",
628 "CarSpawnFA REAL,",
629 "CarComponents TEXT,",
630 "CarObjectRef TEXT,",
631 "COX TEXT,",
632 "COY TEXT,",
633 "COZ TEXT,",
634 "CORX TEXT,",
635 "CORY TEXT,",
636 "CORZ TEXT,",
637 "CarSiren INTEGER);"
638 );
639 }
640 db_exec(EditMap, NewVehicleString);
641}
642
643
644// Insert stmt statement
645new DBStatement:insertcarstmt;
646new InsertCarString[512];
647
648// Sqlite query functions
649sqlite_InsertCar(index)
650{
651 // Inserts a new index
652 if(!InsertCarString[0])
653 {
654 // Prepare query
655 strimplode(" ",
656 InsertCarString,
657 sizeof(InsertCarString),
658 "INSERT INTO `Vehicles`",
659 "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
660 );
661 // Prepare data base for writing
662 }
663
664 insertcarstmt = db_prepare(EditMap, InsertCarString);
665
666 // Bind our results
667 stmt_bind_value(insertcarstmt, 0, DB::TYPE_INT, index);
668 stmt_bind_value(insertcarstmt, 1, DB::TYPE_INT, CarData[index][CarModel]);
669 stmt_bind_value(insertcarstmt, 2, DB::TYPE_INT, CarData[index][CarColor1]);
670 stmt_bind_value(insertcarstmt, 3, DB::TYPE_INT, CarData[index][CarColor2]);
671 stmt_bind_value(insertcarstmt, 4, DB::TYPE_INT, CarData[index][CarPaintJob]);
672 stmt_bind_value(insertcarstmt, 5, DB::TYPE_FLOAT, CarData[index][CarSpawnX]);
673 stmt_bind_value(insertcarstmt, 6, DB::TYPE_FLOAT, CarData[index][CarSpawnY]);
674 stmt_bind_value(insertcarstmt, 7, DB::TYPE_FLOAT, CarData[index][CarSpawnZ]);
675 stmt_bind_value(insertcarstmt, 8, DB::TYPE_FLOAT, CarData[index][CarSpawnFA]);
676 stmt_bind_value(insertcarstmt, 9, DB::TYPE_ARRAY, CarData[index][CarComponents], MAX_CAR_COMPONENTS);
677 stmt_bind_value(insertcarstmt, 10, DB::TYPE_ARRAY, CarData[index][CarObjectRef], MAX_CAR_OBJECTS);
678 stmt_bind_value(insertcarstmt, 11, DB::TYPE_ARRAY, CarData[index][COX], MAX_CAR_OBJECTS);
679 stmt_bind_value(insertcarstmt, 12, DB::TYPE_ARRAY, CarData[index][COY], MAX_CAR_OBJECTS);
680 stmt_bind_value(insertcarstmt, 13, DB::TYPE_ARRAY, CarData[index][COZ], MAX_CAR_OBJECTS);
681 stmt_bind_value(insertcarstmt, 14, DB::TYPE_ARRAY, CarData[index][CORX], MAX_CAR_OBJECTS);
682 stmt_bind_value(insertcarstmt, 15, DB::TYPE_ARRAY, CarData[index][CORY], MAX_CAR_OBJECTS);
683 stmt_bind_value(insertcarstmt, 16, DB::TYPE_ARRAY, CarData[index][CORZ], MAX_CAR_OBJECTS);
684 stmt_bind_value(insertcarstmt, 17, DB::TYPE_INT, CarData[index][CarSiren]);
685
686 stmt_execute(insertcarstmt);
687 stmt_close(insertcarstmt);
688}
689
690new DBStatement:savevposstmt;
691new VehiclePosUpdateString[4096];
692
693// Saves all other data
694sqlite_SaveVehicleData(index)
695{
696 // Inserts a new index
697 if(!VehiclePosUpdateString[0])
698 {
699 // Prepare query
700 strimplode(" ",
701 VehiclePosUpdateString,
702 sizeof(VehiclePosUpdateString),
703 "UPDATE `Vehicles` SET",
704 "`CarModel` = ?,",
705 "`CarColor1` = ?,",
706 "`CarColor2` = ?,",
707 "`CarPaintJob` = ?,",
708 "`CarSpawnX` = ?,",
709 "`CarSpawnY` = ?,",
710 "`CarSpawnZ` = ?,",
711 "`CarSpawnFA` = ?,",
712 "`CarComponents` = ?,",
713 "`CarSiren` = ?",
714 "WHERE `IndexID` = ?"
715 );
716 }
717
718 savevposstmt = db_prepare(EditMap, VehiclePosUpdateString);
719
720 // Bind values
721 stmt_bind_value(savevposstmt, 0, DB::TYPE_INT, CarData[index][CarModel]);
722 stmt_bind_value(savevposstmt, 1, DB::TYPE_INT, CarData[index][CarColor1]);
723 stmt_bind_value(savevposstmt, 2, DB::TYPE_INT, CarData[index][CarColor2]);
724 stmt_bind_value(savevposstmt, 3, DB::TYPE_INT, CarData[index][CarPaintJob]);
725 stmt_bind_value(savevposstmt, 4, DB::TYPE_FLOAT, CarData[index][CarSpawnX]);
726 stmt_bind_value(savevposstmt, 5, DB::TYPE_FLOAT, CarData[index][CarSpawnY]);
727 stmt_bind_value(savevposstmt, 6, DB::TYPE_FLOAT, CarData[index][CarSpawnZ]);
728 stmt_bind_value(savevposstmt, 7, DB::TYPE_FLOAT, CarData[index][CarSpawnFA]);
729 stmt_bind_value(savevposstmt, 8, DB::TYPE_ARRAY, CarData[index][CarComponents], MAX_CAR_COMPONENTS);
730 stmt_bind_value(savevposstmt, 9, DB::TYPE_INT, CarData[index][CarSiren]);
731 stmt_bind_value(savevposstmt, 10, DB::TYPE_INT, index);
732
733 // Execute stmt
734 stmt_execute(savevposstmt);
735 stmt_close(savevposstmt);
736 return 1;
737}
738
739// Save vehicle data
740new DBStatement:savevdatastmt;
741new VehicleDataUpdateString[4096];
742
743// Saves a specific texture index to DB
744sqlite_SaveVehicleObjectData(index)
745{
746 // Inserts a new index
747 if(!VehicleDataUpdateString[0])
748 {
749 // Prepare query
750 strimplode(" ",
751 VehicleDataUpdateString,
752 sizeof(VehicleDataUpdateString),
753 "UPDATE `Vehicles` SET",
754 "`CarObjectRef` = ?,",
755 "`COX` = ?,",
756 "`COY` = ?,",
757 "`COZ` = ?,",
758 "`CORX` = ?,",
759 "`CORY` = ?,",
760 "`CORZ` = ?",
761 "WHERE `IndexID` = ?"
762 );
763 }
764
765 savevdatastmt = db_prepare(EditMap, VehicleDataUpdateString);
766
767 // Bind values
768 stmt_bind_value(savevdatastmt, 0, DB::TYPE_ARRAY, CarData[index][CarObjectRef], MAX_CAR_OBJECTS);
769 stmt_bind_value(savevdatastmt, 1, DB::TYPE_ARRAY, CarData[index][COX], MAX_CAR_OBJECTS);
770 stmt_bind_value(savevdatastmt, 2, DB::TYPE_ARRAY, CarData[index][COY], MAX_CAR_OBJECTS);
771 stmt_bind_value(savevdatastmt, 3, DB::TYPE_ARRAY, CarData[index][COZ], MAX_CAR_OBJECTS);
772 stmt_bind_value(savevdatastmt, 4, DB::TYPE_ARRAY, CarData[index][CORX], MAX_CAR_OBJECTS);
773 stmt_bind_value(savevdatastmt, 5, DB::TYPE_ARRAY, CarData[index][CORY], MAX_CAR_OBJECTS);
774 stmt_bind_value(savevdatastmt, 6, DB::TYPE_ARRAY, CarData[index][CORZ], MAX_CAR_OBJECTS);
775 stmt_bind_value(savevdatastmt, 7, DB::TYPE_INT, index);
776
777 // Execute stmt
778 stmt_execute(savevdatastmt);
779 stmt_close(savevdatastmt);
780
781 return 1;
782}
783
784// Load query stmt
785static DBStatement:loadcarstmt;
786
787// Load all cars
788sqlite_LoadCars()
789{
790 new tmpcar[CARINFO];
791 new currindex;
792
793 loadcarstmt = db_prepare(EditMap, "SELECT * FROM `Vehicles`");
794
795 // Bind our results
796 stmt_bind_result_field(loadcarstmt, 0, DB::TYPE_INT, currindex);
797 stmt_bind_result_field(loadcarstmt, 1, DB::TYPE_INT, tmpcar[CarModel]);
798 stmt_bind_result_field(loadcarstmt, 2, DB::TYPE_INT, tmpcar[CarColor1]);
799 stmt_bind_result_field(loadcarstmt, 3, DB::TYPE_INT, tmpcar[CarColor2]);
800 stmt_bind_result_field(loadcarstmt, 4, DB::TYPE_INT, tmpcar[CarPaintJob]);
801 stmt_bind_result_field(loadcarstmt, 5, DB::TYPE_FLOAT, tmpcar[CarSpawnX]);
802 stmt_bind_result_field(loadcarstmt, 6, DB::TYPE_FLOAT, tmpcar[CarSpawnY]);
803 stmt_bind_result_field(loadcarstmt, 7, DB::TYPE_FLOAT, tmpcar[CarSpawnZ]);
804 stmt_bind_result_field(loadcarstmt, 8, DB::TYPE_FLOAT, tmpcar[CarSpawnFA]);
805 stmt_bind_result_field(loadcarstmt, 9, DB::TYPE_ARRAY, tmpcar[CarComponents], MAX_CAR_COMPONENTS);
806 stmt_bind_result_field(loadcarstmt, 10, DB::TYPE_ARRAY, tmpcar[CarObjectRef], MAX_CAR_OBJECTS);
807 stmt_bind_result_field(loadcarstmt, 11, DB::TYPE_ARRAY, tmpcar[COX], MAX_CAR_OBJECTS);
808 stmt_bind_result_field(loadcarstmt, 12, DB::TYPE_ARRAY, tmpcar[COY], MAX_CAR_OBJECTS);
809 stmt_bind_result_field(loadcarstmt, 13, DB::TYPE_ARRAY, tmpcar[COZ], MAX_CAR_OBJECTS);
810 stmt_bind_result_field(loadcarstmt, 14, DB::TYPE_ARRAY, tmpcar[CORX], MAX_CAR_OBJECTS);
811 stmt_bind_result_field(loadcarstmt, 15, DB::TYPE_ARRAY, tmpcar[CORY], MAX_CAR_OBJECTS);
812 stmt_bind_result_field(loadcarstmt, 16, DB::TYPE_ARRAY, tmpcar[CORZ], MAX_CAR_OBJECTS);
813 stmt_bind_result_field(loadcarstmt, 17, DB::TYPE_INT, tmpcar[CarSiren]);
814
815 // Execute query
816 if(stmt_execute(loadcarstmt))
817 {
818 while(stmt_fetch_row(loadcarstmt))
819 {
820 CarData[currindex][CarModel] = tmpcar[CarModel];
821 CarData[currindex][CarColor1] = tmpcar[CarColor1];
822 CarData[currindex][CarColor2] = tmpcar[CarColor2];
823 CarData[currindex][CarPaintJob] = tmpcar[CarPaintJob];
824 CarData[currindex][CarSpawnX] = tmpcar[CarSpawnX];
825 CarData[currindex][CarSpawnY] = tmpcar[CarSpawnY];
826 CarData[currindex][CarSpawnZ] = tmpcar[CarSpawnZ];
827 CarData[currindex][CarSpawnFA] = tmpcar[CarSpawnFA];
828 CarData[currindex][CarSiren] = tmpcar[CarSiren];
829
830 for(new i = 0; i < MAX_CAR_COMPONENTS; i++) CarData[currindex][CarComponents][i] = tmpcar[CarComponents][i];
831 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
832 {
833 CarData[currindex][CarObjectRef][i] = tmpcar[CarObjectRef][i];
834 CarData[currindex][COX][i] = tmpcar[COX][i];
835 CarData[currindex][COY][i] = tmpcar[COY][i];
836 CarData[currindex][COZ][i] = tmpcar[COZ][i];
837 CarData[currindex][CORX][i] = tmpcar[CORX][i];
838 CarData[currindex][CORY][i] = tmpcar[CORY][i];
839 CarData[currindex][CORZ][i] = tmpcar[CORZ][i];
840 }
841
842 AddNewCar(CarData[currindex][CarModel], currindex, false, false);
843 ChangeVehicleColor(CarData[currindex][CarID], CarData[currindex][CarColor1], CarData[currindex][CarColor2]);
844 ChangeVehiclePaintjob(CarData[currindex][CarID], CarData[currindex][CarPaintJob]);
845 for(new i = 0; i < MAX_CAR_COMPONENTS; i++)
846 {
847 if(CarData[currindex][CarComponents][i] > 0) AddVehicleComponent(CarData[currindex][CarID], CarData[currindex][CarComponents][i]);
848 }
849
850 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
851 {
852 if(tmpcar[CarObjectRef][i] > -1)
853 {
854 AttachDynamicObjectToVehicle(ObjectData[CarData[currindex][CarObjectRef][i]][oID], CarData[currindex][CarID],
855 CarData[currindex][COX][i], CarData[currindex][COY][i], CarData[currindex][COZ][i], CarData[currindex][CORX][i], CarData[currindex][CORY][i], CarData[currindex][CORZ][i]);
856 ObjectData[CarData[currindex][CarObjectRef][i]][oAttachedVehicle] = currindex;
857 UpdateObject3DText(CarData[currindex][CarObjectRef][i], false);
858 }
859 }
860 }
861 }
862 stmt_close(loadcarstmt);
863}
864
865ClearVehicles()
866{
867 foreach(new i : Player) CurrVehicle[i] = -1;
868 DeleteAllCars();
869 return 1;
870}
871
872
873DeleteAllCars()
874{
875 foreach(new i : Cars)
876 {
877 i = DestroyEditCar(i, false);
878 }
879 return 1;
880}
881
882DestroyEditCar(index, bool:sqldelete=true, deleteobjects=false)
883{
884 DestroyVehicle(CarData[index][CarID]);
885 CarData[index][CarModel] = -1;
886 CarData[index][CarColor1] = -1;
887 CarData[index][CarColor2] = -1;
888 CarData[index][CarPaintJob] = 0;
889 CarData[index][CarSiren] = 0;
890 CarData[index][CarSpawnX] = 0.0;
891 CarData[index][CarSpawnY] = 0.0;
892 CarData[index][CarSpawnZ] = 0.0;
893 CarData[index][CarSpawnFA] = 0.0;
894
895 DestroyDynamic3DTextLabel(CarData[index][CarText]);
896
897 for(new i = 0; i < MAX_CAR_COMPONENTS; i++) CarData[index][CarComponents][i] = 0;
898 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
899 {
900 if(CarData[index][CarObjectRef][i] > -1)
901 {
902 new oindex = CarData[index][CarObjectRef][i];
903
904 if(deleteobjects) DeleteDynamicObject(oindex);
905 else
906 {
907 // Destroy the object
908 DestroyDynamicObject(ObjectData[oindex][oID]);
909
910 // Re-create object
911 ObjectData[index][oID] = CreateDynamicObject(ObjectData[oindex][oModel], ObjectData[oindex][oX], ObjectData[oindex][oY], ObjectData[oindex][oZ], ObjectData[oindex][oRX], ObjectData[oindex][oRY], ObjectData[oindex][oRZ], MapSetting[mVirtualWorld], MapSetting[mInterior], -1, 300.0);
912 Streamer_SetFloatData(STREAMER_TYPE_OBJECT, ObjectData[oindex][oID], E_STREAMER_DRAW_DISTANCE, 300.0);
913
914 // We need to update textures and materials
915 UpdateMaterial(oindex);
916
917 // Update the object text
918 UpdateObjectText(oindex);
919
920 // Update 3d Text
921 UpdateObject3DText(oindex, false);
922 }
923 }
924 CarData[index][CarObjectRef][i] = -1;
925 CarData[index][COX][i] = 0.0;
926 CarData[index][COY][i] = 0.0;
927 CarData[index][COZ][i] = 0.0;
928 CarData[index][CORX][i] = 0.0;
929 CarData[index][CORY][i] = 0.0;
930 CarData[index][CORZ][i] = 0.0;
931 }
932 if(sqldelete)
933 {
934 new q[128];
935 format(q, sizeof(q), "DELETE FROM `Vehicles` WHERE `IndexID` = %i", index);
936 db_query(EditMap, q);
937 }
938
939 new next;
940 Iter_SafeRemove(Cars, index, next);
941
942 return next;
943}
944
945YCMD:avcarcolor(playerid, arg[], help)
946{
947 if(help)
948 {
949 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
950 SendClientMessage(playerid, STEALTH_GREEN, "Set current vehicle's colors.");
951 return 1;
952 }
953
954 MapOpenCheck();
955
956 NoEditingMode(playerid);
957
958 VehicleCheck(playerid);
959
960 inline Response(pid, dialogid, response, listitem, string:text[])
961 {
962 #pragma unused listitem, dialogid, pid, response, text
963 if(response)
964 {
965 inline ChooseColor(cpid, cdialogid, cresponse, clistitem, string:ctext[])
966 {
967 #pragma unused clistitem, cdialogid, cpid, cresponse, ctext
968 if(cresponse)
969 {
970 if(listitem == 0) CarData[CurrVehicle[playerid]][CarColor1] = clistitem;
971 else if(listitem == 1) CarData[CurrVehicle[playerid]][CarColor2] = clistitem;
972 ChangeVehicleColor(CarData[CurrVehicle[playerid]][CarID], CarData[CurrVehicle[playerid]][CarColor1], CarData[CurrVehicle[playerid]][CarColor2]);
973 sqlite_SaveVehicleData(CurrVehicle[playerid]);
974 }
975 Dialog_ShowCallback(playerid, using inline Response, DIALOG_STYLE_LIST, "Select car color", "Car Color 1\nCar Color 2", "Ok", "Cancel");
976 }
977 Dialog_ShowCallback(playerid, using inline ChooseColor, DIALOG_STYLE_LIST, "Car Color List", VehicleColorList, "Ok", "Cancel");
978 return 1;
979 }
980 }
981 Dialog_ShowCallback(playerid, using inline Response, DIALOG_STYLE_LIST, "Select car color", "Car Color 1\nCar Color 2", "Ok", "Cancel");
982 return 1;
983}
984
985YCMD:avpaint(playerid, arg[], help)
986{
987 if(help)
988 {
989 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
990 SendClientMessage(playerid, STEALTH_GREEN, "Set current vehicle's paintjob ID.");
991 return 1;
992 }
993
994 MapOpenCheck();
995
996 NoEditingMode(playerid);
997
998 VehicleCheck(playerid);
999
1000 inline Response(pid, dialogid, response, listitem, string:text[])
1001 {
1002 #pragma unused listitem, dialogid, pid, response, text
1003 if(response)
1004 {
1005 CarData[CurrVehicle[playerid]][CarPaintJob] = listitem;
1006 ChangeVehiclePaintjob(CarData[CurrVehicle[playerid]][CarID], CarData[CurrVehicle[playerid]][CarPaintJob]);
1007 sqlite_SaveVehicleData(CurrVehicle[playerid]);
1008 Dialog_ShowCallback(playerid, using inline Response, DIALOG_STYLE_LIST, "Select Paint Job", "Paint Job 1\nPaint Job 2\nPaint Job 3\nNone", "Ok", "Cancel");
1009 }
1010 }
1011 Dialog_ShowCallback(playerid, using inline Response, DIALOG_STYLE_LIST, "Select Paint Job", "Paint Job 1\nPaint Job 2\nPaint Job 3\nNone", "Ok", "Cancel");
1012 return 1;
1013}
1014
1015YCMD:avsiren(playerid, arg[], help)
1016{
1017 if(help)
1018 {
1019 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1020 SendClientMessage(playerid, STEALTH_GREEN, "Toggle current vehicle's siren.");
1021 return 1;
1022 }
1023
1024 MapOpenCheck();
1025
1026 NoEditingMode(playerid);
1027
1028 VehicleCheck(playerid);
1029
1030 CarData[CurrVehicle[playerid]][CarSiren] = CarData[CurrVehicle[playerid]][CarSiren] ? 0 : 1;
1031
1032 // TODO: Destroy and recreate vehicle to apply the siren
1033
1034 sqlite_SaveVehicleData(CurrVehicle[playerid]);
1035
1036 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1037 SendClientMessage(playerid, STEALTH_GREEN, sprintf("Toggled vehicle's siren %s{33DD11}",
1038 (CarData[CurrVehicle[playerid]][CarSiren] ? ("{00AA00}On") : ("{AA0000}Off"))));
1039 return 1;
1040}
1041
1042YCMD:avrespawn(playerid, arg[], help)
1043{
1044 if(help)
1045 {
1046 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1047 SendClientMessage(playerid, STEALTH_GREEN, "Respawn current vehicle.");
1048 return 1;
1049 }
1050
1051 MapOpenCheck();
1052
1053 NoEditingMode(playerid);
1054
1055 VehicleCheck(playerid);
1056
1057 SetVehicleToRespawn(CarData[CurrVehicle[playerid]][CarID]);
1058 return 1;
1059}
1060
1061YCMD:avattach(playerid, arg[], help)
1062{
1063 if(help)
1064 {
1065 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1066 SendClientMessage(playerid, STEALTH_GREEN, "Attach current object to current vehicle.");
1067 return 1;
1068 }
1069
1070 MapOpenCheck();
1071
1072 NoEditingMode(playerid);
1073
1074 EditCheck(playerid);
1075
1076 VehicleCheck(playerid);
1077
1078 inline CloneVA(cpid, cdialogid, cresponse, clistitem, string:ctext[])
1079 {
1080 #pragma unused clistitem, cdialogid, cpid, ctext
1081 new bool:clone;
1082 if(cresponse) clone = true;
1083 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
1084 {
1085 if(CarData[CurrVehicle[playerid]][CarObjectRef][i] == -1)
1086 {
1087 if(clone) SetCurrObject(playerid, CloneObject(CurrObject[playerid]));
1088 else
1089 {
1090 if(IsObjectAttachedToVehicle(CurrObject[playerid]))
1091 {
1092 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1093 SendClientMessage(playerid, STEALTH_YELLOW, "That object is already attached to a vehicle.");
1094 }
1095 }
1096
1097 AttachDynamicObjectToVehicle(ObjectData[CurrObject[playerid]][oID], CarData[CurrVehicle[playerid]][CarID], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
1098 CarData[CurrVehicle[playerid]][CarObjectRef][i] = CurrObject[playerid];
1099 ObjectData[CurrObject[playerid]][oAttachedVehicle] = CurrVehicle[playerid];
1100
1101 CarData[CurrVehicle[playerid]][COX][i] = 0.0;
1102 CarData[CurrVehicle[playerid]][COY][i] = 0.0;
1103 CarData[CurrVehicle[playerid]][COZ][i] = 0.0;
1104 CarData[CurrVehicle[playerid]][CORX][i] = 0.0;
1105 CarData[CurrVehicle[playerid]][CORY][i] = 0.0;
1106 CarData[CurrVehicle[playerid]][CORZ][i] = 0.0;
1107
1108 sqlite_SaveVehicleObjectData(CurrVehicle[playerid]);
1109
1110 UpdateObject3DText(CurrObject[playerid], false);
1111
1112 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1113 SendClientMessage(playerid, STEALTH_GREEN, "Attached object to vehicle.");
1114
1115 return 1;
1116 }
1117 }
1118 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1119 SendClientMessage(playerid, STEALTH_YELLOW, "This vehicle has too many objects.");
1120 }
1121 Dialog_ShowCallback(playerid, using inline CloneVA, DIALOG_STYLE_MSGBOX, "Texture Studio", "Would you like to clone this object\nbefore attaching to vehicle?", "Yes", "No");
1122
1123 return 1;
1124}
1125
1126YCMD:avmirror(playerid, arg[], help)
1127{
1128 if(help)
1129 {
1130 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1131 SendClientMessage(playerid, STEALTH_GREEN, "Mirror an attached object on the current vehicle.");
1132 return 1;
1133 }
1134
1135 MapOpenCheck();
1136
1137 NoEditingMode(playerid);
1138
1139 EditCheck(playerid);
1140
1141 if(ObjectData[CurrObject[playerid]][oAttachedVehicle] < 0)
1142 {
1143 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1144 SendClientMessage(playerid, STEALTH_YELLOW, "This object is not attached to any vehicles.");
1145 }
1146
1147 inline Mirror(mxpid, mxdialogid, mxresponse, mxlistitem, string:mxtext[])
1148 {
1149 #pragma unused mxpid, mxdialogid, mxtext
1150 if(!mxresponse)
1151 return 1;
1152
1153 new bool:mx, bool:my, bool:mz;
1154 switch(mxlistitem)
1155 {
1156 case 0: mx = true;
1157 case 1: my = true;
1158 case 2: mz = true;
1159 }
1160
1161 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
1162 {
1163 if(CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CarObjectRef][i] == -1)
1164 {
1165 new cloneindex = CurrObject[playerid];
1166 SetCurrObject(playerid, CloneObject(CurrObject[playerid]));
1167 new refindex = GetCarObjectRefIndex(ObjectData[cloneindex][oAttachedVehicle], cloneindex);
1168
1169 if(mx) {
1170 CarData[ObjectData[cloneindex][oAttachedVehicle]][COX][i] = -CarData[ObjectData[cloneindex][oAttachedVehicle]][COX][refindex];
1171 CarData[ObjectData[cloneindex][oAttachedVehicle]][CORX][i] = CarData[ObjectData[cloneindex][oAttachedVehicle]][CORX][refindex];
1172 CarData[ObjectData[cloneindex][oAttachedVehicle]][CORY][i] = -CarData[ObjectData[cloneindex][oAttachedVehicle]][CORY][refindex];
1173 CarData[ObjectData[cloneindex][oAttachedVehicle]][CORZ][i] = -CarData[ObjectData[cloneindex][oAttachedVehicle]][CORZ][refindex];
1174 }
1175 else CarData[ObjectData[cloneindex][oAttachedVehicle]][COX][i] = CarData[ObjectData[cloneindex][oAttachedVehicle]][COX][refindex];
1176
1177 if(my) {
1178 CarData[ObjectData[cloneindex][oAttachedVehicle]][COY][i] = -CarData[ObjectData[cloneindex][oAttachedVehicle]][COY][refindex];
1179 CarData[ObjectData[cloneindex][oAttachedVehicle]][CORX][i] = -CarData[ObjectData[cloneindex][oAttachedVehicle]][CORX][refindex];
1180 CarData[ObjectData[cloneindex][oAttachedVehicle]][CORY][i] = CarData[ObjectData[cloneindex][oAttachedVehicle]][CORY][refindex];
1181 CarData[ObjectData[cloneindex][oAttachedVehicle]][CORZ][i] = -CarData[ObjectData[cloneindex][oAttachedVehicle]][CORZ][refindex];
1182 }
1183 else CarData[ObjectData[cloneindex][oAttachedVehicle]][COY][i] = CarData[ObjectData[cloneindex][oAttachedVehicle]][COY][refindex];
1184
1185 if(mz) {
1186 CarData[ObjectData[cloneindex][oAttachedVehicle]][COZ][i] = -CarData[ObjectData[cloneindex][oAttachedVehicle]][COZ][refindex];
1187 CarData[ObjectData[cloneindex][oAttachedVehicle]][CORX][i] = -CarData[ObjectData[cloneindex][oAttachedVehicle]][CORX][refindex];
1188 CarData[ObjectData[cloneindex][oAttachedVehicle]][CORY][i] = -CarData[ObjectData[cloneindex][oAttachedVehicle]][CORY][refindex];
1189 CarData[ObjectData[cloneindex][oAttachedVehicle]][CORZ][i] = CarData[ObjectData[cloneindex][oAttachedVehicle]][CORZ][refindex];
1190 }
1191 else CarData[ObjectData[cloneindex][oAttachedVehicle]][COZ][i] = CarData[ObjectData[cloneindex][oAttachedVehicle]][COZ][refindex];
1192
1193 AttachDynamicObjectToVehicle(ObjectData[CurrObject[playerid]][oID], CarData[ObjectData[cloneindex][oAttachedVehicle]][CarID],
1194 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
1195 );
1196
1197 CarData[ObjectData[cloneindex][oAttachedVehicle]][CarObjectRef][i] = CurrObject[playerid];
1198 ObjectData[CurrObject[playerid]][oAttachedVehicle] = ObjectData[cloneindex][oAttachedVehicle];
1199
1200 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], i, VEHICLE_ATTACH_UPDATE);
1201
1202 sqlite_SaveVehicleObjectData(ObjectData[CurrObject[playerid]][oAttachedVehicle]);
1203
1204 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1205 SendClientMessage(playerid, STEALTH_GREEN, "Mirror attached object to vehicle.");
1206 return 1;
1207 }
1208 }
1209 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1210 SendClientMessage(playerid, STEALTH_YELLOW, "Too many attached objects.");
1211 }
1212 Dialog_ShowCallback(playerid, using inline Mirror, DIALOG_STYLE_LIST, "Texture Studio - Select Mirror Axis", "X\nY\nZ", "Select", "");
1213 return 1;
1214}
1215
1216YCMD:avclone(playerid, arg[], help)
1217{
1218 if(help)
1219 {
1220 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1221 SendClientMessage(playerid, STEALTH_GREEN, "Clone an attached object on the current vehicle.");
1222 return 1;
1223 }
1224
1225 MapOpenCheck();
1226
1227 NoEditingMode(playerid);
1228
1229 EditCheck(playerid);
1230
1231 if(ObjectData[CurrObject[playerid]][oAttachedVehicle] < 0)
1232 {
1233 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1234 SendClientMessage(playerid, STEALTH_YELLOW, "This object is not attached to any vehicles.");
1235 }
1236
1237 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
1238 {
1239 if(CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CarObjectRef][i] == -1)
1240 {
1241 new cloneindex = CurrObject[playerid];
1242 SetCurrObject(playerid, CloneObject(CurrObject[playerid]));
1243 new refindex = GetCarObjectRefIndex(ObjectData[cloneindex][oAttachedVehicle], cloneindex);
1244
1245 CarData[ObjectData[cloneindex][oAttachedVehicle]][COX][i] = CarData[ObjectData[cloneindex][oAttachedVehicle]][COX][refindex];
1246 CarData[ObjectData[cloneindex][oAttachedVehicle]][COY][i] = CarData[ObjectData[cloneindex][oAttachedVehicle]][COY][refindex];
1247 CarData[ObjectData[cloneindex][oAttachedVehicle]][COZ][i] = CarData[ObjectData[cloneindex][oAttachedVehicle]][COZ][refindex];
1248
1249 AttachDynamicObjectToVehicle(ObjectData[CurrObject[playerid]][oID], CarData[ObjectData[cloneindex][oAttachedVehicle]][CarID],
1250 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
1251 );
1252
1253 CarData[ObjectData[cloneindex][oAttachedVehicle]][CarObjectRef][i] = CurrObject[playerid];
1254 ObjectData[CurrObject[playerid]][oAttachedVehicle] = ObjectData[cloneindex][oAttachedVehicle];
1255
1256 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], i, VEHICLE_ATTACH_UPDATE);
1257
1258 sqlite_SaveVehicleObjectData(ObjectData[CurrObject[playerid]][oAttachedVehicle]);
1259
1260 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1261 SendClientMessage(playerid, STEALTH_GREEN, "Cloned object attached object to vehicle.");
1262 return 1;
1263 }
1264 }
1265
1266 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1267 SendClientMessage(playerid, STEALTH_YELLOW, "Too many attached objects.");
1268 return 1;
1269}
1270
1271YCMD:avdetach(playerid, arg[], help)
1272{
1273 if(help)
1274 {
1275 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1276 SendClientMessage(playerid, STEALTH_GREEN, "Detach the current object from a vehicle.");
1277 return 1;
1278 }
1279
1280 MapOpenCheck();
1281
1282 NoEditingMode(playerid);
1283
1284 EditCheck(playerid);
1285
1286 if(ObjectData[CurrObject[playerid]][oAttachedVehicle] > -1)
1287 {
1288 new index = CurrObject[playerid];
1289 if(ObjectData[index][oAttachedVehicle] > -1) UpdateAttachedObjectRef(ObjectData[index][oAttachedVehicle], index);
1290
1291 ObjectData[CurrObject[playerid]][oAttachedVehicle] = -1;
1292
1293 // Destroy the object
1294 DestroyDynamicObject(ObjectData[index][oID]);
1295
1296 // Re-create object
1297 ObjectData[index][oID] = CreateDynamicObject(ObjectData[index][oModel], ObjectData[index][oX], ObjectData[index][oY], ObjectData[index][oZ], ObjectData[index][oRX], ObjectData[index][oRY], ObjectData[index][oRZ], MapSetting[mVirtualWorld], MapSetting[mInterior], -1, 300.0);
1298 Streamer_SetFloatData(STREAMER_TYPE_OBJECT, ObjectData[index][oID], E_STREAMER_DRAW_DISTANCE, 300.0);
1299
1300 // We need to update textures and materials
1301 UpdateMaterial(index);
1302
1303 // Update the object text
1304 UpdateObjectText(index);
1305
1306 // Update 3d Text
1307 UpdateObject3DText(index, false);
1308
1309 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1310 SendClientMessage(playerid, STEALTH_GREEN, "Detached object from vehicle.");
1311 }
1312 else
1313 {
1314 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1315 SendClientMessage(playerid, STEALTH_YELLOW, "This object is not attached to any vehicles.");
1316 }
1317 return 1;
1318
1319
1320}
1321
1322YCMD:avsel(playerid, arg[], help)
1323{
1324 if(help)
1325 {
1326 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1327 SendClientMessage(playerid, STEALTH_GREEN, "Select a vehicle by index.");
1328 return 1;
1329 }
1330
1331 MapOpenCheck();
1332 new index = strval(arg);
1333 if(Iter_Contains(Cars, index))
1334 {
1335 CurrVehicle[playerid] = index;
1336 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1337 new line[128];
1338 format(line, sizeof(line), "Select vehicle index: %i", index);
1339 SendClientMessage(playerid, STEALTH_GREEN, line);
1340 }
1341 else
1342 {
1343 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1344 SendClientMessage(playerid, STEALTH_YELLOW, "That vehicle does not exist.");
1345 }
1346
1347
1348 return 1;
1349}
1350
1351YCMD:avclonecar(playerid, arg[], help)
1352{
1353 if(help)
1354 {
1355 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1356 SendClientMessage(playerid, STEALTH_GREEN, "Clone current vehicle with all properties and objects.");
1357 return 1;
1358 }
1359
1360 MapOpenCheck();
1361 NoEditingMode(playerid);
1362 VehicleCheck(playerid);
1363
1364 new index = Iter_Free(Cars);
1365 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1366 if(index > -1)
1367 {
1368 // Create clone car
1369 new CloneCar = CurrVehicle[playerid];
1370 GetPlayerPos(playerid, CarData[index][CarSpawnX], CarData[index][CarSpawnY], CarData[index][CarSpawnZ]);
1371 GetXYInFrontOfPlayer(playerid, CarData[index][CarSpawnX], CarData[index][CarSpawnY], 2.0);
1372 GetPlayerFacingAngle(playerid, CarData[index][CarSpawnFA]);
1373
1374 CarData[index][CarColor1] = CarData[CloneCar][CarColor1];
1375 CarData[index][CarColor2] = CarData[CloneCar][CarColor2];
1376 CarData[index][CarPaintJob] = CarData[CloneCar][CarPaintJob];
1377 CarData[index][CarSiren] = CarData[CloneCar][CarSiren];
1378 CarData[index][CarComponents] = CarData[CloneCar][CarComponents];
1379
1380 CurrVehicle[playerid] = AddNewCar(CarData[CloneCar][CarModel], index, true);
1381
1382 // Clone and attach objects
1383 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
1384 {
1385 if(CarData[CloneCar][CarObjectRef][i] == -1) continue;
1386
1387 // Clone and attach
1388 new CloneIndex = CloneObject(CarData[CloneCar][CarObjectRef][i]);
1389
1390 AttachDynamicObjectToVehicle(ObjectData[CloneIndex][oID], CarData[CurrVehicle[playerid]][CarID],
1391 CarData[CloneCar][COX][i], CarData[CloneCar][COY][i], CarData[CloneCar][COZ][i], CarData[CloneCar][CORX][i], CarData[CloneCar][CORY][i], CarData[CloneCar][CORZ][i]);
1392 CarData[CurrVehicle[playerid]][CarObjectRef][i] = CloneIndex;
1393 ObjectData[CloneIndex][oAttachedVehicle] = CurrVehicle[playerid];
1394
1395 CarData[CurrVehicle[playerid]][COX][i] = CarData[CloneCar][COX][i];
1396 CarData[CurrVehicle[playerid]][COY][i] = CarData[CloneCar][COY][i];
1397 CarData[CurrVehicle[playerid]][COZ][i] = CarData[CloneCar][COZ][i];
1398 CarData[CurrVehicle[playerid]][CORX][i] = CarData[CloneCar][CORX][i];
1399 CarData[CurrVehicle[playerid]][CORY][i] = CarData[CloneCar][CORY][i];
1400 CarData[CurrVehicle[playerid]][CORZ][i] = CarData[CloneCar][CORZ][i];
1401
1402 sqlite_SaveVehicleObjectData(CurrVehicle[playerid]);
1403
1404 UpdateObject3DText(CloneIndex, false);
1405 }
1406 SendClientMessage(playerid, STEALTH_GREEN, "You have cloned this vehicle.");
1407 return 1;
1408 }
1409 SendClientMessage(playerid, STEALTH_YELLOW, "Too many cars");
1410
1411 return 1;
1412}
1413
1414
1415YCMD:avox(playerid, arg[], help)
1416{
1417 if(help)
1418 {
1419 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1420 SendClientMessage(playerid, STEALTH_GREEN, "Move a vehicle's attached object along the X axis.");
1421 return 1;
1422 }
1423
1424 MapOpenCheck();
1425
1426 NoEditingMode(playerid);
1427
1428 EditCheck(playerid);
1429
1430 if(ObjectData[CurrObject[playerid]][oAttachedVehicle] > -1)
1431 {
1432 new Float:dist;
1433 dist = floatstr(arg);
1434 if(dist == 0) dist = 1.0;
1435
1436 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1437 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COX][refindex] += dist;
1438 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], refindex, VEHICLE_ATTACH_UPDATE);
1439
1440 sqlite_SaveVehicleObjectData(ObjectData[CurrObject[playerid]][oAttachedVehicle]);
1441
1442 UpdatePlayerOSelText(playerid);
1443 }
1444 else
1445 {
1446 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1447 SendClientMessage(playerid, STEALTH_YELLOW, "This object is not attached to a vehicle");
1448 }
1449
1450 return 1;
1451}
1452
1453YCMD:avoy(playerid, arg[], help)
1454{
1455 if(help)
1456 {
1457 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1458 SendClientMessage(playerid, STEALTH_GREEN, "Move a vehicle's attached object along the Y axis.");
1459 return 1;
1460 }
1461
1462 MapOpenCheck();
1463
1464 NoEditingMode(playerid);
1465
1466 EditCheck(playerid);
1467
1468 if(ObjectData[CurrObject[playerid]][oAttachedVehicle] > -1)
1469 {
1470 new Float:dist;
1471 dist = floatstr(arg);
1472 if(dist == 0) dist = 1.0;
1473
1474 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1475 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COY][refindex] += dist;
1476 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], refindex, VEHICLE_ATTACH_UPDATE);
1477
1478 sqlite_SaveVehicleObjectData(ObjectData[CurrObject[playerid]][oAttachedVehicle]);
1479
1480 UpdatePlayerOSelText(playerid);
1481 }
1482 else
1483 {
1484 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1485 SendClientMessage(playerid, STEALTH_YELLOW, "This object is not attached to a vehicle");
1486 }
1487
1488 return 1;
1489}
1490
1491YCMD:avoz(playerid, arg[], help)
1492{
1493 if(help)
1494 {
1495 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1496 SendClientMessage(playerid, STEALTH_GREEN, "Move a vehicle's attached object along the Z axis.");
1497 return 1;
1498 }
1499
1500 MapOpenCheck();
1501
1502 NoEditingMode(playerid);
1503
1504 EditCheck(playerid);
1505
1506 if(ObjectData[CurrObject[playerid]][oAttachedVehicle] > -1)
1507 {
1508 new Float:dist;
1509 dist = floatstr(arg);
1510 if(dist == 0) dist = 1.0;
1511
1512 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1513 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COZ][refindex] += dist;
1514 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], refindex, VEHICLE_ATTACH_UPDATE);
1515
1516 sqlite_SaveVehicleObjectData(ObjectData[CurrObject[playerid]][oAttachedVehicle]);
1517
1518 UpdatePlayerOSelText(playerid);
1519 }
1520 else
1521 {
1522 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1523 SendClientMessage(playerid, STEALTH_YELLOW, "This object is not attached to a vehicle");
1524 }
1525
1526 return 1;
1527}
1528
1529YCMD:avrx(playerid, arg[], help)
1530{
1531 if(help)
1532 {
1533 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1534 SendClientMessage(playerid, STEALTH_GREEN, "Rotate a vehicle's attached object along the X axis.");
1535 return 1;
1536 }
1537
1538 MapOpenCheck();
1539
1540 NoEditingMode(playerid);
1541
1542 EditCheck(playerid);
1543
1544 if(ObjectData[CurrObject[playerid]][oAttachedVehicle] > -1)
1545 {
1546 new Float:dist;
1547 dist = floatstr(arg);
1548 if(dist == 0) dist = 5.0;
1549
1550 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1551 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORX][refindex] += dist;
1552 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], refindex, VEHICLE_ATTACH_UPDATE);
1553
1554 sqlite_SaveVehicleObjectData(ObjectData[CurrObject[playerid]][oAttachedVehicle]);
1555
1556 UpdatePlayerOSelText(playerid);
1557 }
1558 else
1559 {
1560 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1561 SendClientMessage(playerid, STEALTH_YELLOW, "This object is not attached to a vehicle");
1562 }
1563
1564 return 1;
1565}
1566
1567YCMD:avry(playerid, arg[], help)
1568{
1569 if(help)
1570 {
1571 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1572 SendClientMessage(playerid, STEALTH_GREEN, "Rotate a vehicle's attached object along the Y axis.");
1573 return 1;
1574 }
1575
1576 MapOpenCheck();
1577
1578 NoEditingMode(playerid);
1579
1580 EditCheck(playerid);
1581
1582 if(ObjectData[CurrObject[playerid]][oAttachedVehicle] > -1)
1583 {
1584 new Float:dist;
1585 dist = floatstr(arg);
1586 if(dist == 0) dist = 5.0;
1587
1588 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1589 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORY][refindex] += dist;
1590 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], refindex, VEHICLE_ATTACH_UPDATE);
1591
1592 sqlite_SaveVehicleObjectData(ObjectData[CurrObject[playerid]][oAttachedVehicle]);
1593
1594 UpdatePlayerOSelText(playerid);
1595 }
1596 else
1597 {
1598 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1599 SendClientMessage(playerid, STEALTH_YELLOW, "This object is not attached to a vehicle");
1600 }
1601
1602 return 1;
1603}
1604
1605YCMD:avrz(playerid, arg[], help)
1606{
1607 if(help)
1608 {
1609 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1610 SendClientMessage(playerid, STEALTH_GREEN, "Rotate a vehicle's attached object along the Z axis.");
1611 return 1;
1612 }
1613
1614 MapOpenCheck();
1615
1616 NoEditingMode(playerid);
1617
1618 EditCheck(playerid);
1619
1620 if(ObjectData[CurrObject[playerid]][oAttachedVehicle] > -1)
1621 {
1622 new Float:dist;
1623 dist = floatstr(arg);
1624 if(dist == 0) dist = 5.0;
1625
1626 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1627 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORZ][refindex] += dist;
1628 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], refindex, VEHICLE_ATTACH_UPDATE);
1629
1630 sqlite_SaveVehicleObjectData(ObjectData[CurrObject[playerid]][oAttachedVehicle]);
1631
1632 UpdatePlayerOSelText(playerid);
1633 }
1634 else
1635 {
1636 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1637 SendClientMessage(playerid, STEALTH_YELLOW, "This object is not attached to a vehicle");
1638 }
1639
1640 return 1;
1641}
1642
1643static Float:AVEditPos[MAX_PLAYERS][3];
1644static Float:AVEditObjPos[MAX_PLAYERS][6];
1645
1646EditVehicleObject(playerid)
1647{
1648 MapOpenCheck();
1649
1650 EditCheck(playerid);
1651
1652 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1653
1654 if(!EditingMode[playerid])
1655 {
1656 new carindex = ObjectData[CurrObject[playerid]][oAttachedVehicle];
1657 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1658
1659 GetVehiclePos(CarData[carindex][CarID], AVEditPos[playerid][0], AVEditPos[playerid][1], AVEditPos[playerid][2]);
1660
1661 PivotObject[playerid] = CreateDynamicObject(1974,
1662 AVEditPos[playerid][0]+CarData[carindex][COX][refindex],
1663 AVEditPos[playerid][1]+CarData[carindex][COY][refindex],
1664 AVEditPos[playerid][2]+CarData[carindex][COZ][refindex],
1665 CarData[carindex][CORX][refindex],
1666 CarData[carindex][CORY][refindex],
1667 CarData[carindex][CORZ][refindex],
1668 -1, -1, playerid);
1669
1670 AVEditObjPos[playerid][0] = CarData[carindex][COX][refindex];
1671 AVEditObjPos[playerid][1] = CarData[carindex][COY][refindex];
1672 AVEditObjPos[playerid][2] = CarData[carindex][COZ][refindex];
1673 AVEditObjPos[playerid][3] = CarData[carindex][CORX][refindex];
1674 AVEditObjPos[playerid][4] = CarData[carindex][CORY][refindex];
1675 AVEditObjPos[playerid][5] = CarData[carindex][CORZ][refindex];
1676
1677 Streamer_SetFloatData(STREAMER_TYPE_OBJECT, PivotObject[playerid], E_STREAMER_DRAW_DISTANCE, 3000.0);
1678
1679 SetDynamicObjectMaterial(PivotObject[playerid], 0, 10765, "airportgnd_sfse", "white", -256);
1680
1681 Streamer_Update(playerid);
1682
1683 EditingMode[playerid] = true;
1684 SetEditMode(playerid, EDIT_MODE_VOBJECT);
1685
1686 SetVehicleZAngle(CarData[carindex][CarID], 0.0);
1687
1688 EditDynamicObject(playerid, PivotObject[playerid]);
1689
1690 SendClientMessage(playerid, STEALTH_GREEN, "Entered Vehicle Edit Object Mode");
1691
1692 }
1693 else SendClientMessage(playerid, STEALTH_YELLOW, "You are in editing mode already");
1694 return 1;
1695}
1696
1697OnPlayerEditVObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
1698{
1699 #pragma unused objectid
1700 if(response == EDIT_RESPONSE_FINAL)
1701 {
1702 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1703
1704 AVEditPos[playerid][0] = x - AVEditPos[playerid][0];
1705 AVEditPos[playerid][1] = y - AVEditPos[playerid][1];
1706 AVEditPos[playerid][2] = z - AVEditPos[playerid][2];
1707
1708 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COX][refindex] = AVEditPos[playerid][0];
1709 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COY][refindex] = AVEditPos[playerid][1];
1710 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COZ][refindex] = AVEditPos[playerid][2];
1711
1712 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORX][refindex] = rx;
1713 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORY][refindex] = ry;
1714 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORZ][refindex] = rz;
1715
1716 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], refindex, VEHICLE_ATTACH_UPDATE);
1717 sqlite_SaveVehicleObjectData(ObjectData[CurrObject[playerid]][oAttachedVehicle]);
1718
1719 DestroyDynamicObject(PivotObject[playerid]);
1720
1721 EditingMode[playerid] = false;
1722 SetEditMode(playerid, EDIT_MODE_NONE);
1723
1724 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1725 SendClientMessage(playerid, STEALTH_YELLOW, "Saved new attached object position");
1726 }
1727 else if(response == EDIT_RESPONSE_UPDATE)
1728 {
1729 new Float:tmpx, Float:tmpy, Float:tmpz;
1730
1731 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1732
1733 tmpx = x - AVEditPos[playerid][0];
1734 tmpy = y - AVEditPos[playerid][1];
1735 tmpz = z - AVEditPos[playerid][2];
1736
1737 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COX][refindex] = tmpx;
1738 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COY][refindex] = tmpy;
1739 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COZ][refindex] = tmpz;
1740
1741 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORX][refindex] = rx;
1742 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORY][refindex] = ry;
1743 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORZ][refindex] = rz;
1744
1745 SetVehicleZAngle(CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CarID], 0.0);
1746
1747 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], refindex, VEHICLE_ATTACH_UPDATE);
1748
1749 }
1750 else if(response == EDIT_RESPONSE_CANCEL)
1751 {
1752 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1753 SendClientMessage(playerid, STEALTH_YELLOW, "Cancelled vehicle object editing");
1754
1755 DestroyDynamicObject(PivotObject[playerid]);
1756
1757 new refindex = GetCarObjectRefIndex(ObjectData[CurrObject[playerid]][oAttachedVehicle], CurrObject[playerid]);
1758
1759 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COX][refindex] = AVEditObjPos[playerid][0];
1760 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COY][refindex] = AVEditObjPos[playerid][1];
1761 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][COZ][refindex] = AVEditObjPos[playerid][2];
1762 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORX][refindex] = AVEditObjPos[playerid][3];
1763 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORY][refindex] = AVEditObjPos[playerid][4];
1764 CarData[ObjectData[CurrObject[playerid]][oAttachedVehicle]][CORZ][refindex] = AVEditObjPos[playerid][5];
1765
1766 UpdateAttachedVehicleObject(ObjectData[CurrObject[playerid]][oAttachedVehicle], refindex, VEHICLE_ATTACH_UPDATE);
1767
1768 EditingMode[playerid] = false;
1769 SetEditMode(playerid, EDIT_MODE_NONE);
1770 }
1771 return 1;
1772}
1773
1774
1775UpdateAttachedVehicleObject(carindex, refindex, type)
1776{
1777 if(type == VEHICLE_ATTACH_UPDATE)
1778 {
1779 Streamer_SetFloatData(STREAMER_TYPE_OBJECT, ObjectData[CarData[carindex][CarObjectRef][refindex]][oID], E_STREAMER_ATTACH_OFFSET_X, CarData[carindex][COX][refindex]);
1780 Streamer_SetFloatData(STREAMER_TYPE_OBJECT, ObjectData[CarData[carindex][CarObjectRef][refindex]][oID], E_STREAMER_ATTACH_OFFSET_Y, CarData[carindex][COY][refindex]);
1781 Streamer_SetFloatData(STREAMER_TYPE_OBJECT, ObjectData[CarData[carindex][CarObjectRef][refindex]][oID], E_STREAMER_ATTACH_OFFSET_Z, CarData[carindex][COZ][refindex]);
1782 Streamer_SetFloatData(STREAMER_TYPE_OBJECT, ObjectData[CarData[carindex][CarObjectRef][refindex]][oID], E_STREAMER_ATTACH_R_X, CarData[carindex][CORX][refindex]);
1783 Streamer_SetFloatData(STREAMER_TYPE_OBJECT, ObjectData[CarData[carindex][CarObjectRef][refindex]][oID], E_STREAMER_ATTACH_R_Y, CarData[carindex][CORY][refindex]);
1784 Streamer_SetFloatData(STREAMER_TYPE_OBJECT, ObjectData[CarData[carindex][CarObjectRef][refindex]][oID], E_STREAMER_ATTACH_R_Z, CarData[carindex][CORZ][refindex]);
1785
1786 }
1787 else if(type == VEHICLE_REATTACH_UPDATE)
1788 {
1789 refindex = GetCarObjectRefIndex(carindex, refindex);
1790
1791 AttachDynamicObjectToVehicle(ObjectData[CarData[carindex][CarObjectRef][refindex]][oID], CarData[carindex][CarID],
1792 CarData[carindex][COX][refindex], CarData[carindex][COY][refindex], CarData[carindex][COZ][refindex],
1793 CarData[carindex][CORX][refindex], CarData[carindex][CORY][refindex], CarData[carindex][CORZ][refindex]
1794 );
1795 }
1796
1797 UpdateObject3DText(CarData[carindex][CarObjectRef][refindex], false);
1798
1799 return 1;
1800}
1801
1802
1803UpdateAttachedObjectRef(carindex, objindex)
1804{
1805 new refindex = GetCarObjectRefIndex(carindex, objindex);
1806 if(refindex > -1)
1807 {
1808 CarData[carindex][CarObjectRef][refindex] = -1;
1809 sqlite_SaveVehicleObjectData(carindex);
1810 return 1;
1811 }
1812 return 0;
1813}
1814
1815GetCarObjectRefIndex(carindex, objindex)
1816{
1817 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
1818 {
1819 if(CarData[carindex][CarObjectRef][i] == objindex) return i;
1820 }
1821 return -1;
1822}
1823
1824static IsObjectAttachedToVehicle(index)
1825{
1826 foreach(new i : Cars)
1827 {
1828 for(new j = 0; j < MAX_CAR_OBJECTS; j++) if(CarData[i][CarObjectRef][j] == index) return 1;
1829 }
1830 return 0;
1831}
1832
1833GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
1834{ // Created by Y_Less
1835
1836 new Float:a;
1837
1838 GetPlayerPos(playerid, x, y, a);
1839 GetPlayerFacingAngle(playerid, a);
1840
1841 if (GetPlayerVehicleID(playerid)) {
1842 GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
1843 }
1844
1845 x += (distance * floatsin(-a, degrees));
1846 y += (distance * floatcos(-a, degrees));
1847}
1848
1849static ExportCar(playerid, index, name[])
1850{
1851 new File:f = fopen(name, io_write);
1852 new templine[256];
1853
1854 // Header
1855 fwrite(f,"//Vehicle Exported with Texture Studio By: [uL]Pottus/////////////////////////////////////////////////////////////\r\n");
1856 fwrite(f,"//////////////////////////////////////////////////and Crayder/////////////////////////////////////////////////////\r\n");
1857 fwrite(f,"//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n");
1858
1859 // Includes
1860 fwrite(f, "#include <a_samp>\r\n");
1861 fwrite(f, "#include <streamer>\r\n\n");
1862
1863 // Car id
1864 fwrite(f, "new carvid;\r\n\n");
1865
1866 // Init script
1867 fwrite(f, "public OnFilterScriptInit()\r\n");
1868 fwrite(f, "{ \r\n");
1869 fwrite(f," new tmpobjid;\r\n\n");
1870
1871 format(templine, sizeof(templine), " carvid = CreateVehicle(%i,%.3f,%.3f,%.3f,%.3f,%i,%i,-1,%i);\r\n\n",
1872 CarData[index][CarModel], CarData[index][CarSpawnX], CarData[index][CarSpawnY], CarData[index][CarSpawnZ], CarData[index][CarSpawnFA], CarData[index][CarColor1], CarData[index][CarColor2], CarData[index][CarSiren] ? 1 : 0
1873 );
1874
1875 fwrite(f, templine);
1876
1877
1878 // Mod components
1879 for(new i = 0; i < MAX_CAR_COMPONENTS; i++)
1880 {
1881 if(CarData[index][CarComponents][i] > 0)
1882 {
1883 format(templine, sizeof(templine), " AddVehicleComponent(carvid, %i);\r\n", CarData[index][CarComponents][i]);
1884 fwrite(f, templine);
1885 }
1886 }
1887
1888 // Paintjob
1889 if(CarData[index][CarPaintJob] < 3)
1890 {
1891 format(templine, sizeof(templine), " ChangeVehiclePaintjob(carvid, %i);\r\n\n", CarData[index][CarPaintJob]);
1892 fwrite(f, templine);
1893 }
1894
1895
1896 // Objects
1897 for(new i = 0; i < MAX_CAR_OBJECTS; i++)
1898 {
1899 // No object
1900 if(CarData[index][CarObjectRef][i] == -1) continue;
1901 new oindex = CarData[index][CarObjectRef][i];
1902
1903 // Create object
1904 format(templine,sizeof(templine)," tmpobjid = CreateDynamicObject(%i,0.0,0.0,-1000.0,0.0,0.0,0.0,-1,-1,-1,300.0,300.0);\r\n",ObjectData[oindex][oModel]);
1905 fwrite(f,templine);
1906
1907
1908 // Write all materials and colors
1909 for(new j = 0; j < MAX_MATERIALS; j++)
1910 {
1911 // Does object have a texture set?
1912 if(ObjectData[oindex][oTexIndex][j] != 0)
1913 {
1914 format(templine,sizeof(templine)," SetDynamicObjectMaterial(tmpobjid, %i, %i, %c%s%c, %c%s%c, %i);\r\n",
1915 j, GetTModel(ObjectData[oindex][oTexIndex][j]), 34, GetTXDName(ObjectData[oindex][oTexIndex][j]), 34, 34,GetTextureName(ObjectData[oindex][oTexIndex][j]), 34, ObjectData[oindex][oColorIndex][j]
1916 );
1917
1918 fwrite(f,templine);
1919 }
1920
1921 // No texture how about a color?
1922 else if(ObjectData[oindex][oColorIndex][j] != 0)
1923 {
1924 format(templine,sizeof(templine)," SetDynamicObjectMaterial(tmpobjid, %i, -1, %c%s%c, %c%s%c, %i);\r\n", j, 34, "none", 34, 34,"none", 34, ObjectData[oindex][oColorIndex][j]);
1925 fwrite(f,templine);
1926 }
1927 }
1928
1929 // Write any text
1930 if(ObjectData[oindex][ousetext])
1931 {
1932 format(templine,sizeof(templine)," SetDynamicObjectMaterialText(tmpobjid, 0, %c%s%c, %i, %c%s%c, %i, %i, %i, %i, %i);\r\n",
1933 34, ObjectData[oindex][oObjectText], 34,
1934 FontSizes[ObjectData[oindex][oFontSize]],
1935 34, FontNames[ObjectData[oindex][oFontFace]], 34,
1936 ObjectData[oindex][oTextFontSize],
1937 ObjectData[oindex][oFontBold],
1938 ObjectData[oindex][oFontColor],
1939 ObjectData[oindex][oBackColor],
1940 ObjectData[oindex][oAlignment]
1941 );
1942 fwrite(f,templine);
1943 }
1944
1945 // Attach object to vehicle
1946 format(templine, sizeof(templine), " AttachDynamicObjectToVehicle(tmpobjid, carvid, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f);\r\n",
1947 CarData[index][COX][i], CarData[index][COY][i], CarData[index][COZ][i], CarData[index][CORX][i], CarData[index][CORY][i], CarData[index][CORZ][i]
1948 );
1949
1950 fwrite(f,templine);
1951 }
1952
1953 fwrite(f, "} \r\n\n");
1954
1955 // Exit script
1956 fwrite(f, "public OnFilterScriptExit()\r\n");
1957 fwrite(f, "{ \r\n");
1958 fwrite(f," DestroyVehicle(carvid);\r\n");
1959 fwrite(f, "} \r\n\n");
1960
1961 // Vehicle respawn
1962 fwrite(f, "public OnVehicleSpawn(vehicleid)\r\n");
1963
1964 fwrite(f, "{ \r\n");
1965 fwrite(f, " if(vehicleid == carvid)\r\n");
1966 fwrite(f, " { \r\n");
1967
1968 // Mod components
1969 for(new i = 0; i < MAX_CAR_COMPONENTS; i++)
1970 {
1971 if(CarData[index][CarComponents][i] > 0)
1972 {
1973 format(templine, sizeof(templine), " AddVehicleComponent(carvid, %i);\r\n", CarData[index][CarComponents][i]);
1974 fwrite(f, templine);
1975 }
1976 }
1977
1978
1979
1980 // Paintjob
1981 if(CarData[index][CarPaintJob] < 3)
1982 {
1983 format(templine, sizeof(templine), " ChangeVehiclePaintjob(carvid, %i);\r\n", CarData[index][CarPaintJob]);
1984 fwrite(f, templine);
1985 }
1986
1987 fwrite(f, " } \r\n");
1988
1989
1990 fwrite(f, "} \r\n");
1991
1992 fclose(f);
1993
1994 format(templine, sizeof(templine), "Exported vehicle to filterscript %s", name);
1995
1996 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
1997 SendClientMessage(playerid, STEALTH_GREEN, templine);
1998
1999 return 1;
2000}
2001
2002static ExportAllCars(playerid, name[])
2003{
2004 new File:f = fopen(name, io_write);
2005 new templine[256];
2006
2007 // Header
2008 fwrite(f,"//Vehicle Exported with Texture Studio By: [uL]Pottus/////////////////////////////////////////////////////////////\r\n");
2009 fwrite(f,"//////////////////////////////////////////////////and Crayder/////////////////////////////////////////////////////\r\n");
2010 fwrite(f,"//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n");
2011
2012 // Includes
2013 fwrite(f, "#include <a_samp>\r\n");
2014 fwrite(f, "#include <streamer>\r\n\n");
2015
2016 new CarCount = Iter_Count(Cars);
2017 new CurrCar;
2018
2019 // Car id
2020 for(new i = 0; i < CarCount; i++)
2021 {
2022 format(templine, sizeof(templine), "new carvid_%i;\r\n", i);
2023 fwrite(f, templine);
2024 }
2025
2026 fwrite(f, "\n");
2027
2028 // Init script
2029 fwrite(f, "public OnFilterScriptInit()\r\n");
2030 fwrite(f, "{ \r\n");
2031 fwrite(f," new tmpobjid;\r\n\n");
2032
2033 foreach(new i : Cars)
2034 {
2035 format(templine, sizeof(templine), " carvid_%i = CreateVehicle(%i,%.3f,%.3f,%.3f,%.3f,%i,%i,-1,%i);\r\n",
2036 CurrCar++, CarData[i][CarModel], CarData[i][CarSpawnX], CarData[i][CarSpawnY], CarData[i][CarSpawnZ], CarData[i][CarSpawnFA], CarData[i][CarColor1], CarData[i][CarColor2], CarData[i][CarSiren] ? 1 : 0
2037 );
2038 fwrite(f, templine);
2039 }
2040
2041 CurrCar = 0;
2042
2043 fwrite(f, "\n");
2044
2045 foreach(new i : Cars)
2046 {
2047 // Mod components
2048 for(new j = 0; j < MAX_CAR_COMPONENTS; j++)
2049 {
2050 if(CarData[i][CarComponents][j] > 0)
2051 {
2052 format(templine, sizeof(templine), " AddVehicleComponent(carvid_%i, %i);\r\n", CurrCar, CarData[i][CarComponents][j]);
2053 fwrite(f, templine);
2054 }
2055 }
2056 CurrCar++;
2057 }
2058
2059 CurrCar = 0;
2060
2061 fwrite(f, "\n");
2062
2063 foreach(new i : Cars)
2064 {
2065 // Paintjob
2066 if(CarData[i][CarPaintJob] < 3)
2067 {
2068 format(templine, sizeof(templine), " ChangeVehiclePaintjob(carvid_%i, %i);\r\n", CurrCar, CarData[i][CarPaintJob]);
2069 fwrite(f, templine);
2070 }
2071 CurrCar++;
2072 }
2073
2074 CurrCar = 0;
2075
2076 fwrite(f, "\n");
2077
2078 foreach(new i : Cars)
2079 {
2080 // Objects
2081 for(new j = 0; j < MAX_CAR_OBJECTS; j++)
2082 {
2083 // No object
2084 if(CarData[i][CarObjectRef][j] == -1) continue;
2085 new oindex = CarData[i][CarObjectRef][j];
2086
2087 // Create object
2088 format(templine,sizeof(templine)," tmpobjid = CreateDynamicObject(%i,0.0,0.0,-1000.0,0.0,0.0,0.0,-1,-1,-1,300.0,300.0);\r\n",ObjectData[oindex][oModel]);
2089 fwrite(f,templine);
2090
2091
2092 // Write all materials and colors
2093 for(new k = 0; k < MAX_MATERIALS; k++)
2094 {
2095 // Does object have a texture set?
2096 if(ObjectData[oindex][oTexIndex][k] != 0)
2097 {
2098 format(templine,sizeof(templine)," SetDynamicObjectMaterial(tmpobjid, %i, %i, %c%s%c, %c%s%c, %i);\r\n",
2099 k, GetTModel(ObjectData[oindex][oTexIndex][k]), 34, GetTXDName(ObjectData[oindex][oTexIndex][k]), 34, 34,GetTextureName(ObjectData[oindex][oTexIndex][k]), 34, ObjectData[oindex][oColorIndex][k]
2100 );
2101
2102 fwrite(f,templine);
2103 }
2104
2105 // No texture how about a color?
2106 else if(ObjectData[oindex][oColorIndex][k] != 0)
2107 {
2108 format(templine,sizeof(templine)," SetDynamicObjectMaterial(tmpobjid, %i, -1, %c%s%c, %c%s%c, %i);\r\n", j, 34, "none", 34, 34,"none", 34, ObjectData[oindex][oColorIndex][k]);
2109 fwrite(f,templine);
2110 }
2111 }
2112
2113 // Write any text
2114 if(ObjectData[oindex][ousetext])
2115 {
2116 format(templine,sizeof(templine)," SetDynamicObjectMaterialText(tmpobjid, 0, %c%s%c, %i, %c%s%c, %i, %i, %i, %i, %i);\r\n",
2117 34, ObjectData[oindex][oObjectText], 34,
2118 FontSizes[ObjectData[oindex][oFontSize]],
2119 34, FontNames[ObjectData[oindex][oFontFace]], 34,
2120 ObjectData[oindex][oTextFontSize],
2121 ObjectData[oindex][oFontBold],
2122 ObjectData[oindex][oFontColor],
2123 ObjectData[oindex][oBackColor],
2124 ObjectData[oindex][oAlignment]
2125 );
2126 fwrite(f,templine);
2127 }
2128
2129 // Attach object to vehicle
2130 format(templine, sizeof(templine), " AttachDynamicObjectToVehicle(tmpobjid, carvid_%i, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f);\r\n",
2131 CurrCar, CarData[i][COX][j], CarData[i][COY][j], CarData[i][COZ][j], CarData[i][CORX][j], CarData[i][CORY][j], CarData[i][CORZ][j]
2132 );
2133
2134 fwrite(f,templine);
2135 }
2136 CurrCar++;
2137
2138 fwrite(f, "\n");
2139 }
2140 fwrite(f, "} \r\n\n");
2141
2142 CurrCar = 0;
2143
2144 // Exit script
2145 fwrite(f, "public OnFilterScriptExit()\r\n");
2146 fwrite(f, "{ \r\n");
2147
2148 foreach(new i : Cars)
2149 {
2150 format(templine, sizeof(templine), " DestroyVehicle(carvid_%i);\r\n", CurrCar);
2151 fwrite(f, templine);
2152 CurrCar++;
2153 }
2154
2155 fwrite(f, "} \r\n\n");
2156
2157 CurrCar = 0;
2158
2159 // Vehicle respawn
2160 fwrite(f, "public OnVehicleSpawn(vehicleid)\r\n");
2161
2162 fwrite(f, "{ \r\n");
2163 foreach(new i : Cars)
2164 {
2165 if(CurrCar == 0) format(templine, sizeof(templine), " if(vehicleid == carvid_%i)\r\n", CurrCar);
2166 else format(templine, sizeof(templine), " else if(vehicleid == carvid_%i)\r\n", CurrCar);
2167 fwrite(f, templine);
2168
2169 fwrite(f, " {\r\n");
2170
2171 // Mod components
2172 for(new j = 0; j < MAX_CAR_COMPONENTS; j++)
2173 {
2174 if(CarData[i][CarComponents][j] > 0)
2175 {
2176 format(templine, sizeof(templine), " AddVehicleComponent(carvid_%i, %i);\r\n", CurrCar, CarData[i][CarComponents][i]);
2177 fwrite(f, templine);
2178 }
2179 }
2180
2181 // Paintjob
2182 if(CarData[i][CarPaintJob] < 3)
2183 {
2184 format(templine, sizeof(templine), " ChangeVehiclePaintjob(carvid_%i, %i);\r\n", CurrCar, CarData[i][CarPaintJob]);
2185 fwrite(f, templine);
2186 }
2187
2188 fwrite(f, " }\r\n");
2189
2190 CurrCar++;
2191 }
2192
2193 fwrite(f, "} \r\n");
2194
2195 fclose(f);
2196
2197 format(templine, sizeof(templine), "Exported vehicles to filterscript %s", name);
2198
2199 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
2200 SendClientMessage(playerid, STEALTH_GREEN, templine);
2201
2202 return 1;
2203}
2204
2205
2206YCMD:avexport(playerid, arg[], help)
2207{
2208 if(help)
2209 {
2210 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
2211 SendClientMessage(playerid, STEALTH_GREEN, "Export all vehicles to a text file.");
2212 return 1;
2213 }
2214
2215 MapOpenCheck();
2216
2217 VehicleCheck(playerid);
2218
2219 // Ask for a map name
2220 inline ExportVehicle(epid, edialogid, eresponse, elistitem, string:etext[])
2221 {
2222 #pragma unused elistitem, edialogid, epid
2223 if(eresponse)
2224 {
2225 // Was a map name supplied ?
2226 if(!isnull(etext))
2227 {
2228 new exportmap[256];
2229
2230 // Check map name length
2231 if(strlen(etext) >= 20)
2232 {
2233 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
2234 SendClientMessage(playerid, STEALTH_YELLOW, "Choose a shorter vehicle name to export to...");
2235 return 1;
2236 }
2237
2238 // Format the output name
2239 format(exportmap, sizeof(exportmap), "tstudio/ExportCars/%s.pwn", etext);
2240
2241 // Map exists ask to remove
2242 if(fexist(exportmap))
2243 {
2244 inline RemoveVehicle(rpid, rdialogid, rresponse, rlistitem, string:rtext[])
2245 {
2246 #pragma unused rlistitem, rdialogid, rpid, rtext
2247
2248 // Remove map and export
2249 if(rresponse)
2250 {
2251 fremove(exportmap);
2252 ExportCar(playerid, CurrVehicle[playerid], exportmap);
2253 }
2254 }
2255 Dialog_ShowCallback(playerid, using inline RemoveVehicle, DIALOG_STYLE_MSGBOX, "Texture Studio (Vehicle Export)", "A export exists with this name replace?", "Ok", "Cancel");
2256 }
2257 // We can start the export
2258 else ExportCar(playerid, CurrVehicle[playerid], exportmap);
2259 }
2260 }
2261 else
2262 {
2263 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
2264 SendClientMessage(playerid, STEALTH_YELLOW, "You can't export a vehicle with no name");
2265 Dialog_ShowCallback(playerid, using inline ExportVehicle, DIALOG_STYLE_INPUT, "Texture Studio (Vehicle Export)", "Enter a export vehicle name", "Ok", "Cancel");
2266 }
2267 }
2268 Dialog_ShowCallback(playerid, using inline ExportVehicle, DIALOG_STYLE_INPUT, "Texture Studio (Vehicle Export)", "Enter a export vehicle name", "Ok", "Cancel");
2269
2270 return 1;
2271
2272}
2273
2274YCMD:avexportall(playerid, arg[], help)
2275{
2276 if(help)
2277 {
2278 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
2279 SendClientMessage(playerid, STEALTH_GREEN, "Export all vehicles to a filterscript.");
2280 return 1;
2281 }
2282
2283 MapOpenCheck();
2284
2285 if(Iter_Count(Cars) == 0)
2286 {
2287 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
2288 SendClientMessage(playerid, STEALTH_YELLOW, "There are no cars to export.");
2289 return 1;
2290 }
2291
2292 // Ask for a map name
2293 inline ExportVehicles(epid, edialogid, eresponse, elistitem, string:etext[])
2294 {
2295 #pragma unused elistitem, edialogid, epid
2296 if(eresponse)
2297 {
2298 // Was a map name supplied ?
2299 if(!isnull(etext))
2300 {
2301 new exportmap[256];
2302
2303 // Check map name length
2304 if(strlen(etext) >= 20)
2305 {
2306 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
2307 SendClientMessage(playerid, STEALTH_YELLOW, "Choose a shorter vehicles name to export to...");
2308 return 1;
2309 }
2310
2311 // Format the output name
2312 format(exportmap, sizeof(exportmap), "tstudio/ExportCars/%s.pwn", etext);
2313
2314 // Map exists ask to remove
2315 if(fexist(exportmap))
2316 {
2317 inline RemoveVehicles(rpid, rdialogid, rresponse, rlistitem, string:rtext[])
2318 {
2319 #pragma unused rlistitem, rdialogid, rpid, rtext
2320
2321 // Remove map and export
2322 if(rresponse)
2323 {
2324 fremove(exportmap);
2325 ExportAllCars(playerid, exportmap);
2326 }
2327 }
2328 Dialog_ShowCallback(playerid, using inline RemoveVehicles, DIALOG_STYLE_MSGBOX, "Texture Studio (Export Vehicles)", "A export exists with this name replace?", "Ok", "Cancel");
2329 }
2330 // We can start the export
2331 else ExportAllCars(playerid, exportmap);
2332 }
2333 }
2334 else
2335 {
2336 SendClientMessage(playerid, STEALTH_ORANGE, "______________________________________________");
2337 SendClientMessage(playerid, STEALTH_YELLOW, "You can't export a vehicle with no name");
2338 Dialog_ShowCallback(playerid, using inline ExportVehicles, DIALOG_STYLE_INPUT, "Texture Studio (Export Vehicles)", "Enter a export vehicle name", "Ok", "Cancel");
2339 }
2340 }
2341 Dialog_ShowCallback(playerid, using inline ExportVehicles, DIALOG_STYLE_INPUT, "Texture Studio (Export Vehicles)", "Enter a export vehicle name", "Ok", "Cancel");
2342
2343 return 1;
2344}