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