Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.74 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <hamsandwich>
  4. #include <engine>
  5. #include <cstrike>
  6. #include <fakemeta>
  7. #include <xs>
  8.  
  9. #define fm_create_entity(%1) engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, %1))
  10.  
  11. #define VERSION "1.0"
  12. #define AUTHOR "Sh0oT3R"
  13.  
  14. #define FIRERATE 0.2
  15. #define HITSD 0.7
  16. #define RELOADSPEED 5.0
  17. #define DAMAGE 250.0
  18. #define DAMAGE_MULTI 3.0
  19.  
  20. #define CSW_WPN CSW_FAMAS
  21. new const weapon[] = "weapon_famas"
  22.  
  23. new const spr_beam[] = "sprites/plasma/plasma_beam.spr"
  24. new const spr_exp[] = "sprites/plasma/plasma_exp.spr"
  25. new const spr_blood[] = "sprites/blood.spr"
  26. new const snd_fire[][] = { "cod_mod/plasma/plasma_fire.wav" }
  27. new const snd_reload[][] = { "cod_mod/plasma/plasma_reload.wav" }
  28. new const snd_hit[][] = { "cod_mod/plasma/plasma_hit.wav" }
  29.  
  30. new bool:g_HasRifle[33]
  31. new g_iCurWpn[33], Float:g_flLastFireTime[33]
  32. new g_sprBeam, g_sprExp, g_sprBlood, g_msgDamage, g_msgScreenFade, g_msgScreenShake
  33.  
  34. const m_pPlayer = 41
  35. const m_fInReload = 54
  36. const m_pActiveItem = 373
  37. const m_flNextAttack = 83
  38. const m_flTimeWeaponIdle = 48
  39. const m_flNextPrimaryAttack = 46
  40. const m_flNextSecondaryAttack = 47
  41.  
  42. const UNIT_SECOND = (1<<12)
  43. const ENG_NULLENT = -1
  44. const WPN_MAXCLIP = 25
  45. const ANIM_FIRE = 5
  46. const ANIM_DRAW = 10
  47. const ANIM_RELOAD = 9
  48. const EV_INT_WEAPONKEY = EV_INT_impulse
  49. const WPNKEY = 2816
  50.  
  51. public plugin_init()
  52. {
  53. register_plugin("[ZP] Extra Item: Plasma Rifle", VERSION, AUTHOR)
  54.  
  55. register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
  56. register_event("CurWeapon", "event_CurWeapon", "b", "1=1")
  57.  
  58. register_forward(FM_CmdStart, "fw_CmdStart")
  59. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  60.  
  61. register_clcmd("say /plazma", "Kupi")
  62.  
  63. RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
  64. RegisterHam(Ham_Item_Deploy, weapon, "fw_Deploy_Post", 1)
  65. RegisterHam(Ham_Item_AddToPlayer, weapon, "fw_AddToPlayer")
  66. RegisterHam(Ham_Weapon_Reload, weapon, "fw_Reload_Post", 1)
  67. RegisterHam(Ham_Item_PostFrame, weapon, "fw_PostFrame")
  68.  
  69. g_msgDamage = get_user_msgid("Damage")
  70. g_msgScreenFade = get_user_msgid("ScreenFade")
  71. g_msgScreenShake = get_user_msgid("ScreenShake")
  72. }
  73.  
  74. public plugin_precache()
  75. {
  76. precache_model("models/cod_mod/plasma/v_plasma.mdl")
  77. precache_model("models/cod_mod/plasma/p_plasma.mdl")
  78.  
  79. g_sprBlood = precache_model(spr_blood)
  80. g_sprBeam = precache_model(spr_beam)
  81. g_sprExp = precache_model(spr_exp)
  82.  
  83. static i
  84. for(i = 0; i < sizeof snd_fire; i++)
  85. precache_sound(snd_fire[i])
  86. for(i = 0; i < sizeof snd_hit; i++)
  87. precache_sound(snd_hit[i])
  88. for(i = 0; i < sizeof snd_reload; i++)
  89. precache_sound(snd_reload[i])
  90. }
  91. public event_CurWeapon(id)
  92. {
  93. if(!is_user_alive(id))
  94. return PLUGIN_CONTINUE
  95.  
  96. g_iCurWpn[id] = read_data(2)
  97.  
  98. if(!g_HasRifle[id] || g_iCurWpn[id] != CSW_WPN)
  99. return PLUGIN_CONTINUE
  100.  
  101. entity_set_string(id, EV_SZ_viewmodel, "models/cod_mod/plasma/v_plasma.mdl")
  102. entity_set_string(id, EV_SZ_weaponmodel, "models/cod_mod/plasma/p_plasma.mdl")
  103. return PLUGIN_CONTINUE
  104. }
  105. public fw_PlayerKilled(victim, attacker, shouldgib)
  106. {
  107. if(is_user_alive(victim))
  108. {
  109. g_HasRifle[victim] = false
  110. return HAM_HANDLED
  111. }
  112. return HAM_IGNORED
  113. }
  114.  
  115. public Event_NewRound()
  116. {
  117. for (new i = 1; i <= get_maxplayers(); i++)
  118. {
  119. g_HasRifle[i] = false
  120. }
  121. }
  122. public client_putinserver(id)
  123. {
  124. g_HasRifle[id] = false
  125. }
  126. public client_disconnect(id)
  127. {
  128. g_HasRifle[id] = false
  129. }
  130. public Kupi(id)
  131. {
  132. new bool:HasWpn = bool:user_has_weapon(id, CSW_WPN)
  133.  
  134. if(!g_HasRifle[id] && !HasWpn)
  135. {
  136. g_HasRifle[id] = true
  137. fm_give_item(id, weapon)
  138. cs_set_user_bpammo(id, CSW_WPN, 100)
  139. engclient_cmd(id, weapon)
  140. }
  141. }
  142. public fw_CmdStart(id, handle, seed)
  143. {
  144. if(!is_user_alive(id))
  145. return FMRES_IGNORED
  146.  
  147. if(!g_HasRifle[id])
  148. return FMRES_IGNORED
  149.  
  150. if(g_iCurWpn[id] != CSW_WPN)
  151. return FMRES_IGNORED
  152.  
  153. static iButton
  154. iButton = get_uc(handle, UC_Buttons)
  155.  
  156. if(iButton & IN_ATTACK)
  157. {
  158. set_uc(handle, UC_Buttons, iButton & ~IN_ATTACK)
  159.  
  160. static Float:flCurTime
  161. flCurTime = halflife_time()
  162.  
  163. if(flCurTime - g_flLastFireTime[id] < FIRERATE)
  164. return FMRES_IGNORED
  165.  
  166. static iWpnID, iClip
  167. iWpnID = get_pdata_cbase(id, m_pActiveItem, 5)
  168. iClip = cs_get_weapon_ammo(iWpnID)
  169.  
  170. if(get_pdata_int(iWpnID, m_fInReload, 4))
  171. return FMRES_IGNORED
  172.  
  173. set_pdata_float(iWpnID, m_flNextPrimaryAttack, FIRERATE, 4)
  174. set_pdata_float(iWpnID, m_flNextSecondaryAttack, FIRERATE, 4)
  175. set_pdata_float(iWpnID, m_flTimeWeaponIdle, FIRERATE, 4)
  176. g_flLastFireTime[id] = flCurTime
  177. if(iClip <= 0)
  178. {
  179. ExecuteHamB(Ham_Weapon_PlayEmptySound, iWpnID)
  180. return FMRES_IGNORED
  181. }
  182. primary_attack(id)
  183. make_punch(id, 50)
  184. cs_set_weapon_ammo(iWpnID, --iClip)
  185.  
  186. return FMRES_IGNORED
  187. }
  188.  
  189. return FMRES_IGNORED
  190. }
  191. public fw_UpdateClientData_Post(id, sendweapons, handle)
  192. {
  193. if(!is_user_alive(id))
  194. return FMRES_IGNORED
  195.  
  196. if(!g_HasRifle[id])
  197. return FMRES_IGNORED
  198.  
  199. if(g_iCurWpn[id] != CSW_WPN)
  200. return FMRES_IGNORED
  201.  
  202. set_cd(handle, CD_flNextAttack, halflife_time() + 0.001)
  203. return FMRES_HANDLED
  204. }
  205. public fw_Deploy_Post(wpn)
  206. {
  207. static id
  208. id = get_pdata_cbase(wpn, m_pPlayer, 4)
  209.  
  210. if(is_user_connected(id) && g_HasRifle[id])
  211. {
  212. set_wpnanim(id, ANIM_DRAW)
  213. }
  214. return HAM_IGNORED
  215. }
  216. public fw_AddToPlayer(wpn, id)
  217. {
  218. if(is_valid_ent(wpn) && is_user_connected(id) && entity_get_int(wpn, EV_INT_WEAPONKEY) == WPNKEY)
  219. {
  220. g_HasRifle[id] = true
  221. entity_set_int(wpn, EV_INT_WEAPONKEY, 0)
  222. return HAM_HANDLED
  223. }
  224. return HAM_IGNORED
  225. }
  226. public fw_PostFrame(wpn)
  227. {
  228. static id
  229. id = get_pdata_cbase(wpn, m_pPlayer, 4)
  230.  
  231. if(is_user_alive(id) && g_HasRifle[id])
  232. {
  233. static Float:flNextAttack, iBpAmmo, iClip, iInReload
  234. iInReload = get_pdata_int(wpn, m_fInReload, 4)
  235. flNextAttack = get_pdata_float(id, m_flNextAttack, 5)
  236. iBpAmmo = cs_get_user_bpammo(id, CSW_WPN)
  237. iClip = cs_get_weapon_ammo(wpn)
  238.  
  239. if(iInReload && flNextAttack <= 0.0)
  240. {
  241. new iRemClip = min(WPN_MAXCLIP - iClip, iBpAmmo)
  242. cs_set_weapon_ammo(wpn, iClip + iRemClip)
  243. cs_set_user_bpammo(id, CSW_WPN, iBpAmmo-iRemClip)
  244. iInReload = 0
  245. set_pdata_int(wpn, m_fInReload, 0, 4)
  246. }
  247. static iButton
  248. iButton = get_user_button(id)
  249.  
  250. if((iButton & IN_ATTACK2 && get_pdata_float(wpn, m_flNextSecondaryAttack, 4) <= 0.0) || (iButton & IN_ATTACK && get_pdata_float(wpn, m_flNextPrimaryAttack, 4) <= 0.0))
  251. return
  252.  
  253. if(iButton & IN_RELOAD && !iInReload)
  254. {
  255. if(iClip >= WPN_MAXCLIP)
  256. {
  257. entity_set_int(id, EV_INT_button, iButton & ~IN_RELOAD)
  258. set_wpnanim(id, 0)
  259. }
  260. else if(iClip == WPN_MAXCLIP)
  261. {
  262. if(iBpAmmo)
  263. {
  264. reload(id, wpn, 1)
  265. }
  266. }
  267. }
  268. }
  269. }
  270. public fw_Reload_Post(wpn)
  271. {
  272. static id
  273. id = get_pdata_cbase(wpn, m_pPlayer, 4)
  274.  
  275. if(is_user_alive(id) && g_HasRifle[id] && get_pdata_int(wpn, m_fInReload, 4))
  276. {
  277. reload(id, wpn)
  278. }
  279. }
  280. public primary_attack(id)
  281. {
  282. set_wpnanim(id, ANIM_FIRE)
  283. entity_set_vector(id, EV_VEC_punchangle, Float:{ -1.5, 0.0, 0.0 })
  284. emit_sound(id, CHAN_WEAPON, snd_fire[random_num(0, sizeof snd_fire - 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  285.  
  286. static iTarget, iBody, iEndOrigin[3], iStartOrigin[3]
  287. get_user_origin(id, iStartOrigin, 1)
  288. get_user_origin(id, iEndOrigin, 3)
  289. fire_effects(iStartOrigin, iEndOrigin)
  290. get_user_aiming(id, iTarget, iBody)
  291.  
  292. new iEnt = create_entity("info_target")
  293.  
  294. static Float:flOrigin[3]
  295. IVecFVec(iEndOrigin, flOrigin)
  296. entity_set_origin(iEnt, flOrigin)
  297. remove_entity(iEnt)
  298.  
  299. if(is_user_connected(iTarget))
  300. {
  301. if(HITSD > 0.0)
  302. {
  303. static Float:flVelocity[3]
  304. get_user_velocity(iTarget, flVelocity)
  305. xs_vec_mul_scalar(flVelocity, HITSD, flVelocity)
  306. set_user_velocity(iTarget, flVelocity)
  307. }
  308. if(is_user_alive(iTarget))
  309. {
  310. new iHp = pev(iTarget, pev_health)
  311. new Float:iDamage, iBloodScale
  312. if(iBody == HIT_HEAD)
  313. {
  314. iDamage = DAMAGE
  315. iBloodScale = 10
  316. }
  317. else
  318. {
  319. iDamage = DAMAGE*DAMAGE_MULTI
  320. iBloodScale = 25
  321. }
  322. if(iHp > iDamage)
  323. {
  324. make_blood(iTarget, iBloodScale)
  325. set_pev(iTarget, pev_health, iHp-iDamage)
  326. damage_effects(iTarget)
  327. }
  328. else if(iHp <= iDamage)
  329. {
  330. ExecuteHamB(Ham_Killed, iTarget, id, 2)
  331. }
  332. }
  333. }
  334. else
  335. {
  336. emit_sound(id, CHAN_WEAPON, snd_hit[random_num(0, sizeof snd_hit - 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  337. }
  338. }
  339. stock fire_effects(iStartOrigin[3], iEndOrigin[3])
  340. {
  341. message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  342. write_byte(0)
  343. write_coord(iStartOrigin[0])
  344. write_coord(iStartOrigin[1])
  345. write_coord(iStartOrigin[2])
  346. write_coord(iEndOrigin[0])
  347. write_coord(iEndOrigin[1])
  348. write_coord(iEndOrigin[2])
  349. write_short(g_sprBeam)
  350. write_byte(1)
  351. write_byte(5)
  352. write_byte(10)
  353. write_byte(25)
  354. write_byte(0)
  355. write_byte(0)
  356. write_byte(255)
  357. write_byte(0)
  358. write_byte(100)
  359. write_byte(0)
  360. message_end()
  361.  
  362. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  363. write_byte(3)
  364. write_coord(iEndOrigin[0])
  365. write_coord(iEndOrigin[1])
  366. write_coord(iEndOrigin[2])
  367. write_short(g_sprExp)
  368. write_byte(10)
  369. write_byte(15)
  370. write_byte(4)
  371. message_end()
  372. }
  373. stock reload(id, wpn, force_reload = 0)
  374. {
  375. set_pdata_float(id, m_flNextAttack, RELOADSPEED, 5)
  376. set_wpnanim(id, ANIM_RELOAD)
  377. emit_sound(id, CHAN_WEAPON, snd_reload[random_num(0, sizeof snd_reload - 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  378.  
  379. if(force_reload)
  380. set_pdata_int(wpn, m_fInReload, 1, 4)
  381. }
  382. stock damage_effects(id)
  383. {
  384. message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, _, id)
  385. write_byte(0)
  386. write_byte(0)
  387. write_long(DMG_NERVEGAS)
  388. write_coord(0)
  389. write_coord(0)
  390. write_coord(0)
  391. message_end()
  392.  
  393. message_begin(MSG_ONE_UNRELIABLE, g_msgScreenFade, {0,0,0}, id)
  394. write_short(1<<13)
  395. write_short(1<<14)
  396. write_short(0x0000)
  397. write_byte(0)
  398. write_byte(255)
  399. write_byte(0)
  400. write_byte(100)
  401. message_end()
  402.  
  403. message_begin(MSG_ONE, g_msgScreenShake, {0,0,0}, id)
  404. write_short(0xFFFF)
  405. write_short(1<<13)
  406. write_short(0xFFFF)
  407. message_end()
  408. }
  409. stock make_blood(id, scale)
  410. {
  411. new Float:iVictimOrigin[3]
  412. pev(id, pev_origin, iVictimOrigin)
  413.  
  414. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  415. write_byte(115)
  416. write_coord(floatround(iVictimOrigin[0]+random_num(-20,20)))
  417. write_coord(floatround(iVictimOrigin[1]+random_num(-20,20)))
  418. write_coord(floatround(iVictimOrigin[2]+random_num(-20,20)))
  419. write_short(g_sprBlood)
  420. write_short(g_sprBlood)
  421. write_byte(248)
  422. write_byte(scale)
  423. message_end()
  424. }
  425. stock set_wpnanim(id, anim)
  426. {
  427. entity_set_int(id, EV_INT_weaponanim, anim)
  428. message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, id)
  429. write_byte(anim)
  430. write_byte(entity_get_int(id, EV_INT_body))
  431. message_end()
  432. }
  433. stock make_punch(id, velamount)
  434. {
  435. static Float:flNewVelocity[3], Float:flCurrentVelocity[3]
  436. velocity_by_aim(id, -velamount, flNewVelocity)
  437. get_user_velocity(id, flCurrentVelocity)
  438. xs_vec_add(flNewVelocity, flCurrentVelocity, flNewVelocity)
  439. set_user_velocity(id, flNewVelocity)
  440. }
  441. stock fm_give_item(index, const item[])
  442. {
  443. if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10))
  444. return 0;
  445.  
  446. new ent = fm_create_entity(item);
  447. if (!pev_valid(ent))
  448. return 0;
  449.  
  450. new Float:origin[3];
  451. pev(index, pev_origin, origin);
  452. set_pev(ent, pev_origin, origin);
  453. set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN);
  454. dllfunc(DLLFunc_Spawn, ent);
  455.  
  456. new save = pev(ent, pev_solid);
  457. dllfunc(DLLFunc_Touch, ent, index);
  458. if (pev(ent, pev_solid) != save)
  459. return ent;
  460.  
  461. engfunc(EngFunc_RemoveEntity, ent);
  462.  
  463. return -1;
  464. }
  465.  
  466. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  467. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
  468. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement