Guest User

Untitled

a guest
Dec 26th, 2018
499
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.70 KB | None | 0 0
  1. //Weapons on body system by GoldenLion
  2. //Credits to Gammix for dini2 and Y_Less & Emmet_ for sscanf2
  3.  
  4. #define FILTERSCRIPT
  5.  
  6. #include <a_samp>
  7. #include <sscanf2>
  8. #include <dini2>
  9.  
  10. #undef MAX_PLAYERS
  11. #define MAX_PLAYERS 100
  12.  
  13. #define DIALOG_EDIT_BONE 5000
  14. #define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
  15.  
  16. enum weaponSettings
  17. {
  18. Float:Position[6],
  19. Bone,
  20. Hidden
  21. }
  22. new WeaponSettings[MAX_PLAYERS][17][weaponSettings], WeaponTick[MAX_PLAYERS], EditingWeapon[MAX_PLAYERS];
  23.  
  24. GetWeaponObjectSlot(weaponid)
  25. {
  26. new objectslot;
  27.  
  28. switch (weaponid)
  29. {
  30. case 22..24: objectslot = 0;
  31. case 25..27: objectslot = 1;
  32. case 28, 29, 32: objectslot = 2;
  33. case 30, 31: objectslot = 3;
  34. case 33, 34: objectslot = 4;
  35. case 35..38: objectslot = 5;
  36. }
  37. return objectslot;
  38. }
  39.  
  40. GetWeaponModel(weaponid) //Will only return the model of wearable weapons (22-38)
  41. {
  42. new model;
  43.  
  44. switch(weaponid)
  45. {
  46. case 22..29: model = 324 + weaponid;
  47. case 30: model = 355;
  48. case 31: model = 356;
  49. case 32: model = 372;
  50. case 33..38: model = 324 + weaponid;
  51. }
  52. return model;
  53. }
  54.  
  55. PlayerHasWeapon(playerid, weaponid)
  56. {
  57. new weapon, ammo;
  58.  
  59. for (new i; i < 13; i++)
  60. {
  61. GetPlayerWeaponData(playerid, i, weapon, ammo);
  62. if (weapon == weaponid && ammo) return 1;
  63. }
  64. return 0;
  65. }
  66.  
  67. IsWeaponWearable(weaponid)
  68. return (weaponid >= 22 && weaponid <= 38);
  69.  
  70. IsWeaponHideable(weaponid)
  71. return (weaponid >= 22 && weaponid <= 24 || weaponid == 28 || weaponid == 32);
  72.  
  73. SaveSettings(playerid)
  74. {
  75. new file[48], key[10], string[48], name[MAX_PLAYER_NAME];
  76.  
  77. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  78. format(file, sizeof(file), "Weapon Settings/%s.ini", name);
  79.  
  80. if (!dini_Exists(file))
  81. dini_Create(file);
  82.  
  83. for (new i, weaponid; i < 17; i++)
  84. {
  85. weaponid = i + 22;
  86.  
  87. format(key, sizeof(key), "Weapon%d", weaponid);
  88. format(string, sizeof(string), "%.3f|%.3f|%.3f|%.3f|%.3f|%.3f|%d|%d", WeaponSettings[playerid][i][Position][0], WeaponSettings[playerid][i][Position][1], WeaponSettings[playerid][i][Position][2], WeaponSettings[playerid][i][Position][3],
  89. WeaponSettings[playerid][i][Position][4], WeaponSettings[playerid][i][Position][5], WeaponSettings[playerid][i][Bone], WeaponSettings[playerid][i][Hidden]);
  90.  
  91. dini_Set(file, key, string);
  92. }
  93. }
  94.  
  95. public OnPlayerUpdate(playerid)
  96. {
  97. if (NetStats_GetConnectedTime(playerid) - WeaponTick[playerid] >= 250)
  98. {
  99. new weaponid, ammo, objectslot, count, index;
  100.  
  101. for (new i = 2; i <= 7; i++) //Loop only through the slots that may contain the wearable weapons
  102. {
  103. GetPlayerWeaponData(playerid, i, weaponid, ammo);
  104. index = weaponid - 22;
  105.  
  106. if (weaponid && ammo && !WeaponSettings[playerid][index][Hidden] && IsWeaponWearable(weaponid) && EditingWeapon[playerid] != weaponid)
  107. {
  108. objectslot = GetWeaponObjectSlot(weaponid);
  109.  
  110. if (GetPlayerWeapon(playerid) != weaponid)
  111. 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);
  112.  
  113. else if (IsPlayerAttachedObjectSlotUsed(playerid, objectslot)) RemovePlayerAttachedObject(playerid, objectslot);
  114. }
  115. }
  116. for (new i; i <= 5; i++) if (IsPlayerAttachedObjectSlotUsed(playerid, i))
  117. {
  118. count = 0;
  119.  
  120. for (new j = 22; j <= 38; j++) if (PlayerHasWeapon(playerid, j) && GetWeaponObjectSlot(j) == i)
  121. count++;
  122.  
  123. if (!count) RemovePlayerAttachedObject(playerid, i);
  124. }
  125. WeaponTick[playerid] = NetStats_GetConnectedTime(playerid);
  126. }
  127. return 1;
  128. }
  129.  
  130. public OnPlayerConnect(playerid)
  131. {
  132. new file[48], key[10], string[48], name[MAX_PLAYER_NAME];
  133.  
  134. for (new i; i < 17; i++)
  135. {
  136. WeaponSettings[playerid][i][Position][0] = -0.116;
  137. WeaponSettings[playerid][i][Position][1] = 0.189;
  138. WeaponSettings[playerid][i][Position][2] = 0.088;
  139. WeaponSettings[playerid][i][Position][3] = 0.0;
  140. WeaponSettings[playerid][i][Position][4] = 44.5;
  141. WeaponSettings[playerid][i][Position][5] = 0.0;
  142. WeaponSettings[playerid][i][Bone] = 1;
  143. WeaponSettings[playerid][i][Hidden] = false;
  144. }
  145. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  146. format(file, sizeof(file), "Weapon Settings/%s.ini", name);
  147.  
  148. if (dini_Exists(file))
  149. {
  150. for (new i = 22, enum_index; i <= 38; i++)
  151. {
  152. string[0] = EOS;
  153. enum_index = i - 22;
  154.  
  155. format(key, sizeof(key), "Weapon%d", i);
  156. strcat(string, dini_Get(file, key));
  157.  
  158. sscanf(string, "p<|>ffffffdd", WeaponSettings[playerid][enum_index][Position][0], WeaponSettings[playerid][enum_index][Position][1], WeaponSettings[playerid][enum_index][Position][2], WeaponSettings[playerid][enum_index][Position][3],
  159. WeaponSettings[playerid][enum_index][Position][4], WeaponSettings[playerid][enum_index][Position][5], WeaponSettings[playerid][enum_index][Bone], WeaponSettings[playerid][enum_index][Hidden]);
  160. }
  161. }
  162. WeaponTick[playerid] = 0;
  163. EditingWeapon[playerid] = 0;
  164. return 1;
  165. }
  166.  
  167. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  168. {
  169. if (dialogid == DIALOG_EDIT_BONE)
  170. {
  171. if (response)
  172. {
  173. new weaponid = EditingWeapon[playerid], weaponname[18], name[MAX_PLAYER_NAME], string[150];
  174.  
  175. GetWeaponName(weaponid, weaponname, sizeof(weaponname));
  176. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  177.  
  178. WeaponSettings[playerid][weaponid - 22][Bone] = listitem + 1;
  179.  
  180. format(string, sizeof(string), "You have successfully changed the bone of your %s.", weaponname);
  181. SendClientMessage(playerid, -1, string);
  182.  
  183. SaveSettings(playerid);
  184. }
  185. EditingWeapon[playerid] = 0;
  186. return 1;
  187. }
  188. return 0;
  189. }
  190.  
  191. 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)
  192. {
  193. new weaponid = EditingWeapon[playerid];
  194.  
  195. if (weaponid)
  196. {
  197. if (response)
  198. {
  199. new enum_index = weaponid - 22, weaponname[18], name[MAX_PLAYER_NAME], string[340];
  200.  
  201. GetWeaponName(weaponid, weaponname, sizeof(weaponname));
  202. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  203.  
  204. WeaponSettings[playerid][enum_index][Position][0] = fOffsetX;
  205. WeaponSettings[playerid][enum_index][Position][1] = fOffsetY;
  206. WeaponSettings[playerid][enum_index][Position][2] = fOffsetZ;
  207. WeaponSettings[playerid][enum_index][Position][3] = fRotX;
  208. WeaponSettings[playerid][enum_index][Position][4] = fRotY;
  209. WeaponSettings[playerid][enum_index][Position][5] = fRotZ;
  210.  
  211. RemovePlayerAttachedObject(playerid, GetWeaponObjectSlot(weaponid));
  212. SetPlayerAttachedObject(playerid, GetWeaponObjectSlot(weaponid), GetWeaponModel(weaponid), WeaponSettings[playerid][enum_index][Bone], fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, 1.0, 1.0, 1.0);
  213.  
  214. format(string, sizeof(string), "You have successfully adjusted the position of your %s.", weaponname);
  215. SendClientMessage(playerid, -1, string);
  216.  
  217. SaveSettings(playerid);
  218. }
  219. EditingWeapon[playerid] = 0;
  220. }
  221. return 1;
  222. }
  223.  
  224. public OnPlayerCommandText(playerid, cmdtext[])
  225. {
  226. new cmd[24], params[64], len = strlen(cmdtext);
  227.  
  228. for (new i; i < len; i++) if (cmdtext[i] == ' ')
  229. {
  230. strmid(cmd, cmdtext, 0, i);
  231. strcat(params, cmdtext[i + 1]);
  232. break;
  233. }
  234. if (isnull(cmd)) strcat(cmd, cmdtext);
  235.  
  236. if (!strcmp(cmd, "/weapon", true))
  237. {
  238. new weaponid = GetPlayerWeapon(playerid);
  239.  
  240. if (!weaponid)
  241. return SendClientMessage(playerid, -1, "You are not holding a weapon.");
  242.  
  243. if (!IsWeaponWearable(weaponid))
  244. return SendClientMessage(playerid, -1, "This weapon cannot be edited.");
  245.  
  246. if (isnull(params))
  247. return SendClientMessage(playerid, -1, "USAGE: /weapon [adjustpos/bone/hide]");
  248.  
  249. if (!strcmp(params, "adjustpos", true))
  250. {
  251. if (EditingWeapon[playerid])
  252. return SendClientMessage(playerid, -1, "You are already editing a weapon.");
  253.  
  254. if (WeaponSettings[playerid][weaponid - 22][Hidden])
  255. return SendClientMessage(playerid, -1, "You cannot adjust a hidden weapon.");
  256.  
  257. new index = weaponid - 22;
  258.  
  259. SetPlayerArmedWeapon(playerid, 0);
  260.  
  261. 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);
  262. EditAttachedObject(playerid, GetWeaponObjectSlot(weaponid));
  263.  
  264. EditingWeapon[playerid] = weaponid;
  265. }
  266. else if (!strcmp(params, "bone", true))
  267. {
  268. if (EditingWeapon[playerid])
  269. return SendClientMessage(playerid, -1, "You are already editing a weapon.");
  270.  
  271. 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");
  272. EditingWeapon[playerid] = weaponid;
  273. }
  274. else if (!strcmp(params, "hide", true))
  275. {
  276. if (EditingWeapon[playerid])
  277. return SendClientMessage(playerid, -1, "You cannot hide a weapon while you are editing it.");
  278.  
  279. if (!IsWeaponHideable(weaponid))
  280. return SendClientMessage(playerid, -1, "This weapon cannot be hidden.");
  281.  
  282. new index = weaponid - 22, weaponname[18], name[MAX_PLAYER_NAME], string[150];
  283.  
  284. GetWeaponName(weaponid, weaponname, sizeof(weaponname));
  285. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  286.  
  287. if (WeaponSettings[playerid][index][Hidden])
  288. {
  289. format(string, sizeof(string), "You have set your %s to show.", weaponname);
  290. WeaponSettings[playerid][index][Hidden] = false;
  291. }
  292. else
  293. {
  294. if (IsPlayerAttachedObjectSlotUsed(playerid, GetWeaponObjectSlot(weaponid)))
  295. RemovePlayerAttachedObject(playerid, GetWeaponObjectSlot(weaponid));
  296.  
  297. format(string, sizeof(string), "You have set your %s not to show.", weaponname);
  298. WeaponSettings[playerid][index][Hidden] = true;
  299. }
  300. SendClientMessage(playerid, -1, string);
  301. SaveSettings(playerid);
  302. }
  303. else SendClientMessage(playerid, -1, "You have specified an invalid option.");
  304. return 1;
  305. }
  306. return 0;
  307. }
Add Comment
Please, Sign In to add comment