HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4. #include < zombieplague >
  5. #include < cstrike >
  6. #include < fun >
  7.  
  8. //native zp_get_user_zombie(id)
  9. //native zp_register_extra_item(const name[], cost, teams)
  10.  
  11. new const ClassnameJetPack[] = "n4d_jetpack"
  12. new const ClassnameRocket[] = "n4d_bazooka"
  13. new const ModelVJetPack[] = "models/ls/v_jp_lars_zm.mdl"
  14. new const ModelPJetPack[] = "models/ls/p_egon_zm.mdl"
  15. new const ModelWJetPack[] = "models/ls/w_egon_zm.mdl"
  16. new const ModelRocket[] = "models/rpgrocket.mdl"
  17. new const SoundPickup[] = "items/gunpickup2.wav"
  18. new const SoundShoot[] = "ls/at4-1.wav"
  19. new const SoundTravel[] = "ls/bfuu.wav"
  20. new const SoundFly[] = "ls/fly.wav"
  21. new const SoundBlow[] = "ls/blow.wav"
  22.  
  23. new bool:bHasJetPack[33]
  24. new Float:fJetpackFuel[33]
  25. new Float:fLastShoot[33]
  26. new SprExp, SprTrail, ItemJetPack, iAllocInfoTarget, iMaxClients, MsgSayText
  27. new CvarMaxFuel, CvarRadius, CvarDamage, CvarSpeed, CvarCooldown, CvarRegen, CvarRocketSpeed, CvarCount
  28. new Float:CMaxFuel, Float:CRadius, Float:CDamage, CSpeed, Float:CCooldown, Float:CRegen, CRocketSpeed, CCount
  29. #define IsPlayer(%0) (1<=%0<=iMaxClients)
  30. //#define ZP_TEAM_HUMAN (1<<1)
  31. //#define ZP_PLUGIN_HANDLED 97
  32. #define PevEntType pev_flSwimTime
  33. #define EntTypeJetPack 3904
  34. #define EntTypeRocket 9340
  35.  
  36. // Uncomment this to draw ring effect
  37. #define DrawRing
  38.  
  39. // Uncomment this to draw flame effect
  40. //#define DrawFlame
  41.  
  42. // Uncomment this to draw flame effect
  43. #define DrawTrail
  44.  
  45. #if defined DrawTrail
  46. #define TRAIL_LIFE 1
  47. #define TRAIL_WIDTH 8
  48. #define TRAIL_RED 210
  49. #define TRAIL_GREEN 100
  50. #define TRAIL_BLUE 0
  51. #define TRAIL_BRIGTHNESS 200
  52. #endif
  53.  
  54. #if defined DrawRing
  55. new SprRing
  56. #endif
  57.  
  58. #if defined DrawFlame
  59. new SprFlame
  60. #endif
  61.  
  62. public plugin_precache()
  63. {
  64. precache_sound(SoundPickup)
  65. precache_sound(SoundShoot)
  66. precache_sound(SoundTravel)
  67. precache_sound(SoundFly)
  68. precache_sound(SoundBlow)
  69.  
  70. SprExp = precache_model("sprites/zerogxplode.spr")
  71. SprTrail = precache_model("sprites/smoke.spr")
  72.  
  73. #if defined DrawFlame
  74. SprFlame = precache_model("sprites/xfireball3.spr")
  75. #endif
  76.  
  77. #if defined DrawRing
  78. SprRing = precache_model("sprites/shockwave.spr")
  79. #endif
  80.  
  81. precache_model(ModelVJetPack)
  82. precache_model(ModelPJetPack)
  83. precache_model(ModelWJetPack)
  84. precache_model(ModelRocket)
  85. }
  86.  
  87. public plugin_init()
  88. {
  89. register_plugin("New Jetpack", "0.0.2", "Bad_Bud,ZmOutStanding,Connor,wbyokomo")
  90.  
  91. register_event("HLTV", "OnNewRound", "a", "1=0", "2=0")
  92. register_logevent("OnRoundEnd", 2, "1=Round_End")
  93.  
  94. RegisterHam ( Ham_Spawn, "player", "CBasePlayer_Spawn_Post", .Post = true );
  95. RegisterHam(Ham_Killed, "player", "OnPlayerKilled")
  96. RegisterHam(Ham_Player_Jump, "player", "OnPlayerJump")
  97. RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "OnKnifeSecAtkPost", 1)
  98. //RegisterHam(Ham_Item_Deploy, "weapon_knife", "OnKnifeDeployPost", 1)
  99. register_event("CurWeapon", "check_models", "be")
  100.  
  101. register_forward(FM_PlayerPreThink, "OnPlayerPreThink")
  102. register_forward(FM_Touch, "OnTouch")
  103.  
  104. CvarMaxFuel = register_cvar("jp_maxfuel", "250.0")
  105. CvarRadius = register_cvar("jp_radius", "250.0")
  106. CvarDamage = register_cvar("jp_damage", "800.0")
  107. CvarSpeed = register_cvar("jp_speed", "300")
  108. CvarCooldown = register_cvar("jp_cooldown", "10.0")
  109. CvarRegen = register_cvar("jp_regen", "0.5")
  110. CvarRocketSpeed = register_cvar("jp_rocket_speed", "1500")
  111. CvarCount = register_cvar("jp_count", "3")
  112.  
  113. iMaxClients = get_maxplayers()
  114. MsgSayText = get_user_msgid("SayText")
  115. ItemJetPack = zp_register_extra_item("Zombie Jetpack", 50, ZP_TEAM_ZOMBIE)
  116.  
  117. register_clcmd("drop", "CmdDropJP")
  118. }
  119.  
  120. public plugin_cfg()
  121. {
  122. iAllocInfoTarget = engfunc(EngFunc_AllocString, "info_target")
  123. }
  124.  
  125. public client_putinserver(id)
  126. {
  127. ResetValues(id)
  128. }
  129.  
  130. public client_disconnect(id)
  131. {
  132. ResetValues(id)
  133. }
  134.  
  135. public OnNewRound()
  136. {
  137. RemoveAllJetPack()
  138. CMaxFuel = get_pcvar_float(CvarMaxFuel)
  139. CRadius = get_pcvar_float(CvarRadius)
  140. CDamage = get_pcvar_float(CvarDamage)
  141. CSpeed = get_pcvar_num(CvarSpeed)
  142. CCooldown = get_pcvar_float(CvarCooldown)
  143. CRegen = get_pcvar_float(CvarRegen)
  144. CRocketSpeed = get_pcvar_num(CvarRocketSpeed)
  145. CCount = get_pcvar_num(CvarCount)
  146. }
  147.  
  148. public OnRoundEnd()
  149. {
  150. RemoveAllJetPack()
  151. }
  152.  
  153. public CBasePlayer_Spawn_Post ( id )
  154. {
  155. if ( !is_user_alive ( id ) ) { return HAM_IGNORED; }
  156.  
  157. if(bHasJetPack[id]) DropJetPack(id);
  158.  
  159. ResetValues(id)
  160.  
  161. return HAM_IGNORED;
  162. }
  163.  
  164. public OnPlayerKilled(id)
  165. {
  166. if(bHasJetPack[id]) DropJetPack(id);
  167.  
  168. ResetValues(id)
  169. }
  170.  
  171. public OnPlayerJump(id)
  172. {
  173. if(bHasJetPack[id] && fJetpackFuel[id] > 0.0 && get_user_weapon(id) == CSW_KNIFE && pev(id, pev_button) & IN_DUCK && ~pev(id, pev_flags) & FL_ONGROUND)
  174. {
  175. static Float:vVelocity[3], Float:upSpeed
  176. pev(id, pev_velocity, vVelocity)
  177. upSpeed = vVelocity[2] + 35.0
  178. velocity_by_aim(id, CSpeed, vVelocity)
  179. vVelocity[2] = upSpeed > 300.0 ? 300.0 : upSpeed
  180. set_pev(id, pev_velocity, vVelocity)
  181.  
  182. #if defined DrawFlame
  183. pev(id, pev_origin, vVelocity)
  184. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vVelocity, 0)
  185. write_byte(TE_SPRITE)
  186. engfunc(EngFunc_WriteCoord, vVelocity[0])
  187. engfunc(EngFunc_WriteCoord, vVelocity[1])
  188. engfunc(EngFunc_WriteCoord, vVelocity[2])
  189. write_short(SprFlame)
  190. write_byte(8)
  191. write_byte(128)
  192. message_end()
  193. #endif
  194.  
  195. #if defined DrawTrail
  196. message_begin (MSG_BROADCAST,SVC_TEMPENTITY)
  197. write_byte (TE_BEAMFOLLOW)
  198. write_short (id)
  199. write_short (SprTrail)
  200. write_byte (TRAIL_LIFE)
  201. write_byte (TRAIL_WIDTH)
  202. write_byte (TRAIL_RED)
  203. write_byte (TRAIL_GREEN)
  204. write_byte (TRAIL_BLUE)
  205. write_byte (TRAIL_BRIGTHNESS)
  206. message_end()
  207. #endif
  208.  
  209. fJetpackFuel[id] > 80.0 ? emit_sound(id, CHAN_STREAM, SoundFly, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) : emit_sound(id, CHAN_STREAM, SoundBlow, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  210. fJetpackFuel[id] -= 1.0
  211. }
  212. }
  213.  
  214. //public zp_user_infected_pre(id)
  215. public zp_user_humanized_pre(id)
  216. {
  217. if(bHasJetPack[id]) DropJetPack(id);
  218.  
  219. ResetValues(id)
  220. }
  221.  
  222. public zp_extra_item_selected(id, item)
  223. {
  224. if(item == ItemJetPack)
  225. {
  226. if(bHasJetPack[id])
  227. {
  228. zp_colored_print(id, "^x04[ZP]^x01 Már van egy JetPack-ed!")
  229. return ZP_PLUGIN_HANDLED;
  230. }
  231. else if (jet_count() >= CCount)
  232. {
  233. zp_colored_print(id, "^x04[ZP]^x01 Sajnáljuk, de a JetPack maximális száma elérve!")
  234. return ZP_PLUGIN_HANDLED;
  235. }
  236. else
  237. {
  238. bHasJetPack[id] = true
  239. //zp_colored_print(id, "^x04[ZP]^x01 JetPack használat:^x04 Ugrás+Control^x01 -- |^x04 Késsel^x01 -- rakéta lövés.")
  240. engclient_cmd(id, "weapon_knife")
  241. ReplaceModel(id)
  242. }
  243. }
  244.  
  245. return PLUGIN_CONTINUE;
  246. }
  247.  
  248. jet_count()
  249. {
  250. new i, count = 0;
  251.  
  252. for(i = 1; i < 33; i++)
  253. {
  254. if(bHasJetPack[i])
  255. {
  256. count++;
  257. }
  258. }
  259. return count;
  260. }
  261.  
  262. public OnKnifeSecAtkPost(ent2)
  263. {
  264. if(pev_valid(ent2) == 2)
  265. {
  266. static id, Float:ctime
  267. id = get_pdata_cbase(ent2, 41, 4)
  268. ctime = get_gametime()
  269. if(is_user_alive(id) && bHasJetPack[id] && fLastShoot[id] < ctime)
  270. {
  271. new ent = engfunc(EngFunc_CreateNamedEntity, iAllocInfoTarget)
  272. if(ent)
  273. {
  274. engfunc(EngFunc_SetModel, ent, ModelRocket)
  275. engfunc(EngFunc_SetSize, ent, Float:{0.0, 0.0, 0.0}, Float:{0.0, 0.0, 0.0})
  276. new Float:fOrigin[3]
  277. pev(id, pev_origin, fOrigin)
  278. fOrigin[2] += 16.0
  279. engfunc(EngFunc_SetOrigin, ent, fOrigin)
  280. set_pev(ent, pev_classname, ClassnameRocket)
  281. set_pev(ent, pev_dmg, 100.0)
  282. set_pev(ent, pev_owner, id)
  283. velocity_by_aim(id, CRocketSpeed, fOrigin)
  284. set_pev(ent, pev_velocity, fOrigin)
  285. new Float:vecAngles[3]
  286. engfunc(EngFunc_VecToAngles, fOrigin, vecAngles)
  287. set_pev(ent, pev_angles, vecAngles)
  288. set_pev(ent, PevEntType, EntTypeRocket)
  289. set_pev(ent, pev_movetype, MOVETYPE_FLY)
  290. set_pev(ent, pev_effects, EF_LIGHT)
  291. set_pev(ent, pev_solid, SOLID_BBOX)
  292.  
  293. emit_sound(id, CHAN_STATIC, SoundShoot, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  294. emit_sound(ent, CHAN_WEAPON, SoundTravel, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  295.  
  296. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  297. write_byte(TE_BEAMFOLLOW)
  298. write_short(ent)
  299. write_short(SprTrail)
  300. write_byte(40)
  301. write_byte(5)
  302. write_byte(224)
  303. write_byte(224)
  304. write_byte(255)
  305. write_byte(192)
  306. message_end()
  307.  
  308. //set_pdata_float(ent2, 46, CCooldown, 4)
  309. //set_pdata_float(ent2, 47, CCooldown, 4)
  310. //set_pdata_float(ent2, 48, CCooldown, 4)
  311.  
  312. //set_pdata_float(id, 83, CCooldown, 5)
  313. fLastShoot[id] = ctime+CCooldown
  314. }
  315. else
  316. {
  317. client_print(id, print_chat, "[JpDebug] Nem sikerült létrehozni a rakétát!")
  318. fLastShoot[id] = ctime+1.5
  319. }
  320. }
  321. }
  322. }
  323.  
  324. public check_models(id)
  325. {
  326. if (!zp_get_user_zombie(id))
  327. {
  328. return FMRES_IGNORED
  329. }
  330. if(bHasJetPack[id])
  331. {
  332. new clip,ammo
  333. new wpnid = get_user_weapon(id,clip,ammo)
  334.  
  335. if ( wpnid == CSW_KNIFE )
  336. {
  337. ReplaceModel(id)
  338. }
  339. return PLUGIN_CONTINUE
  340. }
  341. return PLUGIN_CONTINUE
  342. }
  343.  
  344. /*
  345. public OnKnifeDeployPost(ent)
  346. {
  347. if(pev_valid(ent) == 2)
  348. {
  349. static id; id = get_pdata_cbase(ent, 41, 4)
  350. //if(is_user_alive(id) && bHasJetPack[id]) ReplaceModel(id);
  351. if(!is_user_alive(id)) return;
  352. //if(bHasJetPack[id]) ReplaceModel(id);
  353. if(bHasJetPack[id])
  354. {
  355. new clip,ammo
  356. new wpnid = get_user_weapon(id,clip,ammo)
  357.  
  358. if ( wpnid == CSW_KNIFE )
  359. {
  360.   ReplaceModel(id)
  361. }
  362. }
  363. }
  364. }
  365. */
  366.  
  367. public OnPlayerPreThink(id)
  368. {
  369. if(bHasJetPack[id] && fJetpackFuel[id] < CMaxFuel)
  370. {
  371. static button; button = pev(id, pev_button)
  372. if(!(button & IN_DUCK) && !(button & IN_JUMP)) fJetpackFuel[id] += CRegen;
  373. }
  374. }
  375.  
  376. public OnTouch(ent, id)
  377. {
  378. if(pev_valid(ent))
  379. {
  380. if(pev(ent, PevEntType) == EntTypeJetPack)
  381. {
  382. if(IsPlayer(id) && is_user_alive(id) && zp_get_user_zombie(id) && !bHasJetPack[id])
  383. {
  384. engfunc(EngFunc_RemoveEntity, ent)
  385. bHasJetPack[id] = true
  386. emit_sound(id, CHAN_STATIC, SoundPickup, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  387. engclient_cmd(id,"weapon_knife")
  388. ReplaceModel(id)
  389. }
  390. }
  391. else if(pev(ent, PevEntType) == EntTypeRocket)
  392. {
  393. static Float:fOrigin[3]
  394. pev(ent, pev_origin, fOrigin)
  395.  
  396. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fOrigin, 0)
  397. write_byte(TE_EXPLOSION)
  398. engfunc(EngFunc_WriteCoord, fOrigin[0])
  399. engfunc(EngFunc_WriteCoord, fOrigin[1])
  400. engfunc(EngFunc_WriteCoord, fOrigin[2])
  401. write_short(SprExp)
  402. write_byte(40)
  403. write_byte(30)
  404. write_byte(10)
  405. message_end()
  406.  
  407. #if defined DrawRing
  408. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fOrigin, 0)
  409. write_byte(TE_BEAMCYLINDER)
  410. engfunc(EngFunc_WriteCoord, fOrigin[0])
  411. engfunc(EngFunc_WriteCoord, fOrigin[1])
  412. engfunc(EngFunc_WriteCoord, fOrigin[2])
  413. engfunc(EngFunc_WriteCoord, fOrigin[0])
  414. engfunc(EngFunc_WriteCoord, fOrigin[1])
  415. engfunc(EngFunc_WriteCoord, fOrigin[2]+555.0)
  416. write_short(SprRing)
  417. write_byte(0)
  418. write_byte(1)
  419. write_byte(6)
  420. write_byte(8)
  421. write_byte(10)
  422. write_byte(224)
  423. write_byte(224)
  424. write_byte(255)
  425. write_byte(192)
  426. write_byte(5)
  427. message_end()
  428. #endif
  429.  
  430. static attacker; attacker = pev(ent, pev_owner)
  431. if(!is_user_connected(attacker))
  432. {
  433. engfunc(EngFunc_RemoveEntity, ent)
  434. return FMRES_IGNORED;
  435. }
  436.  
  437. if(pev_valid(id) && !is_user_connected(id))
  438. {
  439. static szClassname[32]
  440. pev(id, pev_classname, szClassname, 31)
  441. if(equal(szClassname, "func_breakable") && (pev(id, pev_solid) != SOLID_NOT))
  442. {
  443. dllfunc(DLLFunc_Use, id, ent)
  444. }
  445. }
  446.  
  447. static victim; victim = -1
  448. while((victim = engfunc(EngFunc_FindEntityInSphere, victim, fOrigin, CRadius)) != 0)
  449. {
  450. if(is_user_alive(victim) && !zp_get_user_zombie(victim))
  451. {
  452. static Float:originV[3], Float:dist, Float:damage
  453. pev(victim, pev_origin, originV)
  454. dist = get_distance_f(fOrigin, originV)
  455. damage = CDamage-(CDamage/CRadius)*dist
  456. if(damage > 0.0)
  457. {
  458. ExecuteHamB(Ham_TakeDamage, victim, ent, attacker, damage, DMG_BULLET)
  459. zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + victim );
  460. // client_print(attacker, print_chat, "[JpDebug] Rakéta sebzés: %.1f", damage)
  461. }
  462. }
  463. }
  464.  
  465. engfunc(EngFunc_RemoveEntity, ent)
  466. }
  467. }
  468.  
  469. return FMRES_IGNORED;
  470. }
  471.  
  472. public CmdDropJP(id)
  473. {
  474. if(is_user_alive(id) && bHasJetPack[id] && get_user_weapon(id) == CSW_KNIFE)
  475. {
  476. DropJetPack(id)
  477. ResetValues(id)
  478. set_pev(id, pev_viewmodel2, "models/v_knife.mdl")
  479. set_pev(id, pev_weaponmodel2, "models/p_knife.mdl")
  480. return PLUGIN_HANDLED;
  481. }
  482.  
  483. return PLUGIN_CONTINUE;
  484. }
  485.  
  486. ReplaceModel(id)
  487. {
  488. set_pev(id, pev_viewmodel2, ModelVJetPack)
  489. set_pev(id, pev_weaponmodel2, ModelPJetPack)
  490. }
  491.  
  492. DropJetPack(id)
  493. {
  494. new Float:fAim[3], Float:fOrigin[3]
  495. velocity_by_aim(id, 64, fAim)
  496. pev(id, pev_origin, fOrigin)
  497. fOrigin[0] += fAim[0]
  498. fOrigin[1] += fAim[1]
  499.  
  500. new ent = engfunc(EngFunc_CreateNamedEntity, iAllocInfoTarget)
  501. if(ent)
  502. {
  503. engfunc(EngFunc_SetModel, ent, ModelWJetPack)
  504. engfunc(EngFunc_SetSize, ent, Float:{-4.0,-4.0,-4.0}, Float:{4.0,4.0,4.0})
  505. engfunc(EngFunc_SetOrigin, ent, fOrigin)
  506. set_pev(ent, pev_classname, ClassnameJetPack)
  507. set_pev(ent, pev_dmg, 100.0)
  508. set_pev(ent, PevEntType, EntTypeJetPack)
  509. set_pev(ent, pev_movetype, MOVETYPE_TOSS)
  510. set_pev(ent, pev_solid, SOLID_TRIGGER)
  511. }
  512. }
  513.  
  514. RemoveAllJetPack()
  515. {
  516. new ent = engfunc(EngFunc_FindEntityByString, -1, "classname", ClassnameJetPack)
  517. while(ent > 0)
  518. {
  519. engfunc(EngFunc_RemoveEntity, ent)
  520. ent = engfunc(EngFunc_FindEntityByString, -1, "classname", ClassnameJetPack)
  521. }
  522. }
  523.  
  524. ResetValues(id)
  525. {
  526. bHasJetPack[id] = false
  527. fJetpackFuel[id] = get_pcvar_float(CvarMaxFuel)
  528. }
  529.  
  530. zp_colored_print(target, const message[], any:...)
  531. {
  532. static buffer[512], i, argscount
  533. argscount = numargs()
  534.  
  535. if (!target)
  536. {
  537. static iPlayers[32], iNum, j, player
  538. get_players(iPlayers, iNum, "ch")
  539. for (j = 0; j < iNum; j++)
  540. {
  541. player = iPlayers[j]
  542. static changed[5], changedcount
  543. changedcount = 0
  544.  
  545. for (i = 2; i < argscount; i++)
  546. {
  547. if (getarg(i) == LANG_PLAYER)
  548. {
  549. setarg(i, 0, player)
  550. changed[changedcount] = i
  551. changedcount++
  552. }
  553. }
  554.  
  555. vformat(buffer, charsmax(buffer), message, 3)
  556. message_begin(MSG_ONE_UNRELIABLE, MsgSayText, _, player)
  557. write_byte(player)
  558. write_string(buffer)
  559. message_end()
  560.  
  561. for (i = 0; i < changedcount; i++) setarg(changed[i], 0, LANG_PLAYER);
  562. }
  563. }
  564. else
  565. {
  566. vformat(buffer, charsmax(buffer), message, 3)
  567. message_begin(MSG_ONE, MsgSayText, _, target)
  568. write_byte(target)
  569. write_string(buffer)
  570. message_end()
  571. }
  572. }