HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <engine>
  3. #include <fakemeta>
  4. #include <fakemeta_util>
  5. #include <hamsandwich>
  6. #include <cstrike>
  7. #include <zombieplague>
  8.  
  9. #define PLUGIN "[ZP] Extra Item: Spas12Ex2"
  10. #define VERSION "1.0"
  11. #define AUTHOR "Dias"
  12.  
  13. #define CSW_SPAS12EX2 CSW_M3
  14. #define weapon_spas12ex2 "weapon_m3"
  15.  
  16. new const v_model[] = "models/zombie_plague/v_spas12ex2.mdl"
  17. new const p_model[] = "models/zombie_plague/p_spas12ex2.mdl"
  18. new const w_model[] = "models/zombie_plague/w_spas12ex2.mdl"
  19. new const spas12ex2_sound[4][] = {
  20. "weapons/spas12ex-1.wav",
  21. "weapons/spas12_reload.wav",
  22. "weapons/spas12_insert.wav",
  23. "weapons/spas12_draw.wav"
  24. }
  25.  
  26. new g_had_spas12ex2[33], g_orig_event_spas12ex2, is_attacking[33], Float:g_last_postframe[33]
  27. new g_bloodspray, g_blood, Float:g_last_change[33], Float:g_last_fire[33], g_mode[33]
  28. new cvar_damage_mode1, cvar_damage_mode2
  29. new spas12ex2_item
  30.  
  31. public plugin_init()
  32. {
  33. register_plugin(PLUGIN, VERSION, AUTHOR)
  34.  
  35. register_event("HLTV", "event_newround", "a", "1=0", "2=0")
  36. register_event("CurWeapon", "event_curweapon", "be", "1=1")
  37.  
  38. RegisterHam(Ham_TakeDamage, "player", "fw_takedmg")
  39. RegisterHam(Ham_TraceAttack, "worldspawn", "TraceAttack", 1)
  40. RegisterHam(Ham_TraceAttack, "player", "TraceAttack", 1)
  41. RegisterHam(Ham_Item_AddToPlayer, weapon_spas12ex2, "fw_item_addtoplayer", 1)
  42. RegisterHam(Ham_Item_PostFrame, weapon_spas12ex2, "fw_item_postframe")
  43.  
  44. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  45. register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
  46. register_forward(FM_SetModel, "fw_SetModel")
  47. register_forward(FM_CmdStart, "fw_CmdStart")
  48.  
  49. cvar_damage_mode1 = register_cvar("zp_damage_mode1", "4.85")
  50. cvar_damage_mode2 = register_cvar("zp_damage_mode2", "3.0")
  51.  
  52. spas12ex2_item = zp_register_extra_item("Spas12 Superior", 30, ZP_TEAM_HUMAN)
  53. }
  54.  
  55. public plugin_precache()
  56. {
  57. g_blood = precache_model("sprites/blood.spr")
  58. g_bloodspray = precache_model("sprites/bloodspray.spr")
  59.  
  60. precache_model(v_model)
  61. precache_model(p_model)
  62. precache_model(w_model)
  63.  
  64. for(new i = 0; i < sizeof(spas12ex2_sound); i++)
  65. precache_sound(spas12ex2_sound[i])
  66.  
  67. engfunc(EngFunc_PrecacheGeneric, "sprites/weapon_spas12ex2.txt")
  68. engfunc(EngFunc_PrecacheGeneric, "sprites/spas12ex2.spr")
  69.  
  70. register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
  71. }
  72.  
  73. public zp_extra_item_selected(id, itemid)
  74. {
  75. if(itemid != spas12ex2_item)
  76. return
  77.  
  78. g_had_spas12ex2[id] = 1
  79. g_mode[id] = 1
  80.  
  81. fm_give_item(id, weapon_spas12ex2)
  82. cs_set_user_bpammo(id, CSW_SPAS12EX2, 64)
  83. }
  84.  
  85. public zp_user_infected_post(id)
  86. {
  87. g_had_spas12ex2[id] = 0
  88. g_mode[id] = 0
  89. }
  90.  
  91. public zp_user_humanized_post(id)
  92. {
  93. g_had_spas12ex2[id] = 0
  94. g_mode[id] = 0
  95. }
  96.  
  97.  
  98. public fw_PrecacheEvent_Post(type, const name[])
  99. {
  100. if (equal("events/m3.sc", name))
  101. {
  102. g_orig_event_spas12ex2 = get_orig_retval()
  103. return FMRES_HANDLED
  104. }
  105.  
  106. return FMRES_IGNORED
  107. }
  108.  
  109. public event_newround()
  110. {
  111. new iPlayers[32], iNumber
  112. get_players(iPlayers, iNumber)
  113.  
  114. for(new i = 0; i < iNumber; i++)
  115. {
  116. new id = iPlayers[i]
  117.  
  118. if(is_user_alive(id) && is_user_connected(id))
  119. g_had_spas12ex2[i] = 0
  120. }
  121. }
  122.  
  123. public event_curweapon(id)
  124. {
  125. if(!is_user_alive(id) || !is_user_connected(id))
  126. return
  127. if(zp_get_user_zombie(id))
  128. return
  129. if(get_user_weapon(id) != CSW_SPAS12EX2 || !g_had_spas12ex2[id])
  130. return
  131.  
  132. set_pev(id, pev_viewmodel2, v_model)
  133. set_pev(id, pev_weaponmodel2, p_model)
  134.  
  135. return
  136. }
  137.  
  138. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  139. {
  140. if(!is_user_alive(id) || !is_user_connected(id))
  141. return FMRES_IGNORED
  142. if(zp_get_user_zombie(id))
  143. return FMRES_IGNORED
  144. if(get_user_weapon(id) != CSW_SPAS12EX2 || !g_had_spas12ex2[id])
  145. return FMRES_IGNORED
  146.  
  147. set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001)
  148.  
  149. return FMRES_HANDLED
  150. }
  151.  
  152. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  153. {
  154. if (eventid != g_orig_event_spas12ex2)
  155. return FMRES_IGNORED
  156. if (!(1 <= invoker <= get_maxplayers()) || !is_attacking[invoker])
  157. return FMRES_IGNORED
  158.  
  159. playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  160. return FMRES_SUPERCEDE
  161. }
  162.  
  163. public fw_SetModel(entity, model[])
  164. {
  165. if(!is_valid_ent(entity))
  166. return FMRES_IGNORED;
  167.  
  168. static szClassName[33]
  169. entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
  170.  
  171. if(!equal(szClassName, "weaponbox"))
  172. return FMRES_IGNORED;
  173.  
  174. static iOwner
  175. iOwner = entity_get_edict(entity, EV_ENT_owner)
  176.  
  177. if(equal(model, "models/w_m3.mdl"))
  178. {
  179. static weapon
  180. weapon = find_ent_by_owner(-1, weapon_spas12ex2, entity)
  181.  
  182. if(!is_valid_ent(weapon))
  183. return FMRES_IGNORED;
  184.  
  185. if(g_had_spas12ex2[iOwner])
  186. {
  187. entity_set_int(weapon, EV_INT_impulse, 121)
  188. g_had_spas12ex2[iOwner] = 0
  189. set_pev(weapon, pev_iuser4, g_mode[iOwner])
  190.  
  191. entity_set_model(entity, w_model)
  192.  
  193. return FMRES_SUPERCEDE
  194. }
  195. }
  196.  
  197. return FMRES_IGNORED;
  198. }
  199.  
  200. public fw_CmdStart(id, uc_handle, seed)
  201. {
  202. if(!is_user_alive(id) || !is_user_connected(id))
  203. return FMRES_IGNORED
  204. if(zp_get_user_zombie(id))
  205. return FMRES_IGNORED
  206. if(get_user_weapon(id) != CSW_SPAS12EX2 || !g_had_spas12ex2[id])
  207. return FMRES_IGNORED
  208.  
  209. new CurButton
  210. CurButton = get_uc(uc_handle, UC_Buttons)
  211.  
  212. if(CurButton & IN_ATTACK2)
  213. {
  214. static Float:CurTime
  215. CurTime = get_gametime()
  216.  
  217. if(CurTime - 0.5 > g_last_change[id])
  218. {
  219. if(g_mode[id] == 1)
  220. {
  221. g_mode[id] = 2
  222. client_print(id, print_center, "Atvaltas Auto mod-ra")
  223. } else if(g_mode[id] == 2) {
  224. client_print(id, print_center, "Atvaltas normal mod-ra")
  225. g_mode[id] = 1
  226. }
  227.  
  228. g_last_change[id] = CurTime
  229. }
  230. }
  231.  
  232. if(CurButton & IN_ATTACK)
  233. {
  234. static Float:CurTime
  235. CurTime = get_gametime()
  236.  
  237. CurButton &= ~IN_ATTACK
  238. set_uc(uc_handle, UC_Buttons, CurButton)
  239.  
  240. static ent
  241. ent = find_ent_by_owner(-1, weapon_spas12ex2, id)
  242.  
  243. if(cs_get_weapon_ammo(ent) <= 0 || get_pdata_int(ent, 54, 4))
  244. return FMRES_IGNORED
  245.  
  246. if(g_mode[id] == 1)
  247. {
  248. if(CurTime - 1.0 > g_last_fire[id])
  249. {
  250. emit_sound(id, CHAN_WEAPON, spas12ex2_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
  251.  
  252. ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  253. set_task(0.5, "do_playsound_finish", id)
  254. set_weapon_anim(id, 1)
  255.  
  256. g_last_fire[id] = CurTime
  257. }
  258. } else if(g_mode[id] == 2) {
  259. if(CurTime - 0.3 > g_last_fire[id])
  260. {
  261. emit_sound(id, CHAN_WEAPON, spas12ex2_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
  262.  
  263. ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  264. set_weapon_anim(id, 7)
  265.  
  266. g_last_fire[id] = CurTime
  267. }
  268. }
  269.  
  270.  
  271.  
  272. }
  273.  
  274. return FMRES_HANDLED
  275. }
  276.  
  277. public do_playsound_finish(id)
  278. {
  279. if(get_user_weapon(id) != CSW_SPAS12EX2 || !g_had_spas12ex2[id])
  280. return
  281.  
  282. emit_sound(id, CHAN_WEAPON, spas12ex2_sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
  283. }
  284.  
  285. public TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
  286. {
  287. if(!is_user_alive(iAttacker) || !is_user_connected(iAttacker))
  288. return HAM_IGNORED
  289. if(zp_get_user_zombie(iAttacker))
  290. return FMRES_IGNORED
  291. if(get_user_weapon(iAttacker) != CSW_SPAS12EX2 || !g_had_spas12ex2[iAttacker])
  292. return HAM_IGNORED
  293.  
  294. static Float:flEnd[3]
  295. get_tr2(ptr, TR_vecEndPos, flEnd)
  296.  
  297. make_bullet(iAttacker, flEnd)
  298.  
  299. return HAM_HANDLED
  300. }
  301.  
  302. public fw_takedmg(victim, inflictor, attacker, Float:damage, damagebits)
  303. {
  304. if(!is_user_alive(victim) || !is_user_alive(attacker))
  305. return HAM_IGNORED
  306.  
  307. if(zp_get_user_zombie(attacker) || !zp_get_user_zombie(victim))
  308. return HAM_IGNORED
  309.  
  310. if(get_user_weapon(attacker) == CSW_SPAS12EX2 && g_had_spas12ex2[attacker])
  311. {
  312. static Float:Damage
  313. if(g_mode[attacker] == 1)
  314. Damage = get_pcvar_float(cvar_damage_mode1)
  315. else if(g_mode[attacker] == 2)
  316. Damage = get_pcvar_float(cvar_damage_mode2)
  317.  
  318. SetHamParamFloat(4, damage * Damage)
  319. }
  320.  
  321. return HAM_HANDLED
  322. }
  323.  
  324. public fw_item_addtoplayer(ent, id)
  325. {
  326. if(!is_valid_ent(ent))
  327. return HAM_IGNORED
  328.  
  329. if(zp_get_user_zombie(id))
  330. return HAM_IGNORED
  331.  
  332. if(entity_get_int(ent, EV_INT_impulse) == 121)
  333. {
  334. g_had_spas12ex2[id] = 1
  335. g_mode[id] = pev(ent, pev_iuser4)
  336.  
  337. entity_set_int(id, EV_INT_impulse, 0)
  338.  
  339. return HAM_HANDLED
  340. }
  341.  
  342. if(g_had_spas12ex2[id])
  343. {
  344. message_begin(MSG_ONE, get_user_msgid("WeaponList"), _, id)
  345. write_string("weapon_spas12ex2"); // WeaponName
  346. write_byte(5) // PrimaryAmmoID
  347. write_byte(32) // PrimaryAmmoMaxAmount
  348. write_byte(-1) // SecondaryAmmoID
  349. write_byte(-1) // SecondaryAmmoMaxAmount
  350. write_byte(0) // SlotID (0...N)
  351. write_byte(5) // NumberInSlot (1...N)
  352. write_byte(CSW_SPAS12EX2) // WeaponID
  353. write_byte(0) // Flags
  354. message_end()
  355. }
  356.  
  357. return HAM_HANDLED
  358. }
  359.  
  360. public fw_item_postframe(ent)
  361. {
  362. static id
  363. id = pev(ent, pev_owner)
  364.  
  365. if(!is_user_alive(id) || !is_user_connected(id))
  366. return HAM_IGNORED
  367. //if(zp_get_user_zombie(iAttacker))
  368. // return FMRES_IGNORED
  369. if(get_user_weapon(id) != CSW_SPAS12EX2 || !g_had_spas12ex2[id])
  370. return HAM_IGNORED
  371.  
  372. static spas12ex2
  373. spas12ex2 = fm_find_ent_by_owner(-1, weapon_spas12ex2, id)
  374.  
  375. if(get_pdata_int(spas12ex2, 55, 4) == 1)
  376. {
  377. static Float:CurTime
  378. CurTime = get_gametime()
  379.  
  380. if(CurTime - 0.4 > g_last_postframe[id])
  381. {
  382. set_weapon_anim(id, 3)
  383. g_last_postframe[id] = CurTime
  384. }
  385. }
  386.  
  387. return HAM_HANDLED
  388. }
  389.  
  390. stock make_bullet(id, Float:Origin[3])
  391. {
  392. new target, body
  393. get_user_aiming(id, target, body, 999999)
  394.  
  395. if(target > 0 && target <= get_maxplayers())
  396. {
  397. new Float:fStart[3], Float:fEnd[3], Float:fRes[3], Float:fVel[3]
  398. pev(id, pev_origin, fStart)
  399.  
  400. velocity_by_aim(id, 64, fVel)
  401.  
  402. fStart[0] = Origin[0]
  403. fStart[1] = Origin[1]
  404. fStart[2] = Origin[2]
  405. fEnd[0] = fStart[0]+fVel[0]
  406. fEnd[1] = fStart[1]+fVel[1]
  407. fEnd[2] = fStart[2]+fVel[2]
  408.  
  409. new res
  410. engfunc(EngFunc_TraceLine, fStart, fEnd, 0, target, res)
  411. get_tr2(res, TR_vecEndPos, fRes)
  412.  
  413. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  414. write_byte(TE_BLOODSPRITE)
  415. write_coord(floatround(fStart[0]))
  416. write_coord(floatround(fStart[1]))
  417. write_coord(floatround(fStart[2]))
  418. write_short(g_bloodspray)
  419. write_short(g_blood)
  420. write_byte(70)
  421. write_byte(random_num(1,2))
  422. message_end()
  423.  
  424.  
  425. } else {
  426. new decal = 41
  427.  
  428. // Check if the wall hit is an entity
  429. if(target)
  430. {
  431. // Put decal on an entity
  432. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  433. write_byte(TE_DECAL)
  434. write_coord(floatround(Origin[0]))
  435. write_coord(floatround(Origin[1]))
  436. write_coord(floatround(Origin[2]))
  437. write_byte(decal)
  438. write_short(target)
  439. message_end()
  440. } else {
  441. // Put decal on "world" (a wall)
  442. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  443. write_byte(TE_WORLDDECAL)
  444. write_coord(floatround(Origin[0]))
  445. write_coord(floatround(Origin[1]))
  446. write_coord(floatround(Origin[2]))
  447. write_byte(decal)
  448. message_end()
  449. }
  450.  
  451. // Show sparcles
  452. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  453. write_byte(TE_GUNSHOTDECAL)
  454. write_coord(floatround(Origin[0]))
  455. write_coord(floatround(Origin[1]))
  456. write_coord(floatround(Origin[2]))
  457. write_short(id)
  458. write_byte(decal)
  459. message_end()
  460. }
  461. }
  462.  
  463. stock set_weapon_anim(id, anim)
  464. {
  465. set_pev(id, pev_weaponanim, anim)
  466.  
  467. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
  468. write_byte(anim)
  469. write_byte(pev(id,pev_body))
  470. message_end()
  471. }
  472.