HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <zombieplague>
  4. #include <engine>
  5. #include <hamsandwich>
  6.  
  7. new g_mp5[33]
  8. new g_m203_loaded[33]
  9. new g_ammo[33]
  10. new g_lastweap[33]
  11. new g_mp5navy
  12. new g_hegren
  13. /// new MaxPlayers
  14.  
  15. new cvar_crazynade,cvar_knockback,cvar_trail,cvar_radius,cvar_damage,cvar_bonus,cvar_reload,cvar_remove
  16.  
  17. new gmsgDeathMsg
  18. new gMsgID
  19.  
  20. new m_iTrail;
  21. new xplode;
  22.  
  23.  
  24. #define ICON_HIDE 0
  25. #define ICON_SHOW 1
  26. #define COST 2 // Modify grenade cost here
  27. #define MP5COST 10 // Modify Mp5 cost here
  28. #define fm_create_entity(%1) engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, %1))
  29.  
  30. public plugin_init() {
  31. register_plugin("[ZP] Extra Item : MP5 Nade Launcher","0.1","PaintLancer + 5c0r")
  32.  
  33.  
  34. // register_logevent("RoundEnd",2,"1=Round_End")
  35. register_event("DeathMsg","player_die","abd")
  36. register_event("CurWeapon","handle_gun","be","1=1")
  37. RegisterHam(Ham_Killed, "player", "player_die")
  38. RegisterHam(Ham_Spawn, "player", "player_spawn")
  39.  
  40.  
  41. register_forward(FM_CmdStart, "forward_CmdStart")
  42. register_forward(FM_SetModel, "forward_setmodel")
  43.  
  44. register_dictionary("zp_mp5_mod.txt")
  45.  
  46. cvar_crazynade = register_cvar("zp_mp5m203_crazynade","0") //makes nades bounce
  47. cvar_knockback = register_cvar("zp_mp5m203_conc","10.0")//force of knockback
  48. cvar_trail = register_cvar("zp_mp5m203_trail","1") //nade trails
  49. cvar_radius = register_cvar("zp_mp5m203_rad","200") //radius of dmg
  50. cvar_damage = register_cvar("zp_mp5m203_dmg","75") //dmg
  51. cvar_bonus = register_cvar("zp_mp5m203_bonus","2") // Reward Ammo pack for kill with grenade
  52. cvar_reload = register_cvar("zp_mp5m203_reloadtime","1.0") // Reload time for grenade
  53. cvar_remove = register_cvar("zp_mp5m203_remove","1") // Remove MP5 N.Launcher next round ( or when respawned)
  54.  
  55. g_mp5navy = zp_register_extra_item("MP5 Navy Nade Launcher",MP5COST,ZP_TEAM_HUMAN)
  56. g_hegren = zp_register_extra_item("Grenades for Mp5",COST, ZP_TEAM_HUMAN)
  57. gmsgDeathMsg = get_user_msgid("DeathMsg")
  58. gMsgID = get_user_msgid("StatusIcon")
  59.  
  60. }
  61. public plugin_precache() /// Precache models, sounds,bla bla bla..
  62. {
  63. precache_model("models/v_mp5m203.mdl")
  64. precache_model("models/p_9mmar.mdl")
  65. precache_model("models/w_9mmar.mdl")
  66. precache_model("models/grenade.mdl")
  67. precache_sound("misc/glauncher.wav")
  68. precache_sound("misc/a_exm2.wav")
  69.  
  70. m_iTrail = precache_model("sprites/smoke.spr")
  71. xplode = precache_model("sprites/zerogxplode2.spr")
  72. }
  73.  
  74.  
  75. public zp_user_infected_post(id) /// Forward when user is infected
  76. {
  77. if(g_mp5[id])
  78. // client_print(id,print_chat,"[ZP] U'jra kell venned egy Mp5 Nade Launcher-t!.")
  79. ammo_hud(id,0)
  80. g_mp5[id] = 0
  81. g_ammo[id] = 0
  82. }
  83.  
  84. public client_connect(id) /// Check when user is connected
  85. {
  86. g_mp5[id] = 0
  87. g_m203_loaded[id] = 1
  88. g_ammo[id] = 0
  89. }
  90.  
  91.  
  92. public player_die(id) /// When player is killed , I decided to use hamsandwich again :P
  93. {
  94. if(g_mp5[id])
  95. ammo_hud(id,0)
  96. g_ammo[id] = 0
  97. g_mp5[id] = 0
  98. // client_print(id,print_chat,"[ZP] Dead...")
  99. return PLUGIN_CONTINUE
  100. }
  101.  
  102.  
  103. public player_spawn(id) // When player is respawn (But it the same when roudn start...So I :P )
  104. {
  105. if ( get_pcvar_num(cvar_remove) == 1 && g_mp5[id] )
  106. {
  107. ammo_hud(id,0)
  108. g_mp5[id] = 0
  109. g_ammo[id] = 0
  110. // client_print(id,print_chat,"[ZP] U'jra kell venned egy Mp5 Nade Launcher-t!.") // Just check :D
  111. }
  112.  
  113. }
  114.  
  115. public zp_extra_item_selected(player, itemid) /// Buy extra item in menu ( Thanks meTaLiCroSS )
  116. {
  117. if (itemid == g_hegren)
  118. {
  119. if(!g_mp5[player])
  120. {
  121. client_print(player, print_chat, "[ZP] %L", player, "FIRST_NEEDED")
  122. zp_set_user_ammo_packs(player, zp_get_user_ammo_packs(player)+ COST )
  123.  
  124. return;
  125. }
  126.  
  127. ammo_hud(player,0);
  128. g_ammo[player] += 2
  129. client_print(player,print_chat,"[ZP] %L", player, "BOUGHT_2");
  130. ammo_hud(player,1);
  131. }
  132.  
  133. if(itemid == g_mp5navy)
  134. {
  135. if(g_mp5[player] && user_has_weapon(player, CSW_MP5NAVY))
  136. {
  137. client_print(player, print_chat, "[ZP] %L", player, "ALREADY")
  138. zp_set_user_ammo_packs(player, zp_get_user_ammo_packs(player)+ MP5COST )
  139.  
  140. return;
  141. }
  142. fm_give_item(player,"weapon_mp5navy")
  143. fm_give_item(player,"ammo_9mm")
  144. fm_give_item(player,"ammo_9mm")
  145. fm_give_item(player,"ammo_9mm")
  146. fm_give_item(player,"ammo_9mm")
  147. client_print(player,print_chat,"[ZP] %L", player, "BOUGHT_MP5")
  148. client_print(player,print_chat,"[ZP] %L", player, "ONLY_BUY")
  149. g_mp5[player] = true
  150. g_ammo[player] = 2
  151. ammo_hud(player,1)
  152. }
  153.  
  154. }
  155.  
  156.  
  157. public forward_setmodel(entity, model[])
  158. {
  159. if (!is_valid_ent(entity))
  160. {
  161. return FMRES_IGNORED
  162. }
  163.  
  164. if (equal(model, "models/w_mp5.mdl"))
  165. {
  166. new classname[11]
  167. entity_get_string(entity, EV_SZ_classname, classname, 10)
  168.  
  169. //client_print(0, print_chat, "Model: %s Classname: %s", model, classname)
  170.  
  171. if (equal(classname, "weaponbox"))
  172. {
  173. //client_print(0, print_chat, "Setting model")
  174.  
  175. entity_set_model(entity, "models/w_9mmar.mdl")
  176.  
  177. return FMRES_SUPERCEDE
  178. }
  179. }
  180.  
  181. return FMRES_IGNORED
  182. }
  183.  
  184. public forward_CmdStart(id, uc_handle, seed)
  185. {
  186. if(is_user_alive(id) && !zp_get_user_zombie(id) && get_user_weapon(id) == CSW_MP5NAVY)
  187. {
  188. if (entity_get_int(id, EV_INT_button) & IN_ATTACK2)
  189. {
  190. launch_nade(id)
  191. return FMRES_IGNORED
  192. }
  193. }
  194. return FMRES_IGNORED
  195. }
  196.  
  197.  
  198. public handle_gun(id)
  199. {
  200. new clip, ammo
  201. new weap = get_user_weapon(id,clip,ammo)
  202.  
  203. if(weap == CSW_MP5NAVY && g_lastweap[id] != weap && g_mp5[id] )
  204. {
  205. ammo_hud(id,1)
  206. //client_print(id, print_chat, "Setting Model")
  207. entity_set_string(id, EV_SZ_viewmodel, "models/v_mp5m203.mdl")
  208. entity_set_string(id, EV_SZ_weaponmodel, "models/p_9mmar.mdl")
  209. }
  210. else if(!g_mp5[id] || weap != CSW_MP5NAVY )
  211. {
  212. ammo_hud(id,0)
  213. }
  214. g_lastweap[id] = weap
  215.  
  216. return PLUGIN_HANDLED
  217. }
  218.  
  219. public launch_nade(id)
  220. {
  221. if(g_mp5[id] == 0 || g_m203_loaded[id] == 0 || !(is_user_alive(id)))
  222. return PLUGIN_CONTINUE
  223.  
  224. if(g_ammo[id] == 0)
  225. {
  226. client_print(id, print_center, "[ZP] %L", id, "OUT_OF")
  227. return PLUGIN_CONTINUE
  228. }
  229.  
  230. entity_set_int(id, EV_INT_weaponanim, 3)
  231.  
  232. new Float: Origin[3], Float: Velocity[3], Float: vAngle[3], Ent
  233.  
  234. entity_get_vector(id, EV_VEC_origin , Origin)
  235. entity_get_vector(id, EV_VEC_v_angle, vAngle)
  236.  
  237. //client_print(id, print_center, "Origin: %f-%f-%f", Origin[0], Origin[1], Origin[2])
  238. //client_print(id, print_center, "vAngle: %f-%f-%f", vAngle[0], vAngle[1], vAngle[2])
  239.  
  240. Origin[2] = Origin[2] + 10
  241.  
  242. Ent = create_entity("info_target")
  243.  
  244. if (!Ent) return PLUGIN_HANDLED
  245.  
  246. entity_set_string(Ent, EV_SZ_classname, "m203_nade")
  247. entity_set_model(Ent, "models/grenade.mdl")
  248.  
  249. new Float:MinBox[3] = {-1.0, -1.0, -1.0}
  250. new Float:MaxBox[3] = {1.0, 1.0, 1.0}
  251. entity_set_vector(Ent, EV_VEC_mins, MinBox)
  252. entity_set_vector(Ent, EV_VEC_maxs, MaxBox)
  253.  
  254. entity_set_origin(Ent, Origin)
  255. entity_set_vector(Ent, EV_VEC_angles, vAngle)
  256.  
  257. entity_set_int(Ent, EV_INT_effects, 2)
  258. entity_set_int(Ent, EV_INT_solid, 1)
  259. entity_set_int(Ent, EV_INT_movetype, 10)
  260. entity_set_edict(Ent, EV_ENT_owner, id)
  261.  
  262. VelocityByAim(id, 2500 , Velocity)
  263. entity_set_vector(Ent, EV_VEC_velocity ,Velocity)
  264.  
  265. emit_sound(id,CHAN_VOICE,"misc/glauncher.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  266.  
  267. g_m203_loaded[id] = 0
  268.  
  269. ammo_hud(id,0)
  270. g_ammo[id]--
  271. ammo_hud(id,1)
  272.  
  273. new parm[1]
  274. parm[0] = Ent
  275.  
  276. if(get_pcvar_num(cvar_trail))
  277. set_task(0.2, "grentrail",id,parm,1)
  278.  
  279. parm[0] = id
  280.  
  281. set_task(get_pcvar_float(cvar_reload), "m203_reload",id+9910,parm,1)
  282.  
  283. return PLUGIN_CONTINUE
  284. }
  285.  
  286. public m203_reload(parm[])
  287. {
  288. g_m203_loaded[parm[0]] = 1
  289. }
  290.  
  291. public vexd_pfntouch(pToucher, pTouched)
  292. {
  293. new szClassName[32]
  294.  
  295. if ( pToucher > 0)
  296. {
  297. entity_get_string(pToucher, EV_SZ_classname, szClassName, 31)
  298. }
  299. if(equal(szClassName, "m203_nade"))
  300. {
  301. if(!pTouched && get_pcvar_num(cvar_crazynade))
  302. return
  303.  
  304. new damradius = get_pcvar_num(cvar_radius)//200
  305. new maxdamage = get_pcvar_num(cvar_damage)//70
  306.  
  307. new tkill = 0
  308. new Float:fl_vExplodeAt[3]
  309. entity_get_vector(pToucher, EV_VEC_origin, fl_vExplodeAt)
  310. new vExplodeAt[3]
  311. vExplodeAt[0] = floatround(fl_vExplodeAt[0])
  312. vExplodeAt[1] = floatround(fl_vExplodeAt[1])
  313. vExplodeAt[2] = floatround(fl_vExplodeAt[2])
  314. new oid = entity_get_edict(pToucher, EV_ENT_owner)
  315. new origin[3],dist,i,Float:dRatio,damage
  316.  
  317. for ( i = 0; i < 32; i++)
  318. {
  319. if((is_user_alive(i)))
  320. {
  321. get_user_origin(i,origin)
  322. dist = get_distance(origin,vExplodeAt)
  323. if (dist <= damradius)
  324. {
  325. dRatio = floatdiv(float(dist),float(damradius))
  326. damage = maxdamage - floatround(floatmul(float(maxdamage),dRatio))
  327.  
  328. set_velocity_from_origin(i, fl_vExplodeAt, get_pcvar_float(cvar_knockback)*damage) // ThantiK's he-conc function - tried getting it to recognize m203 nades but failed so imported function
  329.  
  330. if(cvar_exists("mp_friendlyfire"))
  331. {
  332. if(i == oid)
  333. do_victim(i, oid, damage, 2)
  334. else if( get_cvar_num("mp_friendlyfire"))
  335. {
  336. if(get_user_team(i) == get_user_team(oid)) tkill = 1
  337. do_victim(i,oid,damage,tkill)
  338. }
  339. else
  340. {
  341. if(get_user_team(i) != get_user_team(oid))
  342. {
  343. do_victim(i,oid,damage,0)
  344. }
  345. }
  346. }
  347. else if(i == oid)
  348. do_victim(i, oid, damage, 2)
  349. else
  350. do_victim(i,oid,damage,0)
  351. }
  352. }
  353. }
  354.  
  355. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  356. write_byte(17)
  357. write_coord(vExplodeAt[0])
  358. write_coord(vExplodeAt[1])
  359. write_coord(vExplodeAt[2] + 60)
  360. write_short(xplode)
  361. write_byte(20)
  362. write_byte(200)
  363. message_end()
  364.  
  365. emit_sound(pToucher, CHAN_WEAPON, "misc/a_exm2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  366.  
  367. remove_entity(pToucher)
  368. }
  369. }
  370.  
  371. do_victim(victim,attacker,damage,tk)
  372. {
  373. new namek[32],namev[32],authida[35],authidv[35],teama[32],teamv[32]
  374. get_user_name(victim,namev,31)
  375. get_user_name(attacker,namek,31)
  376. get_user_authid(victim,authidv,34)
  377. get_user_authid(attacker,authida,34)
  378. get_user_team(victim,teamv,31)
  379. get_user_team(attacker,teama,31)
  380.  
  381. new Float:fl_dmg = float(damage)
  382.  
  383. if(damage >= get_user_health(victim))
  384. {
  385. set_msg_block(gmsgDeathMsg,BLOCK_SET)
  386. fakedamage(victim, "grenade", fl_dmg, DMG_BLAST) //user_kill(victim,1)
  387. set_msg_block(gmsgDeathMsg,BLOCK_NOT)
  388.  
  389. if(is_user_alive(victim)) //some cases where damage is messed with WC3? then return
  390. return
  391.  
  392. message_begin(MSG_ALL, get_user_msgid("DeathMsg"), {0,0,0}, 0)
  393. write_byte(attacker)
  394. write_byte(victim)
  395. write_byte(0)
  396. write_string("grenade")
  397. message_end()
  398. if(tk == 1)
  399. {
  400. client_print(attacker,print_center,"%L", attacker, "KILLED_TEAMMATE")
  401. log_message("^"%s<%d><%s><%s>^" megolve ^"%s<%d><%s><%s>^" gra'na'ttal^"",
  402. namek,get_user_userid(attacker),authida,teama,namev,get_user_userid(victim),authidv,teamv)
  403. }
  404. else if(tk == 2)
  405. {
  406. log_message("^"%s<%d><%s><%s>^" megolte saja't maga't^"gra'na'ttal^"",
  407. namek,get_user_userid(attacker),authida,teama)
  408. }
  409. else
  410. {
  411. new money = zp_get_user_ammo_packs(attacker)
  412. zp_set_user_ammo_packs(attacker, money + get_pcvar_num(cvar_bonus) )// award for kill
  413. }
  414. }
  415. else
  416. {
  417. fakedamage(victim, "grenade", fl_dmg, DMG_BLAST) //set_user_health(victim,get_user_health(victim) - damage )
  418.  
  419. if(tk == 1)
  420. {
  421. client_print(0,print_chat,"%L", victim, "ATTACKED_TEAMMATE", namek)
  422. }
  423. }
  424. }
  425.  
  426.  
  427. ammo_hud(id, sw)
  428. {
  429. new s_sprite[33]
  430. format(s_sprite,32,"number_%d",g_ammo[id])
  431.  
  432. if(sw)
  433. {
  434. message_begin( MSG_ONE, gMsgID, {0,0,0}, id )
  435. write_byte( ICON_SHOW ) // status
  436. write_string( s_sprite ) // sprite name
  437. write_byte( 0 ) // red
  438. write_byte( 150 ) // green
  439. write_byte( 0 ) // blue
  440. message_end()
  441. }
  442. else
  443. {
  444. message_begin( MSG_ONE, gMsgID, {0,0,0}, id )
  445. write_byte( ICON_HIDE ) // status
  446. write_string( s_sprite ) // sprite name
  447. write_byte( 0 ) // red
  448. write_byte( 160 ) // green
  449. write_byte( 0 ) // blue
  450. message_end()
  451. }
  452. }
  453.  
  454. /////////////////////
  455. //Thantik's he-conc functions
  456. stock get_velocity_from_origin( ent, Float:fOrigin[3], Float:fSpeed, Float:fVelocity[3] )
  457. {
  458. new Float:fEntOrigin[3];
  459. entity_get_vector( ent, EV_VEC_origin, fEntOrigin );
  460.  
  461. // Velocity = Distance / Time
  462.  
  463. new Float:fDistance[3];
  464. fDistance[0] = fEntOrigin[0] - fOrigin[0];
  465. fDistance[1] = fEntOrigin[1] - fOrigin[1];
  466. fDistance[2] = fEntOrigin[2] - fOrigin[2];
  467.  
  468. new Float:fTime = ( vector_distance( fEntOrigin,fOrigin ) / fSpeed );
  469.  
  470. fVelocity[0] = fDistance[0] / fTime;
  471. fVelocity[1] = fDistance[1] / fTime;
  472. fVelocity[2] = fDistance[2] / fTime;
  473.  
  474. return ( fVelocity[0] && fVelocity[1] && fVelocity[2] );
  475. }
  476.  
  477.  
  478. // Sets velocity of an entity (ent) away from origin with speed (speed)
  479.  
  480. stock set_velocity_from_origin( ent, Float:fOrigin[3], Float:fSpeed )
  481. {
  482. new Float:fVelocity[3];
  483. get_velocity_from_origin( ent, fOrigin, fSpeed, fVelocity )
  484.  
  485. entity_set_vector( ent, EV_VEC_velocity, fVelocity );
  486.  
  487. return ( 1 );
  488. }
  489.  
  490. public grentrail(parm[])
  491. {
  492. new gid = parm[0]
  493.  
  494. if (gid)
  495. {
  496. message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
  497. write_byte( TE_BEAMFOLLOW )
  498. write_short(gid) // entity
  499. write_short(m_iTrail) // model
  500. write_byte( 10 ) // life
  501. write_byte( 5 ) // width
  502. write_byte( 255 ) // r, g, b
  503. write_byte( 255 ) // r, g, b
  504. write_byte( 255 ) // r, g, b
  505. write_byte( 100 ) // brightness
  506.  
  507. message_end() // move PHS/PVS data sending into here (SEND_ALL, SEND_PVS, SEND_PHS)
  508. }
  509. }
  510.  
  511. stock fm_give_item(index, const item[]) {
  512. if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10))
  513. return 0;
  514.  
  515. new ent = fm_create_entity(item);
  516. if (!pev_valid(ent))
  517. return 0;
  518.  
  519. new Float:origin[3];
  520. pev(index, pev_origin, origin);
  521. set_pev(ent, pev_origin, origin);
  522. set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN);
  523. dllfunc(DLLFunc_Spawn, ent);
  524.  
  525. new save = pev(ent, pev_solid);
  526. dllfunc(DLLFunc_Touch, ent, index);
  527. if (pev(ent, pev_solid) != save)
  528. return ent;
  529.  
  530. engfunc(EngFunc_RemoveEntity, ent);
  531.  
  532. return -1;
  533. }
  534.  
  535.  
  536. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  537. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
  538. */
  539.