Guest User

Weapon Crates

a guest
Nov 22nd, 2016
491
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.06 KB | None | 0 0
  1. /*
  2. Crate System
  3. Made by Jelly23
  4. */
  5.  
  6. #define FILTERSCRIPT
  7.  
  8. /*Config*/
  9. #define MAX_CRATES 500
  10. #define CRATE_COST 10000
  11.  
  12. /*Includes*/
  13. #include <a_samp>
  14. #include <a_mysql>
  15. #include <izcmd>
  16. #include <foreach>
  17. #include <streamer>
  18.  
  19. /*MySQL*/
  20. #define host "localhost"
  21. #define user "root"
  22. #define db "crates"
  23. #define pass ""
  24. new mysql;
  25.  
  26. /*Enumerator*/
  27. enum jCrate
  28. {
  29. CrateID,
  30. Text3D:Label,
  31. Weapon1,
  32. Weapon2,
  33. Weapon3,
  34. Ammo1,
  35. Ammo2,
  36. Ammo3,
  37. Float:cX,
  38. Float:cY,
  39. Float:cZ,
  40. cWorld,
  41. cInterior
  42. };
  43. new cInfo[MAX_CRATES][jCrate];
  44.  
  45. /*Iterator*/
  46. new Iterator:CrateLoop<MAX_CRATES>;
  47.  
  48. /*Array(s)*/
  49. new CurrentCrate[MAX_PLAYERS],
  50. bool:HasBox[MAX_PLAYERS];
  51.  
  52. /*Dialog(s)*/
  53. #define DIALOG_CRATE (0)
  54. #define DIALOG_RCON (1)
  55. #define DIALOG_CRTGO (2)
  56. #define DIALOG_CRTET (3)
  57.  
  58. #if defined FILTERSCRIPT
  59.  
  60. public OnFilterScriptInit()
  61. {
  62. print("\n--------------------------------------");
  63. print(" Crate System");
  64. print("--------------------------------------\n");
  65. new query[24];
  66. mysql_log(LOG_ERROR | LOG_WARNING | LOG_DEBUG);
  67. mysql = mysql_connect(host, user, db, pass);
  68. if(mysql_errno(mysql) != 0)
  69. {
  70. print("Could not connect to database!"); SendRconCommand("hostname MYSQL| ERROR");
  71. }
  72. else
  73. {
  74. printf("MYSQL:: Connected Successfully To Database (%s)",db);
  75. }
  76. mysql_format(mysql, query, sizeof(query), "SELECT * FROM `crates`");
  77. if(!mysql_tquery(mysql, query, "LoadCrates", ""))
  78. {
  79. printf("[MySQL | ERROR]: Couldn't load the crates");
  80. }
  81. return 1;
  82. }
  83.  
  84. public OnFilterScriptExit()
  85. {
  86. SaveCrates();
  87. return 1;
  88. }
  89.  
  90. #else
  91.  
  92. main()
  93. {
  94. print("\n----------------------------------");
  95. print(" Crate System");
  96. print("----------------------------------\n");
  97. }
  98.  
  99. #endif
  100.  
  101. /*Functions*/
  102. CreateCrate(Float:X, Float:Y, Float:Z, world, interior)
  103. {
  104. new FreeID = Iter_Free(CrateLoop),string[21],query[300];
  105. Iter_Add(CrateLoop, FreeID);
  106. format(string,sizeof(string),"Weapon Crate (%i)",FreeID);
  107. cInfo[FreeID][CrateID] = CreateDynamicObject(3014, X, Y, Z-0.8, 0.0, 0.0, 0.0, world);
  108. cInfo[FreeID][Label] = Create3DTextLabel(string, 0xAA3333FF,X,Y,Z-0.4, 5.0,world, 0);
  109. cInfo[FreeID][cX] = X;
  110. cInfo[FreeID][cY] = Y;
  111. cInfo[FreeID][cZ] = Z-0.8;
  112. cInfo[FreeID][Weapon1] = cInfo[FreeID][Weapon2] = cInfo[FreeID][Weapon3] = -1;
  113. cInfo[FreeID][cWorld] = world;
  114. cInfo[FreeID][cInterior] = interior;
  115. mysql_format(mysql, query, sizeof(query), "INSERT INTO `crates` (`ID`, `cX`, `cY`, `cZ`, `Weapon1`, `Weapon2` ,`Weapon3`, `Ammo1`, `Ammo2`, `Ammo3`) VALUES ('%i', '%f', '%f', '%f', '%i', '%i', '%i', '%i','%i', '%i')",
  116. FreeID,cInfo[FreeID][cX],cInfo[FreeID][cY],cInfo[FreeID][cZ],cInfo[FreeID][Weapon1],cInfo[FreeID][Weapon2],cInfo[FreeID][Weapon3],cInfo[FreeID][Ammo1],cInfo[FreeID][Ammo2],cInfo[FreeID][Ammo3]);
  117. mysql_tquery(mysql, query, "","");
  118. return 1;
  119. }
  120.  
  121. DestroyCrate(crateid)
  122. {
  123. new query[41];
  124. Iter_Remove(CrateLoop, crateid);
  125. DestroyDynamicObject(cInfo[crateid][CrateID]);
  126. Delete3DTextLabel(cInfo[crateid][Label]);
  127. mysql_format(mysql,query,sizeof(query),"DELETE FROM `crates` WHERE `ID` ='%i'",crateid);
  128. mysql_tquery(mysql,query,"","");
  129. return 1;
  130. }
  131.  
  132. GetWeapName(playerid,weapid,slot)
  133. {
  134. new weapname[46];
  135. if(weapid == -1)
  136. {
  137. weapname = "Empty";
  138. }
  139. else
  140. {
  141. GetWeaponName(weapid, weapname, sizeof(weapname));
  142. switch(slot)
  143. {
  144. case 0: format(weapname,sizeof(weapname),"%s - Ammo: %i",weapname,cInfo[CurrentCrate[playerid]][Ammo1]);
  145. case 1: format(weapname,sizeof(weapname),"%s - Ammo: %i",weapname,cInfo[CurrentCrate[playerid]][Ammo2]);
  146. case 2: format(weapname,sizeof(weapname),"%s - Ammo: %i",weapname,cInfo[CurrentCrate[playerid]][Ammo3]);
  147. }
  148. }
  149. return weapname;
  150. }
  151.  
  152. SaveCrates()
  153. {
  154. new count;
  155. foreach(new i: CrateLoop)
  156. {
  157. UpdateCrates(i);
  158. count++;
  159. }
  160. printf("\n=======================================\n");
  161. printf(" Crate system saved!\n");
  162. printf(" A total of %i Crates out of %i loaded\n", count, MAX_CRATES);
  163. printf("\n=======================================\n");
  164. }
  165.  
  166. UpdateCrates(i)
  167. {
  168. new query[321];
  169. mysql_format(mysql, query, sizeof(query), "UPDATE `crates` SET `cX` ='%f' , `cY` ='%f' , `cZ` ='%f' , `Weapon1` ='%i', `Weapon2` = '%i', `Weapon3` ='%i', `Ammo1` ='%i', `Ammo2` ='%i', `Ammo3` ='%i' WHERE `ID` = '%i'",
  170. cInfo[i][cX],cInfo[i][cY],cInfo[i][cZ],cInfo[i][Weapon1],cInfo[i][Weapon2],cInfo[i][Weapon3],cInfo[i][Ammo1],cInfo[i][Ammo2],cInfo[i][Ammo3],i);
  171. mysql_tquery(mysql,query,"","");
  172. }
  173.  
  174. DropCrate(playerid)
  175. {
  176. new Float:X,Float:Y,Float:Z,string[21];
  177. format(string,sizeof(string),"Weapon Crate (%i)",CurrentCrate[playerid]);
  178. GetPlayerPos(playerid,X,Y,Z);
  179. HasBox[playerid] = false;
  180. cInfo[CurrentCrate[playerid]][CrateID] = CreateDynamicObject(3014, X, Y, Z-0.8, 0.0, 0.0, 0.0, GetPlayerVirtualWorld(playerid));
  181. cInfo[CurrentCrate[playerid]][Label] = Create3DTextLabel(string, 0xAA3333FF,X,Y,Z-0.4, 5.0,GetPlayerVirtualWorld(playerid), 0);
  182. cInfo[CurrentCrate[playerid]][cX] = X;
  183. cInfo[CurrentCrate[playerid]][cY] = Y;
  184. cInfo[CurrentCrate[playerid]][cZ] = Z-0.8;
  185. RemovePlayerAttachedObject(playerid,0);
  186. }
  187.  
  188. /*Commands*/
  189. CMD:buycrate(playerid)
  190. {
  191. if(GetPlayerMoney(playerid) < CRATE_COST) return SendClientMessage(playerid,-1,"You need $10,000 in order to buy an empty crate.");
  192. new Float:X,Float:Y,Float:Z;
  193. GetPlayerPos(playerid,X,Y,Z);
  194. GivePlayerMoney(playerid,-CRATE_COST);
  195. CreateCrate(X,Y,Z,GetPlayerVirtualWorld(playerid),GetPlayerInterior(playerid));
  196. return 1;
  197. }
  198.  
  199. CMD:crate(playerid)
  200. {
  201. new count;
  202. foreach(new i: CrateLoop)
  203. {
  204. if(IsPlayerInRangeOfPoint(playerid, 1.5, cInfo[i][cX], cInfo[i][cY], cInfo[i][cZ]))
  205. {
  206. CurrentCrate[playerid] = i;
  207. count++;
  208. }
  209. }
  210. if(count == 0) return SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF}You are not next to any weapon crate");
  211. new string[128];
  212. format(string,sizeof(string),"%s» %s\n» %s\n» %s\n{FF0000}» Put Gun\n{FF0000}» Pick it up",
  213. string,GetWeapName(playerid,cInfo[CurrentCrate[playerid]][Weapon1],0),GetWeapName(playerid,cInfo[CurrentCrate[playerid]][Weapon2],1),GetWeapName(playerid,cInfo[CurrentCrate[playerid]][Weapon3],2));
  214. ShowPlayerDialog(playerid, DIALOG_CRATE, DIALOG_STYLE_LIST, "Weapon Crate",string, "Select", "Cancel");
  215. return 1;
  216. }
  217.  
  218. CMD:ctest(playerid)
  219. {
  220. if(IsPlayerAdmin(playerid))
  221. {
  222. GivePlayerWeapon(playerid,24,100);
  223. }
  224. return 1;
  225. }
  226.  
  227. CMD:cmenu(playerid)
  228. {
  229. if(IsPlayerAdmin(playerid))
  230. {
  231. new count,string[128];
  232. foreach(new c: CrateLoop)
  233. {
  234. count++;
  235. }
  236. format(string,sizeof(string),"%s» Destroy all crates {FF0000}(%i)\n{FFFFFF}» Destroy closest crate\n» Reset closest crate\n» Create crate\n» Goto crate\n» Edit crate position",string,count);
  237. ShowPlayerDialog(playerid, DIALOG_RCON, DIALOG_STYLE_LIST, "Crate Menu",string, "Select", "Cancel");
  238. }
  239. return 1;
  240. }
  241.  
  242. /*Callbacks*/
  243. public OnPlayerConnect(playerid)
  244. {
  245. HasBox[playerid] = false;
  246. CurrentCrate[playerid] = -1;
  247. return 1;
  248. }
  249.  
  250. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  251. {
  252. if(dialogid == DIALOG_CRATE)
  253. {
  254. if(response)
  255. {
  256. switch(listitem)
  257. {
  258. case 0:
  259. {
  260. if(cInfo[CurrentCrate[playerid]][Weapon1] == -1)
  261. {
  262. SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF}That slot is empty.");
  263. }
  264. else
  265. {
  266. GivePlayerWeapon(playerid,cInfo[CurrentCrate[playerid]][Weapon1],cInfo[CurrentCrate[playerid]][Ammo1]);
  267. cInfo[CurrentCrate[playerid]][Weapon1] = -1;
  268. }
  269. }
  270. case 1:
  271. {
  272. if(cInfo[CurrentCrate[playerid]][Weapon2] == -1)
  273. {
  274. SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF}That slot is empty.");
  275. }
  276. else
  277. {
  278. GivePlayerWeapon(playerid,cInfo[CurrentCrate[playerid]][Weapon2],cInfo[CurrentCrate[playerid]][Ammo2]);
  279. cInfo[CurrentCrate[playerid]][Weapon2] = -1;
  280. }
  281. }
  282. case 2:
  283. {
  284. if(cInfo[CurrentCrate[playerid]][Weapon3] == -1)
  285. {
  286. SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF}That slot is empty.");
  287. }
  288. else
  289. {
  290. GivePlayerWeapon(playerid,cInfo[CurrentCrate[playerid]][Weapon3],cInfo[CurrentCrate[playerid]][Ammo3]);
  291. cInfo[CurrentCrate[playerid]][Weapon3] = -1;
  292. }
  293. }
  294. case 3:
  295. {
  296. if(cInfo[CurrentCrate[playerid]][Weapon1] != -1 && cInfo[CurrentCrate[playerid]][Weapon2] != -1 && cInfo[CurrentCrate[playerid]][Weapon3] != -1)
  297. {
  298. SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF}This crate is full, you can't put any more weapons inside of it");
  299. }
  300. else
  301. {
  302. if(GetPlayerWeapon(playerid) == 0) return SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF}You have no weapon in hands");
  303. if(cInfo[CurrentCrate[playerid]][Weapon1] == -1)
  304. {
  305. cInfo[CurrentCrate[playerid]][Weapon1] = GetPlayerWeapon(playerid);
  306. cInfo[CurrentCrate[playerid]][Ammo1] = GetPlayerAmmo(playerid);
  307. SetPlayerAmmo(playerid,GetPlayerWeapon(playerid),0);
  308. return 1;
  309. }
  310. if(cInfo[CurrentCrate[playerid]][Weapon2] == -1)
  311. {
  312. cInfo[CurrentCrate[playerid]][Weapon2] = GetPlayerWeapon(playerid);
  313. cInfo[CurrentCrate[playerid]][Ammo2] = GetPlayerAmmo(playerid);
  314. SetPlayerAmmo(playerid,GetPlayerWeapon(playerid),0);
  315. return 1;
  316. }
  317. if(cInfo[CurrentCrate[playerid]][Weapon3] == -1)
  318. {
  319. cInfo[CurrentCrate[playerid]][Weapon3] = GetPlayerWeapon(playerid);
  320. cInfo[CurrentCrate[playerid]][Ammo3] = GetPlayerAmmo(playerid);
  321. SetPlayerAmmo(playerid,GetPlayerWeapon(playerid),0);
  322. return 1;
  323. }
  324. }
  325. }
  326. case 4:
  327. {
  328. ApplyAnimation(playerid, "CARRY", "crry_prtial", 4.0, 1, 1, 1, 1, 1),ApplyAnimation(playerid, "CARRY", "crry_prtial", 4.0, 1, 1, 1, 1, 1);
  329. DestroyDynamicObject(cInfo[CurrentCrate[playerid]][CrateID]);
  330. Delete3DTextLabel(cInfo[CurrentCrate[playerid]][Label]);
  331. SetPlayerAttachedObject(playerid, 0, 3014, 6, 0.000000, 0.207999, -0.184999, -105.700004, 3.399999, -8.600002, 1.000000, 1.000000, 1.000000);
  332. HasBox[playerid] = true;
  333. cInfo[CurrentCrate[playerid]][cX] = 0.0;
  334. cInfo[CurrentCrate[playerid]][cY] = 0.0;
  335. cInfo[CurrentCrate[playerid]][cZ] = 0.0;
  336. }
  337. }
  338. }
  339. }
  340. if(dialogid == DIALOG_RCON)
  341. {
  342. if(response)
  343. {
  344. switch(listitem)
  345. {
  346. case 0:
  347. {
  348. foreach(new i: CrateLoop)
  349. {
  350. DestroyCrate(i);
  351. }
  352. SendClientMessageToAll(-1,"{FFFF00}[!] {FFFFFF} All crates were destroyed by an admin.");
  353. }
  354. case 1:
  355. {
  356. new count = -1;
  357. foreach(new i: CrateLoop)
  358. {
  359. if(IsPlayerInRangeOfPoint(playerid, 1.5, cInfo[i][cX], cInfo[i][cY], cInfo[i][cZ]))
  360. {
  361. count = i;
  362. }
  363. }
  364. if(count == -1) return SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF}You are not next to any weapon crate");
  365. DestroyCrate(count);
  366. }
  367. case 2:
  368. {
  369. new count = -1;
  370. foreach(new i: CrateLoop)
  371. {
  372. if(IsPlayerInRangeOfPoint(playerid, 1.5, cInfo[i][cX], cInfo[i][cY], cInfo[i][cZ]))
  373. {
  374. count = i;
  375. }
  376. }
  377. if(count == -1) return SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF}You are not next to any weapon crate");
  378. cInfo[count][Weapon1] = cInfo[count][Weapon2] = cInfo[count][Weapon3] = -1;
  379. }
  380. case 3:
  381. {
  382. new Float:X,Float:Y,Float:Z;
  383. GetPlayerPos(playerid,X,Y,Z);
  384. CreateCrate(X,Y,Z,GetPlayerVirtualWorld(playerid),GetPlayerInterior(playerid));
  385. }
  386. case 4:
  387. {
  388. ShowPlayerDialog(playerid,DIALOG_CRTGO, DIALOG_STYLE_INPUT, "Crate Menu »{FFFFFF} Goto crate", "Enter the crate id below:", "Go", "Cancel");
  389. }
  390. case 5:
  391. {
  392. ShowPlayerDialog(playerid,DIALOG_CRTET, DIALOG_STYLE_INPUT, "Crate Menu »{FFFFFF} Edit crate position", "Enter the crate id below:", "Go", "Cancel");
  393. }
  394. }
  395. }
  396. }
  397. if(dialogid == DIALOG_CRTGO)
  398. {
  399. if(response)
  400. {
  401. if (!Iter_Contains(CrateLoop, strval(inputtext))) return SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF} There is no such crate id.");
  402. SetPlayerPos(playerid,cInfo[strval(inputtext)][cX],cInfo[strval(inputtext)][cY],cInfo[strval(inputtext)][cZ]+1);
  403. }
  404. }
  405. if(dialogid == DIALOG_CRTET)
  406. {
  407. if(response)
  408. {
  409. if (!Iter_Contains(CrateLoop, strval(inputtext))) return SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF} There is no such crate id.");
  410. EditDynamicObject(playerid, cInfo[strval(inputtext)][CrateID]);
  411. CurrentCrate[playerid] = strval(inputtext);
  412. Delete3DTextLabel(cInfo[strval(inputtext)][Label]);
  413. }
  414. }
  415. return 1;
  416. }
  417.  
  418. public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
  419. {
  420. new string[21];
  421. format(string,sizeof(string),"Weapon Crate (%i)",CurrentCrate[playerid]);
  422. if(response == EDIT_RESPONSE_FINAL)
  423. {
  424. cInfo[cInfo[CurrentCrate[playerid]][CrateID]][cX] = x;
  425. cInfo[cInfo[CurrentCrate[playerid]][CrateID]][cY] = y;
  426. cInfo[cInfo[CurrentCrate[playerid]][CrateID]][cZ] = z;
  427. cInfo[CurrentCrate[playerid]][Label] = Create3DTextLabel(string, 0xAA3333FF,x,y,z+0.8-0.4, 5.0,GetPlayerVirtualWorld(playerid), 0);
  428. SetDynamicObjectPos(cInfo[CurrentCrate[playerid]][CrateID],x,y,z);
  429. SetDynamicObjectRot(cInfo[CurrentCrate[playerid]][CrateID],rx,ry,rz);
  430. SendClientMessage(playerid,-1,"{FFFF00}[!] {FFFFFF} New object position saved.");
  431. }
  432. else if(response == EDIT_RESPONSE_CANCEL)
  433. {
  434. cInfo[CurrentCrate[playerid]][Label] = Create3DTextLabel(string, 0xAA3333FF,cInfo[CurrentCrate[playerid]][cX],cInfo[CurrentCrate[playerid]][cY],cInfo[CurrentCrate[playerid]][cZ]+0.8-0.4, 5.0,GetPlayerVirtualWorld(playerid), 0);
  435. SetDynamicObjectPos(cInfo[CurrentCrate[playerid]][CrateID],cInfo[CurrentCrate[playerid]][cX],cInfo[CurrentCrate[playerid]][cY],cInfo[CurrentCrate[playerid]][cZ]);
  436. }
  437. return 1;
  438. }
  439.  
  440. public OnPlayerSpawn(playerid)
  441. {
  442. if(HasBox[playerid] == true)
  443. {
  444. DropCrate(playerid);
  445. }
  446. return 1;
  447. }
  448.  
  449. public OnPlayerDeath(playerid,killerid,reason)
  450. {
  451. if(HasBox[playerid] == true)
  452. {
  453. DropCrate(playerid);
  454. }
  455. return 1;
  456. }
  457.  
  458. forward LoadCrates();
  459. public LoadCrates()
  460. {
  461. new t,string[21];
  462. for(new i = 0; i < cache_get_row_count(); i++)
  463. {
  464. t = cache_get_field_content_int(i,"ID");
  465. Iter_Add(CrateLoop,t);
  466.  
  467. cInfo[t][cX] = cache_get_field_content_float(i, "cX");
  468. cInfo[t][cY] = cache_get_field_content_float(i, "cY");
  469. cInfo[t][cZ] = cache_get_field_content_float(i, "cZ");
  470.  
  471. format(string,sizeof(string),"Weapon Crate (%i)",t);
  472. cInfo[t][CrateID] = CreateDynamicObject(3014, cInfo[t][cX], cInfo[t][cY], cInfo[t][cZ], 0.0, 0.0, 0.0, 0);
  473. cInfo[t][Label] = Create3DTextLabel(string, 0xAA3333FF,cInfo[t][cX],cInfo[t][cY],cInfo[t][cZ]+0.8-0.4, 5.0,0, 0);
  474.  
  475. cInfo[t][Weapon1] = cache_get_field_content_int(i,"Weapon1");
  476. cInfo[t][Weapon2] = cache_get_field_content_int(i,"Weapon2");
  477. cInfo[t][Weapon3] = cache_get_field_content_int(i,"Weapon3");
  478.  
  479. cInfo[t][Ammo1] = cache_get_field_content_int(i,"Ammo1");
  480. cInfo[t][Ammo2] = cache_get_field_content_int(i,"Ammo2");
  481. cInfo[t][Ammo3] = cache_get_field_content_int(i,"Ammo3");
  482. }
  483. printf("\n=======================================\n");
  484. printf(" Crate system loaded!\n");
  485. printf(" A total of %d Crates out of %d loaded\n", cache_get_row_count(), MAX_CRATES);
  486. printf("\n=======================================\n");
  487. }
  488.  
  489. public OnPlayerDisconnect(playerid,reason)
  490. {
  491. if(HasBox[playerid] == true)
  492. {
  493. DropCrate(playerid);
  494. }
  495. }
  496.  
  497. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  498. {
  499. if (newkeys & KEY_YES)
  500. {
  501. if(HasBox[playerid] == true)
  502. {
  503. DropCrate(playerid);
  504. SetPlayerSkin(playerid,GetPlayerSkin(playerid));
  505. }
  506. }
  507. return 1;
  508. }
Advertisement
Add Comment
Please, Sign In to add comment