Advertisement
Guest User

Untitled

a guest
Aug 5th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.08 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <fakemeta_util>
  3. #include <hamsandwich>
  4.  
  5. #define PLUGIN "Tornado"
  6. #define VERSION "1.0"
  7. #define AUTHOR "GenDa"
  8.  
  9. #define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
  10.  
  11.  
  12. #define m_rgpPlayerItems_CWeaponBox 34
  13.  
  14.  
  15. #define m_pPlayer 41
  16. #define m_pNext 42
  17. #define m_iId 43
  18.  
  19.  
  20. #define m_flNextPrimaryAttack 46
  21. #define m_flNextSecondaryAttack 47
  22. #define m_flTimeWeaponIdle 48
  23. #define m_iPrimaryAmmoType 49
  24. #define m_iClip 51
  25. #define m_fInReload 54
  26. #define m_iWeaponState 74
  27. #define m_flNextReload 75
  28.  
  29.  
  30. #define m_flNextAttack 83
  31.  
  32.  
  33. #define m_rpgPlayerItems 367
  34. #define m_pActiveItem 373
  35. #define m_rgAmmo 376
  36. #define m_szAnimExtention 492
  37.  
  38. #define ANIM_IDLE 2
  39. #define ANIM_ATTACK 5
  40. #define ANIM_ATTACK_END 11
  41. #define ANIM_ATTACK_EMPTY 8
  42. #define ANIM_RELOAD 14
  43. #define ANIM_DRAW 19
  44.  
  45. #define ANIM_IDLE_TIME 6.04
  46. #define ANIM_RELOAD_TIME 3.54
  47. #define ANIM_DRAW_TIME 1.37
  48.  
  49. #define WEAPON_KEY 40
  50. #define WEAPON_TORN "weapon_aug"
  51. #define WEAPON_NEW "weapon_tornado"
  52. #define WEAPON_LASER "sprites/tornado-laser.spr"
  53.  
  54. #define WEAPON_ITEM_NAME "Tornado"
  55. #define WEAPON_ITEM_COST 0
  56.  
  57. #define WEAPON_MODEL_V "models/v_tornado.mdl"
  58. #define WEAPON_MODEL_P "models/p_tornado.mdl"
  59. #define WEAPON_MODEL_W "models/w_tornado.mdl"
  60. #define WEAPON_SOUND_S "weapons/tornado-3.wav"
  61. #define WEAPON_SOUND_E "weapons/tornado-shoot_end.wav"
  62. #define WEAPON_BODY 0
  63.  
  64. #define WEAPON_CLIP 70
  65. #define WEAPON_AMMO 210
  66. #define WEAPON_RATE 0.09
  67. #define WEAPON_RECOIL 0.3
  68. #define WEAPON_DAMAGE 1.1
  69.  
  70. new g_AllocString_V, g_AllocString_P, g_AllocString_E
  71. new HamHook:g_fw_TraceAttack[4]
  72. new g_iMsgID_Weaponlist
  73. new iSpriteIndexTrail
  74. public plugin_init() {
  75. register_plugin(PLUGIN, VERSION, AUTHOR);
  76. RegisterHam(Ham_Item_Deploy, WEAPON_TORN, "fw_Item_Deploy_Post", 1);
  77. RegisterHam(Ham_Item_Holster, WEAPON_TORN, "fw_Item_Holster_Post", 1);
  78. RegisterHam(Ham_Item_PostFrame, WEAPON_TORN, "fw_Item_PostFrame");
  79. RegisterHam(Ham_Item_AddToPlayer, WEAPON_TORN, "fw_Item_AddToPlayer_Post", 1);
  80.  
  81. RegisterHam(Ham_Weapon_Reload, WEAPON_TORN, "fw_Weapon_Reload");
  82. RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_TORN, "fw_Weapon_WeaponIdle");
  83. RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_TORN, "fw_Weapon_PrimaryAttack");
  84.  
  85. g_fw_TraceAttack[0] = RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack");
  86. g_fw_TraceAttack[1] = RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack");
  87. g_fw_TraceAttack[2] = RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack");
  88. g_fw_TraceAttack[3] = RegisterHam(Ham_TraceAttack, "hostage_entity", "fw_TraceAttack");
  89. fm_ham_hook(false);
  90. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1);
  91. register_forward(FM_PlaybackEvent, "fw_PlaybackEvent");
  92. register_forward(FM_SetModel, "fw_SetModel");
  93. g_iMsgID_Weaponlist = get_user_msgid("WeaponList");
  94. register_clcmd(WEAPON_NEW, "HookSelect");
  95. }
  96. public plugin_precache() {
  97. g_AllocString_V = engfunc(EngFunc_AllocString, WEAPON_MODEL_V);
  98. g_AllocString_P = engfunc(EngFunc_AllocString, WEAPON_MODEL_P);
  99. g_AllocString_E = engfunc(EngFunc_AllocString, WEAPON_TORN);
  100. iSpriteIndexTrail = engfunc(EngFunc_PrecacheModel, WEAPON_LASER);
  101. engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_V);
  102. engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_P);
  103. engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_W);
  104.  
  105. new const WPN_SOUND[][] = {
  106. "weapons/tornado_clipin.wav",
  107. "weapons/tornado_clipout.wav",
  108. "weapons/tornado_draw.wav"
  109. }
  110. for(new i = 0; i < sizeof WPN_SOUND;i++) engfunc(EngFunc_PrecacheSound, WPN_SOUND[i]);
  111. engfunc(EngFunc_PrecacheSound, WEAPON_SOUND_S);
  112. engfunc(EngFunc_PrecacheSound, WEAPON_SOUND_E);
  113. precache_generic("sprites/weapon_tornado.txt")
  114. precache_generic("sprites/640hud149.spr")
  115. precache_generic("sprites/640hud17.spr")
  116. // Get
  117. register_clcmd("tornado", "give_weapon")
  118. }
  119. public plugin_natives() {
  120. register_native("tornado", "give_weapon", 1);
  121. }
  122. public HookSelect(iPlayer) {
  123. engclient_cmd(iPlayer, WEAPON_TORN);
  124. return PLUGIN_HANDLED;
  125. }
  126. public give_weapon(iPlayer) {
  127. static iEnt; iEnt = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E);
  128. if(iEnt <= 0) return 0;
  129. set_pev(iEnt, pev_spawnflags, SF_NORESPAWN);
  130. set_pev(iEnt, pev_impulse, WEAPON_KEY);
  131. ExecuteHam(Ham_Spawn, iEnt);
  132. UTIL_DropWeapon(iPlayer, 1);
  133. if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iEnt)) {
  134. engfunc(EngFunc_RemoveEntity, iEnt);
  135. return 0;
  136. }
  137. ExecuteHamB(Ham_Item_AttachToPlayer, iEnt, iPlayer);
  138. set_pdata_int(iEnt, m_iClip, WEAPON_CLIP, 4);
  139. new iAmmoType = m_rgAmmo +get_pdata_int(iEnt, m_iPrimaryAmmoType, 4);
  140. if(get_pdata_int(iPlayer, m_rgAmmo, 5) < WEAPON_AMMO)
  141. set_pdata_int(iPlayer, iAmmoType, WEAPON_AMMO, 5);
  142. emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  143. return 1;
  144. }
  145. public fw_Item_Deploy_Post(iItem) {
  146. if(!CustomItem(iItem)) return;
  147. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
  148. set_pev_string(iPlayer, pev_viewmodel2, g_AllocString_V);
  149. set_pev_string(iPlayer, pev_weaponmodel2, g_AllocString_P);
  150. set_pdata_string(iPlayer, m_szAnimExtention * 4, "m249", -1, 20);
  151. UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW);
  152. set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME, 5);
  153. set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME, 4);
  154. set_pdata_float(iItem, m_flNextReload, 0.0, 4);
  155. set_pdata_int(iItem, m_iWeaponState, 0, 4);
  156. }
  157. public fw_Item_Holster_Post(iItem) {
  158. if(!CustomItem(iItem)) return HAM_IGNORED;
  159. new iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
  160. emit_sound(iPlayer, CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
  161. return HAM_IGNORED;
  162. }
  163. public fw_Item_PostFrame(iItem) {
  164. if(!CustomItem(iItem)) return HAM_IGNORED;
  165. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
  166. if(get_pdata_int(iItem, m_fInReload, 4) == 1) {
  167. static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
  168. static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
  169. static iAmmo; iAmmo = get_pdata_int(iPlayer, iAmmoType, 5);
  170. static j; j = min(WEAPON_CLIP - iClip, iAmmo);
  171. set_pdata_int(iItem, m_iClip, iClip+j, 4);
  172. set_pdata_int(iPlayer, iAmmoType, iAmmo-j, 5);
  173. set_pdata_int(iItem, m_fInReload, 0, 4);
  174. }
  175. if(!(pev(iPlayer, pev_oldbuttons) & IN_ATTACK)) {
  176. if(get_pdata_int(iItem, m_iWeaponState, 4) == 1) {
  177. set_pdata_int(iItem, m_iWeaponState, 0, 4);
  178. emit_sound(iPlayer, CHAN_WEAPON, WEAPON_SOUND_E, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  179. UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_END);
  180. set_pdata_float(iItem, m_flTimeWeaponIdle, 0.7, 4);
  181. set_pdata_float(iItem, m_flNextReload, 0.0, 4);
  182. set_pdata_float(iPlayer, m_flNextAttack, 0.7, 5);
  183. }
  184. }
  185. return HAM_IGNORED;
  186. }
  187. public fw_Item_AddToPlayer_Post(iItem, iPlayer) {
  188. switch(pev(iItem, pev_impulse)) {
  189. case WEAPON_KEY: s_weaponlist(iPlayer, true);
  190. case 0: s_weaponlist(iPlayer, false);
  191. }
  192. }
  193. public fw_Weapon_Reload(iItem) {
  194. if(!CustomItem(iItem)) return HAM_IGNORED;
  195. static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
  196. if(iClip >= WEAPON_CLIP) return HAM_SUPERCEDE;
  197. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
  198. static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
  199. if(get_pdata_int(iPlayer, iAmmoType, 5) <= 0) return HAM_SUPERCEDE
  200.  
  201. set_pdata_int(iItem, m_iClip, 0, 4);
  202. ExecuteHam(Ham_Weapon_Reload, iItem);
  203. set_pdata_int(iItem, m_iClip, iClip, 4);
  204. set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME, 4);
  205. set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME, 4);
  206. set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME, 4);
  207. set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME, 5);
  208.  
  209. UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD);
  210. return HAM_SUPERCEDE;
  211. }
  212. public fw_Weapon_WeaponIdle(iItem) {
  213. if(!CustomItem(iItem) || get_pdata_float(iItem, m_flTimeWeaponIdle, 4) > 0.0) return HAM_IGNORED;
  214. UTIL_SendWeaponAnim(get_pdata_cbase(iItem, m_pPlayer, 4), ANIM_IDLE);
  215. set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME, 4);
  216. return HAM_SUPERCEDE;
  217. }
  218. public fw_Weapon_PrimaryAttack(iItem) {
  219. if(!CustomItem(iItem)) return HAM_IGNORED;
  220. static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
  221. if(get_pdata_int(iItem, m_iClip, 4) == 0) {
  222. ExecuteHam(Ham_Weapon_PlayEmptySound, iItem);
  223. set_pdata_float(iItem, m_flNextPrimaryAttack, 0.2, 4);
  224. if(pev(iPlayer, pev_weaponanim) != ANIM_ATTACK_EMPTY) {
  225. UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_EMPTY);
  226. }
  227. return HAM_SUPERCEDE;
  228. }
  229. static fw_TraceLine; fw_TraceLine = register_forward(FM_TraceLine, "fw_TraceLine_Post", 1);
  230. fm_ham_hook(true);
  231. state FireBullets: Enabled;
  232. ExecuteHam(Ham_Weapon_PrimaryAttack, iItem);
  233. state FireBullets: Disabled;
  234. unregister_forward(FM_TraceLine, fw_TraceLine, 1);
  235. fm_ham_hook(false);
  236. static Float:vecPunchangle[3];
  237. static Float:vecOrigin[3]; fm_get_aim_origin(iPlayer, vecOrigin);
  238.  
  239. pev(iPlayer, pev_punchangle, vecPunchangle);
  240. vecPunchangle[0] *= WEAPON_RECOIL;
  241. vecPunchangle[1] *= WEAPON_RECOIL;
  242. vecPunchangle[2] *= WEAPON_RECOIL;
  243. set_pev(iPlayer, pev_punchangle, vecPunchangle);
  244. if(get_pdata_float(iItem, m_flNextReload, 4) <= get_gametime()) {
  245. emit_sound(iPlayer, CHAN_WEAPON, WEAPON_SOUND_S, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  246. set_pdata_float(iItem, m_flNextReload, get_gametime() + 10.0, 4);
  247. }
  248. if(pev(iPlayer, pev_weaponanim) != ANIM_ATTACK) {
  249. UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK);
  250. }
  251.  
  252. message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
  253. write_byte(TE_BEAMENTPOINT);
  254. write_short(iPlayer | 0x1000);
  255. engfunc(EngFunc_WriteCoord, vecOrigin[0]);
  256. engfunc(EngFunc_WriteCoord, vecOrigin[1]);
  257. engfunc(EngFunc_WriteCoord, vecOrigin[2]);
  258. write_short(iSpriteIndexTrail);
  259. write_byte(0); // framestart
  260. write_byte(1); // framerate
  261. write_byte(2); // life
  262. write_byte(10); // width
  263. write_byte(3); // noise
  264. write_byte(0); // red
  265. write_byte(128); // green
  266. write_byte(255); // blue
  267. write_byte(200); // brightness
  268. write_byte(10); // speed
  269. message_end();
  270.  
  271. set_pdata_int(iItem, m_iWeaponState, 1, 4);
  272. set_pdata_float(iItem, m_flNextPrimaryAttack, WEAPON_RATE, 4);
  273. set_pdata_float(iItem, m_flTimeWeaponIdle, 0.5, 4);
  274.  
  275. return HAM_SUPERCEDE;
  276. }
  277. public fw_PlaybackEvent() <FireBullets: Enabled> { return FMRES_SUPERCEDE; }
  278. public fw_PlaybackEvent() <FireBullets: Disabled> { return FMRES_IGNORED; }
  279. public fw_PlaybackEvent() <> { return FMRES_IGNORED; }
  280. public fw_TraceAttack(iVictim, iAttacker, Float:flDamage) {
  281. if(!is_user_connected(iAttacker)) return;
  282. static iItem; iItem = get_pdata_cbase(iAttacker, m_pActiveItem, 5);
  283. if(iItem <= 0 || !CustomItem(iItem)) return;
  284. SetHamParamFloat(3, flDamage * WEAPON_DAMAGE);
  285. }
  286. public fw_UpdateClientData_Post(iPlayer, SendWeapons, CD_Handle) {
  287. if(get_cd(CD_Handle, CD_DeadFlag) != DEAD_NO) return;
  288. static iItem; iItem = get_pdata_cbase(iPlayer, m_pActiveItem, 5);
  289. if(iItem <= 0 || !CustomItem(iItem)) return;
  290. set_cd(CD_Handle, CD_flNextAttack, 999999.0);
  291. }
  292. public fw_SetModel(iEnt) {
  293. static i, szClassname[32], iItem;
  294. pev(iEnt, pev_classname, szClassname, 31);
  295. if(!equal(szClassname, "weaponbox")) return FMRES_IGNORED;
  296. for(i = 0; i < 6; i++) {
  297. iItem = get_pdata_cbase(iEnt, m_rgpPlayerItems_CWeaponBox + i, 4);
  298. if(iItem > 0 && CustomItem(iItem)) {
  299. engfunc(EngFunc_SetModel, iEnt, WEAPON_MODEL_W);
  300. set_pev(iEnt, pev_body, WEAPON_BODY);
  301. return FMRES_SUPERCEDE;
  302. }
  303. }
  304. return FMRES_IGNORED;
  305. }
  306. public fw_TraceLine_Post(const Float:flOrigin1[3], const Float:flOrigin2[3], iFrag, iIgnore, tr) {
  307. if(iFrag & IGNORE_MONSTERS) return FMRES_IGNORED;
  308. static pHit; pHit = get_tr2(tr, TR_pHit);
  309. if(pHit > 0) {
  310. if(pev(pHit, pev_solid) != SOLID_BSP) return FMRES_IGNORED;
  311. }
  312. return FMRES_IGNORED;
  313. }
  314. public fm_ham_hook(bool:on) {
  315. if(on) {
  316. EnableHamForward(g_fw_TraceAttack[0]);
  317. EnableHamForward(g_fw_TraceAttack[1]);
  318. EnableHamForward(g_fw_TraceAttack[2]);
  319. EnableHamForward(g_fw_TraceAttack[3]);
  320. }
  321. else {
  322. DisableHamForward(g_fw_TraceAttack[0]);
  323. DisableHamForward(g_fw_TraceAttack[1]);
  324. DisableHamForward(g_fw_TraceAttack[2]);
  325. DisableHamForward(g_fw_TraceAttack[3]);
  326. }
  327. }
  328. stock UTIL_SendWeaponAnim(iPlayer, iSequence) {
  329. set_pev(iPlayer, pev_weaponanim, iSequence);
  330. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, iPlayer);
  331. write_byte(iSequence);
  332. write_byte(0);
  333. message_end();
  334. }
  335. stock UTIL_DropWeapon(iPlayer, iSlot) {
  336. static iEntity, iNext, szWeaponName[32];
  337. iEntity = get_pdata_cbase(iPlayer, m_rpgPlayerItems + iSlot, 5);
  338. if(iEntity > 0) {
  339. do{
  340. iNext = get_pdata_cbase(iEntity, m_pNext, 4)
  341. if(get_weaponname(get_pdata_int(iEntity, m_iId, 4), szWeaponName, 31)) {
  342. engclient_cmd(iPlayer, "drop", szWeaponName);
  343. }
  344. } while(( iEntity = iNext) > 0);
  345. }
  346. }
  347. // 4, 90, -1, -1, 0, 14,8, 0, // weapon_aug
  348. stock s_weaponlist(iPlayer, bool:on) {
  349. message_begin(MSG_ONE, g_iMsgID_Weaponlist, _, iPlayer);
  350. write_string(on ? WEAPON_NEW : WEAPON_TORN);
  351. write_byte(4);
  352. write_byte(on ? WEAPON_AMMO : 90);
  353. write_byte(-1);
  354. write_byte(-1);
  355. write_byte(0);
  356. write_byte(14);
  357. write_byte(8);
  358. write_byte(0);
  359. message_end();
  360. }
  361.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement