vehicles.pwn 79 KB

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