HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta_util>
  3. #include <hamsandwich>
  4. #include <cstrike>
  5. #include <engine>
  6. #include <zombieplague>
  7.  
  8. #define PLUGIN "Spear gun"
  9. #define VERSION "1.0"
  10. #define AUTHOR "Atrocraz"
  11.  
  12. #define CSW_SPEARGUN CSW_M249
  13. #define weapon_speargun "weapon_m249"
  14. #define old_w_model "models/w_m249.mdl"
  15. #define WEAPONKEY 198414
  16.  
  17. #define speargun_V_MODEL "models/zm/v_speargun.mdl"
  18. #define speargun_P_MODEL "models/zm/p_speargun.mdl"
  19. #define speargun_W_MODEL "models/zm/w_speargun.mdl"
  20. #define ROCKET_MODEL "models/zm/spear.mdl"
  21.  
  22. #define start_ammo 20 //Kezdéskor mennyi lőszer legyen a fegyverben.
  23. #define spear_speed 3000 //Milyen gyorsan lőjön.
  24. #define spear_damage 50.0 //Alap sebzése.
  25. #define explode_radius 150.0
  26. #define explode_damage 40.0
  27. #define spear_classname "spear"
  28. #define spear_explode_time 1.0 //Mennyi idő alatt tegye be a nyilat.
  29.  
  30. new const Sounds[][] =
  31. {
  32. "weapons/speargun-1.wav",
  33. "weapons/speargun_clipin.wav",
  34. "weapons/speargun_draw.wav"
  35. }
  36.  
  37. new const Float: draw_anim_time = 1.43
  38. new const Float: reload_time = 1.13
  39.  
  40. new g_has_speargun[33], bool:g_draw[33], Float:g_time[33], can_attack[33], g_ammo[33], g_spear_id[33], bool:reload[33]
  41. new g_MsgCurWeapon, g_MsgAmmoX, g_MsgWeaponList, g_exp_sprid, g_item
  42.  
  43. #define e_precache_model(%0) engfunc(EngFunc_PrecacheModel, %0)
  44. #define e_precache_sound(%0) engfunc(EngFunc_PrecacheSound, %0)
  45. #define e_precache_generic(%0) engfunc(EngFunc_PrecacheGeneric, %0)
  46.  
  47. enum{
  48. no,
  49. can,
  50. shooting,
  51. reloading
  52. }
  53.  
  54. public plugin_init()
  55. {
  56. register_plugin(PLUGIN, VERSION, AUTHOR)
  57.  
  58. g_MsgCurWeapon = get_user_msgid("CurWeapon")
  59. g_MsgAmmoX = get_user_msgid("AmmoX")
  60. g_MsgWeaponList = get_user_msgid("WeaponList")
  61.  
  62. register_forward(FM_SetModel, "fw_SetModel")
  63. RegisterHam(Ham_Item_AddToPlayer, weapon_speargun, "fw_Item_AddToPlayer_Post", 1)
  64. RegisterHam(Ham_Weapon_PrimaryAttack, weapon_speargun, "fw_Attack")
  65. RegisterHam(Ham_Player_PreThink, "player", "fw_PreThink", 1)
  66. RegisterHam(Ham_Item_Deploy, weapon_speargun, "fw_Item_Deploy_Post", 1)
  67. RegisterHam(Ham_Spawn, "player", "fw_Spawn_Post", 1)
  68.  
  69. register_touch(spear_classname, "*", "fw_touch_world")
  70. register_think(spear_classname, "SpearExplode")
  71.  
  72. register_clcmd("say get", "get_tk")
  73. register_clcmd("weapon_speargun", "WeaponList_Hook")
  74. server_cmd("sv_maxvelocity 8000")
  75.  
  76. g_item = zp_register_extra_item("Speargun", 50, ZP_TEAM_HUMAN)
  77. }
  78.  
  79. public WeaponList_Hook(id)
  80. {
  81. engclient_cmd(id, weapon_speargun)
  82. return PLUGIN_HANDLED
  83. }
  84.  
  85. public zp_extra_item_selected(id, itemid)
  86. {
  87. if (itemid == g_item)
  88. get_tk(id)
  89. }
  90.  
  91. public zp_user_infected_post(id) g_has_speargun[id] = false
  92.  
  93. public get_tk(id)
  94. {
  95. drop_weapons(id, 1)
  96. g_has_speargun[id]=true
  97. g_ammo[id] = start_ammo
  98. reload[id] = false
  99. fm_give_item(id, weapon_speargun)
  100. engclient_cmd(id, weapon_speargun)
  101. fake_weapon_draw(id, get_gametime())
  102. }
  103.  
  104. public plugin_precache()
  105. {
  106. e_precache_model(speargun_V_MODEL)
  107. e_precache_model(speargun_P_MODEL)
  108. e_precache_model(speargun_W_MODEL)
  109. e_precache_model(ROCKET_MODEL)
  110.  
  111. for(new i=0;i<3;i++)
  112. e_precache_sound(Sounds[i])
  113.  
  114. e_precache_generic("sprites/zm/640hud103.spr")
  115. e_precache_generic("sprites/zm/640hud12.spr")
  116. e_precache_generic("sprites/weapon_speargun.txt")
  117. g_exp_sprid = e_precache_model("sprites/zm/at4_bax.spr")
  118. }
  119.  
  120. public fw_PreThink(id)
  121. {
  122. if(!g_has_speargun[id]) return HAM_IGNORED
  123. if(!is_user_alive(id)) return HAM_IGNORED
  124.  
  125. static weapon, Float:current_time
  126.  
  127. weapon = get_user_weapon(id)
  128. current_time = get_gametime()
  129.  
  130. if(!g_draw[id])
  131. {
  132. if(current_time - g_time[id] > draw_anim_time)
  133. {
  134. if(g_ammo[id])
  135. UTIL_PlayWeaponAnimation (id, 0)
  136. else
  137. UTIL_PlayWeaponAnimation (id, 5)
  138.  
  139. g_draw[id] = true
  140.  
  141. if(g_spear_id[id] || reload[id])
  142. can_attack[id] = shooting
  143. else
  144. can_attack[id] = can
  145. }
  146. }
  147. if(weapon == CSW_SPEARGUN)
  148. {
  149. if(can_attack[id] == can && g_ammo[id] > 0)
  150. {
  151. if(pev(id, pev_button) & IN_ATTACK)
  152. {
  153. UTIL_PlayWeaponAnimation(id, 1)
  154. can_attack[id] = shooting
  155. g_time[id] = current_time
  156. emit_sound(id, CHAN_WEAPON, Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  157. g_ammo[id] --
  158. UpdateAmmo(id, CSW_SPEARGUN, g_ammo[id])
  159. Fire_Spear(id)
  160. reload[id] = true
  161. }
  162. }
  163. if(can_attack[id] == shooting)
  164. {
  165. if(pev(id, pev_button) & IN_ATTACK2 && g_spear_id[id])
  166. SpearExplode(g_spear_id[id])
  167.  
  168. if(current_time - g_time[id] > 1.0 && !g_spear_id[id] && g_ammo[id] > 0)
  169. {
  170. g_time[id] = current_time
  171. can_attack[id] = reloading
  172. UTIL_PlayWeaponAnimation(id, 2)
  173. }
  174. }
  175. if(can_attack[id] == reloading)
  176. {
  177. if(current_time - g_time[id] > reload_time)
  178. {
  179. can_attack[id] = can
  180. reload[id] = false
  181. }
  182. }
  183. }
  184.  
  185. return HAM_HANDLED
  186. }
  187.  
  188. public Fire_Spear(id)
  189. {
  190. new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  191. g_spear_id[id] = ent
  192.  
  193. engfunc(EngFunc_SetModel, ent, ROCKET_MODEL)
  194. set_pev(ent, pev_classname, spear_classname)
  195. set_pev(ent, pev_mins, Float:{-1.0, -1.0, -1.0})
  196. set_pev(ent, pev_maxs, Float:{1.0, 1.0, 1.0})
  197.  
  198. static Float:vOrigin[3], Float:vUp[3], Float:fVelocity[3], Float:fAngle[3]
  199.  
  200. pev(id, pev_v_angle, fAngle)
  201. pev(id, pev_origin, vOrigin)
  202.  
  203. global_get(glb_v_up, vUp)
  204. new up = pev(id, pev_button) & IN_DUCK ? 7 : 17
  205. vOrigin[0] = vOrigin[0] + vUp[0] * up
  206. vOrigin[1] = vOrigin[1] + vUp[1] * up
  207. vOrigin[2] = vOrigin[2] + vUp[2] * up
  208. set_pev(ent, pev_origin, vOrigin)
  209.  
  210. set_pev(ent, pev_movetype, MOVETYPE_FLY)
  211. VelocityByAim(id, spear_speed, fVelocity)
  212.  
  213. set_pev(ent, pev_owner, id)
  214. set_pev(ent, pev_solid, SOLID_TRIGGER)
  215.  
  216. set_pev(ent, pev_framerate, 1.0)
  217. set_pev(ent, pev_sequence, 0)
  218.  
  219. entity_set_vector(ent, EV_VEC_velocity, fVelocity)
  220.  
  221. engfunc(EngFunc_VecToAngles, fVelocity, fAngle)
  222. entity_set_vector(ent, EV_VEC_angles, fAngle)
  223.  
  224. //set_pev(ent, pev_fuser3, spear_explode_time)
  225. entity_set_float(ent, EV_FL_nextthink, get_gametime() + spear_explode_time)
  226. }
  227.  
  228. public fw_touch_world(spear, world)
  229. {
  230. if(!pev_valid(spear))
  231. return
  232. if(world == pev(spear, pev_owner))
  233. return
  234.  
  235. static classname[32]
  236. pev(world, pev_classname, classname, 31)
  237.  
  238. if(equal(classname, spear_classname))
  239. return
  240.  
  241. if(is_user_alive(world))// && (pev(spear, pev_iuser3) != world) && (0 < world < 33))
  242. {
  243. if(!zp_get_user_zombie(world))
  244. return
  245.  
  246. static Float:Velocity[3]
  247.  
  248. ExecuteHamB(Ham_TakeDamage, world, spear, pev(spear, pev_owner), spear_damage, DMG_BULLET)
  249.  
  250. if(is_user_alive(world))
  251. {
  252. //set_pev(spear, pev_aiment, world)
  253. //set_pev(spear, pev_movetype, MOVETYPE_FOLLOW)
  254.  
  255. pev(spear, pev_velocity, Velocity)
  256. Velocity[0] = Velocity[0] / 2
  257. Velocity[1] = Velocity[1] / 2
  258. Velocity[2] = (Velocity[2] / 2) + 10.0
  259. set_pev(world, pev_velocity, Velocity)
  260.  
  261. SpearExplode(spear)
  262. }
  263. //set_pev(spear, pev_iuser3, world)
  264. }
  265. else
  266. set_pev(spear, pev_velocity, {0.0, 0.0, 0.0})
  267. }
  268.  
  269. /*public SpearThink(spear)
  270. {
  271.  
  272. }*/
  273.  
  274. public SpearExplode(spear)
  275. {
  276. if(!pev_valid(spear))
  277. return
  278.  
  279. static Float: fOrigin[3], victim
  280. pev(spear, pev_origin, fOrigin)
  281.  
  282. victim = -1
  283. while((victim = engfunc(EngFunc_FindEntityInSphere, victim, fOrigin, explode_radius)) !=0)
  284. {
  285. if(!is_user_alive(victim) || !pev_valid(victim))
  286. continue
  287.  
  288. if(!zp_get_user_zombie(victim))
  289. continue
  290.  
  291. ExecuteHamB(Ham_TakeDamage, victim, spear, pev(spear, pev_owner), explode_damage, DMG_BULLET)
  292. }
  293.  
  294. engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, fOrigin, 0)
  295. write_byte(TE_EXPLOSION)
  296. engfunc(EngFunc_WriteCoord, fOrigin[0])
  297. engfunc(EngFunc_WriteCoord, fOrigin[1])
  298. engfunc(EngFunc_WriteCoord, fOrigin[2])
  299. write_short(g_exp_sprid)
  300. write_byte(5)
  301. write_byte(20)
  302. write_byte(0)
  303. message_end()
  304.  
  305. g_spear_id[pev(spear, pev_owner)] = 0
  306. remove_entity(spear)
  307. }
  308.  
  309. public fw_Item_Deploy_Post(ent)
  310. {
  311. static id
  312. id = get_pdata_cbase(ent, 41, 4)
  313.  
  314. if(g_has_speargun[id])
  315. fake_weapon_draw(id, get_gametime())
  316. }
  317.  
  318. public fw_SetModel(entity, model[])
  319. {
  320. if(!is_valid_ent(entity))
  321. return FMRES_IGNORED
  322.  
  323. static szClassName[33]
  324. entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
  325.  
  326. if(!equal(szClassName, "weaponbox"))
  327. return FMRES_IGNORED
  328.  
  329. static iOwner; iOwner = entity_get_edict(entity, EV_ENT_owner)
  330.  
  331. if(equal(model, old_w_model))
  332. {
  333. static iStoredAugID
  334. iStoredAugID = find_ent_by_owner(-1, weapon_speargun, entity)
  335.  
  336. if(!is_valid_ent(iStoredAugID))
  337. return FMRES_IGNORED
  338.  
  339. if(g_has_speargun[iOwner])
  340. {
  341. entity_set_int(iStoredAugID, EV_INT_impulse, WEAPONKEY)
  342. set_pev(iStoredAugID, pev_iuser3, g_ammo[iOwner])
  343. g_has_speargun[iOwner] = false
  344. entity_set_model(entity, speargun_W_MODEL)
  345. return FMRES_SUPERCEDE
  346. }
  347. }
  348. return FMRES_IGNORED
  349. }
  350.  
  351. public fw_Item_AddToPlayer_Post(ent, id)
  352. {
  353. if(!is_valid_ent(ent) || !is_user_connected(id))
  354. return HAM_IGNORED
  355.  
  356. if(entity_get_int(ent, EV_INT_impulse) == WEAPONKEY)
  357. {
  358. g_has_speargun[id] = true
  359. g_ammo[id] = pev(ent, pev_iuser3)
  360. entity_set_int(ent, EV_INT_impulse, 0)
  361. fake_weapon_draw(id, get_gametime())
  362. }
  363. return HAM_IGNORED
  364. }
  365.  
  366. public fw_Spawn_Post(id)
  367. if(is_user_alive(id))
  368. if(get_user_weapon(id) == CSW_SPEARGUN)
  369. if(g_has_speargun[id])
  370. fake_weapon_draw(id, get_gametime())
  371.  
  372. public fw_Attack(entity)
  373. {
  374. new id = get_pdata_cbase(entity, 41, 4)
  375.  
  376. if(g_has_speargun[id])
  377. return HAM_SUPERCEDE
  378.  
  379. return HAM_HANDLED
  380. }
  381.  
  382. UpdateAmmo(id, CSW_ID, BpAmmo)
  383. {
  384. message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
  385. write_byte(1)
  386. write_byte(CSW_ID)
  387. write_byte(-1)
  388. message_end()
  389.  
  390. message_begin(MSG_ONE_UNRELIABLE, g_MsgAmmoX, _, id)
  391. write_byte(3)
  392. write_byte(BpAmmo)
  393. message_end()
  394.  
  395. cs_set_user_bpammo(id, CSW_ID, BpAmmo)
  396. }
  397.  
  398. stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
  399. {
  400. set_pev(Player, pev_weaponanim, Sequence)
  401.  
  402. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
  403. write_byte(Sequence)
  404. write_byte(pev(Player, pev_body))
  405. message_end()
  406. }
  407.  
  408. stock fake_weapon_draw(id, Float:current_time)
  409. {
  410. set_pev(id, pev_viewmodel2, speargun_V_MODEL)
  411. set_pev(id, pev_weaponmodel2, speargun_P_MODEL)
  412. if(g_ammo[id])
  413. UTIL_PlayWeaponAnimation (id, 3)
  414. else
  415. UTIL_PlayWeaponAnimation (id, 4)
  416.  
  417. set_weapons_timeidle(id ,99999999.0)
  418. set_player_nextattack(id ,99999999.0)
  419.  
  420. can_attack[id] = no
  421. g_draw[id] = false
  422. g_time[id] = current_time
  423.  
  424. message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, {0,0,0}, id)
  425. write_string("weapon_speargun")
  426. write_byte(3)
  427. write_byte(200)
  428. write_byte(-1)
  429. write_byte(-1)
  430. write_byte(0)
  431. write_byte(4)
  432. write_byte(CSW_SPEARGUN)
  433. message_end()
  434.  
  435. UpdateAmmo(id, CSW_SPEARGUN, g_ammo[id])
  436. }
  437.  
  438. stock set_weapons_timeidle(id, Float:TimeIdle)
  439. {
  440. new entwpn = get_user_weapon(id)==CSW_SPEARGUN
  441. if (pev_valid(entwpn))
  442. {
  443. set_pdata_float(entwpn, 46, TimeIdle, 4)
  444. set_pdata_float(entwpn, 47, TimeIdle, 4)
  445. set_pdata_float(entwpn, 48, TimeIdle + 1.0, 4)
  446. }
  447. }
  448.  
  449. stock set_player_nextattack(id, Float:nexttime)
  450. {
  451. const m_flNextAttack = 83
  452. set_pdata_float(id, m_flNextAttack, nexttime, 5)
  453. }
  454.  
  455. /*stock find_closest_bone_to_gunshot(victim, Float:endtrace[3])
  456. {
  457. new Float:angles[3], Float:origin[3], Float:dist = 50.00, Float:curorigin[3], bone_nr
  458. for (new i = 1; i <= 54; i ++)
  459. {
  460.   engfunc(EngFunc_GetBonePosition, victim, i, curorigin, angles)
  461. xs_vec_sub(curorigin, endtrace, angles)
  462.  
  463. if (xs_vec_len(angles) <= dist)
  464. {
  465. origin = curorigin
  466. dist = xs_vec_len(angles)
  467. bone_nr = i
  468. }
  469. if (dist <= 2.0)
  470. break
  471. }
  472. return bone_nr
  473. }*/
  474.  
  475. const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_P90)|(1<<CSW_P90)|(1<<CSW_P90)|(1<<CSW_SG550)|
  476. (1<<CSW_P90)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_P90)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_M3)|
  477. (1<<CSW_P90)|(1<<CSW_AK47)|(1<<CSW_P90)
  478.  
  479. stock drop_weapons(id, dropwhat)
  480. {
  481. static weapons[32], num, i, weaponid
  482. num = 0
  483. get_user_weapons(id, weapons, num)
  484.  
  485. for (i = 0; i < num; i++)
  486. {
  487. weaponid = weapons[i]
  488.  
  489. if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
  490. {
  491. static wname[32]
  492. get_weaponname(weaponid, wname, sizeof wname - 1)
  493. engclient_cmd(id, "drop", wname)
  494. }
  495. }
  496. }