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 <xs>
  8. #include <zombieplague>
  9.  
  10. #define PLUGIN "[ZP] Extra Item: Dragon Cannon"
  11. #define VERSION "1.0"
  12. #define AUTHOR "Dias"
  13.  
  14. #define CSW_CANNON CSW_UMP45
  15. #define weapon_cannon "weapon_ump45"
  16.  
  17. #define DEFAULT_W_MODEL "models/w_ump45.mdl"
  18. #define WEAPON_SECRET_CODE 4965
  19. #define CANNONFIRE_CLASSNAME "cannon_round"
  20.  
  21. // Fire Start
  22. #define WEAPON_ATTACH_F 30.0
  23. #define WEAPON_ATTACH_R 10.0
  24. #define WEAPON_ATTACH_U -10.0
  25.  
  26. #define TASK_RESET_AMMO 5434
  27.  
  28. const pev_ammo = pev_iuser4
  29.  
  30. new const WeaponModel[3][] =
  31. {
  32. "models/v_cannon.mdl",
  33. "models/p_cannon.mdl",
  34. "models/w_cannon.mdl"
  35. }
  36.  
  37. new const WeaponSound[2][] =
  38. {
  39. "weapons/cannon-1.wav",
  40. "weapons/cannon_draw.wav"
  41. }
  42.  
  43. new const WeaponResource[5][] =
  44. {
  45. "sprites/fire_cannon.spr",
  46. "sprites/weapon_cannon.txt",
  47. "sprites/640hud69.spr",
  48. "sprites/640hud2_cso.spr",
  49. "sprites/smokepuff.spr"
  50. }
  51.  
  52. enum
  53. {
  54. MODEL_V = 0,
  55. MODEL_P,
  56. MODEL_W
  57. }
  58.  
  59. enum
  60. {
  61. CANNON_ANIM_IDLE = 0,
  62. CANNON_ANIM_SHOOT1,
  63. CANNON_ANIM_SHOOT2,
  64. CANNON_ANIM_DRAW
  65. }
  66.  
  67. new g_dragoncannon
  68. new g_had_cannon[33], g_old_weapon[33], g_cannon_ammo[33], g_got_firsttime[33], Float:g_lastshot[33]
  69. new g_cvar_defaultammo, g_cvar_reloadtime, g_cvar_firespeed, g_cvar_radiusdamage, g_cvar_damage
  70. new Float:g_temp_reloadtime, g_smokepuff_id
  71.  
  72. public plugin_init()
  73. {
  74. register_plugin(PLUGIN, VERSION, AUTHOR)
  75.  
  76. register_event("CurWeapon", "event_CurWeapon", "be", "1=1")
  77.  
  78. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  79. register_forward(FM_CmdStart, "fw_CmdStart")
  80. register_forward(FM_SetModel, "fw_SetModel")
  81.  
  82. register_think(CANNONFIRE_CLASSNAME, "fw_Cannon_Think")
  83. register_touch(CANNONFIRE_CLASSNAME, "*", "fw_Cannon_Touch")
  84.  
  85. RegisterHam(Ham_Spawn, "player", "fw_Spawn_Post", 1)
  86. RegisterHam(Ham_Item_AddToPlayer, weapon_cannon, "fw_AddToPlayer_Post", 1)
  87.  
  88. g_cvar_defaultammo = register_cvar("cannon_default_ammo", "20") //Alap lőszer
  89. g_cvar_reloadtime = register_cvar("cannon_reload_time", "4.0") //Újratöltési idő
  90. g_cvar_firespeed = register_cvar("cannon_fire_speed", "200.0") //Tüzelési sebessség
  91. g_cvar_radiusdamage = register_cvar("cannon_radius_damage", "200.0") //Sugárnak a sebzése
  92. g_cvar_damage = register_cvar("cannon_damage", "700.0") //Sebzés
  93.  
  94. g_dragoncannon = zp_register_extra_item("Sárkány ágyú", 1, ZP_TEAM_HUMAN)
  95.  
  96. register_clcmd("amx_get_dragoncannon", "get_dragoncannon", ADMIN_RCON)
  97. register_clcmd("weapon_cannon", "hook_weapon")
  98. }
  99.  
  100. public plugin_precache()
  101. {
  102. new i
  103. for(i = 0; i < sizeof(WeaponModel); i++)
  104. engfunc(EngFunc_PrecacheModel, WeaponModel[i])
  105. for(i = 0; i < sizeof(WeaponSound); i++)
  106. engfunc(EngFunc_PrecacheSound, WeaponSound[i])
  107.  
  108. engfunc(EngFunc_PrecacheModel, WeaponResource[0])
  109. engfunc(EngFunc_PrecacheGeneric, WeaponResource[1])
  110. engfunc(EngFunc_PrecacheModel, WeaponResource[2])
  111. engfunc(EngFunc_PrecacheModel, WeaponResource[3])
  112. g_smokepuff_id = engfunc(EngFunc_PrecacheModel, WeaponResource[4])
  113. }
  114.  
  115. public zp_extra_item_selected(id, itemid)
  116. {
  117. if(itemid == g_dragoncannon) get_dragoncannon(id)
  118. }
  119.  
  120. public get_dragoncannon(id)
  121. {
  122. if(!is_user_alive(id))
  123. return
  124.  
  125. drop_weapons(id, 1)
  126.  
  127. g_had_cannon[id] = 1
  128. g_cannon_ammo[id] = get_pcvar_num(g_cvar_defaultammo)
  129. fm_give_item(id, weapon_cannon)
  130. }
  131.  
  132. public remove_dragoncannon(id)
  133. {
  134. if(!is_user_connected(id))
  135. return
  136.  
  137. g_had_cannon[id] = 0
  138. g_got_firsttime[id] = 0
  139. g_cannon_ammo[id] = 0
  140.  
  141. remove_task(id+TASK_RESET_AMMO)
  142. }
  143.  
  144. public hook_weapon(id) engclient_cmd(id, weapon_cannon)
  145.  
  146. public event_CurWeapon(id)
  147. {
  148. if(!is_user_alive(id))
  149. return
  150.  
  151. if(get_user_weapon(id) == CSW_CANNON && g_had_cannon[id])
  152. {
  153. if(!g_got_firsttime[id])
  154. {
  155. static cannon_weapon
  156. cannon_weapon = fm_find_ent_by_owner(-1, weapon_cannon, id)
  157.  
  158. if(pev_valid(cannon_weapon)) cs_set_weapon_ammo(cannon_weapon, 25)
  159. g_got_firsttime[id] = 1
  160. }
  161.  
  162. set_pev(id, pev_viewmodel2, WeaponModel[MODEL_V])
  163. set_pev(id, pev_weaponmodel2, WeaponModel[MODEL_P])
  164.  
  165. if(g_old_weapon[id] != CSW_CANNON)
  166. {
  167. g_temp_reloadtime = get_pcvar_float(g_cvar_reloadtime)
  168. set_weapon_anim(id, CANNON_ANIM_DRAW)
  169. }
  170.  
  171. update_ammo(id)
  172. }
  173.  
  174. g_old_weapon[id] = get_user_weapon(id)
  175. }
  176.  
  177.  
  178. public dragoncannon_shoothandle(id)
  179. {
  180. if(pev(id, pev_weaponanim) != CANNON_ANIM_IDLE)
  181. return
  182.  
  183. if(get_gametime() - g_temp_reloadtime > g_lastshot[id])
  184. {
  185. dragoncannon_shootnow(id)
  186. g_lastshot[id] = get_gametime()
  187. }
  188. }
  189.  
  190. public dragoncannon_shootnow(id)
  191. {
  192. if(g_cannon_ammo[id] == 1)
  193. {
  194. set_task(0.5, "set_weapon_outofammo", id+TASK_RESET_AMMO)
  195. }
  196. if(g_cannon_ammo[id] <= 0)
  197. {
  198. return
  199. }
  200.  
  201. create_fake_attack(id)
  202.  
  203. g_cannon_ammo[id]--
  204.  
  205. set_weapon_anim(id, random_num(CANNON_ANIM_SHOOT1, CANNON_ANIM_SHOOT2))
  206. emit_sound(id, CHAN_WEAPON, WeaponSound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
  207.  
  208. set_player_nextattack(id, CSW_CANNON, g_temp_reloadtime)
  209. update_ammo(id)
  210.  
  211. make_fire_effect(id)
  212. make_fire_smoke(id)
  213. check_radius_damage(id)
  214. }
  215.  
  216. public create_fake_attack(id)
  217. {
  218. static cannon_weapon
  219. cannon_weapon = fm_find_ent_by_owner(-1, "weapon_knife", id)
  220.  
  221. if(pev_valid(cannon_weapon)) ExecuteHam(Ham_Weapon_PrimaryAttack, cannon_weapon)
  222. }
  223.  
  224. public set_weapon_outofammo(id)
  225. {
  226. id -= TASK_RESET_AMMO
  227. if(!is_user_alive(id))
  228. return
  229. if(get_user_weapon(id) != CSW_CANNON || !g_had_cannon[id])
  230. return
  231.  
  232. set_weapon_anim(id, CANNON_ANIM_IDLE)
  233. }
  234.  
  235. public make_fire_effect(id)
  236. {
  237. const MAX_FIRE = 10
  238. static Float:Origin[MAX_FIRE][3]
  239.  
  240. // Stage 1
  241. get_position(id, 30.0, 50.0, WEAPON_ATTACH_U, Origin[0])
  242. get_position(id, 30.0, 40.0, WEAPON_ATTACH_U, Origin[1])
  243. get_position(id, 30.0, -40.0, WEAPON_ATTACH_U, Origin[2])
  244. get_position(id, 30.0, -50.0, WEAPON_ATTACH_U, Origin[2])
  245.  
  246. // Stage 2
  247. get_position(id, 50.0, 30.0, WEAPON_ATTACH_U, Origin[3])
  248. get_position(id, 50.0, 0.0, WEAPON_ATTACH_U, Origin[4])
  249. get_position(id, 50.0, -30.0, WEAPON_ATTACH_U, Origin[5])
  250.  
  251. // Stage 3
  252. get_position(id, 70.0, 20.0, WEAPON_ATTACH_U, Origin[3])
  253. get_position(id, 70.0, -20.0, WEAPON_ATTACH_U, Origin[5])
  254.  
  255. // Stage 4
  256. get_position(id, 90.0, 0.0, WEAPON_ATTACH_U, Origin[4])
  257.  
  258. for(new i = 0; i < MAX_FIRE; i++)
  259. create_fire(id, Origin[i])
  260. }
  261.  
  262. public create_fire(id, Float:Origin[3])
  263. {
  264. new iEnt = create_entity("env_sprite")
  265. static Float:vfAngle[3], Float:MyOrigin[3], Float:TargetOrigin[3], Float:Velocity[3]
  266.  
  267. pev(id, pev_angles, vfAngle)
  268. pev(id, pev_origin, MyOrigin)
  269.  
  270. vfAngle[2] = float(random(18) * 20)
  271.  
  272. // set info for ent
  273. set_pev(iEnt, pev_movetype, MOVETYPE_PUSHSTEP)
  274. set_pev(iEnt, pev_rendermode, kRenderTransAdd)
  275. set_pev(iEnt, pev_renderamt, 250.0)
  276. set_pev(iEnt, pev_fuser1, get_gametime() + 2.5) // time remove
  277. set_pev(iEnt, pev_scale, 2.0)
  278. set_pev(iEnt, pev_nextthink, halflife_time() + 0.05)
  279.  
  280. entity_set_string(iEnt, EV_SZ_classname, CANNONFIRE_CLASSNAME)
  281. engfunc(EngFunc_SetModel, iEnt, WeaponResource[0])
  282. set_pev(iEnt, pev_mins, Float:{-5.0, -5.0, -5.0})
  283. set_pev(iEnt, pev_maxs, Float:{5.0, 5.0, 5.0})
  284. set_pev(iEnt, pev_origin, Origin)
  285. set_pev(iEnt, pev_gravity, 0.01)
  286. set_pev(iEnt, pev_angles, vfAngle)
  287. set_pev(iEnt, pev_solid, 1)
  288. set_pev(iEnt, pev_owner, id)
  289. set_pev(iEnt, pev_frame, 0.0)
  290.  
  291. // Set Velocity
  292. get_position(id, 100.0, 0.0, -5.0, TargetOrigin)
  293.  
  294. get_speed_vector(MyOrigin, TargetOrigin, get_pcvar_float(g_cvar_firespeed), Velocity)
  295. set_pev(iEnt, pev_velocity, Velocity)
  296. }
  297.  
  298. public fw_Cannon_Think(iEnt)
  299. {
  300. if(!pev_valid(iEnt))
  301. return
  302.  
  303. new Float:fFrame, Float:fNextThink
  304. pev(iEnt, pev_frame, fFrame)
  305.  
  306. // effect exp
  307. new iMoveType = pev(iEnt, pev_movetype)
  308. if (iMoveType == MOVETYPE_NONE)
  309. {
  310. fNextThink = 0.0015
  311. fFrame += 0.5
  312.  
  313. if (fFrame > 21.0)
  314. {
  315. engfunc(EngFunc_RemoveEntity, iEnt)
  316. return
  317. }
  318. }
  319.  
  320. // effect normal
  321. else
  322. {
  323. fNextThink = 0.045
  324. fFrame += 0.5
  325. fFrame = floatmin(21.0, fFrame)
  326. }
  327.  
  328. set_pev(iEnt, pev_frame, fFrame)
  329. set_pev(iEnt, pev_nextthink, halflife_time() + fNextThink)
  330.  
  331. // time remove
  332. new Float:fTimeRemove
  333. pev(iEnt, pev_fuser1, fTimeRemove)
  334. if (get_gametime() >= fTimeRemove)
  335. {
  336. engfunc(EngFunc_RemoveEntity, iEnt)
  337. return;
  338. }
  339. }
  340.  
  341. public fw_Cannon_Touch(ent, id)
  342. {
  343. if(!pev_valid(ent))
  344. return
  345.  
  346. set_pev(ent, pev_movetype, MOVETYPE_NONE)
  347. set_pev(ent, pev_solid, SOLID_NOT)
  348. }
  349.  
  350. public make_fire_smoke(id)
  351. {
  352. static Float:Origin[3]
  353. get_position(id, WEAPON_ATTACH_F, WEAPON_ATTACH_R, WEAPON_ATTACH_U, Origin)
  354.  
  355. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  356. write_byte(TE_EXPLOSION)
  357. engfunc(EngFunc_WriteCoord, Origin[0])
  358. engfunc(EngFunc_WriteCoord, Origin[1])
  359. engfunc(EngFunc_WriteCoord, Origin[2])
  360. write_short(g_smokepuff_id)
  361. write_byte(10)
  362. write_byte(30)
  363. write_byte(14)
  364. message_end()
  365. }
  366.  
  367. public update_ammo(id)
  368. {
  369. if(!is_user_alive(id))
  370. return
  371.  
  372. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("CurWeapon"), _, id)
  373. write_byte(1)
  374. write_byte(CSW_CANNON)
  375. write_byte(-1)
  376. message_end()
  377.  
  378. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), _, id)
  379. write_byte(6)
  380. write_byte(g_cannon_ammo[id])
  381. message_end()
  382. }
  383.  
  384. public check_radius_damage(id)
  385. {
  386. static Float:Origin[3]
  387. for(new i = 0; i < get_maxplayers(); i++)
  388. {
  389. if(!is_user_alive(i))
  390. continue
  391. if(cs_get_user_team(id) == cs_get_user_team(i))
  392. continue
  393. if(id == i)
  394. continue
  395. pev(i, pev_origin, Origin)
  396. if(!is_in_viewcone(id, Origin, 1))
  397. continue
  398. if(entity_range(id, i) >= get_pcvar_float(g_cvar_radiusdamage))
  399. continue
  400.  
  401. ExecuteHamB(Ham_TakeDamage, i, 0, id, get_pcvar_float(g_cvar_damage), DMG_BURN)
  402. }
  403. }
  404.  
  405. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  406. {
  407. if(!is_user_alive(id) || !is_user_connected(id))
  408. return FMRES_IGNORED
  409. if(get_user_weapon(id) != CSW_CANNON || !g_had_cannon[id])
  410. return FMRES_IGNORED
  411.  
  412. set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  413.  
  414. return FMRES_HANDLED
  415. }
  416.  
  417. public fw_CmdStart(id, uc_handle, seed)
  418. {
  419. if(!is_user_alive(id) || !is_user_connected(id))
  420. return FMRES_IGNORED
  421. if(get_user_weapon(id) != CSW_CANNON || !g_had_cannon[id])
  422. return FMRES_IGNORED
  423.  
  424. static CurButton
  425. CurButton = get_uc(uc_handle, UC_Buttons)
  426.  
  427. if(CurButton & IN_ATTACK)
  428. {
  429. CurButton &= ~IN_ATTACK
  430. set_uc(uc_handle, UC_Buttons, CurButton)
  431.  
  432. dragoncannon_shoothandle(id)
  433. }
  434.  
  435. return FMRES_HANDLED
  436. }
  437.  
  438. public fw_SetModel(entity, model[])
  439. {
  440. if(!pev_valid(entity))
  441. return FMRES_IGNORED
  442.  
  443. static szClassName[33]
  444. pev(entity, pev_classname, szClassName, charsmax(szClassName))
  445.  
  446. if(!equal(szClassName, "weaponbox"))
  447. return FMRES_IGNORED
  448.  
  449. static id
  450. id = pev(entity, pev_owner)
  451.  
  452. if(equal(model, DEFAULT_W_MODEL))
  453. {
  454. static weapon
  455. weapon = fm_find_ent_by_owner(-1, weapon_cannon, entity)
  456.  
  457. if(!pev_valid(weapon))
  458. return FMRES_IGNORED
  459.  
  460. if(g_had_cannon[id])
  461. {
  462. set_pev(weapon, pev_impulse, WEAPON_SECRET_CODE)
  463. set_pev(weapon, pev_ammo, g_cannon_ammo[id])
  464.  
  465. engfunc(EngFunc_SetModel, entity, WeaponModel[MODEL_W])
  466. remove_dragoncannon(id)
  467.  
  468. return FMRES_SUPERCEDE
  469. }
  470. }
  471.  
  472. return FMRES_IGNORED
  473. }
  474.  
  475. public fw_Spawn_Post(id)
  476. {
  477. remove_dragoncannon(id)
  478. }
  479.  
  480. public fw_AddToPlayer_Post(ent, id)
  481. {
  482. if(!pev_valid(ent))
  483. return HAM_IGNORED
  484.  
  485. if(pev(ent, pev_impulse) == WEAPON_SECRET_CODE)
  486. {
  487. remove_dragoncannon(id)
  488.  
  489. g_had_cannon[id] = 1
  490. g_got_firsttime[id] = 0
  491. g_cannon_ammo[id] = pev(ent, pev_ammo)
  492. }
  493.  
  494. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, id)
  495. write_string(g_had_cannon[id] == 1 ? "weapon_cannon" : "weapon_ump45")
  496. write_byte(6)
  497. write_byte(20)
  498. write_byte(-1)
  499. write_byte(-1)
  500. write_byte(0)
  501. write_byte(15)
  502. write_byte(CSW_CANNON)
  503. write_byte(0)
  504. message_end()
  505.  
  506. return HAM_HANDLED
  507. }
  508.  
  509. stock set_weapon_anim(id, anim)
  510. {
  511. set_pev(id, pev_weaponanim, anim)
  512.  
  513. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  514. write_byte(anim)
  515. write_byte(pev(id, pev_body))
  516. message_end()
  517. }
  518.  
  519. stock drop_weapons(id, dropwhat)
  520. {
  521. static weapons[32], num, i, weaponid
  522. num = 0
  523. get_user_weapons(id, weapons, num)
  524.  
  525. const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_MAC10)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_MAC10)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
  526.  
  527. for (i = 0; i < num; i++)
  528. {
  529. weaponid = weapons[i]
  530.  
  531. if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
  532. {
  533. static wname[32]
  534. get_weaponname(weaponid, wname, sizeof wname - 1)
  535. engclient_cmd(id, "drop", wname)
  536. }
  537. }
  538. }
  539.  
  540. stock set_player_nextattack(player, weapon_id, Float:NextTime)
  541. {
  542. const m_flNextPrimaryAttack = 46
  543. const m_flNextSecondaryAttack = 47
  544. const m_flTimeWeaponIdle = 48
  545. const m_flNextAttack = 83
  546.  
  547. static weapon
  548. weapon = fm_get_user_weapon_entity(player, weapon_id)
  549.  
  550. set_pdata_float(player, m_flNextAttack, NextTime, 5)
  551. if(pev_valid(weapon))
  552. {
  553. set_pdata_float(weapon, m_flNextPrimaryAttack , NextTime, 4)
  554. set_pdata_float(weapon, m_flNextSecondaryAttack, NextTime, 4)
  555. set_pdata_float(weapon, m_flTimeWeaponIdle, NextTime, 4)
  556. }
  557. }
  558.  
  559. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
  560. {
  561. new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  562.  
  563. pev(id, pev_origin, vOrigin)
  564. pev(id, pev_view_ofs,vUp) //for player
  565. xs_vec_add(vOrigin,vUp,vOrigin)
  566. pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  567.  
  568. angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  569. angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  570. angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  571.  
  572. vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  573. vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  574. vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  575. }
  576.  
  577. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
  578. {
  579. new_velocity[0] = origin2[0] - origin1[0]
  580. new_velocity[1] = origin2[1] - origin1[1]
  581. new_velocity[2] = origin2[2] - origin1[2]
  582. new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  583. new_velocity[0] *= num
  584. new_velocity[1] *= num
  585. new_velocity[2] *= num
  586.  
  587. return 1;
  588. }
  589. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  590. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1038\\ f0\\ fs16 \n\\ par }
  591. */
  592.