vcommands.inc 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. static carstr[128] //for user output, static: only works in this file.
  2. /*
  3. ***************** DIALOGS ***************
  4. DEFINITION & VARIABLES
  5. See hooks.inc for OnDialogResponse
  6. ===================================================
  7. */
  8. //Using an enumerator in this case would be less efficient.
  9. #define DIALOG_VEHICLES_UP 9000
  10. #define DIALOG_VEHICLES_UP2 9001
  11. #define DIALOG_CUSTOM_PLATE 9002
  12. #define DIALOG_MYVEHICLES 9003
  13. //the car being upgraded through /vupgrade
  14. new vupgrading[MAX_PLAYERS] = -1
  15. CMD:carhelp(playerid, params[])
  16. {
  17. SendClientMessage(playerid, COLOR_YELLOW, "____________________________________________");
  18. SendClientMessage(playerid, COLOR_WHITE, "COMMANDS: /v, /breakin, /dealerships, /clearmods, /windows");
  19. SendClientMessage( playerid, COLOR_WHITE, "COMMANDS: /purchasecar, /spraycar, /lock, /engine, /trunk, /hood, /lights")
  20. return 1;
  21. }
  22. CMD:vehhelp( playerid, params[] ) {
  23. return cmd_carhelp( playerid, params )
  24. }
  25. /*
  26. ******** Player Vehicle Commands *********
  27. ===================================================
  28. */
  29. CMD:v( playerid, params[] ) {
  30. new option[20], optional[80];
  31. if( sscanf( params, "s[20]z", option, optional ) ) {
  32. SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /v [option]" );
  33. SendClientMessage( playerid, COLOR_GREY, "Available options: /v cars, /v spawn, /v park, /v sell, /v dump" );
  34. SendClientMessage( playerid, COLOR_GREY, "Available options: /v upgrade, /v track, /v givekeys")
  35. return 1;
  36. }
  37. //Commands that do not require the player to have a spawned car
  38. if( strcmp( option, "cars", true ) == 0 ) { return cmdveh_cars( playerid ); }
  39. if( strcmp( option, "spawn", true ) == 0 ) { return cmdveh_spawn( playerid, optional ); }
  40. //Commands that do require a spawned car
  41. new slot = playerSpawnedVehicle[playerid]
  42. if( slot < 0 ) return SendClientMessage( playerid, COLOR_GREY, "You do not have any cars spawned. Use '/v spawn' to spawn one." )
  43. new model[80];
  44. format( model, 80, GetVehicleFriendlyNameFromModel( PlayerVehicles[playerid][slot][pvmodel] ) );
  45. if( strcmp( option, "track", true ) == 0 ) { return cmdveh_track( playerid, slot, model ); }
  46. if( strcmp( option, "givekeys", true ) == 0 ) { return cmdveh_givekeys( playerid, optional, slot, model );}
  47. if( strcmp( option, "park", true ) == 0 ) { return cmdveh_park( playerid, slot, model ); }
  48. if( strcmp( option, "upgrade", true ) == 0 ) { return cmdveh_upgrade( playerid, slot, model ); }
  49. if( strcmp( option, "sell", true ) == 0 ) { return cmdveh_sell( playerid, optional, slot, model ); }
  50. if( strcmp( option, "dump", true ) == 0 ) { return cmdveh_dump( playerid, optional, slot, model ); }
  51. return 1;
  52. }
  53. cmdveh_dump( playerid, params[], slot, model[] ) {
  54. #define veh(%0) PlayerVehicles[playerid][slot][pv%0]
  55. new cartext[128];
  56. if( GetPlayerVehicleID( playerid ) != veh(ID) ) {
  57. format( cartext, sizeof( cartext ), "You must be inside your %s in order to dump it at the dump.", model );
  58. return SendClientMessage( playerid, COLOR_GREY, cartext );
  59. }
  60. if( !IsPlayerInRangeOfPoint( playerid, 5.0, 134.0741,-256.5139,1.3052 ) ) {
  61. SetPlayerCheckpointEx( playerid, 134.0522,-256.3802,1.3052, 5.0 )
  62. CP[playerid] = CHECKPOINT_CAR_DUMP
  63. return SendClientMessage( playerid, COLOR_GREY, "You must be at the dump. A red marker has been marked on your map showing you the way." )
  64. }
  65. new moneyback = 0
  66. if( veh(gps) ) moneyback += 300000
  67. if( veh(insurance) ) moneyback += 200000
  68. if( veh(alarm) ) moneyback += 100000
  69. if( veh(sparekey) ) moneyback += 200000
  70. new car_str[128]
  71. if( sscanf( params, "s[128]", car_str ) ) {
  72. format( car_str, 128, "You will get a total of $%d for dumping your %s. Are you sure you want to do this?", moneyback, model )
  73. SendClientMessage( playerid, COLOR_WHITE, car_str )
  74. SendClientMessage( playerid, COLOR_GREY, "/v dump [confirm], to proceed." )
  75. return 1
  76. }
  77. destroyPlayerVehicle( playerid, slot )
  78. PlayerInfo[playerid][pCarID][slot] = 0
  79. veh(pID) = -1
  80. veh(model) = 0
  81. veh(impounded) = 0
  82. veh(gps) = 0
  83. veh(insurance) = 0
  84. veh(sparekey) = 0
  85. veh(alarm) = 0
  86. veh(Gun1) = 0
  87. veh(Gun2) = 0
  88. veh(Pot) = 0
  89. veh(Crack) = 0
  90. veh(Armor) = 0
  91. veh(damage) = 1000.00
  92. veh(playerID) = INVALID_PLAYER_ID
  93. mysql_format( sqlGameConnection, car_str, 128, "DELETE FROM playervehicles WHERE ID = %d;", veh(SQLID) )
  94. mysql_pquery( sqlGameConnection, car_str )
  95. format( car_str, 128, "You have dumped for %s for $%d.", model, moneyback )
  96. SendClientMessage( playerid, COLOR_GREY, car_str )
  97. GiveMoney( playerid, moneyback )
  98. SQLSave( playerid )
  99. #undef veh
  100. return 1;
  101. }
  102. new playeridcarOffered[MAX_PLAYERS] = {-1, ...}
  103. new carOfferedSlot[MAX_PLAYERS] = {-1, ...}
  104. new carOfferedPrice[MAX_PLAYERS] = {-1, ...}
  105. cmdveh_sell( playerid, params[], slot, model[] ) {
  106. new player, price, cartext[128];
  107. if( sscanf( params, "ui", player, price ) ) {
  108. return SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /v sell [playerid/playerName] [price]" )
  109. }
  110. if( price < 0 ) {
  111. return SendClientMessage( playerid, COLOR_GREY, "You must enter a positive number for the price." )
  112. }
  113. #define veh(%1) PlayerVehicles[playerid][slot][pv%1]
  114. new Float:vpos[3]
  115. GetVehiclePos( veh(ID), vpos[0], vpos[1], vpos[2] )
  116. if( !IsPlayerInRangeOfPoint( playerid, 8.0, vpos[0], vpos[1], vpos[2] ) ) {
  117. format( cartext, sizeof( cartext ), "You must be near your %s in order to sell it.", model );
  118. return SendClientMessage( playerid, COLOR_GREY, cartext );
  119. }
  120. if( !IsPlayerConnected( player ) ) {
  121. return SendClientMessage( playerid, COLOR_GREY, "ERROR: That player is not connected." )
  122. }
  123. new Float:ppos[3]
  124. GetPlayerPos( player, ppos[0], ppos[1], ppos[2] )
  125. if( IsPlayerInRangeOfPoint( playerid, 3.0, ppos[0], ppos[1], ppos[2] ) ) {
  126. format( carstr, sizeof( carstr ), "%s has offered you their %s for $%d, type /purchasecar to accept the vehicle.", PlayerICName( playerid ), model, price )
  127. SendClientMessage( player, COLOR_LIGHTBLUE, carstr )
  128. format( carstr, sizeof( carstr ), "You have offered %s your %s for $%d, please wait for the player to accept it.", PlayerICName( player ), model, price )
  129. SendClientMessage( playerid, COLOR_LIGHTBLUE, carstr )
  130. playeridcarOffered[player] = playerid
  131. carOfferedSlot[player] = slot
  132. carOfferedPrice[player] = price
  133. return 1
  134. }
  135. #undef veh
  136. SendClientMessage( playerid, COLOR_GREY, "You must be near this player in order to sell them this vehicle." )
  137. return 1;
  138. }
  139. CMD:purchasecar( playerid, params[] ) {
  140. if( playeridcarOffered[playerid] > -1 ) {
  141. new player = playeridcarOffered[playerid]
  142. new slot = carOfferedSlot[playerid]
  143. new price = carOfferedPrice[playerid]
  144. if( PlayerInfo[playerid][pCash] < carOfferedPrice[playerid] ) {
  145. return SendClientMessage( playerid, COLOR_GREY, "You cannot afford this." )
  146. }
  147. new freeslot = -1
  148. for( new i; i < PlayerInfo[playerid][pMaxCarSlots]; i++ ) {
  149. if( PlayerInfo[playerid][pCarID][i] < 1 ) {
  150. freeslot = i
  151. }
  152. }
  153. if( freeslot == -1 ) {
  154. return SendClientMessage( playerid, COLOR_GREY, "You cannot own anymore vehicles." )
  155. }
  156. playeridcarOffered[playerid] = -1
  157. carOfferedPrice[playerid] = -1
  158. carOfferedSlot[playerid] = -1
  159. PlayerInfo[player][pCarID][slot] = 0
  160. GiveMoney( player, price )
  161. GiveMoney( playerid, -price )
  162. PlayerInfo[player][pCarID][slot] = 0
  163. playerSpawnedVehicle[player] = -1
  164. #define veh(%0) PlayerVehicles[playerid][freeslot][pv%0]
  165. #define oldveh(%0) PlayerVehicles[player][slot][pv%0]
  166. for( new c; c < 14; c++ ) {
  167. veh(components)[c] = GetVehicleComponentInSlot( oldveh(ID), c );
  168. }
  169. GetVehicleHealth( oldveh(ID), veh(damage) )
  170. GetVehiclePos( oldveh(ID), veh(x), veh(y), veh(z) )
  171. GetVehicleZAngle( oldveh(ID), veh(rz) )
  172. veh(vw) = GetVehicleVirtualWorld( oldveh(ID) )
  173. //get trunk data to save
  174. if( veh(spawned) ) {
  175. veh(Gun1) = TrunkInfo[oldveh(ID)][cGun1]
  176. veh(Gun2) = TrunkInfo[oldveh(ID)][cGun2]
  177. veh(Pot) = TrunkInfo[oldveh(ID)][cPot]
  178. veh(Crack) = TrunkInfo[oldveh(ID)][cCrack]
  179. veh(Armor) = TrunkInfo[oldveh(ID)][cArmor]
  180. }
  181. GetVehicleDamageStatus( oldveh(ID), veh(dpanels), veh(ddoors), veh(dlights), veh(dtires) )
  182. destroyPlayerVehicle( player, slot );
  183. veh(pID) = PlayerInfo[playerid][pID]
  184. PlayerInfo[playerid][pCarID][freeslot] = PlayerVehicles[player][slot][pvSQLID]
  185. veh(model) = oldveh(model);
  186. veh(color1) = oldveh(color1);
  187. veh(color2) = oldveh(color2);
  188. veh(paintjob) = oldveh(paintjob);
  189. veh(locked) = oldveh(locked);
  190. veh(gps) = oldveh(gps);
  191. veh(alarm) = oldveh(alarm);
  192. veh(insurance) = oldveh(insurance);
  193. veh(sparekey) = oldveh(sparekey);
  194. veh(gas) = oldveh(gas)
  195. format( veh(plate), 9, "%s", oldveh(plate) );
  196. veh(SQLID) = oldveh(SQLID)
  197. if( playerSpawnedVehicle[playerid] > -1 ) {
  198. destroyPlayerVehicle( playerid, playerSpawnedVehicle[playerid] );
  199. }
  200. spawnPlayerVehicle( playerid, freeslot, 1 );
  201. savePlayerVehicle( playerid, freeslot ); //same veh sqlid
  202. oldveh(pID) = -1;
  203. oldveh(model) = 0;
  204. oldveh(gps) = 0;
  205. oldveh(insurance) = 0;
  206. oldveh(alarm) = 0;
  207. oldveh(sparekey) = 0;
  208. #undef oldveh
  209. format( carstr, sizeof( carstr ), "You have bought the %s from %s for $%d.", GetVehicleFriendlyNameFromModel( veh(model) ), PlayerICName( player ), price )
  210. SendClientMessage( playerid, COLOR_LIGHTBLUE, carstr )
  211. format( carstr, sizeof( carstr ), "%s has bought the %s from you for $%d.", PlayerICName( playerid ), GetVehicleFriendlyNameFromModel( veh(model) ), price )
  212. SendClientMessage( player, COLOR_LIGHTBLUE, carstr )
  213. #undef veh
  214. }
  215. return 1
  216. }
  217. cmdveh_upgrade( playerid, slot, model[] ) {
  218. if( IsPlayerInRangeOfPoint( playerid, 5.0, 2324.2505,-2012.4784,13.6222 ) ) { //The new garage map
  219. new menuitems[150]
  220. #define veh(%1) PlayerVehicles[playerid][slot][pv%1]
  221. format( menuitems, 150, "GPS\t$350,000\nAlarm\t$200,000\nInsurance\t$250,000\nSpare keys\t$250000\nCustom license plate\t$100000\nAdd another vehicle slot\t$15,000,000" )
  222. vupgrading[playerid] = slot
  223. new titlestr[100]
  224. format( titlestr, 100, "{FFB76F}Vehicle Upgrades for %s{FFFFFF}", model )
  225. ShowPlayerDialog( playerid, DIALOG_VEHICLES_UP2, DIALOG_STYLE_TABLIST, titlestr, menuitems, "Purchase", "Cancel" )
  226. #undef veh
  227. return 1
  228. }
  229. SendClientMessage( playerid, COLOR_GREY, "You are not inside the Garage in Willowfield, a marker leading to it will be set for you." )
  230. if(CP[playerid] != 0) return SendClientMessage(playerid, COLOR_GREY, "You already have an active checkpoint, /killcp.");
  231. DisablePlayerCheckpointEx(playerid);
  232. SetPlayerCheckpointEx(playerid, 2324.2505, -2012.4784, 13.6222, 3.0);
  233. CP[playerid] = 1;
  234. return 1;
  235. }
  236. cmdveh_spawn( playerid, params[] ) {
  237. new cartext[128];
  238. if( playerSpawnedVehicle[playerid] > -1 ) {
  239. format( cartext, sizeof( cartext ), "You can only have one car spawned at a time, /v park your %s first.", GetVehicleFriendlyNameFromModel( PlayerVehicles[playerid][playerSpawnedVehicle[playerid]][pvmodel] ) );
  240. return SendClientMessage( playerid, COLOR_GREY, cartext );
  241. }
  242. new model[128], carslot;
  243. if( sscanf( params, "d", carslot ) ) {
  244. if( !sscanf( params, "s[128]", model ) ) {
  245. //incase they enter the model name instead
  246. for( new s; s < PlayerInfo[playerid][pMaxCarSlots]; s++ ) {
  247. if( strcmp( model, GetVehicleFriendlyNameFromModel( PlayerVehicles[playerid][s][pvmodel] ), true ) == 0) {
  248. spawnPlayerVehicle( playerid, s );
  249. format( cartext, sizeof( cartext ), "You have spawned your %s in its last parked position.", GetVehicleFriendlyNameFromModel( PlayerVehicles[playerid][s][pvmodel] ) );
  250. SendClientMessage( playerid, COLOR_GREY, cartext );
  251. return 1;
  252. }
  253. }
  254. }
  255. return SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /v spawn [car slot/car name]" );
  256. }
  257. if( carslot > PlayerInfo[playerid][pMaxCarSlots] || carslot < 1 ) {
  258. return SendClientMessage( playerid, COLOR_GREY, "You didn't enter a correct car slot, check /v cars for a correct slot." );
  259. }
  260. if( PlayerInfo[playerid][pID] == PlayerVehicles[playerid][carslot][pvpID] ) {
  261. carslot--;
  262. spawnPlayerVehicle( playerid, carslot );
  263. format( cartext, sizeof( cartext ), "You have spawned your %s in its last parked position.", GetVehicleFriendlyNameFromModel( PlayerVehicles[playerid][carslot][pvmodel] ) );
  264. SendClientMessage( playerid, COLOR_GREY, cartext );
  265. return 1;
  266. }
  267. format( cartext, sizeof( cartext ), "You do not own this vehicle, consider looking at /v cars." );
  268. SendClientMessage( playerid, COLOR_GREY, cartext );
  269. return 1;
  270. }
  271. cmdveh_park( playerid, slot, model[] ) {
  272. #define veh(%0) PlayerVehicles[playerid][slot][pv%0]
  273. new cartext[128];
  274. if( GetPlayerVehicleID( playerid ) != veh(ID) ) {
  275. format( cartext, sizeof( cartext ), "You must be in your %s in order to park it.", model );
  276. SendClientMessage( playerid, COLOR_GREY, cartext );
  277. return 1;
  278. }
  279. GetVehiclePos( veh(ID), veh(parkx), veh(parky), veh(parkz) );
  280. GetVehicleZAngle( veh(ID), veh(parkrz) );
  281. destroyPlayerVehicle( playerid, slot );
  282. format( cartext, sizeof( cartext ), "You have parked your %s. It will spawn here next time you use /v spawn.", model );
  283. SendClientMessage( playerid, COLOR_LIGHTBLUE, cartext );
  284. #undef veh
  285. return 1;
  286. }
  287. cmdveh_givekeys( playerid, params[], slot, model[] ) {
  288. new player, cartext[128];
  289. if( sscanf( params, "u", player ) ) {
  290. return SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /givekeys [playerid/playerName]" )
  291. }
  292. #define veh(%0) PlayerVehicles[playerid][slot][pv%0]
  293. if( !PlayerVehicles[playerid][slot][pvsparekey] ) {
  294. format( cartext, sizeof( cartext ), "You do not have any spare keys for your %s.", model );
  295. return SendClientMessage( playerid, COLOR_GREY, cartext );
  296. }
  297. if( !IsPlayerConnected( playerid ) ) {
  298. return SendClientMessage( playerid, COLOR_GREY, "ERROR: The player you provided is not connected." )
  299. }
  300. new Float:ppos[3]
  301. GetPlayerPos( player, ppos[0], ppos[1], ppos[2] )
  302. if( !IsPlayerInRangeOfPoint( playerid, 3.0, ppos[0], ppos[1], ppos[2] ) ) {
  303. return SendClientMessage( playerid, COLOR_GREY, "ERROR: You are not near the player." );
  304. }
  305. if( spareKeys[player] == playerid && spareKeysSlot[player] == slot ) {
  306. format( cartext, sizeof( cartext ), "You have already given this player your spare key to your %s.", model );
  307. return SendClientMessage( playerid, COLOR_GREY, cartext )
  308. }
  309. spareKeys[player] = playerid;
  310. spareKeysSlot[player] = slot;
  311. hasgivenKey[playerid] = 1;
  312. format( carstr, sizeof( carstr ), "%s has given you their spare key to their %s.", PlayerICName( playerid ), model )
  313. SendClientMessage( player, COLOR_LIGHTBLUE, carstr )
  314. format( carstr, sizeof( carstr ), "You have given %s your spare key to your %s.", PlayerICName( player ), model )
  315. SendClientMessage( playerid, COLOR_LIGHTBLUE, carstr )
  316. #undef veh
  317. return 1;
  318. }
  319. cmdveh_track( playerid, slot, model[] ) {
  320. new cartext[128];
  321. #define veh(%1) PlayerVehicles[playerid][slot][pv%1]
  322. if( veh(gps) ) {
  323. GetVehiclePos( veh(ID), veh(x), veh(y), veh(z) )
  324. SetPlayerCheckpointEx( playerid, veh(x), veh(y), veh(z), 5.0 )
  325. CP[playerid] = CHECKPOINT_CAR_TRACK
  326. format( cartext, sizeof( cartext ), "A marker leading to your %s has been placed on the minimap.", model );
  327. SendClientMessage( playerid, COLOR_LIGHTBLUE, cartext );
  328. }
  329. else {
  330. format( cartext, sizeof( cartext ), "Your %s does not have a GPS, consider buying one at the Garage in Willowfield.", model );
  331. SendClientMessage( playerid, COLOR_GREY, cartext )
  332. }
  333. #undef veh
  334. return 1;
  335. }
  336. cmdveh_cars( playerid ) {
  337. SendClientMessage( playerid, COLOR_LIGHTBLUE, "______________[ Your vehicles ]______________")
  338. new count;
  339. for( new i; i < PlayerInfo[playerid][pMaxCarSlots]; i++ ) {
  340. #define veh(%1) PlayerVehicles[playerid][i][pv%1]
  341. if( PlayerInfo[playerid][pCarID][i] < 1 ) continue;
  342. count++;
  343. new outputcars[128], outputupgrades[128];
  344. format( outputcars, sizeof( outputcars ), "Slot %d: %s", i+1, GetVehicleFriendlyNameFromModel( veh(model) ) );
  345. if( veh(alarm) || veh(insurance) || veh(gps) || veh(sparekey) ) {
  346. format( outputupgrades, sizeof( outputupgrades ), "( %s%s%s%s)",
  347. ( veh(gps) == 1 ) ? ( ( "GPS " ) ) : ( "" ), ( veh(alarm) == 1 ) ? ( ( "Alarm " ) ) : ( "" ), ( veh(insurance) == 1 ) ? ( ( "Insurance " ) ) : ( "" ),
  348. ( veh(sparekey) == 1 ) ? ( ( "Spare key " ) ) : ( "" ) );
  349. format( outputcars, sizeof( outputcars ), "%s %s", outputcars, outputupgrades );
  350. SendClientMessage( playerid, COLOR_GREY, outputcars );
  351. continue;
  352. }
  353. else {
  354. format( outputcars, sizeof( outputcars ), "%s (No upgrades)", outputcars );
  355. SendClientMessage( playerid, COLOR_GREY, outputcars );
  356. continue;
  357. }
  358. #undef veh
  359. }
  360. if( count == 0 ) {
  361. SendClientMessage( playerid, COLOR_GREY, "You do not have any owned vehicles." );
  362. }
  363. return 1;
  364. }
  365. CMD:lock( playerid, params[] ) {
  366. if( playerSpawnedVehicle[playerid] > -1 ) {
  367. new slot = playerSpawnedVehicle[playerid]
  368. #define veh(%1) PlayerVehicles[playerid][slot][pv%1] //This is just a marco to reduce repetition!
  369. GetVehiclePos( veh(ID), veh(x), veh(y), veh(z) ) //update vehicle coords
  370. if( !IsPlayerInRangeOfPoint( playerid, 5.0, veh(x), veh(y), veh(z) ) ) {
  371. SendClientMessage( playerid, COLOR_GREY, "You are not by any vehicles that you have the keys for." )
  372. return 1
  373. }
  374. if( veh(locked) ) {
  375. format( carstr, sizeof( carstr ), "* %s has unlocked their vehicle.", PlayerICName( playerid ) )
  376. }
  377. else {
  378. format( carstr, sizeof( carstr ), "* %s has locked their vehicle.", PlayerICName( playerid ) )
  379. }
  380. ProxDetector( 30.0, playerid, carstr, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE )
  381. veh(locked) = !veh(locked)
  382. SetVehicleLockState( veh(ID), veh(locked) )
  383. SetVehicleAlarmState( veh(ID), 0 )
  384. #undef veh
  385. return 1
  386. }
  387. if( spareKeys[playerid] > -1 && spareKeysSlot[playerid] > -1 ) {
  388. new Float: vpos[3];
  389. #define veh(%0) PlayerVehicles[spareKeys[playerid]][spareKeysSlot[playerid]][pv%0]
  390. if( veh(spawned) && veh(ID) != INVALID_VEHICLE_ID ) {
  391. GetVehiclePos( veh(ID), vpos[0], vpos[1], vpos[2] )
  392. if( IsPlayerInRangeOfPoint( playerid, 5.0, vpos[0], vpos[1], vpos[2] ) ) {
  393. if( veh(locked) ) {
  394. format( carstr, sizeof( carstr ), "* %s has unlocked their vehicle.", PlayerICName( playerid ) )
  395. }
  396. else {
  397. format( carstr, sizeof( carstr ), "* %s has locked their vehicle.", PlayerICName( playerid ) )
  398. }
  399. ProxDetector( 30.0, playerid, carstr, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE )
  400. veh(locked) = !veh(locked)
  401. SetVehicleLockState( veh(ID), veh(locked) )
  402. SetVehicleAlarmState( veh(ID), 0 )
  403. return 1
  404. }
  405. }
  406. #undef veh
  407. }
  408. SendClientMessage( playerid, COLOR_GREY, "You do not have any vehicle spawned that you have keys for." )
  409. return 1
  410. }
  411. //===================[ Player unowned vehicle commands ]=====================
  412. CMD:paintcar( playerid, params[] ) {
  413. SendClientMessage( playerid, COLOR_GREY, "Visit a vehicle modification shop to style the paintjob of a vehicle." )
  414. return 1
  415. }
  416. //This was just copied and pasted from GM.
  417. CMD:spraycar(playerid, params[])
  418. {
  419. if(PlayerInfo[playerid][pSpraycan] == 0) return SendClientMessage(playerid, COLOR_GREY, "Your spraycan is empty.");
  420. if(IsPlayerInAnyVehicle(playerid))
  421. {
  422. new c1, c2;
  423. if(sscanf(params, "iI(-1)", c1, c2)) return SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /colorcar [0-255] [0-255(optional)]");
  424. {
  425. new veh = GetPlayerVehicleID(playerid);
  426. if(c2 == -1) c2 = c1;
  427. if(c1 < 0 || c1 > 255 || c2 < 0 || c2 > 255) return SendClientMessage(playerid, COLOR_GREY, "The colors are between 0 and 255.");
  428. ChangeVehiclePaintjob(veh, 3);
  429. ChangeVehicleColor(veh, c1, c2);
  430. if(c2 == c1) format(str, sizeof(str), "You have sprayed your vehicle to be %s (%d).", GetVehicleColorName(c1), c1);
  431. else format(str, sizeof(str), "You have sprayed the vehicle to be %s (%d) and %s (%d).", GetVehicleColorName(c1), c1, GetVehicleColorName(c2), c2);
  432. SendClientMessage(playerid, COLOR_GREY, str);
  433. if(c2 == c1)format(str, sizeof(str), "* %s uses a spraycan to spray the %s to be %s. *", PlayerICName(playerid), GetVehicleFriendlyName(veh), GetVehicleColorName(c1));
  434. else format(str, sizeof(str), "* %s uses a spraycan to spray the %s to be %s and %s. *", PlayerICName(playerid), GetVehicleFriendlyName(veh), GetVehicleColorName(c1), GetVehicleColorName(c2));
  435. ProxDetector(30.0, playerid, str, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE);
  436. PlayerInfo[playerid][pSpraycan]--;
  437. PlayerPlaySound(playerid, 1134, 0.0, 0.0, 0.0);
  438. for( new i; i <= GetPlayerPoolSize(); i++ ) {
  439. for( new slot; slot < MAX_VEHICLE_SLOTS; slot++ ) {
  440. if( PlayerVehicles[i][slot][pvID] == veh ) {
  441. PlayerVehicles[i][slot][pvcolor1] = c1
  442. PlayerVehicles[i][slot][pvcolor2] = c2
  443. PlayerVehicles[i][slot][pvpaintjob] = 3
  444. break
  445. }
  446. }
  447. }
  448. }
  449. } else return SendClientMessage(playerid, COLOR_GREY, "You must be in a vehicle.");
  450. return 1;
  451. }
  452. CMD:colorcar( playerid, params[] ) {
  453. return cmd_spraycar( playerid, params ); //make players happy...
  454. }
  455. //CMD:breakin
  456. new vehiclePickCount[MAX_PLAYERS]
  457. new lastbrokenin[MAX_PLAYERS]
  458. breakinPlayerVehicle( playerid ) {
  459. //restrict usage to 1/per30 seconds
  460. if( gettime() < lastbrokenin[playerid] + 30 ) {
  461. return SendClientMessage( playerid, COLOR_GREY, "You must wait 30 seconds before breaking into another vehicle." )
  462. }
  463. new Float:vpos[3]
  464. for( new i; i < GetPlayerPoolSize()+1; i++ ) {
  465. new slot = playerSpawnedVehicle[i]
  466. if( slot < 0 ) continue
  467. #define veh(%1) PlayerVehicles[i][slot][pv%1]
  468. GetVehiclePos( veh(ID), vpos[0], vpos[1], vpos[2] )
  469. if( IsPlayerFacingPoint( playerid, 5.0, vpos[0], vpos[1], vpos[2], 50.0 ) ) {
  470. if( !veh(locked) ) {
  471. return SendClientMessage( playerid, COLOR_GREY, "This vehicle is already unlocked." )
  472. }
  473. //If vehicle has alarm notify owner, set the alarm to go off
  474. if( veh(alarm) ) {
  475. if( playerSpawnedVehicle[i] > -1 ) {
  476. format( carstr, sizeof( carstr ), "SMS: This is an automated message informing you that your %s alarm has been activated.", GetVehicleFriendlyName( veh(ID) ) )
  477. SendClientMessage( i, COLOR_YELLOW, carstr )
  478. SetVehicleAlarmState( veh(ID) ) //sound the alarm for 35secs
  479. }
  480. }
  481. LockPickingCar[playerid] = i
  482. vehiclePickCount[playerid] = 0
  483. //command usage restriction
  484. lastbrokenin[playerid] = gettime()
  485. SetTimerEx( "OnBreakinExpire", 18*1000, false, "ii", playerid, veh(ID) )
  486. SetPlayerProgressBarValue( playerid, workingProgress[playerid], 1.0 )
  487. ShowPlayerProgressBar( playerid, workingProgress[playerid] )
  488. format( carstr, sizeof( carstr ), "* %s fiddles with the vehicle's lock using their screwdriver. *", PlayerICName( playerid ) )
  489. ProxDetector( 30.0, playerid, carstr, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE, COLOR_PURPLE )
  490. //LoopingAnim( playerid, "POOL", "POOL_ChalkCue", 4.1, 0, 1, 1, 1, 1 )
  491. ApplyAnimation( playerid, "POOL", "POOL_ChalkCue", 4.1, 0, 1, 1, 1, 1, 1 )
  492. displayCenterHUDInfo( playerid, "TIP: Rapidly tap ~r~Y~w~ to break in", 4);
  493. //SendClientMessage( playerid, COLOR_GREY, "TIP: tap Y rapidly to unlock the vehicle." )
  494. return 1
  495. }
  496. #undef veh
  497. }
  498. SendClientMessage( playerid, COLOR_GREY, "You are not by any vehicle." )
  499. return 1
  500. }
  501. //player taking too long to breakin
  502. forward OnBreakinExpire( playerid, vehid );
  503. public OnBreakinExpire( playerid, vehid ) {
  504. if( LockPickingCar[playerid] == -1 ) {
  505. return 1
  506. }
  507. vehiclePickCount[playerid] = 0
  508. LockPickingCar[playerid] = -1
  509. HidePlayerProgressBar( playerid, workingProgress[playerid] )
  510. SendClientMessage( playerid, COLOR_GREY, "You have failed to break into the vehicle." )
  511. ClearAnimations( playerid )
  512. ApplyAnimationEx( playerid, "CARRY", "crry_prtial", 4.0, 0, 0, 0, 0, 0 )
  513. return 1
  514. }
  515. new lastcheckplate[MAX_PLAYERS]
  516. CMD:checkplate( playerid, params[] ) {
  517. if( gettime() < lastcheckplate[playerid] + 10 ) {
  518. return SendClientMessage( playerid, COLOR_GREY, "You must wait 10 seconds to allow the system to cool down." )
  519. }
  520. if( PlayerInfo[playerid][pMember] != 1 && PlayerInfo[playerid][pMember] != 2 && PlayerInfo[playerid][pMember] != 5 && PlayerInfo[playerid][pMember] != 11) {
  521. return SendClientMessage( playerid, COLOR_GREY, "You do not have access to the correct systems to use this command." )
  522. }
  523. if( IsPlayerInAnyVehicle( playerid ) ) {
  524. if( sVehicleInfo[GetDynamicVehicleID( GetPlayerVehicleID( playerid ) )][v_faction] > 0 ) {
  525. new model[128], plate[128]
  526. if( sscanf( params, "s[128]s[128]", model, plate ) ) {
  527. return SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /checkplates [vehicleName] [plate]" )
  528. }
  529. new modelid = ReturnVehicleModelID( model )
  530. lastcheckplate[playerid] = gettime()
  531. SendClientMessage( playerid, COLOR_LIGHTBLUE, "The following vehicles have matching vehicle plates,")
  532. new count
  533. for( new i; i <= GetPlayerPoolSize(); i++ ) {
  534. for( new slot; slot < PlayerInfo[i][pMaxCarSlots]; slot++ ) {
  535. if( PlayerVehicles[i][slot][pvmodel] == modelid ) {
  536. if( strcmp( PlayerVehicles[i][slot][pvplate], plate, true ) == 0 ) {
  537. if( strlen( PlayerVehicles[i][slot][pvplate] ) > 1 ) {
  538. format( carstr, sizeof( carstr ), "Owner: %s | Vehicle model: %s | Plate: %s", PlayerICName( PlayerVehicles[i][slot][pvplayerID] ), GetVehicleFriendlyNameFromModel( modelid ), PlayerVehicles[i][slot][pvplate] )
  539. SendClientMessage( playerid, COLOR_GREY, carstr )
  540. count++
  541. }
  542. }
  543. }
  544. }
  545. }
  546. if( count == 0 ) {
  547. SendClientMessage( playerid, COLOR_GREY, "There were no results." )
  548. }
  549. return 1
  550. }
  551. }
  552. SendClientMessage( playerid, COLOR_GREY, "You are not in a faction vehicle." )
  553. return 1
  554. }
  555. /*
  556. ****** Administrator Vehicle Commands *******
  557. ===================================================
  558. */
  559. CMD:checkcars( playerid, params[] ) {
  560. if( PlayerInfo[playerid][pAdmin] < 1 ) {
  561. return SendClientMessage( playerid, COLOR_GREY, "You are not authorized to use this command." )
  562. }
  563. new player
  564. if( sscanf( params, "u", player ) ) {
  565. return SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /checkvehicles [playerid/playerName]" )
  566. }
  567. if( !IsPlayerConnected(player) ) {
  568. return SendClientMessage( playerid, COLOR_GREY, "That player isn't connected." )
  569. }
  570. format( carstr, sizeof( carstr ), "_______[ %s's vehicles ]_______", PlayerICName( player ) )
  571. SendClientMessage( playerid, COLOR_LIGHTBLUE, carstr )
  572. new count
  573. for( new i; i < PlayerInfo[player][pMaxCarSlots]; i++ ) {
  574. if( PlayerInfo[player][pCarID][i] < 1 ) continue
  575. #define veh(%1) PlayerVehicles[player][i][pv%1]
  576. //veh name
  577. format( carstr, sizeof( carstr ), "Car slot %d: %s (%s) [vehicleid: %d] %s", i+1, GetVehicleFriendlyNameFromModel( veh(model) ), veh(plate), veh(ID), ( veh(impounded) == 1 ) ? ( ( "- IMPOUNDED" ) ) : ( "" ) )
  578. SendClientMessage( playerid, COLOR_WHITE, carstr )
  579. //veh info
  580. format( carstr, sizeof( carstr ), " Upgrades: %s %s %s %s",
  581. ( veh(gps) == 1 ) ? ( ( "GPS" ) ) : ( "" ), ( veh(alarm) == 1 ) ? ( ( "Alarm" ) ) : ( "" ), ( veh(insurance) == 1 ) ? ( ( "Insurance" ) ) : ( "" ),
  582. ( veh(sparekey) == 1 ) ? ( ( "Spare key" ) ) : ( "" ) )
  583. SendClientMessage( playerid, COLOR_GREY, carstr )
  584. count++
  585. #undef veh
  586. }
  587. if( count < 1 ) {
  588. SendClientMessage( playerid, COLOR_GREY, "This player doesn't own any vehicles." )
  589. }
  590. SendClientMessage( playerid, COLOR_GREY, "________________________________" )
  591. return 1
  592. }
  593. CMD:givecar( playerid, params[] ) {
  594. if( PlayerInfo[playerid][pAdmin] < 4 ) {
  595. return SendClientMessage( playerid, COLOR_GREY, "You are not authorized to use this." )
  596. }
  597. if( pVehiclePool == MAX_OWNED_VEHICLES-1 ) {
  598. return SendClientMessage( playerid, COLOR_GREY, "Maximum vehicle treshold has been reached. Contact a developer." )
  599. }
  600. if( pVehiclePool + 199 > MAX_OWNED_VEHICLES ) {
  601. SendClientMessage( playerid, COLOR_GREY, "Maximum vehicle treshold has less than 200 slots free. Contact a developer immediately." )
  602. }
  603. new player, model[128]
  604. if( sscanf( params, "us[128]", player, model ) ) {
  605. return SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /givecar [playerid/name] [vehicleName/ID]" )
  606. }
  607. if( !IsPlayerConnected( player ) ) {
  608. return SendClientMessage( playerid, COLOR_GREY, "That player isn't connected." );
  609. }
  610. new modelid = ReturnVehicleModelID( model );
  611. if(IsFactionVehicle(modelid)) return SendClientMessage(playerid, COLOR_GREY, "Players cannot own faction vehicles.");
  612. new slot = GetPlayerFreeCarslot( player )
  613. if( slot == -1 ) {
  614. return SendClientMessage( playerid, COLOR_GREY, "That player has no more room for more cars." )
  615. }
  616. new Float:pos[4]
  617. GetPlayerPos( playerid, pos[0], pos[1], pos[2] )
  618. GetPlayerFacingAngle( playerid, pos[3] )
  619. createPlayerVehicle( player, slot, modelid, pos[0] + 5, pos[1], pos[2], pos[3] )
  620. new vehstr[128]
  621. format( vehstr, sizeof( vehstr ), "You have given %s a %s.", PlayerICName( player ), GetVehicleFriendlyNameFromModel( modelid ) )
  622. SendClientMessage( playerid, COLOR_GREY, vehstr )
  623. SendClientMessage( playerid, COLOR_GREY, "Notify the player of the location of their parked car (here). It will spawn when they tow it." )
  624. format( vehstr, sizeof( vehstr ), "%s has given you a %s. It's now accessable in /v, it will spawn at the admin's position." , PlayerICName( playerid ), GetVehicleFriendlyNameFromModel( modelid ) )
  625. SendClientMessage( player, COLOR_LIGHTBLUE, vehstr )
  626. return 1
  627. }
  628. CMD:removecar( playerid, params[] ) {
  629. if( PlayerInfo[playerid][pAdmin] < 4 ) {
  630. return 1
  631. }
  632. new player, slot
  633. if( sscanf( params, "ui", player, slot ) ) {
  634. return SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /removecar [playerID/playerName] [slot]" )
  635. }
  636. if( slot > PlayerInfo[player][pMaxCarSlots] || slot < 1 ) {
  637. return SendClientMessage( playerid, COLOR_GREY, "You must enter a valid car slot (between 1 and 3-4). HINT: see /checkcars." )
  638. }
  639. if( !IsPlayerConnected( player ) ) {
  640. return SendClientMessage( playerid, COLOR_GREY, "That player is not connected." )
  641. }
  642. new car_str[128]
  643. slot--
  644. #define veh(%0) PlayerVehicles[player][slot][pv%0]
  645. if( PlayerInfo[player][pCarID][slot] < 1 ) {
  646. return SendClientMessage( playerid, COLOR_GREY, "This player doesn't have a vehicle in this slot." )
  647. }
  648. format( car_str, 128, "You have destroyed %s's %s.", PlayerICName( player ), GetVehicleFriendlyNameFromModel( veh(model) ) )
  649. SendClientMessage( playerid, COLOR_GREY, car_str )
  650. if( veh(pID) != PlayerInfo[player][pID] ) {
  651. PlayerInfo[player][pCarID][slot] = 0
  652. return 1;
  653. }
  654. PlayerInfo[player][pCarID][slot] = 0
  655. destroyPlayerVehicle( player, slot )
  656. veh(pID) = -1
  657. veh(model) = 0
  658. veh(impounded) = 0
  659. veh(gps) = 0
  660. veh(insurance) = 0
  661. veh(sparekey) = 0
  662. veh(alarm) = 0
  663. veh(Gun1) = 0
  664. veh(Gun2) = 0
  665. veh(Pot) = 0
  666. veh(Crack) = 0
  667. veh(Armor) = 0
  668. veh(damage) = 1000.00
  669. veh(playerID) = INVALID_PLAYER_ID
  670. mysql_format( sqlGameConnection, car_str, 128, "DELETE FROM playervehicles WHERE ID = %d;", veh(SQLID) )
  671. mysql_pquery( sqlGameConnection, car_str )
  672. SQLSave( playerid )
  673. #undef veh
  674. return 1
  675. }
  676. CMD:oldvehicle( playerid, params[] ) {
  677. if( PlayerInfo[playerid][pAdmin] < 1 && PlayerInfo[playerid][pDev] < 1 ) {
  678. return 1;
  679. }
  680. new id;
  681. if( sscanf( params, "i", id ) ) {
  682. return SendClientMessage( playerid, COLOR_GREY, "USAGE:/oldvehicle [car key(ID)]" );
  683. }
  684. if( !IsPlayerConnected( id ) ) {
  685. return SendClientMessage( playerid, COLOR_GREY, "Invalid player ID." );
  686. }
  687. new query[300];
  688. mysql_format( sqlGameConnection, query, sizeof( query ), "SELECT CKey1, CKey2 FROM players2 WHERE ID = %d", PlayerInfo[id][pID] );
  689. mysql_pquery( sqlGameConnection, query, "VehicleRefund", "ii", playerid, id );
  690. return 1;
  691. }
  692. forward VehicleRefund( playerid, id );
  693. public VehicleRefund( playerid, id ) {
  694. new rows, fields, CKey[2];
  695. cache_get_data( rows, fields );
  696. if( !rows ) {
  697. return SendClientMessage( playerid, COLOR_GREY, "Provided playerid not found." );
  698. }
  699. CKey[0] = cache_get_field_content_int( 0, "CKey1" );
  700. CKey[1] = cache_get_field_content_int( 0, "CKey2" );
  701. printf("oldvehicles: Ckey1: %d, CKey2: %d", CKey[0], CKey[1] );
  702. for( new i; i < sizeof( CKey ); i++ ) {
  703. new strFile[48];
  704. format(strFile, sizeof(strFile), "cars/%d.ini", CKey[i] );
  705. if(!fexist(strFile)) {
  706. return SendClientMessage( playerid, COLOR_GREY, "The old vehicle does not exist." );
  707. }
  708. new model;
  709. new File:fCar = fopen(strFile, io_read);
  710. new strData[128], strKey[128];
  711. while(fread(fCar, strData, sizeof(strData)))
  712. {
  713. strKey = ini_GetKey(strData);
  714. if(strcmp(strKey, "Model") == 0) model = strvalEx(ini_GetValue(strData));
  715. }
  716. fclose(fCar);
  717. new output[128];
  718. format( output, 128, "The old vehicle model of slot %d was: %d", i, model );
  719. SendClientMessage( playerid, COLOR_GREY, output );
  720. }
  721. return 1;
  722. }