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