playervehs.pwn 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. // g_mysql_SaveVehicle(int playerid, int slotid)
  2. // Description: Saves a account's specified vehicle slot.
  3. stock g_mysql_SaveVehicle(playerid, slotid)
  4. {
  5. szMiscArray[0] = 0;
  6. printf("%s (%i) saving their %s (slot %i) (Model %i)...", GetPlayerNameEx(playerid), playerid, VehicleName[PlayerVehicleInfo[playerid][slotid][pvModelId] - 400], slotid, PlayerVehicleInfo[playerid][slotid][pvModelId]);
  7. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "UPDATE `vehicles` SET");
  8. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvPosX` = %0.5f,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvPosX]);
  9. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvPosY` = %0.5f,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvPosY]);
  10. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvPosZ` = %0.5f,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvPosZ]);
  11. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvPosAngle` = %0.5f,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvPosAngle]);
  12. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvLock` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvLock]);
  13. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvLocked` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvLocked]);
  14. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvPaintJob` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvPaintJob]);
  15. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvColor1` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvColor1]);
  16. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvColor2` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvColor2]);
  17. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvPrice` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvPrice]);
  18. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvWeapon0` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvWeapons][0]);
  19. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvWeapon1` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvWeapons][1]);
  20. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvWeapon2` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvWeapons][2]);
  21. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvLock` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvLock]);
  22. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvWepUpgrade` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvWepUpgrade]);
  23. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvFuel` = %0.5f,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvFuel]);
  24. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvImpound` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvImpounded]);
  25. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvDisabled` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvDisabled]);
  26. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvPlate` = '%e',", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvPlate]);
  27. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvTicket` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvTicket]);
  28. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvRestricted` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvRestricted]);
  29. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvVW` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvVW]);
  30. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvInt` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvInt]);
  31. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvCrashFlag` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvCrashFlag]);
  32. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvCrashVW` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvCrashVW]);
  33. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvCrashX` = %0.5f,", szMiscArray, FormatFloat(PlayerVehicleInfo[playerid][slotid][pvCrashX]));
  34. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvCrashY` = %0.5f,", szMiscArray, FormatFloat(PlayerVehicleInfo[playerid][slotid][pvCrashY]));
  35. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvCrashZ` = %0.5f,", szMiscArray, FormatFloat(PlayerVehicleInfo[playerid][slotid][pvCrashZ]));
  36. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvCrashAngle` = %0.5f,", szMiscArray, FormatFloat(PlayerVehicleInfo[playerid][slotid][pvCrashAngle]));
  37. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvAlarm` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvAlarm]);
  38. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvLastLockPickedBy` = '%e',", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvLastLockPickedBy]);
  39. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvLocksLeft` = %d,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvLocksLeft]);
  40. new zyear, zmonth, zday;
  41. getdate(zyear, zmonth, zday);
  42. if(zombieevent || (zmonth == 10 && zday == 31) || (zmonth == 11 && zday == 1)) format(szMiscArray, sizeof(szMiscArray), "%s `pvHealth` = %0.5f,", szMiscArray, PlayerVehicleInfo[playerid][slotid][pvHealth]);
  43. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s\
  44. `Pot` = %d,\
  45. `Crack` = %d,\
  46. `Meth` = %d,\
  47. `Ecstasy` = %d,\
  48. `Heroin` = %d,",
  49. szMiscArray,
  50. PlayerVehicleInfo[playerid][slotid][pvDrugs][0],
  51. PlayerVehicleInfo[playerid][slotid][pvDrugs][1],
  52. PlayerVehicleInfo[playerid][slotid][pvDrugs][2],
  53. PlayerVehicleInfo[playerid][slotid][pvDrugs][3],
  54. PlayerVehicleInfo[playerid][slotid][pvDrugs][4]);
  55. for(new m = 0; m < MAX_MODS; m++)
  56. {
  57. if(m == MAX_MODS-1)
  58. {
  59. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvMod%d` = %d WHERE `id` = '%d'", szMiscArray, m, PlayerVehicleInfo[playerid][slotid][pvMods][m], PlayerVehicleInfo[playerid][slotid][pvSlotId]);
  60. }
  61. else
  62. {
  63. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "%s `pvMod%d` = %d,", szMiscArray, m, PlayerVehicleInfo[playerid][slotid][pvMods][m]);
  64. }
  65. }
  66. //print(szMiscArray);
  67. new szLog[128];
  68. format(szLog, sizeof(szLog), "[VEHICLESAVE] [User: %s(%i)] [Model: %d] [Vehicle ID: %d]", GetPlayerNameEx(playerid), PlayerInfo[playerid][pId], PlayerVehicleInfo[playerid][slotid][pvModelId], PlayerVehicleInfo[playerid][slotid][pvSlotId]);
  69. Log("logs/vehicledebug.log", szLog);
  70. mysql_tquery(MainPipeline, szMiscArray, "OnQueryFinish", "ii", SENDDATA_THREAD, playerid);
  71. }
  72. stock CreatePlayerVehicle(playerid, playervehicleid, modelid, Float: x, Float: y, Float: z, Float: angle, color1, color2, price, VW, Int)
  73. {
  74. szMiscArray[0] = 0;
  75. if(PlayerVehicleInfo[playerid][playervehicleid][pvId] == INVALID_PLAYER_VEHICLE_ID)
  76. {
  77. VehicleSpawned[playerid]++;
  78. PlayerCars++;
  79. PlayerVehicleInfo[playerid][playervehicleid][pvModelId] = modelid;
  80. PlayerVehicleInfo[playerid][playervehicleid][pvPosX] = x;
  81. PlayerVehicleInfo[playerid][playervehicleid][pvPosY] = y;
  82. PlayerVehicleInfo[playerid][playervehicleid][pvPosZ] = z;
  83. PlayerVehicleInfo[playerid][playervehicleid][pvPosAngle] = angle;
  84. PlayerVehicleInfo[playerid][playervehicleid][pvColor1] = color1;
  85. PlayerVehicleInfo[playerid][playervehicleid][pvColor2] = color2;
  86. PlayerVehicleInfo[playerid][playervehicleid][pvPark] = 1;
  87. PlayerVehicleInfo[playerid][playervehicleid][pvPrice] = price;
  88. for(new w = 0; w < 3; w++)
  89. {
  90. PlayerVehicleInfo[playerid][playervehicleid][pvWeapons][w] = 0;
  91. }
  92. PlayerVehicleInfo[playerid][playervehicleid][pvWepUpgrade] = 0;
  93. PlayerVehicleInfo[playerid][playervehicleid][pvImpounded] = 0;
  94. PlayerVehicleInfo[playerid][playervehicleid][pvVW] = VW;
  95. PlayerVehicleInfo[playerid][playervehicleid][pvInt] = Int;
  96. PlayerVehicleInfo[playerid][playervehicleid][pvTicket] = 0;
  97. PlayerVehicleInfo[playerid][playervehicleid][pvPlate] = 0;
  98. PlayerVehicleInfo[playerid][playervehicleid][pvLock] = 0;
  99. PlayerVehicleInfo[playerid][playervehicleid][pvLocksLeft] = 5;
  100. PlayerVehicleInfo[playerid][playervehicleid][pvLocked] = 0;
  101. PlayerVehicleInfo[playerid][playervehicleid][pvAlarm] = 0;
  102. PlayerVehicleInfo[playerid][playervehicleid][pvAlarmTriggered] = 0;
  103. PlayerVehicleInfo[playerid][playervehicleid][pvBeingPickLocked] = 0;
  104. for(new m; m < sizeof(Drugs); ++m) PlayerVehicleInfo[playerid][playervehicleid][pvDrugs][m] = 0;
  105. for(new m = 0; m < MAX_MODS; m++)
  106. {
  107. PlayerVehicleInfo[playerid][playervehicleid][pvMods][m] = 0;
  108. }
  109. new carcreated = CreateVehicle(modelid,x,y,z,angle,color1,color2,-1);
  110. SetVehicleVirtualWorld(carcreated, PlayerVehicleInfo[playerid][playervehicleid][pvVW]);
  111. LinkVehicleToInterior(carcreated, PlayerVehicleInfo[playerid][playervehicleid][pvInt]);
  112. Vehicle_ResetData(carcreated);
  113. PlayerVehicleInfo[playerid][playervehicleid][pvId] = carcreated;
  114. PlayerVehicleInfo[playerid][playervehicleid][pvSpawned] = 1;
  115. PlayerVehicleInfo[playerid][playervehicleid][pvFuel] = 100.0;
  116. //SetVehicleNumberPlate(carcreated, PlayerVehicleInfo[playerid][playervehicleid][pvNumberPlate]);
  117. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "INSERT INTO `vehicles` (`sqlID`) VALUES ('%d')", GetPlayerSQLId(playerid));
  118. mysql_tquery(MainPipeline, szMiscArray, "OnQueryCreateVehicle", "ii", playerid, playervehicleid);
  119. return carcreated;
  120. }
  121. return INVALID_PLAYER_VEHICLE_ID;
  122. }
  123. stock DestroyPlayerVehicle(playerid, playervehicleid)
  124. {
  125. if(PlayerVehicleInfo[playerid][playervehicleid][pvModelId])
  126. {
  127. VehicleSpawned[playerid]--;
  128. PlayerCars--;
  129. switch(PlayerVehicleInfo[playerid][playervehicleid][pvModelId]) {
  130. case 519, 553, 508: {
  131. if(IsValidDynamicArea(iVehEnterAreaID[PlayerVehicleInfo[playerid][playervehicleid][pvId]])) DestroyDynamicArea(iVehEnterAreaID[PlayerVehicleInfo[playerid][playervehicleid][pvId]]);
  132. }
  133. }
  134. DestroyVehicle(PlayerVehicleInfo[playerid][playervehicleid][pvId]);
  135. PlayerVehicleInfo[playerid][playervehicleid][pvModelId] = 0;
  136. PlayerVehicleInfo[playerid][playervehicleid][pvPosX] = 0.0;
  137. PlayerVehicleInfo[playerid][playervehicleid][pvPosY] = 0.0;
  138. PlayerVehicleInfo[playerid][playervehicleid][pvPosZ] = 0.0;
  139. PlayerVehicleInfo[playerid][playervehicleid][pvPosAngle] = 0.0;
  140. PlayerVehicleInfo[playerid][playervehicleid][pvPaintJob] = -1;
  141. PlayerVehicleInfo[playerid][playervehicleid][pvColor1] = 126;
  142. PlayerVehicleInfo[playerid][playervehicleid][pvColor2] = 126;
  143. PlayerVehicleInfo[playerid][playervehicleid][pvPrice] = 0;
  144. PlayerVehicleInfo[playerid][playervehicleid][pvFuel] = 0.0;
  145. PlayerVehicleInfo[playerid][playervehicleid][pvImpounded] = 0;
  146. PlayerVehicleInfo[playerid][playervehicleid][pvSpawned] = 0;
  147. PlayerVehicleInfo[playerid][playervehicleid][pvVW] = 0;
  148. PlayerVehicleInfo[playerid][playervehicleid][pvInt] = 0;
  149. PlayerVehicleInfo[playerid][playervehicleid][pvTicket] = 0;
  150. PlayerVehicleInfo[playerid][playervehicleid][pvWeapons][0] = 0;
  151. PlayerVehicleInfo[playerid][playervehicleid][pvWeapons][1] = 0;
  152. PlayerVehicleInfo[playerid][playervehicleid][pvWeapons][2] = 0;
  153. PlayerVehicleInfo[playerid][playervehicleid][pvPlate] = 0;
  154. PlayerVehicleInfo[playerid][playervehicleid][pvLock] = 0;
  155. PlayerVehicleInfo[playerid][playervehicleid][pvLocksLeft] = 0;
  156. PlayerVehicleInfo[playerid][playervehicleid][pvLocked] = 0;
  157. PlayerVehicleInfo[playerid][playervehicleid][pvAlarm] = 0;
  158. PlayerVehicleInfo[playerid][playervehicleid][pvAlarmTriggered] = 0;
  159. PlayerVehicleInfo[playerid][playervehicleid][pvBeingPickLocked] = 0;
  160. PlayerVehicleInfo[playerid][playervehicleid][pvBeingPickLockedBy] = INVALID_PLAYER_ID;
  161. PlayerVehicleInfo[playerid][playervehicleid][pvLastLockPickedBy] = 0;
  162. VehicleFuel[PlayerVehicleInfo[playerid][playervehicleid][pvId]] = 0.0;
  163. PlayerVehicleInfo[playerid][playervehicleid][pvId] = INVALID_PLAYER_VEHICLE_ID;
  164. if(PlayerVehicleInfo[playerid][playervehicleid][pvAllowedPlayerId] != INVALID_PLAYER_ID)
  165. {
  166. PlayerInfo[PlayerVehicleInfo[playerid][playervehicleid][pvAllowedPlayerId]][pVehicleKeys] = INVALID_PLAYER_VEHICLE_ID;
  167. PlayerInfo[PlayerVehicleInfo[playerid][playervehicleid][pvAllowedPlayerId]][pVehicleKeysFrom] = INVALID_PLAYER_ID;
  168. PlayerVehicleInfo[playerid][playervehicleid][pvAllowedPlayerId] = INVALID_PLAYER_ID;
  169. }
  170. for(new m; m < sizeof(Drugs); ++m) PlayerVehicleInfo[playerid][playervehicleid][pvDrugs][m] = 0;
  171. new query[60];
  172. mysql_format(MainPipeline, query, sizeof(query), "DELETE FROM `vehicles` WHERE `id` = '%d'", PlayerVehicleInfo[playerid][playervehicleid][pvSlotId]);
  173. mysql_tquery(MainPipeline, query, "OnQueryFinish", "ii", SENDDATA_THREAD, playerid);
  174. PlayerVehicleInfo[playerid][playervehicleid][pvSlotId] = 0;
  175. //g_mysql_SaveVehicle(playerid, playervehicleid);
  176. }
  177. }
  178. stock LoadPlayerVehicles(playerid, logoff = 0) {
  179. for(new v = 0; v < MAX_PLAYERVEHICLES; v++) {
  180. if(PlayerVehicleInfo[playerid][v][pvBeingPickLocked] > 0 && logoff == 0) continue;
  181. if(vehicleSpawnCountCheck(playerid)) {
  182. if(PlayerVehicleInfo[playerid][v][pvModelId] >= 400) {
  183. if(PlayerVehicleInfo[playerid][v][pvSpawned] && !PlayerVehicleInfo[playerid][v][pvDisabled] && !PlayerVehicleInfo[playerid][v][pvImpounded]) {
  184. PlayerCars++;
  185. VehicleSpawned[playerid]++;
  186. new carcreated = CreateVehicle(PlayerVehicleInfo[playerid][v][pvModelId], PlayerVehicleInfo[playerid][v][pvPosX], PlayerVehicleInfo[playerid][v][pvPosY], PlayerVehicleInfo[playerid][v][pvPosZ], PlayerVehicleInfo[playerid][v][pvPosAngle],PlayerVehicleInfo[playerid][v][pvColor1], PlayerVehicleInfo[playerid][v][pvColor2], -1);
  187. SetVehicleVirtualWorld(carcreated, PlayerVehicleInfo[playerid][v][pvVW]);
  188. LinkVehicleToInterior(carcreated, PlayerVehicleInfo[playerid][v][pvInt]);
  189. switch(GetVehicleModel(carcreated)) {
  190. case 519, 553, 508: {
  191. iVehEnterAreaID[carcreated] = CreateDynamicSphere(PlayerVehicleInfo[playerid][v][pvPosX]+2, PlayerVehicleInfo[playerid][v][pvPosY], PlayerVehicleInfo[playerid][v][pvPosZ], 4, GetVehicleVirtualWorld(carcreated));
  192. AttachDynamicAreaToVehicle(iVehEnterAreaID[carcreated], carcreated);
  193. Streamer_SetIntData(STREAMER_TYPE_AREA, iVehEnterAreaID[carcreated], E_STREAMER_EXTRA_ID, carcreated);
  194. }
  195. }
  196. Vehicle_ResetData(carcreated);
  197. PlayerVehicleInfo[playerid][v][pvId] = carcreated;
  198. VehicleFuel[carcreated] = PlayerVehicleInfo[playerid][v][pvFuel];
  199. if(PlayerVehicleInfo[playerid][v][pvLocked]) {
  200. if(PlayerVehicleInfo[playerid][v][pvLocksLeft]) LockPlayerVehicle(playerid, carcreated, PlayerVehicleInfo[playerid][v][pvLock]);
  201. else PlayerVehicleInfo[playerid][v][pvLocked] = 0;
  202. }
  203. LoadPlayerVehicleMods(playerid, v);
  204. if(PlayerVehicleInfo[playerid][v][pvCrashFlag] == 1 && PlayerVehicleInfo[playerid][v][pvCrashX] != 0.0)
  205. {
  206. SetVehiclePos(carcreated, PlayerVehicleInfo[playerid][v][pvCrashX], PlayerVehicleInfo[playerid][v][pvCrashY], PlayerVehicleInfo[playerid][v][pvCrashZ]);
  207. SetVehicleZAngle(carcreated, PlayerVehicleInfo[playerid][v][pvCrashAngle]);
  208. SetVehicleVirtualWorld(carcreated, PlayerVehicleInfo[playerid][v][pvCrashVW]);
  209. PlayerVehicleInfo[playerid][v][pvCrashFlag] = 0;
  210. PlayerVehicleInfo[playerid][v][pvCrashVW] = 0;
  211. PlayerVehicleInfo[playerid][v][pvCrashX] = 0.0;
  212. PlayerVehicleInfo[playerid][v][pvCrashY] = 0.0;
  213. PlayerVehicleInfo[playerid][v][pvCrashZ] = 0.0;
  214. PlayerVehicleInfo[playerid][v][pvCrashAngle] = 0.0;
  215. SendClientMessageEx(playerid, COLOR_WHITE, "Your vehicles have been restored to their last known location from your previous timeout.");
  216. }
  217. }
  218. else if(PlayerVehicleInfo[playerid][v][pvSpawned] != 0) {
  219. PlayerVehicleInfo[playerid][v][pvSpawned] = 0;
  220. }
  221. }
  222. else if(PlayerVehicleInfo[playerid][v][pvImpounded] != 0) {
  223. PlayerVehicleInfo[playerid][v][pvImpounded] = 0;
  224. }
  225. else if(PlayerVehicleInfo[playerid][v][pvSpawned] != 0) {
  226. PlayerVehicleInfo[playerid][v][pvSpawned] = 0;
  227. }
  228. }
  229. else PlayerVehicleInfo[playerid][v][pvSpawned] = 0;
  230. }
  231. return 1;
  232. }
  233. stock UnloadPlayerVehicles(playerid, logoff = 0, reason = 0) {
  234. for(new v = 0; v < MAX_PLAYERVEHICLES; v++) if(PlayerVehicleInfo[playerid][v][pvId] != INVALID_PLAYER_VEHICLE_ID && !PlayerVehicleInfo[playerid][v][pvImpounded] && PlayerVehicleInfo[playerid][v][pvSpawned]) {
  235. if(PlayerVehicleInfo[playerid][v][pvBeingPickLocked] > 0 && logoff == 0) continue;
  236. if(WheelClamp{PlayerVehicleInfo[playerid][v][pvId]} && logoff == 1) {
  237. PlayerVehicleInfo[playerid][v][pvImpounded] = 1;
  238. }
  239. if(IsVehicleInTow(PlayerVehicleInfo[playerid][v][pvId]) && logoff == 1)
  240. {
  241. DetachTrailerFromVehicle(GetPlayerVehicleID(playerid));
  242. PlayerVehicleInfo[playerid][v][pvImpounded] = 1;
  243. SetVehiclePos(PlayerVehicleInfo[playerid][v][pvId], 0, 0, 0); // Attempted desync fix
  244. }
  245. GetVehicleHealth(PlayerVehicleInfo[playerid][v][pvId], PlayerVehicleInfo[playerid][v][pvHealth]);
  246. if(PlayerVehicleInfo[playerid][v][pvBeingPickLocked] > 0) {
  247. new extraid = PlayerVehicleInfo[playerid][v][pvBeingPickLockedBy];
  248. SetPVarInt(extraid, "LockPickVehicleSQLId", PlayerVehicleInfo[playerid][v][pvSlotId]);
  249. SetPVarInt(extraid, "LockPickPlayerSQLId", GetPlayerSQLId(playerid));
  250. SetPVarInt(extraid, "VLPLocksLeft", PlayerVehicleInfo[playerid][v][pvLocksLeft]);
  251. SetPVarInt(extraid, "VLPTickets", PlayerVehicleInfo[playerid][v][pvTicket]);
  252. SetPVarString(extraid, "LockPickPlayerName", GetPlayerNameEx(playerid));
  253. new szMessage[150], rsMessage[20];
  254. switch(reason){
  255. case 0: rsMessage = "timed out";
  256. case 1: rsMessage = "logged off";
  257. case 2: rsMessage = "been kicked/banned";
  258. }
  259. format(szMessage, sizeof(szMessage), "The player (%s) that owns this vehicle (%s) has %s.", GetPlayerNameEx(playerid), GetVehicleName(PlayerVehicleInfo[playerid][v][pvId]), rsMessage);
  260. SendClientMessageEx(extraid, COLOR_YELLOW, szMessage);
  261. new ip2[MAX_PLAYER_NAME];
  262. GetPlayerIp(extraid, ip2, sizeof(ip2));
  263. SendClientMessageEx(extraid, COLOR_YELLOW, "(( The vehicle will de-spawn once you complete or fail the deliver. ))");
  264. format(szMessage, sizeof(szMessage), "[LOCK PICK] %s(%d) (IP:%s) has %s while his %s(VID:%d Slot %d) was lock picked by %s(IP:%s SQLId: %d)", GetPlayerNameEx(playerid), GetPlayerSQLId(playerid), PlayerInfo[playerid][pIP], rsMessage, GetVehicleName(PlayerVehicleInfo[playerid][v][pvId]), PlayerVehicleInfo[playerid][v][pvId], v, GetPlayerNameEx(extraid), ip2, GetPlayerSQLId(extraid));
  265. Log("logs/playervehicle.log", szMessage);
  266. DeletePVar(extraid, "LockPickPlayer");
  267. PlayerVehicleInfo[playerid][v][pvBeingPickLocked] = 0;
  268. PlayerVehicleInfo[playerid][v][pvBeingPickLockedBy] = INVALID_PLAYER_ID;
  269. }
  270. else {
  271. if(LockStatus{PlayerVehicleInfo[playerid][v][pvId]} != 0) LockStatus{PlayerVehicleInfo[playerid][v][pvId]} = 0;
  272. switch(PlayerVehicleInfo[playerid][v][pvModelId]) {
  273. case 519, 553, 508: {
  274. if(IsValidDynamicArea(iVehEnterAreaID[PlayerVehicleInfo[playerid][v][pvId]])) DestroyDynamicArea(iVehEnterAreaID[PlayerVehicleInfo[playerid][v][pvId]]);
  275. }
  276. }
  277. DestroyVehicle(PlayerVehicleInfo[playerid][v][pvId]);
  278. }
  279. PlayerCars--;
  280. PlayerVehicleInfo[playerid][v][pvId] = INVALID_PLAYER_VEHICLE_ID;
  281. PlayerVehicleInfo[playerid][v][pvSpawned] = 0;
  282. if(PlayerVehicleInfo[playerid][v][pvAllowedPlayerId] != INVALID_PLAYER_ID)
  283. {
  284. PlayerInfo[PlayerVehicleInfo[playerid][v][pvAllowedPlayerId]][pVehicleKeys] = INVALID_PLAYER_VEHICLE_ID;
  285. PlayerInfo[PlayerVehicleInfo[playerid][v][pvAllowedPlayerId]][pVehicleKeysFrom] = INVALID_PLAYER_ID;
  286. PlayerVehicleInfo[playerid][v][pvAllowedPlayerId] = INVALID_PLAYER_ID;
  287. }
  288. g_mysql_SaveVehicle(playerid, v);
  289. }
  290. VehicleSpawned[playerid] = 0;
  291. }
  292. stock UpdatePlayerVehicleParkPosition(playerid, playervehicleid, Float:newx, Float:newy, Float:newz, Float:newangle, Float:health, VW, Int)
  293. {
  294. if(PlayerVehicleInfo[playerid][playervehicleid][pvId] != INVALID_PLAYER_VEHICLE_ID && GetVehicleModel(PlayerVehicleInfo[playerid][playervehicleid][pvId]))
  295. {
  296. new Float:oldx, Float:oldy, Float:oldz, Float: oldfuel, arrDamage[4];
  297. oldx = PlayerVehicleInfo[playerid][playervehicleid][pvPosX];
  298. oldy = PlayerVehicleInfo[playerid][playervehicleid][pvPosY];
  299. oldz = PlayerVehicleInfo[playerid][playervehicleid][pvPosZ];
  300. if(oldx == newx && oldy == newy && oldz == newz) return 0;
  301. PlayerVehicleInfo[playerid][playervehicleid][pvPosX] = newx;
  302. PlayerVehicleInfo[playerid][playervehicleid][pvPosY] = newy;
  303. PlayerVehicleInfo[playerid][playervehicleid][pvPosZ] = newz;
  304. PlayerVehicleInfo[playerid][playervehicleid][pvPosAngle] = newangle;
  305. PlayerVehicleInfo[playerid][playervehicleid][pvVW] = VW;
  306. PlayerVehicleInfo[playerid][playervehicleid][pvInt] = Int;
  307. oldfuel = VehicleFuel[PlayerVehicleInfo[playerid][playervehicleid][pvId]];
  308. UpdatePlayerVehicleMods(playerid, playervehicleid);
  309. GetVehicleDamageStatus(PlayerVehicleInfo[playerid][playervehicleid][pvId], arrDamage[0], arrDamage[1], arrDamage[2], arrDamage[3]);
  310. switch(PlayerVehicleInfo[playerid][playervehicleid][pvModelId]) {
  311. case 519, 553, 508: {
  312. if(IsValidDynamicArea(iVehEnterAreaID[PlayerVehicleInfo[playerid][playervehicleid][pvId]])) DestroyDynamicArea(iVehEnterAreaID[PlayerVehicleInfo[playerid][playervehicleid][pvId]]);
  313. }
  314. }
  315. DestroyVehicle(PlayerVehicleInfo[playerid][playervehicleid][pvId]);
  316. new carcreated = CreateVehicle(PlayerVehicleInfo[playerid][playervehicleid][pvModelId], PlayerVehicleInfo[playerid][playervehicleid][pvPosX], PlayerVehicleInfo[playerid][playervehicleid][pvPosY], PlayerVehicleInfo[playerid][playervehicleid][pvPosZ],
  317. PlayerVehicleInfo[playerid][playervehicleid][pvPosAngle],PlayerVehicleInfo[playerid][playervehicleid][pvColor1], PlayerVehicleInfo[playerid][playervehicleid][pvColor2], -1);
  318. SetVehicleVirtualWorld(carcreated, PlayerVehicleInfo[playerid][playervehicleid][pvVW]);
  319. LinkVehicleToInterior(carcreated, PlayerVehicleInfo[playerid][playervehicleid][pvInt]);
  320. switch(GetVehicleModel(carcreated)) {
  321. case 519, 553, 508: {
  322. iVehEnterAreaID[carcreated] = CreateDynamicSphere(PlayerVehicleInfo[playerid][playervehicleid][pvPosX]+2, PlayerVehicleInfo[playerid][playervehicleid][pvPosY], PlayerVehicleInfo[playerid][playervehicleid][pvPosZ], 2.0, GetVehicleVirtualWorld(carcreated));
  323. AttachDynamicAreaToVehicle(iVehEnterAreaID[carcreated], carcreated);
  324. Streamer_SetIntData(STREAMER_TYPE_AREA, iVehEnterAreaID[carcreated], E_STREAMER_EXTRA_ID, carcreated);
  325. }
  326. }
  327. PlayerVehicleInfo[playerid][playervehicleid][pvId] = carcreated;
  328. Vehicle_ResetData(carcreated);
  329. VehicleFuel[carcreated] = oldfuel;
  330. // SetVehicleNumberPlate(carcreated, PlayerVehicleInfo[playerid][playervehicleid][pvNumberPlate]);
  331. SetVehicleHealth(carcreated, health);
  332. if(PlayerVehicleInfo[playerid][playervehicleid][pvLocked] == 1) LockPlayerVehicle(playerid, PlayerVehicleInfo[playerid][playervehicleid][pvId], PlayerVehicleInfo[playerid][playervehicleid][pvLock]);
  333. LoadPlayerVehicleMods(playerid, playervehicleid);
  334. UpdateVehicleDamageStatus(PlayerVehicleInfo[playerid][playervehicleid][pvId], arrDamage[0], arrDamage[1], arrDamage[2], arrDamage[3]);
  335. g_mysql_SaveVehicle(playerid, playervehicleid);
  336. return 1;
  337. }
  338. return 0;
  339. }
  340. stock UpdatePlayerVehicleMods(playerid, playervehicleid)
  341. {
  342. if(GetVehicleModel(PlayerVehicleInfo[playerid][playervehicleid][pvId]) && PlayerVehicleInfo[playerid][playervehicleid][pvImpounded] == 0 && PlayerVehicleInfo[playerid][playervehicleid][pvSpawned] == 1 && !PlayerVehicleInfo[playerid][playervehicleid][pvDisabled]) {
  343. new carid = PlayerVehicleInfo[playerid][playervehicleid][pvId];
  344. new exhaust, frontbumper, rearbumper, roof, spoilers, sideskirt1,
  345. sideskirt2, wheels, hydraulics, nitro, hood, lamps, stereo, ventright, ventleft;
  346. exhaust = GetVehicleComponentInSlot(carid, CARMODTYPE_EXHAUST);
  347. frontbumper = GetVehicleComponentInSlot(carid, CARMODTYPE_FRONT_BUMPER);
  348. rearbumper = GetVehicleComponentInSlot(carid, CARMODTYPE_REAR_BUMPER);
  349. roof = GetVehicleComponentInSlot(carid, CARMODTYPE_ROOF);
  350. spoilers = GetVehicleComponentInSlot(carid, CARMODTYPE_SPOILER);
  351. sideskirt1 = GetVehicleComponentInSlot(carid, CARMODTYPE_SIDESKIRT);
  352. sideskirt2 = GetVehicleComponentInSlot(carid, CARMODTYPE_SIDESKIRT);
  353. wheels = GetVehicleComponentInSlot(carid, CARMODTYPE_WHEELS);
  354. hydraulics = GetVehicleComponentInSlot(carid, CARMODTYPE_HYDRAULICS);
  355. nitro = GetVehicleComponentInSlot(carid, CARMODTYPE_NITRO);
  356. hood = GetVehicleComponentInSlot(carid, CARMODTYPE_HOOD);
  357. lamps = GetVehicleComponentInSlot(carid, CARMODTYPE_LAMPS);
  358. stereo = GetVehicleComponentInSlot(carid, CARMODTYPE_STEREO);
  359. ventright = GetVehicleComponentInSlot(carid, CARMODTYPE_VENT_RIGHT);
  360. ventleft = GetVehicleComponentInSlot(carid, CARMODTYPE_VENT_LEFT);
  361. if(spoilers >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][0] = spoilers;
  362. if(hood >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][1] = hood;
  363. if(roof >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][2] = roof;
  364. if(sideskirt1 >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][3] = sideskirt1;
  365. if(lamps >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][4] = lamps;
  366. if(nitro >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][5] = nitro;
  367. if(exhaust >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][6] = exhaust;
  368. if(wheels >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][7] = wheels;
  369. if(stereo >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][8] = stereo;
  370. if(hydraulics >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][9] = hydraulics;
  371. if(frontbumper >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][10] = frontbumper;
  372. if(rearbumper >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][11] = rearbumper;
  373. if(ventright >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][12] = ventright;
  374. if(ventleft >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][13] = ventleft;
  375. if(sideskirt2 >= 1000) PlayerVehicleInfo[playerid][playervehicleid][pvMods][14] = sideskirt2;
  376. g_mysql_SaveVehicle(playerid, playervehicleid);
  377. }
  378. }
  379. stock LoadPlayerVehicleMods(playerid, playervehicleid)
  380. {
  381. if(GetVehicleModel(PlayerVehicleInfo[playerid][playervehicleid][pvId]) && PlayerVehicleInfo[playerid][playervehicleid][pvImpounded] == 0 && PlayerVehicleInfo[playerid][playervehicleid][pvSpawned] == 1) {
  382. if(strlen(PlayerVehicleInfo[playerid][playervehicleid][pvPlate]) > 0)
  383. {
  384. SetVehicleNumberPlate(PlayerVehicleInfo[playerid][playervehicleid][pvId], PlayerVehicleInfo[playerid][playervehicleid][pvPlate]);
  385. SetVehiclePos(PlayerVehicleInfo[playerid][playervehicleid][pvId], 9999.9, 9999.9, 9999.9);
  386. SetVehiclePos(PlayerVehicleInfo[playerid][playervehicleid][pvId], PlayerVehicleInfo[playerid][playervehicleid][pvPosX], PlayerVehicleInfo[playerid][playervehicleid][pvPosY], PlayerVehicleInfo[playerid][playervehicleid][pvPosZ]);
  387. }
  388. if(PlayerVehicleInfo[playerid][playervehicleid][pvPaintJob] != -1)
  389. {
  390. ChangeVehiclePaintjob(PlayerVehicleInfo[playerid][playervehicleid][pvId], PlayerVehicleInfo[playerid][playervehicleid][pvPaintJob]);
  391. ChangeVehicleColor(PlayerVehicleInfo[playerid][playervehicleid][pvId], PlayerVehicleInfo[playerid][playervehicleid][pvColor1], PlayerVehicleInfo[playerid][playervehicleid][pvColor2]);
  392. }
  393. for(new m = 0; m < MAX_MODS; m++)
  394. {
  395. if (PlayerVehicleInfo[playerid][playervehicleid][pvMods][m] >= 1000 && PlayerVehicleInfo[playerid][playervehicleid][pvMods][m] <= 1193)
  396. {
  397. if (InvalidModCheck(GetVehicleModel(PlayerVehicleInfo[playerid][playervehicleid][pvId]),PlayerVehicleInfo[playerid][playervehicleid][pvMods][m]))
  398. {
  399. AddVehicleComponent(PlayerVehicleInfo[playerid][playervehicleid][pvId], PlayerVehicleInfo[playerid][playervehicleid][pvMods][m]);
  400. }
  401. else
  402. {
  403. PlayerVehicleInfo[playerid][playervehicleid][pvMods][m] = 0;
  404. }
  405. }
  406. }
  407. }
  408. }
  409. LoadPlayerDisabledVehicles(playerid)
  410. {
  411. new vehiclecount;
  412. switch(PlayerInfo[playerid][pDonateRank]) {
  413. case 0: {
  414. for(new v = 0; v < MAX_PLAYERVEHICLES; v++)
  415. {
  416. vehiclecount++;
  417. if(PlayerInfo[playerid][pVehicleSlot] + 6 <= vehiclecount) {
  418. PlayerVehicleInfo[playerid][v][pvDisabled] = 1;
  419. } else {
  420. PlayerVehicleInfo[playerid][v][pvDisabled] = 0;
  421. }
  422. }
  423. }
  424. case 1: {
  425. for(new v = 0; v < MAX_PLAYERVEHICLES; v++)
  426. {
  427. vehiclecount++;
  428. if(PlayerInfo[playerid][pVehicleSlot] + 7 <= vehiclecount) {
  429. PlayerVehicleInfo[playerid][v][pvDisabled] = 1;
  430. } else {
  431. PlayerVehicleInfo[playerid][v][pvDisabled] = 0;
  432. }
  433. }
  434. }
  435. case 2: {
  436. for(new v = 0; v < MAX_PLAYERVEHICLES; v++)
  437. {
  438. vehiclecount++;
  439. if(PlayerInfo[playerid][pVehicleSlot] + 8 <= vehiclecount) {
  440. PlayerVehicleInfo[playerid][v][pvDisabled] = 1;
  441. } else {
  442. PlayerVehicleInfo[playerid][v][pvDisabled] = 0;
  443. }
  444. }
  445. }
  446. case 3: {
  447. for(new v = 0; v < MAX_PLAYERVEHICLES; v++)
  448. {
  449. vehiclecount++;
  450. if(PlayerInfo[playerid][pVehicleSlot] + 9 <= vehiclecount) {
  451. PlayerVehicleInfo[playerid][v][pvDisabled] = 1;
  452. } else {
  453. PlayerVehicleInfo[playerid][v][pvDisabled] = 0;
  454. }
  455. }
  456. }
  457. default: {
  458. for(new v = 0; v < MAX_PLAYERVEHICLES; v++)
  459. {
  460. vehiclecount++;
  461. if(PlayerInfo[playerid][pVehicleSlot] + 11 <= vehiclecount) {
  462. PlayerVehicleInfo[playerid][v][pvDisabled] = 1;
  463. } else {
  464. PlayerVehicleInfo[playerid][v][pvDisabled] = 0;
  465. }
  466. }
  467. }
  468. }
  469. return 1;
  470. }
  471. stock GetPlayerFreeVehicleId(playerid) {
  472. for(new i; i < MAX_PLAYERVEHICLES; ++i) {
  473. if(PlayerVehicleInfo[playerid][i][pvModelId] == 0) return i;
  474. }
  475. return -1;
  476. }
  477. stock GetPlayerVehicle(playerid, vehicleid)
  478. {
  479. for(new v = 0; v < MAX_PLAYERVEHICLES; v++)
  480. {
  481. if(PlayerVehicleInfo[playerid][v][pvId] == vehicleid)
  482. {
  483. return v;
  484. }
  485. }
  486. return -1;
  487. }
  488. stock FindPlayerVehicleWithSQLId(ownerid, sqlid)
  489. {
  490. new
  491. i = 0;
  492. while (i < MAX_PLAYERVEHICLES && PlayerVehicleInfo[ownerid][i][pvSlotId] != sqlid)
  493. {
  494. i++;
  495. }
  496. if (i == MAX_PLAYERVEHICLES) return -1;
  497. return i;
  498. }
  499. forward ParkVehicle(playerid, ownerid, vehicleid, d, Float:X, Float:Y, Float:Z);
  500. public ParkVehicle(playerid, ownerid, vehicleid, d, Float:X, Float:Y, Float:Z)
  501. {
  502. if(IsPlayerInRangeOfPoint(playerid, 1.0, X, Y, Z))
  503. {
  504. new Float:x, Float:y, Float:z, Float:angle, Float:health, string[29 + (MAX_PLAYER_NAME * 2)];
  505. GetVehicleHealth(vehicleid, health);
  506. if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessageEx(playerid, COLOR_GREY, "You must be in the driver seat.");
  507. if(health < 800) return SendClientMessageEx(playerid, COLOR_GREY, " Your vehicle is too damaged to park it.");
  508. if(ownerid != INVALID_PLAYER_ID)
  509. {
  510. GetVehiclePos(vehicleid, x, y, z);
  511. GetVehicleZAngle(vehicleid, angle);
  512. SurfingCheck(vehicleid);
  513. UpdatePlayerVehicleParkPosition(ownerid, d, x, y, z, angle, health, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid));
  514. IsPlayerEntering{playerid} = true;
  515. PutPlayerInVehicle(playerid, vehicleid, 0);
  516. SetPlayerArmedWeapon(playerid, 0);
  517. format(string, sizeof(string), "* %s has parked %s's vehicle.", GetPlayerNameEx(playerid), GetPlayerNameEx(ownerid));
  518. }
  519. else
  520. {
  521. GetVehiclePos(vehicleid, x, y, z);
  522. GetVehicleZAngle(vehicleid, angle);
  523. SurfingCheck(vehicleid);
  524. UpdatePlayerVehicleParkPosition(playerid, d, x, y, z, angle, health, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid));
  525. IsPlayerEntering{playerid} = true;
  526. PutPlayerInVehicle(playerid, vehicleid, 0);
  527. SetPlayerArmedWeapon(playerid, 0);
  528. format(string, sizeof(string), "* %s has parked their vehicle.", GetPlayerNameEx(playerid), GetPlayerNameEx(ownerid));
  529. }
  530. ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
  531. }
  532. else
  533. {
  534. SendClientMessage(playerid, COLOR_WHITE, "Vehicle did not park because you moved!");
  535. }
  536. return 1;
  537. }