Advertisement
TheKiller

Vehicle save FS

Dec 15th, 2011
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.01 KB | None | 0 0
  1. /*
  2. Easy vehicle saving
  3. Version 0.1
  4. ~ By [HiC]TheKiller ~
  5. */
  6.  
  7. /*
  8. native SaveVehicle(playerid, slotid = 1)
  9. native LoadVehicle(playerid, slotid = 1, type = TYPE_CREATE_VEHICLE, respawntime = 999999999999)
  10. native DoesPlayerHaveVehicleInSlot(playerid, slotid)
  11. native GetVehicleModelInSlot(playerid, slotid)
  12. native DeleteVehicleInSlot(playerid, slotid)
  13. native CountPlayerVehicles(playerid)
  14. native ReturnPlayerVehicleSlots(playerid, arraydest[])
  15. native GetTotalVehiclesSaved()
  16. */
  17.  
  18. //Compiler stuff
  19. #if defined _samp_included
  20. #else
  21. #include <a_samp>
  22. #define _samp_included
  23. #endif
  24.  
  25. #if defined Included_tkvehicle
  26. #endinput
  27. #endif
  28. #define Included_tkvehicle
  29. //====================================
  30.  
  31. //Defines for returns
  32. #define SUCCESSFUL_SAVE 1
  33. #define NO_VEHICLE_IN_SLOT 2
  34. #define UNABLE_TO_SAVE_VEHICLE 3
  35. #define PLAYER_NOT_IN_VEHICLE 4
  36. #define PLAYER_NOT_CONNECTED 5
  37.  
  38. #define TYPE_CREATE_VEHICLE 1
  39. #define TYPE_ADD_STATIC_VEHICLE 2
  40. #define TYPE_ADD_STATIC_VEHICLE_EX 3
  41. //====================================
  42.  
  43. //Global variables / used defines
  44. new DB:vehicledb, DBResult:queryresult;
  45. #define vdb_query(%1) db_query(vehicledb, %1)
  46. //==========================================
  47.  
  48. //Hooks
  49. public OnGameModeInit()
  50. {
  51. vehicledb = db_open("vehicledb.db");
  52. vdb_query("CREATE TABLE IF NOT EXISTS vehicleinfo (username VARCHAR(24), vehicleinfo VARCHAR(300), slotid INT)");
  53. return CallLocalFunction("hooking_OnGameModeInit", "");
  54. }
  55. #if defined _ALS_OnGameModeInit
  56. #undef OnGameModeInit
  57. #else
  58. #define _ALS_OnGameModeInit
  59. #endif
  60. #define OnGameModeInit hooking_OnGameModeInit
  61. forward hooking_OnGameModeInit();
  62.  
  63.  
  64. public OnFilterScriptInit()
  65. {
  66. vehicledb = db_open("vehicledb.db");
  67. vdb_query("CREATE TABLE IF NOT EXISTS vehicleinfo (username VARCHAR(24), vehicleinfo VARCHAR(300), slotid INT)");
  68. return CallLocalFunction("hooking_OnFilterScriptInit", "");
  69. }
  70. #if defined _ALS_OnFilterScriptInit
  71. #undef OnFilterScriptInit
  72. #else
  73. #define _ALS_OnFilterScriptInit
  74. #endif
  75. #define OnFilterScriptInit hooking_OnFilterScriptInit
  76. forward hooking_OnFilterScriptInit();
  77.  
  78. //==============================================================
  79. //The following is mostly Ryder's include but it has been edited
  80. //Credits go to Ryder :)
  81. //==============================================================
  82.  
  83. #define PROPERTY_OFFSET_P(%0) \
  84. ((((%0) * ((%0) << 1)) << 2) + 65536*2)
  85. #define PROPERTY_OFFSET_C(%0) \
  86. ((((%0) * ((%0) << 1)) << 2) + 65536)
  87. public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
  88. {
  89. new str[50];
  90. valstr(str, paintjobid);
  91. setproperty(_, "", PROPERTY_OFFSET_P(vehicleid), str);
  92. return CallLocalFunction("hooking_OnVehiclePaintjob", "");
  93. }
  94. #if defined _ALS_OnVehiclePaintjob
  95. #undef OnVehiclePaintjob
  96. #else
  97. #define _ALS_OnVehiclePaintjob
  98. #endif
  99. #define OnVehiclePaintjob hooking_OnVehiclePaintjob
  100. forward hooking_OnVehiclePaintjob();
  101.  
  102. stock x_ChangeVehiclePaintjob(_vehicleID, _paintjobid)
  103. {
  104. new str[50];
  105. valstr(str, _paintjobid);
  106. setproperty(_, "", PROPERTY_OFFSET_P(_vehicleID), str);
  107. return ChangeVehiclePaintjob(_vehicleID, _paintjobid);
  108. }
  109. stock GetVehiclePaintJob(_vehicleID)
  110. {
  111. _vehicleID = PROPERTY_OFFSET_P(_vehicleID);
  112. if(existproperty(_, "", _vehicleID))
  113. {
  114. new str[5];
  115. getproperty(_, "", _vehicleID, str);
  116. strunpack(str, str);
  117. return strval(str);
  118. }
  119. return 0;
  120. }
  121.  
  122. stock x_AddStaticVehicle(modelID, Float: spawn_X, Float: spawn_Y, Float: spawn_Z, Float: z_Angle, color1, color2, paintjob = -1)
  123. {
  124. if(color1 < -1 || color2 < 0)
  125. {
  126. color1 = random(127);
  127. color2 = random(127);
  128. }
  129. modelID = AddStaticVehicle(modelID, spawn_X, spawn_Y, spawn_Z, z_Angle, color1, color2);
  130. new colorStr[24];
  131. format(colorStr, sizeof(colorStr), "%d-%d", color1, color2);
  132. setproperty(_, "", PROPERTY_OFFSET_C(modelID), colorStr);
  133. valstr(colorStr, paintjob);
  134. setproperty(_, "", PROPERTY_OFFSET_P(modelID), colorStr);
  135. if(paintjob != -1) ChangeVehiclePaintjob(modelID, paintjob);
  136. return modelID;
  137. }
  138.  
  139. stock x_AddStaticVehicleEx(modelID, Float: spawn_X, Float: spawn_Y, Float: spawn_Z, Float: z_Angle, color1, color2, respawn_Delay, paintjob = -1)
  140. {
  141. if(color1 < 0 || color2 < 0)
  142. {
  143. color1 = random(127);
  144. color2 = random(127);
  145. }
  146. modelID = AddStaticVehicleEx(modelID, spawn_X, spawn_Y, spawn_Z, z_Angle, color1, color2, respawn_Delay);
  147. new colorStr[24];
  148. format(colorStr, sizeof(colorStr), "%d-%d", color1, color2);
  149. setproperty(_, "", PROPERTY_OFFSET_C(modelID), colorStr);
  150. valstr(colorStr, paintjob);
  151. setproperty(_, "", PROPERTY_OFFSET_P(modelID), colorStr);
  152. if(paintjob != -1) ChangeVehiclePaintjob(modelID, paintjob);
  153. return modelID;
  154. }
  155.  
  156. stock x_CreateVehicle(modelID, Float: spawn_X, Float: spawn_Y, Float: spawn_Z, Float: z_Angle, color1, color2, respawn_Delay, paintjob = -1)
  157. {
  158. if(color1 < 0 || color2 < 0)
  159. {
  160. color1 = random(127);
  161. color2 = random(127);
  162. }
  163. modelID = CreateVehicle(modelID, spawn_X, spawn_Y, spawn_Z, z_Angle, color1, color2, respawn_Delay);
  164. new colorStr[24];
  165. format(colorStr, sizeof(colorStr), "%d-%d", color1, color2);
  166. setproperty(_, "", PROPERTY_OFFSET_C(modelID), colorStr);
  167. valstr(colorStr, paintjob);
  168. setproperty(_, "", PROPERTY_OFFSET_P(modelID), colorStr);
  169. if(paintjob != -1) ChangeVehiclePaintjob(modelID, paintjob);
  170. return modelID;
  171. }
  172.  
  173. stock x_DestroyVehicle(vehicleID)
  174. {
  175. deleteproperty(_, "", PROPERTY_OFFSET_C(vehicleID));
  176. deleteproperty(_, "", PROPERTY_OFFSET_P(vehicleID));
  177. return DestroyVehicle(vehicleID);
  178. }
  179.  
  180. stock x_ChangeVehicleColor(vehicleID, color1, color2)
  181. {
  182. new colorStr[24];
  183. format(colorStr, sizeof(colorStr), "%d-%d", color1, color2);
  184. setproperty(_, "", PROPERTY_OFFSET_C(vehicleID), colorStr);
  185. return ChangeVehicleColor(vehicleID, color1, color2);
  186. }
  187.  
  188. public OnVehicleRespray(playerid, vehicleid, color1, color2)
  189. {
  190. new colorStr[24];
  191. format(colorStr, sizeof(colorStr), "%d-%d", color1, color2);
  192. setproperty(_, "", PROPERTY_OFFSET_C(vehicleid), colorStr);
  193. return CallLocalFunction("x_OnVehicleRespray", "iiii", playerid, vehicleid, color1, color2);
  194. }
  195.  
  196. stock GetVehicleColor(vehicleID, &color1, &color2)
  197. {
  198. vehicleID = PROPERTY_OFFSET_C(vehicleID);
  199. if(existproperty(_, "", vehicleID))
  200. {
  201. new colorStr[24], strPos;
  202. getproperty(_, "", vehicleID, colorStr);
  203. strunpack(colorStr, colorStr);
  204. while(colorStr[strPos] != '-') strPos++;
  205. color1 = strval(colorStr);
  206. color2 = strval(colorStr[strPos + 1]);
  207. return 1;
  208. }
  209. return 0;
  210. }
  211.  
  212. #define AddStaticVehicle x_AddStaticVehicle
  213. #define AddStaticVehicleEx x_AddStaticVehicleEx
  214. #define CreateVehicle x_CreateVehicle
  215. #define DestroyVehicle x_DestroyVehicle
  216. #define ChangeVehicleColor x_ChangeVehicleColor
  217. #define ChangeVehiclePaintjob x_ChangeVehiclePaintjob
  218.  
  219. #if defined _ALS_OnVehicleRespray
  220. #undef OnVehicleRespray
  221. #else
  222. #define _ALS_OnVehicleRespray
  223. #endif
  224.  
  225. #define OnVehicleRespray x_OnVehicleRespray
  226.  
  227. forward x_OnVehicleRespray(playerid, vehicleid, color1, color2);
  228. //=================================================
  229.  
  230. stock SaveVehicle(playerid, slotid = 1)
  231. {
  232. if(!IsPlayerInAnyVehicle(playerid)) return PLAYER_NOT_IN_VEHICLE;
  233. if(!IsPlayerConnected(playerid)) return PLAYER_NOT_CONNECTED;
  234. new v_color[2], v_id = GetPlayerVehicleID(playerid), vehinfo[250];
  235. GetVehicleColor(v_id, v_color[0], v_color[1]);
  236. format(vehinfo, sizeof(vehinfo), "%s%d-%d-%d-%d", vehinfo, GetVehicleModel(v_id), v_color[0], v_color[1], GetVehiclePaintJob(v_id));
  237. for ( new z; z < 14; z++ )
  238. format(vehinfo, sizeof(vehinfo), "%s-%d", vehinfo, GetVehicleComponentInSlot(v_id, z));
  239. new pname[24], v_query[350];
  240. GetPlayerName(playerid, pname, 24);
  241. format(v_query, sizeof(v_query), "SELECT slotid FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid);
  242. queryresult = vdb_query(v_query);
  243. if(db_num_rows(queryresult) == 1)
  244. format(v_query, sizeof(v_query), "UPDATE vehicleinfo SET vehicleinfo = '%s' WHERE username = '%s' AND slotid = %d", vehinfo, pname, slotid);
  245. else
  246. format(v_query, sizeof(v_query), "INSERT INTO vehicleinfo (username, vehicleinfo, slotid) VALUES ('%s', '%s', %d)", pname, vehinfo, slotid);
  247. db_free_result(queryresult);
  248. vdb_query(v_query);
  249. return SUCCESSFUL_SAVE;
  250. }
  251.  
  252. stock LoadVehicle(playerid, slotid = 1, type = TYPE_CREATE_VEHICLE, respawntime = 999999999999)
  253. {
  254. new pname[24], v_query[150], vehinfo[350], veh_id;
  255. GetPlayerName(playerid, pname, 24);
  256. format(v_query, sizeof(v_query), "SELECT vehicleinfo FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid);
  257. queryresult = vdb_query(v_query);
  258. if(!db_num_rows(queryresult))
  259. {
  260. db_free_result(queryresult);
  261. return NO_VEHICLE_IN_SLOT;
  262. }
  263. else
  264. {
  265. db_get_field_assoc(queryresult, "vehicleinfo", vehinfo, sizeof(vehinfo));
  266. db_free_result(queryresult);
  267. new veh_info[19];
  268. #if defined sscanf
  269. sscanf(vehinfo, "p<->ddddddddddddddddddd", veh_info[0], veh_info[1], veh_info[2], veh_info[3],
  270. veh_info[4], veh_info[5], veh_info[6], veh_info[7],veh_info[8], veh_info[9], veh_info[10],
  271. veh_info[11], veh_info[12],veh_info[13], veh_info[14], veh_info[15], veh_info[16], veh_info[17], veh_info[18]);
  272. #else
  273. new vehinformation[19][7];
  274. split(vehinfo, vehinformation, '-');
  275. for( new xx; xx<18; xx++ )
  276. {
  277. veh_info[xx] = strval(vehinformation[xx]);
  278. }
  279. #endif
  280. new Float:pos[4];
  281. GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
  282. GetPlayerFacingAngle(playerid, pos[3]);
  283. if(type == TYPE_CREATE_VEHICLE)
  284. veh_id = CreateVehicle(veh_info[0], pos[0], pos[1], pos[2], pos[3], veh_info[1], veh_info[2], respawntime, veh_info[3]);
  285. if(type == TYPE_ADD_STATIC_VEHICLE)
  286. veh_id = AddStaticVehicle(veh_info[0], pos[0], pos[1], pos[2], pos[3], veh_info[1], veh_info[2], veh_info[3]);
  287. if(type == TYPE_ADD_STATIC_VEHICLE_EX)
  288. veh_id = AddStaticVehicleEx(veh_info[0], pos[0], pos[1], pos[2], pos[3], veh_info[1], veh_info[2], respawntime, veh_info[3]);
  289. for( new xx; xx<13; xx++ )
  290. if(veh_info[xx + 4] != 0) AddVehicleComponent(veh_id, veh_info[xx + 4]);
  291. PutPlayerInVehicle(playerid, veh_id, 0);
  292. }
  293. return veh_id;
  294. }
  295.  
  296. stock DoesPlayerHaveVehicleInSlot(playerid, slotid)
  297. {
  298. new pname[24], v_query[150];
  299. GetPlayerName(playerid, pname, 24);
  300. format(v_query, sizeof(v_query), "SELECT slotid FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid);
  301. queryresult = vdb_query(v_query);
  302. new numresults = db_num_rows(queryresult);
  303. db_free_result(queryresult);
  304. if(!numresults)
  305. return false;
  306. return true;
  307. }
  308.  
  309. stock GetVehicleModelInSlot(playerid, slotid)
  310. {
  311. new pname[24], v_query[150], vehinfo[200], modelid[10];
  312. GetPlayerName(playerid, pname, 24);
  313. format(v_query, sizeof(v_query), "SELECT vehicleinfo FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid);
  314. queryresult = vdb_query(v_query);
  315. if(!db_num_rows(queryresult))
  316. {
  317. db_free_result(queryresult);
  318. return NO_VEHICLE_IN_SLOT;
  319. }
  320. else
  321. {
  322. db_get_field_assoc(queryresult, "vehicleinfo", vehinfo, sizeof(vehinfo));
  323. db_free_result(queryresult);
  324. new id;
  325. while(vehinfo[id] != '-') id++;
  326. strmid(modelid, vehinfo, 0, id);
  327. }
  328. return strval(modelid);
  329. }
  330.  
  331. stock DeleteVehicleInSlot(playerid, slotid)
  332. {
  333. new pname[24], v_query[150];
  334. GetPlayerName(playerid, pname, 24);
  335. format(v_query, sizeof(v_query), "DELETE FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid);
  336. vdb_query(v_query);
  337. return 1;
  338. }
  339.  
  340. stock CountPlayerVehicles(playerid)
  341. {
  342. new pname[24], v_query[150];
  343. GetPlayerName(playerid, pname, 24);
  344. format(v_query, sizeof(v_query), "SELECT slotid FROM vehicleinfo WHERE username = '%s'", pname);
  345. queryresult = vdb_query(v_query);
  346. new numresults = db_num_rows(queryresult);
  347. db_free_result(queryresult);
  348. return numresults;
  349. }
  350.  
  351. stock ReturnPlayerVehicleSlots(playerid, arraydest[])
  352. {
  353. new pname[24], v_query[150], slotid[10];
  354. GetPlayerName(playerid, pname, 24);
  355. format(v_query, sizeof(v_query), "SELECT slotid FROM vehicleinfo WHERE username = '%s'", pname);
  356. queryresult = vdb_query(v_query);
  357. new numresults = db_num_rows(queryresult);
  358. db_free_result(queryresult);
  359. if(numresults == 1)
  360. {
  361. db_get_field_assoc(queryresult, "slotid", slotid, 10);
  362. arraydest[0] = strval(slotid);
  363. }
  364. else
  365. {
  366. for(new r; r < numresults; r++ )
  367. {
  368. db_get_field_assoc(queryresult, "slotid", slotid, 10);
  369. arraydest[r] = strval(slotid);
  370. db_next_row(queryresult);
  371. }
  372. }
  373. return numresults;
  374. }
  375.  
  376. stock GetTotalVehiclesSaved()
  377. {
  378. queryresult = vdb_query("SELECT slotid FROM vehicleinfo");
  379. new numresults = db_num_rows(queryresult);
  380. db_free_result(queryresult);
  381. return numresults;
  382. }
  383.  
  384. #if defined sscanf
  385. #else
  386. //modded version of split
  387. stock split(const strsrc[], strdest[][], delimiter)
  388. {
  389. new li, aNum, len, lenx = strlen(strsrc);
  390. for (new i; i <= lenx; i++)
  391. {
  392. if(strsrc[i] == delimiter || i == lenx)
  393. {
  394. len = strmid(strdest[aNum], strsrc, li, i, 10);
  395. strdest[aNum][len] = 0;
  396. li = i+1;
  397. aNum++;
  398. }
  399. }
  400. return 1;
  401. }
  402. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement