HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <engine>
  3. #include <fakemeta>
  4. #include <fakemeta_util>
  5. #include <fun>
  6. #include <hamsandwich>
  7. #include <xs>
  8. #include <cstrike>
  9. #include <zombieplague>
  10.  
  11. #define ENG_NULLENT -1
  12. #define EV_INT_WEAPONKEY EV_INT_impulse
  13. #define m32_WEAPONKEY 91421
  14.  
  15. new const GRENADE_MODEL[] = "models/grenade.mdl"
  16. new in_zoom[33]
  17. new g_reload[33]
  18. // Sprites
  19. new const GRENADE_TRAIL[] = "sprites/laserbeam.spr"
  20. new const GRENADE_EXPLOSION[] = "sprites/zerogxplode.spr"
  21. new sTrail, sExplo
  22. const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_P90)|(1<<CSW_P90)|(1<<CSW_P90)|(1<<CSW_SG550)|(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)|(1<<CSW_P90)|(1<<CSW_AK47)|(1<<CSW_P90)
  23.  
  24. new const Fire_Sounds[][] = { "weapons/m32-1.wav" }
  25.  
  26. new gmsgWeaponList
  27. new m32_V_MODEL[64] = "models/v_m32.mdl"
  28. new m32_P_MODEL[64] = "models/p_m32.mdl"
  29. new m32_W_MODEL[64] = "models/w_m32.mdl"
  30.  
  31. new cvar_clip_m32, cvar_m32_ammo,cvar_dmg
  32. new g_has_m32[33]
  33. new g_MaxPlayers, g_orig_event_m32
  34. new g_itemid
  35. public plugin_init()
  36. {
  37. register_plugin("M32", "2.6", "Arwel / PbI)I(Uu'")
  38. register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
  39. register_event("CurWeapon","CurrentWeapon","be","1=1")
  40. RegisterHam(Ham_Item_AddToPlayer, "weapon_m3", "m32AddToPlayer")
  41. register_forward(FM_CmdStart, "fw_CmdStart")
  42. RegisterHam( Ham_Weapon_PrimaryAttack, "weapon_m3", "fw_attack" )
  43. RegisterHam( Ham_Weapon_PrimaryAttack, "weapon_m3", "fw_attackp", 1 )
  44. RegisterHam(Ham_Item_Deploy,"weapon_m3", "fw_Item_Deploy_Post", 1)
  45. RegisterHam(Ham_Weapon_Reload, "weapon_m3", "fw_r")
  46. RegisterHam(Ham_Weapon_Reload, "weapon_m3", "fw_reload" )
  47. register_forward(FM_SetModel, "modelka")
  48. register_forward(FM_UpdateClientData, "client_data_post", 1)
  49. register_forward(FM_PlaybackEvent, "PlaybackEvent")
  50.  
  51. cvar_clip_m32 = register_cvar("m32_clip", "6")
  52. cvar_m32_ammo = register_cvar("m32_ammo", "18")
  53. cvar_dmg = register_cvar("m32_dmg","600.0")
  54.  
  55. //register_clcmd("buyammo1", "clcmd_buyammo")
  56. //register_clcmd("buyammo2", "clcmd_buyammo")
  57. g_itemid = zp_register_extra_item("Milkor M32 MGL", 11500 ,ZP_TEAM_HUMAN)
  58. gmsgWeaponList = get_user_msgid("WeaponList")
  59. g_MaxPlayers = get_maxplayers()
  60. }
  61.  
  62. public plugin_precache()
  63. {
  64. precache_model(m32_V_MODEL)
  65. precache_model(m32_P_MODEL)
  66. precache_model(m32_W_MODEL)
  67. precache_model(GRENADE_MODEL)
  68. sTrail = precache_model(GRENADE_TRAIL)
  69. sExplo = precache_model(GRENADE_EXPLOSION)
  70. precache_sound("weapons/m32_after_reload.wav")
  71. precache_sound("weapons/m32_insert.wav")
  72. precache_sound("weapons/m32_start_reload.wav")
  73. precache_sound(Fire_Sounds[0])
  74. precache_generic( "sprites/weapon_m32.txt" )
  75. precache_generic( "sprites/zp_cso/640hud75.spr" )
  76. precache_generic( "sprites/zp_cso/640hud7x.spr" )
  77. precache_generic( "sprites/zp_cso/scope_grenade.spr" )
  78.  
  79. register_clcmd("weapon_m32", "Hook_Select")
  80. register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
  81. }
  82.  
  83. public zp_extra_item_selected(id, itemid) if(itemid==g_itemid) give_m32(id)
  84.  
  85. public Hook_Select(id)
  86. {
  87. engclient_cmd(id, "weapon_m3")
  88. return PLUGIN_HANDLED
  89. }
  90.  
  91. public fwPrecacheEvent_Post(type, const name[])
  92. {
  93. if (equal("events/m3.sc", name))
  94. {
  95. g_orig_event_m32 = get_orig_retval()
  96. return FMRES_HANDLED
  97. }
  98.  
  99. return FMRES_IGNORED
  100. }
  101.  
  102.  
  103. /*public clcmd_buyammo(id)
  104. {
  105. // Not alive or infinite ammo setting enabled
  106. if (!is_user_alive(id) || !user_has_weapon(id,CSW_M3) || !g_has_m32[id])
  107. return PLUGIN_CONTINUE
  108.  
  109.  
  110.  
  111. if (zp_get_user_ammo_packs(id) < 1)
  112. {
  113. client_print(id,print_chat,"You need 1 ammo")
  114. return PLUGIN_CONTINUE
  115. }
  116.  
  117. // Get user weapons
  118. static currentammo, refilled
  119. refilled = false
  120. if(cs_get_user_bpammo(id,CSW_M3)>=18)
  121. return PLUGIN_HANDLED
  122.  
  123. // Give additional ammo
  124. ExecuteHamB(Ham_GiveAmmo, id, 6, "buckshot", 18)
  125. // Check whether we actually refilled the weapon's ammo
  126. if (cs_get_user_bpammo(id, CSW_M3) - currentammo > 0) refilled = true
  127.  
  128. // Weapons already have full ammo
  129. if (!refilled) return PLUGIN_CONTINUE
  130.  
  131. // Deduce ammo packs, play clip purchase sound, and notify player
  132. zp_set_user_ammo_packs(id,zp_get_user_ammo_packs(id)-1)
  133. emit_sound(id, CHAN_ITEM, "items/9mmclip1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  134.  
  135. return PLUGIN_CONTINUE
  136. }*/
  137.  
  138. public modelka(entity, model[])
  139. {
  140. if(!is_valid_ent(entity))
  141. return FMRES_IGNORED;
  142.  
  143. static szClassName[33]
  144. entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
  145.  
  146. if(!equal(szClassName, "weaponbox"))
  147. return FMRES_IGNORED;
  148.  
  149. static iOwner
  150. iOwner = entity_get_edict(entity, EV_ENT_owner)
  151.  
  152. if(equal(model, "models/w_m3.mdl"))
  153. {
  154. static iStoredAugID
  155. iStoredAugID = find_ent_by_owner(-1, "weapon_m3", entity)
  156.  
  157. if(!is_valid_ent(iStoredAugID))
  158. return FMRES_IGNORED;
  159.  
  160. if(g_has_m32[iOwner])
  161. {
  162. entity_set_int(iStoredAugID, EV_INT_impulse, 91421)
  163. g_has_m32[iOwner] = false
  164. g_reload[iOwner]=0
  165. if(in_zoom[iOwner]){
  166. set_zoom(iOwner,0)
  167. return PLUGIN_CONTINUE
  168. }
  169. entity_set_model(entity, m32_W_MODEL)
  170.  
  171. return FMRES_SUPERCEDE;
  172. }
  173. }
  174.  
  175. return FMRES_IGNORED;
  176. }
  177.  
  178. public Sprite(id,type)
  179. {
  180.  
  181. message_begin(MSG_ONE, gmsgWeaponList, {0,0,0}, id)
  182. write_string(type?"weapon_m32":"weapon_m3")
  183. write_byte(5)
  184. write_byte(32)
  185. write_byte(-1)
  186. write_byte(-1)
  187. write_byte(0)
  188. write_byte(5)
  189. write_byte(21)
  190. write_byte(0)
  191. message_end()
  192. }
  193.  
  194. public give_m32(id)
  195. {
  196. drop_weapons(id, 1)
  197. new iWep2 = give_item(id,"weapon_m3")
  198. if( iWep2 > 0 )
  199. {
  200. cs_set_weapon_ammo(iWep2, get_pcvar_num(cvar_clip_m32))
  201. cs_set_user_bpammo (id, CSW_M3, get_pcvar_num(cvar_m32_ammo))
  202. }
  203.  
  204. if(in_zoom[id])
  205. {
  206. cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
  207. in_zoom[id] = 0
  208. }
  209. Sprite(id,1)
  210. set_zoom(id,0)
  211. g_reload[id]=0
  212. g_has_m32[id] = true
  213. }
  214.  
  215. public m32AddToPlayer(m32, id)
  216. {
  217. if(!is_valid_ent(m32) || !is_user_connected(id)) return HAM_IGNORED
  218.  
  219. if(entity_get_int(m32, EV_INT_WEAPONKEY) == m32_WEAPONKEY)
  220. {
  221. g_has_m32[id] = true
  222. g_reload[id]=0
  223. set_zoom(id,0)
  224. entity_set_int(m32, EV_INT_WEAPONKEY, 0)
  225. Sprite(id,1)
  226. return HAM_HANDLED
  227. }
  228. if(entity_get_int(m32, EV_INT_WEAPONKEY) != m32_WEAPONKEY) Sprite(id,0)
  229.  
  230. return HAM_IGNORED
  231. }
  232.  
  233. public fw_Item_Deploy_Post(weapon_ent)
  234. {
  235. new owner
  236. owner = pev(weapon_ent,pev_owner)
  237. if(is_user_alive(owner) && get_user_weapon(owner) == CSW_M3)
  238. {
  239. set_zoom(owner,0)
  240. }
  241. static weaponid
  242. weaponid = cs_get_weapon_id(weapon_ent)
  243. if(is_user_alive(owner))
  244. replace_weapon_models(owner, weaponid)
  245. }
  246.  
  247. public CurrentWeapon(id)
  248. {
  249. if( read_data(2) != CSW_M3 ) {
  250. if( g_reload[id] ) {
  251. g_reload[id] = false
  252. remove_task( id + 1331 )
  253. }
  254. }
  255. replace_weapon_models(id, read_data(2))
  256. remove_task(id)
  257. }
  258.  
  259. replace_weapon_models(id, weaponid)
  260. {
  261. switch (weaponid)
  262. {
  263. case CSW_M3:
  264. {
  265. if(g_has_m32[id] && is_user_alive(id))
  266. {
  267.  
  268. set_pev(id, pev_viewmodel2, m32_V_MODEL)
  269. set_pev(id, pev_weaponmodel2, m32_P_MODEL)
  270. }
  271. }
  272. }
  273. }
  274.  
  275. public client_data_post(Player, SendWeapons, CD_Handle)
  276. {
  277. if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_M3) || !g_has_m32[Player]) return FMRES_IGNORED
  278.  
  279. set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.00001)
  280. return FMRES_HANDLED
  281. }
  282.  
  283. public fw_CmdStart(id, uc_handle, seed)
  284. {
  285. new ammo, clip, weapon = get_user_weapon(id, clip, ammo)
  286. if (!g_has_m32[id] || weapon != CSW_M3 || !is_user_alive(id))
  287. return
  288.  
  289. if(( get_uc( uc_handle, UC_Buttons ) & IN_ATTACK2 ) && !( pev( id, pev_oldbuttons ) & IN_ATTACK2 )) {
  290. if(!in_zoom[id] && !g_reload[id]) set_zoom(id,1)
  291. else set_zoom(id,0)
  292. }
  293. }
  294.  
  295. public fw_attack( wpn ) {
  296. if( g_has_m32[ pev( wpn, pev_owner ) ] ) return HAM_SUPERCEDE
  297. return HAM_IGNORED
  298. }
  299.  
  300. public fw_attackp( wpn ) {
  301. new id = pev( wpn, pev_owner ), clip, bpammo
  302. get_user_weapon( id, clip, bpammo )
  303. if( g_has_m32[ id ] ) {
  304. if( clip > 0 ) {
  305. if( g_reload[id] ) {
  306. UTIL_PlayWeaponAnimation( id, 4 )
  307. set_pdata_float( id, 83, 1.0 )
  308. remove_task( id + 1331 )
  309. g_reload[id] = false
  310. return
  311. }
  312.  
  313. UTIL_PlayWeaponAnimation(id,random_num(1,2))
  314. emit_sound( id, CHAN_WEAPON, Fire_Sounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM )
  315. FireGrenade( id )
  316. MakeRecoil( id )
  317.  
  318. set_pdata_float( id, 83, 0.6 )
  319. }
  320. }
  321. }
  322.  
  323. public MakeRecoil(id)
  324. {
  325. if(!is_user_alive(id))
  326. return;
  327.  
  328. if(zp_get_user_zombie(id))
  329. return;
  330.  
  331. if(!g_has_m32[id])
  332. return;
  333.  
  334. static Float:punchAngle[3];
  335. punchAngle[0] = float(random_num(-1 * 400, 400)) / 100.0;
  336. punchAngle[1] = float(random_num(-1 * 700, 700)) / 100.0;
  337. punchAngle[2] = 0.0;
  338. set_pev(id, pev_punchangle, punchAngle);
  339. }
  340.  
  341. public FireGrenade(id)
  342. {
  343. new ammo, clip
  344. get_user_weapon(id, clip, ammo)
  345. static wep
  346. wep = find_ent_by_owner(-1, "weapon_m3", id)
  347. cs_set_weapon_ammo(wep,clip-1)
  348. new Float:origin[3],Float:velocity[3],Float:angles[3]
  349. engfunc(EngFunc_GetAttachment, id, 0, origin,angles)
  350. pev(id,pev_angles,angles)
  351. new ent = create_entity( "info_target" )
  352. set_pev( ent, pev_classname, "m32_grenade" )
  353. set_pev( ent, pev_solid, SOLID_BBOX )
  354. set_pev( ent, pev_movetype, MOVETYPE_TOSS )
  355. set_pev( ent, pev_mins, { -0.1, -0.1, -0.1 } )
  356. set_pev( ent, pev_maxs, { 0.1, 0.1, 0.1 } )
  357. entity_set_model( ent, GRENADE_MODEL )
  358. set_pev( ent, pev_origin, origin )
  359. set_pev( ent, pev_angles, angles )
  360. set_pev( ent, pev_owner, id )
  361. velocity_by_aim( id, in_zoom[id]? 1400 : 1000 , velocity )
  362. set_pev( ent, pev_velocity, velocity )
  363. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  364. write_byte(TE_BEAMFOLLOW) // Temporary entity ID
  365. write_short(ent) // Entity
  366. write_short(sTrail) // Sprite index
  367. write_byte(10) // Life
  368. write_byte(3) // Line width
  369. write_byte(255) // Red
  370. write_byte(255) // Green
  371. write_byte(255) // Blue
  372. write_byte(50) // Alpha
  373. message_end()
  374. return PLUGIN_CONTINUE
  375. }
  376.  
  377.  
  378.  
  379. // We hit something!!!
  380. public pfn_touch(ptr, ptd)
  381. {
  382. // If ent is valid
  383. if (pev_valid(ptr))
  384. {
  385. // Get classnames
  386. static classname[32]
  387. pev(ptr, pev_classname, classname, 31)
  388.  
  389. // Our ent
  390. if(equal(classname, "m32_grenade"))
  391. {
  392. // Get it's origin
  393. new Float:originF[3]
  394. pev(ptr, pev_origin, originF)
  395. engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, originF, 0)
  396. write_byte(TE_WORLDDECAL)
  397. engfunc(EngFunc_WriteCoord, originF[0])
  398. engfunc(EngFunc_WriteCoord, originF[1])
  399. engfunc(EngFunc_WriteCoord, originF[2])
  400. write_byte(engfunc(EngFunc_DecalIndex,"{scorch3"))
  401. message_end()
  402. // Draw explosion
  403. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  404. write_byte(TE_EXPLOSION) // Temporary entity ID
  405. engfunc(EngFunc_WriteCoord, originF[0]) // engfunc because float
  406. engfunc(EngFunc_WriteCoord, originF[1])
  407. engfunc(EngFunc_WriteCoord, originF[2]+30.0)
  408. write_short(sExplo) // Sprite index
  409. write_byte(25) // Scale
  410. write_byte(35) // Framerate
  411. write_byte(0) // Flags
  412. message_end()
  413.  
  414. // Get owner
  415. new owner = pev(ptr, pev_owner)
  416. // Alive...
  417. new a = FM_NULLENT
  418. // Get distance between victim and epicenter
  419. while((a = find_ent_in_sphere(a,originF,300.0)) != 0) {
  420. if( a!=owner&& a!=ptr&&pev(a,pev_takedamage)!=DAMAGE_NO) ExecuteHamB( Ham_TakeDamage, a ,owner ,owner, get_pcvar_float(cvar_dmg), DMG_BULLET )
  421. set_pev(ptr, pev_flags, FL_KILLME)
  422. }
  423. }
  424. }
  425.  
  426. }
  427.  
  428. public PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
  429. {
  430. if ((eventid != g_orig_event_m32)) return FMRES_IGNORED
  431. if (!(1 <= invoker <= g_MaxPlayers)) return FMRES_IGNORED
  432.  
  433. playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
  434. return FMRES_SUPERCEDE
  435. }
  436.  
  437.  
  438. public message_DeathMsg(msg_id, msg_dest, id)
  439. {
  440. static szTruncatedWeapon[33], iAttacker, iVictim
  441.  
  442. get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
  443.  
  444. iAttacker = get_msg_arg_int(1)
  445. iVictim = get_msg_arg_int(2)
  446.  
  447. if(!is_user_connected(iAttacker) || iAttacker == iVictim) return PLUGIN_CONTINUE
  448.  
  449. if(get_user_weapon(iAttacker) == CSW_M3)
  450. {
  451. if(g_has_m32[iAttacker])
  452. set_msg_arg_string(4, "grenade")
  453. }
  454.  
  455. return PLUGIN_CONTINUE
  456. }
  457.  
  458. stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
  459. {
  460. set_pev(Player, pev_weaponanim, Sequence)
  461.  
  462. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
  463. write_byte(Sequence)
  464. write_byte(2)
  465. message_end()
  466. }
  467.  
  468.  
  469. public fw_r( wpn ) {
  470. if( g_has_m32[ pev( wpn, pev_owner ) ] ) {
  471. fw_reload( wpn )
  472. return HAM_SUPERCEDE
  473. }
  474. return HAM_IGNORED
  475. }
  476.  
  477. public fw_reload(weapon) {
  478. new id = pev( weapon, pev_owner )
  479. new clip, bpammo
  480. get_user_weapon(id, clip, bpammo )
  481. if( g_has_m32[ id ] && clip < 6 && bpammo > 0 ) {
  482. if(!task_exists( id+1331 )) set_task( 0.1, "reload", id+1331 )
  483. }
  484. if(in_zoom[id])
  485. {
  486. cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
  487. in_zoom[id] = 0
  488. }
  489. return HAM_IGNORED
  490. }
  491.  
  492. public reload( id ) {
  493. id -= 1331
  494. new clip, bpammo, weapon = find_ent_by_owner( -1, "weapon_m3", id )
  495. get_user_weapon(id, clip, bpammo )
  496. if(!g_reload[id]) {
  497. set_zoom(id,0)
  498. UTIL_PlayWeaponAnimation( id, 5 )
  499. g_reload[ id ] = 1
  500. set_pdata_float( id, 83, 1.0, 5 )
  501. set_task( 1.0, "reload", id+1331 )
  502. return
  503. }
  504.  
  505. if(in_zoom[id])
  506. {
  507. cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
  508. in_zoom[id] = 0
  509. }
  510.  
  511. if( clip > 5 || bpammo < 1 ) {
  512. UTIL_PlayWeaponAnimation( id, 4 )
  513. g_reload[ id ] = 0
  514. set_pdata_float( id, 83, 1.5, 5 )
  515. return
  516. }
  517. cs_set_user_bpammo( id, CSW_M3, bpammo - 1 )
  518. cs_set_weapon_ammo( weapon, clip + 1 )
  519. set_pdata_float( id, 83, 1.0, 5 )
  520. UTIL_PlayWeaponAnimation( id, 3 )
  521. set_task( 1.0, "reload", id+1331 )
  522. }
  523.  
  524. stock drop_weapons(id, dropwhat)
  525. {
  526. static weapons[32], num, i, weaponid
  527. num = 0
  528. get_user_weapons(id, weapons, num)
  529.  
  530. for (i = 0; i < num; i++)
  531. {
  532. weaponid = weapons[i]
  533.  
  534. if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
  535. {
  536. static wname[32]
  537. get_weaponname(weaponid, wname, sizeof wname - 1)
  538. engclient_cmd(id, "drop", wname)
  539. }
  540. }
  541. }
  542.  
  543. stock set_zoom(index,type){
  544. if(type==0){
  545. if(in_zoom[index]==1){
  546. cs_set_user_zoom(index, CS_SET_AUGSG552_ZOOM, 1)
  547.  
  548. in_zoom[index]=0
  549. emit_sound( index, CHAN_ITEM, "weapons/zoom.wav", 0.20, 2.40, 0, 100 )
  550. }
  551. }
  552. if(type==1){
  553. if(in_zoom[index]==0){
  554. cs_set_user_zoom(index, CS_RESET_ZOOM, 1)
  555.  
  556. in_zoom[index]=1
  557. emit_sound( index, CHAN_ITEM, "weapons/zoom.wav", 0.20, 2.40, 0, 100 )
  558. }
  559. }
  560. }
  561. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  562. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
  563. */
  564.