// Insurgency's AK-74 /* Model Credits / Model: Twinke Masta (Body, Magazine, Stock), Lama (Grips, Flash Hider, Cleaning Rod), Norman The Loli Pirate (Foregrip) / Textures: Twinke Masta (Stock), NCFurious (Body, Magazine), Norman The Loli Pirate (Edits, Grips) / Animations: New World Interactive / Sounds: New World Interactive, D.N.I.O. 071 (Conversion to .ogg format) / Sprites: D.N.I.O. 071 (Model Render), R4to0 (Vector), KernCore (.spr Compile) / Misc: KernCore (World Model UVs, UV Chop), D.N.I.O. 071 (World Model UVs, Compile), Norman The Loli Pirate (World Model) / Script: KernCore */ #include "../base" namespace INS2_AK74 { // Animations enum INS2_AK74_Animations { IDLE = 0, DRAW_FIRST, DRAW, HOLSTER, FIRE, DRYFIRE, FIRESELECT, RELOAD, RELOAD_EMPTY, IRON_IDLE, IRON_FIRE, IRON_DRYFIRE, IRON_FIRESELECT, IRON_TO, IRON_FROM }; // Models string W_MODEL = "models/ins2/wpn/ak74/w_ak74.mdl"; string V_MODEL = "models/ins2/wpn2/ak74/v_ak74.mdl"; string P_MODEL = "models/ins2/wpn/ak74/p_ak74.mdl"; string A_MODEL = "models/ins2/ammo/mags.mdl"; int MAG_BDYGRP = 45; // Sprites string SPR_CAT = "ins2/arf/"; //Weapon category used to get the sprite's location // Sounds string SHOOT_S = "ins2/wpn/ak74/shoot.ogg"; string EMPTY_S = "ins2/wpn/ak74/empty.ogg"; // Information int MAX_CARRY = 600; int MAX_CLIP = 30; int DEFAULT_GIVE = MAX_CLIP * 4; int WEIGHT = 20; int FLAGS = ITEM_FLAG_NOAUTORELOAD | ITEM_FLAG_NOAUTOSWITCHEMPTY; uint DAMAGE = 25; uint SLOT = 5; uint POSITION = 13; float RPM_AIR = 650; //Rounds per minute in air float RPM_WTR = 500; //Rounds per minute in water string AMMO_TYPE = "ins2_5.45x39mm"; class weapon_ins2ak74 : ScriptBasePlayerWeaponEntity, INS2BASE::WeaponBase { private CBasePlayer@ m_pPlayer { get const { return cast( self.m_hPlayer.GetEntity() ); } set { self.m_hPlayer = EHandle( @value ); } } private int m_iShell; private bool m_WasDrawn; private int GetBodygroup() { return 0; } private array Sounds = { "ins2/wpn/ak74/bltbk.ogg", "ins2/wpn/ak74/bltrel.ogg", "ins2/wpn/ak74/magin.ogg", "ins2/wpn/ak74/magout.ogg", "ins2/wpn/ak74/magrtl.ogg", "ins2/wpn/ak74/magrel.ogg", "ins2/wpn/ak74/rof.ogg", EMPTY_S, SHOOT_S }; void Spawn() { Precache(); WeaponSelectFireMode = INS2BASE::SELECTFIRE_AUTO; m_WasDrawn = false; CommonSpawn( W_MODEL, DEFAULT_GIVE ); } void Precache() { self.PrecacheCustomModels(); g_Game.PrecacheModel( W_MODEL ); g_Game.PrecacheModel( V_MODEL ); g_Game.PrecacheModel( P_MODEL ); g_Game.PrecacheModel( A_MODEL ); m_iShell = g_Game.PrecacheModel( INS2BASE::BULLET_545x39 ); //g_Game.PrecacheOther( GetAmmoName() ); INS2BASE::PrecacheSound( Sounds ); INS2BASE::PrecacheSound( INS2BASE::DeployFirearmSounds ); g_Game.PrecacheGeneric( "sprites/" + SPR_CAT + self.pev.classname + ".txt" ); g_Game.PrecacheGeneric( "events/" + "muzzle_ins2_MGs.txt" ); CommonPrecache(); } bool GetItemInfo( ItemInfo& out info ) { info.iMaxAmmo1 = MAX_CARRY; //(INS2BASE::ShouldUseCustomAmmo) ? MAX_CARRY : INS2BASE::DF_MAX_CARRY_556; info.iAmmo1Drop = MAX_CLIP; info.iMaxAmmo2 = -1; info.iAmmo2Drop = -1; info.iMaxClip = MAX_CLIP; info.iSlot = SLOT; info.iPosition = POSITION; info.iId = g_ItemRegistry.GetIdForName( self.pev.classname ); info.iFlags = FLAGS; info.iWeight = WEIGHT; return true; } bool AddToPlayer( CBasePlayer@ pPlayer ) { return CommonAddToPlayer( pPlayer ); } bool PlayEmptySound() { return CommonPlayEmptySound( EMPTY_S ); } bool Deploy() { PlayDeploySound( 3 ); DisplayFiremodeSprite(); //if( m_WasDrawn == false ) //{ //m_WasDrawn = true; //return Deploy( V_MODEL, P_MODEL, DRAW_FIRST, "m16", GetBodygroup(), (61.0/30.0) ); //} //else return Deploy( V_MODEL, P_MODEL, DRAW, "m16", GetBodygroup(), (22.0/31.0) ); } void Holster( int skipLocal = 0 ) { CommonHolster(); BaseClass.Holster( skipLocal ); } void PrimaryAttack() { if( self.m_iClip <= 0 ) { self.PlayEmptySound(); self.SendWeaponAnim( (WeaponADSMode == INS2BASE::IRON_IN) ? IRON_DRYFIRE : DRYFIRE, 0, GetBodygroup() ); self.m_flNextPrimaryAttack = WeaponTimeBase() + 0.3f; return; } if( WeaponSelectFireMode == INS2BASE::SELECTFIRE_SEMI && m_pPlayer.m_afButtonPressed & IN_ATTACK == 0 ) return; self.m_flNextPrimaryAttack = self.m_flNextSecondaryAttack = (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? WeaponTimeBase() + GetFireRate( RPM_WTR ) : WeaponTimeBase() + GetFireRate( RPM_AIR ); self.m_flTimeWeaponIdle = WeaponTimeBase() + 1.0f; m_pPlayer.m_iWeaponVolume = NORMAL_GUN_VOLUME; m_pPlayer.m_iWeaponFlash = BRIGHT_GUN_FLASH; if( WeaponADSMode != INS2BASE::IRON_IN ) { if( !( m_pPlayer.pev.flags & FL_ONGROUND != 0 ) ) { ShootWeapon( SHOOT_S, 1, VECTOR_CONE_10DEGREES, (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? 1024 : 8192, DAMAGE, true, DMG_BULLET | DMG_NEVERGIB ); //KickBack( 0.3, 0.175, 0.125, 0.02, 2.25, 1.25, 10 ); } else if( m_pPlayer.pev.velocity.Length2D() > 150 ) { ShootWeapon( SHOOT_S, 1, VECTOR_CONE_7DEGREES, (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? 1024 : 8192, DAMAGE, true, DMG_BULLET | DMG_NEVERGIB ); //KickBack( 0.3, 0.175, 0.125, 0.02, 2.25, 1.25, 10 ); } else if( m_pPlayer.pev.flags & FL_DUCKING != 0 ) { ShootWeapon( SHOOT_S, 1, VECTOR_CONE_4DEGREES, (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? 1024 : 8192, DAMAGE, true, DMG_BULLET | DMG_NEVERGIB ); //KickBack( 0.3, 0.175, 0.125, 0.02, 2.25, 1.25, 10 ); } else { ShootWeapon( SHOOT_S, 1, VECTOR_CONE_5DEGREES, (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? 1024 : 8192, DAMAGE, true, DMG_BULLET | DMG_NEVERGIB ); //KickBack( 0.3, 0.175, 0.125, 0.02, 2.25, 1.25, 10 ); } m_pPlayer.pev.punchangle.x = Math.RandomFloat( -2.0, 1.0 ); m_pPlayer.pev.punchangle.y += Math.RandomFloat( -0.3, 0.3 ); } else if ( WeaponSelectFireMode == INS2BASE::SELECTFIRE_SEMI && WeaponADSMode != INS2BASE::IRON_IN ) { ShootWeapon( SHOOT_S, 1, VECTOR_CONE_4DEGREES, (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? 1024 : 8192, DAMAGE, true, DMG_BULLET | DMG_NEVERGIB ); m_pPlayer.pev.punchangle.x = Math.RandomFloat( -2.0, 2.0 ); m_pPlayer.pev.punchangle.y += Math.RandomFloat( -0.3, 0.3 ); //KickBack( 0.3, 0.175, 0.125, 0.02, 2.25, 1.25, 10 ); } else if ( WeaponSelectFireMode == INS2BASE::SELECTFIRE_SEMI && WeaponADSMode != INS2BASE::IRON_IN && m_pPlayer.pev.velocity.Length2D() > 0 ) { ShootWeapon( SHOOT_S, 1, VECTOR_CONE_4DEGREES, (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? 1024 : 8192, DAMAGE, true, DMG_BULLET | DMG_NEVERGIB ); m_pPlayer.pev.punchangle.x = Math.RandomFloat( -2.0, 2.0 ); m_pPlayer.pev.punchangle.y += Math.RandomFloat( -0.3, 0.3 ); //KickBack( 0.3, 0.175, 0.125, 0.02, 2.25, 1.25, 10 ); } else if ( WeaponSelectFireMode == INS2BASE::SELECTFIRE_SEMI && WeaponADSMode != INS2BASE::IRON_IN && !( m_pPlayer.pev.flags & FL_ONGROUND != 0 ) ) { ShootWeapon( SHOOT_S, 1, VECTOR_CONE_4DEGREES, (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? 1024 : 8192, DAMAGE, true, DMG_BULLET | DMG_NEVERGIB ); m_pPlayer.pev.punchangle.x = Math.RandomFloat( -2.0, 2.0 ); m_pPlayer.pev.punchangle.y += Math.RandomFloat( -0.3, 0.3 ); //KickBack( 0.3, 0.175, 0.125, 0.02, 2.25, 1.25, 10 ); } else if ( WeaponSelectFireMode == INS2BASE::SELECTFIRE_SEMI && WeaponADSMode != INS2BASE::IRON_IN && m_pPlayer.pev.flags & FL_DUCKING != 0 ) { ShootWeapon( SHOOT_S, 1, VECTOR_CONE_3DEGREES, (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? 1024 : 8192, DAMAGE, true, DMG_BULLET | DMG_NEVERGIB ); m_pPlayer.pev.punchangle.x = Math.RandomFloat( -2.0, 2.0 ); m_pPlayer.pev.punchangle.y += Math.RandomFloat( -0.3, 0.3 ); //KickBack( 0.3, 0.175, 0.125, 0.02, 2.25, 1.25, 10 ); } else { ShootWeapon( SHOOT_S, 1, VECTOR_CONE_SNIPER_ACCURACY, (m_pPlayer.pev.waterlevel == WATERLEVEL_HEAD) ? 1024 : 8192, DAMAGE, true, DMG_BULLET | DMG_NEVERGIB ); m_pPlayer.pev.punchangle.x = -1.0; m_pPlayer.pev.punchangle.y += Math.RandomFloat( -0.3, 0.3 ); //PunchAngle( Vector( Math.RandomFloat( -2.2, -2.0 ), (Math.RandomLong( 0, 1 ) < 0.5) ? -0.4f : 0.45f, Math.RandomFloat( -0.5, 0.5 ) ) ); } if( WeaponADSMode == INS2BASE::IRON_IN ) self.SendWeaponAnim( IRON_FIRE, 0, GetBodygroup() ); else self.SendWeaponAnim( FIRE, 0, GetBodygroup() ); ShellEject( m_pPlayer, m_iShell, (WeaponADSMode != INS2BASE::IRON_IN) ? Vector( 19, 5.5, -8 ) : Vector( 19, 1.5, -3 ) ); } void SecondaryAttack() { self.m_flTimeWeaponIdle = self.m_flNextSecondaryAttack = WeaponTimeBase() + 0.2; self.m_flNextPrimaryAttack = WeaponTimeBase() + 0.13; switch( WeaponADSMode ) { case INS2BASE::IRON_OUT: { self.SendWeaponAnim( IRON_TO, 0, GetBodygroup() ); EffectsFOVON( 40 ); break; } case INS2BASE::IRON_IN: { self.SendWeaponAnim( IRON_FROM, 0, GetBodygroup() ); EffectsFOVOFF(); break; } } } void ItemPreFrame() { if( m_reloadTimer < g_Engine.time && canReload ) self.Reload(); BaseClass.ItemPreFrame(); } void Reload() { ChangeFireMode( (WeaponADSMode == INS2BASE::IRON_IN) ? IRON_FIRESELECT : FIRESELECT, GetBodygroup(), INS2BASE::SELECTFIRE_AUTO, INS2BASE::SELECTFIRE_SEMI, (30.0/30.0) ); if( self.m_iClip == MAX_CLIP || m_pPlayer.m_rgAmmo( self.m_iPrimaryAmmoType ) <= 0 || m_pPlayer.pev.button & IN_USE != 0 ) return; if( WeaponADSMode == INS2BASE::IRON_IN ) { self.SendWeaponAnim( IRON_FROM, 0, GetBodygroup() ); m_reloadTimer = g_Engine.time + 0.16; m_pPlayer.m_flNextAttack = 0.16; canReload = true; EffectsFOVOFF(); } if( m_reloadTimer < g_Engine.time ) { (self.m_iClip == 0) ? Reload( MAX_CLIP, RELOAD_EMPTY, (134.0/30.0/2), GetBodygroup() ) : Reload( MAX_CLIP, RELOAD, (95.0/30.0/2), GetBodygroup() ); canReload = false; } BaseClass.Reload(); } void WeaponIdle() { if( self.m_flNextPrimaryAttack < g_Engine.time ) m_iShotsFired = 0; self.ResetEmptySound(); m_pPlayer.GetAutoaimVector( AUTOAIM_10DEGREES ); if( self.m_flTimeWeaponIdle > WeaponTimeBase() ) return; if( WeaponADSMode == INS2BASE::IRON_IN ) self.SendWeaponAnim( IRON_IDLE, 0, GetBodygroup() ); else self.SendWeaponAnim( IDLE, 0, GetBodygroup() ); self.m_flTimeWeaponIdle = WeaponTimeBase() + g_PlayerFuncs.SharedRandomFloat( m_pPlayer.random_seed, 5, 7 ); } } /*class AK74_MAG : ScriptBasePlayerAmmoEntity, INS2BASE::AmmoBase { void Spawn() { Precache(); g_EntityFuncs.SetModel( self, A_MODEL ); self.pev.body = MAG_BDYGRP; BaseClass.Spawn(); } void Precache() { g_Game.PrecacheModel( A_MODEL ); CommonPrecache(); } bool AddAmmo( CBaseEntity@ pOther ) { return CommonAddAmmo( pOther, MAX_CLIP, (INS2BASE::ShouldUseCustomAmmo) ? MAX_CARRY : INS2BASE::DF_MAX_CARRY_556, (INS2BASE::ShouldUseCustomAmmo) ? AMMO_TYPE : INS2BASE::DF_AMMO_556 ); } } string GetAmmoName() { return "ammo_ins2ak74"; }*/ string GetName() { return "weapon_ins2ak74"; } void Register() { g_CustomEntityFuncs.RegisterCustomEntity( "INS2_AK74::weapon_ins2ak74", GetName() ); // Register the weapon entity //g_CustomEntityFuncs.RegisterCustomEntity( "INS2_AK74::AK74_MAG", GetAmmoName() ); // Register the ammo entity //g_ItemRegistry.RegisterWeapon( GetName(), SPR_CAT, (INS2BASE::ShouldUseCustomAmmo) ? AMMO_TYPE : INS2BASE::DF_AMMO_556, "", GetAmmoName() ); // Register the weapon g_ItemRegistry.RegisterWeapon( GetName(), SPR_CAT, "556", "", "ammo_556clip" ); // Register the weapon } }