Advertisement
Guest User

Untitled

a guest
Aug 18th, 2017
2,180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.85 KB | None | 0 0
  1. //Weapons on body system by GoldenLion
  2. //Credits to BlueG & Pain123 & maddinat0r for MySQL
  3.  
  4. #define FILTERSCRIPT
  5.  
  6. #include <a_samp>
  7. #include <a_mysql>
  8.  
  9. #undef MAX_PLAYERS
  10. #define MAX_PLAYERS 100
  11.  
  12. #define DIALOG_EDIT_BONE 5000
  13. #define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
  14.  
  15. #define MYSQL_HOST "localhost"
  16. #define MYSQL_USER "root"
  17. #define MYSQL_PASSWORD ""
  18. #define MYSQL_DATABASE "database"
  19.  
  20. new MySQL:database;
  21.  
  22. enum weaponSettings
  23. {
  24. Float:Position[6],
  25. Bone,
  26. Hidden
  27. }
  28. new WeaponSettings[MAX_PLAYERS][17][weaponSettings], WeaponTick[MAX_PLAYERS], EditingWeapon[MAX_PLAYERS];
  29.  
  30. GetWeaponObjectSlot(weaponid)
  31. {
  32. new objectslot;
  33.  
  34. switch (weaponid)
  35. {
  36. case 22..24: objectslot = 0;
  37. case 25..27: objectslot = 1;
  38. case 28, 29, 32: objectslot = 2;
  39. case 30, 31: objectslot = 3;
  40. case 33, 34: objectslot = 4;
  41. case 35..38: objectslot = 5;
  42. }
  43. return objectslot;
  44. }
  45.  
  46. GetWeaponModel(weaponid) //Will only return the model of wearable weapons (22-38)
  47. {
  48. new model;
  49.  
  50. switch(weaponid)
  51. {
  52. case 22..29: model = 324 + weaponid;
  53. case 30: model = 355;
  54. case 31: model = 356;
  55. case 32: model = 372;
  56. case 33..38: model = 324 + weaponid;
  57. }
  58. return model;
  59. }
  60.  
  61. PlayerHasWeapon(playerid, weaponid)
  62. {
  63. new weapon, ammo;
  64.  
  65. for (new i; i < 13; i++)
  66. {
  67. GetPlayerWeaponData(playerid, i, weapon, ammo);
  68. if (weapon == weaponid && ammo) return 1;
  69. }
  70. return 0;
  71. }
  72.  
  73. IsWeaponWearable(weaponid)
  74. return (weaponid >= 22 && weaponid <= 38);
  75.  
  76. IsWeaponHideable(weaponid)
  77. return (weaponid >= 22 && weaponid <= 24 || weaponid == 28 || weaponid == 32);
  78.  
  79. forward OnWeaponsLoaded(playerid);
  80. public OnWeaponsLoaded(playerid)
  81. {
  82. new rows, weaponid, index;
  83.  
  84. cache_get_row_count(rows);
  85.  
  86. for (new i; i < rows; i++)
  87. {
  88. cache_get_value_name_int(i, "WeaponID", weaponid);
  89. index = weaponid - 22;
  90.  
  91. cache_get_value_name_float(i, "PosX", WeaponSettings[playerid][index][Position][0]);
  92. cache_get_value_name_float(i, "PosY", WeaponSettings[playerid][index][Position][1]);
  93. cache_get_value_name_float(i, "PosZ", WeaponSettings[playerid][index][Position][2]);
  94.  
  95. cache_get_value_name_float(i, "RotX", WeaponSettings[playerid][index][Position][3]);
  96. cache_get_value_name_float(i, "RotY", WeaponSettings[playerid][index][Position][4]);
  97. cache_get_value_name_float(i, "RotZ", WeaponSettings[playerid][index][Position][5]);
  98.  
  99. cache_get_value_name_int(i, "Bone", WeaponSettings[playerid][index][Bone]);
  100. cache_get_value_name_int(i, "Hidden", WeaponSettings[playerid][index][Hidden]);
  101. }
  102. }
  103.  
  104. public OnFilterScriptInit()
  105. {
  106. new MySQLOpt:options = mysql_init_options();
  107.  
  108. mysql_set_option(options, POOL_SIZE, 0);
  109. database = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, options);
  110.  
  111. if (mysql_errno()) printf("Failed to connect to %s.", MYSQL_HOST);
  112. else printf("Successfully connected to %s.", MYSQL_HOST);
  113. return 1;
  114. }
  115.  
  116. public OnFilterScriptExit()
  117. {
  118. mysql_close(database);
  119. return 1;
  120. }
  121.  
  122. public OnPlayerUpdate(playerid)
  123. {
  124. if (NetStats_GetConnectedTime(playerid) - WeaponTick[playerid] >= 250)
  125. {
  126. new weaponid, ammo, objectslot, count, index;
  127.  
  128. for (new i = 2; i <= 7; i++) //Loop only through the slots that may contain the wearable weapons
  129. {
  130. GetPlayerWeaponData(playerid, i, weaponid, ammo);
  131. index = weaponid - 22;
  132.  
  133. if (weaponid && ammo && !WeaponSettings[playerid][index][Hidden] && IsWeaponWearable(weaponid) && EditingWeapon[playerid] != weaponid)
  134. {
  135. objectslot = GetWeaponObjectSlot(weaponid);
  136.  
  137. if (GetPlayerWeapon(playerid) != weaponid)
  138. SetPlayerAttachedObject(playerid, objectslot, GetWeaponModel(weaponid), WeaponSettings[playerid][index][Bone], WeaponSettings[playerid][index][Position][0], WeaponSettings[playerid][index][Position][1], WeaponSettings[playerid][index][Position][2], WeaponSettings[playerid][index][Position][3], WeaponSettings[playerid][index][Position][4], WeaponSettings[playerid][index][Position][5], 1.0, 1.0, 1.0);
  139.  
  140. else if (IsPlayerAttachedObjectSlotUsed(playerid, objectslot)) RemovePlayerAttachedObject(playerid, objectslot);
  141. }
  142. }
  143. for (new i; i <= 5; i++) if (IsPlayerAttachedObjectSlotUsed(playerid, i))
  144. {
  145. count = 0;
  146.  
  147. for (new j = 22; j <= 38; j++) if (PlayerHasWeapon(playerid, j) && GetWeaponObjectSlot(j) == i)
  148. count++;
  149.  
  150. if (!count) RemovePlayerAttachedObject(playerid, i);
  151. }
  152. WeaponTick[playerid] = NetStats_GetConnectedTime(playerid);
  153. }
  154. return 1;
  155. }
  156.  
  157. public OnPlayerConnect(playerid)
  158. {
  159. new string[70], name[MAX_PLAYER_NAME];
  160.  
  161. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  162.  
  163. for (new i; i < 17; i++)
  164. {
  165. WeaponSettings[playerid][i][Position][0] = -0.116;
  166. WeaponSettings[playerid][i][Position][1] = 0.189;
  167. WeaponSettings[playerid][i][Position][2] = 0.088;
  168. WeaponSettings[playerid][i][Position][3] = 0.0;
  169. WeaponSettings[playerid][i][Position][4] = 44.5;
  170. WeaponSettings[playerid][i][Position][5] = 0.0;
  171. WeaponSettings[playerid][i][Bone] = 1;
  172. WeaponSettings[playerid][i][Hidden] = false;
  173. }
  174. WeaponTick[playerid] = 0;
  175. EditingWeapon[playerid] = 0;
  176.  
  177. mysql_format(database, string, sizeof(string), "SELECT * FROM weaponsettings WHERE Name = '%s'", name);
  178. mysql_tquery(database, string, "OnWeaponsLoaded", "d", playerid);
  179. return 1;
  180. }
  181.  
  182. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  183. {
  184. if (dialogid == DIALOG_EDIT_BONE)
  185. {
  186. if (response)
  187. {
  188. new weaponid = EditingWeapon[playerid], weaponname[18], name[MAX_PLAYER_NAME], string[150];
  189.  
  190. GetWeaponName(weaponid, weaponname, sizeof(weaponname));
  191. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  192.  
  193. WeaponSettings[playerid][weaponid - 22][Bone] = listitem + 1;
  194.  
  195. format(string, sizeof(string), "You have successfully changed the bone of your %s.", weaponname);
  196. SendClientMessage(playerid, -1, string);
  197.  
  198. mysql_format(database, string, sizeof(string), "INSERT INTO weaponsettings (Name, WeaponID, Bone) VALUES ('%s', %d, %d) ON DUPLICATE KEY UPDATE Bone = VALUES(Bone)", name, weaponid, listitem + 1);
  199. mysql_tquery(database, string);
  200. }
  201. EditingWeapon[playerid] = 0;
  202. return 1;
  203. }
  204. return 0;
  205. }
  206.  
  207. public OnPlayerEditAttachedObject(playerid, response, index, modelid, boneid, Float:fOffsetX, Float:fOffsetY, Float:fOffsetZ, Float:fRotX, Float:fRotY, Float:fRotZ, Float:fScaleX, Float:fScaleY, Float:fScaleZ)
  208. {
  209. new weaponid = EditingWeapon[playerid];
  210.  
  211. if (weaponid)
  212. {
  213. if (response)
  214. {
  215. new enum_index = weaponid - 22, weaponname[18], name[MAX_PLAYER_NAME], string[340];
  216.  
  217. GetWeaponName(weaponid, weaponname, sizeof(weaponname));
  218. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  219.  
  220. WeaponSettings[playerid][enum_index][Position][0] = fOffsetX;
  221. WeaponSettings[playerid][enum_index][Position][1] = fOffsetY;
  222. WeaponSettings[playerid][enum_index][Position][2] = fOffsetZ;
  223. WeaponSettings[playerid][enum_index][Position][3] = fRotX;
  224. WeaponSettings[playerid][enum_index][Position][4] = fRotY;
  225. WeaponSettings[playerid][enum_index][Position][5] = fRotZ;
  226.  
  227. RemovePlayerAttachedObject(playerid, GetWeaponObjectSlot(weaponid));
  228. SetPlayerAttachedObject(playerid, GetWeaponObjectSlot(weaponid), GetWeaponModel(weaponid), WeaponSettings[playerid][enum_index][Bone], fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, 1.0, 1.0, 1.0);
  229.  
  230. format(string, sizeof(string), "You have successfully adjusted the position of your %s.", weaponname);
  231. SendClientMessage(playerid, -1, string);
  232.  
  233. mysql_format(database, string, sizeof(string), "INSERT INTO weaponsettings (Name, WeaponID, PosX, PosY, PosZ, RotX, RotY, RotZ) VALUES ('%s', %d, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f) ON DUPLICATE KEY UPDATE PosX = VALUES(PosX), PosY = VALUES(PosY), PosZ = VALUES(PosZ), RotX = VALUES(RotX), RotY = VALUES(RotY), RotZ = VALUES(RotZ)", name, weaponid, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ);
  234. mysql_tquery(database, string);
  235. }
  236. EditingWeapon[playerid] = 0;
  237. }
  238. return 1;
  239. }
  240.  
  241. public OnPlayerCommandText(playerid, cmdtext[])
  242. {
  243. new cmd[24], params[64], len = strlen(cmdtext);
  244.  
  245. for (new i; i < len; i++) if (cmdtext[i] == ' ')
  246. {
  247. strmid(cmd, cmdtext, 0, i);
  248. strcat(params, cmdtext[i + 1]);
  249. break;
  250. }
  251. if (isnull(cmd)) strcat(cmd, cmdtext);
  252.  
  253. if (!strcmp(cmd, "/weapon", true))
  254. {
  255. new weaponid = GetPlayerWeapon(playerid);
  256.  
  257. if (!weaponid)
  258. return SendClientMessage(playerid, -1, "You are not holding a weapon.");
  259.  
  260. if (!IsWeaponWearable(weaponid))
  261. return SendClientMessage(playerid, -1, "This weapon cannot be edited.");
  262.  
  263. if (isnull(params))
  264. return SendClientMessage(playerid, -1, "USAGE: /weapon [adjustpos/bone/hide]");
  265.  
  266. if (!strcmp(params, "adjustpos", true))
  267. {
  268. if (EditingWeapon[playerid])
  269. return SendClientMessage(playerid, -1, "You are already editing a weapon.");
  270.  
  271. if (WeaponSettings[playerid][weaponid - 22][Hidden])
  272. return SendClientMessage(playerid, -1, "You cannot adjust a hidden weapon.");
  273.  
  274. new index = weaponid - 22;
  275.  
  276. SetPlayerArmedWeapon(playerid, 0);
  277.  
  278. SetPlayerAttachedObject(playerid, GetWeaponObjectSlot(weaponid), GetWeaponModel(weaponid), WeaponSettings[playerid][index][Bone], WeaponSettings[playerid][index][Position][0], WeaponSettings[playerid][index][Position][1], WeaponSettings[playerid][index][Position][2], WeaponSettings[playerid][index][Position][3], WeaponSettings[playerid][index][Position][4], WeaponSettings[playerid][index][Position][5], 1.0, 1.0, 1.0);
  279. EditAttachedObject(playerid, GetWeaponObjectSlot(weaponid));
  280.  
  281. EditingWeapon[playerid] = weaponid;
  282. }
  283. else if (!strcmp(params, "bone", true))
  284. {
  285. if (EditingWeapon[playerid])
  286. return SendClientMessage(playerid, -1, "You are already editing a weapon.");
  287.  
  288. ShowPlayerDialog(playerid, DIALOG_EDIT_BONE, DIALOG_STYLE_LIST, "Bone", "Spine\nHead\nLeft upper arm\nRight upper arm\nLeft hand\nRight hand\nLeft thigh\nRight thigh\nLeft foot\nRight foot\nRight calf\nLeft calf\nLeft forearm\nRight forearm\nLeft shoulder\nRight shoulder\nNeck\nJaw", "Choose", "Cancel");
  289. EditingWeapon[playerid] = weaponid;
  290. }
  291. else if (!strcmp(params, "hide", true))
  292. {
  293. if (EditingWeapon[playerid])
  294. return SendClientMessage(playerid, -1, "You cannot hide a weapon while you are editing it.");
  295.  
  296. if (!IsWeaponHideable(weaponid))
  297. return SendClientMessage(playerid, -1, "This weapon cannot be hidden.");
  298.  
  299. new index = weaponid - 22, weaponname[18], name[MAX_PLAYER_NAME], string[150];
  300.  
  301. GetWeaponName(weaponid, weaponname, sizeof(weaponname));
  302. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  303.  
  304. if (WeaponSettings[playerid][index][Hidden])
  305. {
  306. format(string, sizeof(string), "You have set your %s to show.", weaponname);
  307. WeaponSettings[playerid][index][Hidden] = false;
  308. }
  309. else
  310. {
  311. if (IsPlayerAttachedObjectSlotUsed(playerid, GetWeaponObjectSlot(weaponid)))
  312. RemovePlayerAttachedObject(playerid, GetWeaponObjectSlot(weaponid));
  313.  
  314. format(string, sizeof(string), "You have set your %s not to show.", weaponname);
  315. WeaponSettings[playerid][index][Hidden] = true;
  316. }
  317. SendClientMessage(playerid, -1, string);
  318.  
  319. mysql_format(database, string, sizeof(string), "INSERT INTO weaponsettings (Name, WeaponID, Hidden) VALUES ('%s', %d, %d) ON DUPLICATE KEY UPDATE Hidden = VALUES(Hidden)", name, weaponid, WeaponSettings[playerid][index][Hidden]);
  320. mysql_tquery(database, string);
  321. }
  322. else SendClientMessage(playerid, -1, "You have specified an invalid option.");
  323. return 1;
  324. }
  325. return 0;
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement