//==========================================================================================================================================\\ // \\ // Creative Commons Attribution-NonCommercial 4.0 International \\ // https://creativecommons.org/licenses/by-nc/4.0/ \\ // \\ // * You are free to: \\ // * Copy and redistribute the material in any medium or format. \\ // * Remix, transform, and build upon the material. \\ // \\ // * Under the following terms: \\ // * You must give appropriate credit, provide a link to the license, and indicate if changes were made. \\ // * You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. \\ // * You may not use the material for commercial purposes. \\ // * You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. \\ // \\ //==========================================================================================================================================\\ namespace BetterWeapons { enum hgun_e { HGUN_IDLE1 = 0, HGUN_FIDGETSWAY, HGUN_FIDGETSHAKE, HGUN_DOWN, HGUN_UP, HGUN_SHOOT }; float flSpread; float m_flRechargeTime; int m_iAgruntMuzzleFlashHG; namespace weapon_hornetgun { void removethehornet(EHandle ePlayer) { if(ePlayer) { CBaseEntity@ pPlayer = ePlayer; RemoveHornet(pPlayer, pPlayer.pev.origin, 100); } } void RemoveHornet(CBaseEntity@ pWho, Vector vecWhere, float flRadius) { array aEnts(32); int iNum = g_EntityFuncs.MonstersInSphere(aEnts, vecWhere, flRadius); for (int i = 0; i < iNum; ++i) { CBaseEntity@ pEnt = aEnts[i]; CBaseEntity@ pOwner = g_EntityFuncs.Instance( pEnt.pev.owner ); if ( pOwner !is null && pEnt.pev.health < 2 && pEnt.IsMonster() && !pEnt.IsPlayer() && pEnt.Classify() == CLASS_PLAYER_BIOWEAPON && pEnt.pev.classname == "playerhornet" ) { g_EntityFuncs.Remove(pEnt); } } } void ShootHornet( CBasePlayer@ pPlayer, CBasePlayerWeapon@ pWeapon ) { pPlayer.pev.effects = EF_MUZZLEFLASH; Vector vecSrc = pPlayer.GetGunPosition() + g_Engine.v_forward * 32 + g_Engine.v_right * 8 + g_Engine.v_up * -12; NetworkMessage message( MSG_PVS, NetworkMessages::SVC_TEMPENTITY, vecSrc ); message.WriteByte(TE_SPRITE); message.WriteCoord(vecSrc.x); message.WriteCoord(vecSrc.y); message.WriteCoord(vecSrc.z); message.WriteShort(m_iAgruntMuzzleFlashHG); message.WriteByte(4); message.WriteByte(128); message.End(); CBaseEntity@ pHornet = g_EntityFuncs.Create( "hivehornet", vecSrc, pPlayer.pev.v_angle, false, pPlayer.edict() ); pHornet.pev.velocity = g_Engine.v_forward * 300; pHornet.pev.angles = Math.VecToAngles( pHornet.pev.velocity ); pPlayer.m_iWeaponVolume = QUIET_GUN_VOLUME; pPlayer.SetAnimation( PLAYER_ATTACK1 ); pWeapon.SendWeaponAnim( HGUN_SHOOT, 0, 0 ); m_flRechargeTime = g_Engine.time + 0.25; switch ( Math.RandomLong ( 0 , 2 ) ) { case 0: g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_WEAPON, "agrunt/ag_fire1.wav", 1.0, ATTN_NORM, 0, 100 ); break; case 1: g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_WEAPON, "agrunt/ag_fire2.wav", 1.0, ATTN_NORM, 0, 100 ); break; case 2: g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_WEAPON, "agrunt/ag_fire3.wav", 1.0, ATTN_NORM, 0, 100 ); break; } } ReflectionHook OnPlayerAttack( CBasePlayer@ pPlayer, CBasePlayerWeapon@ pWeapon, int AttackMode ) { if( pPlayer is null || pWeapon is null ) return ReflectionHook::NONE; json js = json( pJson[ "weapon_hornetgun" ] ); bool isAdmin = g_PlayerFuncs.AdminLevel(pPlayer) >= ADMIN_YES; m_iAgruntMuzzleFlashHG = g_Game.PrecacheModel( "sprites/muz4.spr" ); switch( AttackMode ) { case ATTACK::PRIMARY: { if( (pPlayer.pev.flags & FL_FAKECLIENT) != 0 ) //isAdmin || (pPlayer.pev.flags & FL_FAKECLIENT) != 0 ) { pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType, 100 ); } /*if( isAdmin && pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) < 1 ) { pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType, 7 ); }*/ EHandle ePlayer = pPlayer; m_flRechargeTime = g_Engine.time + 0.25; //cast(pWeapon).m_flRechargeTime = 1.0; Vector punchangle = Vector( js[ "punchangle" ] ); //Vector vecAngle = pPlayer.pev.v_angle; //if( vecAngle.x < -54.5 ) vecAngle.x = -54.5; //if( vecAngle.x > 32.0 ) vecAngle.x = 32.0; //Math.MakeVectors( vecAngle ); Vector vecSrc = pPlayer.GetGunPosition() + g_Engine.v_forward * 32 + g_Engine.v_right * 8 + g_Engine.v_up * -12; pPlayer.pev.effects = EF_MUZZLEFLASH; if ( pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) != 0 ) { NetworkMessage message( MSG_PVS, NetworkMessages::SVC_TEMPENTITY, vecSrc ); message.WriteByte(TE_SPRITE); message.WriteCoord(vecSrc.x); message.WriteCoord(vecSrc.y); message.WriteCoord(vecSrc.z); message.WriteShort(m_iAgruntMuzzleFlashHG); message.WriteByte(4); message.WriteByte(128); message.End(); CBaseEntity@ pHornet = g_EntityFuncs.Create( "hivehornet", vecSrc, pPlayer.pev.v_angle, false, pPlayer.edict() ); pHornet.pev.velocity = g_Engine.v_forward * 300; pHornet.pev.angles = Math.VecToAngles( pHornet.pev.velocity ); cast(pHornet).m_flFieldOfView = 0.25; cast(pHornet).m_flDistLook = 4048.0; } pPlayer.pev.punchangle.x = 0; pPlayer.pev.punchangle.z = 0; pPlayer.pev.punchangle.y = 0; pWeapon.m_flNextPrimaryAttack = pJson[ "weapon_hornetgun", {} ][ "m_flNextPrimaryAttack", 0.2 ]; pWeapon.m_flNextSecondaryAttack = pJson[ "weapon_hornetgun", {} ][ "m_flNextSecondaryAttack", 0.2 ]; g_Scheduler.SetTimeout("removethehornet", 0.05f, ePlayer); break; } case ATTACK::SECONDARY: { //if( pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) != 0 ) //{ /*if( pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) == 0 ) { pWeapon.m_flNextPrimaryAttack = 0.2; return ReflectionHook::NONE; }*/ if( isAdmin && pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) < 1 ) { pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType, 7 ); } /*EHandle ePlayer = pPlayer; m_flRechargeTime = g_Engine.time + 0.25; Vector punchangle = Vector( js[ "punchangle" ] );*/ Vector vecSrc = pPlayer.GetGunPosition() + g_Engine.v_forward * 32 + g_Engine.v_right * 8 + g_Engine.v_up * -12; pPlayer.pev.effects = EF_MUZZLEFLASH; if ( pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) != 0 ) { NetworkMessage message( MSG_PVS, NetworkMessages::SVC_TEMPENTITY, vecSrc ); message.WriteByte(TE_SPRITE); message.WriteCoord(vecSrc.x); message.WriteCoord(vecSrc.y); message.WriteCoord(vecSrc.z); message.WriteShort(m_iAgruntMuzzleFlashHG); message.WriteByte(4); message.WriteByte(128); message.End(); } /*CBaseEntity@ pHornet = g_EntityFuncs.Create( "hivehornet", vecSrc, pPlayer.pev.v_angle, false, pPlayer.edict() ); pHornet.pev.velocity = g_Engine.v_forward * 300; pHornet.pev.angles = Math.VecToAngles( pHornet.pev.velocity );*/ pPlayer.pev.punchangle.x = 0; pPlayer.pev.punchangle.z = 0; pPlayer.pev.punchangle.y = 0; pWeapon.m_flNextSecondaryAttack = pJson[ "weapon_hornetgun", {} ][ "m_flNextSecondaryAttack", 0.2 ]; //g_Scheduler.SetTimeout("removethehornet", 0.05f, ePlayer); //} break; } case ATTACK::TERTIARY: { if( isAdmin ) //pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) != 0 && isAdmin ) { /*if( pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) == 0 ) { pWeapon.m_flNextPrimaryAttack = 0.2; return ReflectionHook::NONE; }*/ //if( isAdmin && pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) < 1 ) //{ //pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType, 7 ); //} pPlayer.pev.effects = EF_MUZZLEFLASH; Vector vecSrc = pPlayer.GetGunPosition() + g_Engine.v_forward * 32 + g_Engine.v_right * 8 + g_Engine.v_up * -12; if ( pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) != 0 ) { NetworkMessage message( MSG_PVS, NetworkMessages::SVC_TEMPENTITY, vecSrc ); message.WriteByte(TE_SPRITE); message.WriteCoord(vecSrc.x); message.WriteCoord(vecSrc.y); message.WriteCoord(vecSrc.z); message.WriteShort(m_iAgruntMuzzleFlashHG); message.WriteByte(4); message.WriteByte(128); message.End(); } CBaseEntity@ pHornet = g_EntityFuncs.Create( "hivehornet", vecSrc, pPlayer.pev.v_angle, false, pPlayer.edict() ); pHornet.pev.velocity = g_Engine.v_forward * 300; pHornet.pev.angles = Math.VecToAngles( pHornet.pev.velocity ); //pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType, pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) - 1 ); pPlayer.m_iWeaponVolume = QUIET_GUN_VOLUME; pPlayer.SetAnimation( PLAYER_ATTACK1 ); pWeapon.SendWeaponAnim( HGUN_SHOOT, 0, 0 ); m_flRechargeTime = g_Engine.time + 0.25; switch ( Math.RandomLong ( 0 , 2 ) ) { case 0: g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_WEAPON, "agrunt/ag_fire1.wav", 1.0, ATTN_NORM, 0, 100 ); break; case 1: g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_WEAPON, "agrunt/ag_fire2.wav", 1.0, ATTN_NORM, 0, 100 ); break; case 2: g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_WEAPON, "agrunt/ag_fire3.wav", 1.0, ATTN_NORM, 0, 100 ); break; } Vector punchangle = Vector( js[ "punchangle" ] ); pPlayer.pev.punchangle.x = 0; pPlayer.pev.punchangle.z = 0; pPlayer.pev.punchangle.y = 0; pWeapon.m_flNextTertiaryAttack = pJson[ "weapon_hornetgun", {} ][ "m_flNextTertiaryAttack", 0.2 ]; } break; } } return ReflectionHook::NONE; } } }