diff --git a/sources/NiceHumanPawn.uc b/sources/NiceHumanPawn.uc index 2211738..b91ccf3 100644 --- a/sources/NiceHumanPawn.uc +++ b/sources/NiceHumanPawn.uc @@ -62,8 +62,8 @@ simulated function bool IsZedExtentionsRecorded(NiceMonster niceZed){ } function ReplaceRequiredEquipment(){ Super.ReplaceRequiredEquipment(); - RequiredEquipment[0] = String(class'ScrnBalanceSrv.ScrnKnife');//String(class'NicePack.NiceKnife'); - RequiredEquipment[1] = String(class'NicePack.NiceWinchester');//String(class'NicePack.Nice9mmPlus'); + RequiredEquipment[0] = String(class'NicePack.NiceKnife'); + RequiredEquipment[1] = String(class'NicePack.Nice9mmPlus'); RequiredEquipment[2] = String(class'ScrnBalanceSrv.ScrnFrag'); RequiredEquipment[3] = String(class'ScrnBalanceSrv.ScrnSyringe'); RequiredEquipment[4] = String(class'KFMod.Welder'); @@ -359,7 +359,7 @@ simulated function Tick(float deltaTime){ holsteredReloadCountDown = 0.25; } } -/*function ServerBuyWeapon(class WClass, float ItemWeight){ +function ServerBuyWeapon(class WClass, float ItemWeight){ local Inventory I; local NiceSingle nicePistol; local class WP; @@ -435,7 +435,7 @@ function ServerSellWeapon(class WClass){ SetTraderUpdate(); } } -}*/ +} // NICETODO: do we even need this one? simulated function ClientChangeWeapon(NiceWeapon newWeap){ weapon = newWeap; @@ -535,15 +535,14 @@ simulated function ThrowGrenade(){ } simulated function HandleNadeThrowAnim() { - if(NiceWinchester(Weapon) != none) - SetAnimAction('Frag_Winchester'); - /*if(NiceM14EBRBattleRifle(Weapon) != none || NiceMaulerRifle(Weapon) != none) + if(NiceM14EBRBattleRifle(Weapon) != none || NiceMaulerRifle(Weapon) != none) SetAnimAction('Frag_M14'); - else + else if(NiceWinchester(Weapon) != none) + SetAnimAction('Frag_Winchester'); else if(Crossbow(Weapon) != none) SetAnimAction('Frag_Crossbow'); else if(NiceM99SniperRifle(Weapon) != none) - SetAnimAction('Frag_M4203');//MEANTODO + SetAnimAction('Frag_M4203'); else if(NiceAK47AssaultRifle(Weapon) != none) SetAnimAction('Frag_AK47'); else if(NiceBullpup(Weapon) != none || NiceNailGun(Weapon) != none) @@ -559,7 +558,7 @@ simulated function HandleNadeThrowAnim() else if(NiceM4AssaultRifle(Weapon) != none || NiceMKb42AssaultRifle(Weapon) != none) SetAnimAction('Frag_M4'); else if(NiceThompsonDrumSMG(Weapon) != none) - SetAnimAction('Frag_IJC_spThompson_Drum');*/ + SetAnimAction('Frag_IJC_spThompson_Drum'); Super.HandleNadeThrowAnim(); } // Remove blur for sharpshooter with a right skill @@ -788,7 +787,7 @@ function Timer(){ hmgShieldLevel ++; } } -/*simulated function Fire(optional float F){ +simulated function Fire(optional float F){ local bool bRecManualReload; local NiceSingle singleWeap; local ScrnPlayerController PC; @@ -802,7 +801,7 @@ function Timer(){ } else super.Fire(F); -}*/ +} function float AssessThreatTo(KFMonsterController Monster, optional bool CheckDistance){ return super(SRHumanPawn).AssessThreatTo(Monster, CheckDistance); } @@ -824,14 +823,15 @@ function VeterancyChanged(){ super.VeterancyChanged(); } -/*simulated function AltFire(optional float F){ +simulated function AltFire(optional float F){ if(NiceMedicGun(Weapon) != none) super(SRHumanPawn).AltFire(F); else super.AltFire(F); -}*/ +} + defaultproperties { - defaultInvincibilityDuration=2.000000 - BaseMeleeIncrease=0.000000 + defaultInvincibilityDuration=2.000000 + BaseMeleeIncrease=0.000000 } diff --git a/sources/NicePlayerController.uc b/sources/NicePlayerController.uc index 5265467..f114002 100644 --- a/sources/NicePlayerController.uc +++ b/sources/NicePlayerController.uc @@ -62,10 +62,6 @@ struct WeaponSelector{ var int selectorNumber; var array< class > weaponList; }; -// Alternative input flags -var byte bNiceFire, bNiceAltFire; - - var bool hasZeroSelector; var bool bUsesMouseWheel; var bool bMouseWheelLoops; @@ -100,7 +96,7 @@ struct StuckBulletRecord{ var NiceBullet bullet; var float registrationTime; }; -//var array stuckBulletsSet; +var array stuckBulletsSet; var NicePack NicePackMutator; var string SteamID64; var bool hasExpConverted; @@ -130,13 +126,13 @@ replication{ sirenScreamMod; reliable if(Role == ROLE_Authority) ClientSetSkill, ClientLoadSettings, ClientSaveConfig, ClientSetKey, ClientUpdatePlayedWithDatabase, ClientReceiveSkill, ClientBroadcastEnded, ClientLog, ClientUpdatePawnMaxHealth, ClientSetNiceWeapManagement, - ClientSpawnSirenBall, ClientRemoveSirenBall, /*ClientNailsExplosion,*/ ClientSetZedStun, ClientShowScrnMenu; + ClientSpawnSirenBall, ClientRemoveSirenBall, ClientNailsExplosion, ClientStickGhostProjectile, ClientSetZedStun, ClientShowScrnMenu; unreliable if(Role == ROLE_Authority) - ClientSpawnGhosts, ClientPrint; + ClientSpawnGhostProjectile, ClientPrint; reliable if(Role < ROLE_Authority) ServerSetSkill, ServerSetPendingSkill, ServerSetAltSwitchesModes, ServerSetUseServerReload, ServerSetHLMessages, ServerMarkSettingsLoaded, ServerStartleZeds, ServerSetDisplayCounters, - ServerSetDisplayWeaponProgress, ActivateAbility, ServerSetFireFlags; + ServerSetDisplayWeaponProgress, ActivateAbility; } // Called on server only! function PostLogin(){ @@ -1217,7 +1213,7 @@ function ViewTargetChanged(){ OldViewTarget = ViewTarget; } // Reloaded to add nice single/dual classes -/*function LoadDualWieldables(){ +function LoadDualWieldables(){ local ClientPerkRepLink CPRL; local class WP; local class W; @@ -1235,10 +1231,10 @@ function ViewTargetChanged(){ AddDualWieldable(W, W.default.DualClass); } super.LoadDualWieldables(); -}*/ +} // If player only has one pistol out of two possible, then return 'false' // Because he's got the right one and new one is the left one; completely different stuff -/*function bool IsInInventory(class PickupToCheck, bool bCheckForEquivalent, bool bCheckForVariant){ +function bool IsInInventory(class PickupToCheck, bool bCheckForEquivalent, bool bCheckForVariant){ local bool bResult; local Inventory CurInv; local NiceSingle singlePistol; @@ -1254,7 +1250,7 @@ function ViewTargetChanged(){ break; } return bResult; -}*/ +} state Spectating{ exec function Use(){ local vector HitLocation, HitNormal, TraceEnd, TraceStart; @@ -1268,12 +1264,17 @@ state Spectating{ ServerSetViewTarget(A); } } -simulated function ClientSpawnGhosts(int amount, Vector start, int pitch, int yaw, int roll, float spread, NiceFire.NWFireType fireType, NiceFire.NWCFireState fireState){ - local Rotator bulletDir; - bulletDir.Pitch = pitch; - bulletDir.Yaw = yaw; - bulletDir.Roll = roll; - class'NiceBulletSpawner'.static.SpawnBullets(amount, start, bulletDir, spread, fireType, fireState); +simulated function ClientSpawnGhostProjectile(Vector Start, int pitch, int yaw, int roll, NiceFire.ShotType shotParams, NiceFire.FireModeContext fireContext, bool bForceComplexTraj){ + local Rotator projectileDir; + projectileDir.Pitch = pitch; + projectileDir.Yaw = yaw; + projectileDir.Roll = roll; + class'NiceProjectileSpawner'.static.SpawnProjectile(Start, projectileDir, shotParams, fireContext, true, bForceComplexTraj); +} +simulated function ClientStickGhostProjectile(KFHumanPawn instigator, Actor base, name bone, Vector shift, Rotator rot, + NiceBullet.ExplosionData expData, int stuckID){ + class'NiceProjectileSpawner'.static.SpawnStuckProjectile(instigator, base, bone, shift, rot, expData, true, + stuckID); } simulated function SpawnSirenBall(NiceZombieSiren siren){ if(NicePackMutator == none || siren == none) @@ -1292,13 +1293,12 @@ simulated function ClientRemoveSirenBall(int ID){ return; localCollisionManager.RemoveSphereCollision(ID); } -//NICETODO: do we need this? -/*simulated function ClientNailsExplosion(int amount, Vector start, NiceFire.ShotType shotParams, +simulated function ClientNailsExplosion(int amount, Vector start, NiceFire.ShotType shotParams, NiceFire.FireModeContext fireContext, optional bool bIsGhost){ local int i; for(i = 0;i < amount;i ++) class'NiceProjectileSpawner'.static.SpawnProjectile(start, RotRand(true), shotParams, fireContext, bIsGhost); -}*/ +} simulated function AddEffect(){ effectsSpawned[currentEffectTimeWindow] ++; } @@ -1317,7 +1317,7 @@ simulated function bool CanSpawnEffect(bool bIsGhost){ return false; return true; } -/*simulated function RegisterStuckBullet(NiceBullet bullet){ +simulated function RegisterStuckBullet(NiceBullet bullet){ local StuckBulletRecord newRecord; if(bullet == none) return; @@ -1348,9 +1348,9 @@ simulated function FreeOldStuckBullets(){ else if(stuckBulletsSet[i].bullet != none) stuckBulletsSet[i].bullet.KillBullet(); stuckBulletsSet = newSet; -}*/ +} // Dualies functions -/*exec function SwitchDualies(){ +exec function SwitchDualies(){ local NiceSingle singlePistol; local NiceDualies dualPistols; if(Pawn != none){ @@ -1382,7 +1382,7 @@ exec function FireRightGun(){ dualPistols = NiceDualies(Pawn.Weapon); if(dualPistols != none) dualPistols.FireGivenGun(false); -}*/ +} exec function ActivateAbility(int abilityIndex){ if(abilityIndex < 0) return; @@ -1438,37 +1438,32 @@ exec simulated function Siren(float value) sirenScreamMod = value; } -function ServerSetFireFlags(byte bNewFire, byte bNewAltFire){ - bNiceFire = bNewFire; - bNiceAltFire = bNewAltFire; -} - defaultproperties { - sirenScreamMod=1.0 - nicePlayerInfoVersionNumber=1 - bAltSwitchesModes=True - bAdvReloadCheck=True - bRelCancelByFire=True - bRelCancelBySwitching=True - bRelCancelByNades=True - bRelCancelByAiming=True - bNiceWeaponManagement=True - bDisplayCounters=True - bDisplayWeaponProgress=True - bShowScrnMenu=True - maxPlayedWithRecords=100 - WeapGroupMeleeName="Melee" - WeapGroupNonMeleeName="NonMelee" - WeapGroupPistolsName="Pistols" - WeapGroupGeneralName="General" - WeapGroupToolsName="Tools" - WeapPresetDefaultName="Default" - WeapPresetGunslingerName="Gunslinger" - tracesPerTickLimit=1000 - effectsLimitSoft=100 - effectsLimitHard=200 - TSCLobbyMenuClassString="NicePack.NiceTSCLobbyMenu" - LobbyMenuClassString="NicePack.NiceLobbyMenu" - PawnClass=Class'NicePack.NiceHumanPawn' + nicePlayerInfoVersionNumber=1 + bAltSwitchesModes=True + bAdvReloadCheck=True + bRelCancelByFire=True + bRelCancelBySwitching=True + bRelCancelByNades=True + bRelCancelByAiming=True + bNiceWeaponManagement=True + bDisplayCounters=True + bDisplayWeaponProgress=True + bShowScrnMenu=True + maxPlayedWithRecords=100 + WeapGroupMeleeName="Melee" + WeapGroupNonMeleeName="NonMelee" + WeapGroupPistolsName="Pistols" + WeapGroupGeneralName="General" + WeapGroupToolsName="Tools" + WeapPresetDefaultName="Default" + WeapPresetGunslingerName="Gunslinger" + tracesPerTickLimit=1000 + effectsLimitSoft=100 + effectsLimitHard=200 + sirenScreamMod=1.000000 + TSCLobbyMenuClassString="NicePack.NiceTSCLobbyMenu" + LobbyMenuClassString="NicePack.NiceLobbyMenu" + PawnClass=Class'NicePack.NiceHumanPawn' } diff --git a/sources/NiceReplicationInfo.uc b/sources/NiceReplicationInfo.uc index e6d3487..753bcb8 100644 --- a/sources/NiceReplicationInfo.uc +++ b/sources/NiceReplicationInfo.uc @@ -15,10 +15,10 @@ replication{ reliable if(Role < ROLE_Authority) ServerDamagePawn, ServerDealDamage, ServerDealMeleeDamage, ServerUpdateHit, ServerExplode, ServerJunkieExtension, - /*ServerStickProjectile*/ServerHealTarget; + ServerStickProjectile, ServerHealTarget; } // Makes server to spawn a sticked projectile. -/*simulated function ServerStickProjectile +simulated function ServerStickProjectile ( KFHumanPawn instigator, Actor base, @@ -29,7 +29,7 @@ replication{ ){ class'NiceProjectileSpawner'.static. StickProjectile(instigator, base, bone, shift, direction, expData); -}*/ +} // Returns scale value that determines how to scale explosion damage to // given victim. // Method assumes that a valid victim was passed. @@ -216,12 +216,12 @@ simulated function ServerHealTarget(NiceHumanPawn healed, float charPotency, healTotal = charPotency * healPotency; healer.AlphaAmount = 255; - /* if(NiceMedicGun(healer.weapon) != none) + if(NiceMedicGun(healer.weapon) != none) NiceMedicGun(healer.weapon).ClientSuccessfulHeal(healer, healed); if(healed.health >= healed.healthMax){ healed.GiveHealth(healTotal, healed.healthMax); return; - }*/ + } HandleNiceHealingMechanicsAndSkills(healer, healed, healPotency); if(healed.health < healed.healthMax){ healed.TakeHealing( healed, healTotal, healPotency, @@ -454,6 +454,7 @@ simulated function ServerJunkieExtension( NicePlayerController player, Mut.JunkieZedTimeExtend(); } } + defaultproperties { } diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterArdour.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterArdour.uc index bab552d..229367b 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterArdour.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterArdour.uc @@ -6,12 +6,12 @@ var float justHeadshotReduction; defaultproperties { - justHeadshotReduction=0.250000 - headshotKillReduction(0)=0.5f - headshotKillReduction(1)=1.0f - headshotKillReduction(2)=1.25f - headshotKillReduction(3)=1.5f - headshotKillReduction(4)=2.0f - SkillName="Ardour" - SkillEffects="Head-shotting enemies reduces your cooldowns." + headshotKillReduction(0)=0.500000 + headshotKillReduction(1)=1.000000 + headshotKillReduction(2)=1.250000 + headshotKillReduction(3)=1.500000 + headshotKillReduction(4)=2.000000 + justHeadshotReduction=0.250000 + SkillName="Ardour" + SkillEffects="Head-shotting enemies reduces your cooldowns." } diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterDieAlready.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterDieAlready.uc index 266bba4..96d8820 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterDieAlready.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterDieAlready.uc @@ -1,13 +1,14 @@ class NiceSkillSharpshooterDieAlready extends NiceSkill abstract; var float bleedOutTime[5]; + defaultproperties { - BleedOutTime(0)=2.0f - BleedOutTime(1)=1.5f - BleedOutTime(2)=1.25f - BleedOutTime(3)=1.0f - BleedOutTime(4)=0.25f - SkillName="Die already" - SkillEffects="All zeds decapitated by you drop faster." + BleedOutTime(0)=2.000000 + BleedOutTime(1)=1.500000 + BleedOutTime(2)=1.250000 + BleedOutTime(3)=1.000000 + BleedOutTime(4)=0.250000 + SkillName="Die already" + SkillEffects="All zeds decapitated by you drop faster." } diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterGunslingerA.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterGunslingerA.uc index bfdf37d..73bcb74 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterGunslingerA.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterGunslingerA.uc @@ -18,14 +18,15 @@ function static SkillDeSelected(NicePlayerController nicePlayer){ if(nicePlayer.abilityManager == none) return; nicePlayer.abilityManager.RemoveAbility(default.abilityID); } + defaultproperties { - abilityID="Gunslinger" - cooldown=80.000000 - Duration=15.000000 - reloadMult=1.500000 - movementMult=1.2500000 - fireRateMult=1.300000 - SkillName="Gunslinger" - SkillEffects="Reload, fire and move faster. All with no recoil." + abilityID="Gunslinger" + cooldown=80.000000 + Duration=15.000000 + reloadMult=1.500000 + movementMult=1.250000 + fireRateMult=1.300000 + SkillName="Gunslinger" + SkillEffects="Reload, fire and move faster. All with no recoil." } diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterHardWork.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterHardWork.uc index 1e55d31..3a8a447 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterHardWork.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterHardWork.uc @@ -5,13 +5,14 @@ var float zoomSpeedBonus; var float reloadBonus; var float fireRateBonus; var float recoilMult; + defaultproperties { - zoomBonus=0.750000 - zoomSpeedBonus=0.500000 - ReloadBonus=0.500000 - fireRateBonus=0.300000 - recoilMult=0.500000 - SkillName="Hard work" - SkillEffects="Reload up to 50% faster, shoot up to 30% faster and recoil only for half as much. Additionally, you can switch to/from iron sights twice as fast and zoom 25% further while crouched." + zoomBonus=0.750000 + zoomSpeedBonus=0.500000 + ReloadBonus=0.500000 + fireRateBonus=0.300000 + recoilMult=0.500000 + SkillName="Hard work" + SkillEffects="Reload up to 50% faster, shoot up to 30% faster and recoil only for half as much. Additionally, you can switch to/from iron sights twice as fast and zoom 25% further while crouched." } diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterKillConfirmed.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterKillConfirmed.uc index 6a329e2..87e03f4 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterKillConfirmed.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterKillConfirmed.uc @@ -35,16 +35,17 @@ function static int UpdateCounterValue(string counterName, NicePlayerController if(niceF == none) return 0; lockOnTickRate = class'NiceSkillSharpshooterKillConfirmed'.default.stackDelay; - lockonTicks = Ceil(niceF.fireState.lockon.time / lockOnTickRate) - 1; + lockonTicks = Ceil(niceF.currentContext.lockonTime / lockOnTickRate) - 1; lockonTicks = Min(class'NiceSkillSharpshooterKillConfirmed'.default.maxStacks, lockonTicks); lockonTicks = Max(lockonTicks, 0); return lockonTicks; } + defaultproperties { - damageBonus=1.000000 - stackDelay=1.000000 - maxStacks=1 - SkillName="Kill confirmed" - SkillEffects="Aiming at zed's head for a second doubles the damage of the shot." + damageBonus=1.000000 + stackDelay=1.000000 + maxStacks=1 + SkillName="Kill confirmed" + SkillEffects="Aiming at zed's head for a second doubles the damage of the shot." } diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterReaperA.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterReaperA.uc index c0b5412..a2b31e7 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterReaperA.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterReaperA.uc @@ -17,10 +17,11 @@ function static SkillDeSelected(NicePlayerController nicePlayer){ if(nicePlayer.abilityManager == none) return; nicePlayer.abilityManager.RemoveAbility(default.abilityID); } + defaultproperties { - abilityID="Reaper" - cooldown=24.000000 - SkillName="Reaper" - SkillEffects="If it would take 2 head-shot to kill the zed, - it'll die from one." + abilityID="Reaper" + cooldown=24.000000 + SkillName="Reaper" + SkillEffects="If it would take 2 head-shot to kill the zed, - it'll die from one." } diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterStability.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterStability.uc index 9be348a..fd47d98 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterStability.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterStability.uc @@ -1,5 +1,8 @@ -class NiceSkillSharpshooterStability extends NiceSkill - abstract; -defaultproperties -{ SkillName="Stability" SkillEffects="Have zero recoil while shooting in ironsights with perked weapons." -} +class NiceSkillSharpshooterStability extends NiceSkill + abstract; + +defaultproperties +{ + SkillName="Stability" + SkillEffects="Have zero recoil while shooting in ironsights with perked weapons." +} diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterSurgical.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterSurgical.uc index 0573826..d586a5f 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterSurgical.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterSurgical.uc @@ -1,9 +1,10 @@ class NiceSkillSharpshooterSurgical extends NiceSkill abstract; var float penDmgReduction; + defaultproperties { - PenDmgReduction=0.900000 - SkillName="Surgical precision" - SkillEffects="While you're aiming down sights your bullets and projectiles gain additional head penetration with only 10% damage loss." + PenDmgReduction=0.900000 + SkillName="Surgical precision" + SkillEffects="While you're aiming down sights your bullets and projectiles gain additional head penetration with only 10% damage loss." } diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterTalent.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterTalent.uc index 6809d81..cd03f8c 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterTalent.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterTalent.uc @@ -1,7 +1,8 @@ class NiceSkillSharpshooterTalent extends NiceSkill abstract; + defaultproperties { - SkillName="Talent" - SkillEffects="You gain additional up to 30% headshot damage bonus." + SkillName="Talent" + SkillEffects="You gain additional up to 30% headshot damage bonus." } diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDAdrenaline.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDAdrenaline.uc index 562280b..4d17bd9 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDAdrenaline.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDAdrenaline.uc @@ -1,27 +1,36 @@ -class NiceSkillSharpshooterZEDAdrenaline extends NiceSkill - abstract; -function static SkillSelected(NicePlayerController nicePlayer){ - local NicePack niceMutator; - super.SkillSelected(nicePlayer); - niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); - if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; - niceMutator.AddCounter("npGunsAdrenaline", Texture'NicePackT.HudCounter.variant', false, default.class); -} -function static SkillDeSelected(NicePlayerController nicePlayer){ - local NicePack niceMutator; - super.SkillDeSelected(nicePlayer); - niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); - if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; - niceMutator.RemoveCounter("npGunsAdrenaline"); -} -function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ - local NicePack niceMutator; - if(nicePlayer == none || counterName != "npGunsAdrenaline" || !nicePlayer.IsZedTimeActive()) return 0; - if(nicePlayer.bJunkieExtFailed) return 0; - if(nicePlayer.Pawn != none) niceMutator = class'NicePack'.static.Myself(nicePlayer.Pawn.Level); - if(niceMutator == none) return 0; - return niceMutator.junkieNextGoal - niceMutator.junkieDoneHeadshots; -} -defaultproperties -{ SkillName="Adrenaline junkie" SkillEffects="Prolong zed-time by making head-shots. Each consecutive extension requires 1 more head-shot than a previous one. Body-shotting removes your ability to prolong zed-time." -} +class NiceSkillSharpshooterZEDAdrenaline extends NiceSkill + abstract; +function static SkillSelected(NicePlayerController nicePlayer){ + local NicePack niceMutator; + super.SkillSelected(nicePlayer); + niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); + if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) + return; + niceMutator.AddCounter("npGunsAdrenaline", Texture'NicePackT.HudCounter.variant', false, default.class); +} +function static SkillDeSelected(NicePlayerController nicePlayer){ + local NicePack niceMutator; + super.SkillDeSelected(nicePlayer); + niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); + if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) + return; + niceMutator.RemoveCounter("npGunsAdrenaline"); +} +function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ + local NicePack niceMutator; + if(nicePlayer == none || counterName != "npGunsAdrenaline" || !nicePlayer.IsZedTimeActive()) + return 0; + if(nicePlayer.bJunkieExtFailed) + return 0; + if(nicePlayer.Pawn != none) + niceMutator = class'NicePack'.static.Myself(nicePlayer.Pawn.Level); + if(niceMutator == none) + return 0; + return niceMutator.junkieNextGoal - niceMutator.junkieDoneHeadshots; +} + +defaultproperties +{ + SkillName="Adrenaline junkie" + SkillEffects="Prolong zed-time by making head-shots. Each consecutive extension requires 1 more head-shot than a previous one. Body-shotting removes your ability to prolong zed-time." +} diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDHundredGauntlets.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDHundredGauntlets.uc index 684ee33..480eada 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDHundredGauntlets.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDHundredGauntlets.uc @@ -1,5 +1,8 @@ -class NiceSkillSharpshooterZEDHundredGauntlets extends NiceSkill - abstract; -defaultproperties -{ SkillName="Hundred Gauntlets" SkillEffects="You don't waste ammo during zed-time." -} +class NiceSkillSharpshooterZEDHundredGauntlets extends NiceSkill + abstract; + +defaultproperties +{ + SkillName="Hundred Gauntlets" + SkillEffects="You don't waste ammo during zed-time." +} diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDOverkill.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDOverkill.uc index 3d58d9e..52f2c8e 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDOverkill.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDOverkill.uc @@ -1,6 +1,10 @@ -class NiceSkillSharpshooterZEDOverkill extends NiceSkill - abstract; -var float damageBonus; -defaultproperties -{ damageBonus=2.250000 SkillName="Overkill" SkillEffects="Deal 225% head-shot damage during zed-time." -} +class NiceSkillSharpshooterZEDOverkill extends NiceSkill + abstract; +var float damageBonus; + +defaultproperties +{ + damageBonus=2.250000 + SkillName="Overkill" + SkillEffects="Deal 225% head-shot damage during zed-time." +} diff --git a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDRailgun.uc b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDRailgun.uc index 0ca39c0..9e40780 100644 --- a/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDRailgun.uc +++ b/sources/Perks/Sharpshooter/Skills/NiceSkillSharpshooterZEDRailgun.uc @@ -1,5 +1,8 @@ -class NiceSkillSharpshooterZEDRailgun extends NiceSkill - abstract; -defaultproperties -{ SkillName="Railgun" SkillEffects="Your bullets pass through everything without losing damage during zed-time." -} +class NiceSkillSharpshooterZEDRailgun extends NiceSkill + abstract; + +defaultproperties +{ + SkillName="Railgun" + SkillEffects="Your bullets pass through everything without losing damage during zed-time." +} diff --git a/sources/Weapons/BaseWeaponClasses/AssaultrRifles/NiceAssaultRifle.uc b/sources/Weapons/BaseWeaponClasses/AssaultrRifles/NiceAssaultRifle.uc new file mode 100644 index 0000000..04c5a89 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/AssaultrRifles/NiceAssaultRifle.uc @@ -0,0 +1,306 @@ +class NiceAssaultRifle extends NiceWeapon; +var bool newStatesLoaded; +var bool bAutoFireEnabled; +var bool bSemiAutoFireEnabled; +var bool bBurstFireEnabled; +var bool bIsBursting; +var bool bIsAltSwitches; +var bool bMustSwitchMode; // Switch between auto and semi-auto/burst modes as soon as possible +var Pawn rememberedOwner; +enum EFireType{ + ETYPE_NONE, + ETYPE_AUTO, + ETYPE_SEMI, + ETYPE_BURST +}; +var EFireType MainFire; +var EFireType SndFire; +var EFireType PendingFire; +replication +{ + reliable if(Role < ROLE_Authority) + ServerForceBurst, ServerApplyFireModes, ServerChangeFireTypes; + reliable if(Role == ROLE_Authority) + MainFire, SndFire, PendingFire, ClientNiceChangeFireMode, ClientChangeBurstLength; +} +simulated function EFireType GetComplimentaryFire(EFireType type){ + if(type == ETYPE_AUTO || type == ETYPE_none) + return ETYPE_AUTO; + if(type == ETYPE_SEMI) + return ETYPE_BURST; + return ETYPE_SEMI; +} +simulated function int AmountOfActiveModes(){ + if(bAutoFireEnabled && bSemiAutoFireEnabled && bBurstFireEnabled) + return 3; + else if(!bAutoFireEnabled && !bSemiAutoFireEnabled && !bBurstFireEnabled) + return 0; + else if( (bAutoFireEnabled && bSemiAutoFireEnabled) || (bAutoFireEnabled && bBurstFireEnabled) || (bSemiAutoFireEnabled && bBurstFireEnabled) ) + return 2; + return 1; +} +function ServerApplyFireModes(){ + local NiceFire niceRifleFire; + local NicePlayerController nicePlayer; + niceRifleFire = NiceFire(FireMode[0]); + if(Instigator != none) + nicePlayer = NicePlayerController(Instigator.Controller); + if(niceRifleFire == none) + return; + if(MainFire == ETYPE_AUTO) + niceRifleFire.bWaitForRelease = false; + else if(MainFire == ETYPE_SEMI){ + niceRifleFire.bSemiMustBurst = false; + niceRifleFire.bWaitForRelease = true; + } + else if(MainFire == ETYPE_BURST){ + niceRifleFire.bSemiMustBurst = true; + niceRifleFire.bWaitForRelease = true; + niceRifleFire.currentContext.burstLength = niceRifleFire.MaxBurstLength; + if(SndFire == ETYPE_SEMI) + SndFire = ETYPE_BURST; + } + if(nicePlayer != none && !nicePlayer.bFlagAltSwitchesModes){ + if(SndFire == ETYPE_SEMI) + niceRifleFire.currentContext.burstLength = 1; + else if(SndFire == ETYPE_BURST) + niceRifleFire.currentContext.burstLength = niceRifleFire.MaxBurstLength; + } + if(!bIsReloading && IsFiring()){ + StopFire(0); + StopFire(1); + } + ClientNiceChangeFireMode(niceRifleFire.bWaitForRelease, niceRifleFire.bSemiMustBurst); + ClientChangeBurstLength(niceRifleFire.currentContext.burstLength); +} +simulated function ResetFireModes(){ + local int modesCount; + local NicePlayerController nicePlayer; + modesCount = AmountOfActiveModes(); + nicePlayer = NicePlayerController(Instigator.Controller); + if(modesCount <= 0 || nicePlayer == none) + return; + if(nicePlayer.bFlagAltSwitchesModes){ + if(modesCount == 1){ + if(bAutoFireEnabled) + MainFire = ETYPE_AUTO; + else if(bSemiAutoFireEnabled) + MainFire = ETYPE_SEMI; + else if(bBurstFireEnabled) + MainFire = ETYPE_BURST; + } + else if(modesCount == 2){ + if(bAutoFireEnabled){ + MainFire = ETYPE_AUTO; + if(bSemiAutoFireEnabled) + PendingFire = ETYPE_SEMI; + else if(bBurstFireEnabled) + PendingFire = ETYPE_BURST; + } + else{ + MainFire = ETYPE_SEMI; + PendingFire = ETYPE_BURST; + } + } + else{ + MainFire = ETYPE_AUTO; + PendingFire = ETYPE_SEMI; + } + } + else{ + if(modesCount == 1){ + if(bAutoFireEnabled) + MainFire = ETYPE_AUTO; + else if(bSemiAutoFireEnabled) + MainFire = ETYPE_SEMI; + else if(bBurstFireEnabled) + MainFire = ETYPE_BURST; + SndFire = ETYPE_none; + } + else if(modesCount == 2){ + if(bAutoFireEnabled){ + MainFire = ETYPE_AUTO; + if(bSemiAutoFireEnabled) + SndFire = ETYPE_SEMI; + else if(bBurstFireEnabled) + SndFire = ETYPE_BURST; + } + else{ + MainFire = ETYPE_SEMI; + SndFire = ETYPE_BURST; + } + } + else{ + MainFire = ETYPE_AUTO; + SndFire = ETYPE_SEMI; + } + } + ServerChangeFireTypes(MainFire, SndFire, PendingFire); + ServerApplyFireModes(); +} +function ServerChangeFireTypes(EFireType newMain, EFireType newSnd, EFireType newPending){ + MainFire = newMain; + SndFire = newSnd; + PendingFire = newPending; +} +function ServerForceBurst(){ + local NiceFire niceRifleFire; + niceRifleFire = NiceFire(FireMode[0]); + if(niceRifleFire != none) + niceRifleFire.DoBurst(); +} +// Use alt fire to switch fire modes +simulated function AltFire(float F){ + local NiceFire niceRifleFire; + local NicePlayerController nicePlayer; + niceRifleFire = NiceFire(FireMode[0]); + nicePlayer = NicePlayerController(Instigator.Controller); + if(nicePlayer != none && niceRifleFire != none && SndFire != ETYPE_NONE){ + if(FireModeClass[1] == class'KFMod.NoFire'){ + if(nicePlayer.bFlagAltSwitchesModes) + SwitchModes(); + else{ + niceRifleFire.DoBurst(); + ServerForceBurst(); + super.AltFire(F); + } + return; + } + } + super.AltFire(F); +} +exec simulated function SwitchModes(){ + if(Role < ROLE_Authority && AmountOfActiveModes() > 1) + bMustSwitchMode = !bMustSwitchMode; +} +simulated function DoToggle(){ + local EFireType tempType; + local PlayerController player; + if(IsFiring()) + return; + player = Level.GetLocalPlayerController(); + if(player != none && AmountOfActiveModes() > 1){ + tempType = MainFire; + MainFire = PendingFire; + PendingFire = tempType; + player.bFire = 0; + player.bAltFire = 0; + ServerChangeFireTypes(MainFire, SndFire, PendingFire); + ServerApplyFireModes(); + PlayOwnedSound(ToggleSound, SLOT_none, 2.0,,,, false); + if(MainFire == ETYPE_AUTO) + player.ReceiveLocalizedMessage(class'NicePack.NiceAssaultRifleMessage', 1); + else if(MainFire == ETYPE_SEMI) + player.ReceiveLocalizedMessage(class'NicePack.NiceAssaultRifleMessage', 0); + else if(MainFire == ETYPE_BURST) + player.ReceiveLocalizedMessage(class'NicePack.NiceAssaultRifleMessage', 2); + } +} +simulated function SecondDoToggle(){ + local EFireType choosenType; + local NiceFire niceRifleFire; + local NicePlayerController nicePlayer; + if(FireModeClass[1] != class'KFMod.NoFire'){ + DoToggle(); + return; + } + niceRifleFire = NiceFire(FireMode[0]); + nicePlayer = NicePlayerController(Instigator.Controller); + if(IsFiring() || AmountOfActiveModes() < 3 || nicePlayer == none || niceRifleFire == none) + return; + if(nicePlayer.bFlagAltSwitchesModes){ + if(MainFire == ETYPE_AUTO){ + PendingFire = GetComplimentaryFire(PendingFire); + choosenType = PendingFire; + } + else{ + MainFire = GetComplimentaryFire(MainFire); + choosenType = MainFire; + } + } + else{ + SndFire = GetComplimentaryFire(SndFire); + choosenType = SndFire; + } + ServerChangeFireTypes(MainFire, SndFire, PendingFire); + ServerApplyFireModes(); + PlayOwnedSound(ToggleSound, SLOT_none, 2.0,,,, false); + if(choosenType == ETYPE_SEMI) + nicePlayer.ReceiveLocalizedMessage(class'NicePack.NiceAssaultRifleMessage', 4); + else + nicePlayer.ReceiveLocalizedMessage(class'NicePack.NiceAssaultRifleMessage', 5); +} +simulated function ClientNiceChangeFireMode(bool bNewWaitForRelease, bool bNewSemiMustBurst){ + local NiceFire niceF; + if(!bIsReloading && IsFiring()){ + StopFire(0); + StopFire(1); + } + niceF = NiceFire(FireMode[0]); + FireMode[0].bWaitForRelease = bNewWaitForRelease; + FireMode[0].bNowWaiting = bNewWaitForRelease; + if(niceF != none) + niceF.bSemiMustBurst = bNewSemiMustBurst; +} +simulated function ClientChangeBurstLength(int newBurstLength){ + if(NiceFire(FireMode[0]) != none) + NiceFire(FireMode[0]).currentContext.burstLength = newBurstLength; +} +simulated function bool AltFireCanForceInterruptReload(){ + local NicePlayerController nicePlayer; + nicePlayer = NicePlayerController(Instigator.Controller); + if(nicePlayer != none) + return (!nicePlayer.bFlagAltSwitchesModes) && (GetMagazineAmmo() > 0); + return false; +} +simulated function WeaponTick(float dt){ + local NicePlayerController nicePlayer; + super.WeaponTick(dt); + if(bMustSwitchMode && FireMode[0].NextFireTime /*+ 0.1*/ < Level.TimeSeconds && Role < ROLE_Authority){ + DoToggle(); + bMustSwitchMode = false; + } + nicePlayer = NicePlayerController(Instigator.Controller); + if(Role == ROLE_Authority && nicePlayer != none && (bIsAltSwitches != nicePlayer.bFlagAltSwitchesModes || (rememberedOwner != Instigator))){ + if(newStatesLoaded) + ServerApplyFireModes(); + else + ResetFireModes(); + bIsAltSwitches = nicePlayer.bFlagAltSwitchesModes; + rememberedOwner = Instigator; + } +} +function NicePlainData.Data GetNiceData(){ + local NicePlainData.Data transferData; + transferData = super.GetNiceData(); + class'NicePlainData'.static.SetInt(transferData, "MainFire", int(MainFire)); + class'NicePlainData'.static.SetInt(transferData, "SndFire", int(SndFire)); + class'NicePlainData'.static.SetInt(transferData, "PendingFire", int(PendingFire)); + return transferData; +} +function SetNiceData(NicePlainData.Data transferData, optional NiceHumanPawn newOwner){ + local EFireType newFireType; + super.SetNiceData(transferData, newOwner); + newStatesLoaded = false; + if(class'NicePlainData'.static.LookupVar(transferData, "MainFire") < 0) + ResetFireModes(); + else{ + newFireType = EFireType(class'NicePlainData'.static.GetInt(transferData, "MainFire")); + MainFire = newFireType; + newFireType = EFireType(class'NicePlainData'.static.GetInt(transferData, "SndFire")); + SndFire = newFireType; + newFireType = EFireType(class'NicePlainData'.static.GetInt(transferData, "PendingFire")); + PendingFire = newFireType; + newStatesLoaded = true; + } +} + +defaultproperties +{ + bAutoFireEnabled=True + bSemiAutoFireEnabled=True + MainFire=ETYPE_AUTO + SndFire=ETYPE_SEMI + PendingFire=ETYPE_BURST + bUseFlashlightToToggle=True +} diff --git a/sources/Weapons/BaseWeaponClasses/AssaultrRifles/NiceAssaultRifleMessage.uc b/sources/Weapons/BaseWeaponClasses/AssaultrRifles/NiceAssaultRifleMessage.uc new file mode 100644 index 0000000..4253655 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/AssaultrRifles/NiceAssaultRifleMessage.uc @@ -0,0 +1,9 @@ +class NiceAssaultRifleMessage extends BullpupSwitchMessage; + +defaultproperties +{ + SwitchMessage(2)="Set to Burst Fire." + SwitchMessage(3)="Set to 5-Burst Fire." + SwitchMessage(4)="Secondary mode now set to Semi-Automatic." + SwitchMessage(5)="Secondary mode now set to Burst Fire." +} diff --git a/sources/Weapons/BaseWeaponClasses/Heavy/NiceHeavyFire.uc b/sources/Weapons/BaseWeaponClasses/Heavy/NiceHeavyFire.uc new file mode 100644 index 0000000..9077bf8 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Heavy/NiceHeavyFire.uc @@ -0,0 +1,6 @@ +class NiceHeavyFire extends NiceFire; + +defaultproperties +{ + maxBonusContLenght=3 +} diff --git a/sources/Weapons/BaseWeaponClasses/Heavy/NiceHeavyGun.uc b/sources/Weapons/BaseWeaponClasses/Heavy/NiceHeavyGun.uc new file mode 100644 index 0000000..e8d7055 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Heavy/NiceHeavyGun.uc @@ -0,0 +1,5 @@ +class NiceHeavyGun extends NiceWeapon; + +defaultproperties +{ +} diff --git a/sources/Weapons/BaseWeaponClasses/Medic/NiceMedicDartFire.uc b/sources/Weapons/BaseWeaponClasses/Medic/NiceMedicDartFire.uc new file mode 100644 index 0000000..5869395 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Medic/NiceMedicDartFire.uc @@ -0,0 +1,57 @@ +class NiceMedicDartFire extends NiceFire; +function DoFireEffect(){ + local float oldLoad; + oldLoad = Load; + Load = 1; + super.DoFireEffect(); + Load = oldLoad; +} +simulated function bool AllowFire(){ + local KFPawn kfPwn; + if(currentContext.sourceWeapon == none || Instigator == none) + return false; + if(currentContext.sourceWeapon.secondaryCharge < default.AmmoPerFire) + return false; + // Check reloading + if(currentContext.sourceWeapon.bIsReloading) + return false; + // Check pawn actions + kfPwn = KFPawn(Instigator); + if(kfPwn == none || kfPwn.SecondaryItem != none || kfPwn.bThrowingNade) + return false; + return true; +} +simulated function ReduceAmmoClient(){ + local NiceMedicGun sourceMedGun; + currentContext.sourceWeapon.secondaryCharge -= AmmoPerFire; + sourceMedGun = NiceMedicGun(currentContext.sourceWeapon); + if(sourceMedGun != none){ + sourceMedGun.ServerSetMedicCharge(currentContext.sourceWeapon.secondaryCharge); + sourceMedGun.ClientSetMedicCharge(currentContext.sourceWeapon.secondaryCharge); + } +} + +defaultproperties +{ + ProjectileSpeed=12500.000000 + bulletClass=Class'NicePack.NiceMedicProjectile' + FireAimedAnim="Fire_Iron" + FireSoundRef="KF_MP7Snd.Medicgun_Fire" + StereoFireSoundRef="KF_MP7Snd.Medicgun_FireST" + NoAmmoSoundRef="KF_PumpSGSnd.SG_DryFire" + DamageMax=30 + bWaitForRelease=True + bAttachSmokeEmitter=True + TransientSoundVolume=2.000000 + TransientSoundRadius=500.000000 + AmmoPerFire=50 + ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) + ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) + ShakeRotTime=5.000000 + ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=3.000000 + BotRefireRate=0.250000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' + aimerror=1.000000 +} diff --git a/sources/Weapons/BaseWeaponClasses/Medic/NiceMedicGun.uc b/sources/Weapons/BaseWeaponClasses/Medic/NiceMedicGun.uc new file mode 100644 index 0000000..4f37338 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Medic/NiceMedicGun.uc @@ -0,0 +1,91 @@ +class NiceMedicGun extends NiceWeapon + abstract; +var const float maxMedicCharge; +var float medicChargeRegenRate; +// This variable is dictated by client. +var float medicCharge; +// Medic charge is replicated on server via these periods +var float medicChargeUpdatePeriod; +// This variable is only relevant on a server, to predict current medic charge in-between new updates +var float lastMedicChargeServerUpdate; +// This variable is only relevant on a client, to predict current medic charge in-between weapon ticks +var float lastMedicChargeClientUpdate; +replication{ + reliable if(Role < ROLE_Authority) + ServerSetMedicCharge; + reliable if(Role == ROLE_Authority) + ClientSetMedicCharge, ClientSuccessfulHeal; +} +function NicePlainData.Data GetNiceData(){ + local NicePlainData.Data transferData; + transferData = super.GetNiceData(); + class'NicePlainData'.static.SetFloat(transferData, "MedicCharge", GetCurrentMedicCharge()); + class'NicePlainData'.static.SetFloat(transferData, "MedicChargeUpd", Level.TimeSeconds); + return transferData; +} +function SetNiceData(NicePlainData.Data transferData, optional NiceHumanPawn newOwner){ + super.SetNiceData(transferData, newOwner); + medicCharge = class'NicePlainData'.static.GetFloat(transferData, "MedicCharge", 0.0); + lastMedicChargeServerUpdate = class'NicePlainData'.static.GetFloat(transferData, "MedicChargeUpd", -1.0); + if(lastMedicChargeServerUpdate >= 0.0) + medicCharge += (Level.TimeSeconds - lastMedicChargeServerUpdate) * medicChargeRegenRate; + lastMedicChargeServerUpdate = Level.TimeSeconds; + ClientSetMedicCharge(medicCharge); +} +function ServerSetMedicCharge(float newCharge){ + medicCharge = newCharge; + lastMedicChargeServerUpdate = Level.TimeSeconds; +} +simulated function ClientSetMedicCharge(float newCharge){ + medicCharge = newCharge; +} +// Returns current medic charge +// Uses prediction a server +simulated function float GetCurrentMedicCharge(){ + if(Role < ROLE_Authority) + return medicCharge; + else + return medicCharge + (Level.TimeSeconds - lastMedicChargeServerUpdate) * medicChargeRegenRate; +} +simulated function WeaponTick(float dt){ + local int prevPeriodsAmount; + local bool bWasBelowMax; + if(Role < ROLE_Authority){ + // Remember the old state + bWasBelowMax = (medicCharge < maxMedicCharge); + prevPeriodsAmount = Ceil(medicCharge / medicChargeUpdatePeriod); + // Update medic charge + medicCharge += (Level.TimeSeconds - lastMedicChargeClientUpdate) * medicChargeRegenRate; + lastMedicChargeClientUpdate = Level.TimeSeconds; + medicCharge = FMin(medicCharge, maxMedicCharge); + secondaryCharge = Ceil(medicCharge); + // Replicate to server when necessary + if( (bWasBelowMax && medicCharge >= maxMedicCharge) + || prevPeriodsAmount < Ceil(medicCharge / medicChargeUpdatePeriod) ) + ServerSetMedicCharge(medicCharge); + } + super.WeaponTick(dt); +} +simulated function ClientSuccessfulHeal(NiceHumanPawn healer, NiceHumanPawn healed){ + if(healed == none) + return; + if(instigator != none && PlayerController(instigator.controller) != none) + PlayerController(instigator.controller). + ClientMessage("You've healed"@healed.GetPlayerName(), 'CriticalEvent'); + if(NiceHumanPawn(instigator) != none && PlayerController(healed.controller) != none) + PlayerController(healed.controller). + ClientMessage("You've been healed by"@healer.GetPlayerName(), 'CriticalEvent'); +} + +defaultproperties +{ + maxMedicCharge=100.000000 + medicChargeRegenRate=10.000000 + medicChargeUpdatePeriod=10.000000 + bShowSecondaryCharge=True + SecondaryCharge=0 + bChangeSecondaryIcon=True + hudSecondaryTexture=Texture'KillingFloorHUD.HUD.Hud_Syringe' + activeSlowdown=0.750000 + activeSpeedup=2.000000 +} diff --git a/sources/Weapons/BaseWeaponClasses/Medic/NiceMedicProjectile.uc b/sources/Weapons/BaseWeaponClasses/Medic/NiceMedicProjectile.uc new file mode 100644 index 0000000..a580115 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Medic/NiceMedicProjectile.uc @@ -0,0 +1,20 @@ +class NiceMedicProjectile extends NiceBullet; +function GenerateImpactEffects(ImpactEffect effect, Vector hitLocation, Vector hitNormal, + optional bool bWallImpact, optional bool bGenerateDecal){ + if(bWallImpact){ + effect.EmitterClass = none; + effect.bPlayROEffect = true; + effect.bImportanEffect = false; + effect.noise = none; + } + super.GenerateImpactEffects(effect, hitLocation, hitNormal, bWallImpact, bGenerateDecal); +} + +defaultproperties +{ + trailXClass=None + regularImpact=(bImportanEffect=True,bPlayROEffect=False,decalClass=Class'KFMod.ShotgunDecal',EmitterClass=Class'KFMod.healingFX',emitterShiftWall=20.000000,emitterShiftPawn=20.000000,noiseRef="KF_MP7Snd.MP7_DartImpact",noiseVolume=2.000000) + bGenRegEffectOnPawn=True + StaticMeshRef="KF_pickups2_Trip.MP7_Dart" + AmbientSoundRef="KF_MP7Snd.MP7_DartFlyLoop" +} diff --git a/sources/Weapons/BaseWeaponClasses/Melee/NiceMeleeAttachment.uc b/sources/Weapons/BaseWeaponClasses/Melee/NiceMeleeAttachment.uc new file mode 100644 index 0000000..09ef994 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Melee/NiceMeleeAttachment.uc @@ -0,0 +1,6 @@ +class NiceMeleeAttachment extends NiceAttachment; + +defaultproperties +{ + bDoFiringEffects=False +} diff --git a/sources/Weapons/BaseWeaponClasses/Melee/NiceMeleeFire.uc b/sources/Weapons/BaseWeaponClasses/Melee/NiceMeleeFire.uc new file mode 100644 index 0000000..23195ed --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Melee/NiceMeleeFire.uc @@ -0,0 +1,290 @@ +//============================================================================== +// NicePack / NiceMeleeFire +//============================================================================== +// Adjustment of vanilla melee fire class to NicePack. +//============================================================================== +// 'Nice pack' source +// Do whatever the fuck you want with it +// Author: dkanus +// E-mail: dkanus@gmail.com +//============================================================================== +class NiceMeleeFire extends NiceFire; +var float weaponRange; +var float damageDelay; +// How far to rot view? +var vector impactShakeRotMag; +// How fast to rot view? +var vector impactShakeRotRate; +// How much time to rot the instigator's view? +var float impactShakeRotTime; +// Max view offset vertically? +var vector impactShakeOffsetMag; +// How fast to offset view vertically? +var vector impactShakeOffsetRate; +// How much time to offset view? +var float impactShakeOffsetTime; +// Sound for this melee strike hitting a pawn (fleshy hits). +var array meleeHitSounds; +var float meleeHitVolume; +var array fireAnims; +// The class to spawn for the hit effect for +// this melee weapon hitting the world (not pawns). +var class hitEffectClass; +var array meleeHitSoundRefs; +// The angle to do sweeping strikes in front of the player. +// If zero, - do no strikes. +var float wideDamageMinHitAngle; +static function PreloadAssets(LevelInfo level, optional KFFire spawned){ + local int i; + local NiceMeleeFire niceFire; + super.PreloadAssets(level, spawned); + for(i = 0; i < default.meleeHitSoundRefs.length;i ++){ + if(default.meleeHitSoundRefs[i] == "") + continue; + if( default.meleeHitSounds.length >= i + 1 + && default.meleeHitSounds[i] != none) + continue; + default.meleeHitSounds[i] = Sound( + DynamicLoadObject( default.meleeHitSoundRefs[i], + class'Sound', true)); + } + niceFire = NiceMeleeFire(spawned); + if(niceFire != none) + for(i = 0; i < default.meleeHitSoundRefs.length;i ++) + niceFire.meleeHitSounds[i] = default.meleeHitSounds[i]; +} +static function bool UnloadAssets(){ + local int i; + super.UnloadAssets(); + for(i = 0; i < default.meleeHitSoundRefs.length;i ++) + default.meleeHitSounds[i] = none; + return true; +} +simulated function DoBurst(optional bool bSkipFirstShot){} +function DoFireEffect(){} +function float MaxRange(){ + local bool hasWindCutterSkill; + traceRange = weaponRange; + if(instigator == none) return traceRange; + hasWindCutterSkill = class'NiceVeterancyTypes'.static. + HasSkill( NicePlayerController(instigator.controller), + class'NiceSkillZerkWindCutter'); + if(hasWindCutterSkill) + traceRange *= class'NiceSkillZerkWindCutter'.default.rangeBonus; + return traceRange; +} +simulated function bool AllowFire(){ + local KFPawn kfPwn; + // Check pawn actions + kfPwn = KFPawn(instigator); + if(kfPwn == none || kfPwn.SecondaryItem != none || kfPwn.bThrowingNade) + return false; + return true; +} +function name GetCorrectAnim(bool bLoop, bool bAimed){ + local int AnimToPlay; + if(fireAnims.length > 0){ + AnimToPlay = rand(fireAnims.length); + fireAnim = fireAnims[AnimToPlay]; + } + return FireAnim; +} +simulated function NiceMonster DealTargetMeleeDamage + ( + NiceReplicationInfo niceRI, + class niceDmgType + ){ + local float headSizeModifier; + local float headshotLevel; + local NiceMonster niceZed; + local Vector hitLocation, hitNormal; + local KFPlayerReplicationInfo KFPRI; + local class niceVet; + if(niceRI == none || instigator == none) return none; + KFPRI = KFPlayerReplicationInfo(instigator.PlayerReplicationInfo); + if(KFPRI == none) + return none; + niceVet = class(KFPRI.ClientVeteranSkill); + if(niceVet == none) + return none; + if(niceDmgType != none) + headSizeModifier = niceDmgType.default.headSizeModifier; + headSizeModifier = 1.0; + headSizeModifier *= + niceVet.static.GetHeadshotCheckMultiplier(KFPRI, niceDmgType); + headshotLevel = TraceZed(niceZed, hitLocation, hitNormal, headSizeModifier); + if(niceZed != none) + HitZed(niceZed, headshotLevel, niceRI, niceDmgType); + else + HitWall(niceRI, niceDmgType); + return niceZed; +} +function HitZed(NiceMonster niceZed, + float headshotLevel, + NiceReplicationInfo niceRI, + class niceDmgType){ + local Vector hitLocation, hitNormal; + local NiceMeleeWeapon niceWeap; + ImpactShakeView(); + niceWeap = NiceMeleeWeapon(weapon); + if(niceWeap != none && niceWeap.BloodyMaterial != none) + niceWeap.Skins[niceWeap.BloodSkinSwitchArray] = niceWeap.BloodyMaterial; + niceRI.ServerDealMeleeDamage( niceZed, damageMax, instigator, + hitLocation, -hitNormal, + niceDmgType, true, headshotLevel); +} +function HitWall( NiceReplicationInfo niceRI, + class niceDmgType){ + local Actor wall; + local Vector hitLocation, hitNormal; + local Rotator rotation; + TraceWall(wall, hitLocation, hitNormal); + if(wall != none){ + niceRI.ServerDealMeleeDamage( wall, damageMax, instigator, + hitLocation, -hitNormal, niceDmgType, + false); + rotation = Rotator + ( + HitLocation - instigator.location - instigator.EyePosition() + ); + instigator.spawn(hitEffectClass,,, hitLocation, rotation); + } +} +simulated function DealArcMeleeDamage + ( + NiceMonster niceZed, + NiceReplicationInfo niceRI, + class niceDmgType + ){ + local NiceMonster otherZed; + local float actualMinAngle, tempRadians; + local bool hasCleave; + if(weapon == none) return; + hasCleave = class'NiceVeterancyTypes'.static. + HasSkill( NicePlayerController(instigator.controller), + class'NiceSkillZerkCleave'); + actualMinAngle = wideDamageMinHitAngle; + if(hasCleave){ + tempRadians = acos(actualMinAngle); + tempRadians += class'NiceSkillZerkCleave'.default.bonusDegrees; + tempRadians = FMin(tempRadians, Pi); + actualMinAngle = cos(tempRadians); + } + foreach weapon.VisibleCollidingActors( + class'NiceMonster', otherZed, weaponRange * 2, + instigator.location + instigator.EyePosition()){ + + if(niceZed != none && otherZed == niceZed) continue; + if(otherZed == instigator || otherZed.Health <= 0) continue; + TryHitZedArc(actualMinAngle, otherZed, niceRI, niceDmgType); + } +} +function TryHitZedArc(float minAngle, NiceMonster niceZed, + NiceReplicationInfo niceRI, + class niceDmgType){ + local vector hitLocation, hitNormal; + local vector dir, lookDir; + local float diffAngle, victimDist; + victimDist = VSize(instigator.location - niceZed.location); + if(victimDist + niceZed.CollisionRadius > weaponRange * 1.1) + return; + lookDir = Normal(Vector(instigator.GetViewRotation())); + dir = Normal(niceZed.location - instigator.location); + diffAngle = lookDir dot dir; + if(diffAngle <= minAngle) + return; + hitLocation = + niceZed.location + niceZed.CollisionHeight * vect(0,0,0.7); + niceRI.ServerDealMeleeDamage( niceZed, damageMax * 0.5, instigator, + hitLocation, hitNormal, niceDmgType, + false, 0.0); + if(meleeHitSounds.Length > 0) + niceZed.PlaySound( meleeHitSounds[Rand(meleeHitSounds.length)], + SLOT_None, meleeHitVolume,,,, false); +} +simulated function Timer(){ + local NiceMonster niceZed; + local NiceReplicationInfo niceRI; + local class niceDmgType; + niceRI = GetNiceRI(); + niceDmgType = class(damageType); + if(niceRI == none || instigator == none || niceDmgType == none) + return; + niceZed = DealTargetMeleeDamage(niceRI, niceDmgType); + DealArcMeleeDamage(niceZed, niceRI, niceDmgType); +} +simulated function MDFEffectsClient(float newAmmoPerFire, float rec){ + local float fireSpeedMod; + fireSpeedMod = GetFireSpeed(); + super.MDFEffectsClient(newAmmoPerFire, rec); + SetTimer(damageDelay / fireSpeedMod, false); +} +function PlayFiring_animation(){ + if(weapon == none) return; + if(weapon.Mesh == none) return; + if(fireCount <= 0){ + weapon.PlayAnim(GetCorrectAnim(false, false), fireAnimRate, 0.0); + return; + } + if(weapon.HasAnim(FireLoopAnim)) + weapon.PlayAnim(GetCorrectAnim(true, false), fireLoopAnimRate, 0.0); + else + weapon.PlayAnim(GetCorrectAnim(false, false), fireAnimRate, 0.0); +} +function PlayFiring(){ + local float randPitch; + local bool shouldPlayStereo; + if(weapon == none) return; + if(weapon.instigator == none) return; + PlayFiring_animation(); + if(bRandomPitchFireSound){ + randPitch = FRand() * RandomPitchAdjustAmt; + if(FRand() < 0.5) + randPitch *= -1.0; + } + shouldPlayStereo = weapon.instigator.IsLocallyControlled() + && weapon.instigator.IsFirstPerson() + && StereoFireSound != none; + if(shouldPlayStereo){ + weapon.PlayOwnedSound( StereoFireSound, SLOT_Interact, + TransientSoundVolume * 0.85,, + TransientSoundRadius, 1.0 + randPitch, false); + } + else{ + weapon.PlayOwnedSound( FireSound, SLOT_Interact, TransientSoundVolume,, + TransientSoundRadius, 1.0 + randPitch, false); + } + ClientPlayForceFeedback(fireForce); + if(!currentContext.bIsBursting) + fireCount ++; +} +function ImpactShakeView(){ + local NicePlayerController nicePlayer; + if(instigator == none) return; + nicePlayer = NicePlayerController(instigator.controller); + if(nicePlayer == none) + return; + nicePlayer.WeaponShakeView( impactShakeRotMag, impactShakeRotRate, + impactShakeRotTime, impactShakeOffsetMag, + impactShakeOffsetRate, impactShakeOffsetTime); +} +simulated function HandleRecoil(float Rec){} + +defaultproperties +{ + weaponRange=70.000000 + damageDelay=0.300000 + ImpactShakeRotMag=(X=50.000000,Y=50.000000,Z=50.000000) + ImpactShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ImpactShakeRotTime=2.000000 + ImpactShakeOffsetMag=(X=10.000000,Y=10.000000,Z=10.000000) + ImpactShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ImpactShakeOffsetTime=2.000000 + MeleeHitVolume=1.000000 + HitEffectClass=Class'KFMod.KFMeleeHitEffect' + WideDamageMinHitAngle=1.000000 + bFiringDoesntAffectMovement=True + FireEndAnim= + FireForce="ShockRifleFire" + aimerror=100.000000 +} diff --git a/sources/Weapons/BaseWeaponClasses/Melee/NiceMeleeWeapon.uc b/sources/Weapons/BaseWeaponClasses/Melee/NiceMeleeWeapon.uc new file mode 100644 index 0000000..4248b39 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Melee/NiceMeleeWeapon.uc @@ -0,0 +1,42 @@ +class NiceMeleeWeapon extends NiceWeapon; +var class hitDamType; +var float weaponRange; +var Material BloodyMaterial; +var int BloodSkinSwitchArray; +var string BloodyMaterialRef; +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ + super.PreloadAssets(Inv, bSkipRefCount); + if(default.BloodyMaterial == none && default.BloodyMaterialRef != "") + default.BloodyMaterial = Combiner(DynamicLoadObject(default.BloodyMaterialRef, class'Combiner', true)); + if(NiceMeleeWeapon(Inv) != none) + NiceMeleeWeapon(Inv).BloodyMaterial = default.BloodyMaterial; +} +static function bool UnloadAssets(){ + if(super.UnloadAssets()) + default.BloodyMaterial = none; + return true; +} +//simulated function IncrementFlashCount(int mode){ +//} +simulated function BringUp(optional Weapon PrevWeapon){ + if(BloodyMaterial!=none && Skins[BloodSkinSwitchArray] == BloodyMaterial ){ + Skins[BloodSkinSwitchArray] = default.Skins[BloodSkinSwitchArray]; + Texture = default.Texture; + } + super.BringUp(PrevWeapon); +} +simulated function Fire(float F){ +} +simulated function AltFire(float F){ +} +simulated function bool HasAmmo(){ + return true; +} + +defaultproperties +{ + weaponRange=70.000000 + BloodSkinSwitchArray=2 + PutDownAnim="PutDown" + bMeleeWeapon=True +} diff --git a/sources/Weapons/BaseWeaponClasses/NiceHighROFFire.uc b/sources/Weapons/BaseWeaponClasses/NiceHighROFFire.uc new file mode 100644 index 0000000..4018844 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/NiceHighROFFire.uc @@ -0,0 +1,123 @@ +class NiceHighROFFire extends NiceFire; +// sound +var sound FireEndSound; // The sound to play at the end of the ambient fire sound +var sound FireEndStereoSound; // The sound to play at the end of the ambient fire sound in first person stereo +var float AmbientFireSoundRadius; // The sound radius for the ambient fire sound +var sound AmbientFireSound; // How loud to play the looping ambient fire sound +var byte AmbientFireVolume; // The ambient fire sound +var string FireEndSoundRef; +var string FireEndStereoSoundRef; +var string AmbientFireSoundRef; +//MEANTODO +/* +static function PreloadAssets(LevelInfo LevelInfo, optional KFFire Spawned){ + super.PreloadAssets(LevelInfo, Spawned); + if(default.FireEndSound != none && default.FireEndSoundRef != "") + default.FireEndSound = sound(DynamicLoadObject(default.FireEndSoundRef, class'sound', true)); + if(default.FireEndStereoSound == none){ + if(default.FireEndStereoSoundRef != "") + default.FireEndStereoSound = sound(DynamicLoadObject(default.FireEndStereoSoundRef, class'Sound', true)); + else + default.FireEndStereoSound = default.FireEndSound; + } + if(default.AmbientFireSoundRef != "") + default.AmbientFireSound = sound(DynamicLoadObject(default.AmbientFireSoundRef, class'sound', true)); + if(NiceHighROFFire(Spawned) != none){ + NiceHighROFFire(Spawned).FireEndSound = default.FireEndSound; + NiceHighROFFire(Spawned).FireEndStereoSound = default.FireEndStereoSound; + NiceHighROFFire(Spawned).AmbientFireSound = default.AmbientFireSound; + } +} +static function bool UnloadAssets(){ + super.UnloadAssets(); + default.FireEndSound = none; + default.FireEndStereoSound = none; + default.AmbientFireSound = none; + return true; +} +// Sends the fire class to the looping state +function StartFiring(){ + if(!bWaitForRelease && !currentContext.bIsBursting) + GotoState('FireLoop'); + else + Super.StartFiring(); +} +// Handles toggling the weapon attachment's ambient sound on and off +function PlayAmbientSound(Sound aSound){ + local WeaponAttachment WA; + WA = WeaponAttachment(Weapon.ThirdPersonActor); + if(Weapon == none || (WA == none)) + return; + if(aSound == none){ + WA.SoundVolume = WA.default.SoundVolume; + WA.SoundRadius = WA.default.SoundRadius; + } + else{ + WA.SoundVolume = AmbientFireVolume; + WA.SoundRadius = AmbientFireSoundRadius; + } + WA.AmbientSound = aSound; +} +// Make sure we are in the fire looping state when we fire +event ModeDoFire(){ + if(!bWaitForRelease && !currentContext.bIsBursting){ + if(AllowFire() && IsInState('FireLoop')) + Super.ModeDoFire(); + } + else + Super.ModeDoFire(); +} +state FireLoop +{ + function BeginState(){ + NextFireTime = Level.TimeSeconds - 0.1; + if(KFWeap.bAimingRifle) + Weapon.LoopAnim(FireLoopAimedAnim, FireLoopAnimRate, TweenTime); + else + Weapon.LoopAnim(FireLoopAnim, FireLoopAnimRate, TweenTime); + PlayAmbientSound(AmbientFireSound); + } + function PlayFiring(){} + function ServerPlayFiring(){} + function EndState(){ + Weapon.AnimStopLooping(); + PlayAmbientSound(none); + if(Weapon.Instigator != none && Weapon.Instigator.IsLocallyControlled() && + Weapon.Instigator.IsFirstPerson() && StereoFireSound != none) + Weapon.PlayOwnedSound(FireEndStereoSound,SLOT_none,AmbientFireVolume/127,,AmbientFireSoundRadius,,false); + else + Weapon.PlayOwnedSound(FireEndSound,SLOT_none,AmbientFireVolume/127,,AmbientFireSoundRadius); + Weapon.StopFire(ThisModeNum); + } + function StopFiring(){ + GotoState(''); + } + function ModeTick(float dt){ + Super.ModeTick(dt); + if(!bIsFiring || !AllowFire()){ + GotoState(''); + return; + } + } +} +function PlayFireEnd(){ + if(!bWaitForRelease) + Super.PlayFireEnd(); +}*/ +defaultproperties +{ + AmbientFireSoundRadius=500.000000 + AmbientFireVolume=255 + FireAimedAnim="Fire_Iron" + FireEndAimedAnim="Fire_Iron_End" + FireLoopAimedAnim="Fire_Iron_Loop" + bAccuracyBonusForSemiAuto=True + bPawnRapidFireAnim=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire_Loop" + FireEndAnim="Fire_End" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + BotRefireRate=0.100000 + aimerror=30.000000 +} diff --git a/sources/Weapons/BaseWeaponClasses/NiceScopedWeapon.uc b/sources/Weapons/BaseWeaponClasses/NiceScopedWeapon.uc new file mode 100644 index 0000000..8be936a --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/NiceScopedWeapon.uc @@ -0,0 +1,441 @@ +class NiceScopedWeapon extends NiceWeapon + abstract; +#exec OBJ LOAD FILE=ScopeShaders.utx +#exec OBJ LOAD FILE=..\Textures\NicePackT.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx +var() Material ZoomMat; +var() Sound ZoomSound; +var() int lenseMaterialID; // used since material id's seem to change alot +var() float scopePortalFOVHigh; // The FOV to zoom the scope portal by. +var() float scopePortalFOV; // The FOV to zoom the scope portal by. +var() vector XoffsetScoped; +var() vector XoffsetHighDetail; +var() int tileSize; +// 3d Scope vars +var ScriptedTexture ScopeScriptedTexture; // Scripted texture for 3d scopes +var Shader ScopeScriptedShader; // The shader that combines the scripted texture with the sight overlay +var Material ScriptedTextureFallback; // The texture to render if the users system doesn't support shaders +// new scope vars +var Combiner ScriptedScopeCombiner; +var texture TexturedScopeTexture; +var bool bInitializedScope; // Set to true when the scope has been initialized +var string ZoomMatRef; +var string ScriptedTextureFallbackRef; +var texture CrosshairTex; +var string CrosshairTexRef; +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ + local NiceScopedWeapon W; + super.PreloadAssets(Inv, bSkipRefCount); + if(default.ZoomMat == none && default.ZoomMatRef != ""){ + // Try to load as various types of materials + default.ZoomMat = FinalBlend(DynamicLoadObject(default.ZoomMatRef, class'FinalBlend', true)); + if(default.ZoomMat == none) + default.ZoomMat = Combiner(DynamicLoadObject(default.ZoomMatRef, class'Combiner', true)); + if(default.ZoomMat == none) + default.ZoomMat = Shader(DynamicLoadObject(default.ZoomMatRef, class'Shader', true)); + if(default.ZoomMat == none) + default.ZoomMat = Texture(DynamicLoadObject(default.ZoomMatRef, class'Texture', true)); + if(default.ZoomMat == none) + default.ZoomMat = Material(DynamicLoadObject(default.ZoomMatRef, class'Material')); + } + if(default.ScriptedTextureFallback == none && default.ScriptedTextureFallbackRef != "") + default.ScriptedTextureFallback = texture(DynamicLoadObject(default.ScriptedTextureFallbackRef, class'texture')); + if(default.CrosshairTex == none && default.CrosshairTexRef != "") + default.CrosshairTex = Texture(DynamicLoadObject(default.CrosshairTexRef, class'texture')); + W = NiceScopedWeapon(Inv); + if(W != none){ + W.ZoomMat = default.ZoomMat; + W.ScriptedTextureFallback = default.ScriptedTextureFallback; + W.CrosshairTex = default.CrosshairTex; + } +} +static function bool UnloadAssets(){ + if(super.UnloadAssets()){ + default.ZoomMat = none; + default.ScriptedTextureFallback = none; + default.CrosshairTex = none; + } + return true; +} +simulated function bool ShouldDrawPortal() +{ + if(bAimingRifle) + return true; + else + return false; +} +simulated function PostBeginPlay() +{ + super.PostBeginPlay(); + // Get new scope detail value from KFWeapon + KFScopeDetail = class'KFMod.KFWeapon'.default.KFScopeDetail; + UpdateScopeMode(); +} +// Handles initializing and swithing between different scope modes +simulated function UpdateScopeMode() +{ + if (Level.NetMode != NM_DedicatedServer && Instigator != none && Instigator.IsLocallyControlled() && Instigator.IsHumanControlled()){ + if(KFScopeDetail == KF_ModelScope){ + scopePortalFOV = default.scopePortalFOV; + ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + + if (bUsingSights || bAimingRifle) + PlayerViewOffset = XoffsetScoped; + + if(ScopeScriptedTexture == none) + ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); + + ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; + ScopeScriptedTexture.SetSize(512,512); + ScopeScriptedTexture.Client = Self; + + if(ScriptedScopeCombiner == none){ + ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); + ScriptedScopeCombiner.Material1 = CrosshairTex; + ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + ScriptedScopeCombiner.CombineOperation = CO_Multiply; + ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; + ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; + } + if(ScopeScriptedShader == none){ + ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); + ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; + ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; + ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + } + + bInitializedScope = true; + } + else if( KFScopeDetail == KF_ModelScopeHigh ) + { + scopePortalFOV = scopePortalFOVHigh; + ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); + if(bUsingSights || bAimingRifle) + PlayerViewOffset = XoffsetHighDetail; + + if(ScopeScriptedTexture == none) + ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); + ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; + ScopeScriptedTexture.SetSize(1024,1024); + ScopeScriptedTexture.Client = Self; + + if(ScriptedScopeCombiner == none){ + ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); + ScriptedScopeCombiner.Material1 = CrosshairTex; + ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + ScriptedScopeCombiner.CombineOperation = CO_Multiply; + ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; + ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; + } + + if(ScopeScriptedShader == none){ + ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); + ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; + ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; + ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + } + + bInitializedScope = true; + } + else if (KFScopeDetail == KF_TextureScope){ + ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + PlayerViewOffset.X = default.PlayerViewOffset.X; + + bInitializedScope = true; + } + } +} +simulated event RenderTexture(ScriptedTexture Tex) +{ + local rotator RollMod; + RollMod = Instigator.GetViewRotation(); + if(Owner != none && Instigator != none && Tex != none && Tex.Client != none) + Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,Owner,(Instigator.Location + Instigator.EyePosition()), RollMod, scopePortalFOV ); +} +simulated function SetZoomBlendColor(Canvas c) +{ + local Byte val; + local Color clr; + local Color fog; + clr.R = 255; + clr.G = 255; + clr.B = 255; + clr.A = 255; + if(Instigator.Region.Zone.bDistanceFog){ + fog = Instigator.Region.Zone.DistanceFogColor; + val = 0; + val = Max(val, fog.R); + val = Max(val, fog.G); + val = Max(val, fog.B); + if(val > 128){ + val -= 128; + clr.R -= val; + clr.G -= val; + clr.B -= val; + } + } + c.DrawColor = clr; +} +//Handles all the functionality for zooming in including +// setting the parameters for the weapon, pawn, and playercontroller +simulated function ZoomIn(bool bAnimateTransition) +{ + default.ZoomTime = default.recordedZoomTime; + PlayerIronSightFOV = default.PlayerIronSightFOV; + scopePortalFOVHigh = default.scopePortalFOVHigh; + scopePortalFOV = default.scopePortalFOV; + PlayerIronSightFOV = default.PlayerIronSightFOV; + if(instigator != none && instigator.bIsCrouched && class'NiceVeterancyTypes'.static.hasSkill(NicePlayerController(Instigator.Controller), class'NiceSkillSharpshooterHardWork')){ + default.ZoomTime *= class'NiceSkillSharpshooterHardWork'.default.zoomSpeedBonus; + if(instigator != none && instigator.bIsCrouched){ + PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + scopePortalFOVHigh *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + scopePortalFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + } + } + super(BaseKFWeapon).ZoomIn(bAnimateTransition); + bAimingRifle = True; + if(KFHumanPawn(Instigator) != none) + KFHumanPawn(Instigator).SetAiming(True); + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ){ + if(AimInSound != none) + PlayOwnedSound(AimInSound, SLOT_Interact,,,,, false); + } +} +// Handles all the functionality for zooming out including +// setting the parameters for the weapon, pawn, and playercontroller +simulated function ZoomOut(bool bAnimateTransition) +{ + default.ZoomTime = default.recordedZoomTime; + PlayerIronSightFOV = default.PlayerIronSightFOV; + scopePortalFOVHigh = default.scopePortalFOVHigh; + scopePortalFOV = default.scopePortalFOV; + PlayerIronSightFOV = default.PlayerIronSightFOV; + if(class'NiceVeterancyTypes'.static.hasSkill(NicePlayerController(Instigator.Controller), class'NiceSkillSharpshooterHardWork')){ + default.ZoomTime *= class'NiceSkillSharpshooterHardWork'.default.zoomSpeedBonus; + PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + scopePortalFOVHigh *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + scopePortalFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + } + super.ZoomOut(bAnimateTransition); + bAimingRifle = False; + if( KFHumanPawn(Instigator)!=none ) + KFHumanPawn(Instigator).SetAiming(False); + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { + if( AimOutSound != none ) + { + PlayOwnedSound(AimOutSound, SLOT_Interact,,,,, false); + } + KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); + } +} +simulated function WeaponTick(float dt) +{ + super.WeaponTick(dt); + if(bAimingRifle && ForceZoomOutTime > 0 && Level.TimeSeconds - ForceZoomOutTime > 0) + { + ForceZoomOutTime = 0; + + ZoomOut(false); + + if(Role < ROLE_Authority) + ServerZoomOut(false); + } +} +// Called by the native code when the interpolation of the first person weapon to the zoomed position finishes +simulated event OnZoomInFinished() +{ + local name anim; + local float frame, rate; + GetAnimParams(0, anim, frame, rate); + if (ClientState == WS_ReadyToFire) + { + // Play the iron idle anim when we're finished zooming in + if (anim == IdleAnim) + { + PlayIdle(); + } + } + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none && + KFScopeDetail == KF_TextureScope ) + { + KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); + } +} +simulated function bool CanZoomNow() +{ + Return (!FireMode[0].bIsFiring && !FireMode[1].bIsFiring && Instigator!=none && Instigator.Physics!=PHYS_Falling); +} +simulated event RenderOverlays(Canvas Canvas) +{ + local int m; + local PlayerController PC; + if (Instigator == none) + return; + PC = PlayerController(Instigator.Controller); + if(PC == none) + return; + if(!bInitializedScope && PC != none ) + { + UpdateScopeMode(); + } + Canvas.DrawActor(none, false, true); + for (m = 0; m < NUM_FIRE_MODES; m++) + { + if (FireMode[m] != none) + { + FireMode[m].DrawMuzzleFlash(Canvas); + } + } + + SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); + SetRotation( Instigator.GetViewRotation() + ZoomRotInterp); + PreDrawFPWeapon(); + if(bAimingRifle && PC != none && (KFScopeDetail == KF_ModelScope || KFScopeDetail == KF_ModelScopeHigh)){ + if(ShouldDrawPortal()){ + if(ScopeScriptedTexture != none){ + Skins[LenseMaterialID] = ScopeScriptedShader; + ScopeScriptedTexture.Client = Self; + ScopeScriptedTexture.Revision = (ScopeScriptedTexture.Revision + 1); + } + } + + bDrawingFirstPerson = true; + Canvas.DrawBoundActor(self, false, false,DisplayFOV,PC.Rotation,rot(0,0,0),Instigator.CalcZoomedDrawOffset(self)); + bDrawingFirstPerson = false; + } + else if(KFScopeDetail == KF_TextureScope && PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle){ + Skins[LenseMaterialID] = ScriptedTextureFallback; + + SetZoomBlendColor(Canvas); + + Canvas.Style = ERenderStyle.STY_Normal; + Canvas.SetPos(0, 0); + Canvas.DrawTile(ZoomMat, (Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); + Canvas.SetPos(Canvas.SizeX, 0); + Canvas.DrawTile(ZoomMat, -(Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); + + Canvas.Style = 255; + Canvas.SetPos((Canvas.SizeX - Canvas.SizeY) / 2,0); + Canvas.DrawTile(ZoomMat, Canvas.SizeY, Canvas.SizeY, 0.0, 0.0, tileSize, tileSize); + + Canvas.Font = Canvas.MedFont; + Canvas.SetDrawColor(200,150,0); + + Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.43); + Canvas.DrawText(" "); + + Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.47); + } + else{ + Skins[LenseMaterialID] = ScriptedTextureFallback; + bDrawingFirstPerson = true; + Canvas.DrawActor(self, false, false, DisplayFOV); + bDrawingFirstPerson = false; + } +} +// Adjust a single FOV based on the current aspect ratio. Adjust FOV is the default NON-aspect ratio adjusted FOV to adjust +simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV) +{ + local KFPlayerController KFPC; + local float ResX, ResY; + local float AspectRatio; + KFPC = KFPlayerController(Level.GetLocalPlayerController()); + if( KFPC == none ) + { + return AdjustFOV; + } + ResX = float(GUIController(KFPC.Player.GUIController).ResX); + ResY = float(GUIController(KFPC.Player.GUIController).ResY); + AspectRatio = ResX / ResY; + if ( KFPC.bUseTrueWideScreenFOV && AspectRatio >= 1.60 ) //1.6 = 16/10 which is 16:10 ratio and 16:9 comes to 1.77 + { + return CalcFOVForAspectRatio(AdjustFOV); + } + else + { + return AdjustFOV; + } +} +// AdjustIngameScope(RO) - Takes the changes to the ScopeDetail variable and +// sets the scope to the new detail mode. Called when the player switches the +// scope setting ingame, or when the scope setting is changed from the menu +simulated function AdjustIngameScope() +{ + local PlayerController PC; + if(Instigator == none || PlayerController(Instigator.Controller) == none) + return; + PC = PlayerController(Instigator.Controller); + if(!bHasScope) + return; + switch (KFScopeDetail) + { + case KF_ModelScope: + if(bAimingRifle) + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + if (PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle){ + if(Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none) + KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); + } + break; + + case KF_TextureScope: + if(bAimingRifle) + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + if (bAimingRifle && PC.DesiredFOV != PlayerIronSightFOV){ + if(Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none) + KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); + } + break; + + case KF_ModelScopeHigh: + if(bAimingRifle){ + if(default.ZoomedDisplayFOVHigh > 0) + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); + else + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + } + if ( bAimingRifle && PC.DesiredFOV == PlayerIronSightFOV ) + { + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { + KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); + } + } + break; + } + // Make any chagned to the scope setup + UpdateScopeMode(); +} +simulated event Destroyed() +{ + PreTravelCleanUp(); + Super.Destroyed(); +} +simulated function PreTravelCleanUp() +{ + if(ScopeScriptedTexture != none){ + ScopeScriptedTexture.Client = none; + Level.ObjectPool.FreeObject(ScopeScriptedTexture); + ScopeScriptedTexture=none; + } + if(ScriptedScopeCombiner != none){ + ScriptedScopeCombiner.Material2 = none; + Level.ObjectPool.FreeObject(ScriptedScopeCombiner); + ScriptedScopeCombiner = none; + } + if(ScopeScriptedShader != none){ + ScopeScriptedShader.Diffuse = none; + ScopeScriptedShader.SelfIllumination = none; + Level.ObjectPool.FreeObject(ScopeScriptedShader); + ScopeScriptedShader = none; + } +} +defaultproperties +{ + tileSize=1024 +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualies.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualies.uc new file mode 100644 index 0000000..72f1b24 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualies.uc @@ -0,0 +1,466 @@ +class NiceDualies extends NiceWeapon; +var class SingleClass; +var name altFlashBoneName; +var name altTPAnim; +var Actor altThirdPersonActor; +var name altWeaponAttach; +// Track ammo in each gun separately +var int MagAmmoRemLeft, MagAmmoRemLeftClient; +var int MagAmmoRemRight, MagAmmoRemRightClient; +// Variables for managing dual-pistols reload +var const string leftEjectStr, rightEjectStr; // Event names that trigger when magazines ejected +var const string leftInsertStr, rightInsertStr; // Event names that trigger when magazines inserted +var float leftEject, rightEject; // Frame at which magazines ejected +var float leftInsert, rightInsert; // Frame at which magazines inserted +// This weapon is currently switching and soon won't exist +var bool bSwitching; +replication{ + reliable if(Role < ROLE_Authority) + ServerUpdateWeaponMag, ServerSetDualMagSize, ServerReduceDualMag, ServerSwitchToSingle, ServerSwitchToGivenSingle; + reliable if(Role == ROLE_Authority) + MagAmmoRemLeft, MagAmmoRemRight, ClientSetDualMagSize; + reliable if(bNetOwner && bNetDirty && (Role == ROLE_Authority)) + altThirdPersonActor; +} +simulated function PostBeginPlay(){ + super.PostBeginPlay(); + SetupDualReloadEvents(); + reloadPreEndFrame = FMin(leftEject, rightEject); + reloadEndFrame = FMax(leftInsert, rightInsert); + DemoReplacement = SingleClass; +} +simulated function SetupDualReloadEvents(){ + local EventRecord record; + relEvents.Length = 0; + record.eventName = leftEjectStr; + record.eventFrame = leftEject; + relEvents[relEvents.Length] = record; + record.eventName = rightEjectStr; + record.eventFrame = rightEject; + relEvents[relEvents.Length] = record; + record.eventName = leftInsertStr; + record.eventFrame = leftInsert; + relEvents[relEvents.Length] = record; + record.eventName = rightInsertStr; + record.eventFrame = rightInsert; + relEvents[relEvents.Length] = record; +} +// Don't use that one for dualies +simulated function AddReloadedAmmo(){} +// Use this one +simulated function ReloadEvent(string eventName){ + local int halfMag; + local int totalAvailableAmmo; + UpdateMagCapacity(Instigator.PlayerReplicationInfo); + halfMag = GetSingleMagCapacity(); + totalAvailableAmmo = AmmoAmount(0); + totalAvailableAmmo -= (MagAmmoRemLeftClient + MagAmmoRemRightClient); + // Handle ejection + if(eventName ~= leftEjectStr){ + MagAmmoRemLeftClient = 0; + ServerSetDualMagSize(MagAmmoRemLeftClient, MagAmmoRemRightClient, Level.TimeSeconds); + NiceDualies(Instigator.Weapon).GetMagazineAmmo(); + return; + } + else if(eventName ~= rightEjectStr){ + MagAmmoRemRightClient = 0; + ServerSetDualMagSize(MagAmmoRemLeftClient, MagAmmoRemRightClient, Level.TimeSeconds); + NiceDualies(Instigator.Weapon).GetMagazineAmmo(); + return; + } + // Handle reload + if(totalAvailableAmmo < 0) + return; + if(eventName ~= leftInsertStr){ + MagAmmoRemLeftClient += totalAvailableAmmo; + MagAmmoRemLeftClient = Min(MagAmmoRemLeftClient, halfMag); + } + else if(eventName ~= rightInsertStr){ + MagAmmoRemRightClient += totalAvailableAmmo; + MagAmmoRemRightClient = Min(MagAmmoRemRightClient, halfMag); + } + NiceDualies(Instigator.Weapon).GetMagazineAmmo(); + ServerSetDualMagSize(MagAmmoRemLeftClient, MagAmmoRemRightClient, Level.TimeSeconds); +} +simulated function BringUp(optional Weapon PrevWeapon){ + super.BringUp(PrevWeapon); + ApplyLaserState(); +} +simulated function ApplyLaserState(){ + super.ApplyLaserState(); + if(NiceAttachment(altThirdPersonActor) != none) + NiceAttachment(altThirdPersonActor).SetLaserType(LaserType); +} +simulated function ZoomIn(bool bAnimateTransition){ + super.ZoomIn(bAnimateTransition); + if(bAnimateTransition){ + if(bZoomOutInterrupted) + PlayAnim('GOTO_Iron',1.0,0.1); + else + PlayAnim('GOTO_Iron',1.0,0.1); + } +} +simulated function ZoomOut(bool bAnimateTransition){ + local float AnimLength, AnimSpeed; + super.ZoomOut(false); + if(bAnimateTransition){ + AnimLength = GetAnimDuration('GOTO_Hip', 1.0); + if(ZoomTime > 0 && AnimLength > 0) + AnimSpeed = AnimLength/ZoomTime; + else + AnimSpeed = 1.0; + PlayAnim('GOTO_Hip',AnimSpeed,0.1); + } +} +function AttachToPawn(Pawn P){ + local name BoneName; + Super.AttachToPawn(P); + if(altThirdPersonActor == none){ + altThirdPersonActor = Spawn(AttachmentClass, Owner); + InventoryAttachment(altThirdPersonActor).InitFor(self); + } + else + altThirdPersonActor.NetUpdateTime = Level.TimeSeconds - 1; + BoneName = P.GetOffhandBoneFor(self); + if(BoneName == ''){ + altThirdPersonActor.SetLocation(P.Location); + altThirdPersonActor.SetBase(P); + } + else + P.AttachToBone(altThirdPersonActor, BoneName); + if(altThirdPersonActor != none) + NiceDualiesAttachment(altThirdPersonActor).bIsOffHand = true; + if(altThirdPersonActor != none && ThirdPersonActor != none){ + NiceDualiesAttachment(altThirdPersonActor).brother = NiceDualiesAttachment(ThirdPersonActor); + NiceDualiesAttachment(ThirdPersonActor).brother = NiceDualiesAttachment(altThirdPersonActor); + altThirdPersonActor.LinkMesh(NiceDualiesAttachment(ThirdPersonActor).BrotherMesh); + } +} +simulated function DetachFromPawn(Pawn P){ + super.DetachFromPawn(P); + if(altThirdPersonActor != none){ + altThirdPersonActor.Destroy(); + altThirdPersonActor = none; + } +} +simulated function Destroyed(){ + super.Destroyed(); + if(ThirdPersonActor != none) + ThirdPersonActor.Destroy(); + if(altThirdPersonActor != none) + altThirdPersonActor.Destroy(); +} +simulated function vector GetEffectStart(){ + local Vector RightFlashLoc,LeftFlashLoc; + RightFlashLoc = GetBoneCoords(default.FlashBoneName).Origin; + LeftFlashLoc = GetBoneCoords(default.altFlashBoneName).Origin; + if(Instigator.IsFirstPerson()){ + if(WeaponCentered()) + return CenteredEffectStart(); + if(bAimingRifle){ + if(KFFire(GetFireMode(0)).FireAimedAnim != 'FireLeft_Iron') + return RightFlashLoc; + else + return LeftFlashLoc; + } + else{ + if(GetFireMode(0).FireAnim != 'FireLeft') + return RightFlashLoc; + else + return LeftFlashLoc; + } + } + else{ + return (Instigator.Location + Instigator.EyeHeight * Vect(0, 0, 0.5) + vector(Instigator.Rotation) * 40.0); + } +} +function NicePlainData.Data GetNiceData(){ + local NicePlainData.Data transferData; + transferData = super.GetNiceData(); + class'NicePlainData'.static.SetInt(transferData, "leftMag", MagAmmoRemLeft); + class'NicePlainData'.static.SetInt(transferData, "rightMag", MagAmmoRemRight); + return transferData; +} +function SetNiceData(NicePlainData.Data transferData, optional NiceHumanPawn newOwner){ + local int halfMag; + super.SetNiceData(transferData, newOwner); + if(newOwner != none) + UpdateMagCapacity(newOwner.PlayerReplicationInfo); + halfMag = GetSingleMagCapacity(); + MagAmmoRemLeft = class'NicePlainData'.static.GetInt(transferData, "leftMag", halfMag); + MagAmmoRemRight = class'NicePlainData'.static.GetInt(transferData, "rightMag", halfMag); + ClientSetDualMagSize(MagAmmoRemLeft, MagAmmoRemRight); +} +simulated function AltFire(float F){ + if(NicePlayerController(Instigator.Controller) != none) + ClientForceInterruptReload(CANCEL_PASSIVESWITCH); + if(!bIsReloading) + ServerSwitchToSingle(); +} +simulated function FireGivenGun(bool bFireLeft){ + local NiceDualiesFire niceFireMode; + niceFireMode = NiceDualiesFire(FireMode[0]); + if(niceFireMode != none){ + if(bFireLeft) + niceFireMode.ModeDoFireLeft(); + else + niceFireMode.ModeDoFireRight(); + } +} +function NiceSingle ServerSwitchToGivenSingle(bool bSwitchToLeft){ + local int m; + local int origAmmo; + local NiceHumanPawn nicePawn; + local NiceSingle singlePistol; + local NicePlainData.Data transferData; + nicePawn = NiceHumanPawn(Instigator); + if(nicePawn == none || SingleClass == none || nicePawn.Health <= 0) + return none; + nicePawn.CurrentWeight -= Weight; + Weight = 0; + bSwitching = true; + origAmmo = AmmoAmount(0); + for(m = 0; m < NUM_FIRE_MODES;m ++) + if(FireMode[m].bIsFiring) + StopFire(m); + DetachFromPawn(nicePawn); + singlePistol = nicePawn.Spawn(SingleClass); + if(singlePistol != none){ + singlePistol.Weight = default.Weight; + singlePistol.DemoReplacement = DemoReplacement; + transferData = GetNiceData(); + singlePistol.GiveTo(nicePawn); + singlePistol.SetNiceData(transferData, nicePawn); + singlePistol.bIsDual = true; + singlePistol.Weight = default.Weight; + singlePistol.SellValue = SellValue; + if(bSwitchToLeft){ + singlePistol.otherMagazine = MagAmmoRemRight; + singlePistol.MagAmmoRemaining = MagAmmoRemLeft; + singlePistol.Ammo[0].AmmoAmount = origAmmo - MagAmmoRemRight; + } + else{ + singlePistol.otherMagazine = MagAmmoRemLeft; + singlePistol.MagAmmoRemaining = MagAmmoRemRight; + singlePistol.Ammo[0].AmmoAmount = origAmmo - MagAmmoRemLeft; + } + singlePistol.ClientSetMagSize(singlePistol.MagAmmoRemaining, false); + //nicePawn.ServerChangedWeapon(self, singlePistol); + //nicePawn.ClientChangeWeapon(singlePistol); + } + Destroy(); + return singlePistol; +} +function NiceSingle ServerSwitchToSingle(){ + return ServerSwitchToGivenSingle(MagAmmoRemLeft > MagAmmoRemRight); +} +function DropFrom(vector StartLocation){ + local int m; + local int magKeep, magGive; + local NiceHumanPawn nicePawn; + local KFWeaponPickup weapPickup; + local NiceSingle singlePistol; + local int AmmoThrown, OtherAmmo; + nicePawn = NiceHumanPawn(Instigator); + if(nicePawn == none || !bCanThrow || SingleClass == none) + return; + nicePawn.CurrentWeight -= Weight; + Weight = 0; + bSwitching = true; + if(MagAmmoRemLeft > MagAmmoRemRight){ + magKeep = MagAmmoRemLeft; + magGive = MagAmmoRemRight; + } + else{ + magKeep = MagAmmoRemRight; + magGive = MagAmmoRemLeft; + } + OtherAmmo = AmmoAmount(0); + ClientWeaponThrown(); + for(m = 0; m < NUM_FIRE_MODES;m ++) + if(FireMode[m].bIsFiring) + StopFire(m); + DetachFromPawn(nicePawn); + AmmoThrown = magGive; + OtherAmmo = OtherAmmo - AmmoThrown; + singlePistol = nicePawn.Spawn(SingleClass); + if(singlePistol != none){ + singlePistol.DemoReplacement = none; + singlePistol.GiveTo(nicePawn); + singlePistol.Ammo[0].AmmoAmount = OtherAmmo; + singlePistol.MagAmmoRemaining = magKeep; + singlePistol.ClientSetMagSize(singlePistol.MagAmmoRemaining, false); + MagAmmoRemaining = magGive; + //nicePawn.ServerChangedWeapon(self, singlePistol); + //nicePawn.ClientChangeWeapon(singlePistol); + } + weapPickup = KFWeaponPickup(nicePawn.Spawn(SingleClass.default.PickupClass,,, StartLocation)); + if(weapPickup != none){ + weapPickup.InitDroppedPickupFor(self); + weapPickup.Weight = default.Weight; + weapPickup.Velocity = Velocity; + weapPickup.AmmoAmount[0] = AmmoThrown; + weapPickup.SellValue = SellValue / 2; + singlePistol.SellValue = weapPickup.SellValue; + weapPickup.MagAmmoRemaining = magGive; + if(nicePawn.Health > 0) + weapPickup.bThrown = true; + } + Destroy(); + if(KFGameType(Level.Game) != none) + KFGameType(Level.Game).WeaponDestroyed(class); +} +function bool HandlePickupQuery(pickup Item){ + if(Item.InventoryType == SingleClass){ + if(LastHasGunMsgTime < Level.TimeSeconds && PlayerController(Instigator.Controller) != none){ + LastHasGunMsgTime = Level.TimeSeconds + 0.5; + PlayerController(Instigator.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 1); + } + return true; + } + return super.HandlePickupQuery(Item); +} +// Nice functions +simulated function int GetSingleMagCapacity(){ + return int(float(MagCapacity) * 0.5); +} +function UpdateWeaponMag(){ + ServerUpdateWeaponMag(); +} +function ServerUpdateWeaponMag(){ + UpdateMagCapacity(Instigator.PlayerReplicationInfo); + MagAmmoRemLeft = Min(MagAmmoRemLeft, GetSingleMagCapacity()); + MagAmmoRemRight = Min(MagAmmoRemRight, GetSingleMagCapacity()); + ClientSetDualMagSize(MagAmmoRemLeft, MagAmmoRemRight); +} +simulated function ClientUpdateWeaponMag(){ + UpdateMagCapacity(Instigator.PlayerReplicationInfo); + MagAmmoRemLeftClient = Min(MagAmmoRemLeftClient, GetSingleMagCapacity()); + MagAmmoRemRightClient = Min(MagAmmoRemRightClient, GetSingleMagCapacity()); + ServerSetDualMagSize(MagAmmoRemLeftClient, MagAmmoRemRightClient, Level.TimeSeconds); +} +// Forces update for client's magazine ammo counter +// In case we are using client-side hit-detection, client itself manages remaining ammunition in magazine, but in some cases we want server to dictate current magazine amount +// This function sets client's mag size to a given value +simulated function ClientSetDualMagSize(int newLeftMag, int newRightMag){ + MagAmmoRemLeftClient = newLeftMag; + MagAmmoRemRightClient = newRightMag; + MagAmmoRemainingClient = MagAmmoRemLeftClient + MagAmmoRemRightClient; +} +// This function allows clients to change magazine size without altering total ammo amount +// It allows clients to provide time-stamps, so that older change won't override a newer one +function ServerSetDualMagSize(int newLeftMag, int newRightMag, float updateTime){ + MagAmmoRemLeft = newLeftMag; + MagAmmoRemRight = newRightMag; + magAmmoRemaining = MagAmmoRemLeft + MagAmmoRemRight; + if(LastMagUpdateFromClient <= updateTime){ + LastMagUpdateFromClient = updateTime; + if(magAmmoRemaining > 0) + bServerFiredLastShot = false; + } +} +// This function allows clients to change magazine size along with total ammo amount on the server (to update ammo counter in client-side mode) +// It allows clients to provide time-stamps, so that older change won't override a newer one +// Intended to be used for decreasing ammo count from shooting and cannot increase magazine size +function ServerReduceDualMag(int newLeftMag, int newRightMag, float updateTime, int Mode){ + local int delta; + delta = MagAmmoRemLeft - newLeftMag; + delta += MagAmmoRemRight - newRightMag; + // Only update later changes that actually decrease magazine + if(LastMagUpdateFromClient <= updateTime && delta > 0){ + LastMagUpdateFromClient = updateTime; + MagAmmoRemLeft = newLeftMag; + MagAmmoRemRight = newRightMag; + ConsumeAmmo(Mode, delta); + MagAmmoRemaining = MagAmmoRemLeft + MagAmmoRemRight; + } +} +simulated function int GetMagazineAmmoLeft(){ + if(Role < ROLE_Authority) + return MagAmmoRemLeftClient; + else + return MagAmmoRemLeft; +} +simulated function int GetMagazineAmmoRight(){ + if(Role < ROLE_Authority) + return MagAmmoRemRightClient; + else + return MagAmmoRemRight; +} +simulated function bool AllowReload(){ + UpdateMagCapacity(Instigator.PlayerReplicationInfo); + if(FireMode[0].IsFiring() || + bIsReloading || (GetMagazineAmmoLeft() >= GetSingleMagCapacity() && GetMagazineAmmoRight() >= GetSingleMagCapacity()) || + ClientState == WS_BringUp || + AmmoAmount(0) <= GetMagazineAmmo()) + return false; + return true; +} +simulated function WeaponTick(float dt){ + if(Role == Role_AUTHORITY) + MagAmmoRemaining = MagAmmoRemLeft + MagAmmoRemRight; + else + MagAmmoRemainingClient = MagAmmoRemLeftClient + MagAmmoRemRightClient; + super.WeaponTick(dt); +} +// Some functions reloaded to force update of magazine size on client's side +function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned){ + super.GiveAmmo(m, WP, bJustSpawned); + ClientSetDualMagSize(MagAmmoRemLeft, MagAmmoRemRight); +} + +defaultproperties +{ + SingleClass=Class'NicePack.NiceSingle' + altFlashBoneName="Tip_Left" + altTPAnim="DualiesAttackLeft" + altWeaponAttach="Bone_weapon2" + leftEjectStr="LEFT_EJECT" + rightEjectStr="RIGHT_EJECT" + leftInsertStr="LEFT_INSERT" + rightInsertStr="RIGHT_INSERT" + leftEject=0.130000 + rightEject=0.102000 + leftInsert=0.444000 + rightInsert=0.787000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=-1.000000 + reloadChargeStartFrame=-1.000000 + MagazineBone= + bHasChargePhase=False + FirstPersonFlashlightOffset=(X=-15.000000,Z=5.000000) + MagCapacity=30 + ReloadRate=3.500000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + FlashBoneName="Tip_Right" + WeaponReloadAnim="Reload_Dual9mm" + Weight=4.000000 + bDualWeapon=True + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=70.000000 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Dual_9mm' + ZoomInRotation=(Pitch=0,Roll=0) + ZoomedDisplayFOV=65.000000 + FireModeClass(0)=Class'NicePack.NiceDualiesFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + AIRating=0.440000 + CurrentRating=0.440000 + bShowChargingBar=True + Description="A pair of custom 9mm pistols. What they lack in stopping power, they compensate for with a quick refire." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=70.000000 + Priority=65 + InventoryGroup=2 + GroupOffset=2 + PickupClass=Class'NicePack.NiceDualiesPickup' + PlayerViewOffset=(X=20.000000,Z=-7.000000) + BobDamping=7.000000 + AttachmentClass=Class'NicePack.NiceDualiesAttachment' + IconCoords=(X1=229,Y1=258,X2=296,Y2=307) + ItemName="!!!Dual something" + DrawScale=0.900000 + TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesAmmo.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesAmmo.uc new file mode 100644 index 0000000..4478e81 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesAmmo.uc @@ -0,0 +1,13 @@ +class NiceDualiesAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +defaultproperties +{ + AmmoPickupAmount=30 + MaxAmmo=480 + InitialAmount=240 + PickupClass=Class'NicePack.NiceDualiesAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=413,Y1=82,X2=457,Y2=125) + ItemName="Dualies bullets" +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesAmmoPickup.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesAmmoPickup.uc new file mode 100644 index 0000000..ec23b97 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesAmmoPickup.uc @@ -0,0 +1,9 @@ +class NiceDualiesAmmoPickup extends NiceAmmoPickup; + +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceDualiesAmmo' + PickupMessage="Rounds (9mm)" + StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesAttachment.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesAttachment.uc new file mode 100644 index 0000000..bd073f5 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesAttachment.uc @@ -0,0 +1,128 @@ +class NiceDualiesAttachment extends NiceAttachment; +var bool bIsOffHand, bMyFlashTurn; +var NiceDualiesAttachment brother; +var Mesh BrotherMesh; +replication{ + reliable if(Role == ROLE_Authority) + brother; +} +simulated function DoFlashEmitter(){ + if(bIsOffHand) + return; + if(bMyFlashTurn) + ActuallyFlash(); + else if(brother != none) + brother.ActuallyFlash(); +} +simulated function ActuallyFlash(){ + super.DoFlashEmitter(); +} +simulated event ThirdPersonEffects(){ + local NicePlayerController PC; + if((Level.NetMode == NM_DedicatedServer) || (Instigator == none)) + return; + PC = NicePlayerController(Level.GetLocalPlayerController()); + if(FiringMode == 0){ + if(OldSpawnHitCount != SpawnHitCount){ + OldSpawnHitCount = SpawnHitCount; + GetHitInfo(); + if(((Instigator != none) && (Instigator.Controller == PC)) || (VSize(PC.ViewTarget.Location - mHitLocation) < 4000)){ + if(PC != Instigator.Controller){ + if(mHitActor != none) + Spawn(class'ROBulletHitEffect',,, mHitLocation, Rotator(-mHitNormal)); + CheckForSplash(); + SpawnTracer(); + } + } + } + } + if(FlashCount > 0){ + if(KFPawn(Instigator) != none){ + if(bMyFlashTurn) + KFPawn(Instigator).StartFiringX(false, bRapidFire); + else + KFPawn(Instigator).StartFiringX(true, bRapidFire); + } + if(bDoFiringEffects){ + if((Level.TimeSeconds - LastRenderTime > 0.2) && (Instigator.Controller != PC)) + return; + if(bSpawnLight) + WeaponLight(); + DoFlashEmitter(); + if(!bIsOffHand){ + if(!bMyFlashTurn) + ThirdPersonShellEject(); + else if(brother != none) + brother.ThirdPersonShellEject(); + } + } + } + else{ + GotoState(''); + if(KFPawn(Instigator) != none) + KFPawn(Instigator).StopFiring(); + } +} +simulated function vector GetTracerStart(){ + local Pawn p; + p = Pawn(Owner); + if((p != none) && p.IsFirstPerson() && p.Weapon != none) + return p.Weapon.GetEffectStart(); + if(mMuzFlash3rd != none && bMyFlashTurn) + return mMuzFlash3rd.Location; + else if(brother != none && brother.mMuzFlash3rd != none && !bMyFlashTurn) + return brother.mMuzFlash3rd.Location; +} + +defaultproperties +{ + bMyFlashTurn=True + BrotherMesh=SkeletalMesh'KF_Weapons3rd_Trip.Dual9mm_3rd' + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_Dual9mm" + MovementAnims(1)="JogB_Dual9mm" + MovementAnims(2)="JogL_Dual9mm" + MovementAnims(3)="JogR_Dual9mm" + TurnLeftAnim="TurnL_Dual9mm" + TurnRightAnim="TurnR_Dual9mm" + CrouchAnims(0)="CHwalkF_Dual9mm" + CrouchAnims(1)="CHwalkB_Dual9mm" + CrouchAnims(2)="CHwalkL_Dual9mm" + CrouchAnims(3)="CHwalkR_Dual9mm" + WalkAnims(0)="WalkF_Dual9mm" + WalkAnims(1)="WalkB_Dual9mm" + WalkAnims(2)="WalkL_Dual9mm" + WalkAnims(3)="WalkR_Dual9mm" + CrouchTurnRightAnim="CH_TurnR_Dual9mm" + CrouchTurnLeftAnim="CH_TurnL_Dual9mm" + IdleCrouchAnim="CHIdle_Dual9mm" + IdleWeaponAnim="Idle_Dual9mm" + IdleRestAnim="Idle_Dual9mm" + IdleChatAnim="Idle_Dual9mm" + IdleHeavyAnim="Idle_Dual9mm" + IdleRifleAnim="Idle_Dual9mm" + FireAnims(0)="DualiesAttackRight" + FireAnims(1)="DualiesAttackRight" + FireAnims(2)="DualiesAttackRight" + FireAnims(3)="DualiesAttackRight" + FireAltAnims(0)="DualiesAttackLeft" + FireAltAnims(1)="DualiesAttackLeft" + FireAltAnims(2)="DualiesAttackLeft" + FireAltAnims(3)="DualiesAttackLeft" + FireCrouchAnims(0)="CHDualiesAttackRight" + FireCrouchAnims(1)="CHDualiesAttackRight" + FireCrouchAnims(2)="CHDualiesAttackRight" + FireCrouchAnims(3)="CHDualiesAttackRight" + FireCrouchAltAnims(0)="CHDualiesAttackLeft" + FireCrouchAltAnims(1)="CHDualiesAttackLeft" + FireCrouchAltAnims(2)="CHDualiesAttackLeft" + FireCrouchAltAnims(3)="CHDualiesAttackLeft" + HitAnims(0)="HitF_Dual9mmm" + HitAnims(1)="HitB_Dual9mm" + HitAnims(2)="HitL_Dual9mm" + HitAnims(3)="HitR_Dual9mm" + PostFireBlendStandAnim="Blend_Dual9mm" + PostFireBlendCrouchAnim="CHBlend_Dual9mm" +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesFire.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesFire.uc new file mode 100644 index 0000000..1dd4ac2 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesFire.uc @@ -0,0 +1,247 @@ +class NiceDualiesFire extends NiceFire; +var bool bWasInZedTime; +var Emitter Flash2Emitter; +var Emitter ShellEject2Emitter; +var name ShellEject2BoneName; +var name FireAnim2, FireAimedAnim2; +var bool bIsLeftShot; +var float leftNextFireTime; +var float rightNextFireTime; +var bool bLastFiredLeft; +simulated function ModeTick(float delta){ + local float timeCutScale; + local NicePlayerController nicePlayer; + if(instigator != none) + nicePlayer = NicePlayerController(instigator.controller); + if(nicePlayer != none && nicePlayer.IsZedTimeActive() != bWasInZedTime){ + bWasInZedTime = !bWasInZedTime; + timeCutScale = 1.0; + if(bWasInZedTime) + timeCutScale = KFGameType(Level.Game).ZedTimeSlomoScale; + niceNextFireTime = Level.TimeSeconds + (niceNextFireTime - Level.TimeSeconds) * timeCutScale; + nextFireTime = niceNextFireTime; + leftNextFireTime = Level.TimeSeconds + (leftNextFireTime - Level.TimeSeconds) * timeCutScale; + rightNextFireTime = Level.TimeSeconds + (rightNextFireTime - Level.TimeSeconds) * timeCutScale; + } + super.ModeTick(delta); +} +simulated function InitEffects(){ + local NiceDualies dualWeapon; + dualWeapon = NiceDualies(Weapon); + if((Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != none) || dualWeapon == none) + return; + if((FlashEmitterClass != none) && ((FlashEmitter == none) || FlashEmitter.bDeleteMe)){ + FlashEmitter = Weapon.Spawn(FlashEmitterClass); + Weapon.AttachToBone(FlashEmitter, dualWeapon.default.FlashBoneName); + } + if((FlashEmitterClass != none) && ((Flash2Emitter == none) || Flash2Emitter.bDeleteMe)){ + Flash2Emitter = Weapon.Spawn(FlashEmitterClass); + Weapon.AttachToBone(Flash2Emitter, dualWeapon.default.altFlashBoneName); + } + if((SmokeEmitterClass != none) && ((SmokeEmitter == none) || SmokeEmitter.bDeleteMe)) + SmokeEmitter = Weapon.Spawn(SmokeEmitterClass); + if((ShellEjectClass != none) && ((ShellEjectEmitter == none) || ShellEjectEmitter.bDeleteMe)){ + ShellEjectEmitter = Weapon.Spawn(ShellEjectClass); + Weapon.AttachToBone(ShellEjectEmitter, ShellEjectBoneName); + } + if((ShellEjectClass != none) && ((ShellEject2Emitter == none) || ShellEject2Emitter.bDeleteMe)){ + ShellEject2Emitter = Weapon.Spawn(ShellEjectClass); + Weapon.AttachToBone(ShellEject2Emitter, ShellEject2BoneName); + } +} +simulated function DestroyEffects(){ + super.DestroyEffects(); + if(ShellEject2Emitter != none) + ShellEject2Emitter.Destroy(); + if(Flash2Emitter != none) + Flash2Emitter.Destroy(); +} +function DrawMuzzleFlash(Canvas Canvas){ + super.DrawMuzzleFlash(Canvas); + if(ShellEject2Emitter != none) + Canvas.DrawActor( ShellEject2Emitter, false, false, Weapon.DisplayFOV ); +} +function FlashMuzzleFlash(){ + if(Flash2Emitter == none || FlashEmitter == none) + return; + if(KFWeap.bAimingRifle){ + if(FireAimedAnim == 'FireLeft_Iron'){ + Flash2Emitter.Trigger(Weapon, Instigator); + if(ShellEjectEmitter != none) + ShellEjectEmitter.Trigger(Weapon, Instigator); + } + else{ + FlashEmitter.Trigger(Weapon, Instigator); + if(ShellEject2Emitter != none) + ShellEject2Emitter.Trigger(Weapon, Instigator); + } + } + else{ + if(FireAnim == 'FireLeft'){ + Flash2Emitter.Trigger(Weapon, Instigator); + if(ShellEjectEmitter != none) + ShellEjectEmitter.Trigger(Weapon, Instigator); + } + else{ + FlashEmitter.Trigger(Weapon, Instigator); + if(ShellEject2Emitter != none) + ShellEject2Emitter.Trigger(Weapon, Instigator); + } + } +} +simulated function ModeDoFireLeft(){ + local NiceDualies dualWeapon; + local NiceDualiesAttachment dualAttach, dualAttachAlt; + dualWeapon = NiceDualies(Weapon); + dualAttach = NiceDualiesAttachment(dualWeapon.ThirdPersonActor); + dualAttachAlt = NiceDualiesAttachment(dualWeapon.altThirdPersonActor); + if(dualWeapon == none || !AllowLeftFire()) + return; + // Set shine turn + if(dualAttach != none) + dualAttach.bMyFlashTurn = false; + if(dualAttachAlt != none) + dualAttachAlt.bMyFlashTurn = true; + // Swap bones and animations + dualWeapon.FlashBoneName = dualWeapon.default.altFlashBoneName; + dualWeapon.altFlashBoneName = dualWeapon.default.FlashBoneName; + FireAnim = default.FireAnim2; + FireAnim2 = default.FireAnim; + FireAimedAnim = default.FireAimedAnim2; + FireAimedAnim2 = default.FireAimedAnim; + // Do left shot + bIsLeftShot = true; + super.ModeDoFire(); + leftNextFireTime = UpdateNextFireTimeSingle(leftNextFireTime); + InitEffects(); + bLastFiredLeft = true; +} +simulated function ModeDoFireRight(){ + local NiceDualies dualWeapon; + local NiceDualiesAttachment dualAttach, dualAttachAlt; + dualWeapon = NiceDualies(Weapon); + dualAttach = NiceDualiesAttachment(dualWeapon.ThirdPersonActor); + dualAttachAlt = NiceDualiesAttachment(dualWeapon.altThirdPersonActor); + if(dualWeapon == none || !AllowRightFire()) + return; + // Set shine turn + if(dualAttach != none) + dualAttach.bMyFlashTurn = true; + if(dualAttachAlt != none) + dualAttachAlt.bMyFlashTurn = false; + // Default bones and animations + dualWeapon.FlashBoneName = dualWeapon.default.FlashBoneName; + dualWeapon.altFlashBoneName = dualWeapon.default.altFlashBoneName; + FireAnim = default.FireAnim; + FireAnim2 = default.FireAnim2; + FireAimedAnim = default.FireAimedAnim; + FireAimedAnim2 = default.FireAimedAnim2; + // Do right shot + bIsLeftShot = false; + super.ModeDoFire(); + rightNextFireTime = UpdateNextFireTimeSingle(rightNextFireTime); + InitEffects(); + bLastFiredLeft = false; +} +simulated function bool AllowLeftFire(){ + local NiceDualies niceDualWeap; + niceDualWeap = NiceDualies(currentContext.sourceWeapon); + if(niceDualWeap == none) + return false; + if(niceDualWeap.GetMagazineAmmoLeft() < default.AmmoPerFire && !bCanFireIncomplete) + return false; + return true; +} +simulated function bool AllowRightFire(){ + local NiceDualies niceDualWeap; + niceDualWeap = NiceDualies(currentContext.sourceWeapon); + if(niceDualWeap == none) + return false; + if(niceDualWeap.GetMagazineAmmoRight() < default.AmmoPerFire && !bCanFireIncomplete) + return false; + return true; +} +simulated function bool AllowFire(){ + return super.AllowFire() && (AllowLeftFire() || AllowRightFire()); +} +event ModeDoFire(){ + local NiceDualies dualWeap; + dualWeap = NiceDualies(Instigator.Weapon); + if(dualWeap == none || niceNextFireTime > Level.TimeSeconds || !AllowFire()) + return; + if(niceNextFireTime + FireRate < Level.TimeSeconds) + bResetRecoil = true; + // Choose correct pistol to fire + if(Level.TimeSeconds > leftNextFireTime && Level.TimeSeconds > rightNextFireTime && AllowLeftFire() && AllowRightFire()){ + if(dualWeap.GetMagazineAmmoLeft() > dualWeap.GetMagazineAmmoRight()) + ModeDoFireLeft(); + else if(dualWeap.GetMagazineAmmoLeft() < dualWeap.GetMagazineAmmoRight()) + ModeDoFireRight(); + else if(bLastFiredLeft) + ModeDoFireRight(); + else + ModeDoFireLeft(); + } + else if(Level.TimeSeconds > leftNextFireTime && AllowLeftFire()) + ModeDoFireLeft(); + else if(Level.TimeSeconds > rightNextFireTime && AllowRightFire()) + ModeDoFireRight(); +} +simulated function ReduceAmmoClient(){ + local NiceDualies dualWeap; + dualWeap = NiceDualies(currentContext.sourceWeapon); + if(dualWeap == none) + return; + if(bIsLeftShot) + dualWeap.MagAmmoRemLeftClient -= Load; + else + dualWeap.MagAmmoRemRightClient -= Load; + if(dualWeap.MagAmmoRemLeftClient < 0) + dualWeap.MagAmmoRemLeftClient = 0; + if(dualWeap.MagAmmoRemRightClient < 0) + dualWeap.MagAmmoRemRightClient = 0; + // Force server's magazine size + dualWeap.ServerReduceDualMag(dualWeap.MagAmmoRemLeftClient, dualWeap.MagAmmoRemRightClient, Level.TimeSeconds, ThisModeNum); +} +simulated function float UpdateNextFireTimeSingle(float fireTimeVar){ + FireRate *= 2; + fireTimeVar = UpdateNextFireTime(fireTimeVar); + FireRate = default.FireRate; + return fireTimeVar; +} + +defaultproperties +{ + ShellEject2BoneName="Shell_eject_right" + FireAnim2="FireLeft" + FireAimedAnim2="FireLeft_Iron" + FireAimedAnim="FireRight_Iron" + RecoilRate=0.070000 + maxVerticalRecoilAngle=450 + maxHorizontalRecoilAngle=50 + ShellEjectClass=Class'ROEffects.KFShellEject9mm' + ShellEjectBoneName="Shell_eject_left" + DamageMin=35 + DamageMax=35 + Momentum=10500.000000 + bPawnRapidFireAnim=True + bWaitForRelease=True + bAttachSmokeEmitter=True + TransientSoundVolume=1.800000 + FireAnim="FireRight" + FireLoopAnim= + FireEndAnim= + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.087500 + AmmoClass=Class'NicePack.NiceSingleAmmo' + ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=3.000000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=0.250000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' + aimerror=30.000000 +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesPickup.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesPickup.uc new file mode 100644 index 0000000..063ff15 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceDualiesPickup.uc @@ -0,0 +1,38 @@ +class NiceDualiesPickup extends NiceWeaponPickup; +var int MagAmmoRemLeft; +var int MagAmmoRemRight; +function ShowDualiesInfo(Canvas C){ + C.SetPos((C.SizeX - C.SizeY) / 2,0); + C.DrawTile( Texture'KillingfloorHUD.ClassMenu.Dualies', C.SizeY, C.SizeY, 0.0, 0.0, 256, 256); +} +function InitDroppedPickupFor(Inventory Inv){ + local NiceDualies dualW; + super.InitDroppedPickupFor(Inv); + dualW = NiceDualies(Inv); + if(dualW != none){ + MagAmmoRemLeft = dualW.MagAmmoRemLeft; + MagAmmoRemRight = dualW.MagAmmoRemRight; + } +} + +defaultproperties +{ + Weight=1.000000 + cost=150 + BuyClipSize=30 + PowerValue=35 + SpeedValue=85 + RangeValue=35 + Description="A pair of custom 9mm handguns." + ItemName="Dual 9mms" + ItemShortName="Dual 9mms" + AmmoItemName="9mm Rounds" + AmmoMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' + CorrespondingPerkIndex=2 + EquipmentCategoryID=1 + InventoryType=Class'NicePack.NiceDualies' + PickupMessage="You found another 9mm handgun" + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.pistol.double9mm_pickup' + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingle.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingle.uc new file mode 100644 index 0000000..6dda784 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingle.uc @@ -0,0 +1,215 @@ +class NiceSingle extends NiceWeapon; +var bool bIsDual; +var int otherMagazine; +var class DualClass; +replication{ + reliable if(Role < ROLE_Authority) + ServerSwitchToOtherSingle, ServerSwitchToDual; + reliable if(Role == ROLE_Authority) + bIsDual, otherMagazine; +} +function bool HandlePickupQuery(Pickup Item){ + local float AddWeight; + if(Item.InventoryType == class){ + AddWeight = Weight; + if(DualClass != none) + AddWeight = dualClass.default.Weight - AddWeight; + if(bIsDual || KFHumanPawn(Owner) != none && !KFHumanPawn(Owner).CanCarry(AddWeight)){ + PlayerController(Instigator.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2); + return true; + } + return false; + } + return super.HandlePickupQuery(Item); +} +simulated function bool AltFireCanForceInterruptReload(){ + return true; +} +simulated function Fire(float F){ + if(!bIsReloading && GetMagazineAmmo() <= 0 && otherMagazine > 0) + ServerSwitchToOtherSingle(); + else + super.Fire(F); +} +simulated function AltFire(float F){ + if(bIsDual && NicePlayerController(Instigator.Controller) != none) + ClientForceInterruptReload(CANCEL_PASSIVESWITCH); + if(!bIsReloading && bIsDual) + ServerSwitchToDual(); + else + super.AltFire(F); +} +function ServerSwitchToOtherSingle(){ + local int swap; + local NiceHumanPawn nicePawn; + nicePawn = NiceHumanPawn(Instigator); + if(!bIsDual || nicePawn == none || nicePawn.Health <= 0) + return; + Ammo[0].AmmoAmount += otherMagazine - MagAmmoRemaining; + swap = MagAmmoRemaining; + MagAmmoRemaining = otherMagazine; + otherMagazine = swap; + ClientSetMagSize(MagAmmoRemaining, bRoundInChamber); + //nicePawn.ClientChangeWeapon(self); +} +function ServerSwitchToDual(){ + local int m; + local int origAmmo; + local NiceHumanPawn nicePawn; + local NiceDualies dualPistols; + local NicePlainData.Data transferData; + nicePawn = NiceHumanPawn(Instigator); + if(!bIsDual || DualClass == none || nicePawn == none || nicePawn.Health <= 0) + return; + nicePawn.CurrentWeight -= Weight; + Weight = 0; + origAmmo = AmmoAmount(0); + for(m = 0; m < NUM_FIRE_MODES;m ++) + if(FireMode[m].bIsFiring) + StopFire(m); + DetachFromPawn(nicePawn); + dualPistols = nicePawn.Spawn(DualClass); + if(dualPistols != none){ + dualPistols.DemoReplacement = class; + transferData = GetNiceData(); + dualPistols.GiveTo(nicePawn); + dualPistols.SetNiceData(transferData, nicePawn); + dualPistols.MagAmmoRemRight = MagAmmoRemaining; + dualPistols.MagAmmoRemLeft = otherMagazine; + dualPistols.MagAmmoRemaining = dualPistols.MagAmmoRemLeft + dualPistols.MagAmmoRemRight; + dualPistols.SellValue = SellValue; + dualPistols.Ammo[0].AmmoAmount = origAmmo + otherMagazine; + dualPistols.ClientSetDualMagSize(dualPistols.MagAmmoRemLeft, dualPistols.MagAmmoRemRight); + //nicePawn.ClientChangeWeapon(dualPistols); + //nicePawn.ServerChangedWeapon(self, dualPistols); + } + Destroy(); +} +function DropFrom(vector StartLocation){ + local int m; + local int magKeep, magGive; + local KFWeaponPickup weapPickup; + local int weightBeforeThrow; + local int AmmoThrown, OtherAmmo; + local NiceHumanPawn nicePawn; + nicePawn = NiceHumanPawn(Instigator); + if(nicePawn == none) + return; + if(!bIsDual){ + super.DropFrom(StartLocation); + return; + } + weightBeforeThrow = nicePawn.CurrentWeight; + magKeep = otherMagazine; + magGive = MagAmmoRemaining; + OtherAmmo = AmmoAmount(0) - magKeep; + ClientWeaponThrown(); + for(m = 0; m < NUM_FIRE_MODES;m ++) + if(FireMode[m].bIsFiring) + StopFire(m); + if(nicePawn != none) + DetachFromPawn(nicePawn); + AmmoThrown = OtherAmmo / 2; + OtherAmmo = OtherAmmo - AmmoThrown; + Ammo[0].AmmoAmount = OtherAmmo + magKeep; + MagAmmoRemaining = magKeep; + ClientSetMagSize(MagAmmoRemaining, bRoundInChamber); + weapPickup = KFWeaponPickup(nicePawn.Spawn(default.PickupClass,,, StartLocation)); + if(weapPickup != none){ + weapPickup.InitDroppedPickupFor(self); + weapPickup.Velocity = Velocity; + weapPickup.AmmoAmount[0] = AmmoThrown + magGive; + weapPickup.SellValue = SellValue * 0.5; + SellValue *= 0.5; + weapPickup.MagAmmoRemaining = magGive; + if(nicePawn.Health > 0) + weapPickup.bThrown = true; + nicePawn.ClientChangeWeapon(self); + } + RemoveDual(weightBeforeThrow); +} +function RemoveDual(int pawnWeight){ + local NiceHumanPawn nicePawn; + nicePawn = NiceHumanPawn(Instigator); + if(!bIsDual || nicePawn == none) + return; + bIsDual = false; + DemoReplacement = none; + nicePawn.CurrentWeight = pawnWeight - (Weight - default.Weight); + Weight = default.Weight; + otherMagazine = 0; +} +//SellValue +function GiveTo(Pawn other, optional Pickup Pickup){ + local int m; + local int initAmmo, initMag; + local bool bDestroy; + local NiceSingle nicePistol; + local NiceDualies niceDual; + if(other != none){ + nicePistol = NiceSingle(other.FindInventoryType(class)); + niceDual = NiceDualies(other.FindInventoryType(DualClass)); + } + bDestroy = false; + if(nicePistol == none || (niceDual != none && niceDual.bSwitching)) + super.GiveTo(other, Pickup); + else if((nicePistol != none && nicePistol.bIsDual) || niceDual != none) + bDestroy = true; + else{ + nicePistol.UpdateMagCapacity(other.PlayerReplicationInfo); + initAmmo = nicePistol.FireMode[0].AmmoClass.default.InitialAmount; + initMag = nicePistol.MagCapacity; + initMag = Min(initMag, initAmmo); + initAmmo -= initMag; + if(nicePistol.Ammo[0] != none){ + nicePistol.Ammo[0].AmmoAmount += initAmmo; + nicePistol.Ammo[0].AmmoAmount = Min(nicePistol.Ammo[0].AmmoAmount, nicePistol.Ammo[0].MaxAmmo); + } + nicePistol.bIsDual = true; + nicePistol.otherMagazine = initMag; + nicePistol.SellValue = 2 * min(SellValue, nicePistol.SellValue); + nicePistol.ServerSwitchToDual(); + bDestroy = true; + } + if(bDestroy){ + for(m = 0; m < NUM_FIRE_MODES;m ++) + Ammo[m] = none; + Destroy(); + } +} + +defaultproperties +{ + DualClass=Class'NicePack.NiceDualies' + bHasChargePhase=False + FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) + MagCapacity=15 + ReloadRate=2.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_Single9mm" + ModeSwitchAnim="LightOn" + Weight=0.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=70.000000 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_9mm' + ZoomedDisplayFOV=65.000000 + FireModeClass(0)=Class'NicePack.NiceSingleFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + AIRating=0.250000 + CurrentRating=0.250000 + bShowChargingBar=True + Description="A 9mm Pistol" + DisplayFOV=70.000000 + Priority=60 + InventoryGroup=2 + GroupOffset=1 + PickupClass=Class'NicePack.NiceSinglePickup' + PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceSingleAttachment' + IconCoords=(X1=434,Y1=253,X2=506,Y2=292) + ItemName="Just a single pistol" +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleAmmo.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleAmmo.uc new file mode 100644 index 0000000..892507b --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleAmmo.uc @@ -0,0 +1,13 @@ +class NiceSingleAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +defaultproperties +{ + AmmoPickupAmount=30 + MaxAmmo=240 + InitialAmount=120 + PickupClass=Class'KFMod.SingleAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=413,Y1=82,X2=457,Y2=125) + ItemName="9mm bullets" +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleAmmoPickup.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleAmmoPickup.uc new file mode 100644 index 0000000..f191cd2 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleAmmoPickup.uc @@ -0,0 +1,10 @@ +class NiceSingleAmmoPickup extends NiceAmmoPickup; + +defaultproperties +{ + AmmoAmount=20 + InventoryType=Class'NicePack.NiceSingleAmmo' + RespawnTime=0.000000 + PickupMessage="Rounds (9mm)" + StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleAttachment.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleAttachment.uc new file mode 100644 index 0000000..681fd22 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleAttachment.uc @@ -0,0 +1,52 @@ +class NiceSingleAttachment extends NiceAttachment; + +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_Single9mm" + MovementAnims(1)="JogB_Single9mm" + MovementAnims(2)="JogL_Single9mm" + MovementAnims(3)="JogR_Single9mm" + TurnLeftAnim="TurnL_Single9mm" + TurnRightAnim="TurnR_Single9mm" + CrouchAnims(0)="CHwalkF_Single9mm" + CrouchAnims(1)="CHwalkB_Single9mm" + CrouchAnims(2)="CHwalkL_Single9mm" + CrouchAnims(3)="CHwalkR_Single9mm" + CrouchTurnRightAnim="CH_TurnR_Single9mm" + CrouchTurnLeftAnim="CH_TurnL_Single9mm" + IdleCrouchAnim="CHIdle_Single9mm" + IdleWeaponAnim="Idle_Single9mm" + IdleRestAnim="Idle_Single9mm" + IdleChatAnim="Idle_Single9mm" + IdleHeavyAnim="Idle_Single9mm" + IdleRifleAnim="Idle_Single9mm" + FireAnims(0)="Fire_Single9mm" + FireAnims(1)="Fire_Single9mm" + FireAnims(2)="Fire_Single9mm" + FireAnims(3)="Fire_Single9mm" + FireAltAnims(0)="Fire_Single9mm" + FireAltAnims(1)="Fire_Single9mm" + FireAltAnims(2)="Fire_Single9mm" + FireAltAnims(3)="Fire_Single9mm" + FireCrouchAnims(0)="CHFire_Single9mm" + FireCrouchAnims(1)="CHFire_Single9mm" + FireCrouchAnims(2)="CHFire_Single9mm" + FireCrouchAnims(3)="CHFire_Single9mm" + FireCrouchAltAnims(0)="CHFire_Single9mm" + FireCrouchAltAnims(1)="CHFire_Single9mm" + FireCrouchAltAnims(2)="CHFire_Single9mm" + FireCrouchAltAnims(3)="CHFire_Single9mm" + HitAnims(0)="HitF_Single9mm" + HitAnims(1)="HitB_Single9mm" + HitAnims(2)="HitL_Single9mm" + HitAnims(3)="HitR_Single9mm" + PostFireBlendStandAnim="Blend_Single9mm" + PostFireBlendCrouchAnim="CHBlend_Single9mm" + SplashEffect=Class'ROEffects.BulletSplashEmitter' + LightType=LT_Pulse + LightRadius=0.000000 + CullDistance=5000.000000 +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleFire.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleFire.uc new file mode 100644 index 0000000..0349cd7 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSingleFire.uc @@ -0,0 +1,46 @@ +class NiceSingleFire extends NiceFire; +var bool bWasInZedTime; +simulated function ModeTick(float delta){ + local NicePlayerController nicePlayer; + if(instigator != none) + nicePlayer = NicePlayerController(instigator.controller); + if(nicePlayer != none && nicePlayer.IsZedTimeActive() != bWasInZedTime){ + bWasInZedTime = !bWasInZedTime; + if(bWasInZedTime) + niceNextFireTime = Level.TimeSeconds + (niceNextFireTime - Level.TimeSeconds) * KFGameType(Level.Game).ZedTimeSlomoScale; + nextFireTime = niceNextFireTime; + } + super.ModeTick(delta); +} + +defaultproperties +{ + FireAimedAnim="Fire_Iron" + RecoilRate=0.070000 + maxVerticalRecoilAngle=300 + maxHorizontalRecoilAngle=50 + ShellEjectClass=Class'ROEffects.KFShellEject9mm' + ShellEjectBoneName="Shell_eject" + bRandomPitchFireSound=False + DamageMin=35 + DamageMax=35 + Momentum=10000.000000 + bPawnRapidFireAnim=True + bWaitForRelease=True + bAttachSmokeEmitter=True + TransientSoundVolume=1.800000 + FireAnimRate=1.500000 + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.175000 + AmmoClass=Class'NicePack.NiceSingleAmmo' + ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=3.000000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=0.350000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' + aimerror=30.000000 +} diff --git a/sources/Weapons/BaseWeaponClasses/Pistols/NiceSinglePickup.uc b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSinglePickup.uc new file mode 100644 index 0000000..bb1c4d1 --- /dev/null +++ b/sources/Weapons/BaseWeaponClasses/Pistols/NiceSinglePickup.uc @@ -0,0 +1,83 @@ +class NiceSinglePickup extends NiceWeaponPickup; +function Inventory SpawnCopy(Pawn other){ + local Inventory CurInv; + local NiceWeapon PistolInInventory; + for(CurInv = other.Inventory;CurInv != none;CurInv = CurInv.Inventory){ + PistolInInventory = NiceWeapon(CurInv); + if(PistolInInventory != none && PistolInInventory.class == default.InventoryType){ + // Make dualies to cost twice of lowest value in case of PERKED+UNPERKED pistols + SellValue = 2 * min(SellValue, PistolInInventory.SellValue); + AmmoAmount[0] += PistolInInventory.AmmoAmount(0); + class'NicePlainData'.static.SetInt(weaponData, "leftMag", MagAmmoRemaining); + class'NicePlainData'.static.SetInt(weaponData, "rightMag", PistolInInventory.MagAmmoRemaining); + // destroy the inventory to force parent SpawnCopy() to make a new instance of class + // we specified below + if(Inventory != none) + Inventory.Destroy(); + // spawn dual guns instead of another instance of single + if(class(default.InventoryType) != none) + InventoryType = class(default.InventoryType).default.DualClass; + if(CurInv != none){ + CurInv.Destroyed(); + CurInv.Destroy(); + } + return super(KFWeaponPickup).SpawnCopy(other); + } + } + InventoryType = default.InventoryType; + return super(KFWeaponPickup).SpawnCopy(other); +} +function bool CheckCanCarry(KFHumanPawn Hm){ + local Inventory CurInv; + local class dualClass; + local float AddWeight; + AddWeight = class(default.InventoryType).default.Weight; + if(class(default.InventoryType) != none) + dualClass = class(default.InventoryType).default.dualClass; + for(CurInv = Hm.Inventory; CurInv != none; CurInv = CurInv.Inventory){ + if(CurInv.class == dualClass) { + // Already have duals, can't carry a single + if(LastCantCarryTime < Level.TimeSeconds && PlayerController(Hm.Controller) != none){ + LastCantCarryTime = Level.TimeSeconds + 0.5; + PlayerController(Hm.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2); + } + return false; + } + else if(CurInv.class == default.InventoryType && dualClass != none){ + AddWeight = dualClass.default.Weight - AddWeight; + break; + } + } + if(!Hm.CanCarry(AddWeight)){ + if(LastCantCarryTime < Level.TimeSeconds && PlayerController(Hm.Controller) != none){ + LastCantCarryTime = Level.TimeSeconds + 0.5; + PlayerController(Hm.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2); + } + return false; + } + return true; +} + +defaultproperties +{ + Weight=0.000000 + cost=150 + AmmoCost=10 + BuyClipSize=30 + PowerValue=20 + SpeedValue=50 + RangeValue=35 + Description="A 9mm handgun." + ItemName="!!!" + ItemShortName="!!!" + AmmoItemName="9mm Rounds" + AmmoMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' + CorrespondingPerkIndex=2 + EquipmentCategoryID=1 + InventoryType=Class'NicePack.NiceSingle' + PickupMessage="You got the 9mm handgun" + PickupSound=Sound'KF_9MMSnd.9mm_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.pistol.9mm_Pickup' + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Grenades/NiceDamTypeNadeNail.uc b/sources/Weapons/Grenades/NiceDamTypeNadeNail.uc new file mode 100644 index 0000000..40a58b0 --- /dev/null +++ b/sources/Weapons/Grenades/NiceDamTypeNadeNail.uc @@ -0,0 +1,5 @@ +class NiceDamTypeNadeNail extends NiceDamTypeNailGun + abstract; +defaultproperties +{ stunMultiplier=10.000000 +} diff --git a/sources/Weapons/Grenades/NiceDamTypeSmallNail.uc b/sources/Weapons/Grenades/NiceDamTypeSmallNail.uc new file mode 100644 index 0000000..b7d48ac --- /dev/null +++ b/sources/Weapons/Grenades/NiceDamTypeSmallNail.uc @@ -0,0 +1,5 @@ +class NiceDamTypeSmallNail extends NiceDamTypeNailGun + abstract; +defaultproperties +{ headSizeModifier=2.000000 HeadShotDamageMult=1.000000 +} diff --git a/sources/Weapons/Grenades/NiceDelayedNade.uc b/sources/Weapons/Grenades/NiceDelayedNade.uc new file mode 100644 index 0000000..29fdf6c --- /dev/null +++ b/sources/Weapons/Grenades/NiceDelayedNade.uc @@ -0,0 +1,61 @@ +class NiceDelayedNade extends NiceNailNade; +var float EarlyExplodeTimer; +simulated function Tick(float DeltaTime){ + if(EarlyExplodeTimer >= 0 && Physics == PHYS_None) + EarlyExplodeTimer -= DeltaTime; + Super.Tick(DeltaTime); + if(!bHasExploded && !bDisintegrated && EarlyExplodeTimer < 0) + Explode(Location, vect(0,0,1)); + if(LifeSpan < 0.1){ + ReleaseNails(true); + Disintegrate(Location, vect(0,0,1)); + } +} +simulated function bool TooClose(){ + local Vector Diff; + local float distance; + if(Instigator == none) + return false; + Diff = Location - Instigator.Location; + distance = Sqrt(Diff Dot Diff); + return (distance < DamageRadius); +} +// Overloaded to implement nade skills +simulated function Explode(vector HitLocation, vector HitNormal){ + local PlayerController LocalPlayer; + // Variables for skill-detection + local NiceHumanPawn nicePawn; + local class niceVet; + // Do we need to blow up? + if(!TooClose()){ + bHasExploded = true; + nicePawn = NiceHumanPawn(Instigator); + if(nicePawn != none) + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.PlayerReplicationInfo); + BlowUp(HitLocation); + + // null reference fix + if(ExplodeSounds.length > 0) + PlaySound(ExplodeSounds[rand(ExplodeSounds.length)],,2.0); + + // Real shrapnel + ReleaseNails(); + if(EffectIsRelevant(Location,false)){ + Spawn(Class'KFmod.KFNadeExplosion',,, HitLocation, rotator(vect(0,0,1))); + Spawn(ExplosionDecal, self,, HitLocation, rotator(-HitNormal)); + } + + // Shake nearby players screens + LocalPlayer = Level.GetLocalPlayerController(); + if((LocalPlayer != none) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5))) + LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); + Destroy(); + } +} + +defaultproperties +{ + EarlyExplodeTimer=2.000000 + ExplodeTimer=5.000000 + LifeSpan=5.100000 +} diff --git a/sources/Weapons/Grenades/NiceNailNade.uc b/sources/Weapons/Grenades/NiceNailNade.uc new file mode 100644 index 0000000..d51e403 --- /dev/null +++ b/sources/Weapons/Grenades/NiceNailNade.uc @@ -0,0 +1,72 @@ +class NiceNailNade extends NiceNade; +var int numberOfShards; +var NiceFire.ShotType shotParams; +var NiceFire.FireModeContext fireContext; +simulated function ReleaseNails(optional bool bServerOnly){ + local byte i; + local NicePack niceMut; + fireContext.continiousBonus = 1.0; + fireContext.burstLength = 1; + fireContext.instigator = NiceHumanPawn(instigator); + shotParams.bShouldBounce = true; + shotParams.damage = 52; + shotParams.projSpeed = 3500.0; + shotParams.momentum = 50000; + shotParams.shotDamageType = class'NicePack.NiceDamTypeNailGun'; + shotParams.bulletClass = class'NicePack.NiceNail'; + shotParams.bCausePain = true; + if(fireContext.instigator != none) + niceMut = class'NicePack'.static.Myself(fireContext.Instigator.Level); + if(bServerOnly){ + if(niceMut == none) + return; + for(i = 0;i < niceMut.playersList.Length;i ++) + niceMut.playersList[i].ClientNailsExplosion(numberOfShards, location, shotParams, fireContext, + niceMut.playersList[i] != fireContext.Instigator.Controller); + } + else if(Role < Role_AUTHORITY) + for(i = 0;i < numberOfShards;i ++) + class'NiceProjectileSpawner'.static.MakeProjectile(location, RotRand(true), shotParams, fireContext); +} +// Overloaded to implement nade skills +simulated function Explode(vector HitLocation, vector HitNormal){ + local PlayerController LocalPlayer; + // Variables for skill-detection + local NiceHumanPawn nicePawn; + local class niceVet; + nicePawn = NiceHumanPawn(Instigator); + if(nicePawn != none) + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.PlayerReplicationInfo); + bHasExploded = true; + BlowUp(HitLocation); + // null reference fix + if(ExplodeSounds.length > 0) + PlaySound(ExplodeSounds[rand(ExplodeSounds.length)],,2.0); + // Real shrapnel + ReleaseNails(); + if(EffectIsRelevant(Location,false)){ + Spawn(Class'KFmod.KFNadeExplosion',,, HitLocation, rotator(vect(0,0,1))); + Spawn(ExplosionDecal, self,, HitLocation, rotator(-HitNormal)); + } + // Shake nearby players screens + LocalPlayer = Level.GetLocalPlayerController(); + if((LocalPlayer != none) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5))) + LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); + Destroy(); +} +function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class damageType, optional int HitIndex){ + if(Monster(instigatedBy) != none || instigatedBy == Instigator){ + if(DamageType == class'SirenScreamDamage'){ + ReleaseNails(true); + Disintegrate(HitLocation, vect(0,0,1)); + } + else + Explode(HitLocation, vect(0,0,1)); + } +} + +defaultproperties +{ + numberOfShards=50 + Damage=50.000000 +} diff --git a/sources/Weapons/NiceBullet.uc b/sources/Weapons/NiceBullet.uc index 40e3d96..6a60342 100644 --- a/sources/Weapons/NiceBullet.uc +++ b/sources/Weapons/NiceBullet.uc @@ -1,165 +1,145 @@ -//============================================================================== +//====================================================================================================================== // NicePack / NiceBullet -//============================================================================== -// Bullet class that's supposed to take care of all -// damage-dealing projectile needs. +//====================================================================================================================== +// Bullet class that's supposed to take care of all damage-dealing projectile needs. // Functionality: // - Simulation of both linear and piece-wise motion -// - Ability to 'stick' to zeds and walls -// - Ability to explode upon reaching various conditions -// - Ability to detect collisions from 'NiceCollisionManager' -//============================================================================== -// Class hierarchy: Object > Actor > NiceBullet -//============================================================================== +// - Collision detection that can be handled through the adapter class +//====================================================================================================================== // 'Nice pack' source // Do whatever the fuck you want with it // Author: dkanus // E-mail: dkanus@gmail.com -//============================================================================== -class NiceBullet extends Actor - dependson(NiceFire); - - -//============================================================================== -//============================================================================== -// > State of this bullet - -//============================================================================== -// >> Implementation-level state details +//====================================================================================================================== +class NiceBullet extends Actor; // Link to interaction with the server -var NiceReplicationInfo niceRI; +var NiceReplicationInfo niceRI; // Controller of our instigator -var NicePlayerController nicePlayer; +var NicePlayerController nicePlayer; // Controller of local player -var NicePlayerController localPlayer; -// Indicates that all necessary values were recorded and -// we can process this bullet normally -var bool bInitFinished; -// Disables all the interaction of this bullet with the world -// and removes it / marks it for removal -var bool bBulletDead; -// Ghost bullets produce visual effects, get stuck, but never deal damage; -// they're used for emulating shooting effects of other players -var bool bGhost; +var NicePlayerController localPlayer; +// Link to our mutator +var NicePack niceMutator; + +//====================================================================================================================== +// Battle bullet characteristic +var float charOrigDamage; +var float charDamage; +var float decapMod; +var float incapMod; +var int charPenetrationCount; +var float charMomentumTransfer; +var class charDamageType; +var class charExplosionDamageType; +var float charExplosionDamage; +var float charExplosionRadius; +var float charExplosionExponent; +var float charExplosionMomentum; +var bool charIsDud; +var float charFuseTime; +var bool charExplodeOnFuse; +var bool charExplodeOnPawnHit; +var bool charExplodeOnWallHit; +var bool charAffectedByScream; +var float charMinExplosionDist; +var bool charWasHipFired; +var bool charCausePain; +var bool charIsSticky; +var float charContiniousBonus; +var bool bAlreadyHitZed; +var NiceWeapon sourceWeapon; +var NiceMonster lockonZed; +var float lockonTime; +var float bounceHeadMod; +var int insideBouncesLeft; +var bool bGrazing; + +//====================================================================================================================== +// Sticky projectile-related variables +var bool bStuck, bUseBone, bStuckToHead; +var name stuckBone; +var int stuckID; +// Data about explosive characteristics that must be transfered after projectile sticks on something +struct ExplosionData{ + var Pawn instigator; + var NiceWeapon sourceWeapon; + var class bulletClass; + var class explosionDamageType; + var float explosionDamage; + var float explosionRadius; + var float explosionExponent; + var float explosionMomentum; + var float fuseTime; + var bool explodeOnFuse; + var bool affectedByScream; + var bool stuckToHead; +}; + +//====================================================================================================================== +// Temporary variables that either need to be moved into config or generalized later // How often trajectory is allowed to change direction? -var float trajUpdFreq; +var const float trajUpdFreq; +// How much tracing cycles to endure before declaring an infinite cycle? +var const int maxTraceCycles; +var bool bCanAngleDamage; -//============================================================================== -// >> Gameplay-related state details -// Info and state, inherited from weapon that fired us -var NiceFire.NWFireType fireType; -var NiceFire.NWCFireState fireState; - -// Damage our bullet deals can decrease as we -// penetrate enemies or bounce off the walls; -// this variable reflects that by recording current damage we can deal -var float damage; -// For some of the skills we need to distinguish the first bullet target from -// everything else -var bool bAlreadyHitZed; -// 'true' means that this bullet cannot explode -var bool bIsDud; -// Count-down until our projectile explodes -var float fuseCountDown; -// Head-shot detection multiplier, introduced to allow projectiles that -// have bounced off the walls to hit more reliably -var float bounceHeadMod; -// Used for a support zed-time skill 'Bore', denotes how many more times -// our bullet can 'bounce' between it's head and body -var int insideBouncesLeft; -// Can bullet still perform angle damage? -var bool bCanAngleDamage; - - - -//============================================================================== -// >> Details about bullet's 'stuck' state -// Are we stuck in something? -var bool bStuck; -// (For sticking in zeds only) Data about where exactly we got stuck -var bool bStuckToHead; -var name stuckBone; - -//============================================================================== -//============================================================================== -// > Collision management -// Sole role of these variables is to remember actors -// we've already hit to avoid them in future +//====================================================================================================================== +// State variables +// Indicates that all necessary values were recorded and we can process this bullet normally +var bool bInitFinished; +var bool bInitFinishDetected; +// Disables all the interaction of this bullet with the world and removes it / marks it for removal +var bool bBulletDead; +var bool bGhost; +//====================================================================================================================== +// Collision management // Describes an actor that we don't wish to collide with struct IgnoreEntry{ var Actor ignored; - // Set to true when 3rd party already disabled this - // actor before we had the chance; - // used to avoid re-enabling it later + // Set to true when 3rd party already disabled this actor before we had the chance + // Used to avoid re-enabling it later var bool bExtDisabled; }; var array ignoredActors; // 'true' if we're enforcing our collision rules on actors to ignore them var bool bIgnoreIsActive; - - -//============================================================================== -//============================================================================== -// > Movement -// This class of bullets supports both linear -// and piece-wise movement, which allows to emulate bullets -// bouncing off the walls and falling down because of gravity; -// but system can be extended to reflect any kinds of changes to the trajectory -// by altering it's direction at certain points in time - -//============================================================================== -// >> Movement 'settings' -// If 'true' disables any modifications to the bullet's movement, -// making it travel in a simple, linear path, -// but reducing amount of performed computation +//====================================================================================================================== +// Movement +// If 'true' disables any modifications to the bullet's movement, making it travel in a simple, linear path var bool bDisableComplexMovement; - -//============================================================================== -// >> Movement state // Linear motion -var float speed; -var Vector direction; -// Acceleration that affects this bullet -// Different naming scheme is due to 'acceleration' being already taken and -// not suiting our needs, since we wanted to handle movement on our own -var Vector bulletAccel; -var float distancePassed; - -//============================================================================== -// >> Path building -// We will be building a piecewise linear path for projectiles, -// where each linear segment should be passable by projectile -// in time 'NBulletState.trajUpdFreq'. -// By changing trajectory in only preset point allow client to emulate -// non-linear paths, while keeping them more or less -// independent from the frame rate. +var float movementSpeed; +var Vector movementDirection; +// Added vector acceleration +var Vector movementAcceleration; +var bool bShouldBounce; +// Amount of time our bullet should fall down after hitting a wall +var float movementFallTime; +//====================================================================================================================== +// Path building +// We will be building a piecewise linear path for projectiles, where each linear segment should be passable by +// projectile in time 'trajUpdFreq'. +// By changing trajectory in only preset point allow client to emulate non-linear paths, +// while keeping them more or less independent from the frame rate. // Start and End point of the current linear segment var Vector pathSegmentS, pathSegmentE; // Point in the segment, at which we've stopped after last movement var Vector shiftPoint; -// The part of current segment that we've already covered, -// changes from 0.0 to 1.0; -// - values above 1.0 indicate that segment was finished and -// we need to build another one; -// - values below 0.0 indicate that no segment has yet been built. +// The part of current segment that we've already covered, changes from 0.0 to 1.0. +// Values above 1.0 indicate that segment was finished and we need to build another one. +// Values below 0.0 indicate that no segment has yet been built. var float finishedSegmentPart; - - -//============================================================================== -//============================================================================== -// > Visual effects -// This class allows to set 3 different type of effect for 3 distinct cases: -// 1. When bullet exploded -// 2. When bullet hit actor without explosion -// 3. When bullet was disintegrated (usually by siren's scream) - -//============================================================================== -// >> Impact effects -// Describes effect that projectile can produce on hit +//====================================================================================================================== +// Visual effects +var class trailClass; +var class trailXClass; +var Emitter bulletTrail; +var xEmitter bulletXTrail; +// Describes effect that projectile should produce on hit struct ImpactEffect{ // Is this effect too important to cut it due to effect limit? var bool bImportanEffect; @@ -169,38 +149,18 @@ struct ImpactEffect{ var class decalClass; // Emitter to spawn; null to skip var class emitterClass; - // How much back (against direction of the shot) should we spawn emitter? - // Can be used to avoid clipping with walls. + // How much back (against direction of the shot) should we spawn emitter? Can be used to avoid clipping with walls var float emitterShiftWall; // Shift for wall-hits var float emitterShiftPawn; // Shift for pawn-hits // Impact noise parameters var Sound noise; - // Reference to 'Sound' to allow dynamic resource allocation - var string noiseRef; + var string noiseRef; // Reference to 'Sound' to allow dynamic resource allocation var float noiseVolume; }; - -var ImpactEffect regularImpact; // Effect on imact, no eplosion -var ImpactEffect explosionImpact; // Effect in case of the explosion -var ImpactEffect disintegrationImpact; // Disintegration, nuff said -// Should we play 'regularImpact' (when bullet hit actor without explosion) -// effects after hitting a 'Pawn'? -// It normally produces badly looking results, -// but if set this flag to 'true' if you want it to anyway +var ImpactEffect regularImpact; +var ImpactEffect explosionImpact; +var ImpactEffect disintegrationImpact; var bool bGenRegEffectOnPawn; - -//============================================================================== -// >> Bullet trails -// Bullet supports 2 different types of trails: 'Emitter' and 'xEmitter'. -// Just define class for the one (or both) you want to use. -var class trailClass; -var class trailXClass; -var Emitter bulletTrail; -var xEmitter bulletXTrail; - -//============================================================================== -// >> Explosion view shaking -// Should we even do any shaking at all? var bool bShakeViewOnExplosion; var Vector shakeRotMag; // how far to rot view var Vector shakeRotRate; // how fast to rot view @@ -210,144 +170,155 @@ var Vector shakeOffsetRate; // how fast to offset view vertically var float shakeOffsetTime; // how much time to offset view var float shakeRadiusMult; +//====================================================================================================================== +// References +// References to allow pre-loading of some resource objects, declared in parent classes +var string meshRef; +var string staticMeshRef; +var string ambientSoundRef; -//============================================================================== -//============================================================================== -// > Functions - -// Initialises bullet before it's use -function InitBullet(){ - // Easy references to 'NiceReplicationInfo' - // + local and instigator controllers - localPlayer = NicePlayerController(Level.GetLocalPlayerController()); - instigator = fireState.base.instigator; - nicePlayer = fireState.base.instigatorCtrl; - if(nicePlayer != none) - niceRI = nicePlayer.niceRI; - // Bullet should only replicate damage on instigator's side - bGhost = (localPlayer != nicePlayer); - // We haven't yet do anything, - // so our damage is maxed out and we can do angle damage, - // but still dealing with regular head sizes - bCanAngleDamage = true; - damage = fireType.bullet.damage; - bounceHeadMod = 1.0; - // No countdown could yet take place - fuseCountDown = fireType.explosion.fuseTime; - // Setup movement - speed = fireType.movement.speed; - direction = Vector(rotation); - //bDisableComplexMovement = NICETODO: update as necessary - bDisableComplexMovement = true; - ResetPathBuilding(); - // Setup visual effects - UpdateTrails(); - // Allow tick to handle the bullet - bInitFinished = true; +//====================================================================================================================== +// Functions +static function PreloadAssets(){ + if(default.ambientSound == none && default.ambientSoundRef != "") + default.ambientSound = sound(DynamicLoadObject(default.ambientSoundRef, class'Sound', true)); + if(default.staticMesh == none && default.staticMeshRef != "") + UpdateDefaultStaticMesh(StaticMesh(DynamicLoadObject(default.staticMeshRef, class'StaticMesh', true))); + if(default.mesh == none && default.meshRef != "") + UpdateDefaultMesh(Mesh(DynamicLoadObject(default.meshRef, class'Mesh', true))); + if(default.regularImpact.noise == none && default.regularImpact.noiseRef != "") + default.regularImpact.noise = + sound(DynamicLoadObject(default.regularImpact.noiseRef, class'Sound', true)); + if(default.explosionImpact.noise == none && default.explosionImpact.noiseRef != "") + default.explosionImpact.noise = + sound(DynamicLoadObject(default.explosionImpact.noiseRef, class'Sound', true)); + if(default.disintegrationImpact.noise == none && default.disintegrationImpact.noiseRef != "") + default.disintegrationImpact.noise = + sound(DynamicLoadObject(default.disintegrationImpact.noiseRef, class'Sound', true)); +} +static function bool UnloadAssets(){ + default.AmbientSound = none; + UpdateDefaultStaticMesh(none); + UpdateDefaultMesh(none); + default.regularImpact.noise = none; + default.explosionImpact.noise = none; + default.disintegrationImpact.noise = none; + return true; +} +function PostBeginPlay(){ + super.PostBeginPlay(); + bounceHeadMod = 1.0; } - function UpdateTrails(){ local Actor trailBase; - if(Level.NetMode == NM_DedicatedServer) return; - - // Spawn necessary trails first + // Do nothing on dedicated server + if(Level.NetMode == NM_DedicatedServer) + return; + // Spawn necessary trails first if(trailClass != none && bulletTrail == none) - bulletTrail = Spawn(trailClass, self); + bulletTrail = Spawn(trailClass, self); if(trailXClass != none && bulletXTrail == none) - bulletXTrail = Spawn(trailXClass, self); - - // Handle positioning differently for stuck and non-stuck projectiles + bulletXTrail = Spawn(trailXClass, self); + // Handle positioning differently for stuck and regular projectiles if(bStuck && base != none){ - if(stuckBone != ''){ - if(bulletTrail != none){ - bulletTrail.SetBase(base); - base.AttachToBone(bulletTrail, stuckBone); - bulletTrail.SetRelativeLocation(relativeLocation); - bulletTrail.SetRelativeRotation(relativeRotation); - } - if(bulletXTrail != none){ - bulletXTrail.SetBase(base); - base.AttachToBone(bulletTrail, stuckBone); - bulletXTrail.SetRelativeLocation(relativeLocation); - bulletXTrail.SetRelativeRotation(relativeRotation); - } - } + if(bUseBone){ + if(bulletTrail != none){ + bulletTrail.SetBase(base); + base.AttachToBone(bulletTrail, stuckBone); + bulletTrail.SetRelativeLocation(relativeLocation); + bulletTrail.SetRelativeRotation(relativeRotation); + } + if(bulletXTrail != none){ + bulletXTrail.SetBase(base); + base.AttachToBone(bulletTrail, stuckBone); + bulletXTrail.SetRelativeLocation(relativeLocation); + bulletXTrail.SetRelativeRotation(relativeRotation); + } + } } else - trailBase = self; - - // Update lifetime and base (latter is for non-bone attachments only) + trailBase = self; + // Update lifetime and base (latter is for non-bone attachments only) if(bulletTrail != none){ - if(trailBase != none) - bulletTrail.SetBase(trailBase); - bulletTrail.lifespan = lifeSpan; + if(trailBase != none) + bulletTrail.SetBase(trailBase); + bulletTrail.lifespan = lifeSpan; } if(bulletXTrail != none){ - if(trailBase != none) - bulletXTrail.SetBase(trailBase); - bulletXTrail.lifespan = lifeSpan; + if(trailBase != none) + bulletXTrail.SetBase(trailBase); + bulletXTrail.lifespan = lifeSpan; } } - function ResetPathBuilding(){ finishedSegmentPart = -1.0; shiftPoint = location; } - -simulated function Tick(float delta){ - local bool bBaseIsDead; - local bool bFuseJustRunOut; - super.Tick(delta); - - // Fuse didn't run out before this tick, but should after - if(fireType.explosion.bOnFuse){ - bFuseJustRunOut = (fuseCountDown > 0) && (fuseCountDown < delta); - fuseCountDown -= delta; - } - // Explode when fuse runs out - if(bFuseJustRunOut) - DoExplode(location, direction); - - // Explode stuck bullet if the target it was attached to died - if(bInitFinished && bStuck){ - bBaseIsDead = (base == none); - if(NiceMonster(base) != none) - bBaseIsDead = NiceMonster(base).health <= 0; - /*if(bBaseIsDead) NICETODO: finish it - nicePlayer.ExplodeStuckBullet(stuckID);*/ - } - - // Progress movemnt - if(bInitFinished && !bBulletDead && !bStuck) - DoProcessMovement(delta); +// Resets default values for this bullet. +// Must be called before each new use of a bullet. +function Renew(){ + bInitFinished = false; + bBulletDead = false; + bCanAngleDamage = true; + SoundVolume = default.SoundVolume; + decapMod = 1.0f; + incapMod = 1.0f; + ResetIgnoreList(); + ResetPathBuilding(); +} +simulated function Tick(float delta){ + super.Tick(delta); + if(localPlayer == none) + localPlayer = NicePlayerController(Level.GetLocalPlayerController()); + if(charFuseTime > 0){ + charFuseTime -= delta; + if(charFuseTime < 0){ + if(charExplodeOnFuse && !charIsDud){ + GenerateImpactEffects(explosionImpact, location, movementDirection); + if(bStuck) + class'NiceBulletAdapter'.static.Explode(self, niceRI, location, base); + else + class'NiceBulletAdapter'.static.Explode(self, niceRI, location); + } + if(!charExplodeOnFuse) + GenerateImpactEffects(disintegrationImpact, location, movementDirection); + KillBullet(); + } + } + if(bInitFinished && !bInitFinishDetected){ + bInitFinishDetected = true; + UpdateTrails(); + } + if(bInitFinished && !bBulletDead && !bStuck) + DoProcessMovement(delta); + if(bInitFinished && bStuck){ + if(base == none || (KFMonster(base) != none && KFMonster(base).health <= 0)) + nicePlayer.ExplodeStuckBullet(stuckID); + } } - // Extracts pawn actor from it's auxiliary collision // @param other Actor we collided with // @return Pawn we're interested in function Actor GetMainActor(Actor other){ if(other == none) - return none; + return none; // Try owner if( KFPawn(other) == none && KFMonster(other) == none && (KFPawn(other.owner) != none || KFMonster(other.owner) != none) ) - other = other.owner; + other = other.owner; // Try base if( KFPawn(other) == none && KFMonster(other) == none && (KFPawn(other.base) != none || KFMonster(other.base) != none) ) - other = other.base; + other = other.base; return other; } - -// Returns 'true' if passed actor is either world geometry, -// 'Level' itself or nothing ('none'); -// neither of these related to pawn damage dealing +// Returns 'true' if passed actor is either world geometry, 'Level' itself or nothing ('none') +// Neither of these related to pawn damage dealing function bool IsLevelActor(Actor other){ if(other == none) - return true; + return true; return (other.bWorldGeometry || other == Level); } - // Adds given actor and every colliding object connected to it to ignore list // Removes their collision in case ignore is active (see 'bIgnoreIsActive') function TotalIgnore(Actor other){ @@ -355,320 +326,279 @@ function TotalIgnore(Actor other){ local KFPawn pawnOther; local KFMonster zedOther; if(other == none) - return; - - // Try to find main actor as KFPawn + return; + // Try to find main actor as KFPawn pawnOther = KFPawn(other); if(pawnOther == none) - pawnOther = KFPawn(other.base); + pawnOther = KFPawn(other.base); if(pawnOther == none) - pawnOther = KFPawn(other.owner); - - // Try to find main actor as KFMonster + pawnOther = KFPawn(other.owner); + // Try to find main actor as KFMonster zedOther = KFMonster(other); if(zedOther == none) - zedOther = KFMonster(other.base); + zedOther = KFMonster(other.base); if(zedOther == none) - zedOther = KFMonster(other.owner); - - // Ignore everything that's associated with this actor - // and can have collision + zedOther = KFMonster(other.owner); + // Ignore everything that's associated with this actor and can have collision IgnoreActor(other); IgnoreActor(other.base); IgnoreActor(other.owner); if(pawnOther != none) - IgnoreActor(pawnOther.AuxCollisionCylinder); + IgnoreActor(pawnOther.AuxCollisionCylinder); if(zedOther != none) - IgnoreActor(zedOther.MyExtCollision); + IgnoreActor(zedOther.MyExtCollision); } - -// Adds a given actor to ignore list -// and removes it's collision in case ignore is active (see 'bIgnoreIsActive') +// Adds a given actor to ignore list and removes it's collision in case ignore is active (see 'bIgnoreIsActive') function IgnoreActor(Actor other){ local int i; local IgnoreEntry newIgnoredEntry; - - // Check if that's a non-level actor and not already on the list + // Check if that's a non-level actor and not already on the list if(IsLevelActor(other)) - return; + return; for(i = 0;i < ignoredActors.Length;i ++) - if(ignoredActors[i].ignored == other) - return; - - // Add actor to the ignore list & disable collision if needed + if(ignoredActors[i].ignored == other) + return; + // Add actor to the ignore list & disable collision if needed if(other != none){ - // Make entry - newIgnoredEntry.ignored = other; - newIgnoredEntry.bExtDisabled = !other.bCollideActors; - // Add and activate it - ignoredActors[ignoredActors.Length] = newIgnoredEntry; - if(bIgnoreIsActive) - other.SetCollision(false); + // Make entry + newIgnoredEntry.ignored = other; + newIgnoredEntry.bExtDisabled = !other.bCollideActors; + // Add and activate it + ignoredActors[ignoredActors.Length] = newIgnoredEntry; + if(bIgnoreIsActive) + other.SetCollision(false); } } - // Restores ignored state of the actors and zeroes our ignored arrays function ResetIgnoreList(){ SetIgnoreActive(false); ignoredActors.Length = 0; } - // Activates/deactivates ignore for actors on the ignore list. -// Ignore deactivation doesn't restore collision if actor -// was set to not collide prior most recent ignore activation. -// Activating ignore when it's already active does nothing; -// same with deactivation. -// Ignore deactivation is supposed to be used in the same function call -// in which activation took place before -// to avoid unwanted editing of the collision flags +// Ignore deactivation doesn't restore collision if actor was set to not collide prior most recent ignore activation. +// Activating ignore when it's already active does nothing; same with deactivation. +// Ignore deactivation is supposed to be used in the same function call in which activation took place before. function SetIgnoreActive(bool bActive){ local int i; - - // Do nothing if we're already in a correct state + // Do nothing if we're already in a correct state if(bActive == bIgnoreIsActive) - return; - - // Change ignore state & disable collision for ignored actors + return; + // Change ignore state & disable collision for ignored actors bIgnoreIsActive = bActive; for(i = 0;i < ignoredActors.Length;i ++) - if(ignoredActors[i].ignored != none){ - // Mark actors that were set to not collide before activation - if(bActive && !ignoredActors[i].ignored.bCollideActors) - ignoredActors[i].bExtDisabled = true; - // Change collision for actors that weren't externally modified - if(!ignoredActors[i].bExtDisabled) - ignoredActors[i].ignored.SetCollision(!bActive); - // After we deactivated our rules - - // forget about external modifications - if(!bActive) - ignoredActors[i].bExtDisabled = false; - } + if(ignoredActors[i].ignored != none){ + // Mark actors that were set to not collide before activation + if(bActive && !ignoredActors[i].ignored.bCollideActors) + ignoredActors[i].bExtDisabled = true; + // Change collision for actors that weren't externally modified + if(!ignoredActors[i].bExtDisabled) + ignoredActors[i].ignored.SetCollision(!bActive); + // After we deactivated our rules - forget about external modifications + if(!bActive) + ignoredActors[i].bExtDisabled = false; + } } - -function float CheckHeadshot( KFMonster kfZed, - Vector hitLocation, - Vector hitDirection){ +function SetHumanPawnCollision(bool bEnable){ + local int i; + if(niceMutator == none) + niceMutator = class'NicePack'.static.Myself(Level); + for(i = 0;i < niceMutator.recordedHumanPawns.Length;i ++) + if(niceMutator.recordedHumanPawns[i] != none) + niceMutator.recordedHumanPawns[i].bBlockHitPointTraces = bEnable; +} +function float CheckHeadshot(KFMonster kfZed, Vector hitLocation, Vector hitDirection){ local float hsMod; + local float precision; + local bool bIsShotgunBullet; local NiceMonster niceZed; local KFPlayerReplicationInfo KFPRI; local class niceVet; - // If one of these variables is 'none' - - // something went terribly wrong and we might as well bail niceZed = NiceMonster(kfZed); - if(niceZed == none || nicePlayer == none) return 0.0; - KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo); - if(KFPRI == none) return 0.0; - niceVet = class(KFPRI.ClientVeteranSkill); - if(niceVet == none) return 0.0; - hitDirection = Normal(hitDirection); - // Compute proper head-shot check multiplier - hsMod = bounceHeadMod; - hsMod *= fireType.bullet.shotDamageType.default.headSizeModifier; - hsMod *= niceVet.static. - GetHeadshotCheckMultiplier(KFPRI, fireType.bullet.shotDamageType); - return niceZed.IsHeadshotClient(hitLocation, hitDirection, - niceZed.clientHeadshotScale * hsMod); + bIsShotgunBullet = ClassIsChildOf(charDamageType, class'NiceDamageTypeVetEnforcer'); + if(niceZed != none){ + hsMod = bounceHeadMod; // NICETODO: Add bounce and perk and damage type head-shot zones bonuses + hsMod *= charDamageType.default.headSizeModifier; + hsMod *= bounceHeadMod; + if(nicePlayer != none) + KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo); + if(KFPRI != none) + niceVet = class(KFPRI.ClientVeteranSkill); + if(niceVet != none) + hsMod *= niceVet.static.GetHeadshotCheckMultiplier(KFPRI, charDamageType); + precision = niceZed.IsHeadshotClient(hitLocation, hitDirection, niceZed.clientHeadshotScale * hsMod); + if(precision <= 0.0 && bIsShotgunBullet && nicePlayer != none && class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, class'NiceSkillSupportGraze')){ + bGrazing = true; + hsMod *= class'NiceSkillSupportGraze'.default.hsBonusZoneMult; + precision = niceZed.IsHeadshotClient(hitLocation, hitDirection, niceZed.clientHeadshotScale * hsMod); + } + return precision; + } + else{ + if(kfZed.IsHeadShot(hitLocation, hitDirection, 1.0)) + return 1.0; + else + return 0.0; + } } - -function bool CheckSirenBallCollision(Vector lineStart, Vector lineEnd){ - if(localPlayer == none || localPlayer.localCollisionManager == none) - return false; - return localPlayer.localCollisionManager. - IsCollidingWithAnything(lineStart, lineEnd); -} - // Makes bullet trace a directed line segment given by start and end points. -// All traced actors and geometry are then properly -// affected by either 'HandleHitActor' or 'HandleHitWall'. +// All traced actors and geometry are then properly affected by corresponding 'HandleHitPawn', 'HandleHitZed' and +// 'HandleHitWall' functions. // Might have to do several traces in case it either hits a (several) target(s) function DoTraceLine(Vector lineStart, Vector lineEnd){ - // Amount of tracing iterations we had to do - local int iterationCount; - // Direction and length of traced line - local Vector lineDirection; - // Auxiliary variables for retrieving results of tracing - local Vector hitLocation, hitNormal; - local Actor tracedActor; - if(localPlayer == none || instigator == none) return; - + local float headshotLevel; + // Amount of tracing iterations we had to do + local int iterationCount; + // Direction and length of traced line + local Vector lineDirection; + // Auxiliary variables for retrieving results of tracing + local Vector hitLocation, hitNormal; + local Actor tracedActor; + local array hitPoints; + local KFMonster tracedZed; + local KFPawn tracedPawn; lineDirection = (lineEnd - lineStart); lineDirection = (lineDirection) / VSize(lineDirection); - // Do not trace for disabled bullets and prevent infinite loops - while(!bBulletDead && iterationCount < 128){ - iterationCount ++; - // Find next collision. - // > Trace next object. - // But only if: - // 1. It isn't a ghost and can actually deal damage; - // 2. It's a ghost projectile, - // but we still haven't gone over our traces per tick limit. - if( !bGhost - || localPlayer.tracesThisTick <= localPlayer.tracesPerTickLimit){ - tracedActor = instigator.Trace( hitLocation, hitNormal, - lineEnd, lineStart, true); - localPlayer.tracesThisTick ++; - } - else - tracedActor = none; - // > Check and handle collision with siren's scream ball - if( fireType.bullet.bAffectedByScream && !bIsDud - && CheckSirenBallCollision(lineStart, lineEnd)) - HandleScream(lineStart, lineDirection); + // Do not trace for disabled bullets and prevent infinite loops + while(!bBulletDead && iterationCount < maxTraceCycles){ + iterationCount ++; + // Trace next object + if(!bGhost || localPlayer == none || localPlayer.tracesThisTick <= localPlayer.tracesPerTickLimit){ + if(Instigator != none) + tracedActor = Instigator.Trace(hitLocation, hitNormal, lineEnd, lineStart, true); + else + tracedActor = none; + localPlayer.tracesThisTick ++; + } + else + tracedActor = none; + if(charAffectedByScream && !charIsDud && localPlayer != none && localPlayer.localCollisionManager != none && localPlayer.localCollisionManager.IsCollidingWithAnything(lineStart, lineEnd)) + HandleScream(lineStart, lineDirection); + if(tracedActor != none && IsLevelActor(tracedActor)){ + HandleHitWall(tracedActor, hitLocation, hitNormal); + break; + } + else{ + TotalIgnore(tracedActor); + tracedActor = GetMainActor(tracedActor); + } - // If we hit level actor (wall) - bail - if(tracedActor != none && IsLevelActor(tracedActor)){ - HandleHitWall(tracedActor, hitLocation, hitNormal); - break; - } - else{ - TotalIgnore(tracedActor); - tracedActor = GetMainActor(tracedActor); - } + // If tracing between current trace points haven't found anything and tracing step is less than segment's length + // -- shift tracing bounds + if(tracedActor == none) + return; - // If tracing between current trace points haven't found anything and - // tracing step is less than segment's length -- shift tracing bounds - if(tracedActor == none) - return; - HandleHitActor(tracedActor, hitLocation, lineDirection, hitNormal); + // First, try to handle pawn like a zed; if fails, - try to handle it like 'KFPawn' + tracedZed = KFMonster(tracedActor); + tracedPawn = KFPawn(tracedActor); + if(tracedPawn != none && NiceHumanPawn(instigator) != none && + (NiceHumanPawn(instigator).ffScale <= 0 && NiceMedicProjectile(self) == none) ) + continue; + if(tracedZed != none){ + if(tracedZed.Health > 0){ + headshotLevel = CheckHeadshot(tracedZed, hitLocation, lineDirection); + HandleHitZed(tracedZed, hitLocation, lineDirection, headshotLevel); + } + } + else if(tracedPawn != none && tracedPawn.Health > 0){ + if(tracedPawn.Health > 0) + HandleHitPawn(tracedPawn, hitLocation, lineDirection, hitPoints); + } + else + HandleHitWall(tracedActor, hitLocation, hitNormal); } } - -// Handles bullet collision with an actor, -// it calls 'HandleHitPawn', 'HandleHitZed' or 'HandleHitWall', -// depending on the type of the actor. -// This function takes two direction parameters: -// - 'hitDirection' is bullet's direction before the impact -// - 'hitNormal' normal of the surface we've hit, -// used to handle effects upon wall hits -function HandleHitActor(Actor hitActor, - Vector hitLocation, - Vector hitDirection, - Vector hitNormal){ - local float headshotLevel; - local KFPawn hitPawn; - local NiceMonster hitZed; - hitZed = NiceMonster(hitActor); - hitPawn = KFPawn(hitActor); - if( hitPawn != none && NiceHumanPawn(instigator).ffScale <= 0 - /* && NiceMedicProjectile(self) == none */) return;//MEANTODO - if(hitZed != none){ - if(hitZed.health > 0){ - headshotLevel = CheckHeadshot(hitZed, hitLocation, hitDirection); - HandleHitZed(hitZed, hitLocation, hitDirection, headshotLevel); - } - } - else if(hitPawn != none && hitPawn.health > 0){ - if(hitPawn.health > 0) - HandleHitPawn(hitPawn, hitLocation, hitDirection); - } - else - HandleHitWall(hitActor, hitLocation, hitNormal); -} - // Replaces current path segment with the next one. // Doesn't check whether or not we've finished with the current segment. function BuildNextPathSegment(){ - // Only set start point to our location when - // we build path segment for the first time. - // After that we can't even assume that bullet - // is exactly in the 'pathSegmentE' point. + // Only set start point to our location when we build path segment for the first time + // After that we can't even assume that bullet is exactly in the 'pathSegmentE' point if(finishedSegmentPart < 0.0) - pathSegmentS = Location; + pathSegmentS = Location; else - pathSegmentS = pathSegmentE; - direction += (bulletAccel * trajUpdFreq) / speed; - pathSegmentE = pathSegmentS + direction * speed * trajUpdFreq; + pathSegmentS = pathSegmentE; + movementDirection += (movementAcceleration * trajUpdFreq) / movementSpeed; + pathSegmentE = pathSegmentS + movementDirection * movementSpeed * trajUpdFreq; finishedSegmentPart = 0.0; shiftPoint = pathSegmentS; } - // Updates 'shiftPoint' to the next bullet position in current segment. // Does nothing if current segment is finished or no segment was built at all. // @param delta Amount of time bullet has to move through the segment. // @return Amount of time left for bullet to move after this segment function float ShiftInSegment(float delta){ - // Time that bullet still has available to move after this segment + // Time that bullet still has available to move after this segment local float remainingTime; - // Part of segment we can pass in a given time + // Part of segment we can pass in a given time local float segmentPartWeCanPass; - // Exit if there's no segment in progress + // Exit if there's no segment in progress if(finishedSegmentPart < 0.0 || finishedSegmentPart > 1.0) - return delta; - - // [speed * delta] / [speed * trajUpdFreq] = [delta / trajUpdFreq] + return delta; + // [movementSpeed * delta] / [movementSpeed * trajUpdFreq] = [delta / trajUpdFreq] segmentPartWeCanPass = delta / trajUpdFreq; - // If we can move through the rest of the segment - - // move to end point and mark it finished + // If we can move through the rest of the segment - move to end point and mark it finished if(segmentPartWeCanPass >= (1.0 - finishedSegmentPart)){ - remainingTime = delta - (1.0 - finishedSegmentPart) * trajUpdFreq; - finishedSegmentPart = 1.1; - shiftPoint = pathSegmentE; + remainingTime = delta - (1.0 - finishedSegmentPart) * trajUpdFreq; + finishedSegmentPart = 1.1; + shiftPoint = pathSegmentE; } - // Otherwise compute new 'shiftPoint' normally + // Otherwise compute new 'shiftPoint' normally else{ - remainingTime = 0.0; - finishedSegmentPart += (delta / trajUpdFreq); - shiftPoint = pathSegmentS + - direction * speed * trajUpdFreq * finishedSegmentPart; + remainingTime = 0.0; + finishedSegmentPart += (delta / trajUpdFreq); + shiftPoint = pathSegmentS + movementDirection * movementSpeed * trajUpdFreq * finishedSegmentPart; } return remainingTime; } - -// Moves bullet according to settings, -// decides when and how much tracing should it do. +// Moves bullet according to settings and decides when and how much tracing should it do. // @param delta Amount of time passed after previous bullet movement function DoProcessMovement(float delta){ local Vector tempVect; - SetIgnoreActive(true); + //SetHumanPawnCollision(true); // Simple linear movement if(bDisableComplexMovement){ - // Use 'traceStart' as a shift variable here - // Naming is bad in this case, but it avoids - tempVect = direction * speed * delta; - DoTraceLine(location, location + tempVect); - Move(tempVect); - // Reset path building - // If in future complex movement would be re-enabled, - // - we want to set first point of the path to - // the location of bullet at a time and not use outdated information. - finishedSegmentPart = -1.0; + // Use 'traceStart' as a shift variable here + // Naming is bad in this case, but it avoids + tempVect = movementDirection * movementSpeed * delta; + DoTraceLine(location, location + tempVect); + Move(tempVect); + // Reset path building + // If in future complex movement would be re-enabled, - we want to set first point of the path to + // the location of bullet at a time and not use outdated information. + finishedSegmentPart = -1.0; } // Non-linear movement support else{ - while(delta > 0.0){ - if(finishedSegmentPart < 0.0 || finishedSegmentPart > 1.0) - BuildNextPathSegment(); - // Remember current 'shiftPoint'. - // That's where we stopped tracing last time and - // where we must resume. - tempVect = shiftPoint; - // Update 'shiftPoint' (bullet position) and update how much time - // we've got left after we wasted some to move. - delta = ShiftInSegment(delta); - // Trace between end point of previous tracing - // and end point of the new one. - DoTraceLine(tempVect, shiftPoint); - } - tempVect = shiftPoint - location; - Move(shiftPoint - location); + while(delta > 0.0){ + if(finishedSegmentPart < 0.0 || finishedSegmentPart > 1.0) + BuildNextPathSegment(); + // Remember current 'shiftPoint'. That's where we stopped tracing last time and where we must resume. + tempVect = shiftPoint; + // Update 'shiftPoint' (bullet position) + // and update how much time we've got left after we wasted some to move. + delta = ShiftInSegment(delta); + // Trace between end point of previous tracing and end point of the new one. + DoTraceLine(tempVect, shiftPoint); + } + tempVect = shiftPoint - location; + Move(shiftPoint - location); } - SetRotation(Rotator(direction)); - if(distancePassed > 0) - distancePassed -= VSize(tempVect); + SetRotation(Rotator(movementDirection)); + if(charMinExplosionDist > 0) + charMinExplosionDist -= VSize(tempVect); SetIgnoreActive(false); + //SetHumanPawnCollision(false); } - function Stick(Actor target, Vector hitLocation){ -/* local NiceMonster targetZed; + local NiceMonster targetZed; local name boneStick; local float distToBone; local float t; local Vector boneStrickOrig; local ExplosionData expData; if(bGhost) - return; + return; expData.explosionDamageType = charExplosionDamageType; expData.explosionDamage = charExplosionDamage; expData.explosionRadius = charExplosionRadius; @@ -680,265 +610,235 @@ function Stick(Actor target, Vector hitLocation){ expData.sourceWeapon = sourceWeapon; targetZed = NiceMonster(target); if(targetZed == none){ - expData.bulletClass = class; - expData.instigator = instigator; - niceRI.ServerStickProjectile(KFHumanPawn(instigator), target, 'None', hitLocation - target.location, - Rotator(movementDirection), expData); - class'NiceProjectileSpawner'.static.StickProjectile(KFHumanPawn(instigator), target, 'None', - hitLocation - target.location, Rotator(movementDirection), expData); + expData.bulletClass = class; + expData.instigator = instigator; + niceRI.ServerStickProjectile(KFHumanPawn(instigator), target, 'None', hitLocation - target.location, + Rotator(movementDirection), expData); + class'NiceProjectileSpawner'.static.StickProjectile(KFHumanPawn(instigator), target, 'None', + hitLocation - target.location, Rotator(movementDirection), expData); } else{ - expData.bulletClass = class; - expData.instigator = instigator; - boneStick = targetZed.GetClosestBone(hitLocation, movementDirection, distToBone); - if(CheckHeadshot(targetZed, hitLocation, movementDirection) > 0.0) - boneStick = targetZed.HeadBone; - if(boneStick == targetZed.HeadBone) - expData.stuckToHead = true; - boneStrickOrig = targetZed.GetBoneCoords(boneStick).origin; - t = movementDirection.x * (boneStrickOrig.x - hitLocation.x) + - movementDirection.y * (boneStrickOrig.y - hitLocation.y) + - movementDirection.z * (boneStrickOrig.z - hitLocation.z); - t /= VSizeSquared(movementDirection); - t *= 0.5; - hitLocation = hitLocation + t * movementDirection; - niceRI.ServerStickProjectile(KFHumanPawn(instigator), targetZed, boneStick, - hitLocation - boneStrickOrig, Rotator(movementDirection), expData); - class'NiceProjectileSpawner'.static.StickProjectile(KFHumanPawn(instigator), targetZed, boneStick, - hitLocation - boneStrickOrig, Rotator(movementDirection), expData); + expData.bulletClass = class; + expData.instigator = instigator; + boneStick = targetZed.GetClosestBone(hitLocation, movementDirection, distToBone); + if(CheckHeadshot(targetZed, hitLocation, movementDirection) > 0.0) + boneStick = targetZed.HeadBone; + if(boneStick == targetZed.HeadBone) + expData.stuckToHead = true; + boneStrickOrig = targetZed.GetBoneCoords(boneStick).origin; + t = movementDirection.x * (boneStrickOrig.x - hitLocation.x) + + movementDirection.y * (boneStrickOrig.y - hitLocation.y) + + movementDirection.z * (boneStrickOrig.z - hitLocation.z); + t /= VSizeSquared(movementDirection); + t *= 0.5; + hitLocation = hitLocation + t * movementDirection; + niceRI.ServerStickProjectile(KFHumanPawn(instigator), targetZed, boneStick, + hitLocation - boneStrickOrig, Rotator(movementDirection), expData); + class'NiceProjectileSpawner'.static.StickProjectile(KFHumanPawn(instigator), targetZed, boneStick, + hitLocation - boneStrickOrig, Rotator(movementDirection), expData); } - KillBullet();*/ -} - -function DoExplode(Vector explLocation, Vector impactNormal){ - local ImpactEffect visualEffect; - if(!bIsDud){ - class'NiceBulletAdapter'.static.Explode(self, explLocation); - if(bShakeViewOnExplosion) - ShakeView(explLocation); - visualEffect = explosionImpact; - } - else - visualEffect = disintegrationImpact; - GenerateImpactEffects(visualEffect, explLocation, impactNormal, true, true); KillBullet(); } - +function DoExplode(Vector explLocation, Vector impactNormal){ + if(charIsDud) + return; + if(bStuck) + class'NiceBulletAdapter'.static.Explode(self, niceRI, explLocation, base); + else + class'NiceBulletAdapter'.static.Explode(self, niceRI, explLocation); + GenerateImpactEffects(explosionImpact, explLocation, impactNormal, true, true); + if(bShakeViewOnExplosion) + ShakeView(explLocation); + KillBullet(); +} function HandleHitWall(Actor wall, Vector hitLocation, Vector hitNormal){ - local bool bCanExplode; - local bool bBulletTooWeak; - - bCanExplode = !bIsDud && distancePassed < fireType.explosion.minArmDistance; - if(fireType.explosion.bOnWallHit && bCanExplode){ - DoExplode(hitLocation, hitNormal); - return; + local bool bBulletTooWeak; + if(charExplodeOnWallHit && !charIsDud && charMinExplosionDist <= 0.0){ + DoExplode(hitLocation, hitNormal); + return; } - class'NiceBulletAdapter'.static.HitWall(self, wall, - hitLocation, hitNormal); - GenerateImpactEffects(regularImpact, hitLocation, hitNormal, true, true); - if(fireType.bullet.bStickToWalls) - Stick(wall, hitLocation); - else if(bBounce && !bDisableComplexMovement){ - direction = direction - 2.0 * hitNormal * (direction dot hitNormal); - bBulletTooWeak = !class'NiceBulletAdapter'.static. - ZedPenetration(damage, self, none, 0.0); - ResetPathBuilding(); - ResetIgnoreList(); - bounceHeadMod *= 2; + else{ + class'NiceBulletAdapter'.static.HitWall(self, niceRI, wall, hitLocation, hitNormal); + GenerateImpactEffects(regularImpact, hitLocation, hitNormal, true, true); + if(charIsSticky) + Stick(wall, hitLocation); } - else if(fireType.movement.fallTime > 0.0){ - bIsDud = true; - lifeSpan = fireType.movement.fallTime; - fireType.movement.fallTime = 0.0; - direction = vect(0,0,0); - ResetPathBuilding(); - ResetIgnoreList(); + if(bShouldBounce && !bDisableComplexMovement){ + movementDirection = (movementDirection - 2.0 * hitNormal * (movementDirection dot hitNormal)); + bBulletTooWeak = !class'NiceBulletAdapter'.static.ZedPenetration(charDamage, self, none, false, false); + charPenetrationCount += 1; + ResetPathBuilding(); + ResetIgnoreList(); + bounceHeadMod *= 2; + } + else if(movementFallTime > 0.0){ + charIsDud = true; + lifeSpan = movementFallTime; + movementFallTime = 0.0; + movementDirection = vect(0,0,0); + ResetPathBuilding(); + ResetIgnoreList(); } else - bBulletTooWeak = true; + bBulletTooWeak = true; if(bBulletTooWeak) - KillBullet(); + KillBullet(); } - -// Decide whether to explode or just hit after non-zed pawn collision -function HandleHitPawn(KFPawn hitPawn, Vector hitLocation, Vector hitDirection){ - local bool bCanExplode; - // Deal damage due to impact + effects - class'NiceBulletAdapter'.static.HitPawn(self, hitPawn, hitLocation, - hitDirection); - if(bGenRegEffectOnPawn) - GenerateImpactEffects( regularImpact, hitLocation, hitDirection, - false, false); - - // Explode if you can - bCanExplode = !bIsDud && distancePassed < fireType.explosion.minArmDistance; - if(fireType.explosion.bOnPawnHit && bCanExplode){ - DoExplode(hitLocation, hitDirection); - return; +function HandleHitPawn(KFPawn hitPawn, Vector hitLocation, Vector hitDirection, array hitPoints){ + if(charExplodeOnPawnHit && !charIsDud && charMinExplosionDist <= 0.0){ + DoExplode(hitLocation, hitDirection); + GenerateImpactEffects(explosionImpact, hitLocation, hitDirection); + return; } - - // Kill weakened bullets - if(!class'NiceBulletAdapter'.static. - ZedPenetration(damage, self, none, 0.0)) + else{ + class'NiceBulletAdapter'.static.HitPawn(self, niceRI, hitPawn, hitLocation, hitDirection, hitPoints); + if(bGenRegEffectOnPawn) + GenerateImpactEffects(regularImpact, hitLocation, hitDirection, false, false); + } + if(!class'NiceBulletAdapter'.static.ZedPenetration(charDamage, self, none, false, false)){ + charPenetrationCount += 1; KillBullet(); + } } - -// Decide whether to explode or just hit after zed collision; -// Kill the bullet on explosion or when can't penetrate anymore -function HandleHitZed( NiceMonster targetZed, - Vector hitLocation, - Vector hitDirection, - float headshotLevel){ - local bool bCanExplode; - if(nicePlayer == none || niceRI == none) return; - - // Deal damage due to impact + effects + - // some skill-related stuff ('ServerJunkieExtension') - class'NiceBulletAdapter'.static.HitZed( self, targetZed, - hitLocation, hitDirection, - headshotLevel); - if(!bGhost && !bAlreadyHitZed){ - bAlreadyHitZed = true;// NICETODO: send only when actually used - niceRI.ServerJunkieExtension(nicePlayer, headshotLevel > 0.0); +function HandleHitZed(KFMonster targetZed, Vector hitLocation, Vector hitDirection, float headshotLevel){ + local bool bHitZedCalled; + if(class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, class'NiceSkillDemoDirectApproach')){ + class'NiceBulletAdapter'.static.HitZed(self, niceRI, targetZed, hitLocation, hitDirection, headshotLevel); + if(bGenRegEffectOnPawn) + GenerateImpactEffects(regularImpact, hitLocation, hitDirection, false, false); + bHitZedCalled = true; } - if(bGenRegEffectOnPawn) - GenerateImpactEffects( regularImpact, hitLocation, hitDirection, - false, false); - // Explode if you can... - bCanExplode = !bIsDud && distancePassed < fireType.explosion.minArmDistance; - if(fireType.explosion.bOnPawnHit && bCanExplode){ - DoExplode(hitLocation, hitDirection); - return; + if(charExplodeOnPawnHit && !charIsDud && charMinExplosionDist <= 0.0){ + class'NiceBulletAdapter'.static.Explode(self, niceRI, hitLocation, targetZed); + GenerateImpactEffects(explosionImpact, hitLocation, hitDirection); + if(bShakeViewOnExplosion) + ShakeView(hitLocation); + KillBullet(); + return; } - // ...otherwise try sticking - else if(fireType.bullet.bStickToZeds) - Stick(targetZed, hitLocation); - - // Kill weakened bullets - if(!class'NiceBulletAdapter'.static. - ZedPenetration(damage, self, targetZed, headshotLevel)) + else{ + if(!bHitZedCalled){ + class'NiceBulletAdapter'.static.HitZed(self, niceRI, targetZed, hitLocation, hitDirection, headshotLevel); + if(bGenRegEffectOnPawn) + GenerateImpactEffects(regularImpact, hitLocation, hitDirection, false, false); + } + bHitZedCalled = true; + if(!bGhost && !bAlreadyHitZed){ + bAlreadyHitZed = true; + if(nicePlayer != none && niceRI != none) + niceRI.ServerJunkieExtension(nicePlayer, headshotLevel > 0.0); + } + if(charIsSticky) + Stick(targetZed, hitLocation); + } + if(!class'NiceBulletAdapter'.static.ZedPenetration(charDamage, self, targetZed, (headshotLevel > 0.0), (headshotLevel > charDamageType.default.prReqPrecise))){ + charPenetrationCount += 1; KillBullet(); + } } - function HandleScream(Vector disintegrationLocation, Vector entryDirection){ - if(!bIsDud) - GenerateImpactEffects( disintegrationImpact, disintegrationLocation, - entryDirection); - class'NiceBulletAdapter'.static.HandleScream( self, - disintegrationLocation, - entryDirection); + if(!charIsDud) + GenerateImpactEffects(disintegrationImpact, disintegrationLocation, entryDirection); + class'NiceBulletAdapter'.static.HandleScream(self, niceRI, disintegrationLocation, entryDirection); } - -function GenerateImpactEffects( ImpactEffect effect, - Vector hitLocation, - Vector hitNormal, - optional bool bWallImpact, - optional bool bGenerateDecal){ - local bool generatedEffect; - local float actualCullDistance, actualImpactShift; - if(localPlayer == none) return; - // No need to play visuals on a server or for dead bullets - if(Level.NetMode == NM_DedicatedServer || bBulletDead) return; - if(!localPlayer.CanSpawnEffect(bGhost) && !effect.bImportanEffect) return; - - // Classic effect +function GenerateImpactEffects(ImpactEffect effect, Vector hitLocation, Vector hitNormal, + optional bool bWallImpact, optional bool bGenerateDecal){ + local float actualCullDistance; + local float actualImpactShift; + local bool generatedEffect; + // No need to play visuals on a server, for a dead bullets or in case there's no local player at all + if(Level.NetMode == NM_DedicatedServer || bBulletDead || localPlayer == none) + return; + if(!localPlayer.CanSpawnEffect(bGhost) && !effect.bImportanEffect) + return; + // -- Classic effect if(effect.bPlayROEffect && !bBulletDead) - Spawn(class'ROBulletHitEffect',,, hitLocation, rotator(-hitNormal)); - - // Generate decal + Spawn(class'ROBulletHitEffect',,, hitLocation, rotator(-hitNormal)); + // -- Generate decal if(bGenerateDecal && effect.decalClass != none){ - // Find appropriate cull distance for this decal - actualCullDistance = effect.decalClass.default.cullDistance; - // Double cull distance if local player is an instigator - if(instigator != none && localPlayer == instigator.Controller) - actualCullDistance *= 2; // NICETODO: magic number - // Spawn decal - if(!localPlayer.BeyondViewDistance(hitLocation, actualCullDistance)){ - Spawn(effect.decalClass, self,, hitLocation, rotator(- hitNormal)); - generatedEffect = true; - } + // Find appropriate cull distance for this decal + actualCullDistance = effect.decalClass.default.cullDistance; + // Double cull distance if local player is an instigator + if(instigator != none && localPlayer == instigator.Controller) + actualCullDistance *= 2; // NICETODO: magic number + // Spawn decal + if(!localPlayer.BeyondViewDistance(hitLocation, actualCullDistance)){ + Spawn(effect.decalClass, self,, hitLocation, rotator(- hitNormal)); + generatedEffect = true; + } } - - // Generate custom effect + // -- Generate custom effect if(effect.emitterClass != none && EffectIsRelevant(hitLocation, false)){ - if(bWallImpact) - actualImpactShift = effect.emitterShiftWall; - else - actualImpactShift = effect.emitterShiftPawn; - Spawn( effect.emitterClass,,, - hitLocation - direction * actualImpactShift, - Rotator(direction)); - generatedEffect = true; + if(bWallImpact) + actualImpactShift = effect.emitterShiftWall; + else + actualImpactShift = effect.emitterShiftPawn; + Spawn(effect.emitterClass,,, hitLocation - movementDirection * actualImpactShift, rotator(movementDirection)); + generatedEffect = true; } - - // Generate custom sound + // -- Generate custom sound if(effect.noise != none){ - class'NiceSoundCls'.default.effectSound = effect.noise; - class'NiceSoundCls'.default.effectVolume = effect.noiseVolume; - Spawn(class'NiceSoundCls',,, hitLocation); - generatedEffect = true; + class'NiceSoundCls'.default.effectSound = effect.noise; + class'NiceSoundCls'.default.effectVolume = effect.noiseVolume; + Spawn(class'NiceSoundCls',,, hitLocation); + generatedEffect = true; } if(generatedEffect) - localPlayer.AddEffect(); + localPlayer.AddEffect(); } - function ShakeView(Vector hitLocation){ - local float explRadius; local float distance, scale; - if(nicePlayer == none || shakeRadiusMult < 0.0) return; - explRadius = fireType.explosion.radius; + if(nicePlayer == none || shakeRadiusMult < 0.0) + return; distance = VSize(hitLocation - nicePlayer.ViewTarget.Location); - if(distance < explRadius * shakeRadiusMult){ - if(distance < explRadius) - scale = 1.0; - else - scale = (explRadius * ShakeRadiusMult - distance) / explRadius; - nicePlayer.ShakeView( shakeRotMag*scale, shakeRotRate, - shakeRotTime, shakeOffsetMag * scale, - shakeOffsetRate, shakeOffsetTime); + if(distance < charExplosionRadius * shakeRadiusMult){ + if(distance < charExplosionRadius) + scale = 1.0; + else + scale = (charExplosionRadius * ShakeRadiusMult - distance) / (charExplosionRadius); + nicePlayer.ShakeView(shakeRotMag*scale, shakeRotRate, shakeRotTime, shakeOffsetMag * scale, shakeOffsetRate, shakeOffsetTime); } } - function KillBullet(){ local int i; if(bulletTrail != none){ - for(i = 0;i < bulletTrail.Emitters.Length;i ++){ - if(bulletTrail.emitters[i] == none) - continue; - bulletTrail.emitters[i].ParticlesPerSecond = 0; - bulletTrail.emitters[i].InitialParticlesPerSecond = 0; - bulletTrail.emitters[i].RespawnDeadParticles = false; - } - bulletTrail.SetBase(none); - bulletTrail.autoDestroy = true; + for(i = 0;i < bulletTrail.Emitters.Length;i ++){ + if(bulletTrail.Emitters[i] == none) + continue; + bulletTrail.Emitters[i].ParticlesPerSecond = 0; + bulletTrail.Emitters[i].InitialParticlesPerSecond = 0; + bulletTrail.Emitters[i].RespawnDeadParticles = false; + } + bulletTrail.SetBase(none); + bulletTrail.AutoDestroy = true; } if(bulletXTrail != none){ - bulletXTrail.mRegen = false; - bulletXTrail.LifeSpan = LifeSpan; + bulletXTrail.mRegen = false; + bulletXTrail.LifeSpan = LifeSpan; } bBulletDead = true; bHidden = true; SoundVolume = 0; LifeSpan = FMin(LifeSpan, 0.1); } - event Destroyed(){ KillBullet(); } defaultproperties { - insideBouncesLeft=2 - trajUpdFreq=0.100000 - bDisableComplexMovement=True - trailXClass=Class'KFMod.KFTracer' - regularImpact=(bPlayROEffect=True) - //StaticMeshRef="kf_generic_sm.Shotgun_Pellet" - DrawType=DT_StaticMesh - bAcceptsProjectors=False - LifeSpan=15.000000 - Texture=Texture'Engine.S_Camera' - bGameRelevant=True - bCanBeDamaged=True - SoundVolume=255 -} \ No newline at end of file + insideBouncesLeft=2 + trajUpdFreq=0.100000 + maxTraceCycles=128 + bDisableComplexMovement=True + trailXClass=Class'KFMod.KFTracer' + regularImpact=(bPlayROEffect=True) + StaticMeshRef="kf_generic_sm.Shotgun_Pellet" + DrawType=DT_StaticMesh + bAcceptsProjectors=False + LifeSpan=15.000000 + Texture=Texture'Engine.S_Camera' + bGameRelevant=True + bCanBeDamaged=True + SoundVolume=255 +} diff --git a/sources/Weapons/NiceBulletAdapter.uc b/sources/Weapons/NiceBulletAdapter.uc index 8d1c267..3838048 100644 --- a/sources/Weapons/NiceBulletAdapter.uc +++ b/sources/Weapons/NiceBulletAdapter.uc @@ -1,38 +1,39 @@ -//============================================================================== +//====================================================================================================================== // NicePack / NiceBulletAdapter -//============================================================================== +//====================================================================================================================== // Temporary stand-in for future functionality. -//============================================================================== -// Class hierarchy: Object > NiceBulletAdapter -//============================================================================== +//====================================================================================================================== // 'Nice pack' source // Do whatever the fuck you want with it // Author: dkanus // E-mail: dkanus@gmail.com -//============================================================================== +//====================================================================================================================== class NiceBulletAdapter extends Object; - var const int BigZedMinHealth; // If zed's base Health >= this value, zed counts as Big var const int MediumZedMinHealth; // If zed's base Health >= this value, zed counts as Medium-size - -static function Explode(NiceBullet bullet, Vector hitLocation){ - /*local NiceReplicationInfo niceRI; - niceRI = bullet.niceRI; +static function Explode(NiceBullet bullet, NiceReplicationInfo niceRI, Vector hitLocation, optional Actor explosionTarget){ if(!bullet.bGhost){ - niceRI.ServerExplode(bullet.fireType.explosion.damage, bullet.fireType.explosion.radius, bullet.fireType.explosion.exponent, - bullet.fireType.explosion.damageType, bullet.fireType.explosion.momentum, hitLocation, bullet.instigator, true, - Vector(bullet.Rotation)); - if(KFMonster(bullet.base) != none && bullet.bStuck && bullet.bStuckToHead) - niceRI.ServerDealDamage(KFMonster(bullet.base), bullet.fireType.explosion.damage, bullet.instigator, hitLocation, - bullet.fireType.explosion.momentum * vect(0,0,-1), bullet.fireType.explosion.damageType, 1.0); - }*/ + niceRI.ServerExplode(bullet.charExplosionDamage, bullet.charExplosionRadius, bullet.charExplosionExponent, + bullet.charExplosionDamageType, bullet.charExplosionMomentum, hitLocation, bullet.instigator, true, + explosionTarget, Vector(bullet.Rotation)); + if(KFMonster(bullet.base) != none && bullet.bStuck && bullet.bStuckToHead) + niceRI.ServerDealDamage(KFMonster(bullet.base), bullet.charExplosionDamage, bullet.instigator, hitLocation, + bullet.charExplosionMomentum * vect(0,0,-1), bullet.charExplosionDamageType, 1.0); + } } - -/*static function HitWall(NiceBullet bullet, Actor targetWall, +static function HandleCalibration + ( + bool isHeadshot, + NiceHumanPawn nicePawn, + NiceMonster targetZed + ){ + if(nicePawn == none) return; + if(nicePawn.currentCalibrationState != CALSTATE_ACTIVE) return; + nicePawn.ServerUpdateCalibration(isHeadshot, targetZed); +} +static function HitWall(NiceBullet bullet, NiceReplicationInfo niceRI, Actor targetWall, Vector hitLocation, Vector hitNormal){ local NicePlayerController nicePlayer; - local NiceReplicationInfo niceRI; - niceRI = bullet.niceRI; nicePlayer = NicePlayerController(bullet.Instigator.Controller); if(nicePlayer == none) return; @@ -43,135 +44,97 @@ static function Explode(NiceBullet bullet, Vector hitLocation){ bullet.charMomentumTransfer * hitNormal, bullet.charDamageType); nicePlayer.wallHitsLeft --; } -}*/ - -static function HitWall//Actor -( - NiceBullet bullet, - Actor targetWall, - Vector hitLocation, - Vector hitNormal -) -{ - local NicePlayerController nicePlayer; - local NiceReplicationInfo niceRI; - if(bullet == none || bullet.instigator == none) - return; - niceRI = bullet.niceRI; - nicePlayer = NicePlayerController(bullet.instigator.controller); - if(nicePlayer == none) - return; - // No need to deal damage to geometry or static actors - if(targetWall.bStatic || targetWall.bWorldGeometry) - return; - // If target is a projectile - we must send message about damage, - // otherwise it's probably a wall. And if we hit our limits of reporting - // about wall damages - avoid sending too many replication messages - // about damage. - // NICETODO: should probably find another way to solve the - // `ServerDealDamage` spam issue, this is bullshit. - if(Projectile(targetWall) == none && nicePlayer.wallHitsLeft <= 0) - return; - niceRI.ServerDealDamage(targetWall, bullet.fireType.bullet.damage, bullet.instigator, hitLocation, - bullet.fireType.bullet.momentum * hitNormal, bullet.fireType.bullet.shotDamageType); - // We've sent a reliable message about hitting a wall - nicePlayer.wallHitsLeft --; } - -static function HandleScream(NiceBullet bullet, Vector location, Vector entryDirection){ - bullet.bIsDud = true; +static function HandleScream(NiceBullet bullet, NiceReplicationInfo niceRI, Vector location, Vector entryDirection){ + bullet.charIsDud = true; } - -static function HitPawn(NiceBullet bullet, KFPawn targetPawn, Vector hitLocation, - Vector hitNormal){ - // local NiceMedicProjectile niceDart; - local NiceReplicationInfo niceRI; - niceRI = bullet.niceRI; - /*niceDart = NiceMedicProjectile(bullet); +static function HitPawn(NiceBullet bullet, NiceReplicationInfo niceRI, KFPawn targetPawn, Vector hitLocation, + Vector hitNormal, array hitPoints){ + local NiceMedicProjectile niceDart; + niceDart = NiceMedicProjectile(bullet); if(niceDart == none) - niceRI.ServerDealDamage(targetPawn, bullet.damage, bullet.instigator, HitLocation, - hitNormal * bullet.fireType.bullet.momentum, bullet.fireType.bullet.shotDamageType); - else*/ //MEANTODO - //niceRI.ServerHealTarget(targetPawn, bullet.damage, bullet.instigator); + niceRI.ServerDealDamage(targetPawn, bullet.charDamage, bullet.instigator, HitLocation, + hitNormal * bullet.charMomentumTransfer, bullet.charDamageType); + else + niceRI.ServerHealTarget(NiceHumanPawn(targetPawn), bullet.charDamage, bullet.instigator); } - -static function HitZed(NiceBullet bullet, NiceMonster niceZed, Vector hitLocation, +static function HitZed(NiceBullet bullet, NiceReplicationInfo niceRI, KFMonster kfZed, Vector hitLocation, Vector hitNormal, float headshotLevel){ - local bool bIsHeadshot; + local bool bIsHeadshot, bIsPreciseHeadshot; local float actualDamage; local int lockonTicks; + local float lockOnTickRate; local float angle; + local NiceHumanPawn nicePawn; local NicePlayerController nicePlayer; local class niceVet; - local NiceReplicationInfo niceRI; - niceRI = bullet.niceRI; bIsHeadshot = (headshotLevel > 0.0); - /* if(bIsHeadshot && bullet.fireState.base.sourceWeapon != none){ - if(bullet.level.TimeSeconds - bullet.fireState.base.sourceWeapon.lastHeadshotTime <= - class'NiceSkillGunslingerPlayful'.default.quickWindow) - bullet.fireState.base.sourceWeapon.quickHeadshots ++; - bullet.fireState.base.sourceWeapon.lastHeadshotTime = bullet.Level.TimeSeconds; - }*/ + bIsPreciseHeadshot = (headshotLevel > bullet.charDamageType.default.prReqPrecise); + if(!bullet.bAlreadyHitZed || bIsHeadshot) + HandleCalibration(bIsHeadshot, NiceHumanPawn(bullet.Instigator), NiceMonster(kfZed)); + if(bIsHeadshot && bullet.sourceWeapon != none) + bullet.sourceWeapon.lastHeadshotTime = bullet.Level.TimeSeconds; // Try to get necessary variables and bail in case they're unaccessible nicePlayer = NicePlayerController(bullet.Instigator.Controller); if(nicePlayer == none) - return; + return; + nicePawn = NiceHumanPawn(bullet.instigator); + if( !bIsHeadshot + && nicePawn != none + && nicePlayer.abilityManager != none + && nicePlayer.abilityManager.IsAbilityActive(class'NiceSkillSharpshooterReaperA'.default.abilityID)) + nicePawn.ServerCooldownAbility(class'NiceSkillSharpshooterReaperA'.default.abilityID); niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo)); - if(bullet.fireType.bullet.bCausePain) - actualDamage = bullet.fireType.bullet.damage; + if(bullet.charCausePain) + actualDamage = bullet.charOrigDamage; else - actualDamage = bullet.damage; - if(niceZed == bullet.fireState.lockon.target && bullet.fireState.lockon.time > 0.5 - && niceVet != none && niceVet.static.hasSkill(nicePlayer, class'NiceSkillSharpshooterKillConfirmed')){ - lockonTicks = Ceil(2 * bullet.fireState.lockon.time) - 1; - //actualDamage *= 1.0 + - // 0.5 * lockonTicks * (lockonTicks + 1) * class'NiceSkillSharpshooterKillConfirmed'.default.damageBonus; - //damageMod *= 1.0 + lockonTicks * class'NiceSkillSharpshooterKillConfirmed'.default.damageBonus; - actualDamage *= 1.0 + lockonTicks * class'NiceSkillSharpshooterKillConfirmed'.default.damageBonus; - }/* - if(niceVet == class'NiceVetGunslinger' && !bullet.bAlreadyHitZed) - niceRI.ServerGunslingerConfirm(niceZed, actualDamage, bullet.instigator, hitLocation, - bullet.fireType.bullet.momentum * hitNormal, bullet.fireType.bullet.shotDamageType, headshotLevel, bullet.fireState.lockon.time);*/ + actualDamage = bullet.charDamage; + if(headshotLevel > 0) + actualDamage *= bullet.charContiniousBonus; + if(bullet.bGrazing) + actualDamage *= class'NiceSkillSupportGraze'.default.grazeDamageMult; + bullet.bGrazing = false; + if(kfZed == bullet.lockonZed && bullet.lockonTime > bullet.sourceWeapon.stdFireRate + && niceVet != none && niceVet.static.hasSkill(nicePlayer, class'NiceSkillSharpshooterKillConfirmed')){ + lockOnTickRate =class'NiceSkillSharpshooterKillConfirmed'.default.stackDelay; + lockonTicks = Ceil(bullet.lockonTime / lockOnTickRate) - 1; + lockonTicks = Min(class'NiceSkillSharpshooterKillConfirmed'.default.maxStacks, lockonTicks); + //actualDamage *= 1.0 + + // 0.5 * lockonTicks * (lockonTicks + 1) * class'NiceSkillSharpshooterKillConfirmed'.default.damageBonus; + //damageMod *= 1.0 + lockonTicks * class'NiceSkillSharpshooterKillConfirmed'.default.damageBonus; + actualDamage *= 1.0 + lockonTicks * class'NiceSkillSharpshooterKillConfirmed'.default.damageBonus; + } if(!bullet.bGhost) - niceRI.ServerDealDamage(niceZed, actualDamage, bullet.instigator, hitLocation, - bullet.fireType.bullet.momentum * hitNormal, bullet.fireType.bullet.shotDamageType, headshotLevel, bullet.fireState.lockon.time); - + niceRI.ServerDealDamage(kfZed, actualDamage, bullet.instigator, hitLocation, + bullet.charMomentumTransfer * hitNormal, bullet.charDamageType, headshotLevel, bullet.lockonTime); //// Handle angled shots angle = asin(hitNormal.Z); - // Gunslinger skill check - /*bGunslingerAngleShot = class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, class'NiceSkillGunslingerCloseAndPersonal'); - if(bGunslingerAngleShot) - bGunslingerAngleShot = - VSizeSquared(bullet.instigator.location - niceZed.location) <= - class'NiceSkillGunslingerCloseAndPersonal'.default.closeDistance ** 2;*/ // Apply angled shots - if((angle > 0.8 || angle < -0.45) && bullet.bCanAngleDamage && niceZed != none){ - bullet.bCanAngleDamage = false; - bullet.bAlreadyHitZed = true; - if(ZedPenetration(bullet.damage, bullet, niceZed, headshotLevel)) - HitZed(bullet, niceZed, hitLocation, hitNormal, headshotLevel); + if((angle > 0.8 || angle < -0.45) && bullet.bCanAngleDamage && kfZed != none){ + bullet.bCanAngleDamage = false; + bullet.bAlreadyHitZed = true; + if(ZedPenetration(bullet.charDamage, bullet, kfZed, bIsHeadshot, bIsPreciseHeadshot)) + HitZed(bullet, niceRI, kfZed, hitLocation, hitNormal, headshotLevel); } - //// 'Bore' support skill if( niceVet != none && nicePlayer.IsZedTimeActive() && bullet.insideBouncesLeft > 0 - && niceVet.static.hasSkill(nicePlayer, class'NiceSkillSupportZEDBore')){ - // Count one bounce - bullet.insideBouncesLeft --; - // Swap head-shot level - if(headshotLevel <= 0.0) - headshotLevel = class'NiceSkillSupportZEDBore'.default.minHeadshotPrecision; - else - headshotLevel = -headshotLevel; - // Deal next batch of damage - ZedPenetration(bullet.damage, bullet, niceZed, 0.0); - HitZed(bullet, niceZed, hitLocation, hitNormal, headshotLevel); + && niceVet.static.hasSkill(nicePlayer, class'NiceSkillSupportZEDBore')){ + // Count one bounce + bullet.insideBouncesLeft --; + // Swap head-shot level + if(headshotLevel <= 0.0) + headshotLevel = class'NiceSkillSupportZEDBore'.default.minHeadshotPrecision; + else + headshotLevel = -headshotLevel; + // Deal next batch of damage + ZedPenetration(bullet.charDamage, bullet, kfZed, false, false); + HitZed(bullet, niceRI, kfZed, hitLocation, hitNormal, headshotLevel); } bullet.insideBouncesLeft = 2; } - -static function bool ZedPenetration(out float Damage, NiceBullet bullet, NiceMonster niceZed, float headshotLevel){ - local float penReduction; - local bool bIsHeadshot, bIsPreciseHeadshot; +static function bool ZedPenetration(out float Damage, NiceBullet bullet, KFMonster targetZed, bool bIsHeadshot, bool bIsPreciseHeadshot){ + local float reductionMod; + local NiceMonster niceZed; local NicePlayerController nicePlayer; local int actualMaxPenetrations; local class niceVet; @@ -179,47 +142,51 @@ static function bool ZedPenetration(out float Damage, NiceBullet bullet, NiceMon // True if we can penetrate even body, but now penetrating a head and shouldn't reduce damage too much local bool bEasyHeadPenetration; // Init variables + niceZed = NiceMonster(targetZed); nicePlayer = NicePlayerController(bullet.Instigator.Controller); - niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo)); - niceDmgType = bullet.fireType.bullet.shotDamageType; - bIsHeadshot = (headshotLevel > 0.0); - bIsPreciseHeadshot = (headshotLevel > bullet.fireType.bullet.shotDamageType.default.prReqPrecise); + niceVet = none; + if(nicePlayer != none) + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo)); + niceDmgType = bullet.charDamageType; bEasyHeadPenetration = bIsHeadshot && !niceDmgType.default.bPenetrationHSOnly; - - penReduction = niceDmgType.default.PenDmgReduction; + reductionMod = 1.0f; // Apply zed reduction and perk reduction of reduction` if(niceZed != none){ - // Railgun skill exception - if(niceVet != none && niceVet.static.hasSkill(nicePlayer, class'NiceSkillSharpshooterZEDRailgun') && nicePlayer.IsZedTimeActive()) - return true; - if(niceZed.default.Health >= default.BigZedMinHealth && !bEasyHeadPenetration) - penReduction *= niceDmgType.default.BigZedPenDmgReduction; - else if(niceZed.default.Health >= default.MediumZedMinHealth && !bEasyHeadPenetration) - penReduction *= niceDmgType.default.MediumZedPenDmgReduction; + // Railgun skill exception + if(niceVet != none && niceVet.static.hasSkill(nicePlayer, class'NiceSkillSharpshooterZEDRailgun') && nicePlayer.IsZedTimeActive()) + return true; + if(niceZed.default.Health >= default.BigZedMinHealth && !bEasyHeadPenetration) + reductionMod *= niceDmgType.default.BigZedPenDmgReduction; + else if(niceZed.default.Health >= default.MediumZedMinHealth && !bEasyHeadPenetration) + reductionMod *= niceDmgType.default.MediumZedPenDmgReduction; } else - penReduction *= niceDmgType.default.BigZedPenDmgReduction; + reductionMod *= niceDmgType.default.BigZedPenDmgReduction; if(niceVet != none) - penReduction = niceVet.static.GetPenetrationDamageMulti(KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo), penReduction, niceDmgType); - if(niceVet != none && nicePlayer.pawn.bIsCrouched && niceVet.static.hasSkill(nicePlayer, class'NiceSkillSharpshooterSurgical') && bIsHeadshot) - penReduction = FMax(penReduction, class'NiceSkillSharpshooterSurgical'.default.penDmgReduction); + reductionMod = niceVet.static.GetPenetrationDamageMulti(KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo), reductionMod, niceDmgType); + actualMaxPenetrations = niceDmgType.default.maxPenetrations; + if(niceVet != none && !bullet.charWasHipFired && niceVet.static.hasSkill(nicePlayer, class'NiceSkillSharpshooterSurgical') && bIsHeadshot){ + actualMaxPenetrations += 1; + reductionMod = FMax(reductionMod, class'NiceSkillSharpshooterSurgical'.default.penDmgReduction); + } // Assign new damage value and tell us if we should stop with penetration - Damage *= penReduction; - actualMaxPenetrations = niceDmgType.default.maxPenetrations; - if(actualMaxPenetrations >= 0) - actualMaxPenetrations += - niceVet.static.GetAdditionalPenetrationAmount(KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo)); + Damage *= reductionMod * niceDmgType.default.PenDmgReduction; + bullet.decapMod *= reductionMod * niceDmgType.default.PenDecapReduction; + bullet.incapMod *= reductionMod * niceDmgType.default.PenIncapReduction; + if(niceVet != none && actualMaxPenetrations >= 0) + actualMaxPenetrations += + niceVet.static.GetAdditionalPenetrationAmount(KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo)); if(!bIsHeadshot && niceDmgType.default.bPenetrationHSOnly) - return false; + return false; if(actualMaxPenetrations < 0) - return true; - if(Damage / bullet.fireType.bullet.damage < (niceDmgType.default.PenDmgReduction ** (actualMaxPenetrations + 1)) + 0.0001 || Damage < 1) - return false; + return true; + if(Damage / bullet.charOrigDamage < (niceDmgType.default.PenDmgReduction ** (actualMaxPenetrations + 1)) + 0.0001 || Damage < 1) + return false; return true; } defaultproperties { - BigZedMinHealth=1000 - MediumZedMinHealth=500 -} \ No newline at end of file + BigZedMinHealth=1000 + MediumZedMinHealth=500 +} diff --git a/sources/Weapons/NiceBulletSpawner.uc b/sources/Weapons/NiceBulletSpawner.uc deleted file mode 100644 index 9c8cd6d..0000000 --- a/sources/Weapons/NiceBulletSpawner.uc +++ /dev/null @@ -1,218 +0,0 @@ -//============================================================================== -// NicePack / NiceBulletSpawner -//============================================================================== -// Class that is supposed to handle bullet spawning. -// It's main purpose is to allow spawning of large amounts of bullets with -// minimal replication between server and clients, which is supposed to be -// achieved via commands that can spawn multiple bullets at once, -// while 'syncing' any randomness by replicating seeds to it's own RNG. -// Functionality: -// - 'Xorshift' RNG implementation -// - Ability to spawn both single bullets and groups of them -// via single replication call -//============================================================================== -// Class hierarchy: Object > Actor > NiceBulletSpawner -//============================================================================== -// 'Nice pack' source -// Do whatever the fuck you want with it -// Author: dkanus -// E-mail: dkanus@gmail.com -//============================================================================== -class NiceBulletSpawner extends Actor - dependson(NiceFire); - - -//============================================================================== -//============================================================================== -// > Random number generation -// Variables and structures related to generating pseudo-random numbers, but -// completly determined by a random state object ('NiceRandomState'). -// For that task we use xorshift algorithm, described here: -// https://en.wikipedia.org/wiki/Xorshift -// (page version as of 21 September 2016) -// -// This class doesn't bother with replicating random states, and all the work -// for their syncronization must be done via some other means. - -//============================================================================== -// >> State of the psudo-random number generator -// This structure contains four integer values used in our version of xorshift -struct NiceRandomState{ - var int x, y, z, w; -}; - - -//============================================================================== -//============================================================================== -// > RNG-related functions - -// Generates new random state (seed). -// This must be called on one machine only (server or client) and then -// replicated to other meachines that are required to generate the same -// sequence of random numbers. -// Separetely calling it on different machines will produce different seeds -// and different random sequences. -static function NiceRandomState GenerateRandomState(){ - local NiceRandomState newState; - newState.x = Rand(MaxInt); - newState.y = Rand(MaxInt); - newState.z = Rand(MaxInt); - newState.w = Rand(MaxInt); - return newState; -} - -// Generates new random float between 0 and 'maxValue' -// and modifies the used state as a result. -// In case 'maxValue' is less than 1, - it'll be treated as 1. -static function int GetRandomInt( out NiceRandomState randomState, - int maxValue){ - local int t; - local int randomValue; - // This part was taken from: - // https://en.wikipedia.org/wiki/Xorshift - // (page version as of 21 September 2016) - t = randomState.x; - t = t ^ (t << 11); - t = t ^ (t >> 8); - randomState.x = randomState.y; - randomState.y = randomState.z; - randomState.z = randomState.w; - randomState.w = randomState.w ^ (randomState.w >> 19); - randomState.w = randomState.w ^ t; - // This is the supposed output random value, - // but since it can be negative... - randomValue = randomState.w; - // ...we will force it to be positive; - // (the case when 'randomValue' turns out to be the minimal possible value - // won't compromise anything for us) - if(randomValue < 0) - randomValue = -randomValue; - // Now quit if the value generated is indeed lower than 'maxValue'... - maxValue = Max(maxValue, 1); - if(randomState.w <= maxValue) - return randomState.w; - // ...because this will mess things up when 'maxValue' == 'MaxInt' - return (randomState.w % (maxValue + 1)) / maxValue; -} - -// Generates new random float between 0 and 1 -// and modifies the used state as a result. -static function float GetRandomFloat(out NiceRandomState randomState){ - return GetRandomInt(randomState, MaxInt) / MaxInt; -} - - -//============================================================================== -//============================================================================== -// > Bullet spawning-related functions - -// When called on a server - -// replicates to all players a message about spawned bullets -// (to cause them to spawn their ghost versions); -// -// 'bSkipOwner' flag allows to skip replicating this information -// to the owner (instigator) of the bullets, -// which is useful when used in 'DoNiceFireEffect' in 'NiceFire' class that's -// called on both client and server. -// -// When called on a client - instantly terminates itself -static function ReplicateBullets( int amount, - Vector start, - Rotator dir, - float spread, - NiceFire.NWFireType fireType, - NiceFire.NWCFireState fireState, - bool bSkipOwner){ - local int i; - local NicePack niceMut; - local NicePlayerController bulletOwner; - if(fireState.base.instigator == none) return; - if(fireState.base.instigator.role < ROLE_Authority) return; - niceMut = class'NicePack'.static.Myself(fireState.base.instigator.level); - bulletOwner = fireState.base.instigatorCtrl; - for(i = 0;i < niceMut.playersList.length;i ++){ - if(niceMut.playersList[i] == bulletOwner && bSkipOwner) - continue; - niceMut.playersList[i].ClientSpawnGhosts(amount, start, - dir.pitch, dir.yaw, dir.roll, - spread, fireType, fireState); - } -} -// Spawns a single bullet with no spread, exactly in the specified direction -static function SpawnSingleBullet( Vector start, - Rotator dir, - NiceFire.NWFireType fireType, - NiceFire.NWCFireState fireState){ - local Actor other; - local NiceBullet niceBullet; - local Vector hitLocation, hitNormal, traceDir; - if(fireType.movement.bulletClass == none) return; - if(fireState.base.instigator == none) return; - // Try to spawn - niceBullet = fireState.base.instigator. - Spawn(fireType.movement.bulletClass,,, start, dir); - // If the first projectile spawn failed it's probably because we're trying - // to spawn inside the collision bounds of an object with properties that - // ignore zero extent traces. - // We need to do a non-zero extent trace so - // we can find a safe spawn loc for our projectile - if(niceBullet == none){ - traceDir = fireState.base.instigator.location + - fireState.base.instigator.EyePosition(); - other = fireState.base.instigator.Trace(hitLocation, hitNormal, start, - traceDir, false, Vect(0,0,1)); - if(other != none) - start = hitLocation; - niceBullet = fireState.base.instigator. - Spawn( fireType.movement.bulletClass,,, start, dir); - } - // Give up if failed after these two attempts - if(niceBullet == none) - return; - // Initialize bullet's data - niceBullet.fireType = fireType; - niceBullet.fireState = fireState; - niceBullet.InitBullet(); -} - -// Spawns a several bullets at once from the same location, but possibly -// spreads them in different directions (if 'spread' is greater than zero) -// by at most 'spread' angle (given in rotator units). -static function SpawnBullets( int amount, - Vector start, - Rotator dir, - float spread, - NiceFire.NWFireType fireType, - NiceFire.NWCFireState fireState){ - local int i; - local Vector dirVector; - local Rotator randomRot; - dirVector = Vector(dir); - for(i = 0;i < amount;i ++){ - if(spread > 0.0){ - randomRot.yaw = spread * (FRand() - 0.5); // NICETODO: replace with proper fucking RNG, after adding syncronization of seeds - randomRot.pitch = spread * (FRand() - 0.5); - } - SpawnSingleBullet( start, Rotator(dirVector >> randomRot), - fireType, fireState); - } -} - -// A usability function; -// it calls 'SpawnBullets' on client (instigator) and -// 'ReplicateBullets' on server, without duplicating shots on the client. -// -// Just a shortcut to use to fire bullets from 'NiceFire' class -static function FireBullets(int amount, - Vector start, - Rotator dir, - float spread, - NiceFire.NWFireType fireType, - NiceFire.NWCFireState fireState){ - if(fireState.base.instigator == none) return; - - if(fireState.base.instigator.role == ROLE_Authority) - ReplicateBullets(amount, start, dir, spread, fireType, fireState, true); - else - SpawnBullets(amount, start, dir, spread, fireType, fireState); -} \ No newline at end of file diff --git a/sources/Weapons/NiceFire.uc b/sources/Weapons/NiceFire.uc index 9fc1a3a..93223d5 100644 --- a/sources/Weapons/NiceFire.uc +++ b/sources/Weapons/NiceFire.uc @@ -1,1003 +1,693 @@ -//============================================================================== -// NicePack / NiceFire -//============================================================================== -// New base class for fire modes, more fit for use with our 'bullet' system. -// Functionality: -// - Support for defining most information about bullet behaviour -// - Support for burst fire -// - Support for shooting different types of bullets at once -// - Support for swappable shot types -// - Support for increased damage when shooting in bursts -// This class is setup to fit needs of as many weapons as possible with -// minimal hassle, but some weapons might require additional work, most likely -// including modification of 'AllowFire' and 'ConsumeAmmo' functions. -// See classes of NicePack weapons and comment for 'IsMainFire' -// for more details. -//============================================================================== -// Class hierarchy: Object > WeaponFire > InstantFire > KFFire > NiceFire -//============================================================================== -// 'Nice pack' source -// Do whatever the fuck you want with it -// Author: dkanus -// E-mail: dkanus@gmail.com -//============================================================================== class NiceFire extends KFFire - dependson(NiceWeapon) abstract; - - -//============================================================================== -//============================================================================== -// > Weapon fire parameters -// All the parameters are contained in a structure that can be swapped -// to alter the effects of the shooting via this mode. -// These are supposed to be immutable;any skill that attempts to change them -// should work with the copy of their value - -//============================================================================== -// >> Weapon fire effects -// Effects that weapon's context can have on bullets, -// like bonus damage for firing continiously, -// or ways bullets are fired, like bursting -struct NWFWeaponType{ - // How many bullets are fired at once? - var int bulletsAmount; - // How many ammo for one shot? - var int ammoPerFire; - // Can these bullets be fired with incomplete ammo? - var bool bCanFireIncomplete; - // Time windows between two shots - var float fireRate; - - // -- These variables deal with increasing damage during continious damage - // (this is used for ZCU's weapon mechanic) - // Multiplier at which we increase our damage while firing continiously - var float contFireBonusDamage; - // Maximum of consequtive shots that can receive damage bonus - var int maxBonusContLenght; - - // -- Are we firing in auto mode or are we bursting? - var bool bAutoFire; // NICETODO: must update waitforrelease - // This is auto-updated to be at least one after 'FillFireType' - // to make semi-auto fire work as expected. - var int maxBurstLength; +var bool bDoSpam; +var name FireIncompleteAnim; +var name FireIncompleteAimedAnim; +var name FireIncompleteLoopAnim; +var name FireIncompleteLoopAimedAnim; +var float zedTimeFireSpeedUp; +// Projectile-related variables +var() bool bProjectileFire; +var() bool bCanFireIncomplete; +var() int ProjPerFire; +var() Vector ProjSpawnOffset; +var() float EffectiveRange; +var() vector KickMomentum; +var() float LowGravKickMomentumScale; // How much to scale up kick momentum in low grav so guys fly around hilariously :) +var() float ProjectileSpeed; // How fast projectile should move +var() bool bDisabled; +var() bool bSemiMustBurst; +var() int MaxBurstLength; +var() int burstShotsMade; +var bool bResetRecoil; // Set this flag to 'true' to disable recoil for the next shot; flag will be automatically reset to 'false' after that +var bool zoomOutOnShot; +var bool bShouldBounce; +var bool bCausePain; +var bool bBetterBurst; +var class bulletClass; +var class explosionDamageType; +var int explosionDamage; +var float explosionRadius; +var float explosionExponent; +var float explosionMomentum; +var float fuseTime; +var bool explodeOnFuse; +var bool explodeOnPawnHit; +var bool explodeOnWallHit; +var bool projAffectedByScream; +var bool bShouldStick; +var int resetTicks; +var float niceNextFireTime; +struct FireModeContext{ + var bool bHipfire; + var NiceWeapon sourceWeapon; + var NiceHumanPawn Instigator; + var bool bIsBursting; + var int burstLength; + var float continiousBonus; + var float lockonTime; + var NiceMonster lockonZed; }; - -//============================================================================== -// >> Shooting rebound -// Settings related to recoil, push-back from firing -// or leaving ironsights on fire -struct NWFRebound{ - // Recoil rotation - // NOTE: - in vanilla actual recoil was randomised between - // provided angle and it's half; - // - horizontal recoil still functions that way - // - vertical recoil, however, is now a fixed value, - // so setting it to the same value will result in higher actual - // recoil (since randomization could only lower it) - // - so if you want to preserve the same average recoil, then - // set 'recoilVertical' to 75% of the value, - // you'd use for vanilla - var int recoilVertical, recoilHorizontal; - // How much should firing move player around - var Vector kickMomentum; - // How much to scale up kick momentum in low grav so guys fly around - var float lowGravKickMomentumScale; - // Should we leave iron sight upon shooting? - var bool bLeaveIronSights; -}; - -//============================================================================== -// >> Parameters of bullet spawning -// Bullet parameters upon launch: offset, speed and spread -struct NWFBulletMovement{ - var class bulletClass; - var Vector spawnOffset; - var float speed; - var float spread; - // If set above zero, bullets will fall for that much time after hitting - // a wall (similar to vanilla's behavior of blunt grenades and rockets) - var float fallTime; -}; - -//============================================================================== -// >> Damage and other effects on zeds -struct NWFBulletEffects{ - // Damage that bullet should deal +var FireModeContext currentContext; +// Secondary fire effect, - allows to spawn additional projectiles along with main hitscan/projectile +struct ShotType{ + var bool bShouldBounce; // Bullets should bounce off the walls var int damage; - // Momentum that should be transferred to zed + var int projPerFire; + var float spread; + var float projSpeed; var float momentum; - // Damage type of this bullet + var ESpreadStyle spreadStyle; var class shotDamageType; - // Always deal original damage to zeds even after penetration - var bool bCausePain; - // Bullet should stick to zeds - var bool bStickToZeds; - // Bullet should stick to walls - var bool bStickToWalls; - // Should bullet be affected by scream? (being destroyed by default) - var bool bAffectedByScream; - // Should this projectile bounce off the walls? - var bool bBounce; -}; - -//============================================================================== -// >> Explosion effects for this bullet -struct NWFExplosionEffects{ - // Damage type of the explosion - var class damageType; - // Maximum damage explosion can deal - var int damage; - // Maximum radius eplosion can affect - var float radius; - // Defines how fast damage falls off with distance - // If we represent distance from explosion location - // as number \alpha between 0 and 1: - // ...1.0 is the location of explosion, - // ...0.0 is any location on the border of explosion, - // then \alpha^exponent would be the damage scale multiplier. - // \alpha > 1 => damage quickly falls down when shifting from center - // \alpha < 1 => more slowly - var float exponent; - // Momentum zeds would recieve from the explosion - var float momentum; - // Time from launch untill the fuse going off + var class explosionDamageType; + var class bulletClass; + var int explosionDamage; + var float explosionRadius; + var float explosionExponent; + var float explosionMomentum; var float fuseTime; - // Minimal distance at which we can detonate - var float minArmDistance; - // When should projectile explode? - var bool bOnFuse; - var bool bOnPawnHit; - var bool bOnWallHit; + var bool bCausePain; + var bool explodeOnFuse; + var bool explodeOnPawnHit; + var bool explodeOnWallHit; + var bool projAffectedByScream; + var bool bShouldStick; }; - -//============================================================================== -// >> Huge structure that combines everything that descibes our fire type -struct NWFireType{ - var string fireTypeName; - var NWFRebound rebound; - var NWFWeaponType weapon; - var NWFBulletMovement movement; - var NWFBulletEffects bullet; - var NWFExplosionEffects explosion; -}; -var array fireTypes; -var int curFireType; -var NiceWeapon.FireAnimationSet fireAnims; - -//============================================================================== -//============================================================================== -// > State of this fire mode -// These parameters are either supposed to change over the course of the game - -//============================================================================== -// >> Contains variables describing most basic and low-level state variables -struct NWFCBaseState{ - // This fire mode is disabled and won't shoot - var bool bDisabled; - // If 'true' semi-auto fire will cause burst fire - var bool bSemiIsBurst; - // How much time should pass before player can fire again - var float fireCooldown; - // Set this flag to 'true' to disable recoil for the next shot; - // it will be automatically reset to 'false' after that - var bool bResetRecoil; - // Did we shoot after latest fire button press? - // Always 'false' when fire button is released - var bool bShotOnClick; - // Latest played fire animation and fire rate for which it is playing, - // stored to correctly update it's speed; - var NiceWeapon.FireAnim latestFireAnim; - var float latestFireRate; - // Amount of time yet to pass before we can replicate input flags again - var float flagReplicationCooldown; - // Instigator, controller and weapon used for firing - var NiceWeapon sourceWeapon; - var NiceHumanPawn instigator; - var NicePlayerController instigatorCtrl; -}; - -//============================================================================== -// >> Describes current lock-on status -struct NWFCLockonState{ - var NiceMonster target; - var float time; -}; - -//============================================================================== -// >> Describes status of bursting -struct NWFCBurstState{ - // Are we actively bursting right now? - var bool bIsActive; - // Shots in the burst we've made so far - var int shotsMade; -}; - -//============================================================================== -// >> Describes status of continious fire -struct NWFCAutoFireState{ - var float accumulatedBonus; - var int lenght; -}; - -//============================================================================== -// >> Contains all the information about context of this weapon fire -struct NWCFireState{ - var NWFCBaseState base; - var NWFCLockonState lockon; - var NWFCBurstState burst; - var NWFCAutoFireState autoFire; -}; -var NWCFireState fireState; - -simulated function PostBeginPlay(){ +// All the available shot types; shot type at index zero is auto-filled from the usual kf's parameters +var array fireShots; +// Index of the shot we're currently generating +var int currentShot; +// Variables for managing damage boosts for fast firing +var float contBonus; +var bool contBonusReset; // does bonus reset after reaching the top value? 'false' means it'll keep being maxed out until player releases fire button +var int maxBonusContLenght; +var int currentContLenght; +var float period; +static function PreloadAssets(LevelInfo LevelInfo, optional KFFire Spawned){ local int i; + if(default.FireSound == none && default.FireSoundRef != "") + default.FireSound = sound(DynamicLoadObject(default.FireSoundRef, class'Sound', true)); + if(default.StereoFireSound == none){ + if(default.StereoFireSoundRef != "") + default.StereoFireSound = sound(DynamicLoadObject(default.StereoFireSoundRef, class'Sound', true)); + else + default.StereoFireSound = default.FireSound; + } + if(default.NoAmmoSound == none && default.NoAmmoSoundRef != "") + default.NoAmmoSound = sound(DynamicLoadObject(default.NoAmmoSoundRef, class'Sound', true)); + if(Spawned != none){ + Spawned.FireSound = default.FireSound; + Spawned.StereoFireSound = default.StereoFireSound; + Spawned.NoAmmoSound = default.NoAmmoSound; + } + if(default.bulletClass != none) + default.bulletClass.static.PreloadAssets(); + for(i = 0;i < default.fireShots.Length;i ++) + if(default.fireShots[i].bulletClass != none) + default.fireShots[i].bulletClass.static.PreloadAssets(); +} +static function bool UnloadAssets(){ + default.FireSound = none; + default.StereoFireSound = none; + default.NoAmmoSound = none; + if(default.bulletClass != none) + default.bulletClass.static.UnloadAssets(); + return true; +} +simulated function PostBeginPlay(){ + local ShotType defaultShotType; + currentContext.continiousBonus = 1.0; + currentContext.burstLength = 1; + // Build index-zero shot type + defaultShotType.damage = DamageMax; + defaultShotType.projPerFire = ProjPerFire; + defaultShotType.spread = Spread; + defaultShotType.projSpeed = projectileSpeed; + defaultShotType.momentum = momentum; + defaultShotType.spreadStyle = spreadStyle; + defaultShotType.bShouldBounce = bShouldBounce; + defaultShotType.shotDamageType = class(DamageType); + defaultShotType.explosionDamageType = explosionDamageType; + defaultShotType.bulletClass = bulletClass; + defaultShotType.explosionDamage = explosionDamage; + defaultShotType.explosionRadius = explosionRadius; + defaultShotType.explosionExponent = explosionExponent; + defaultShotType.explosionMomentum = explosionMomentum; + defaultShotType.fuseTime = fuseTime; + defaultShotType.explodeOnFuse = explodeOnFuse; + defaultShotType.explodeOnPawnHit = explodeOnPawnHit; + defaultShotType.explodeOnWallHit = explodeOnWallHit; + defaultShotType.projAffectedByScream = projAffectedByScream; + defaultShotType.bCausePain = bCausePain; + defaultShotType.bShouldStick = bShouldStick; + fireShots[0] = defaultShotType; super.PostBeginPlay(); - FillFireType(); - fireState.autoFire.accumulatedBonus = 1.0; - // Burst fire is semi-auto fire, so it's length must be at least 1 - for(i = 0;i < fireTypes.length;i ++) - if(fireTypes[i].weapon.maxBurstLength < 1) - fireTypes[i].weapon.maxBurstLength = 1; } - -simulated function FillFireType(){ -} - -// Returns true if this fire mode is 'Main' -// - Fire mode is considered 'main' if they use 'magAmmoRemaining' -// and 'magAmmoRemainingClient' for keeping track of loaded ammo; -// - the rest are non-'main' fire modes and they're assumed -// to use 'secondaryCharge' instead. -// -// The default rules for deciding whether we're 'main' mode are: -// 1. All primary fire modes are 'main'. -// 2. All secondary fire modes without their own ammo are also 'main' -// (since it's likely just another way to fire -// the same ammo from the same mag) -// 3. Everything else is non-'main' fire mode -// -// This distinction is introduced, -// because almost all weapons can fit in this model: -// 1. Simple rifles and shotguns require one 'main' fire mode and -// 'magAmmoRemaining'/'magAmmoRemainingClient' variables for -// storing currently loaded and ready for shooting ammo. -// 2. Assault rifles (as well as nailgun oe hunting shotgun) can have two -// fire modes, that still take ammo from the same source/magazine, -// so both of their fire modes are 'main'. -// 3. Something like M4M203 has two fifferent fire modes with two different -// ammo pools, which can't share the same magazine; -// for secondary, nade, fire 'secondaryCharge' is used to denote -// whether or not nade is loaded. -// 4. Medic guns fire darts as their secondary fire and also can't draw -// from the same ammo pool, so they should use 'secondaryCharge'; -// but standart rules define them as 'main', so they have to change -// 'AllowFire' and 'ConsumeAmmo' functions. -simulated function bool IsMainFire(){ - return thisModeNum == 0 || !fireState.base.sourceWeapon.bHasSecondaryAmmo; -} - -// All weapons should have 100% accuracy anyway -simulated function AccuracyUpdate(float Velocity){} - -// Returns currently active fire type -simulated function NWFireType GetFireType(){ - if(curFireType < 0 || curFireType >= fireTypes.length) - return fireTypes[0]; - return fireTypes[curFireType]; -} - simulated function int GetBurstLength(){ - return GetFireType().weapon.maxBurstLength; + return currentContext.burstLength; } - -simulated function StopBursting(){ - fireState.burst.bIsActive = false; - fireState.burst.shotsMade = 0; -} - -// Tests whether fire button, corresponding to our fire mode is pressed atm. -simulated function bool IsFireButtonPressed(){ - local NicePlayerController nicePlayer; - nicePlayer = fireState.base.instigatorCtrl; - if(nicePlayer == none) return false; - if(instigator.role == Role_AUTHORITY) - return (thisModeNum == 0 && nicePlayer.bNiceFire == 1) - || (thisModeNum == 1 && nicePlayer.bNiceAltFire == 1); - else - return (thisModeNum == 0 && nicePlayer.bFire == 1) - || (thisModeNum == 1 && nicePlayer.bAltFire == 1); -} - -simulated function TryReplicatingInputFlags(float delta){ - local NicePlayerController nicePlayer; - // If server already has current version of the flags - - // there's nothing to replicate - nicePlayer = fireState.base.instigatorCtrl; - if(nicePlayer == none) return; - if( nicePlayer.bFire == nicePlayer.bNiceFire - && nicePlayer.bAltFire == nicePlayer.bNiceAltFire) return; - // Otherwise - check cooldown and replicate if it's over - fireState.base.flagReplicationCooldown -= delta / level.timeDilation; - if(fireState.base.flagReplicationCooldown <= 0){ - fireState.base.flagReplicationCooldown = 0.1; - nicePlayer.bNiceFire = nicePlayer.bFire; - nicePlayer.bNiceAltFire = nicePlayer.bAltFire; - nicePlayer.ServerSetFireFlags(nicePlayer.bFire, nicePlayer.bAltFire); - } -} - simulated function ModeTick(float delta){ - local float headAimLevel; - local NiceMonster currentTarget; - - if(instigator.role < Role_AUTHORITY) - TryReplicatingInputFlags(delta); - - // Update instigator, controller and weapon, if necessary - if(fireState.base.instigator == none) - fireState.base.instigator = NiceHumanPawn(instigator); - else if(fireState.base.instigatorCtrl == none) - fireState.base.instigatorCtrl = - NicePlayerController(instigator.controller); - if(fireState.base.sourceWeapon == none) - fireState.base.sourceWeapon = NiceWeapon(weapon); - - // Update lock-on - if(instigator.role < Role_AUTHORITY){ - headAimLevel = 0.0;//TraceZed(currentTarget); - if(headAimLevel <= 0.0 || currentTarget == none){ - fireState.lockon.time = 0.0; - fireState.lockon.target = none; - } - else{ - if(currentTarget == fireState.lockon.target) - fireState.lockon.time += delta ; - else - fireState.lockon.time = 0.0; - fireState.lockon.target = currentTarget; - } + local float headLevel; + local NiceMonster currTarget; + if(currentContext.Instigator == none) + currentContext.Instigator = NiceHumanPawn(Instigator); + if(currentContext.sourceWeapon == none) + currentContext.sourceWeapon = NiceWeapon(Weapon); + if(burstShotsMade >= GetBurstLength() && currentContext.bIsBursting){ + SetTimer(0, false); + currentContext.bIsBursting = false; } - - // Reset continious fire length here to make sure - if(instigator.controller.bFire == 0 && instigator.controller.bAltFire == 0){ - fireState.autoFire.lenght = 0; - fireState.autoFire.accumulatedBonus = 1.0; + // Lock-on update + if(Instigator.Role < Role_AUTHORITY){ + period += delta; + headLevel = TraceZed(currTarget); + if(headLevel <= 0.0 || currTarget == none){ + currentContext.lockonTime = 0.0; + currentContext.lockonZed = none; + } + else{ + if(currTarget == currentContext.lockonZed) + currentContext.lockonTime += delta ; + else + currentContext.lockonTime = 0.0; + currentContext.lockonZed = currTarget; + } + if(period > 0.1 && currentContext.lockonTime > 0.0) + period = 0.0; } - - HandleFiring(delta); + // Reset 'FireCount' + if(Instigator.Controller.bFire == 0 && Instigator.Controller.bAltFire == 0) + FireCount = 0; super.ModeTick(delta); } - -// NICETODO: rewrite StopFire function to force it to also stop burst fire -simulated function HandleFiring(float delta){ - // These flags represent 3 conditions that must be satisfied for - // shooting attempt yo even be attempted: - // 'bFirePressed': is fire button pressed? - // 'bFireExpected': sometimes (ex. semiauto weapons) weapons shouldn't fire - // even thout fire button is pressed - // 'bCooldownPassed' has cooldown passed? - local bool bFirePressed, bFireExpected, bCooldownPassed; - // Did we fire the weapon? - local bool shotFired; - local float currentFireSpeed; - - // Check if we're pressing the fire button; - // if not - reset flag that says we've shot during latest button press; - // if we're bursting - emulate button press (but still reset a flag) - bFirePressed = IsFireButtonPressed(); - if(!bFirePressed) - fireState.base.bShotOnClick = false; - bFirePressed = bFirePressed || fireState.burst.bIsActive; - // Firing is only expected if we're auto firing, bursting or - // haven't yet shot during latest fire button press - bFireExpected = GetFireType().weapon.bAutoFire; - bFireExpected = bFireExpected || fireState.burst.bIsActive; - bFireExpected = bFireExpected || !fireState.base.bShotOnClick; - // Temporarily extend 'delta' time period according to fire speed; - // we need to decrease it back after reducing cooldown to avoid any - // multiplication stacking from recursion. - currentFireSpeed = GetFireSpeed(); - delta *= currentFireSpeed; - bCooldownPassed = ReduceCooldown(delta); - delta /= currentFireSpeed; - - // Fire if all the flags are set to 'true' - if(bCooldownPassed && bFirePressed && bFireExpected) - shotFired = NiceModeDoFire(); - // If shot was actually fired - update fire state and cooldown; - if(shotFired){ - // Update appropriate state variable - UpdateContiniousFire(bFirePressed); - fireState.base.bShotOnClick = true; - if(fireState.burst.bIsActive) - fireState.burst.shotsMade ++; - // New cooldown after shot - DoFireCooldown(); - // Try and shoot again, if there's any time left - if(delta > 0.0) - HandleFiring(delta); - } - // Otherwise - just update current animation - else{ - if(bCooldownPassed && fireState.base.latestFireAnim.bLoop) - // Finish looped animation by playing appropriate fire end anim; - // Waiting for cooldown may, in theory, lead to issues - // with some weapons, but since looped fire animations are only - // used for high rate of fire ones, it should be fine - FinishFireLoopAnimation(); - else - UpdateFireAnimation(); - } +simulated function Timer(){ + if(!AllowFire()) + burstShotsMade = GetBurstLength(); + if(currentContext.bIsBursting && burstShotsMade < GetBurstLength()) + ModeDoFire(); } - -// This function is called when next fire time needs to be updated -simulated function DoFireCooldown(){ - // - If we aren't bursting - simply set cooldown to 'fireRate' - if(!fireState.burst.bIsActive){ - fireState.base.fireCooldown = GetFireType().weapon.fireRate; - return; - } - - // - If we're bursting, we have two cases: - // 1. It's not a final burst, so we cut burst time to fir all - // shots into regular fire time - if(fireState.burst.shotsMade < GetBurstLength()){ - fireState.base.fireCooldown = - GetFireType().weapon.fireRate / GetBurstLength(); - return; - } - // 2. It was a final burst, so we set a slightly increased cooldown - fireState.base.fireCooldown = - GetFireType().weapon.fireRate * fireState.burst.shotsMade * 1.3; - StopBursting(); -} - -// Reduces cooldown by 'using up' passed time given by 'deltaPassed'. -// 'deltaPassed' will be reduced on the amount required to reduce -// cooldown as much as possible; -// returns 'true' if cooldown was finished -simulated function bool ReduceCooldown(out float deltaPassed){ - // If there's not enough time - use up all the 'deltaPassed' - if(fireState.base.fireCooldown > deltaPassed){ - fireState.base.fireCooldown -= deltaPassed; - deltaPassed = 0.0; - return false; - } - // If 'deltaPassed' is more than enough time - use up only part of it - deltaPassed -= fireState.base.fireCooldown; - fireState.base.fireCooldown = 0.0; - return true; -} - simulated function bool AllowFire(){ - local float magAmmo; - local bool bLacksCharge, bLacksAmmo; - local KFPawn kfPwn; - local NWFWeaponType weaponType; - weaponType = GetFireType().weapon; - kfPwn = KFPawn(instigator); - - if(fireState.base.sourceWeapon == none || kfPwn == none) return false; - - // Reject weapons that are swapping variants - if(fireState.base.sourceWeapon.variantSwapState != SWAP_NONE) return false; - - // Reject bursting for way too long - if(fireState.burst.bIsActive - && fireState.burst.shotsMade >= GetBurstLength()) return false; - - // By default we assume that 'primary' fire modes care about chambered - // bullets and all the rest - about charge - // -- Reject shots hen there's no chambered round (for primary fire) - if(IsMainFire() && fireState.base.sourceWeapon.bHasChargePhase - && !fireState.base.sourceWeapon.bRoundInChamber) return false; - // -- Reject shot when there's not enough charge - bLacksCharge = fireState.base.sourceWeapon.secondaryCharge < - weaponType.ammoPerFire; - if(!IsMainFire() && bLacksCharge && !weaponType.bCanFireIncomplete) - return false; - - // Check reloading - if(fireState.base.sourceWeapon.bIsReloading) return false; - - // Check ammo in the mag - magAmmo = fireState.base.sourceWeapon.GetMagazineAmmo(); - // - Need to have at least some ammo - if(magAmmo < 1) return false; - // - If still not enough for 1 shot - we must be able to fire incomplete - bLacksAmmo = magAmmo < weaponType.ammoPerFire; - if(bLacksAmmo && !weaponType.bCanFireIncomplete) return false; - - // Check pawn actions - if(kfPwn.SecondaryItem != none || kfPwn.bThrowingNade) return false; + local int magAmmo; + local bool allowZeroShot; + local bool bRegularFire; + local KFPawn kfPwn; + bRegularFire = !currentContext.sourceWeapon.bHasSecondaryAmmo || ThisModeNum == 0; + //if(niceNextFireTime > Level.TimeSeconds) + // return false; + if(currentContext.sourceWeapon == none || Instigator == none) + return false; + if(currentContext.bIsBursting && burstShotsMade >= GetBurstLength()) + return false; + if(currentContext.sourceWeapon.bHasChargePhase && !currentContext.sourceWeapon.bRoundInChamber && bRegularFire) + return false; + if(currentContext.sourceWeapon.secondaryCharge < default.AmmoPerFire && !bCanFireIncomplete && !bRegularFire) + return false; + // Check reloading + magAmmo = currentContext.sourceWeapon.GetMagazineAmmo(); + if(currentContext.sourceWeapon != none) + allowZeroShot = (Instigator.Role == Role_AUTHORITY && !currentContext.sourceWeapon.bServerFiredLastShot); + if(currentContext.sourceWeapon.bIsReloading || (magAmmo < 1 && !allowZeroShot && bRegularFire) + || (magAmmo < default.AmmoPerFire && !bCanFireIncomplete && !allowZeroShot && bRegularFire)) + return false; + // Check pawn actions + kfPwn = KFPawn(Instigator); + if(kfPwn == none || kfPwn.SecondaryItem != none || kfPwn.bThrowingNade) + return false; return super(WeaponFire).AllowFire(); } - -// This function will cause weapon to burst -simulated function DoBurst(){ - if(fireState.base.fireCooldown > 0) return; - if(fireState.burst.bIsActive || fireState.base.bShotOnClick) return; - if(GetFireType().weapon.maxBurstLength <= 0) return; - fireState.burst.bIsActive = true; - fireState.burst.shotsMade = 0; +simulated function DoBurst(optional bool bSkipFirstShot){ + local NicePlayerController nicePlayer; + local class niceVet; + if(NextFireTime > Level.TimeSeconds || currentContext.bIsBursting) + return; + nicePlayer = NicePlayerController(Instigator.Controller); + if(nicePlayer != none) + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePlayer.PlayerReplicationInfo); + currentContext.bIsBursting = true; + burstShotsMade = 0; + FireCount = 0; + if(!bSkipFirstShot) + ModeDoFire(); + SetTimer(FireRate / GetBurstLength(), true); } - -simulated function UpdateContiniousFire(bool bPlayerWantsToFire){ - // Player stopped shooting for a moment - reset bonus - if(!bPlayerWantsToFire){ - fireState.autoFire.lenght = 0; - fireState.autoFire.accumulatedBonus = 1.0; - return; - } - fireState.autoFire.lenght ++; - if(fireState.autoFire.lenght > GetFireType().weapon.maxBonusContLenght) - fireState.autoFire.accumulatedBonus = 1.0; +event ModeDoFire(){ + local float Rec; + local int magAmmo; + local bool bForceBurst; + if(bDisabled || Instigator == none || Instigator.Controller == none || currentContext.sourceWeapon == none) + return; + // Update how much we can fire + magAmmo = currentContext.sourceWeapon.GetMagazineAmmo(); + if(bCanFireIncomplete) + AmmoPerFire = min(default.AmmoPerFire, magAmmo); else - fireState.autoFire.accumulatedBonus *= - GetFireType().weapon.contFireBonusDamage; -} - -event ModeDoFire(){} - -simulated function bool NiceModeDoFire(){ - local float recoilMult; - local int ammoToFire; - if(instigator == none) return false; - if(fireState.base.bDisabled) return false; - if(fireState.base.sourceWeapon == none) return false; - if(!AllowFire()) return false; - - // How much ammo should we fire? - ammoToFire = GetFireType().weapon.ammoPerFire; - if(GetFireType().weapon.bCanFireIncomplete) - ammoToFire = - Min(ammoToFire, fireState.base.sourceWeapon.GetMagazineAmmo()); - - // Do shooting effects from standart classes, the only thing that - // should be really different is replaced 'DoFireEffect' - MDFEffects(ammoToFire); - if(instigator.role == Role_AUTHORITY){ - MDFEffectsServer(ammoToFire); - ServerPlayFiring(); + AmmoPerFire = default.AmmoPerFire; + UpdateFireSpeed(); + // Should we be allowed to fire? + if(!AllowFire()) + return; + // Bursting + bForceBurst = bSemiMustBurst && bWaitForRelease; + if(!currentContext.bIsBursting && bForceBurst) + DoBurst(true); + if(currentContext.bIsBursting) + burstShotsMade ++; + // If we made it this far with zero AmmoPerFire, - it's a last shot that can be incomplete and was enforced, so make it shoot something + if(AmmoPerFire <= 0 && bCanFireIncomplete) + AmmoPerFire = 1; + if(Level.TimeSeconds > niceNextFireTime + FireRate){ + currentContLenght = 1; + currentContext.continiousBonus = 1.0; } else{ - // Compute right recoil - recoilMult = 1.0; - if(fireState.burst.bIsActive) - recoilMult = recoilMult / GetBurstLength(); - MDFEffectsClient(ammoToFire, recoilMult); - } - return true; -} - -// Fire effects that should affect both client and server: -simulated function MDFEffects(int ammoToFire){ - if(fireState.base.sourceWeapon == none) return; - - // Decrease player's speed while firing - if(weapon.owner != none && weapon.owner.Physics != PHYS_Falling){ - if(GetFireType().weapon.fireRate > 0.25){ - weapon.owner.Velocity.x *= 0.1; - weapon.owner.Velocity.y *= 0.1; - } - else{ - weapon.owner.Velocity.x *= 0.5; - weapon.owner.Velocity.y *= 0.5; + currentContLenght ++; + if(currentContLenght > maxBonusContLenght) + { + if(contBonusReset) + currentContext.continiousBonus = 1.0; } + else + currentContext.continiousBonus *= contBonus; } - - // 3rd person effects - weapon.IncrementFlashCount(thisModeNum); - - // Fire should cause some weapons to zoom out - if( GetFireType().rebound.bLeaveIronSights - || fireState.base.sourceWeapon.reloadType == RTYPE_AUTO) - fireState.base.sourceWeapon.ZoomOut(false); - - // Interrupt firing when we need to take another weapon - // NICETODO: can fuck usup in the future, if we were to redo firing innards - if(instigator.pendingWeapon != weapon && instigator.pendingWeapon != none){ - bIsFiring = false; - weapon.PutDown(); + MDFEffects(AmmoPerFire); + if(Instigator.Role == Role_AUTHORITY) + MDFEffectsServer(AmmoPerFire); + else{ + // Compute recoil + Rec = 1.0; + if(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none) + KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.static.ModifyRecoilSpread(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self, Rec); + if(currentContext.bIsBursting) + Rec = Rec / GetBurstLength(); + MDFEffectsClient(AmmoPerFire, Rec); } - - // Actually launches bullets - DoNiceFireEffect(ammoToFire); } - -// Fire effects that should only affect server. -simulated function MDFEffectsServer(int ammoToFire){ - local Vector eyesPoint; - // Alert zeds about shooting - instigator.MakeNoise(1.0); - - // Shoot buttons on ScrN testing grounds - eyesPoint = instigator.location + instigator.EyePosition(); - DoTraceHack(eyesPoint, AdjustAim(eyesPoint, 0.0)); +// Fire effects that should affect both client and server +simulated function MDFEffects(float newAmmoPerFire){ + local NicePlayerController nicePlayer; + if(instigator != none) + nicePlayer = NicePlayerController(instigator.controller); + if(Weapon.Owner != none && !bFiringDoesntAffectMovement && Weapon.Owner.Physics != PHYS_Falling){ + if(FireRate > 0.25){ + Weapon.Owner.Velocity.x *= 0.1; + Weapon.Owner.Velocity.y *= 0.1; + } + else{ + Weapon.Owner.Velocity.x *= 0.5; + Weapon.Owner.Velocity.y *= 0.5; + } + } + if(MaxHoldTime > 0.0) + HoldTime = FMin(HoldTime, MaxHoldTime); + Weapon.IncrementFlashCount(ThisModeNum); + niceNextFireTime = UpdateNextFireTime(niceNextFireTime); + NextFireTime = niceNextFireTime; + AmmoPerFire = newAmmoPerFire; + Load = AmmoPerFire; + HoldTime = 0; + if(currentContext.sourceWeapon != none && (zoomOutOnShot || currentContext.sourceWeapon.reloadType == RTYPE_AUTO)) + currentContext.sourceWeapon.ZoomOut(false); + if(Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != none){ + bIsFiring = false; + Weapon.PutDown(); + } + for(currentShot = 0;currentShot < fireShots.Length;currentShot ++) + DoFireEffect(); } - // Fire effects that should only affect shooting client. -simulated function MDFEffectsClient(int ammoToFire, float recoilMult){ - // 'true' if ammo is infinite - local bool bUberAmmo; - local NicePlayerController nicePlayer; - if(instigator == none) return; - nicePlayer = NicePlayerController(instigator.controller); - if(nicePlayer == none) return; - - // Reduce ammo - bUberAmmo = nicePlayer.IsZedTimeActive() && class'NiceVeterancyTypes' - .static.hasSkill( nicePlayer, - class'NiceSkillSharpshooterZEDHundredGauntlets'); - if(!bUberAmmo) - ReduceAmmoClient(ammoToFire); - // Fire effects +simulated function MDFEffectsClient(float newAmmoPerFire, float Rec){ + local NicePlayerController nicePlayer; + if(Instigator != none) + nicePlayer = NicePlayerController(Instigator.Controller); + if(nicePlayer == none || !nicePlayer.IsZedTimeActive() || !class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, class'NiceSkillSharpshooterZEDHundredGauntlets')) + ReduceAmmoClient(); InitEffects(); ShakeView(); - NicePlayFiring(ammoToFire < GetFireType().weapon.ammoPerFire); + PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); + currentContext.lockonTime = 0.0; + currentContext.lockonZed = none; if(bDoClientRagdollShotFX && Weapon.Level.NetMode == NM_Client) - DoClientOnlyFireEffect(); - // Recoil - HandleRecoil(recoilMult); + DoClientOnlyFireEffect(); + HandleRecoil(Rec); } - -simulated function ReduceAmmoClient(int ammoToFire){ - if(IsMainFire()) - ReduceMainAmmoClient(ammoToFire); - else - ReduceNonMainAmmoClient(ammoToFire); +// Fire effects that should only be done on server +simulated function MDFEffectsServer(float newAmmoPerFire){ + local NicePlayerController nicePlayer; + if(Instigator != none) + nicePlayer = NicePlayerController(Instigator.Controller); + HoldTime = 0; + if((Instigator == none) || (Instigator.Controller == none)) + return; + Instigator.DeactivateSpawnProtection(); + ServerPlayFiring(); + if(currentContext.sourceWeapon.MagAmmoRemaining <= 0) + currentContext.sourceWeapon.bServerFiredLastShot = true; } - -simulated function ReduceMainAmmoClient(int ammoToFire){ - local NiceWeapon usedWeapon; - usedWeapon = fireState.base.sourceWeapon; - if(usedWeapon == none) return; - // Reduce ammo and reset round in chambered - // Doesn't hurt us to reset it even if weapon doesn't use it - usedWeapon.MagAmmoRemainingClient -= ammoToFire; - if(usedWeapon.MagAmmoRemainingClient <= 0){ - usedWeapon.MagAmmoRemainingClient = 0; - usedWeapon.bRoundInChamber = false; +simulated function ReduceAmmoClient(){ + if(currentContext.sourceWeapon.MagAmmoRemainingClient > 0 && (ThisModeNum == 0 || !currentContext.sourceWeapon.bHasSecondaryAmmo)){ + currentContext.sourceWeapon.MagAmmoRemainingClient -= Load; + if(currentContext.sourceWeapon.MagAmmoRemainingClient <= 0){ + currentContext.sourceWeapon.MagAmmoRemainingClient = 0; + currentContext.sourceWeapon.bRoundInChamber = false; + } + // Force server's magazine size + currentContext.sourceWeapon.ServerReduceMag(currentContext.sourceWeapon.MagAmmoRemainingClient, Level.TimeSeconds, ThisModeNum); } - // After introduction of alternative ammo types - - // we must also reduce it's counton the client - usedWeapon.ConsumeNiceAmmo( usedWeapon.ammoState[0], - usedWeapon.availableAmmoTypes, 0, ammoToFire); - // Magazine weapons autoload their ammo from the magazine - if(usedWeapon.bRoundInChamber && usedWeapon.reloadType == RTYPE_MAG){ - usedWeapon.AmmoStackPush( usedWeapon.ammoState[0], - usedWeapon.ammoState[0].currentAmmoType); - } - // Force server's magazine size - usedWeapon.ServerReduceMag( usedWeapon.MagAmmoRemainingClient, - level.TimeSeconds, thisModeNum); -} - -simulated function ReduceNonMainAmmoClient(int ammoToFire){ - local NiceWeapon usedWeapon; - usedWeapon = fireState.base.sourceWeapon; - if(usedWeapon == none) return; - usedWeapon.secondaryCharge -= ammoToFire; - // After introduction of alternative ammo types - - // we must also reduce it's counton the client - usedWeapon.ConsumeNiceAmmo( usedWeapon.ammoState[1], - usedWeapon.availableAmmoTypesSecondary, - 1, ammoToFire); - // Reduce secondary ammo in case we were using it - usedWeapon.ServerReduceMag( usedWeapon.magAmmoRemainingClient, - level.TimeSeconds, thisModeNum); - // Reduce secondary charge - usedWeapon.ServerSetSndCharge(usedWeapon.secondaryCharge); -} - -// Finds appropriate animation. -// Since required animation can be different under various conditions: -// - incomplete shot (DB shotgun) -// - whether we're aiming or not -// we must choose it based on these conditions. -function NiceWeapon.FireAnim GetCorrectAnim(bool bIncomplete, bool bAimed){ - if(bAimed){ - if(bIncomplete && weapon.HasAnim(fireAnims.incompleteAimed.anim)) - return fireAnims.incompleteAimed; - else if(weapon.HasAnim(fireAnims.aimed.anim)) - return fireAnims.aimed; - } - else if(bIncomplete && weapon.HasAnim(fireAnims.incomplete.anim)) - return fireAnims.incomplete; - return fireAnims.justFire; -} - -function PlayFiringAnim(bool bIncomplete){ - local float animRate; - // Find appropriate animation and speed to play it at - fireState.base.latestFireRate = GetFireSpeed(); - fireState.base.latestFireAnim = - GetCorrectAnim(bIncomplete, kfWeap.bAimingRifle); - animRate = - fireState.base.latestFireAnim.rate * fireState.base.latestFireRate; - // Play it - // 'LoopAnim' won't reset animation to initial position, - // so no need to check if we're already playing the same animation - if(fireState.base.latestFireAnim.bLoop) - weapon.LoopAnim(fireState.base.latestFireAnim.anim, animRate); - else - weapon.PlayAnim(fireState.base.latestFireAnim.anim, animRate); -} - -// NICETODO: don't update animations after certain point -// Updates the speed of current fire animation according to fire rate -function UpdateFireAnimation(){ - local bool fireRateChanged; - local name seqName; - local float oFrame, oRate; - local float animRate; - weapon.GetAnimParams(0, seqName, oFrame, oRate); - fireRateChanged = (fireState.base.latestFireRate != GetFireSpeed()); - // Update animation only if it's speed changed - // AND it's still the same animation, since otherwise we may interfer with - // what we shouldn't - if(fireRateChanged && fireState.base.latestFireAnim.anim == seqName){ - fireState.base.latestFireRate = GetFireSpeed(); - animRate = - fireState.base.latestFireAnim.rate * fireState.base.latestFireRate; - if(fireState.base.latestFireAnim.bLoop) - weapon.LoopAnim(seqName, animRate); - else{ - weapon.PlayAnim(seqName, animRate); - weapon.SetAnimFrame(oFrame); - } + else if(ThisModeNum == 1){ + currentContext.sourceWeapon.secondaryCharge -= Load; + currentContext.sourceWeapon.ServerReduceMag(currentContext.sourceWeapon.MagAmmoRemainingClient, Level.TimeSeconds, ThisModeNum); + currentContext.sourceWeapon.ServerSetSndCharge(currentContext.sourceWeapon.secondaryCharge); } } - -// Starts end animation for currently running looped fire animation; -// doesn't nothing if current animation isn't looped fire animation. -function FinishFireLoopAnimation(){ - local name seqName; - local float oFrame, oRate; - // Are we looping and does end animation even exist? - if(!fireState.base.latestFireAnim.bLoop) return; - if(fireState.base.latestFireAnim.animEnd == '') return; - // Was this animation initiated by us or something else? - // Bail if by something else. - weapon.GetAnimParams(0, seqName, oFrame, oRate); - if(seqName != fireState.base.latestFireAnim.anim) return; - weapon.PlayAnim(fireState.base.latestFireAnim.animEnd, 1.0, 0.1); -} - -function PlayFiringSound(){ - local bool bDoStereoSound; - local sound correctSound; - local float correctVolume; - local float randPitch; - - randPitch = FRand() * randomPitchAdjustAmt; - if(FRand() < 0.5) - randPitch *= -1.0; - if(stereoFireSound != none && kfWeap.instigator.IsLocallyControlled()) - bDoStereoSound = kfWeap.instigator.IsFirstPerson(); - if(bDoStereoSound){ - correctSound = stereoFireSound; - correctVolume = transientSoundVolume * 0.85; +function name GetCorrectAnim(bool bLoop, bool bAimed){ + local bool bIncomplete; + bIncomplete = Load < default.AmmoPerFire; + if(bLoop){ + if(bAimed){ + if(bIncomplete && Weapon.HasAnim(FireIncompleteLoopAimedAnim)) + return FireIncompleteLoopAimedAnim; + else + return FireLoopAimedAnim; + } + else{ + if(bIncomplete && Weapon.HasAnim(FireIncompleteLoopAnim)) + return FireIncompleteLoopAnim; + else + return FireLoopAnim; + } } else{ - correctSound = fireSound; - correctVolume = transientSoundVolume; + if(bAimed){ + if(bIncomplete && Weapon.HasAnim(FireIncompleteAimedAnim)) + return FireIncompleteAimedAnim; + else + return FireAimedAnim; + } + else{ + if(bIncomplete && Weapon.HasAnim(FireIncompleteAnim)) + return FireIncompleteAnim; + else + return FireAnim; + } } - weapon.PlayOwnedSound( correctSound, - SLOT_Interact, - correctVolume,, - transientSoundRadius, - 1.0 + randPitch, - false); + return FireAnim; } - -function NicePlayFiring(bool bIncomplete){ - if(kfWeap == none || weapon.mesh == none) return; - if(kfWeap.instigator == none) return; - PlayFiringAnim(bIncomplete); - PlayFiringSound(); - ClientPlayForceFeedback(fireForce); -} - -// How reoil multiplier should be modified. -// Added as a place for skills to take effect. -simulated function float ModRecoilMultiplier(float recoilMult){ - local int stationarySeconds; - local bool bSkillRecoilReset; - local NicePlayerController nicePlayer; - local NiceHumanPawn nicePawn; - - if(instigator != none){ - nicePlayer = NicePlayerController(instigator.controller); - nicePawn = NiceHumanPawn(instigator); +function PlayFiring(){ + local float RandPitch; + if(Weapon.Mesh != none){ + if(FireCount > 0){ + if(KFWeap.bAimingRifle){ + if(Weapon.HasAnim(FireLoopAimedAnim)) + Weapon.PlayAnim(GetCorrectAnim(true, true), FireLoopAnimRate, 0.0); + else if(Weapon.HasAnim(FireAimedAnim)) + Weapon.PlayAnim(GetCorrectAnim(false, true), FireAnimRate, TweenTime); + else + Weapon.PlayAnim(GetCorrectAnim(false, false), FireAnimRate, TweenTime); + } + else{ + if(Weapon.HasAnim(FireLoopAnim)) + Weapon.PlayAnim(GetCorrectAnim(true, false), FireLoopAnimRate, 0.0); + else + Weapon.PlayAnim(GetCorrectAnim(false, false), FireAnimRate, TweenTime); + } + } + else{ + if(KFWeap.bAimingRifle){ + if(Weapon.HasAnim(FireAimedAnim)) + Weapon.PlayAnim(GetCorrectAnim(false, true), FireAnimRate, TweenTime); + else + Weapon.PlayAnim(GetCorrectAnim(false, false), FireAnimRate, TweenTime); + } + else + Weapon.PlayAnim(GetCorrectAnim(false, false), FireAnimRate, TweenTime); + } } - if(nicePawn == none || nicePlayer == none || nicePlayer.bFreeCamera) - return 0.0; - - bSkillRecoilReset = (nicePlayer.IsZedTimeActive() - && class'NiceVeterancyTypes'.static. - hasSkill(nicePlayer, class'NiceSkillEnforcerZEDBarrage')); - if(bSkillRecoilReset) - recoilMult = 0.0; - - if(nicePawn.stationaryTime > 0.0 - && class'NiceVeterancyTypes'.static. - hasSkill(nicePlayer, class'NiceSkillHeavyStablePosition')){ - stationarySeconds = Ceil(2 * nicePawn.stationaryTime) - 1; - recoilMult *= 1.0 - stationarySeconds * - class'NiceSkillHeavyStablePosition'.default.recoilDampeningBonus; - recoilMult = FMax(0.0, recoilMult); + if(Weapon.Instigator != none && Weapon.Instigator.IsLocallyControlled() && Weapon.Instigator.IsFirstPerson() && StereoFireSound != none){ + if(bRandomPitchFireSound){ + RandPitch = FRand() * RandomPitchAdjustAmt; + if(FRand() < 0.5) + RandPitch *= -1.0; + } + Weapon.PlayOwnedSound(StereoFireSound,SLOT_Interact,TransientSoundVolume * 0.85,,TransientSoundRadius,(1.0 + RandPitch),false); } - return recoilMult; -} - -// Mods recoil based on player's current movement. -// Treats falling in low gravity differently from regular falling -// to reduce recoil increase effects. -simulated function Rotator AdjustRecoilForVelocity(Rotator recoilRotation){ - local Vector adjustedVelocity; - local float adjustedSpeed; - local float recoilIncrement; - local bool bLowGrav; - if(weapon == none) return recoilRotation; - if(recoilVelocityScale <= 0) return recoilRotation; - - if(weapon.owner != none && weapon.owner.physics == PHYS_Falling) - bLowGrav = weapon.owner.PhysicsVolume.gravity.Z > - class'PhysicsVolume'.default.gravity.Z; - // Treat low gravity as a special case - if(bLowGrav){ - adjustedVelocity = weapon.owner.velocity; - // Ignore Z velocity in low grav so we don't get massive recoil - adjustedVelocity.Z = 0; - adjustedSpeed = VSize(adjustedVelocity); - // Reduce the falling recoil in low grav - recoilIncrement = adjustedSpeed * recoilVelocityScale * 0.5; + else{ + if(bRandomPitchFireSound){ + RandPitch = FRand() * RandomPitchAdjustAmt; + if(FRand() < 0.5) + RandPitch *= -1.0; + } + Weapon.PlayOwnedSound(FireSound,SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,(1.0 + RandPitch),false); } - else - recoilIncrement = VSize(weapon.owner.velocity) * recoilVelocityScale; - recoilRotation.pitch += recoilIncrement; - recoilRotation.yaw += recoilIncrement; - return recoilRotation; + ClientPlayForceFeedback(FireForce); + if(!currentContext.bIsBursting) + FireCount ++; } +// Handle setting new recoil +simulated function HandleRecoil(float Rec){ + local int stationarySeconds; + local rotator NewRecoilRotation; + local NicePlayerController nicePlayer; + local NiceHumanPawn nicePawn; + local vector AdjustedVelocity; + local float AdjustedSpeed; + if(Instigator != none){ + nicePlayer = NicePlayerController(Instigator.Controller); + nicePawn = NiceHumanPawn(Instigator); + } + if(nicePlayer == none || nicePawn == none) + return; + if(bResetRecoil || nicePlayer.IsZedTimeActive() && class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, class'NiceSkillEnforcerZEDBarrage')){ + Rec = 0.0; + bResetRecoil = false; + } + if(nicePawn.stationaryTime > 0.0 && class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, class'NiceSkillHeavyStablePosition')){ + stationarySeconds = Ceil(2 * nicePawn.stationaryTime) - 1; + Rec *= FMax(0.0, 1.0 - (stationarySeconds * class'NiceSkillHeavyStablePosition'.default.recoilDampeningBonus)); + } + if(!nicePlayer.bFreeCamera){ + if(Weapon.GetFireMode(ThisModeNum).bIsFiring || currentContext.bIsBursting){ + NewRecoilRotation.Pitch = RandRange(maxVerticalRecoilAngle * 0.5, maxVerticalRecoilAngle); + NewRecoilRotation.Yaw = RandRange(maxHorizontalRecoilAngle * 0.5, maxHorizontalRecoilAngle); -// Rendomize recoil and apply skills, movement, health and fire rate -// modifiers to it -simulated function HandleRecoil(float recoilMult){ - local float recoilAngle; - local Rotator newRecoilRotation; - local NicePlayerController nicePlayer; - if(weapon == none) return; - if(instigator != none) - nicePlayer = NicePlayerController(instigator.controller); - if(nicePlayer == none || nicePlayer.bFreeCamera) return; - // Skills recoil mod - recoilMult = ModRecoilMultiplier(recoilMult); + if(!bRecoilRightOnly && Rand(2) == 1) + NewRecoilRotation.Yaw *= -1; - // Apply flag reset - if(fireState.base.bResetRecoil) - recoilMult = 0.0; - fireState.base.bResetRecoil = false; + if(RecoilVelocityScale > 0){ + if(Weapon.Owner != none && Weapon.Owner.Physics == PHYS_Falling && + Weapon.Owner.PhysicsVolume.Gravity.Z > class'PhysicsVolume'.default.Gravity.Z){ + AdjustedVelocity = Weapon.Owner.Velocity; + // Ignore Z velocity in low grav so we don't get massive recoil + AdjustedVelocity.Z = 0; + AdjustedSpeed = VSize(AdjustedVelocity); - // Generate random values for a recoil - // (we now randomize only horizontal recoil) - recoilAngle = GetFireType().rebound.recoilVertical; - newRecoilRotation.pitch = recoilAngle; - recoilAngle = GetFireType().rebound.recoilHorizontal; - newRecoilRotation.yaw = RandRange(recoilAngle * 0.5, recoilAngle); - if(Rand(2) == 1) - newRecoilRotation.yaw *= -1; + // Reduce the falling recoil in low grav + NewRecoilRotation.Pitch += (AdjustedSpeed * RecoilVelocityScale * 0.5); + NewRecoilRotation.Yaw += (AdjustedSpeed * RecoilVelocityScale * 0.5); + } + else{ + NewRecoilRotation.Pitch += (VSize(Weapon.Owner.Velocity) * RecoilVelocityScale); + NewRecoilRotation.Yaw += (VSize(Weapon.Owner.Velocity) * RecoilVelocityScale); + } + } - // Further increase it due to movement and low health - newRecoilRotation = AdjustRecoilForVelocity(newRecoilRotation); - newRecoilRotation.pitch += (instigator.healthMax / instigator.health * 5); - newRecoilRotation.yaw += (instigator.healthMax / instigator.health * 5); - newRecoilRotation *= recoilMult; + NewRecoilRotation.Pitch += (Instigator.HealthMax / Instigator.Health * 5); + NewRecoilRotation.Yaw += (Instigator.HealthMax / Instigator.Health * 5); + NewRecoilRotation *= Rec; - // Scale it to the fire rate; - // calibrating recoil speed seems rather meaningless, - // so just set it to constant - nicePlayer.SetRecoil(newRecoilRotation, 0.1 * level.timeDilation); + if(default.FireRate <= 0) + nicePlayer.SetRecoil(NewRecoilRotation, RecoilRate); + else + nicePlayer.SetRecoil(NewRecoilRotation, RecoilRate * (FireRate / default.FireRate)); + } + } } - -// Finds appropriate point to spawn a bullet at, taking in the consideration -// spawn offset setting and whether or not weapon is centered -// (any weapon is centered when aiming down sights). -// -// There might be a problem if bullet spawn point is too far, since then enemy -// can fit between us and spawn point, making it impossible to hit it; -// in that case function attempts to find some other point between us and enemy -function Vector FindBulletSpawnPoint(){ - local Vector bulletSpawn; - local Vector eyesPoint; - local Vector X, Y, Z; - local Vector hitLocation, normal, offset; +function DoFireEffect(){ + local bool bIsShotgunBullet, bForceComplexTraj; + local bool bPinpoint; + local Vector StartProj, StartTrace, X,Y,Z; + local Rotator R, Aim; + local Vector HitLocation, HitNormal; local Actor other; - if(instigator == none || weapon == none || kfWeap == none) - return Vect(0,0,0); - - eyesPoint = instigator.location + instigator.EyePosition(); - offset = GetFireType().movement.spawnOffset; - // Spawn point candidate ('bulletSpawn') - weapon.GetViewAxes(X, Y, Z); - bulletSpawn = eyesPoint + X * offset.X; - if(!kfWeap.bAimingRifle && !weapon.WeaponCentered()) - bulletSpawn = bulletSpawn + weapon.hand * Y * offset.Y + Z * offset.Z; - // Try tracing to see if there's something between our eyes ('eyePoint') - // and our spawn point candidate ('bulletSpawn'); - // if there is - spawn bullet at the first point - // where we hit it ('hitLocation') - other = weapon.Trace(hitLocation, normal, bulletSpawn, eyesPoint, false); + local int p; + local float activeSpread; + local ESpreadStyle activeSpreadStyle; + local int SpawnCount; + local float theta; + local NicePlayerController nicePlayer; + nicePlayer = NicePlayerController(Instigator.Controller); + Instigator.MakeNoise(1.0); + Weapon.GetViewAxes(X, Y, Z); + StartTrace = Instigator.Location + Instigator.EyePosition(); + StartProj = StartTrace + X * ProjSpawnOffset.X; + if(!Weapon.WeaponCentered() && !KFWeap.bAimingRifle) + StartProj = StartProj + Weapon.Hand * Y * ProjSpawnOffset.Y + Z * ProjSpawnOffset.Z; + other = Weapon.Trace(HitLocation, HitNormal, StartProj, StartTrace, false); + activeSpread = fireShots[currentShot].spread; + if(class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, class'NiceSkillEnforcerBombard')){ + bPinpoint = true; + activeSpread *= class'NiceSkillEnforcerBombard'.default.spreadMult; + } + bIsShotgunBullet = ClassIsChildOf(fireShots[currentShot].bulletClass, class'NiceShotgunPellet'); + if( bIsShotgunBullet && weapon.class != class'NicePack.NiceSpas' && weapon.class != class'NiceNailGun' + && class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, class'NiceSkillSupportSlugs') ) + activeSpread = 0.0; + if(bIsShotgunBullet && activeSpread <= 0.0 && !bPinpoint) + bForceComplexTraj = true; if(other != none) - return hitLocation; - // Otherwise - return our previous candiate - return bulletSpawn; + StartProj = HitLocation; + Aim = AdjustAim(StartProj, AimError); + SpawnCount = Max(0, fireShots[currentShot].projPerFire * int(Load)); + if(class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, class'NiceSkillSupportZEDBulletStorm') && nicePlayer.IsZedTimeActive()) + SpawnCount *= class'NiceSkillSupportZEDBulletStorm'.default.projCountMult; + activeSpreadStyle = fireShots[currentShot].spreadStyle; + DoTraceHack(StartProj, Aim); + currentContext.bHipfire = false; + if(currentContext.sourceWeapon != none && !currentContext.sourceWeapon.bAimingRifle + && !currentContext.sourceWeapon.bZoomingIn && !currentContext.sourceWeapon.bZoomingOut + && !currentContext.sourceWeapon.bFastZoomOut) + currentContext.bHipfire = true; + switch(activeSpreadStyle){ + case SS_Random: + X = Vector(Aim); + for(p = 0; p < SpawnCount;p ++){ + if(p > 0 || !bPinpoint){ + R.Yaw = activeSpread * (FRand()-0.5); + R.Pitch = activeSpread * (FRand()-0.5); + R.Roll = activeSpread * (FRand()-0.5); + } + class'NiceProjectileSpawner'.static.MakeProjectile(StartProj, Rotator(X >> R), fireShots[currentShot], currentContext, bForceComplexTraj); + } + break; + case SS_Line: + X = Vector(Aim); + for(p = 0; p < SpawnCount;p ++){ + if(p > 0 || !bPinpoint){ + theta = activeSpread * PI/32768 * (p - float(SpawnCount-1)/2.0); + X.X = cos(theta); + X.Y = sin(theta); + X.Z = 0.0; + } + class'NiceProjectileSpawner'.static.MakeProjectile(StartProj, Rotator(X >> Aim), fireShots[currentShot], currentContext, bForceComplexTraj); + } + break; + case SS_None: + default: + for(p = 0; p < SpawnCount;p ++) + class'NiceProjectileSpawner'.static.MakeProjectile(StartProj, Aim, fireShots[currentShot], currentContext, bForceComplexTraj); + } + if(Instigator != none && Instigator.Role == Role_AUTHORITY){ + if(Instigator.Physics != PHYS_Falling) + Instigator.AddVelocity(KickMomentum >> Instigator.GetViewRotation()); + else if(Instigator.Physics == PHYS_Falling && Instigator.PhysicsVolume.Gravity.Z > class'PhysicsVolume'.default.Gravity.Z) + Instigator.AddVelocity((KickMomentum * LowGravKickMomentumScale) >> Instigator.GetViewRotation()); + } } - -// Applies kickback as required by specified NWFireType. -function DoKickback(NWFireType fireType){ - local bool bLowGravity; - local Vector kickback; - if(instigator == none || instigator.role < Role_AUTHORITY) return; - - kickback = fireType.rebound.kickMomentum; - bLowGravity = instigator.physicsVolume.gravity.Z > - class'PhysicsVolume'.default.gravity.Z; - if(instigator.physics == PHYS_Falling && bLowGravity) - kickback *= fireType.rebound.lowGravKickMomentumScale; - instigator.AddVelocity(kickback >> instigator.GetViewRotation()); +simulated function float TraceZed(out NiceMonster tracedZed, optional out Vector hitLoc, optional out Vector hitNorm, + optional float hsMultiplier){ + local Vector Start, End, hitLocation, HitNormal; + local Rotator aim; + local Actor tracedActor; + if(hsMultiplier <= 0.0) + hsMultiplier = 1.0; + MaxRange(); + Start = Instigator.Location + Instigator.EyePosition(); + aim = AdjustAim(Start, AimError); + End = Start + TraceRange * Vector(aim); + tracedActor = Instigator.Trace(hitLocation, hitNormal, End, Start); + hitLoc = hitLocation; + hitNorm = hitNormal; + tracedZed = NiceMonster(tracedActor); + if(tracedZed == none && ExtendedZCollision(tracedActor) != none && tracedActor.owner != none) + tracedZed = NiceMonster(tracedActor.owner); + if(tracedZed != none) + return tracedZed.IsHeadshotClient(hitLocation, Vector(aim), tracedZed.clientHeadshotScale * hsMultiplier); + return 0; } - -function DoNiceFireEffect(int ammoToFire){ - local Vector bulletSpawnPoint; - local Rotator aim; - local NWFireType fireType; - local int bulletsToSpawn; - if(instigator == none) return; - - // Find proper projectile spawn point - fireType = GetFireType(); - bulletSpawnPoint = FindBulletSpawnPoint(); - aim = AdjustAim(bulletSpawnPoint, aimError); - bulletsToSpawn = ammoToFire * fireType.weapon.bulletsAmount; - // Fire actual bullets - class'NiceBulletSpawner'.static.FireBullets(bulletsToSpawn, - bulletSpawnPoint, aim, - fireType.movement.spread, - fireType, fireState); - DoKickback(fireType); +simulated function TraceWall(out Actor tracedActor, optional out Vector hitLoc, optional out Vector hitNorm){ + local Vector Start, End, hitLocation, hitNormal; + local Rotator aim; + MaxRange(); + Start = Instigator.Location + Instigator.EyePosition(); + aim = AdjustAim(Start, AimError); + End = Start + TraceRange * Vector(Aim); + tracedActor = Instigator.Trace(hitLocation, hitNormal, End, Start); + hitLoc = hitLocation; + hitNorm = hitNormal; + if(KFPawn(tracedActor) != none && ExtendedZCollision(tracedActor) != none) + tracedActor = none; } - -// NICETODO: redo 'TraceZed' and 'TraceWall' - -// Hack to trigger buttons on ScrN's testing grounds -function DoTraceHack(Vector start, Rotator dir){ +simulated function NiceReplicationInfo GetNiceRI(){ + if(Instigator != none && NicePlayerController(Instigator.Controller) != none) + return NicePlayerController(Instigator.Controller).NiceRI; + return none; +} +function DoTraceHack(Vector Start, Rotator Dir){ local Actor other; - local array hitPoints; - local Vector dirVector, end; - local Vector hitLocation, hitNormal; - - dirVector = Vector(dir); - end = start + traceRange * dirVector; - other = Instigator.HitPointTrace( hitLocation, hitNormal, - end, hitPoints, start,, 1); + local array HitPoints; + local Vector X, End, HitLocation, HitNormal; + X = Vector(Dir); + End = Start + TraceRange * X; + other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1); if(Trigger(other) != none) - other.TakeDamage(35, instigator, hitLocation, dirVector, damageType); + other.TakeDamage(35, Instigator, HitLocation, Momentum * X, DamageType); +} +// All weapons should have 100% accuracy anyway +simulated function AccuracyUpdate(float Velocity){} +// This function is called when 'FireRate', 'FireAnimRate' or 'ReloadAnimRate' need to be updated +simulated function UpdateFireSpeed(){ + local float fireSpeedMod; + fireSpeedMod = GetFireSpeed(); + if(NiceSingle(Weapon) != none || NiceDualies(Weapon) != none) + fireSpeedMod /= (Level.TimeDilation / 1.1); + fireSpeedMod *= 1.0 + 1.1 * (zedTimeFireSpeedUp - 1.0) * (1.1 - Level.TimeDilation); + FireRate = default.FireRate / fireSpeedMod; + FireAnimRate = default.FireAnimRate * fireSpeedMod; + ReloadAnimRate = default.ReloadAnimRate * fireSpeedMod; +} +// This function is called when next fire time needs to be updated +simulated function float UpdateNextFireTime(float fireTimeVar){ + local float burstSlowDown; + local NiceHumanPawn nicePawn; + local class niceVet; + nicePawn = NiceHumanPawn(Instigator); + if(nicePawn != none) + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.PlayerReplicationInfo); + fireTimeVar = FMax(fireTimeVar, Level.TimeSeconds); + if(bFireOnRelease){ + if(bIsFiring) + fireTimeVar += MaxHoldTime + FireRate; + else + fireTimeVar = Level.TimeSeconds + FireRate; + } + else{ + if(currentContext.bIsBursting && GetBurstLength() > 1){ + if( niceVet != none + && (bBetterBurst || + niceVet.static.hasSkill(NicePlayerController(nicePawn.Controller), class'NiceSkillCommandoExplosivePower')) + ) + burstSlowDown = 1.0; + else + burstSlowDown = 1.3; + fireTimeVar += FireRate * burstSlowDown; + } + else + fireTimeVar += FireRate; + fireTimeVar = FMax(fireTimeVar, Level.TimeSeconds); + } + return fireTimeVar; } defaultproperties { - aimerror=0.0 - /*ProjPerFire=1 - ProjectileSpeed=1524.000000 - MaxBurstLength=3 - bulletClass=Class'NicePack.NiceBullet' - contBonus=1.200000 - maxBonusContLenght=1 - AmmoPerFire=1 - bRecoilRightOnly=false - fireState.base.sourceWeapon=none*/ -} \ No newline at end of file + zedTimeFireSpeedUp=1.000000 + ProjPerFire=1 + ProjectileSpeed=1524.000000 + MaxBurstLength=3 + bulletClass=Class'NicePack.NiceBullet' + contBonus=1.200000 + contBonusReset=True + maxBonusContLenght=1 + AmmoPerFire=1 +} diff --git a/sources/Weapons/NiceProjectileSpawner.uc b/sources/Weapons/NiceProjectileSpawner.uc new file mode 100644 index 0000000..05dd281 --- /dev/null +++ b/sources/Weapons/NiceProjectileSpawner.uc @@ -0,0 +1,167 @@ +class NiceProjectileSpawner extends Actor + dependson(NiceBullet); +// NICETODO: use flags correctly +static function MakeProjectile(Vector start, Rotator dir, NiceFire.ShotType shotParams, NiceFire.FireModeContext fireContext, optional bool bForceComplexTraj, + optional bool bDuplReal, optional bool bSkipGhosts){ + local int i; + local NicePack niceMut; + niceMut = class'NicePack'.static.Myself(fireContext.Instigator.Level); + if(niceMut == none) + return; + if(fireContext.Instigator.Role < ROLE_Authority || bDuplReal) + SpawnProjectile(Start, Dir, shotParams, fireContext, false, bForceComplexTraj); + if(fireContext.Instigator.Role == ROLE_Authority && niceMut != none && !bSkipGhosts){ + for(i = 0;i < niceMut.playersList.Length;i ++){ + if(niceMut.playersList[i] != fireContext.Instigator.Controller) + niceMut.playersList[i].ClientSpawnGhostProjectile(start, dir.pitch, dir.yaw, dir.roll, shotParams, fireContext, bForceComplexTraj); + } + } +} +static function StickProjectile(KFHumanPawn instigator, Actor base, name bone, Vector shift, Rotator direction, + NiceBullet.ExplosionData expData, optional bool bDuplReal, optional bool bSkipGhosts){ + local int i; + local NicePack niceMut; + niceMut = class'NicePack'.static.Myself(expData.Instigator.Level); + if(niceMut == none) + return; + niceMut.stuckCounter ++; + if(expData.Instigator.Role < ROLE_Authority) + SpawnStuckProjectile(instigator, base, bone, shift, direction, expData, false, niceMut.stuckCounter); + if(expData.Instigator.Role == ROLE_Authority && niceMut != none){ + for(i = 0;i < niceMut.playersList.Length;i ++){ + if( (niceMut.playersList[i] != expData.Instigator.Controller && !bSkipGhosts) + || (niceMut.playersList[i] == expData.Instigator.Controller && bDuplReal) ) + niceMut.playersList[i].ClientStickGhostProjectile(instigator, base, bone, shift, direction, expData, + niceMut.stuckCounter); + } + } +} +static function NiceBullet SpawnProjectile(Vector Start, Rotator Dir, NiceFire.ShotType shotParams, NiceFire.FireModeContext fireContext, optional bool bIsGhost, optional bool bForceComplexTraj){ + local Actor other; + local NiceBullet niceProj; + local Vector HitLocation, HitNormal; + local NicePlayerController nicePlayer; + local class niceVet; + // No class - no projectile + if(shotParams.bulletClass == none) + return none; + // Try to spawn + if(fireContext.Instigator != none) + niceProj = fireContext.Instigator.Spawn(shotParams.bulletClass,,, Start, Dir); + // Try harder + if(niceProj == none && fireContext.Instigator != none){ + other = fireContext.Instigator.Trace(HitLocation, HitNormal, Start, fireContext.Instigator.Location + fireContext.Instigator.EyePosition(), false, Vect(0,0,1)); + if(other != none) + Start = HitLocation; + niceProj = fireContext.Instigator.Spawn(shotParams.bulletClass,,, Start, Dir); + } + // Give up if failed after these two attempts + if(niceProj == none) + return none; + niceProj.Renew(); + // Initialize projectile + if(fireContext.Instigator != none) + nicePlayer = NicePlayerController(fireContext.Instigator.Controller); + if(nicePlayer != none) + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePlayer.PlayerReplicationInfo); + niceProj.bGhost = bIsGhost; + // Fill-up data about what damage should projectile deal + niceProj.charDamage = shotParams.damage; + if(niceVet != none && fireContext.bIsBursting && niceVet.static.hasSkill(nicePlayer, class'NiceSkillCommandoExplosivePower')) + niceProj.charDamage *= class'NiceSkillCommandoExplosivePower'.default.dmgMod; + if(niceVet != none && niceVet.static.hasSkill(nicePlayer, class'NiceSkillSupportZEDBulletStorm') && nicePlayer.IsZedTimeActive()) + niceProj.charDamage = shotParams.damage * class'NiceSkillSupportZEDBulletStorm'.default.damageCut; + niceProj.charOrigDamage = niceProj.charDamage; + niceProj.charDamageType = shotParams.shotDamageType; + niceProj.charExplosionDamageType = shotParams.explosionDamageType; + niceProj.charExplosionDamage = shotParams.explosionDamage; + niceProj.charExplosionRadius = shotParams.explosionRadius; + niceProj.charExplosionExponent = shotParams.explosionExponent; + niceProj.charExplosionMomentum = shotParams.explosionMomentum; + niceProj.charFuseTime = shotParams.fuseTime; + niceProj.charExplodeOnFuse = shotParams.explodeOnFuse; + niceProj.charExplodeOnPawnHit = shotParams.explodeOnPawnHit; + niceProj.charExplodeOnWallHit = shotParams.explodeOnWallHit; + niceProj.charMomentumTransfer = shotParams.momentum; + niceProj.charWasHipFired = fireContext.bHipfire; + niceProj.charCausePain = shotParams.bCausePain; + niceProj.lockonTime = fireContext.lockonTime; + niceProj.lockonZed = fireContext.lockonZed; + niceProj.instigator = fireContext.instigator; + niceProj.sourceWeapon = fireContext.sourceWeapon; + niceProj.charContiniousBonus = fireContext.continiousBonus; + // Fill-up data about at what speed should projectile travel + niceProj.movementSpeed = shotParams.projSpeed; + if(niceVet != none && niceVet.static.hasSkill(nicePlayer, class'NiceSkillDemoOnperk')) + niceProj.movementSpeed *= class'NiceSkillDemoOnperk'.default.speedBonus; + niceProj.movementDirection = Vector(niceProj.rotation); + niceProj.charAffectedByScream = shotParams.projAffectedByScream; + niceProj.charIsSticky = shotParams.bShouldStick; + niceProj.nicePlayer = nicePlayer; + if(niceVet != none && niceVet.static.hasSkill(nicePlayer, class'NiceSkillDemoVolatile')){ + niceProj.charExplosionRadius *= class'NiceSkillDemoVolatile'.default.explRangeMult; + niceProj.charExplosionExponent *= class'NiceSkillDemoVolatile'.default.falloffMult; + niceProj.charMinExplosionDist *= class'NiceSkillDemoVolatile'.default.safeDistanceMult; + } + if(niceVet != none && niceVet.static.hasSkill(nicePlayer, class'NiceSkillDemoZEDFullBlast') && nicePlayer.IsZedTimeActive()){ + niceProj.charExplosionRadius *= class'NiceSkillDemoZEDFullBlast'.default.explRadiusMult; + niceProj.charExplosionExponent = 0.0; + } + if(bForceComplexTraj) + niceProj.bDisableComplexMovement = false; + if(niceProj.Instigator != none && NicePlayerController(niceProj.Instigator.Controller) != none) + niceProj.niceRI = NicePlayerController(niceProj.Instigator.Controller).NiceRI; + // And some leftovers + //niceProj.bShouldBounce = shotParams.bShouldBounce; + niceProj.bInitFinished = true; + return niceProj; +} +static function SpawnStuckProjectile(KFHumanPawn instigator, Actor base, name bone, Vector shift, Rotator direction, + NiceBullet.ExplosionData expData, bool bIsGhost, int stuckID){ + local Pawn justPawn; + local NiceFire.ShotType shotParams; + local NiceFire.FireModeContext fireContext; + local NiceBullet spawnedBullet; + local NicePlayerController nicePlayer; + nicePlayer = NicePlayerController(instigator.Controller); + if(base == none || nicePlayer == none) + return; + justPawn = Pawn(base); + fireContext.instigator = NiceHumanPawn(instigator); + fireContext.sourceWeapon = expData.sourceWeapon; + shotParams.bulletClass = expData.bulletClass; + shotParams.explosionDamageType = expData.explosionDamageType; + shotParams.explosionDamage = expData.explosionDamage; + shotParams.explosionRadius = expData.explosionRadius; + shotParams.explosionExponent = expData.explosionExponent; + shotParams.explosionMomentum = expData.explosionMomentum; + shotParams.fuseTime = expData.fuseTime; + shotParams.explodeOnFuse = expData.explodeOnFuse; + shotParams.projAffectedByScream = expData.affectedByScream; + spawnedBullet = SpawnProjectile(base.location, direction, shotParams, fireContext, bIsGhost); + if(spawnedBullet == none) + return; + spawnedBullet.stuckID = stuckID; + spawnedBullet.bStuck = true; + nicePlayer.RegisterStuckBullet(spawnedBullet); + if(justPawn != none){ + spawnedBullet.bStuckToHead = expData.stuckToHead; + spawnedBullet.SetBase(base); + justPawn.AttachToBone(spawnedBullet, bone); + spawnedBullet.SetRelativeLocation(shift); + spawnedBullet.SetRelativeRotation(Rotator(Vector(direction) << justPawn.GetBoneRotation(bone, 0))); + spawnedBullet.bUseBone = true; + spawnedBullet.stuckBone = bone; + } + else{ + spawnedBullet.SetBase(base); + spawnedBullet.SetRelativeLocation(shift); + } +} + +defaultproperties +{ + bHidden=True + RemoteRole=ROLE_SimulatedProxy + LifeSpan=1.000000 +} diff --git a/sources/Weapons/NiceWeapon.uc b/sources/Weapons/NiceWeapon.uc index b90dc3e..67e7a41 100644 --- a/sources/Weapons/NiceWeapon.uc +++ b/sources/Weapons/NiceWeapon.uc @@ -30,13 +30,9 @@ class NiceWeapon extends KFWeapon dependson(NicePlainData) abstract; - var float lastHeadshotTime; -var float ardourTimeout; -var int quickHeadshots; - +var float stdFireRate; var float holsteredCompletition; - var bool bLoadResourcesAsMaterial; // Force to load all graphic resources as just materials var bool bUseFlashlightToToggle; var int MagAmmoRemainingClient; // Tracks magazine size on client @@ -45,11 +41,9 @@ var float LastMagUpdateFromClient; // Time of the most recent magazine var float ReloadDeadLine; // Time, after which server should speed-up reload var float lastRecordedReloadRate; var float recordedZoomTime; - // Weapon secondary charge counter var bool bShowSecondaryCharge; var int secondaryCharge; - // HUD icons changes var bool bChangeClipIcon; var bool bChangeBulletsIcon; @@ -57,7 +51,6 @@ var bool bChangeSecondaryIcon; var Texture hudClipTexture; var Texture hudBulletsTexture; var Texture hudSecondaryTexture; - // Laser-related variables var bool bLaserActive; // The laser site is active var bool bAllowFreeDot; // Allows dot from the laser to freely follow movements of the bone (the same way as it usually does during reload) @@ -74,7 +67,6 @@ var ScrnLocalLaserDot LaserDot; var ScrnLocalLaserDot altLaserDot; var name LaserAttachmentBone; var name altLaserAttachmentBone; - // Prossible reasons for reload cancel enum ERelCancelCause{ CANCEL_FIRE, @@ -83,9 +75,9 @@ enum ERelCancelCause{ CANCEL_COOKEDNADE, CANCEL_SWITCH, CANCEL_PASSIVESWITCH, - CANCEL_AIM + CANCEL_AIM, + CANCEL_RELOAD }; - // Possible reload types for main reload (forced by 'ReloadMeNow()' function) // Note that weapons with two fire-modes can have 'RTYPE_MAG' or 'RTYPE_SINGLE' for main reload and still use auto reload (e.g. for secondary fire of M4 203) enum ERelType{ @@ -94,7 +86,6 @@ enum ERelType{ RTYPE_AUTO // Means that auto reload is a main reload for this weapon (hunting shotgun and 1-shot weapons such as M79, M99, xbow, etc) }; var ERelType reloadType; - // Possible stages of a magazine reload enum ERelStage{ RSTAGE_NONE, // Weapon isn't being reloaded @@ -103,7 +94,7 @@ enum ERelStage{ RSTAGE_POSTREL, // Magazine was replaced, reload can be safely interrupted, but post-reload stage (weapon charging) will have to be redone RSTAGE_TRASH // Non-functioning frames of animation after inserting magazine and charging weapon }; - +var bool bServerFiredLastShot; var bool bGiveObsessiveBonus; // Magazine reload-related variables var float reloadPreEndFrame; // Frame number, after which magazine is removed, so interrupting reload will result in zero magazine ammo @@ -126,12 +117,10 @@ struct EventRecord{ }; var array relEvents; var float lastEventCheckFrame; - // Single reload-related variables var int subReloadStage; // Substage is part of animation between two consecutive shell loadings; they're numbered starting from zero var bool alwaysPlayAnimEnd; // Should we always force playing end of the reload animation? var array reloadStages; // Array of frame numbers that indicate moments when ammo should be added - // Auto reload-related structure, enum and variables // Auto reload activates by itself whenever appropriate animation starts to play; structure object below must be provided for each such animation struct AutoReloadAnimDesc{ @@ -157,7 +146,6 @@ var bool bAutoReloadPaused; // This is used to 'pause' auto relo var float autoReloadPauseFrame; // Frame at which current pause began var bool bAutoReloadRateApplied; // Flag that remembers whether or not we've already applied reload speed up for current auto reload (to avoid constant animation's speed updates) var float autoReloadSpeedModifier; - // Acrtive reload-related variables // Active reload state enum EActiveReloadState{ @@ -170,970 +158,257 @@ var float activeSlowdown; // How much should we slow down the var float activeSpeedup; // How much should we speedup active reload if player succeeded? var EActiveReloadState activeReloadState; // Current state of active reload, only applicable during reload var float activeWindow; // How long (0.0 is zero long, 1.0 is all animation) must be a time window during which you can activate active reload - -enum EVariantSwapState{ - SWAP_NONE, - SWAP_PUTDOWN, - SWAP_BRINGUP -}; -var EVariantSwapState variantSwapState; -var float variantSwapCountdown; -var float variantSwapTime; -var string pendingVariant; - -// We'll use this structure to handle different types of ammo for nice weapons, -// since I have no desire to mess with standart classes -// (but standart ammo system will be used for handling total ammo left) -// -// Describes general ammo type bought for all variants of the weapons; -// Which fire mode should be used is determined by a combination of -// 'NiceAmmoType' and 'WeaponVariant' via filling array of 'NiceAmmoEffects' -// structures in variant -struct NiceAmmoType{ - // Name of this ammo type - var string ID; - // How much more 'ammo space' this ammo type take, compared to the default; - // If weapon can have 100 default ammo (mult. 1.0), then - // spaceMult=2.0 means you can have at most 50 of that ammo - // spaceMult=4.0 means you can have 25 of it. - // Using values blow 1.0 isn't recommended. - var float spaceMult; - // How much ammo of that typeplayer currently has. - var int amount; -}; - -// Each instance of this structure should belong to a variant, - -// then it links ammo type to appropriate fire type (both given by their index) -struct NiceAmmoEffects{ - var string ammoID; - var string fireTypeID; -}; -// Array of all available ammo type for this weapon; -// Those that player doesn't have are just set to zero. -var array availableAmmoTypes; -// Additional array for secondary ammo (if used in weapon) -var array availableAmmoTypesSecondary; - -// Describes the kind of ammo that (should be) loaded into the gun; -// these variables are put into a separate structure for multiple fire modes & -// easier adaptation for dualies. -struct GunAmmoState{ - // Reference to a fire object, corresponding to this state - var NiceFire linkedFire; - // Ammo type that would be loaded on the next reload - var string currentAmmoType; - // Stack of loaded ammo. - // - For magazine-based or one-shot weapons it'll contain 1 value when - // cocked/loaded and 0 otherwise; - // - For weapons that can be loaded shell-by-shell it contains values for every - // loaded bullet. - var array loadedAmmoStack; - var int stackPointer; - // Duplicates current last element of the stack; - // Necessary to replicate information about current bullet to the server. - var string ammoStackLast; -}; -// Ammo states for main and secondary fire -var GunAmmoState ammoState[2]; - -struct FireAnim{ - var name anim; - var name animEnd; - var float rate; - var bool bLoop; -}; - -struct FireAnimationSet{ - // Fire animations for different occasions - var FireAnim incomplete; - var FireAnim incompleteAimed; - var FireAnim aimed; - var FireAnim justFire; -}; - -// Sounds that weapon uses; -// separate structure is needed because wewant to set them both -// globally for a model and (optionally) on-per-skin basis -struct WeaponSoundSet{ - // Selection sound - var string selectSoundRef; - var Sound selectSound; - // Fire sounds for both primary and alt fire - var string fireSoundRefs[2]; - var Sound fireSounds[2]; - // Stereo fire sounds for both primary (0) and alt fire (1) - var string stereoFireSoundRefs[2]; - var Sound stereoFireSounds[2]; - // No ammo sounds for both primary (0) and alt fire (1) - var string noAmmoSoundRefs[2]; - var Sound noAmmoSounds[2]; - // Weapon's ambient sound - var string ambientSoundRef; - var Sound ambientSound; -}; - -struct WeaponAnimationSet{ - // 'Aimed' - animation is to be performed during aiming - // Idle animations - var name idleAnim; - var name idleAimedAnim; - // Weapon swap animations - var name selectAnim; - var name putDownAnim; - // Reload animation - var name reloadAnim; - // Reload animation for owner's pawn - var name reload3rdAnim; - // Fire animations for both our fire modes - var FireAnimationSet fireAnimSets[2]; -}; - -// Describes texture and sound resources, related to a certain weapon's model -struct WeaponSkin{ - // Skin name - var string ID; - // Force to load all textures as just materials - var bool bLoadResourcesAsMaterial; - // First-person skin textures - var array paintRefs; - var array paints; - // Third-person attachment skin textures - var array paint3rdRefs; - var array paints3rd; - // Sounds replacer - var bool bReplacesSounds; -}; - -// Describes how weapon should be displayed and animated -struct WeaponModel{ - // Model name - var string ID; - // First person mesh - var string firstMeshRef; - var Mesh firstMesh; - // Attachment mesh - var string thirdMeshRef; - var Mesh thirdMesh; - // Image to be displayed on a HUD (unselected) - var string hudImageRef; - var Texture hudImage; - // Image to be displayed on a HUD (selected) - var string selectedHudImageRef; - var Texture selectedHudImage; - // Set of animations specific to this model - var WeaponAnimationSet animations; - // Skins available for this model - var array skins; - // Appropriate sounds - var WeaponSoundSet soundSet; - // Variables affecting how weapon is displayed - // and where effects would be generated - var Vector playerViewOffset; - var Vector effectOffset; -}; - -// Describes how weapon should behaved and stores the list of -// the possible appearances -struct WeaponVariant{ - var string ID; - var array models; - var array ammoEffects; - var array ammoEffectsSecondary; -}; -var array variants; - -var int currentVariant; -var int currentModel, currentSkin; -// This default value increments each time model / skin changes; -// It being different from weapon's current value forces weapon to -// update it's visuals to current default values. -var int appearanceRev; -var bool bFilledAppearance; - replication{ reliable if(Role < ROLE_Authority) - ServerReduceMag, ServerSetMagSize, ServerSetSndCharge, ServerReload, ServerShiftReloadTime, ServerStopReload, - ServerSetCharging, ServerSetLaserType, ammoState; + ServerReduceMag, ServerSetMagSize, ServerSetSndCharge, ServerReload, ServerShiftReloadTime, ServerStopReload, + ServerSetCharging, ServerSetLaserType; reliable if(Role == ROLE_Authority) - ClientForceInterruptReload, ClientReloadMeNow, ClientSetMagSize, ClientSetSndCharge, ClientPutDown, - ClientThrowGrenade, ClientCookGrenade, ClientTryPendingWeapon, ClientUpdateWeaponMag, ClientSetLaserType, - ClientReloadAmmo; + ClientForceInterruptReload, ClientReloadMeNow, ClientSetMagSize, ClientSetSndCharge, ClientPutDown, + ClientThrowGrenade, ClientCookGrenade, ClientTryPendingWeapon, ClientUpdateWeaponMag, ClientSetLaserType, + ClientReloadAmmo; reliable if(Role == ROLE_Authority) - holsteredCompletition, ardourTimeout; + holsteredCompletition; } - -// Tries to find 3 resource structures that fit given model and skin IDs, -// returns their indecies; -// If no models are defined - behaviour is undefined; -// If model is found, but has no defined skins - behaviour undefined; -// If model or skin with appropriate ID isn't found - -// returns zero (index of the first element); -// 'soundSetIndex' is chosen based on 'bReplacesSounds' in skin that -// this function has previously found. -static function FindResources( string modelID, - string skinID, - out int variantIndex, - out int modelIndex, - out int skinIndex){ - local int i; - local WeaponVariant activeVariant; - local WeaponModel foundModel; - - if(default.variants.length <= 0) return; - variantIndex = default.currentVariant; - activeVariant = default.variants[variantIndex]; - if(activeVariant.models.length <= 0) return; - // Find model index , leave zero if found none - modelIndex = 0; - for(i = 0;i < activeVariant.models.length;i ++) - if(activeVariant.models[i].ID ~= modelID){ - modelIndex = i; - break; - } - foundModel = activeVariant.models[modelIndex]; - - // Find skin index, leave zero if found none - if(foundModel.skins.length <= 0) return; - skinIndex = 0; - for(i = 0;i < foundModel.skins.length;i ++) - if(foundModel.skins[i].ID ~= skinID){ - skinIndex = i; - break; - } -} - -static function SetVariant(string newVariantID){ - local int i; - local int newVariantIndex; - local string modelID; - local string skinID; - local WeaponVariant currentVariantStruct; - currentVariantStruct = default.variants[default.currentVariant]; - if(currentVariantStruct.ID ~= newVariantID) return; - newVariantIndex = -1; - for(i = 0;i < default.variants.Length;i ++) - if(default.variants[i].ID ~= newVariantID){ - newVariantIndex = i; - break; - } - if(newVariantIndex < 0) return; - modelID = currentVariantStruct.models[default.currentModel].ID; - skinID = currentVariantStruct.models[default.currentModel]. - skins[default.currentSkin].ID; - default.currentVariant = newVariantIndex; - SetAppearance(modelID, skinID); -} - -// Changes default variable values of weapon and fire classes -// for given model and skin IDs. -// Function also increments 'appearanceRev', causing weapon to update it's -// appearance to reflect our changes to default variables. -static function SetAppearance(string modelID, string skinID){ - local int variantIndex; - local int modelIndex; - local int skinIndex; - local WeaponModel newModel; - // Find indeciece of appropriate model and skin - // (or default ones in case of error) - FindResources(modelID, skinID, variantIndex, modelIndex, skinIndex); - // Load model & it's skins - SetAppearanceModel(variantIndex, modelIndex); - SetAppearanceSkin(variantIndex, modelIndex, skinIndex); - newModel = default.variants[variantIndex].models[modelIndex]; - // Load up it's sounds - SetAppearanceSoundSet(variantIndex, modelIndex); - SetAppearanceFireModeSoundSet(variantIndex, modelIndex, 0); - SetAppearanceFireModeSoundSet(variantIndex, modelIndex, 1); - // Update render parameters - default.playerViewOffset = newModel.playerViewOffset; - default.effectOffset = newModel.effectOffset; - // Do mark that we've just updated default values, - // - this will force weapon to update it's looks next time it can - default.appearanceRev ++; -} - -// Helper subroutine for 'SetAppearance' that loads 1st-person resources -// general to provided 'WeaponModel'. -static function SetAppearanceModel(int variantIndex, int modelIndex){ - local Object loadO; - // We'll work with it instead of something like 'models[modelIndex]' - // and paste result into 'models' array after we done. - local WeaponModel model; - model = default.variants[variantIndex].models[modelIndex]; - - // Load first person-related variables - // -- Mesh - if(model.firstMesh == none && model.firstMeshRef != ""){ - loadO = DynamicLoadObject(model.firstMeshRef, class'SkeletalMesh'); - model.firstMesh = SkeletalMesh(loadO); - } - if(default.mesh != model.firstMesh) - UpdateDefaultMesh(model.firstMesh); - // -- Hud image - if(model.hudImage == none && model.hudImageRef != ""){ - loadO = DynamicLoadObject(model.hudImageRef, class'Texture'); - model.hudImage = Texture(loadO); - } - default.hudImage = model.hudImage; - if(model.selectedHudImage == none && model.selectedHudImageRef != ""){ - loadO = DynamicLoadObject(model.selectedHudImageRef, class'Texture'); - model.selectedHudImage = Texture(loadO); - } - default.selectedHudImage = model.selectedHudImage; - // Remember loading these objects - default.variants[variantIndex].models[modelIndex] = model; - default.currentModel = modelIndex; - SetupDefaultAnimations(model.animations); -} - -static function SetupDefaultAnimations(WeaponAnimationSet anims){ - local int i; - local class fireClass; - - // Setup fire animations - for(i = 0;i <= 1;i ++){ - fireClass = class(default.fireModeClass[i]); - if(fireClass != none) - fireClass.default.fireAnims = anims.fireAnimSets[i]; - } - - // Setup the rest of weapon's animations - default.idleAnim = anims.idleAnim; - default.idleAimAnim = anims.idleAimedAnim; - default.selectAnim = anims.selectAnim; - default.putDownAnim = anims.putDownAnim; - default.reloadAnim = anims.reloadAnim; - default.weaponReloadAnim = anims.reload3rdAnim; -} - -// Helper subroutine for 'SetAppearance' that loads 1st-person resources -// specific to provided 'WeaponSkin'. -static function SetAppearanceSkin( int variantIndex, - int modelIndex, - int skinIndex){ - local int i; - local Object loadO; - // We'll work with it instead of something like - // 'default.models[modelIndex].skins[skinIndex]' - // and paste result into 'skins' array after we done. - local WeaponSkin skin; - skin = default.variants[variantIndex].models[modelIndex].skins[skinIndex]; - - // Load first person-related variables; - // for that go over each paint reference: - for(i = 0;i < skin.paintRefs.length;i ++){ - // Skip null paint references - if(skin.paintRefs[i] == "") continue; - // Skip already loaded paints - if(i < skin.paints.length && skin.paints[i] != none) continue; - - // Try to load current paint as various types of materials - skin.paints[i] = none; - if(!skin.bLoadResourcesAsMaterial){ - loadO = DynamicLoadObject(skin.paintRefs[i], class'Combiner'); - skin.paints[i] = Combiner(loadO); - } - if(skin.paints[i] == none && !skin.bLoadResourcesAsMaterial){ - loadO = DynamicLoadObject(skin.paintRefs[i], class'FinalBlend'); - skin.paints[i] = FinalBlend(loadO); - } - if(skin.paints[i] == none && !skin.bLoadResourcesAsMaterial){ - loadO = DynamicLoadObject(skin.paintRefs[i], class'Shader'); - skin.paints[i] = Shader(loadO); - } - if(skin.paints[i] == none && !skin.bLoadResourcesAsMaterial){ - loadO = DynamicLoadObject(skin.paintRefs[i], class'Texture'); - skin.paints[i] = Texture(loadO); - } - if(skin.paints[i] == none){ - loadO = DynamicLoadObject(skin.paintRefs[i], class'Material'); - skin.paints[i] = Material(loadO); - } - } - // Copy updated paints into default 'Skins' array - for(i = 0;i < skin.paintRefs.length;i ++) - if(skin.paints[i] != none || default.skins.length <= i) - default.skins[i] = skin.paints[i]; - // Remember loading these objects - default.currentSkin = skinIndex; - default.variants[variantIndex].models[modelIndex].skins[skinIndex] = skin; -} - -// Helper subroutine for 'SetAppearance' that loads sounds -// related to weapon itself. -static function SetAppearanceSoundSet(int variantIndex, int modelIndex){ - local Object loadO; - // We'll work with it instead of something like 'soundSets[soundSetIndex]' - // and paste result into 'soundSets' array after we done. - local WeaponSoundSet soundSet; - soundSet = default.variants[variantIndex].models[modelIndex].soundSet; - if(soundSet.selectSound == none && soundSet.selectSoundRef != ""){ - loadO = DynamicLoadObject(soundSet.selectSoundRef, class'Sound'); - soundSet.selectSound = Sound(loadO); - } - default.selectSound = soundSet.selectSound; - // Remember loading these objects - default.variants[variantIndex].models[modelIndex].soundSet = soundSet; -} - -// Helper subroutine for 'SetAppearance' that loads sounds -// specific to provided fire mode. -static function SetAppearanceFireModeSoundSet( int variantIndex, - int modelIndex, - int fireIndex){ - local Object loadO; - local class fireClass; - local string refToLoad; - // We'll work with it instead of something like 'soundSets[soundSetIndex]' - // and paste result into 'soundSets' array after we done. - local WeaponSoundSet soundSet; - soundSet = default.variants[variantIndex].models[modelIndex].soundSet; - - // Attempt to find 'NiceFire'-type fire mode refered by 'fireIndex' - // and bail if we've failed. - if(fireIndex == 0 || fireIndex == 1) - fireClass = class(default.fireModeClass[fireIndex]); - if(fireClass == none) return; - - // Load sounds and update default values of 'fireClass'; - // if possible (references are identical) - - // paste loaded sound into another fire mode. - // - // Above conditions conditions enforce that 'fireIndex' is equal to - // either '0' or '1', indicies of primary and alt fires in - // 'WeaponSoundSet' 's arrays respectively; - // this means we can use 'fireIndex' as index of these arrays that - // corresponds to sounds we must load - // and '1 - fireIndex' as index of other fire mode's sounds. - - // -- Fire sound - refToLoad = soundSet.fireSoundRefs[fireIndex]; - if( soundSet.fireSounds[fireIndex] == none && refToLoad != ""){ - loadO = DynamicLoadObject(refToLoad, class'Sound'); // load up sound - soundSet.fireSounds[fireIndex] = Sound(loadO); - // fireSoundRefs[fireIndex] ~= fireSoundRefs[fireIndex], - // which means both fire modes share the same sound - if(refToLoad ~= soundSet.fireSoundRefs[1 - fireIndex]) // paste - soundSet.fireSounds[1 - fireIndex] = Sound(loadO); - } - fireClass.default.fireSound = soundSet.fireSounds[fireIndex]; - - // -- Stereo fire sound - refToLoad = soundSet.stereoFireSoundRefs[fireIndex]; - if(soundSet.stereoFireSounds[fireIndex] == none && refToLoad != ""){ - // load up sound - loadO = DynamicLoadObject(refToLoad, class'Sound'); - soundSet.stereoFireSounds[fireIndex] = Sound(loadO); - // try pasting - if(refToLoad ~= soundSet.stereoFireSoundRefs[1 - fireIndex]) - soundSet.stereoFireSounds[1 - fireIndex] = Sound(loadO); - } - fireClass.default.stereoFireSound = soundSet.stereoFireSounds[fireIndex]; - - // -- No ammo sound - refToLoad = soundSet.noAmmoSoundRefs[fireIndex]; - if(soundSet.noAmmoSounds[fireIndex] == none && refToLoad != ""){ - // load up sound - loadO = DynamicLoadObject(refToLoad, class'Sound'); - soundSet.noAmmoSounds[fireIndex] = Sound(loadO); - // try pasting - if(refToLoad ~= soundSet.noAmmoSoundRefs[1 - fireIndex]) - soundSet.noAmmoSounds[1 - fireIndex] = Sound(loadO); - } - fireClass.default.noAmmoSound = soundSet.noAmmoSounds[fireIndex]; - // Remember loading these objects - default.variants[variantIndex].models[modelIndex].soundSet = soundSet; -} - -// Run this function to update this weapon's resources to the current default -// values (those are supposed to be changed by 'SetAppearance' method). -// This function updates 'appearanceRev', preventing repeated updates. -simulated function UpdateAppearance(){ +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ local int i; - if(appearanceRev >= default.appearanceRev) return; - - // Update weapon resources - LinkMesh(default.mesh); - hudImage = default.hudImage; - selectedHudImage = default.selectedHudImage; - selectSound = default.selectSound; - for(i = 0;i < default.skins.length;i ++) - skins[i] = default.skins[i]; - // Update weapon animations - idleAnim = default.idleAnim; - idleAimAnim = default.idleAimAnim; - selectAnim = default.selectAnim; - putDownAnim = default.putDownAnim; - reloadAnim = default.reloadAnim; - weaponReloadAnim = default.weaponReloadAnim; - // Update weapon render parameters - playerViewOffset = default.playerViewOffset; - effectOffset = default.effectOffset; - - // Update fire mode's resources / animations - UpdateAppearanceFireMode(0); - UpdateAppearanceFireMode(1); - appearanceRev = default.appearanceRev; -} - -// Helper function for 'UpdateAppearance' -// that updates given fire mode resources / animations. -// Doesn't update 'appearanceRev'. -simulated function UpdateAppearanceFireMode(int fireModeIndex){ - local NiceFire fireModeInst; - if(appearanceRev >= default.appearanceRev) return; - fireModeInst = NiceFire(FireMode[fireModeIndex]); - if(fireModeInst == none) return; - - fireModeInst.fireSound = fireModeInst.default.fireSound; - fireModeInst.stereoFireSound = fireModeInst.default.stereoFireSound; - fireModeInst.noAmmoSound = fireModeInst.default.noAmmoSound; - fireModeInst.fireAnims = fireModeInst.default.fireAnims; -} - -static function FillInAppearance(){} - -simulated function array GetAmmoTypesCopy(int fireM){ - if(fireM == 0 || !bHasSecondaryAmmo) - return availableAmmoTypes; - else - return availableAmmoTypesSecondary; -} - -simulated function string AmmoStackLookup(GunAmmoState ammoState){ - if(instigator == none || ammoState.stackPointer < 0) - return ammoState.currentAmmoType; - if(instigator.role == ROLE_Authority) - return ammoState.ammoStackLast; - return ammoState.loadedAmmoStack[ammoState.stackPointer]; -} - -simulated function UpdateFireType(out GunAmmoState ammoState){ - local int i; - local string currentAmmo; - local string appropFireType; - local array effects; - if(ammoState.linkedFire == none) return; - // Find current ammo - currentAmmo = AmmoStackLookup(ammoState); - // Find effects (name of fire type) corresponding - // to current ammo and variant - effects = variants[currentVariant].ammoEffects; - appropFireType = effects[0].fireTypeID; - for(i = 0;i < effects.length;i ++) - if(effects[i].ammoID ~= currentAmmo){ - appropFireType = effects[i].fireTypeID; - break; - } - // Find index of found fire type and set it to be current fire type - for(i = 0;i < ammoState.linkedFire.fireTypes.length;i ++) - if(appropFireType ~= ammoState.linkedFire.fireTypes[i].fireTypeName){ - ammoState.linkedFire.curFireType = i; - break; - } -} - -simulated function AmmoStackPush(out GunAmmoState ammoState, string ammoType){ - if(instigator == none || instigator.role == ROLE_Authority) return; - ammoState.stackPointer ++; - if(ammoState.stackPointer < 0) - ammoState.stackPointer = 0; - ammoState.loadedAmmoStack[ammoState.stackPointer] = ammoType; - ammoState.ammoStackLast = ammoType; - UpdateFireType(ammoState); -} - -simulated function string AmmoStackPop(out GunAmmoState ammoState){ - local string tipElement; - tipElement = AmmoStackLookup(ammoState); - ammoState.stackPointer --; - if(ammoState.stackPointer >= 0) - ammoState.ammoStackLast = - ammoState.loadedAmmoStack[ammoState.stackPointer]; - UpdateFireType(ammoState); - return tipElement; -} - -simulated function bool IsAmmoStackEmpty(GunAmmoState ammoState){ - return (ammoState.stackPointer < 0); -} - -// How much space takes up ammo we currently have. -// That's not a total ammo count, but the 'weight' of all ammo. -// If everything works correctly - it should be between 0 and 'MaxAmmo', -// but function doesn't try to fix situation if we've got too much ammo. -// Return value is guaranteed to be >= 0. -simulated function float GetCurrentAmmoSpace(int fireM){ - local int i; - local float ammoSpace; - local array ammoTypes; - ammoTypes = GetAmmoTypesCopy(fireM); - for(i = 0;i < ammoTypes.length;i ++) - ammoSpace += ammoTypes[i].amount * ammoTypes[i].spaceMult; - return FMax(0.0, ammoSpace); -} - -// Returns total ammo count for given fire mode. -simulated function int GetTotalAmmo(int fireM){ - local int i; - local int totalAmmo; - local array ammoTypes; - ammoTypes = GetAmmoTypesCopy(fireM); - for(i = 0;i < ammoTypes.length;i ++) - totalAmmo += ammoTypes[i].amount; - return Max(0, totalAmmo); -} - -// 'Fixes' all the nice ammo. -// This means we alter it's ammo so that it fits under 'MaxAmmo' restriction -// and syncs it with 'ammoAmount' values from vanilla ammo classes. -// The sync part is added for compatibility with mods that alter ammo counts; -// it's accomplished by making upthe difference via adding/removing -// default ammo. -simulated function FixNiceAmmo(){ - // Fix ammo for primary mode - FixNiceAmmoTypes(availableAmmoTypes, 0); - // Fix ammo for secondary mode - if(!bHasSecondaryAmmo) return; - FixNiceAmmoTypes(availableAmmoTypesSecondary, 1); -} - -// 'Fix' given nice ammo types for given fire mode. -// See 'FixNiceAmmo' for more details. -simulated function FixNiceAmmoTypes(out array types, - int fireM){ - local int i; - local float difference; - local NiceAmmo allAmmo; - // Is there and vanilla-ammo for given fire mode? Bail if not. - allAmmo = NiceAmmo(ammo[fireM]); - if(allAmmo == none || types.length <= 0) return; - // If vanilla ammo count and total ammo are desynced - - // fix it by changing amount of the default ammo. - types[0].amount += allAmmo.ammoAmount - GetTotalAmmo(fireM); - // Throw away ammo until it fits in under 'MaxAmmo' - for(i = 0;i < types.length;i ++){ - // Did we reach our objective? - // Bail if yes... - difference = allAmmo.MaxAmmo - GetCurrentAmmoSpace(0); - if(difference <= 0) break; - // ...otherwise throw away another ammo type - types[i].amount -= Ceil(difference / types[i].spaceMult); - if(types[i].amount < 0) - types[i].amount = 0.0; + if(!bSkipRefCount) + default.ReferenceCount ++; + if(default.Mesh == none && default.MeshRef != "") + UpdateDefaultMesh(SkeletalMesh(DynamicLoadObject(default.MeshRef, class'SkeletalMesh'))); + if(default.HudImage == none && default.HudImageRef != "") + default.HudImage = texture(DynamicLoadObject(default.HudImageRef, class'texture')); + if(default.SelectedHudImage == none && default.SelectedHudImageRef != "") + default.SelectedHudImage = texture(DynamicLoadObject(default.SelectedHudImageRef, class'texture')); + if(default.SelectSound == none && default.SelectSoundRef != "") + default.SelectSound = sound(DynamicLoadObject(default.SelectSoundRef, class'sound')); + for(i = 0;i < default.SkinRefs.Length;i ++) + if(default.SkinRefs[i] != "" && (default.Skins.Length < i + 1 || default.Skins[i] == none)){ + default.Skins[i] = none; + if(default.bLoadResourcesAsMaterial) + default.Skins[i] = Material(DynamicLoadObject(default.SkinRefs[i], class'Material')); + // Try to load as various types of materials + if(default.Skins[i] == none) + default.Skins[i] = Combiner(DynamicLoadObject(default.SkinRefs[i], class'Combiner', true)); + if(default.Skins[i] == none) + default.Skins[i] = FinalBlend(DynamicLoadObject(default.SkinRefs[i], class'FinalBlend', true)); + if(default.Skins[i] == none) + default.Skins[i] = Shader(DynamicLoadObject(default.SkinRefs[i], class'Shader', true)); + if(default.Skins[i] == none) + default.Skins[i] = Texture(DynamicLoadObject(default.SkinRefs[i], class'Texture', true)); + if(default.Skins[i] == none) + default.Skins[i] = Material(DynamicLoadObject(default.SkinRefs[i], class'Material')); + } + if(NiceWeapon(Inv) != none){ + Inv.LinkMesh(default.Mesh); + NiceWeapon(Inv).HudImage = default.HudImage; + NiceWeapon(Inv).SelectedHudImage = default.SelectedHudImage; + NiceWeapon(Inv).SelectSound = default.SelectSound; + for(i = 0; i < default.SkinRefs.Length;i ++) + Inv.Skins[i] = default.Skins[i]; } } - -// Finds index of ammo type from it's ID. -// Returns -1 if didn't find required ammo. -simulated function int FindNiceAmmoByID(string ID, int fireM){ - local int i; - local array types; - types = GetAmmoTypesCopy(fireM); - for(i = 0;i < types.length;i ++) - if(ID ~= types[i].ID) - return i; - return -1; -} - -simulated function ChangeAmmoType(string newAmmoType){ +static function bool UnloadAssets(){ local int i; - local int ammoID; - for(i = 0;i < 1;i ++){ - if(ammoState[i].linkedFire == none) continue; - ammoID = FindNiceAmmoByID(newAmmoType, i); - if(ammoID >= 0 && ammoState[i].linkedFire.AllowFire()){ - ammoState[i].currentAmmoType = newAmmoType; - break; - } - } + default.ReferenceCount--; + UpdateDefaultMesh(none); + default.HudImage = none; + default.SelectedHudImage = none; + default.SelectSound = none; + for(i = 0;i < default.SkinRefs.Length; i ++) + default.Skins[i] = none; + return default.ReferenceCount == 0; } - -// Adds given amount to given ammo type. -simulated function AddNiceAmmo(string ammoType, int amount){ - local int fireM; - local int ammoTypeIndex; - local float freeSpace; - ammoTypeIndex = FindNiceAmmoByID(ammoType, 0); - if(ammoTypeIndex < 0){ - ammoTypeIndex = FindNiceAmmoByID(ammoType, 1); - if(ammoTypeIndex < 0) return; - fireM = 1; - } - if(NiceAmmo(Ammo[fireM]) == none) return; - freeSpace = NiceAmmo(Ammo[fireM]).MaxAmmo - GetCurrentAmmoSpace(fireM); - if(fireM == 0){ - amount = FMin(amount, - freeSpace / availableAmmoTypes[ammoTypeIndex].spaceMult); - availableAmmoTypes[ammoTypeIndex].amount += amount; - } - else{ - amount = FMin(amount, - freeSpace / availableAmmoTypesSecondary[ammoTypeIndex].spaceMult); - availableAmmoTypesSecondary[ammoTypeIndex].amount += amount; - } - FixNiceAmmo(); -} - -static function PreloadAssets(Inventory inv, optional bool bSkipRefCount){} -static function bool UnloadAssets(){return false;} - simulated function PostBeginPlay(){ - if(Role < ROLE_Authority){ - if(!default.bFilledAppearance){ - FillInAppearance(); - default.bFilledAppearance = true; - availableAmmoTypes = default.availableAmmoTypes; - variants = default.variants; - } - SetAppearance("", ""); - } if(default.recordedZoomTime < 0) - default.recordedZoomTime = ZoomTime; + default.recordedZoomTime = ZoomTime; recordedZoomTime = default.recordedZoomTime; - // Default variables - LastMagUpdateFromClient = 0.0; - bNeedToCharge = false; - bMagazineOut = false; - currentRelStage = RSTAGE_NONE; - lastEventCheckFrame = -1.0; - bRoundInChamber = false; - // Fill sub reload stages + // Default variables + LastMagUpdateFromClient = 0.0; + bNeedToCharge = false; + bMagazineOut = false; + currentRelStage = RSTAGE_NONE; + lastEventCheckFrame = -1.0; + // Fill sub reload stages fillSubReloadStages(); - // Auto fill reload stages for 'RTYPE_SINGLE' reload + // Auto fill reload stages for 'RTYPE_SINGLE' reload if(reloadType == RTYPE_SINGLE) - UpdateSingleReloadVars(); + UpdateSingleReloadVars(); if(reloadType == RTYPE_AUTO) - bHasChargePhase = false; + bHasChargePhase = false; if(reloadChargeStartFrame < 0.0 || reloadChargeEndFrame < 0.0) - bHasChargePhase = false; + bHasChargePhase = false; + if(FireModeClass[0] != none) + stdFireRate = FireModeClass[0].default.fireRate; super.PostBeginPlay(); - ammoState[0].stackPointer = -1; - ammoState[1].stackPointer = -1; - ammoState[0].linkedFire = NiceFire(FireMode[0]); - ammoState[0].currentAmmoType = availableAmmoTypes[0].ID; - if(bHasSecondaryAmmo){ - ammoState[1].linkedFire = NiceFire(FireMode[1]); - ammoState[1].currentAmmoType = availableAmmoTypesSecondary[0].ID; - } - else{ - ammoState[1].linkedFire = NiceFire(FireMode[0]); - ammoState[1].currentAmmoType = availableAmmoTypes[0].ID; - } } - // Allows to prevent leaving iron sights unwillingly function bool ShouldLeaveIronsight(){ local class niceVet; niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(Instigator.PlayerReplicationInfo); if(niceVet != none && niceVet.static.hasSkill(NicePlayerController(Instigator.Controller), class'NiceSkillEnforcerUnshakable')) - return false; + return false; return true; } - // Updates max value for this weapon's ammunition simulated function UpdateWeaponAmmunition(){ - local int i; - local NiceAmmo ammoInstance; + local int i; for(i = 0;i < NUM_FIRE_MODES;i ++){ - ammoInstance = NiceAmmo(Ammo[i]); - if(ammoInstance == none) continue; - ammoInstance.UpdateAmmoAmount(); + if(Ammo[i] == none) + continue; + if(NiceAmmo(Ammo[i]) != none) + NiceAmmo(Ammo[i]).UpdateAmmoAmount(); } - FixNiceAmmo(); } - +function UpdateWeaponMag(){ + UpdateMagCapacity(Instigator.PlayerReplicationInfo); + MagAmmoRemaining = Min(MagAmmoRemaining, MagCapacity); + ClientSetMagSize(MagAmmoRemaining, bRoundInChamber); +} simulated function ClientUpdateWeaponMag(){ local int actualMag; UpdateMagCapacity(Instigator.PlayerReplicationInfo); actualMag = MagAmmoRemainingClient; if(bHasChargePhase && bRoundInChamber && actualMag > 0) - actualMag --; + actualMag --; MagAmmoRemainingClient = Min(MagAmmoRemainingClient, MagCapacity); if(bHasChargePhase && bRoundInChamber) - actualMag ++; + actualMag ++; ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); } - -simulated function ConsumeNiceAmmo( out GunAmmoState ammoState, - out array ammoTypes, - int mode, - float load){ - local int i; - local int ammoTypeIndex; - for(i = 0;i < load;i ++){ - ammoTypeIndex = FindNiceAmmoByID(AmmoStackPop(ammoState), mode); - if(ammoTypeIndex < 0) continue; - ammoTypes[ammoTypeIndex].amount --; - if(ammoTypes[ammoTypeIndex].amount < 0) - ammoTypes[ammoTypeIndex].amount = 0; - } -} - // Overloaded to properly reduce magazine's size simulated function bool ConsumeAmmo(int Mode, float Load, optional bool bAmountNeededIsMax){ local Inventory Inv; local bool bOutOfAmmo; local KFWeapon KFWeap; if(super(Weapon).ConsumeAmmo(Mode, Load, bAmountNeededIsMax)){ - if(Load > 0 && (Mode == 0 || !bHasSecondaryAmmo)){ - MagAmmoRemaining -= Load; - if(MagAmmoRemaining < 0) - MagAmmoRemaining = 0; - if(MagAmmoRemaining <= 0) - bRoundInChamber = false; - } + if(Load > 0 && (Mode == 0 || bReduceMagAmmoOnSecondaryFire)){ + MagAmmoRemaining -= Load; + if(MagAmmoRemaining < 0) + MagAmmoRemaining = 0; + if(MagAmmoRemaining <= 0) + bRoundInChamber = false; + } - NetUpdateTime = Level.TimeSeconds - 1; + NetUpdateTime = Level.TimeSeconds - 1; - if(FireMode[Mode].AmmoPerFire > 0 && InventoryGroup > 0 && !bMeleeWeapon && bConsumesPhysicalAmmo && - (Ammo[0] == none || FireMode[0] == none || FireMode[0].AmmoPerFire <= 0 || Ammo[0].AmmoAmount < FireMode[0].AmmoPerFire) && - (Ammo[1] == none || FireMode[1] == none || FireMode[1].AmmoPerFire <= 0 || Ammo[1].AmmoAmount < FireMode[1].AmmoPerFire)){ - bOutOfAmmo = true; + if(FireMode[Mode].AmmoPerFire > 0 && InventoryGroup > 0 && !bMeleeWeapon && bConsumesPhysicalAmmo && + (Ammo[0] == none || FireMode[0] == none || FireMode[0].AmmoPerFire <= 0 || Ammo[0].AmmoAmount < FireMode[0].AmmoPerFire) && + (Ammo[1] == none || FireMode[1] == none || FireMode[1].AmmoPerFire <= 0 || Ammo[1].AmmoAmount < FireMode[1].AmmoPerFire)){ + bOutOfAmmo = true; - for(Inv = Instigator.Inventory;Inv != none; Inv = Inv.Inventory){ - KFWeap = KFWeapon(Inv); + for(Inv = Instigator.Inventory;Inv != none; Inv = Inv.Inventory){ + KFWeap = KFWeapon(Inv); - if(Inv.InventoryGroup > 0 && KFWeap != none && !KFWeap.bMeleeWeapon && KFWeap.bConsumesPhysicalAmmo && - ((KFWeap.Ammo[0] != none && KFWeap.FireMode[0] != none && KFWeap.FireMode[0].AmmoPerFire > 0 &&KFWeap.Ammo[0].AmmoAmount >= KFWeap.FireMode[0].AmmoPerFire) || - (KFWeap.Ammo[1] != none && KFWeap.FireMode[1] != none && KFWeap.FireMode[1].AmmoPerFire > 0 && KFWeap.Ammo[1].AmmoAmount >= KFWeap.FireMode[1].AmmoPerFire))){ - bOutOfAmmo = false; - break; - } - } + if(Inv.InventoryGroup > 0 && KFWeap != none && !KFWeap.bMeleeWeapon && KFWeap.bConsumesPhysicalAmmo && + ((KFWeap.Ammo[0] != none && KFWeap.FireMode[0] != none && KFWeap.FireMode[0].AmmoPerFire > 0 &&KFWeap.Ammo[0].AmmoAmount >= KFWeap.FireMode[0].AmmoPerFire) || + (KFWeap.Ammo[1] != none && KFWeap.FireMode[1] != none && KFWeap.FireMode[1].AmmoPerFire > 0 && KFWeap.Ammo[1].AmmoAmount >= KFWeap.FireMode[1].AmmoPerFire))){ + bOutOfAmmo = false; + break; + } + } - if(bOutOfAmmo) - PlayerController(Instigator.Controller).Speech('AUTO', 3, ""); - } - return true; + if(bOutOfAmmo) + PlayerController(Instigator.Controller).Speech('AUTO', 3, ""); + } + return true; } return false; } - // Forces update for client's magazine ammo counter // In case we are using client-side hit-detection, client itself manages remaining ammunition in magazine, but in some cases we want server to dictate current magazine amount // This function sets client's mag size to a given value simulated function ClientSetMagSize(int newMag, bool bChambered){ MagAmmoRemainingClient = newMag; bRoundInChamber = bChambered; - if(MagAmmoRemainingClient > 0 && bHasChargePhase){ - if(bRoundInChamber){ - ammoState[0].stackPointer = -1; - AmmoStackPush(ammoState[0], ammoState[0].currentAmmoType); - } - else - bNeedToCharge = true; - } + if(MagAmmoRemainingClient > 0 && bHasChargePhase && !bRoundInChamber) + bNeedToCharge = true; } - // This function allows clients to change magazine size without altering total ammo amount // It allows clients to provide time-stamps, so that older change won't override a newer one function ServerSetMagSize(int newMag, bool bChambered, float updateTime){ magAmmoRemaining = newMag; bRoundInChamber = bChambered; - if(LastMagUpdateFromClient <= updateTime) - LastMagUpdateFromClient = updateTime; + if(LastMagUpdateFromClient <= updateTime){ + LastMagUpdateFromClient = updateTime; + if(newMag > 0) + bServerFiredLastShot = false; + } } - // This function allows clients to change magazine size along with total ammo amount on the server (to update ammo counter in client-side mode) // It allows clients to provide time-stamps, so that older change won't override a newer one // Intended to be used for decreasing ammo count from shooting and cannot increase magazine size simulated function ServerReduceMag(int newMag, float updateTime, int Mode){ local int delta; if(Mode == 0 || !bHasSecondaryAmmo){ - delta = magAmmoRemaining - newMag; - // Only update later changes that actually decrease magazine - if(LastMagUpdateFromClient <= updateTime && delta > 0){ - LastMagUpdateFromClient = updateTime; - ConsumeAmmo(Mode, delta); - } + delta = magAmmoRemaining - newMag; + // Only update later changes that actually decrease magazine + if(LastMagUpdateFromClient <= updateTime && delta > 0){ + LastMagUpdateFromClient = updateTime; + ConsumeAmmo(Mode, delta); + } } else - ConsumeAmmo(Mode, 1); + ConsumeAmmo(Mode, 1); } - // Forces either 'AddReloadedAmmo' or 'AddAutoReloadedAmmo' (depending on which one is appropriate) function on client // Somewhat of a hack to allow server force-add ammo to the weapon simulated function ClientReloadAmmo(){ if(reloadType == RTYPE_AUTO) - AddAutoReloadedAmmo(); + AddAutoReloadedAmmo(); else - AddReloadedAmmo(); + AddReloadedAmmo(); bNeedToCharge = false; bMagazineOut = false; - if(bHasChargePhase){ - if(IsAmmoStackEmpty(ammoState[0])){ - AmmoStackPush(ammoState[0], ammoState[0].currentAmmoType); - } - bRoundInChamber = true; - } + if(bHasChargePhase) + bRoundInChamber = true; ResetReloadVars(); } - // Adds appropriate amount of ammo during reload. // Up to full mag for magazine reload, 1 ammo per call for single reload. // Isn't called in case of auto reload, use 'AddAutoReloadedAmmo' for that. simulated function AddReloadedAmmo(){ UpdateMagCapacity(Instigator.PlayerReplicationInfo); if(reloadType == RTYPE_MAG){ - if(AmmoAmount(0) >= MagCapacity){ - MagAmmoRemainingClient = MagCapacity; - if(bRoundInChamber) - MagAmmoRemainingClient ++; - } - else - MagAmmoRemainingClient = AmmoAmount(0); + if(AmmoAmount(0) >= MagCapacity){ + MagAmmoRemainingClient = MagCapacity; + if(bRoundInChamber) + MagAmmoRemainingClient ++; + } + else + MagAmmoRemainingClient = AmmoAmount(0); } else if(reloadType == RTYPE_SINGLE){ - if(AmmoAmount(0) - MagAmmoRemainingClient > 0 && MagAmmoRemainingClient < MagCapacity){ - MagAmmoRemainingClient ++; - AmmoStackPush(ammoState[0], ammoState[0].currentAmmoType); - } + if(AmmoAmount(0) - MagAmmoRemainingClient > 0 && MagAmmoRemainingClient < MagCapacity) + MagAmmoRemainingClient ++; } ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); + if(PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none) + KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnWeaponReloaded(); } - // Function that manages ammo replenishing for auto reload simulated function AddAutoReloadedAmmo(){ if(reloadType != RTYPE_AUTO){ - secondaryCharge = 1; - AmmoStackPush(ammoState[1], ammoState[1].currentAmmoType); - ServerSetSndCharge(secondaryCharge); + secondaryCharge = 1; + ServerSetSndCharge(secondaryCharge); } else{ - if(AmmoAmount(0) > 0){ - MagAmmoRemainingClient = 1; - AmmoStackPush(ammoState[0], ammoState[0].currentAmmoType); - } - else - MagAmmoRemainingClient = 0; - ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); + if(AmmoAmount(0) > 0) + MagAmmoRemainingClient = 1; + else + MagAmmoRemainingClient = 0; + ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); } } - simulated function float TimeUntillReload(){ if(reloadType == RTYPE_MAG) - return FMax(reloadChargeEndFrame, reloadEndFrame) * GetAnimDuration(ReloadAnim); + return FMax(reloadChargeEndFrame, reloadEndFrame) * GetAnimDuration(ReloadAnim); else if(reloadType == RTYPE_SINGLE && reloadStages.Length > 0) - return reloadStages[0] * GetAnimDuration(ReloadAnim); + return reloadStages[0] * GetAnimDuration(ReloadAnim); else if(reloadType == RTYPE_AUTO && autoReloadsDescriptions.Length > 0) - return autoReloadsDescriptions[0].trashStartFrame * GetAnimDuration(autoReloadsDescriptions[0].animName); + return autoReloadsDescriptions[0].trashStartFrame * GetAnimDuration(autoReloadsDescriptions[0].animName); return 60.0; } - -simulated function SwapVariant(string newVariant){ - local float putDownAnimDuration; - if(variantSwapState != SWAP_NONE) return; - ClientForceInterruptReload(CANCEL_SWITCH); - if(bIsReloading) return; - putDownAnimDuration = GetAnimDuration(PutDownAnim); - PlayAnim(PutDownAnim, putDownAnimDuration / variantSwapTime); - variantSwapCountdown = variantSwapTime; - variantSwapState = SWAP_PUTDOWN; - pendingVariant = newVariant; -} - // Interrupt the reloading animation, which may reset the weapon's magAmmoRemaining; // Don't allow Fire() and AltFire() to interrupt by shooting with empty magazine. simulated function ClientForceInterruptReload(ERelCancelCause cause){ @@ -1149,167 +424,156 @@ simulated function ClientForceInterruptReload(ERelCancelCause cause){ bCauseNade = (cause == CANCEL_NADE) || (cause == CANCEL_COOKEDNADE); bCauseAim = cause == CANCEL_AIM; bCauseSwitch = cause == CANCEL_SWITCH || cause == CANCEL_PASSIVESWITCH; - // Is player looking at inventory? nicePlayer = NicePlayerController(Instigator.Controller); if(nicePlayer == none || !bIsReloading) - return; + return; HUD = HUDKillingFloor(nicePlayer.MyHUD); bDisplayInventory = HUD != none && HUD.bDisplayInventory; - // General checks: is there any meaning to reset reload for provided cause? if(bCauseFire) - bWeReallyShould = !bNeedToCharge && (bDisplayInventory || magAmmoRemainingClient >= GetFireMode(0).ammoPerFire); + bWeReallyShould = !bNeedToCharge && (bDisplayInventory || magAmmoRemainingClient >= GetFireMode(0).ammoPerFire); else if(bCauseAltFire) - bWeReallyShould = !bNeedToCharge && AltFireCanForceInterruptReload() - && (reloadType == RTYPE_AUTO || !bAutoReload); + bWeReallyShould = !bNeedToCharge && AltFireCanForceInterruptReload() + && (reloadType == RTYPE_AUTO || !bAutoReload); else if(bCauseNade){ - bWeReallyShould = true; - nicePawn = NiceHumanPawn(nicePlayer.Pawn); - if(nicePawn == none) - bWeReallyShould = false; - else{ - if(nicePawn.PlayerGrenade == none) - nicePawn.PlayerGrenade = nicePawn.FindPlayerGrenade(); - if(nicePawn.PlayerGrenade == none || !nicePawn.PlayerGrenade.HasAmmo()) - bWeReallyShould = false; - } + bWeReallyShould = true; + nicePawn = NiceHumanPawn(nicePlayer.Pawn); + if(nicePawn == none) + bWeReallyShould = false; + else{ + if(nicePawn.PlayerGrenade == none) + nicePawn.PlayerGrenade = nicePawn.FindPlayerGrenade(); + if(nicePawn.PlayerGrenade == none || !nicePawn.PlayerGrenade.HasAmmo()) + bWeReallyShould = false; + } } else if(bCauseAim) - bWeReallyShould = magAmmoRemainingClient >= GetFireMode(0).ammoPerFire && GetReloadStage() != RSTAGE_POSTREL; + bWeReallyShould = magAmmoRemainingClient >= GetFireMode(0).ammoPerFire && GetReloadStage() != RSTAGE_POSTREL; else - bWeReallyShould = true; - + bWeReallyShould = true; // If this is a magazine type reload - check player's preferences if(reloadType == RTYPE_MAG){ - if(GetReloadStage() == RSTAGE_TRASH) - bWeReallyShould = true; - else if(bCauseFire || bCauseAltFire) - bWeReallyShould = bWeReallyShould && nicePlayer.bRelCancelByFire; - else if(bCauseSwitch) - bWeReallyShould = bWeReallyShould && nicePlayer.bRelCancelBySwitching; - else if(cause == CANCEL_NADE) - bWeReallyShould = bWeReallyShould && nicePlayer.bRelCancelByNades; - else - bWeReallyShould = bWeReallyShould && nicePlayer.bRelCancelByAiming; + if(GetReloadStage() == RSTAGE_TRASH) + bWeReallyShould = true; + else if(bCauseFire || bCauseAltFire) + bWeReallyShould = bWeReallyShould && nicePlayer.bRelCancelByFire; + else if(bCauseSwitch) + bWeReallyShould = bWeReallyShould && nicePlayer.bRelCancelBySwitching; + else if(cause == CANCEL_NADE) + bWeReallyShould = bWeReallyShould && nicePlayer.bRelCancelByNades; + else if(bCauseAim) + bWeReallyShould = bWeReallyShould && nicePlayer.bRelCancelByAiming; } - // Allow interrupting auto reload (by pausing) to throw a grenade if(bAutoReload){ - if(cause == CANCEL_NADE && bWeReallyShould){ - bAutoReloadPaused = true; - autoReloadPauseFrame = GetCurrentAnimFrame(); - } - else if(currentAutoReloadStage == RAUTOSTAGE_UNINTERRUPTIBLE) - bWeReallyShould = false; + if(cause == CANCEL_NADE && bWeReallyShould){ + bAutoReloadPaused = true; + autoReloadPauseFrame = GetCurrentAnimFrame(); + } + else if(currentAutoReloadStage == RAUTOSTAGE_UNINTERRUPTIBLE) + bWeReallyShould = false; } - // Interrupt if we really should if(bIsReloading && bWeReallyShould){ - HideMagazine(bMagazineOut); - if(bAutoReload){ - bActualAllowAutoReloadSkip = bAllowAutoReloadSkip; - if(KFGameType(Level.Game) != none) - bActualAllowAutoReloadSkip = bAllowAutoReloadSkip - || KFGameType(Level.Game).WaveNum == KFGameType(Level.Game).FinalWave; - if(bActualAllowAutoReloadSkip && bCauseSwitch && !bAutoReloadPaused){ - AddAutoReloadedAmmo(); - bAutoReloadRateApplied = false; - } - else if(bCauseSwitch || bCauseNade) - bAutoReloadInterrupted = true; - } - ServerStopReload(); - bIsReloading = false; - bAutoReload = false; - lastEventCheckFrame = -1.0; - currentAutoReloadStage = RAUTOSTAGE_NONE; - PlayIdle(); + HideMagazine(bMagazineOut); + if(bAutoReload){ + bActualAllowAutoReloadSkip = bAllowAutoReloadSkip; + if(KFGameType(Level.Game) != none) + bActualAllowAutoReloadSkip = bAllowAutoReloadSkip + || KFGameType(Level.Game).WaveNum == KFGameType(Level.Game).FinalWave; + if(bActualAllowAutoReloadSkip && bCauseSwitch && !bAutoReloadPaused){ + AddAutoReloadedAmmo(); + bAutoReloadRateApplied = false; + } + else if(bCauseSwitch || bCauseNade) + bAutoReloadInterrupted = true; + } + ServerStopReload(); + bIsReloading = false; + bAutoReload = false; + lastEventCheckFrame = -1.0; + currentAutoReloadStage = RAUTOSTAGE_NONE; + PlayIdle(); - if(bCauseNade){ - if(cause == CANCEL_NADE && KFHumanPawn(Instigator) != none) - ClientThrowGrenade(); - else if(cause == CANCEL_COOKEDNADE && ScrnHumanPawn(Instigator) != none) - ClientCookGrenade(); - } - else if(cause == CANCEL_SWITCH) - ClientPutDown(); + if(bCauseNade){ + if(cause == CANCEL_NADE && KFHumanPawn(Instigator) != none) + ClientThrowGrenade(); + else if(cause == CANCEL_COOKEDNADE && ScrnHumanPawn(Instigator) != none) + ClientCookGrenade(); + } + else if(cause == CANCEL_SWITCH) + ClientPutDown(); } } - // Indicates if alt. fire should also interrupt reload simulated function bool AltFireCanForceInterruptReload(){ - if(FireModeClass[1] != none && FireModeClass[1] != class'KFMod.NoFire' && (NiceFire(FireMode[1]) == none || !NiceFire(FireMode[1]).fireState.base.bDisabled)) - return true; + if(FireModeClass[1] != none && FireModeClass[1] != class'KFMod.NoFire' && (NiceFire(FireMode[1]) == none || !NiceFire(FireMode[1]).bDisabled)) + return true; return false; } - // Auxiliary functions to force certain function on client-side simulated function bool ClientPutDown(){ return PutDown(); } simulated function ClientThrowGrenade(){ if(KFHumanPawn(Instigator) != none) - KFHumanPawn(Instigator).ThrowGrenade(); + KFHumanPawn(Instigator).ThrowGrenade(); } simulated function ClientCookGrenade(){ if(ScrnHumanPawn(Instigator) != none) - ScrnHumanPawn(Instigator).CookGrenade(); + ScrnHumanPawn(Instigator).CookGrenade(); } - // Functions that we need to reload in order to allow reload interruption on certain actions simulated function bool PutDown(){ if(NicePlayerController(Instigator.Controller) != none) - ClientForceInterruptReload(CANCEL_SWITCH); + ClientForceInterruptReload(CANCEL_SWITCH); if(!bIsReloading) - HideMagazine(bMagazineOut); + HideMagazine(bMagazineOut); TurnOffLaser(); return super.PutDown(); } simulated function Fire(float F){ if(NicePlayerController(Instigator.Controller) != none) - ClientForceInterruptReload(CANCEL_FIRE); + ClientForceInterruptReload(CANCEL_FIRE); super.Fire(F); } simulated function AltFire(float F){ if(NicePlayerController(Instigator.Controller) != none) - ClientForceInterruptReload(CANCEL_ALTFIRE); + ClientForceInterruptReload(CANCEL_ALTFIRE); Super.AltFire(F); // Also request auto reload on alt. fire if(!bHasSecondaryAmmo && AltFireCanForceInterruptReload() && magAmmoRemainingClient <= 0) - ServerRequestAutoReload(); + ServerRequestAutoReload(); else if(bHasSecondaryAmmo && !bAutoReload && FireModeClass[1] != class'KFMod.NoFire' && secondaryCharge <= 0) - ResumeAutoReload(autoReloadsDescriptions[currentAutoReload].resumeFrame); + ResumeAutoReload(autoReloadsDescriptions[currentAutoReload].resumeFrame); } simulated exec function ToggleIronSights(){ if(NicePlayerController(Instigator.Controller) != none) - ClientForceInterruptReload(CANCEL_AIM); + ClientForceInterruptReload(CANCEL_AIM); Super.ToggleIronSights(); } simulated exec function IronSightZoomIn(){ if(NicePlayerController(Instigator.Controller) != none) - ClientForceInterruptReload(CANCEL_AIM); + ClientForceInterruptReload(CANCEL_AIM); Super.IronSightZoomIn(); } - // Function for filling-up reload stages in a single reload simulated function FillSubReloadStages(){} - simulated function UpdateSingleReloadVars(){ reloadPreEndFrame = 0.0; if(reloadStages.Length > 0) - reloadEndFrame = reloadStages[reloadStages.Length - 1]; + reloadEndFrame = reloadStages[reloadStages.Length - 1]; else - reloadEndFrame = 0.0; + reloadEndFrame = 0.0; reloadChargeStartFrame = -1.0; reloadChargeEndFrame = -1.0; bHasChargePhase = false; } - // Function that setups all the variable for next reload; this DOES NOT start reload animation or reload itself simulated function SetupReloadVars(optional bool bIsActive, optional int animationIndex){ if(Role == ROLE_Authority) - return; + return; bIsReloading = true; bAutoReloadRateApplied = false; bAutoReloadInterrupted = false; @@ -1319,15 +583,14 @@ simulated function SetupReloadVars(optional bool bIsActive, optional int animati currentAutoReload = 0; activeReloadState = ACTR_NONE; if(bIsActive){ - bAutoReload = true; - currentAutoReload = Clamp(animationIndex, 0, autoReloadsDescriptions.Length - 1); + bAutoReload = true; + currentAutoReload = Clamp(animationIndex, 0, autoReloadsDescriptions.Length - 1); } } - // Reset all the necessary variables after reloading simulated function ResetReloadVars(){ if(Role == ROLE_Authority) - return; + return; ServerStopReload(); bIsReloading = false; bAutoReload = false; @@ -1335,45 +598,41 @@ simulated function ResetReloadVars(){ currentAutoReloadStage = RAUTOSTAGE_NONE; currentAutoReload = 0; activeReloadState = ACTR_NONE; - quickHeadshots = 0; ClientTryPendingWeapon(); } - // Does what 'SetAnimFrame' does + updates 'lastEventCheckFrame' for correct event handling // Use this instead of 'SetAnimFrame', unless you have a very specific need and know what you're doing simulated function ScrollAnim(float newFrame){ SetAnimFrame(newFrame); lastEventCheckFrame = newFrame; } - // Starts reload at given rate from given stage. // If specified stage is either 'RSTAGE_NONE' or 'RSTAGE_PREREL', - start reload from the beginning simulated function PlayReloadAnimation(float rate, ERelStage stage){ if(!HasAnim(ReloadAnim)) - return; + return; PlayAnim(ReloadAnim, rate, 0.0); if(stage != RSTAGE_NONE && stage != RSTAGE_PREREL){ - if(stage == RSTAGE_MAINREL){ - ScrollAnim(reloadMagStartFrame); - HideMagazine(false); - } - else if(stage == RSTAGE_POSTREL) - ScrollAnim(reloadChargeStartFrame); - else if(stage == RSTAGE_TRASH) - ScrollAnim(reloadChargeEndFrame); + if(stage == RSTAGE_MAINREL){ + ScrollAnim(reloadMagStartFrame); + HideMagazine(false); + } + else if(stage == RSTAGE_POSTREL) + ScrollAnim(reloadChargeStartFrame); + else if(stage == RSTAGE_TRASH) + ScrollAnim(reloadChargeEndFrame); } } - // Resumes previously interrupted auto reload. // Doesn't do any check for whether or not interruption took place simulated function ResumeAutoReload(float startFrame){ local float ReloadMulti; if(!HasAnim(autoReloadsDescriptions[currentAutoReload].animName)) - return; + return; ReloadMulti = GetCurrentReloadMult(); PlayAnim(autoReloadsDescriptions[currentAutoReload].animName, AutoReloadBaseRate() * ReloadMulti, 0.0); if(startFrame <= 0) - startFrame = 0.0; + startFrame = 0.0; ScrollAnim(startFrame); ServerReload((1 - startFrame) * AutoReloadBaseRate() / ReloadMulti); SetupReloadVars(true, currentAutoReload); @@ -1386,255 +645,220 @@ simulated function float GetFittingReloadSpeed(){ simulated function UpdateReloadRate(){ lastRecordedReloadRate = GetFittingReloadSpeed(); if(bIsReloading) - ChangeReloadRate(lastRecordedReloadRate); + ChangeReloadRate(lastRecordedReloadRate); } - // Changes rate of current animation, allowing it to continue from the same frame simulated function ChangeReloadRate(float newRate){ local name SeqName; local float AnimFrame, AnimRate; GetAnimParams(0, SeqName, AnimFrame, AnimRate); if(AnimFrame < 0) - AnimFrame = 0; + AnimFrame = 0; if(!bAutoReload && SeqName != ReloadAnim) - return; + return; if(bAutoReload) - PlayAnim(SeqName, newRate, 0.0); + PlayAnim(SeqName, newRate, 0.0); else - PlayReloadAnimation(newRate, RSTAGE_NONE); + PlayReloadAnimation(newRate, RSTAGE_NONE); ScrollAnim(AnimFrame); } - // New handler for client's reload request // Can be called directly as a command or automatically, by intercepting ReloadMeNow command (handled in 'NiceInteraction') exec simulated function ClientReloadMeNow(){ local float ReloadMulti; local NicePlayerController nicePlayer; local class niceVet; + if(reloadType != RTYPE_AUTO && bAutoReload && !IsMagazineFull()) + ClientForceInterruptReload(CANCEL_RELOAD); nicePlayer = NicePlayerController(Instigator.Controller); if(nicePlayer != none) - niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePlayer.PlayerReplicationInfo); + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePlayer.PlayerReplicationInfo); bGiveObsessiveBonus = false; if(bIsReloading) - AttemptActiveReload(); + AttemptActiveReload(); else if(niceVet.static.hasSkill(nicePlayer, class'NiceSkillSupportObsessive') && GetMagazineAmmo() >= float(MagCapacity) * class'NiceSkillSupportObsessive'.default.reloadLevel) - bGiveObsessiveBonus = true; + bGiveObsessiveBonus = true; if(!AllowReload()) - return; + return; if(reloadType == RTYPE_AUTO) - ResumeAutoReload(autoReloadsDescriptions[currentAutoReload].resumeFrame); + ResumeAutoReload(autoReloadsDescriptions[currentAutoReload].resumeFrame); else{ - SetupReloadVars(); - if(bHasAimingMode && bAimingRifle && !bAutoReload){ - FireMode[1].bIsFiring = false; - ZoomOut(false); - ServerZoomOut(false); - } - subReloadStage = 0; - ReloadMulti = GetCurrentReloadMult(); - if(bMagazineOut && reloadMagStartFrame >= 0){ - ServerReload((1 - reloadMagStartFrame) * default.ReloadRate / ReloadMulti); - PlayReloadAnimation(default.ReloadAnimRate * ReloadMulti, RSTAGE_MAINREL); - } - else{ - ServerReload(default.ReloadRate / ReloadMulti); - PlayReloadAnimation(default.ReloadAnimRate * ReloadMulti, RSTAGE_NONE); - } + SetupReloadVars(); + if(bHasAimingMode && bAimingRifle && !bAutoReload){ + FireMode[1].bIsFiring = false; + ZoomOut(false); + ServerZoomOut(false); + } + subReloadStage = 0; + ReloadMulti = GetCurrentReloadMult(); + if(bMagazineOut && reloadMagStartFrame >= 0){ + ServerReload((1 - reloadMagStartFrame) * default.ReloadRate / ReloadMulti); + PlayReloadAnimation(default.ReloadAnimRate * ReloadMulti, RSTAGE_MAINREL); + } + else{ + ServerReload(default.ReloadRate / ReloadMulti); + PlayReloadAnimation(default.ReloadAnimRate * ReloadMulti, RSTAGE_NONE); + } } } - // Tells server that reload was started and how long should it take function ServerReload(float duration, optional bool autoReload){ bIsReloading = true; Instigator.SetAnimAction(WeaponReloadAnim); ReloadDeadLine = Level.TimeSeconds + duration; if(bHasAimingMode && bAimingRifle && !autoReload) - FireMode[1].bIsFiring = false; + FireMode[1].bIsFiring = false; if(Level.Game.NumPlayers > 1 && KFGameType(Level.Game).bWaveInProgress && KFPlayerController(Instigator.Controller) != none && - Level.TimeSeconds - KFPlayerController(Instigator.Controller).LastReloadMessageTime > KFPlayerController(Instigator.Controller).ReloadMessageDelay){ - KFPlayerController(Instigator.Controller).Speech('AUTO', 2, ""); - KFPlayerController(Instigator.Controller).LastReloadMessageTime = Level.TimeSeconds; + Level.TimeSeconds - KFPlayerController(Instigator.Controller).LastReloadMessageTime > KFPlayerController(Instigator.Controller).ReloadMessageDelay){ + KFPlayerController(Instigator.Controller).Speech('AUTO', 2, ""); + KFPlayerController(Instigator.Controller).LastReloadMessageTime = Level.TimeSeconds; } } - // Shift deadline of reload on server function ServerShiftReloadTime(float delta){ if(bIsReloading) - ReloadDeadLine += delta; + ReloadDeadLine += delta; } - // Forces reload to stop on server function ServerStopReload(){ bIsReloading = false; } - // Reloaded to implement new reload mechanism simulated function WeaponTick(float dt){ local int i; local name SeqName; - local float bringupAnimDuration; local float ReloadMulti; local float AnimFrame, AnimRate; local ERelStage newStage; - UpdateAppearance(); if(lastRecordedReloadRate != GetFittingReloadSpeed()) - UpdateReloadRate(); - - if(Role < ROLE_Authority && variantSwapState != SWAP_NONE){ - if(variantSwapCountdown > 0) - variantSwapCountdown -= dt; - if(variantSwapCountdown <= 0 && variantSwapState == SWAP_PUTDOWN){ - SetVariant(pendingVariant); - UpdateAppearance(); - bringupAnimDuration = GetAnimDuration(SelectAnim); - PlayAnim(SelectAnim, bringupAnimDuration / variantSwapTime); - variantSwapState = SWAP_BRINGUP; - variantSwapCountdown = variantSwapTime; - } - if(variantSwapCountdown <= 0 && variantSwapState == SWAP_BRINGUP){ - variantSwapState = SWAP_NONE; - variantSwapCountdown = 0; - } - } - + UpdateReloadRate(); // Resume charging magazine weapon next time we can if(bNeedToCharge && GetReloadStage() == RSTAGE_NONE){ - GetAnimParams(0, SeqName, AnimFrame, AnimRate); - if(SeqName == IdleAnim){ - ReloadMulti = GetCurrentReloadMult(); - if(Role == ROLE_Authority) - ServerReload((1 - reloadChargeStartFrame) * default.ReloadRate / ReloadMulti); - else{ - SetupReloadVars(); - PlayReloadAnimation(ReloadAnimRate * ReloadMulti, RSTAGE_POSTREL); - } - } + GetAnimParams(0, SeqName, AnimFrame, AnimRate); + if(SeqName == IdleAnim){ + ReloadMulti = GetCurrentReloadMult(); + if(Role == ROLE_Authority) + ServerReload((1 - reloadChargeStartFrame) * default.ReloadRate / ReloadMulti); + else{ + SetupReloadVars(); + PlayReloadAnimation(ReloadAnimRate * ReloadMulti, RSTAGE_POSTREL); + } + } } - // Resume auto reload from pause next time we can if(bAutoReloadPaused && Role < ROLE_Authority && ClientGrenadeState == GN_NONE){ - GetAnimParams(0, SeqName, AnimFrame, AnimRate); - if(SeqName == IdleAnim) - ResumeAutoReload(autoReloadPauseFrame); + GetAnimParams(0, SeqName, AnimFrame, AnimRate); + if(SeqName == IdleAnim) + ResumeAutoReload(autoReloadPauseFrame); } - // Resume reloading in case auto reload was interrupted as soon as possible if(bAutoReloadInterrupted && Role < ROLE_Authority && ClientGrenadeState == GN_none){ - GetAnimParams(0, SeqName, AnimFrame, AnimRate); - if(SeqName == IdleAnim) - ResumeAutoReload(autoReloadsDescriptions[currentAutoReload].resumeFrame); + GetAnimParams(0, SeqName, AnimFrame, AnimRate); + if(SeqName == IdleAnim) + ResumeAutoReload(autoReloadsDescriptions[currentAutoReload].resumeFrame); } - // Try and detect when animation that should trigger auto reload starts if(autoReloadsDescriptions.Length > 0 && currentAutoReloadStage == RAUTOSTAGE_NONE && Role < ROLE_Authority){ - GetAnimParams(0, SeqName, AnimFrame, AnimRate); - for(i = 0;i < autoReloadsDescriptions.Length;i ++) - if(SeqName == autoReloadsDescriptions[i].animName && AnimFrame < autoReloadsDescriptions[i].trashStartFrame){ - // Since animation is already running - all we need to do is to setup appropriate variables - SetupReloadVars(true, i); - break; - } + GetAnimParams(0, SeqName, AnimFrame, AnimRate); + for(i = 0;i < autoReloadsDescriptions.Length;i ++) + if(SeqName == autoReloadsDescriptions[i].animName && AnimFrame < autoReloadsDescriptions[i].trashStartFrame){ + // Since animation is already running - all we need to do is to setup appropriate variables + SetupReloadVars(true, i); + break; + } } - // Random TWI's code block appears! if(bHasAimingMode && bForceLeaveIronsights) - if(!shouldLeaveIronsight()) - bForceLeaveIronsights = false; + if(!shouldLeaveIronsight()) + bForceLeaveIronsights = false; if(bHasAimingMode){ - if(bForceLeaveIronsights){ - if(bAimingRifle){ - ZoomOut(true); - if(Role < ROLE_Authority) - ServerZoomOut(false); - } - bForceLeaveIronsights = false; - } - if(ForceZoomOutTime > 0){ - if(bAimingRifle){ - if(Level.TimeSeconds - ForceZoomOutTime > 0){ - ForceZoomOutTime = 0; - ZoomOut(true); - if(Role < ROLE_Authority) - ServerZoomOut(false); - } - } - else - ForceZoomOutTime = 0; - } + if(bForceLeaveIronsights){ + if(bAimingRifle){ + ZoomOut(true); + if(Role < ROLE_Authority) + ServerZoomOut(false); + } + bForceLeaveIronsights = false; + } + if(ForceZoomOutTime > 0){ + if(bAimingRifle){ + if(Level.TimeSeconds - ForceZoomOutTime > 0){ + ForceZoomOutTime = 0; + ZoomOut(true); + if(Role < ROLE_Authority) + ServerZoomOut(false); + } + } + else + ForceZoomOutTime = 0; + } } - // We want to be up to date on this one UpdateMagCapacity(Instigator.PlayerReplicationInfo); // Next we have 3 possibilities. if(Role == ROLE_Authority){ - // 1. We're on the server. Then just check if we've reached reload deadline. - if(Level.TimeSeconds >= ReloadDeadLine) - bIsReloading = false; + // 1. We're on the server. Then just check if we've reached reload deadline. + if(Level.TimeSeconds >= ReloadDeadLine) + bIsReloading = false; } else{ - if(bAutoReload) - // 2. It's auto reload. Handle it in it's own tick function. - AutoReloadTick(); - else if(Role < ROLE_Authority){ - // 3. It's not. Then just handle stage swapping for magazine ('goThroughStages' function) and single reloads ('goThroughSubStages' function) - newStage = GetReloadStage(); - if(reloadType == RTYPE_SINGLE && newStage == RSTAGE_MAINREL) - goThroughSubStages(); - if(currentRelStage != newStage) - goThroughStages(currentRelStage, newStage); - } - if(Role < ROLE_Authority){ - // Call events - GetAnimParams(0, SeqName, AnimFrame, AnimRate); - if(newStage == RSTAGE_NONE && !bAutoReload) - AnimFrame = 1.0; - if(newStage != RSTAGE_NONE || lastEventCheckFrame > 0 || bAutoReload) - HandleReloadEvents(lastEventCheckFrame, AnimFrame); - if(newStage == RSTAGE_NONE && !bAutoReload) - lastEventCheckFrame = -1.0; - } + if(bAutoReload) + // 2. It's auto reload. Handle it in it's own tick function. + AutoReloadTick(); + else if(Role < ROLE_Authority){ + // 3. It's not. Then just handle stage swapping for magazine ('goThroughStages' function) and single reloads ('goThroughSubStages' function) + newStage = GetReloadStage(); + if(reloadType == RTYPE_SINGLE && newStage == RSTAGE_MAINREL) + goThroughSubStages(); + if(currentRelStage != newStage) + goThroughStages(currentRelStage, newStage); + } + if(Role < ROLE_Authority){ + // Call events + GetAnimParams(0, SeqName, AnimFrame, AnimRate); + if(newStage == RSTAGE_NONE && !bAutoReload) + AnimFrame = 1.0; + if(newStage != RSTAGE_NONE || lastEventCheckFrame > 0 || bAutoReload) + HandleReloadEvents(lastEventCheckFrame, AnimFrame); + if(newStage == RSTAGE_NONE && !bAutoReload) + lastEventCheckFrame = -1.0; + } } - // Some other TWI's code leftovers if((Level.NetMode == NM_Client) || Instigator == none || KFFriendlyAI(Instigator.Controller) == none && Instigator.PlayerReplicationInfo == none) - return; - + return; // Turn it off on death / battery expenditure if(FlashLight != none){ - // Keep the 1P weapon client beam up to date. - AdjustLightGraphic(); - if(FlashLight.bHasLight){ - if(Instigator.Health <= 0 || KFHumanPawn(Instigator).TorchBatteryLife <= 0 || Instigator.PendingWeapon != none ){ - KFHumanPawn(Instigator).bTorchOn = false; - ServerSpawnLight(); - } - } + // Keep the 1P weapon client beam up to date. + AdjustLightGraphic(); + if(FlashLight.bHasLight){ + if(Instigator.Health <= 0 || KFHumanPawn(Instigator).TorchBatteryLife <= 0 || Instigator.PendingWeapon != none ){ + KFHumanPawn(Instigator).bTorchOn = false; + ServerSpawnLight(); + } + } } } - simulated function HandleReloadEvents(float oldFrame, float newFrame){ local int i; local float currEventFrame; - // Old reload ended and new started between checks somehow, no point in it, but try to fix that if(oldFrame > newFrame){ - if(oldFrame < 1.0) - HandleReloadEvents(oldFrame, 1.0); - if(newFrame > 0.0) - HandleReloadEvents(0.0, newFrame); - return; + if(oldFrame < 1.0) + HandleReloadEvents(oldFrame, 1.0); + if(newFrame > 0.0) + HandleReloadEvents(0.0, newFrame); + return; } for(i = 0;i < relEvents.Length;i ++){ - currEventFrame = relEvents[i].eventFrame; - if(oldFrame < currEventFrame && newFrame >= currEventFrame) - ReloadEvent(relEvents[i].eventName); + currEventFrame = relEvents[i].eventFrame; + if(oldFrame < currEventFrame && newFrame >= currEventFrame) + ReloadEvent(relEvents[i].eventName); } if(newFrame > lastEventCheckFrame) - lastEventCheckFrame = newFrame; + lastEventCheckFrame = newFrame; } - simulated function ReloadEvent(string eventName){} - // This function is called each tick while auto reload is active simulated function AutoReloadTick(){ local bool bFinishAutoReload; @@ -1644,112 +868,107 @@ simulated function AutoReloadTick(){ GetAnimParams(0, SeqName, AnimFrame, AnimRate); // Apply reload rate to the animation's speed when it's time if(AnimFrame > autoReloadsDescriptions[currentAutoReload].speedFrame && !bAutoReloadRateApplied){ - ChangeReloadRate(AutoReloadBaseRate() * GetCurrentReloadMult()); - bAutoReloadRateApplied = true; + ChangeReloadRate(AutoReloadBaseRate() * GetCurrentReloadMult()); + bAutoReloadRateApplied = true; } // Change state to interruptible and set reload to finish if there's no ammo if(AnimFrame > autoReloadsDescriptions[currentAutoReload].canInterruptFrame){ - if(autoReloadAmmo() > 0){ - currentAutoReloadStage = RAUTOSTAGE_INTERRUPTIBLE; - ClientTryPendingWeapon(); - } - else{ - bFinishAutoReload = true; - PlayIdle(); - } + if(autoReloadAmmo() > 0){ + currentAutoReloadStage = RAUTOSTAGE_INTERRUPTIBLE; + ClientTryPendingWeapon(); + } + else{ + bFinishAutoReload = true; + PlayIdle(); + } } // Might as well end reload when we enter trash stage (or when animation is finished) if(SeqName != autoReloadsDescriptions[currentAutoReload].animName || AnimFrame > autoReloadsDescriptions[currentAutoReload].trashStartFrame){ - bFinishAutoReload = true; - AddAutoReloadedAmmo(); + bFinishAutoReload = true; + AddAutoReloadedAmmo(); } // Finish the reload as asked if(bFinishAutoReload) - ResetReloadVars(); + ResetReloadVars(); } - simulated function float AutoReloadBaseRate(){ if(reloadType == RTYPE_AUTO && FireModeClass[0] != none - && (!bHasSecondaryAmmo || FireMode[1] != Class'KFMod.NoFire')) - return FireModeClass[0].default.FireAnimRate; + && (!bHasSecondaryAmmo || FireMode[1] != Class'KFMod.NoFire')) + return FireModeClass[0].default.FireAnimRate; return FireModeClass[1].default.FireAnimRate; } - // Called when current state of reload changes; only called on client side simulated function ReloadChangedStage(ERelStage prevStage, ERelStage newStage){ local NiceHumanPawn nicePawn; local class niceVet; nicePawn = NiceHumanPawn(Instigator); if(nicePawn != none) - niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.PlayerReplicationInfo); + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.PlayerReplicationInfo); // Reload was canceled, so all that is meaningless if(!bIsReloading) - return; + return; if(reloadType == RTYPE_MAG){ - if(newStage == RSTAGE_MAINREL){ - bNeedToCharge = false; - ServerSetCharging(bNeedToCharge); - bMagazineOut = true; - MagAmmoRemainingClient = 0; - if(bHasChargePhase && bRoundInChamber) - MagAmmoRemainingClient ++; - ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); - } - else if(newStage == RSTAGE_POSTREL){ - bMagazineOut = false; - HideMagazine(false); - if(bHasChargePhase){ - if(bRoundInChamber){ - bNeedToCharge = false; - PlayIdle(); - } - else - bNeedToCharge = true; - } - ServerSetCharging(bNeedToCharge); - } - else if(newStage == RSTAGE_TRASH && (!bHasChargePhase || bRoundInChamber)){ - bMagazineOut = false; - HideMagazine(false); - } - else if(newStage == RSTAGE_NONE) - ResetReloadVars(); - if(prevStage == RSTAGE_MAINREL && newStage != RSTAGE_NONE) - AddReloadedAmmo(); - if(prevStage == RSTAGE_POSTREL && newStage == RSTAGE_TRASH){ - bNeedToCharge = false; - bRoundInChamber = true; - AmmoStackPush(ammoState[0], ammoState[0].currentAmmoType); - ServerSetCharging(bNeedToCharge); - ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); - } - if(newStage == RSTAGE_TRASH) - ClientTryPendingWeapon(); + if(newStage == RSTAGE_MAINREL){ + bNeedToCharge = false; + ServerSetCharging(bNeedToCharge); + bMagazineOut = true; + MagAmmoRemainingClient = 0; + if(bHasChargePhase && bRoundInChamber) + MagAmmoRemainingClient ++; + ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); + } + else if(newStage == RSTAGE_POSTREL){ + bMagazineOut = false; + HideMagazine(false); + if(bHasChargePhase){ + if(bRoundInChamber){ + bNeedToCharge = false; + PlayIdle(); + } + else + bNeedToCharge = true; + } + ServerSetCharging(bNeedToCharge); + } + else if(newStage == RSTAGE_TRASH && (!bHasChargePhase || bRoundInChamber)){ + bMagazineOut = false; + HideMagazine(false); + } + else if(newStage == RSTAGE_NONE) + ResetReloadVars(); + if(prevStage == RSTAGE_MAINREL && newStage != RSTAGE_NONE) + AddReloadedAmmo(); + if(prevStage == RSTAGE_POSTREL && newStage == RSTAGE_TRASH){ + bNeedToCharge = false; + bRoundInChamber = true; + ServerSetCharging(bNeedToCharge); + ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); + } + if(newStage == RSTAGE_TRASH) + ClientTryPendingWeapon(); } else if(reloadType == RTYPE_SINGLE){ - if(newStage == RSTAGE_NONE) - ResetReloadVars(); - if(prevStage == RSTAGE_MAINREL && bIsReloading) - goThroughSubStages(true); + if(newStage == RSTAGE_NONE) + ResetReloadVars(); + if(prevStage == RSTAGE_MAINREL && bIsReloading) + goThroughSubStages(true); } } - // Return current magazine (also has limited use for single reload) stage of reload simulated function ERelStage GetReloadStage(){ local name SeqName; local float AnimFrame, AnimRate; GetAnimParams(0, SeqName, AnimFrame, AnimRate); if(SeqName != ReloadAnim) - return RSTAGE_NONE; + return RSTAGE_NONE; if(AnimFrame < reloadPreEndFrame) - return RSTAGE_PREREL; + return RSTAGE_PREREL; if(AnimFrame < reloadEndFrame) - return RSTAGE_MAINREL; + return RSTAGE_MAINREL; if(AnimFrame < reloadChargeEndFrame && bHasChargePhase) - return RSTAGE_POSTREL; + return RSTAGE_POSTREL; return RSTAGE_TRASH; } - // Returns next magazine reload stage simulated function ERelStage GetNextReloadStage(ERelStage curr){ local byte i; @@ -1757,57 +976,54 @@ simulated function ERelStage GetNextReloadStage(ERelStage curr){ i ++; curr = ERelStage(i); if(curr == RSTAGE_POSTREL && !bHasChargePhase) - curr = RSTAGE_TRASH; + curr = RSTAGE_TRASH; return curr; } - // Function that goes between given 'prev' and 'next' stages by passing every intermediate stage and calling 'ReloadChangedStage' simulated function GoThroughStages(ERelStage prev, ERelStage next){ local ERelStage theEnum, limitStage; if(prev < next || next == RSTAGE_NONE){ - theEnum = prev; - if(next == RSTAGE_NONE) - limitStage = RSTAGE_TRASH; - else - limitStage = next; - while(theEnum < limitStage){ - theEnum = GetNextReloadStage(theEnum); - ReloadChangedStage(currentRelStage, theEnum); - currentRelStage = theEnum; - } + theEnum = prev; + if(next == RSTAGE_NONE) + limitStage = RSTAGE_TRASH; + else + limitStage = next; + while(theEnum < limitStage){ + theEnum = GetNextReloadStage(theEnum); + ReloadChangedStage(currentRelStage, theEnum); + currentRelStage = theEnum; + } } if(prev > next){ - ReloadChangedStage(prev, next); - currentRelStage = next; + ReloadChangedStage(prev, next); + currentRelStage = next; } } - simulated function GoThroughSubStages(optional bool bReloadEnded){ local float AnimFrame; AnimFrame = GetCurrentAnimFrame(); // Conditions: 1. Is this valid stage? // 2, 3. Can we even load more ammo? while(subReloadStage < reloadStages.Length && MagAmmoRemainingClient < MagCapacity && AmmoAmount(0) - MagAmmoRemainingClient > 0) - if(bReloadEnded || AnimFrame > reloadStages[subReloadStage]){ - AddReloadedAmmo(); - subReloadStage ++; - } - else break; + if(bReloadEnded || AnimFrame > reloadStages[subReloadStage]){ + AddReloadedAmmo(); + subReloadStage ++; + } + else break; // If reload hasn't ended, we can only load one more shell, but aren't yet at animation's end - scroll animation // 'subReloadStage' shouldn't be zero at this point, but just in case check // During reload client dictates size of the magazine if(subReloadStage > 0 && !bReloadEnded && subReloadStage != reloadStages.Length && (MagAmmoRemainingClient >= MagCapacity || MagAmmoRemainingClient - AmmoAmount(0) >= 0)){ - if(alwaysPlayAnimEnd){ - AnimFrame = reloadStages[reloadStages.Length - 1] + AnimFrame - reloadStages[subReloadStage - 1]; - ScrollAnim(AnimFrame); // Current animation position - previous ammo load position - } - else - PlayIdle(); - subReloadStage = reloadStages.Length - 1; + if(alwaysPlayAnimEnd){ + AnimFrame = reloadStages[reloadStages.Length - 1] + AnimFrame - reloadStages[subReloadStage - 1]; + ScrollAnim(AnimFrame); // Current animation position - previous ammo load position + } + else + PlayIdle(); + subReloadStage = reloadStages.Length - 1; } } - //Auzilary unction for easy initial generation of sub reload stages for single reload simulated function GenerateReloadStages(int stagesAmount, int framesAmount, int firstLoadFrame, int loadDelta){ local int i; @@ -1816,104 +1032,94 @@ simulated function GenerateReloadStages(int stagesAmount, int framesAmount, int reloadStages.Length = 0; frame = firstLoadFrame; for(i = 0;i < stagesAmount;i ++){ - // Next load time - convFrame = float(frame) / float(framesAmount); - reloadStages[reloadStages.Length] = convFrame; - // Shift to the next one - frame += loadDelta; + // Next load time + convFrame = float(frame) / float(framesAmount); + reloadStages[reloadStages.Length] = convFrame; + // Shift to the next one + frame += loadDelta; } } - simulated function HideMagazine(bool bHide){ if(magazineBone == '') - return; + return; if(bHide) - SetBoneScale(0, 0.0, magazineBone); + SetBoneScale(0, 0.0, magazineBone); else - SetBoneScale(0, 1.0, magazineBone); + SetBoneScale(0, 1.0, magazineBone); } - simulated function float GetCurrentAnimFrame(){ local name SeqName; local float AnimFrame, AnimRate; GetAnimParams(0, SeqName, AnimFrame, AnimRate); return AnimFrame; } - simulated function BringUp(optional Weapon PrevWeapon){ // Change HUD icons if necessary if(Role < ROLE_Authority){ - if(bChangeClipIcon && hudClipTexture != none) - HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).ClipsIcon.WidgetTexture = hudClipTexture; - else - HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).ClipsIcon.WidgetTexture = - class'ScrnHUD'.default.ClipsIcon.WidgetTexture; - if(bChangeBulletsIcon && hudBulletsTexture != none) - HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).BulletsInClipIcon.WidgetTexture = - hudBulletsTexture; - else - HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).BulletsInClipIcon.WidgetTexture = - class'ScrnHUD'.default.BulletsInClipIcon.WidgetTexture; - if(bChangeSecondaryIcon && hudSecondaryTexture != none) - HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).SecondaryClipsIcon.WidgetTexture = - hudSecondaryTexture; - else - HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).SecondaryClipsIcon.WidgetTexture = - class'ScrnHUD'.default.SecondaryClipsIcon.WidgetTexture; + if(bChangeClipIcon && hudClipTexture != none) + HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).ClipsIcon.WidgetTexture = hudClipTexture; + else + HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).ClipsIcon.WidgetTexture = + class'ScrnHUD'.default.ClipsIcon.WidgetTexture; + if(bChangeBulletsIcon && hudBulletsTexture != none) + HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).BulletsInClipIcon.WidgetTexture = + hudBulletsTexture; + else + HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).BulletsInClipIcon.WidgetTexture = + class'ScrnHUD'.default.BulletsInClipIcon.WidgetTexture; + if(bChangeSecondaryIcon && hudSecondaryTexture != none) + HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).SecondaryClipsIcon.WidgetTexture = + hudSecondaryTexture; + else + HUDKillingFloor(NicePlayerController(instigator.controller).myHUD).SecondaryClipsIcon.WidgetTexture = + class'ScrnHUD'.default.SecondaryClipsIcon.WidgetTexture; } HideMagazine(bMagazineOut); super.BringUp(PrevWeapon); ApplyLaserState(); } - function ServerSetCharging(bool bNewNeedToCharge){ bNeedToCharge = bNewNeedToCharge; } - // Function that's supposed to return current amount of ammo that's used for auto reload for this weapon simulated function int AutoReloadAmmo(){ if(FireModeClass[1] == class'KFMod.NoFire') - return AmmoAmount(0); + return AmmoAmount(0); else - return AmmoAmount(1); + return AmmoAmount(1); } - simulated function int GetMagazineAmmo(){ if(Role < ROLE_Authority) - return MagAmmoRemainingClient; + return MagAmmoRemainingClient; else - return MagAmmoRemaining; + return MagAmmoRemaining; } - simulated function bool AllowReload(){ local int actualMagSize; actualMagSize = GetMagazineAmmo(); if(bHasChargePhase && bRoundInChamber) - actualMagSize --; + actualMagSize --; UpdateMagCapacity(Instigator.PlayerReplicationInfo); if(FireMode[0].IsFiring() || FireMode[1].IsFiring() || - bIsReloading || actualMagSize >= MagCapacity || - ClientState == WS_BringUp || - AmmoAmount(0) <= GetMagazineAmmo()) - return false; + bIsReloading || IsMagazineFull() || + ClientState == WS_BringUp ) + return false; return true; } - simulated function bool IsMagazineFull(){ - local int actualMagSize; - actualMagSize = GetMagazineAmmo(); + local int totalMagSize, actualMagSize; + totalMagSize = GetMagazineAmmo(); + actualMagSize = totalMagSize; if(bHasChargePhase && bRoundInChamber) - actualMagSize --; - return (actualMagSize >= MagCapacity || actualMagSize >= AmmoAmount(0)); + actualMagSize --; + return (actualMagSize >= MagCapacity || totalMagSize >= AmmoAmount(0)); } - exec function ReloadMeNow(){ local NicePlayerController nicePlayer; nicePlayer = NicePlayerController(Instigator.Controller); if(nicePlayer != none && nicePlayer.bFlagUseServerReload) - ClientReloadMeNow(); + ClientReloadMeNow(); } - simulated function float GetCurrentReloadMult(){ local float ReloadMulti; local NiceHumanPawn nicePawn; @@ -1922,31 +1128,29 @@ simulated function float GetCurrentReloadMult(){ nicePawn = NiceHumanPawn(Instigator); nicePlayer = NicePlayerController(Instigator.Controller); if(nicePawn != none) - niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.PlayerReplicationInfo); + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.PlayerReplicationInfo); if(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none) - ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self); + ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self); else - ReloadMulti = 1.0; + ReloadMulti = 1.0; if(bGiveObsessiveBonus) - ReloadMulti *= class'NiceSkillSupportObsessive'.default.reloadBonus; + ReloadMulti *= class'NiceSkillSupportObsessive'.default.reloadBonus; // Active reload speedup if(activeReloadState == ACTR_SUCCESS) - ReloadMulti *= activeSpeedup; + ReloadMulti *= activeSpeedup; else if(activeReloadState == ACTR_FAIL) - ReloadMulti *= activeSlowdown; + ReloadMulti *= activeSlowdown; else if(bCanActiveReload && reloadType == RTYPE_SINGLE && subReloadStage == 0) - ReloadMulti *= activeSpeedup; + ReloadMulti *= activeSpeedup; if(nicePlayer != none && niceVet.static.hasSkill(nicePlayer, class'NiceSkillCommandoZEDProfessional')) - ReloadMulti /= (Level.TimeDilation / 1.1); + ReloadMulti /= (Level.TimeDilation / 1.1); if(bAutoReload && bAutoReloadRateApplied) - ReloadMulti *= autoReloadSpeedModifier; + ReloadMulti *= autoReloadSpeedModifier; return ReloadMulti; } - function ServerRequestAutoReload(){ ClientReloadMeNow(); } - simulated function AttemptActiveReload(optional bool bForce){ local float windowStart; local float windowLenght; @@ -1957,173 +1161,151 @@ simulated function AttemptActiveReload(optional bool bForce){ // Need this for skill check nicePawn = NiceHumanPawn(Instigator); if(nicePawn != none) - niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.PlayerReplicationInfo); + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.PlayerReplicationInfo); // Does nothing if we aren't even reloading, this is auto reload, we've already succeeded/failed or we'll auto succeed anyway if(!bIsReloading || !bCanActiveReload || bAutoReload || activeReloadState == ACTR_SUCCESS || activeReloadState == ACTR_FAIL) - return; + return; // Find starting frame and length of the active reload window (and declare fail if single reload is still in the first sub-stage) windowStart = -1.0; if(reloadType == RTYPE_MAG){ - windowStart = reloadPreEndFrame; - windowLenght = activeWindow; + windowStart = reloadPreEndFrame; + windowLenght = activeWindow; } else if(reloadType == RTYPE_SINGLE){ - // Too early! - if(subReloadStage <= 0){ - activeReloadState = ACTR_FAIL; - UpdateReloadRate(); - return; - } - windowStart = reloadStages[subReloadStage - 1]; - windowLenght = activeWindow / MagCapacity; + // Too early! + if(subReloadStage <= 0){ + activeReloadState = ACTR_FAIL; + UpdateReloadRate(); + return; + } + windowStart = reloadStages[subReloadStage - 1]; + windowLenght = activeWindow / MagCapacity; } // Something went wrong and active reload is inapplicable if(windowStart < 0) - return; + return; GetAnimParams(0, SeqName, AnimFrame, AnimRate); if(windowStart <= AnimFrame && AnimFrame <= windowStart + windowLenght || bForce) - activeReloadState = ACTR_SUCCESS; + activeReloadState = ACTR_SUCCESS; else - activeReloadState = ACTR_FAIL; + activeReloadState = ACTR_FAIL; UpdateReloadRate(); } - // Function that's called when client tries to use flashlight on a weapon simulated function SecondDoToggle(){} - simulated function ClientReload(){} - simulated function bool InterruptReload(){ return false; } - function ServerStopFire(byte Mode){ super(BaseKFWeapon).ServerStopFire(Mode); } - simulated function ClientTryPendingWeapon(){ if(Instigator.PendingWeapon != none && Instigator.PendingWeapon != self) - Instigator.Controller.ClientSwitchToBestWeapon(); + Instigator.Controller.ClientSwitchToBestWeapon(); } - simulated function AnimEnd(int channel){ local name anim; local float frame, rate; - GetAnimParams(0, anim, frame, rate); - if(!FireMode[0].IsInState('FireLoop')){ - GetAnimParams(0, anim, frame, rate); - if(ClientState == WS_ReadyToFire) - if((FireMode[0] == none || !FireMode[0].bIsFiring) && (FireMode[1] == none || !FireMode[1].bIsFiring)) - PlayIdle(); + GetAnimParams(0, anim, frame, rate); + if(ClientState == WS_ReadyToFire) + if((FireMode[0] == none || !FireMode[0].bIsFiring) && (FireMode[1] == none || !FireMode[1].bIsFiring)) + PlayIdle(); } else if(ClientState == WS_ReadyToFire){ - if(anim == FireMode[0].FireAnim && HasAnim(FireMode[0].FireEndAnim)) - PlayAnim(FireMode[0].FireEndAnim, FireMode[0].FireEndAnimRate, 0.0); - else if (anim== FireMode[1].FireAnim && HasAnim(FireMode[1].FireEndAnim)) - PlayAnim(FireMode[1].FireEndAnim, FireMode[1].FireEndAnimRate, 0.0); - else if ((FireMode[0] == none || !FireMode[0].bIsFiring) && (FireMode[1] == none || !FireMode[1].bIsFiring) && !bAutoReloadPaused) - PlayIdle(); + if(anim == FireMode[0].FireAnim && HasAnim(FireMode[0].FireEndAnim)) + PlayAnim(FireMode[0].FireEndAnim, FireMode[0].FireEndAnimRate, 0.0); + else if (anim== FireMode[1].FireAnim && HasAnim(FireMode[1].FireEndAnim)) + PlayAnim(FireMode[1].FireEndAnim, FireMode[1].FireEndAnimRate, 0.0); + else if ((FireMode[0] == none || !FireMode[0].bIsFiring) && (FireMode[1] == none || !FireMode[1].bIsFiring) && !bAutoReloadPaused) + PlayIdle(); } } - simulated function bool StartFire(int Mode){ - /*if(NiceHighROFFire(FireMode[Mode]) == none || FireMode[Mode].bWaitForRelease) - return super.StartFire(Mode);*/ //MEANTODO - + if(NiceHighROFFire(FireMode[Mode]) == none || FireMode[Mode].bWaitForRelease) + return super.StartFire(Mode); if(!super.StartFire(Mode)) - return false; - + return false; if(AmmoAmount(0) <= 0) - return false; - + return false; AnimStopLooping(); - if(!FireMode[Mode].IsInState('FireLoop') && (AmmoAmount(0) > 0)){ - FireMode[Mode].StartFiring(); - return true; + FireMode[Mode].StartFiring(); + return true; } else - return false; + return false; return true; } - simulated event OnZoomOutFinished(){ local name anim; local float frame, rate; - GetAnimParams(0, anim, frame, rate); if(!FireMode[0].IsInState('FireLoop')) - super.OnZoomOutFinished(); + super.OnZoomOutFinished(); else if(ClientState == WS_ReadyToFire){ - // Play the regular idle anim when we're finished zooming out - if(anim == IdleAimAnim) - PlayIdle(); - // Switch looping fire anims if we switched to/from zoomed - else if( FireMode[0].IsInState('FireLoop') && anim == 'Fire_Iron_Loop') - LoopAnim('Fire_Loop', FireMode[0].FireLoopAnimRate, FireMode[0].TweenTime); + // Play the regular idle anim when we're finished zooming out + if(anim == IdleAimAnim) + PlayIdle(); + // Switch looping fire anims if we switched to/from zoomed + else if( FireMode[0].IsInState('FireLoop') && anim == 'Fire_Iron_Loop') + LoopAnim('Fire_Loop', FireMode[0].FireLoopAnimRate, FireMode[0].TweenTime); } } - simulated event OnZoomInFinished(){ local name anim; local float frame, rate; - GetAnimParams(0, anim, frame, rate); - if(!FireMode[0].IsInState('FireLoop')) - super.OnZoomInFinished(); + super.OnZoomInFinished(); else if(ClientState == WS_ReadyToFire){ - // Play the iron idle anim when we're finished zooming in - if(anim == IdleAnim) - PlayIdle(); - // Switch looping fire anims if we switched to/from zoomed - else if( FireMode[0].IsInState('FireLoop') && anim == 'Fire_Loop' ) - LoopAnim('Fire_Iron_Loop', FireMode[0].FireLoopAnimRate, FireMode[0].TweenTime); + // Play the iron idle anim when we're finished zooming in + if(anim == IdleAnim) + PlayIdle(); + // Switch looping fire anims if we switched to/from zoomed + else if( FireMode[0].IsInState('FireLoop') && anim == 'Fire_Loop' ) + LoopAnim('Fire_Iron_Loop', FireMode[0].FireLoopAnimRate, FireMode[0].TweenTime); } } - // Some functions reloaded to force update of magazine size on client's side function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned){ super.GiveAmmo(m, WP, bJustSpawned); ClientSetMagSize(MagAmmoRemaining, bRoundInChamber); } - simulated function GiveTo(Pawn other, optional Pickup Pickup){ local int actualMagSize; local NiceWeaponPickup niceWeapPickup; local NicePlainData.Data dummyData; niceWeapPickup = NiceWeaponPickup(Pickup); if(niceWeapPickup != none) - SetNiceData(niceWeapPickup.GetNiceData(), NiceHumanPawn(other)); + SetNiceData(niceWeapPickup.GetNiceData(), NiceHumanPawn(other)); else - SetNiceData(dummyData, NiceHumanPawn(other)); + SetNiceData(dummyData, NiceHumanPawn(other)); if(Role == ROLE_Authority){ - UpdateMagCapacity(other.PlayerReplicationInfo); + UpdateMagCapacity(other.PlayerReplicationInfo); - if(NiceWeaponPickup(Pickup) != none) - actualMagSize = NiceWeaponPickup(Pickup).MagAmmoRemaining; - if(bRoundInChamber && actualMagSize > 0) - actualMagSize --; - if(NiceWeaponPickup(Pickup) != none && Pickup.bDropped) - actualMagSize = Clamp(actualMagSize, 0, MagCapacity); - else - actualMagSize = MagCapacity; - MagAmmoRemaining = actualMagSize; - if(bRoundInChamber) - MagAmmoRemaining ++; - super(BaseKFWeapon).GiveTo(other, Pickup); - ClientSetMagSize(MagAmmoRemaining, bRoundInChamber); + if(NiceWeaponPickup(Pickup) != none) + actualMagSize = NiceWeaponPickup(Pickup).MagAmmoRemaining; + if(bRoundInChamber && actualMagSize > 0) + actualMagSize --; + if(NiceWeaponPickup(Pickup) != none && Pickup.bDropped) + actualMagSize = Clamp(actualMagSize, 0, MagCapacity); + else + actualMagSize = MagCapacity; + MagAmmoRemaining = actualMagSize; + if(bRoundInChamber) + MagAmmoRemaining ++; + super(BaseKFWeapon).GiveTo(other, Pickup); + ClientSetMagSize(MagAmmoRemaining, bRoundInChamber); } } - function NicePlainData.Data GetNiceData(){ local NicePlainData.Data transferData; if(LaserType > 0) - class'NicePlainData'.static.SetInt(transferData, "LaserType", int(LaserType)); + class'NicePlainData'.static.SetInt(transferData, "LaserType", int(LaserType)); class'NicePlainData'.static.SetBool(transferData, "ChamberedRound", bRoundInChamber); - class'NicePlainData'.static.SetFloat(transferData, "ArdourTimeout", ardourTimeout); class'NicePlainData'.static.SetInt(transferData, "ChargeAmount", secondaryCharge); return transferData; } @@ -2131,122 +1313,109 @@ function SetNiceData(NicePlainData.Data transferData, optional NiceHumanPawn new local int newLaserType; newLaserType = class'NicePlainData'.static.GetInt(transferData, "LaserType", -1); if(newLaserType >= 0) - ClientSetLaserType(byte(newLaserType));// NICETODO: update round in chamber storing + ClientSetLaserType(byte(newLaserType)); bRoundInChamber = class'NicePlainData'.static.GetBool(transferData, "ChamberedRound", false); - ardourTimeout = class'NicePlainData'.static.GetFloat(transferData, "ArdourTimeout", 0.0); secondaryCharge = class'NicePlainData'.static.GetInt(transferData, "ChargeAmount", 1); ClientSetSndCharge(secondaryCharge); } - simulated function ApplyLaserState(){ bLaserActive = LaserType > 0; if(Role < ROLE_Authority) - ServerSetLaserType(LaserType); - + ServerSetLaserType(LaserType); if(NiceAttachment(ThirdPersonActor) != none) - NiceAttachment(ThirdPersonActor).SetLaserType(LaserType); + NiceAttachment(ThirdPersonActor).SetLaserType(LaserType); if(!Instigator.IsLocallyControlled()) - return; + return; if(bLaserActive){ - if(LaserDot == none) - LaserDot = Spawn(LaserDotClass, self); - LaserDot.SetLaserType(LaserType); - if(altLaserAttachmentBone != ''){ - if(altLaserDot == none) - altLaserDot = Spawn(LaserDotClass, self); - altLaserDot.SetLaserType(LaserType); - } - //spawn 1-st person laser attachment for weapon owner - if(LaserAttachment == none){ - SetBoneRotation(LaserAttachmentBone, LaserAttachmentRotation); - LaserAttachment = Spawn(LaserAttachmentClass,,,,); - AttachToBone(LaserAttachment, LaserAttachmentBone); - if(LaserAttachment != none) - LaserAttachment.SetRelativeLocation(LaserAttachmentOffset); - } - if(altLaserAttachment == none && altLaserAttachmentBone != ''){ - SetBoneRotation(altLaserAttachmentBone, altLaserAttachmentRotation); - altLaserAttachment = Spawn(LaserAttachmentClass,,,,); - AttachToBone(altLaserAttachment, altLaserAttachmentBone); - if(altLaserAttachment != none) - altLaserAttachment.SetRelativeLocation(altLaserAttachmentOffset); - } - ConstantColor'ScrnTex.Laser.LaserColor'.Color = LaserDot.GetLaserColor(); - LaserAttachment.bHidden = false; - altLaserAttachment.bHidden = false; + if(LaserDot == none) + LaserDot = Spawn(LaserDotClass, self); + LaserDot.SetLaserType(LaserType); + if(altLaserAttachmentBone != ''){ + if(altLaserDot == none) + altLaserDot = Spawn(LaserDotClass, self); + altLaserDot.SetLaserType(LaserType); + } + //spawn 1-st person laser attachment for weapon owner + if(LaserAttachment == none){ + SetBoneRotation(LaserAttachmentBone, LaserAttachmentRotation); + LaserAttachment = Spawn(LaserAttachmentClass,,,,); + AttachToBone(LaserAttachment, LaserAttachmentBone); + if(LaserAttachment != none) + LaserAttachment.SetRelativeLocation(LaserAttachmentOffset); + } + if(altLaserAttachment == none && altLaserAttachmentBone != ''){ + SetBoneRotation(altLaserAttachmentBone, altLaserAttachmentRotation); + altLaserAttachment = Spawn(LaserAttachmentClass,,,,); + AttachToBone(altLaserAttachment, altLaserAttachmentBone); + if(altLaserAttachment != none) + altLaserAttachment.SetRelativeLocation(altLaserAttachmentOffset); + } + ConstantColor'ScrnTex.Laser.LaserColor'.Color = LaserDot.GetLaserColor(); + LaserAttachment.bHidden = false; + altLaserAttachment.bHidden = false; } else{ - if(LaserAttachment != none) - LaserAttachment.bHidden = true; - if(altLaserAttachment != none) - altLaserAttachment.bHidden = true; - if(LaserDot != none) - LaserDot.Destroy(); - if(altLaserDot != none) - altLaserDot.Destroy(); + if(LaserAttachment != none) + LaserAttachment.bHidden = true; + if(altLaserAttachment != none) + altLaserAttachment.bHidden = true; + if(LaserDot != none) + LaserDot.Destroy(); + if(altLaserDot != none) + altLaserDot.Destroy(); } } - simulated function ToggleLaser(){ if(!Instigator.IsLocallyControlled()) - return; + return; // Will redo this bit later, but so far it'll have to do if(LaserType == 0) - LaserType = 1; + LaserType = 1; else if(LaserType == 1) - LaserType = 4; + LaserType = 4; else if(LaserType == 4) - LaserType = 2; + LaserType = 2; else - LaserType = 0; + LaserType = 0; ApplyLaserState(); } - simulated function TurnOffLaser(){ if(!Instigator.IsLocallyControlled()) - return; - + return; if(Role < ROLE_Authority) - ServerSetLaserType(0); - + ServerSetLaserType(0); bLaserActive = false; if(LaserAttachment != none) - LaserAttachment.bHidden = true; + LaserAttachment.bHidden = true; if(altLaserAttachment != none) - altLaserAttachment.bHidden = true; + altLaserAttachment.bHidden = true; if(LaserDot != none) - LaserDot.Destroy(); + LaserDot.Destroy(); if(altLaserDot != none) - altLaserDot.Destroy(); + altLaserDot.Destroy(); } - function ServerSetLaserType(byte NewLaserType){ LaserType = NewLaserType; bLaserActive = NewLaserType > 0; if(NiceAttachment(ThirdPersonActor) != none) - NiceAttachment(ThirdPersonActor).SetLaserType(LaserType); + NiceAttachment(ThirdPersonActor).SetLaserType(LaserType); } - simulated function ClientSetLaserType(byte NewLaserType){ LaserType = NewLaserType; bLaserActive = NewLaserType > 0; ApplyLaserState(); } - simulated function NiceFire GetMainFire(){ return NiceFire(FireMode[0]); } - function ServerSetSndCharge(int newCharge){ secondaryCharge = newCharge; } - simulated function ClientSetSndCharge(int newCharge){ secondaryCharge = newCharge; } - simulated function RenderOverlays(Canvas Canvas){ local int i; local Vector StartTrace, EndTrace; @@ -2255,173 +1424,160 @@ simulated function RenderOverlays(Canvas Canvas){ local vector X,Y,Z; local coords C; local array HitActors; - if(Instigator == none) - return; - + return; if(Instigator.Controller != none) - Hand = Instigator.Controller.Handedness; - + Hand = Instigator.Controller.Handedness; if((Hand < -1.0) || (Hand > 1.0)) - return; - + return; for(i = 0; i < NUM_FIRE_MODES;++ i) - if(FireMode[i] != none) - FireMode[i].DrawMuzzleFlash(Canvas); - + if(FireMode[i] != none) + FireMode[i].DrawMuzzleFlash(Canvas); SetLocation(Instigator.Location + Instigator.CalcDrawOffset(self)); SetRotation(Instigator.GetViewRotation() + ZoomRotInterp); - // Handle drawing the laser dots if(LaserDot != none){ - if(bIsReloading || bAllowFreeDot){ - C = GetBoneCoords(LaserAttachmentBone); - X = C.XAxis; - Y = C.YAxis; - Z = C.ZAxis; - } - else - GetViewAxes(X, Y, Z); + if(bIsReloading || bAllowFreeDot){ + C = GetBoneCoords(LaserAttachmentBone); + X = C.XAxis; + Y = C.YAxis; + Z = C.ZAxis; + } + else + GetViewAxes(X, Y, Z); - StartTrace = Instigator.Location + Instigator.EyePosition(); - EndTrace = StartTrace + 65535 * X; + StartTrace = Instigator.Location + Instigator.EyePosition(); + EndTrace = StartTrace + 65535 * X; - while(true){ - Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); - if(ROBulletWhipAttachment(Other) != none){ - HitActors[HitActors.Length] = Other; - Other.SetCollision(false); - StartTrace = HitLocation + X; - } - else{ - if(other != none && Other != Instigator && Other.Base != Instigator) - EndBeamEffect = HitLocation; - else - EndBeamEffect = EndTrace; - break; - } - } - // restore collision - for(i = 0; i crossPerkIndecies; // List of indices for perks that also should recive bonuses from this weapon -// Data that should be transferred between various instances of 'NiceWeapon' classes, corresponding to this pickup class -var NicePlainData.Data weaponData; -simulated function NicePlainData.Data GetNiceData(){ - return weaponData; -} -simulated function SetNiceData(NicePlainData.Data newData){ - weaponData = newData; -} -simulated function InitDroppedPickupFor(Inventory Inv){ - local NiceWeapon niceWeap; - niceWeap = NiceWeapon(Inv); - if(niceWeap != none) SetNiceData(niceWeap.GetNiceData()); - // Do as usual - if(Role == ROLE_Authority) super.InitDroppedPickupFor(Inv); -} -function Destroyed(){ - if(bDropped && Inventory != none && class(Inventory.Class) != none && KFGameType(Level.Game) != none) KFGameType(Level.Game).WeaponDestroyed(class(Inventory.Class)); - super(WeaponPickup).Destroyed(); -} -defaultproperties -{ - cost=1000 -} \ No newline at end of file +class NiceWeaponPickup extends KFWeaponPickup + dependson(NicePlainData) + placeable; + +var bool bBackupWeapon; +var array crossPerkIndecies; // List of indices for perks that also should recive bonuses from this weapon +// Data that should be transferred between various instances of 'NiceWeapon' classes, corresponding to this pickup class +var NicePlainData.Data weaponData; +simulated function NicePlainData.Data GetNiceData(){ + return weaponData; +} +simulated function SetNiceData(NicePlainData.Data newData){ + weaponData = newData; +} +simulated function InitDroppedPickupFor(Inventory Inv){ + local NiceWeapon niceWeap; + niceWeap = NiceWeapon(Inv); + if(niceWeap != none) + SetNiceData(niceWeap.GetNiceData()); + // Do as usual + if(Role == ROLE_Authority) + super.InitDroppedPickupFor(Inv); +} +function Destroyed(){ + if(bDropped && Inventory != none && class(Inventory.Class) != none && KFGameType(Level.Game) != none) + KFGameType(Level.Game).WeaponDestroyed(class(Inventory.Class)); + super(WeaponPickup).Destroyed(); +} + +defaultproperties +{ + cost=1000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Ammo.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Ammo.uc new file mode 100644 index 0000000..2824f77 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Ammo.uc @@ -0,0 +1,5 @@ +class NiceAK12Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceAK12Pickup' AmmoPickupAmount=30 MaxAmmo=270 InitialAmount=60 PickupClass=Class'NicePack.NiceAK12AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="5.45x39mm" +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AmmoPickup.uc new file mode 100644 index 0000000..a10f60e --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceAK12AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceAK12Ammo' PickupMessage="Rounds 5.45x39mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AssaultRifle.uc new file mode 100644 index 0000000..00048c9 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AssaultRifle.uc @@ -0,0 +1,4 @@ +class NiceAK12AssaultRifle extends NiceAssaultRifle; +defaultproperties +{ bSemiAutoFireEnabled=False bBurstFireEnabled=True reloadPreEndFrame=0.158000 reloadEndFrame=0.521000 reloadChargeEndFrame=0.726000 reloadMagStartFrame=0.363000 reloadChargeStartFrame=0.726000 MagazineBone="Bone_Magazine" MagCapacity=30 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=8 TraderInfoTexture=Texture'ScrnWeaponPack_T.AK12.AK12_trader' bIsTier3Weapon=True MeshRef="ScrnWeaponPack_A.AK12_mesh" SkinRefs(0)="ScrnWeaponPack_T.AK12.AK12_tex_1_cmb" SkinRefs(1)="ScrnWeaponPack_T.AK12.AK12_tex_2_cmb" SkinRefs(2)="ScrnWeaponPack_T.AK12.AK12_tex_3_cmb" SkinRefs(3)="ScrnWeaponPack_T.AK12.AK12_tex_4_cmb" SkinRefs(4)="ScrnWeaponPack_T.AK12.AK12_tex_5_cmb" SkinRefs(5)="ScrnWeaponPack_T.AK12.AK12_tex_6_cmb" SkinRefs(6)="ScrnWeaponPack_T.AK12.AK12_tex_7_cmb" SkinRefs(7)="ScrnWeaponPack_T.AK12.AK12_aimpoint_sh" SkinRefs(8)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SelectSoundRef="ScrnWeaponPack_SND.AK12.AK12_select" HudImageRef="ScrnWeaponPack_T.AK12.AK12_Unselect" SelectedHudImageRef="ScrnWeaponPack_T.AK12.AK12_select" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=20.000000 FireModeClass(0)=Class'NicePack.NiceAK12Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectAnimRate=1.300000 SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The Kalashnikov AK-12 (formerly AK-200) is the newest derivative of the Soviet/Russian AK-47 series of assault rifles and was proposed for possible general issue to the Russian Army. This version uses the 5.45x39mm ammo (the same as AK-74)" EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=145 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=7 PickupClass=Class'NicePack.NiceAK12Pickup' PlayerViewOffset=(X=-0.500000,Y=20.000000,Z=-3.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceAK12Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="AK12" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Attachment.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Attachment.uc new file mode 100644 index 0000000..10aadc4 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Attachment.uc @@ -0,0 +1,5 @@ +class NiceAK12Attachment extends NiceAttachment; +simulated function WeaponLight(); +defaultproperties +{ bSpawnLight=False mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlashAK12AR' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="IS_Fire_AK47" FireAltAnims(1)="IS_Fire_AK47" FireAltAnims(2)="IS_Fire_AK47" FireAltAnims(3)="IS_Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.AK12_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Fire.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Fire.uc new file mode 100644 index 0000000..815ece0 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Fire.uc @@ -0,0 +1,4 @@ +class NiceAK12Fire extends NiceFire; +defaultproperties +{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=44000.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.040000 maxVerticalRecoilAngle=240 maxHorizontalRecoilAngle=120 ShellEjectClass=Class'ScrnWeaponPack.KFShellEjectAK12AR' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="ScrnWeaponPack_SND.AK12.AK12_shot" StereoFireSoundRef="ScrnWeaponPack_SND.AK12.AK12_shot" NoAmmoSoundRef="ScrnWeaponPack_SND.AK12.AK12_empty" DamageType=Class'NicePack.NiceDamTypeAK12AssaultRifle' DamageMax=68 Momentum=18500.000000 bPawnRapidFireAnim=True TransientSoundVolume=3.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.095000 AmmoClass=Class'NicePack.NiceAK12Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlashAK12AR' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Pickup.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Pickup.uc new file mode 100644 index 0000000..1389ce2 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Pickup.uc @@ -0,0 +1,4 @@ +class NiceAK12Pickup extends NiceWeaponPickup; +defaultproperties +{ Weight=6.000000 cost=750 BuyClipSize=30 PowerValue=55 SpeedValue=80 RangeValue=30 Description="The Kalashnikov AK-12 (formerly AK-200) is the newest derivative of the Soviet/Russian AK-47 series of assault rifles and was proposed for possible general issue to the Russian Army. This version uses the 5.45x39mm ammo (the same as AK-74)" ItemName="AK12" ItemShortName="AK12" AmmoItemName="5.45x39mm" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceAK12AssaultRifle' PickupMessage="You got the AK-12" PickupSound=Sound'ScrnWeaponPack_SND.AK12.AK12_select' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.AK12_st' DrawScale=1.100000 CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceDamTypeAK12AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceDamTypeAK12AssaultRifle.uc new file mode 100644 index 0000000..c860151 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceDamTypeAK12AssaultRifle.uc @@ -0,0 +1,5 @@ +class NiceDamTypeAK12AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ bPenetrationHSOnly=True MaxPenetrations=3 HeadShotDamageMult=1.300000 WeaponClass=Class'NicePack.NiceAK12AssaultRifle' DeathString="%k killed %o (AK12)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDeathVel=400.000000 KDeathUpKick=120.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Ammo.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Ammo.uc new file mode 100644 index 0000000..7bbb504 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Ammo.uc @@ -0,0 +1,5 @@ +class NiceAK47Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceAK47Pickup' AmmoPickupAmount=30 MaxAmmo=270 InitialAmount=90 PickupClass=Class'NicePack.NiceAK47AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="AK47 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AmmoPickup.uc new file mode 100644 index 0000000..9847216 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceAK47AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceAK47Ammo' PickupMessage="Rounds 7.62mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AssaultRifle.uc new file mode 100644 index 0000000..a167c4a --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AssaultRifle.uc @@ -0,0 +1,7 @@ +class NiceAK47AssaultRifle extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +defaultproperties +{ bSemiAutoFireEnabled=False bBurstFireEnabled=True reloadPreEndFrame=0.167000 reloadEndFrame=0.578000 reloadChargeEndFrame=0.800000 reloadMagStartFrame=0.433000 reloadChargeStartFrame=0.711000 MagazineBone="MagazineAK" MagCapacity=30 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_AK_47' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.AK47_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Rifles.AK47_cmb" SelectSoundRef="KF_AK47Snd.AK47_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Ak_47_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Ak_47" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceAK47Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A classic Russian assault rifle. Can be fired in semi or full auto with nice knock down power but not great accuracy." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=95 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceAK47Pickup' PlayerViewOffset=(X=18.000000,Y=22.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceAK47Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="AK47" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Attachment.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Attachment.uc new file mode 100644 index 0000000..703fbd6 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Attachment.uc @@ -0,0 +1,4 @@ +class NiceAK47Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="KF_Weapons3rd_Trip.AK47_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Fire.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Fire.uc new file mode 100644 index 0000000..1f6b6f3 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Fire.uc @@ -0,0 +1,4 @@ +class NiceAK47Fire extends NiceFire; +defaultproperties +{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=35750.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.070000 maxVerticalRecoilAngle=210 maxHorizontalRecoilAngle=105 ShellEjectClass=Class'ROEffects.KFShellEjectAK' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="KF_AK47Snd.AK47_Fire" StereoFireSoundRef="KF_AK47Snd.AK47_FireST" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeAK47AssaultRifle' DamageMin=60 DamageMax=60 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.109000 AmmoClass=Class'NicePack.NiceAK47Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Pickup.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Pickup.uc new file mode 100644 index 0000000..5175062 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Pickup.uc @@ -0,0 +1,4 @@ +class NiceAK47Pickup extends NiceWeaponPickup; +defaultproperties +{ Weight=6.000000 cost=750 AmmoCost=30 BuyClipSize=30 PowerValue=40 SpeedValue=80 RangeValue=50 Description="Standard issue military rifle. Equipped with an integrated 2X scope." ItemName="AK47" ItemShortName="AK47" AmmoItemName="7.62mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.GoldenAK47pickup' VariantClasses(1)=Class'KFMod.NeonAK47Pickup' InventoryType=Class'NicePack.NiceAK47AssaultRifle' PickupMessage="You got the AK47" PickupSound=Sound'KF_AK47Snd.AK47_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.AK47_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceDamTypeAK47AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceDamTypeAK47AssaultRifle.uc new file mode 100644 index 0000000..c3c6a26 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceDamTypeAK47AssaultRifle.uc @@ -0,0 +1,5 @@ +class NiceDamTypeAK47AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ MaxPenetrations=1 HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceAK47AssaultRifle' DeathString="%k killed %o (AK47)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=5500.000000 KDeathVel=175.000000 KDeathUpKick=15.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceDamTypeVALDT.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceDamTypeVALDT.uc new file mode 100644 index 0000000..de3bf0a --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceDamTypeVALDT.uc @@ -0,0 +1,5 @@ +class NiceDamTypeVALDT extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceVALDTAssaultRifle' DeathString="%k killed %o (AS 'VAL')." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmo.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmo.uc new file mode 100644 index 0000000..e5c6a5e --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmo.uc @@ -0,0 +1,5 @@ +class NiceVALDTAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceVALDTPickup' AmmoPickupAmount=20 MaxAmmo=300 InitialAmount=75 PickupClass=Class'NicePack.NiceVALDTAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="9x39mm" +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmoPickup.uc new file mode 100644 index 0000000..61a5f01 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceVALDTAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=20 InventoryType=Class'NicePack.NiceVALDTAmmo' PickupMessage="9x39mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAssaultRifle.uc new file mode 100644 index 0000000..333954b --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAssaultRifle.uc @@ -0,0 +1,4 @@ +class NiceVALDTAssaultRifle extends NiceAssaultRifle; +defaultproperties +{ reloadPreEndFrame=0.121000 reloadEndFrame=0.477000 reloadChargeEndFrame=0.748000 reloadMagStartFrame=0.299000 reloadChargeStartFrame=0.598000 MagazineBone="clip" MagCapacity=20 ReloadRate=3.500000 ReloadAnim="Reload" ReloadAnimRate=1.100000 WeaponReloadAnim="Reload_AK47" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=3 TraderInfoTexture=Texture'ScrnWeaponPack_T.Val.ValDT_Trader' bIsTier2Weapon=True MeshRef="ScrnWeaponPack_A.ValDTmesh" SkinRefs(0)="ScrnWeaponPack_T.VAL.wpn_vss" SkinRefs(1)="ScrnWeaponPack_T.VAL.newvss" SkinRefs(2)="ScrnWeaponPack_T.VAL.wpn_bullet1_545" SkinRefs(3)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="ScrnWeaponPack_T.VAL.ValDT_unselected" SelectedHudImageRef="ScrnWeaponPack_T.VAL.ValDT_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceVALDTFire' FireModeClass(1)=Class'NicePack.NiceVALDTFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The AS VAL (Avtomat Specialnyj Val or Special Automatic Rifle, code name: 'Shaft') is a Soviet designed assault rifle featuring an integrated suppressor. It was developed during the late 1980s by TsNIITochMash (Central Institute for Precision Machine Building) and is used by Russian Spetsnaz special forces and the MVD, FSB and select units of the Russian Army." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=135 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceVALDTPickup' PlayerViewOffset=(X=10.000000,Y=10.000000,Z=-5.000000) BobDamping=5.000000 AttachmentClass=Class'ScrnWeaponPack.VALDTAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="AS 'VAL'" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTFire.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTFire.uc new file mode 100644 index 0000000..d0b7717 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTFire.uc @@ -0,0 +1,4 @@ +class NiceVALDTFire extends NiceFire; +defaultproperties +{ FireAimedAnim="Fire" RecoilRate=0.070000 maxVerticalRecoilAngle=315 maxHorizontalRecoilAngle=158 ShellEjectClass=Class'ROEffects.KFShellEjectMac' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" StereoFireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeVALDT' DamageMin=40 DamageMax=40 Momentum=18500.000000 bPawnRapidFireAnim=True TransientSoundVolume=2.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.089000 AmmoClass=Class'NicePack.NiceVALDTAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlash3rdVALDT' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTPickup.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTPickup.uc new file mode 100644 index 0000000..a534b39 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTPickup.uc @@ -0,0 +1,4 @@ +class NiceVALDTPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=5.000000 AmmoCost=10 BuyClipSize=30 PowerValue=50 SpeedValue=95 RangeValue=50 Description="The AS VAL (Avtomat Specialnyj Val or Special Automatic Rifle, code name: 'Shaft') is a Soviet designed assault rifle featuring an integrated suppressor. It was developed during the late 1980s by TsNIITochMash (Central Institute for Precision Machine Building) and is used by Russian Spetsnaz special forces and the MVD, FSB and select units of the Russian Army." ItemName="AS 'VAL'" ItemShortName="VAL" AmmoItemName="9x39mm" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceVALDTAssaultRifle' PickupMessage="You've got a AS 'VAL'" PickupSound=Sound'KF_AK47Snd.AK47_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.ValDT_sm' DrawScale=1.300000 CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpup.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpup.uc new file mode 100644 index 0000000..55f5a9a --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpup.uc @@ -0,0 +1,7 @@ +class NiceBullpup extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +defaultproperties +{ reloadPreEndFrame=0.333000 reloadEndFrame=0.783000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.483000 reloadChargeStartFrame=-1.000000 MagCapacity=30 ReloadRate=1.966667 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_BullPup" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=70.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Bullpup' MeshRef="KF_Weapons_Trip.Bullpup_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Rifles.bullpup_cmb" SkinRefs(1)="KF_Weapons_Trip_T.Rifles.reflex_sight_A_unlit" SelectSoundRef="KF_BullpupSnd.Bullpup_Select" HudImageRef="KillingFloorHUD.WeaponSelect.Bullpup_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Bullpup" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceBullpupFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A military grade automatic rifle. Can be fired in semi-auto or full auto firemodes and comes equipped with a scope for increased accuracy." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=70.000000 Priority=70 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=1 PickupClass=Class'NicePack.NiceBullpupPickup' PlayerViewOffset=(X=20.000000,Y=21.500000,Z=-9.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceBullpupAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Bullpup" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmo.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmo.uc new file mode 100644 index 0000000..27be66b --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmo.uc @@ -0,0 +1,5 @@ +class NiceBullpupAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceBullpupPickup' AmmoPickupAmount=30 MaxAmmo=240 InitialAmount=45 PickupClass=Class'NicePack.NiceBullpupAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Bullpup bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmoPickup.uc new file mode 100644 index 0000000..18671be --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceBullpupAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceBullpupAmmo' PickupMessage="Rounds (5.56 NATO)" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAttachment.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAttachment.uc new file mode 100644 index 0000000..5e41612 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAttachment.uc @@ -0,0 +1,4 @@ +class NiceBullpupAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' TurnLeftAnim="TurnL_Bullpup" TurnRightAnim="TurnR_Bullpup" WalkAnims(0)="WalkF_Bullpup" WalkAnims(1)="WalkB_Bullpup" WalkAnims(2)="WalkL_Bullpup" WalkAnims(3)="WalkR_Bullpup" CrouchTurnRightAnim="CH_TurnR_Bullpup" CrouchTurnLeftAnim="CH_TurnL_Bullpup" MeshRef="KF_Weapons3rd_Trip.BullPup_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupFire.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupFire.uc new file mode 100644 index 0000000..1efeb96 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupFire.uc @@ -0,0 +1,4 @@ +class NiceBullpupFire extends NiceFire; +defaultproperties +{ zedTimeFireSpeedUp=5.000000 ProjectileSpeed=45500.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.070000 maxVerticalRecoilAngle=210 maxHorizontalRecoilAngle=105 ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' ShellEjectBoneName="Bullpup" bAccuracyBonusForSemiAuto=True FireSoundRef="KF_BullpupSnd.Bullpup_Fire" StereoFireSoundRef="KF_BullpupSnd.Bullpup_FireST" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamTypeBullpup' DamageMin=48 DamageMax=48 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.100000 AmmoClass=Class'NicePack.NiceBullpupAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=0.500000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupPickup.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupPickup.uc new file mode 100644 index 0000000..64a88ee --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupPickup.uc @@ -0,0 +1,4 @@ +class NiceBullpupPickup extends NiceWeaponPickup; +defaultproperties +{ bBackupWeapon=True Weight=5.000000 cost=200 BuyClipSize=30 PowerValue=24 SpeedValue=90 RangeValue=60 Description="Standard issue military rifle. Equipped with an integrated 2X scope." ItemName="Bullpup" ItemShortName="Bullpup" AmmoItemName="5.56 NATO Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceBullpup' PickupMessage="You got the Bullpup" PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.Bullpup_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceDamTypeBullpup.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceDamTypeBullpup.uc new file mode 100644 index 0000000..3690ebc --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceDamTypeBullpup.uc @@ -0,0 +1,5 @@ +class NiceDamTypeBullpup extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceBullpup' DeathString="%k killed %o (Bullpup)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805M.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805M.uc new file mode 100644 index 0000000..34ac9ea --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805M.uc @@ -0,0 +1,4 @@ +class NiceCZ805M extends CZ805M; +defaultproperties +{ FireModeClass(0)=Class'NicePack.NiceCZ805MFire' FireModeClass(1)=Class'NicePack.NiceCZ805MAltFire' PickupClass=Class'NicePack.NiceCZ805MPickup' ItemName="CZ-805M Medic/Assault Rifle NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAltFire.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAltFire.uc new file mode 100644 index 0000000..2458e7c --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAltFire.uc @@ -0,0 +1,4 @@ +class NiceCZ805MAltFire extends CZ805MAltFire; +defaultproperties +{ ProjectileClass=Class'NicePack.NiceCZ805MHealingProjectile' +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmo.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmo.uc new file mode 100644 index 0000000..8ad4cb6 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmo.uc @@ -0,0 +1,4 @@ +class NiceCZ805MAmmo extends CZ805MAmmo; +defaultproperties +{ MaxAmmo=300 InitialAmount=150 PickupClass=Class'NicePack.NiceCZ805MAmmoPickup' +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmoPickup.uc new file mode 100644 index 0000000..f1c4112 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceCZ805MAmmoPickup extends CZ805MAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceCZ805MAmmo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MFire.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MFire.uc new file mode 100644 index 0000000..31f36a1 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MFire.uc @@ -0,0 +1,4 @@ +class NiceCZ805MFire extends CZ805MFire; +defaultproperties +{ maxVerticalRecoilAngle=270 maxHorizontalRecoilAngle=135 DamageType=Class'NicePack.NiceDamTypeCZ805M' DamageMax=40 AmmoClass=Class'NicePack.NiceCZ805MAmmo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MHealingProjectile.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MHealingProjectile.uc new file mode 100644 index 0000000..f75755e --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MHealingProjectile.uc @@ -0,0 +1,4 @@ +class NiceCZ805MHealingProjectile extends CZ805MHealingProjectile; +defaultproperties +{ HealBoostAmount=20 +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MPickup.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MPickup.uc new file mode 100644 index 0000000..4eace77 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MPickup.uc @@ -0,0 +1,4 @@ +class NiceCZ805MPickup extends CZ805MPickup; +defaultproperties +{ cost=2500 BuyClipSize=30 Description="Horzine's modification of CZ-805 BREN rifle with attached healing dart launcher. Useful for both Medic and Commando perks." ItemName="CZ-805M NW" ItemShortName="CZ-805M NW" InventoryType=Class'NicePack.NiceCZ805M' PickupMessage="You got the CZ-805M NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceDamTypeCZ805M.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceDamTypeCZ805M.uc new file mode 100644 index 0000000..4ca0d01 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceDamTypeCZ805M.uc @@ -0,0 +1,5 @@ +class NiceDamTypeCZ805M extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceCZ805M' DeathString="%k killed %o (CZ 805)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=5500.000000 KDeathVel=175.000000 KDeathUpKick=20.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceDamTypeFNFALAssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceDamTypeFNFALAssaultRifle.uc new file mode 100644 index 0000000..271ed35 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceDamTypeFNFALAssaultRifle.uc @@ -0,0 +1,5 @@ +class NiceDamTypeFNFALAssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ MaxPenetrations=3 HeadShotDamageMult=2.250000 WeaponClass=Class'NicePack.NiceFNFAL_ACOG_AssaultRifle' DeathString="%k killed %o (FNFAL ACOG)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=6500.000000 KDeathVel=175.000000 KDeathUpKick=20.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmo.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmo.uc new file mode 100644 index 0000000..e28592b --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmo.uc @@ -0,0 +1,5 @@ +class NiceFNFALAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceFNFAL_ACOG_Pickup' AmmoPickupAmount=20 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceFNFALAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="FNFAL bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmoPickup.uc new file mode 100644 index 0000000..266ef04 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceFNFALAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=20 InventoryType=Class'NicePack.NiceFNFALAmmo' PickupMessage="Rounds 7.62x51mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALFire.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALFire.uc new file mode 100644 index 0000000..8f559fb --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALFire.uc @@ -0,0 +1,4 @@ +class NiceFNFALFire extends NiceFire; +defaultproperties +{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=41150.000000 FireAimedAnim="Fire_Iron" FireEndAimedAnim="Fire_Iron_End" FireLoopAimedAnim="Fire_Iron_Loop" RecoilRate=0.080000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=100 ShellEjectClass=Class'KFMod.KFShellEjectFAL' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="KF_FNFALSnd.FNFAL_Fire_Single_M" StereoFireSoundRef="KF_FNFALSnd.FNFAL_Fire_Single_S" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeFNFALAssaultRifle' DamageMin=66 DamageMax=66 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire_Loop" FireEndAnim="Fire_End" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.100000 AmmoClass=Class'NicePack.NiceFNFALAmmo' ShakeRotMag=(X=80.000000,Y=80.000000,Z=450.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=8.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_AssaultRifle.uc new file mode 100644 index 0000000..9d349f3 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_AssaultRifle.uc @@ -0,0 +1,4 @@ +class NiceFNFAL_ACOG_AssaultRifle extends NiceAssaultRifle; +defaultproperties +{ reloadPreEndFrame=0.178000 reloadEndFrame=0.626000 reloadChargeEndFrame=0.882000 reloadMagStartFrame=0.411000 reloadChargeStartFrame=0.710000 MagCapacity=20 ReloadRate=3.600000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_Fal_Acog" Weight=8.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_FNFAL' bIsTier3Weapon=True MeshRef="KF_Wep_Fal_Acog.FAL_ACOG" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.FAL_cmb" SkinRefs(1)="KF_Weapons5_Scopes_Trip_T.FNFAL.AcogShader" SelectSoundRef="KF_FNFALSnd.FNFAL_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.FNFAL_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.FNFAL" PlayerIronSightFOV=55.000000 ZoomedDisplayFOV=15.000000 FireModeClass(0)=Class'NicePack.NiceFNFALFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="Classic NATO battle rifle. Has a high rate of fire and decent accuracy, with good power." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=180 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=12 PickupClass=Class'NicePack.NiceFNFAL_ACOG_Pickup' PlayerViewOffset=(X=3.000000,Y=15.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceFNFAL_ACOG_Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="FNFAL" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Attachment.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Attachment.uc new file mode 100644 index 0000000..ce41c3f --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Attachment.uc @@ -0,0 +1,4 @@ +class NiceFNFAL_ACOG_Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_AA12" MovementAnims(1)="JogB_AA12" MovementAnims(2)="JogL_AA12" MovementAnims(3)="JogR_AA12" TurnLeftAnim="TurnL_AA12" TurnRightAnim="TurnR_AA12" CrouchAnims(0)="CHWalkF_AA12" CrouchAnims(1)="CHWalkB_AA12" CrouchAnims(2)="CHWalkL_AA12" CrouchAnims(3)="CHWalkR_AA12" WalkAnims(0)="WalkF_AA12" WalkAnims(1)="WalkB_AA12" WalkAnims(2)="WalkL_AA12" WalkAnims(3)="WalkR_AA12" CrouchTurnRightAnim="CH_TurnR_AA12" CrouchTurnLeftAnim="CH_TurnL_AA12" IdleCrouchAnim="CHIdle_AA12" IdleWeaponAnim="Idle_AA12" IdleRestAnim="Idle_AA12" IdleChatAnim="Idle_AA12" IdleHeavyAnim="Idle_AA12" IdleRifleAnim="Idle_AA12" FireAnims(0)="Fire_AA12" FireAnims(1)="Fire_AA12" FireAnims(2)="Fire_AA12" FireAnims(3)="Fire_AA12" FireAltAnims(0)="Fire_AA12" FireAltAnims(1)="Fire_AA12" FireAltAnims(2)="Fire_AA12" FireAltAnims(3)="Fire_AA12" FireCrouchAnims(0)="CHFire_AA12" FireCrouchAnims(1)="CHFire_AA12" FireCrouchAnims(2)="CHFire_AA12" FireCrouchAnims(3)="CHFire_AA12" FireCrouchAltAnims(0)="CHFire_AA12" FireCrouchAltAnims(1)="CHFire_AA12" FireCrouchAltAnims(2)="CHFire_AA12" FireCrouchAltAnims(3)="CHFire_AA12" HitAnims(0)="HitF_AA12" HitAnims(1)="HitB_AA12" HitAnims(2)="HitL_AA12" HitAnims(3)="HitR_AA12" PostFireBlendStandAnim="Blend_AA12" PostFireBlendCrouchAnim="CHBlend_AA12" MeshRef="KF_Weapons3rd4_Trip.Fal_Acog_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Pickup.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Pickup.uc new file mode 100644 index 0000000..1f3883e --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Pickup.uc @@ -0,0 +1,4 @@ +class NiceFNFAL_ACOG_Pickup extends NiceWeaponPickup; +defaultproperties +{ Weight=8.000000 cost=1250 AmmoCost=40 BuyClipSize=20 PowerValue=45 SpeedValue=90 RangeValue=70 Description="Classic NATO battle rifle. Has a high rate of fire and decent accuracy, with good power." ItemName="FNFAL" ItemShortName="FNFAL" AmmoItemName="7.62x51mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceFNFAL_ACOG_AssaultRifle' PickupMessage="You got the FN FAL with ACOG Sight" PickupSound=Sound'KF_FNFALSnd.FNFAL_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups4_Trip.Rifles.Fal_Acog_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceDamTypeHK417AR.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceDamTypeHK417AR.uc new file mode 100644 index 0000000..e50e91e --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceDamTypeHK417AR.uc @@ -0,0 +1,4 @@ +class NiceDamTypeHK417AR extends NiceDamageTypeVetCommando; +defaultproperties +{ MaxPenetrations=2 HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceHK417AR' DeathString="%k killed %o (HK-417)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AR.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AR.uc new file mode 100644 index 0000000..258792c --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AR.uc @@ -0,0 +1,4 @@ +class NiceHK417AR extends NiceScopedWeapon; +defaultproperties +{ lenseMaterialID=8 scopePortalFOVHigh=40.000000 scopePortalFOV=40.000000 ZoomMatRef="ScrnWeaponPack_T.HK417AR.HK417Scope_FB" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.Rifles.CBLens_cmb" CrosshairTexRef="ScrnWeaponPack_T.HK417AR.HK417Scope" reloadPreEndFrame=0.158000 reloadEndFrame=0.653000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.284000 reloadChargeStartFrame=-1.000000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=60.000000 MagCapacity=20 ReloadRate=3.150000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'ScrnWeaponPack_T.HK417AR.HK417_Trader' MeshRef="ScrnWeaponPack_A.HK417_mesh" SkinRefs(0)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" SkinRefs(1)="ScrnWeaponPack_T.HK417AR.hk417_sk1_d2" SkinRefs(2)="ScrnWeaponPack_T.HK417AR.mueller" SkinRefs(3)="ScrnWeaponPack_T.HK417AR.body" SkinRefs(4)="ScrnWeaponPack_T.HK417AR.body2" SkinRefs(5)="ScrnWeaponPack_T.HK417AR.hk416_5" SkinRefs(6)="ScrnWeaponPack_T.HK417AR.clip_hk417" SkinRefs(7)="ScrnWeaponPack_T.HK417AR.hk416_8" SkinRefs(8)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SelectSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_select" HudImageRef="ScrnWeaponPack_T.HK417AR.HK417_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.HK417AR.HK417_selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=60.000000 FireModeClass(0)=Class'NicePack.NiceHK417Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectAnimRate=2.000000 BringUpTime=0.500000 SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="The Heckler & Koch HK417 is a gas-operated, selective fire rifle with a rotating bolt and is essentially an enlarged HK416 assault rifle. Chambered for the full power 7.62x51mm NATO round, instead of a less powerful intermediate cartridge, the HK417 is intended for use as a designated marksman rifle, and in other roles where the greater penetrative power and range of the 7.62x51mm NATO round are required." DisplayFOV=65.000000 Priority=100 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=3 PickupClass=Class'NicePack.NiceHK417Pickup' PlayerViewOffset=(X=14.000000,Y=7.000000,Z=-4.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceHK417Attachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="HK-417" +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Ammo.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Ammo.uc new file mode 100644 index 0000000..6c67014 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Ammo.uc @@ -0,0 +1,5 @@ +class NiceHK417Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceHK417Pickup' AmmoPickupAmount=20 MaxAmmo=180 InitialAmount=45 PickupClass=Class'ScrnWeaponPack.HK417AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="7.62x51mm NATO" +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AmmoPickup.uc new file mode 100644 index 0000000..2311f08 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceHK417AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=20 InventoryType=Class'NicePack.NiceHK417Ammo' PickupMessage="7.62x51mm NATO" +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Attachment.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Attachment.uc new file mode 100644 index 0000000..4c6bf35 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Attachment.uc @@ -0,0 +1,4 @@ +class NiceHK417Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="ScrnWeaponPack_A.HK417_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' DrawScale=0.600000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Fire.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Fire.uc new file mode 100644 index 0000000..c1e0261 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Fire.uc @@ -0,0 +1,4 @@ +class NiceHK417Fire extends NiceFire; +defaultproperties +{ ProjectileSpeed=40850.000000 FireAimedAnim="Iron_Idle" RecoilRate=0.070000 maxVerticalRecoilAngle=500 maxHorizontalRecoilAngle=250 ShellEjectClass=Class'ROEffects.KFShellEjectAK' ShellEjectBoneName="Shell_eject" FireSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_shot" StereoFireSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_shot" NoAmmoSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_empty" DamageType=Class'NicePack.NiceDamTypeHK417AR' DamageMin=75 DamageMax=75 Momentum=20000.000000 bPawnRapidFireAnim=True bWaitForRelease=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.230000 AmmoClass=Class'NicePack.NiceHK417Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=9500.000000,Y=9500.000000,Z=9500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=60.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Pickup.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Pickup.uc new file mode 100644 index 0000000..2f8c266 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Pickup.uc @@ -0,0 +1,4 @@ +class NiceHK417Pickup extends NiceWeaponPickup; +defaultproperties +{ Weight=6.000000 AmmoCost=40 BuyClipSize=10 PowerValue=60 SpeedValue=30 RangeValue=95 Description="The Heckler & Koch HK417 is a gas-operated, selective fire rifle with a rotating bolt and is essentially an enlarged HK416 assault rifle. Chambered for the full power 7.62x51mm NATO round, instead of a less powerful intermediate cartridge, the HK417 is intended for use as a designated marksman rifle, and in other roles where the greater penetrative power and range of the 7.62x51mm NATO round are required." ItemName="HK-417" ItemShortName="HK-417" AmmoItemName="7.62x51mm NATO" CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceHK417AR' PickupMessage="You've got a HK-417" PickupSound=Sound'ScrnWeaponPack_SND.HK417AR.HK417_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.HK417_st' DrawScale=0.800000 CollisionRadius=30.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceDamTypeL85A2Z.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceDamTypeL85A2Z.uc new file mode 100644 index 0000000..374e6b8 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceDamTypeL85A2Z.uc @@ -0,0 +1,6 @@ +class NiceDamTypeL85A2Z extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + badDecapMod=0.8000 HeadShotDamageMult=1.400000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceL85A2Z' DeathString="%k killed %o." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=4500.000000 KDeathVel=200.000000 KDeathUpKick=20.000000 VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Ammo.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Ammo.uc new file mode 100644 index 0000000..e84afc6 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Ammo.uc @@ -0,0 +1,5 @@ +class NiceL85A2Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceL85A2Pickup' AmmoPickupAmount=15 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceL85A2AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="Stanag Magazines" +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2AmmoPickup.uc new file mode 100644 index 0000000..a2ffecc --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceL85A2AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceL85A2Ammo' RespawnTime=0.000000 PickupMessage="Mag (5.56mm)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Attachment.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Attachment.uc new file mode 100644 index 0000000..7d1d7ed --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Attachment.uc @@ -0,0 +1,4 @@ +class NiceL85A2Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M4" MovementAnims(1)="JogB_M4" MovementAnims(2)="JogL_M4" MovementAnims(3)="JogR_M4" TurnLeftAnim="TurnL_M4" TurnRightAnim="TurnR_M4" CrouchAnims(0)="CHWalkF_M4" CrouchAnims(1)="CHWalkB_M4" CrouchAnims(2)="CHWalkL_M4" CrouchAnims(3)="CHWalkR_M4" WalkAnims(0)="WalkF_M4" WalkAnims(1)="WalkB_M4" WalkAnims(2)="WalkL_M4" WalkAnims(3)="WalkR_M4" CrouchTurnRightAnim="CH_TurnR_M4" CrouchTurnLeftAnim="CH_TurnL_M4" IdleCrouchAnim="CHIdle_M4" IdleWeaponAnim="Idle_M4" IdleRestAnim="Idle_M4" IdleChatAnim="Idle_M4" IdleHeavyAnim="Idle_M4" IdleRifleAnim="Idle_M4" FireAnims(0)="Fire_M4" FireAnims(1)="Fire_M4" FireAnims(2)="Fire_M4" FireAnims(3)="Fire_M4" FireAltAnims(0)="Fire_M4" FireAltAnims(1)="Fire_M4" FireAltAnims(2)="Fire_M4" FireAltAnims(3)="Fire_M4" FireCrouchAnims(0)="CHFire_M4" FireCrouchAnims(1)="CHFire_M4" FireCrouchAnims(2)="CHFire_M4" FireCrouchAnims(3)="CHFire_M4" FireCrouchAltAnims(0)="CHFire_M4" FireCrouchAltAnims(1)="CHFire_M4" FireCrouchAltAnims(2)="CHFire_M4" FireCrouchAltAnims(3)="CHFire_M4" HitAnims(0)="HitF_M4" HitAnims(1)="HitB_M4" HitAnims(2)="HitL_M4" HitAnims(3)="HitR_M4" PostFireBlendStandAnim="Blend_M4" PostFireBlendCrouchAnim="CHBlend_M4" MeshRef="NicePackA.L85A2_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Fire.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Fire.uc new file mode 100644 index 0000000..1e36412 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Fire.uc @@ -0,0 +1,4 @@ +class NiceL85A2Fire extends NiceFire; +defaultproperties +{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=46500.000000 bBetterBurst=True FireAimedAnim="Fire_Iron" RecoilRate=0.050000 maxVerticalRecoilAngle=75 maxHorizontalRecoilAngle=37 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="Shell_eject" bRandomPitchFireSound=False FireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_M" StereoFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeL85A2Z' DamageMin=81 DamageMax=81 Momentum=10000.000000 bPawnRapidFireAnim=True bWaitForRelease=True bAttachSmokeEmitter=True TransientSoundVolume=1.800000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.250000 AmmoClass=Class'NicePack.NiceL85A2Ammo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.350000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=30.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Pickup.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Pickup.uc new file mode 100644 index 0000000..715d18f --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Pickup.uc @@ -0,0 +1,4 @@ +class NiceL85A2Pickup extends NiceWeaponPickup; +defaultproperties +{ Weight=5.000000 cost=250 AmmoCost=10 BuyClipSize=15 PowerValue=45 SpeedValue=60 RangeValue=70 Description="This L85A2 is fine-tuned for sharpshooter's use: relatively low damage is compensated by sharpshooter's own abilities, while low recoil and simple reload allow for non-stop head-popping." ItemName="L85A2" ItemShortName="L85A2" AmmoItemName="5.556x45mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceL85A2Z' PickupMessage="You got the L85A2" PickupSound=Sound'KF_FNFALSnd.FNFAL_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.L85A2.L85A2_Static' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Z.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Z.uc new file mode 100644 index 0000000..0dfe350 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Z.uc @@ -0,0 +1,6 @@ +class NiceL85A2Z extends NiceScopedWeapon; +#exec OBJ LOAD FILE=..\Textures\ScopeShaders.utx +#exec OBJ LOAD FILE=..\Textures\NicePackT.utx +defaultproperties +{ lenseMaterialID=3 scopePortalFOVHigh=14.000000 scopePortalFOV=14.000000 ZoomMatRef="NicePackT.L85A2.Susat_Scope" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" CrosshairTexRef="NicePackT.L85A2.Susat_Scope" reloadPreEndFrame=0.270000 reloadEndFrame=0.469000 reloadChargeEndFrame=0.760000 reloadMagStartFrame=0.385000 reloadChargeStartFrame=0.570000 MagazineBone="clip" FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) bHasScope=True ZoomedDisplayFOVHigh=65.000000 MagCapacity=30 ReloadRate=2.500000 ReloadAnim="Reload" ReloadAnimRate=1.280000 WeaponReloadAnim="Reload" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=70.000000 SleeveNum=0 TraderInfoTexture=Texture'NicePackT.L85A2.L85A2_Trader' bIsTier3Weapon=True MeshRef="NicePackA.L85A2_Weapon" SkinRefs(1)="NicePackT.L85A2.l85a1_diffuse_04" SkinRefs(2)="NicePackT.L85A2.susat_diffuse_01" HudImageRef="NicePackT.L85A2.L85A2_Unselected" SelectedHudImageRef="NicePackT.L85A2.L85A2_Selected" PlayerIronSightFOV=40.000000 ZoomedDisplayFOV=65.000000 FireModeClass(0)=Class'NicePack.NiceL85A2Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectAnimRate=1.500000 BringUpTime=0.600000 SelectSound=Sound'KF_9MMSnd.9mm_Select' AIRating=0.250000 CurrentRating=0.250000 bShowChargingBar=True Description="This L85A2 is fine-tuned for sharpshooter's use: relatively low damage is compensated by sharpshooter's own abilities, while low recoil and simple reload allow for non-stop head-popping." DisplayFOV=70.000000 Priority=100 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=1 PickupClass=Class'NicePack.NiceL85A2Pickup' PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceL85A2Attachment' IconCoords=(X1=434,Y1=253,X2=506,Y2=292) ItemName="L85A2" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceDamTypeM4AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceDamTypeM4AssaultRifle.uc new file mode 100644 index 0000000..2e4b8cc --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceDamTypeM4AssaultRifle.uc @@ -0,0 +1,5 @@ +class NiceDamTypeM4AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceM4AssaultRifle' DeathString="%k killed %o (M4)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Ammo.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Ammo.uc new file mode 100644 index 0000000..650183a --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Ammo.uc @@ -0,0 +1,5 @@ +class NiceM4Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM4Pickup' AmmoPickupAmount=30 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceM4AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M4 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AmmoPickup.uc new file mode 100644 index 0000000..6f8da85 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM4AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceM4Ammo' PickupMessage="Rounds 5.56mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AssaultRifle.uc new file mode 100644 index 0000000..20c696b --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AssaultRifle.uc @@ -0,0 +1,7 @@ +class NiceM4AssaultRifle extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +defaultproperties +{ reloadPreEndFrame=0.148000 reloadEndFrame=0.546000 reloadChargeEndFrame=0.778000 reloadMagStartFrame=0.306000 reloadChargeStartFrame=0.694000 MagCapacity=30 ReloadRate=3.633300 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M4' bIsTier2Weapon=True MeshRef="KF_Wep_M4.M4_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.m4_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_M4RifleSnd.WEP_M4_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M4_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M4" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM4Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A compact assault rifle. Can be fired in semi or full auto with good damage and good accuracy." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=130 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=10 PickupClass=Class'NicePack.NiceM4Pickup' PlayerViewOffset=(X=25.000000,Y=18.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM4Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M4" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Attachment.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Attachment.uc new file mode 100644 index 0000000..a845b31 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Attachment.uc @@ -0,0 +1,4 @@ +class NiceM4Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_M4" MovementAnims(1)="JogB_M4" MovementAnims(2)="JogL_M4" MovementAnims(3)="JogR_M4" TurnLeftAnim="TurnL_M4" TurnRightAnim="TurnR_M4" CrouchAnims(0)="CHWalkF_M4" CrouchAnims(1)="CHWalkB_M4" CrouchAnims(2)="CHWalkL_M4" CrouchAnims(3)="CHWalkR_M4" WalkAnims(0)="WalkF_M4" WalkAnims(1)="WalkB_M4" WalkAnims(2)="WalkL_M4" WalkAnims(3)="WalkR_M4" CrouchTurnRightAnim="CH_TurnR_M4" CrouchTurnLeftAnim="CH_TurnL_M4" IdleCrouchAnim="CHIdle_M4" IdleWeaponAnim="Idle_M4" IdleRestAnim="Idle_M4" IdleChatAnim="Idle_M4" IdleHeavyAnim="Idle_M4" IdleRifleAnim="Idle_M4" FireAnims(0)="Fire_M4" FireAnims(1)="Fire_M4" FireAnims(2)="Fire_M4" FireAnims(3)="Fire_M4" FireAltAnims(0)="Fire_M4" FireAltAnims(1)="Fire_M4" FireAltAnims(2)="Fire_M4" FireAltAnims(3)="Fire_M4" FireCrouchAnims(0)="CHFire_M4" FireCrouchAnims(1)="CHFire_M4" FireCrouchAnims(2)="CHFire_M4" FireCrouchAnims(3)="CHFire_M4" FireCrouchAltAnims(0)="CHFire_M4" FireCrouchAltAnims(1)="CHFire_M4" FireCrouchAltAnims(2)="CHFire_M4" FireCrouchAltAnims(3)="CHFire_M4" HitAnims(0)="HitF_M4" HitAnims(1)="HitB_M4" HitAnims(2)="HitL_M4" HitAnims(3)="HitR_M4" PostFireBlendStandAnim="Blend_M4" PostFireBlendCrouchAnim="CHBlend_M4" MeshRef="KF_Weapons3rd3_Trip.M4_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Fire.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Fire.uc new file mode 100644 index 0000000..dd4cef4 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Fire.uc @@ -0,0 +1,4 @@ +class NiceM4Fire extends NiceHighROFFire; +defaultproperties +{ FireEndSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_M" FireEndStereoSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_S" AmbientFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop" zedTimeFireSpeedUp=2.500000 ProjectileSpeed=44000.000000 RecoilRate=0.065000 maxVerticalRecoilAngle=170 maxHorizontalRecoilAngle=85 ShellEjectClass=Class'ROEffects.KFShellEjectM4Rifle' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_M" StereoFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeM4AssaultRifle' DamageMin=69 DamageMax=69 Momentum=8500.000000 FireRate=0.075000 AmmoClass=Class'NicePack.NiceM4Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Pickup.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Pickup.uc new file mode 100644 index 0000000..50bbe03 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Pickup.uc @@ -0,0 +1,4 @@ +class NiceM4Pickup extends NiceWeaponPickup; +defaultproperties +{ Weight=5.000000 cost=500 BuyClipSize=30 PowerValue=30 SpeedValue=90 RangeValue=60 Description="A compact assault rifle. Can be fired in semi or full auto with good damage and good accuracy." ItemName="M4" ItemShortName="M4" AmmoItemName="5.56mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.CamoM4Pickup' InventoryType=Class'NicePack.NiceM4AssaultRifle' PickupMessage="You got the M4" PickupSound=Sound'KF_M4RifleSnd.foley.WEP_M4_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.M4_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceDamTypeM4M203AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceDamTypeM4M203AssaultRifle.uc new file mode 100644 index 0000000..7ba479d --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceDamTypeM4M203AssaultRifle.uc @@ -0,0 +1,5 @@ +class NiceDamTypeM4M203AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceM4M203AssaultRifle' DeathString="%k killed %o (M4 M203)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4203Pickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4203Pickup.uc new file mode 100644 index 0000000..d5cc04f --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4203Pickup.uc @@ -0,0 +1,4 @@ +class NiceM4203Pickup extends ScrnM4203Pickup; +defaultproperties +{ ItemName="M4 203 NW" ItemShortName="M4 203 N W" PrimaryWeaponPickup=Class'NicePack.NiceM4Pickup' InventoryType=Class'NicePack.NiceM4203AssaultRifle' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Ammo.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Ammo.uc new file mode 100644 index 0000000..a222cfd --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Ammo.uc @@ -0,0 +1,5 @@ +class NiceM4M203Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM4Pickup' AmmoPickupAmount=30 MaxAmmo=360 InitialAmount=90 PickupClass=Class'NicePack.NiceM4M203AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M4 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AmmoPickup.uc new file mode 100644 index 0000000..374c793 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM4M203AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceM4M203Ammo' PickupMessage="Rounds 5.56mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AssaultRifle.uc new file mode 100644 index 0000000..fbfa2eb --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AssaultRifle.uc @@ -0,0 +1,20 @@ +class NiceM4M203AssaultRifle extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.217; + reloadDesc.trashStartFrame = 0.679; + reloadDesc.resumeFrame = 0.32; + reloadDesc.speedFrame = 0.019; + reloadDesc.animName = 'Fire_Secondary'; + autoReloadsDescriptions[0] = reloadDesc; + reloadDesc.animName = 'Fire_Iron_Secondary'; + autoReloadsDescriptions[1] = reloadDesc; + super.PostBeginPlay(); +} +defaultproperties +{ bSemiAutoFireEnabled=False reloadPreEndFrame=0.148000 reloadEndFrame=0.546000 reloadChargeEndFrame=0.778000 reloadMagStartFrame=0.306000 reloadChargeStartFrame=0.694000 autoReloadSpeedModifier=1.500000 ForceZoomOutOnAltFireTime=0.400000 MagCapacity=30 ReloadRate=3.633300 bHasSecondaryAmmo=True bReduceMagAmmoOnSecondaryFire=False ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4203" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M4_203' bIsTier2Weapon=True bIsTier3Weapon=True MeshRef="KF_Wep_M4M203.M4M203_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.m4_cmb" SelectSoundRef="KF_M4RifleSnd.WEP_M4_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M4_203_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M4_203" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM4M203Fire' FireModeClass(1)=Class'NicePack.NiceM4M203NadeFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An assault rifle with an attached grenade launcher." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=190 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=8 PickupClass=Class'NicePack.NiceM4M203Pickup' PlayerViewOffset=(X=25.000000,Y=18.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM4M203Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M4 203" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Attachment.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Attachment.uc new file mode 100644 index 0000000..f8b5e97 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Attachment.uc @@ -0,0 +1,4 @@ +class NiceM4M203Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_M4203" MovementAnims(1)="JogB_M4203" MovementAnims(2)="JogL_M4203" MovementAnims(3)="JogR_M4203" TurnLeftAnim="TurnL_M4203" TurnRightAnim="TurnR_M4203" CrouchAnims(0)="CHWalkF_M4203" CrouchAnims(1)="CHWalkB_M4203" CrouchAnims(2)="CHWalkL_M4203" CrouchAnims(3)="CHWalkR_M4203" WalkAnims(0)="WalkF_M4203" WalkAnims(1)="WalkB_M4203" WalkAnims(2)="WalkL_M4203" WalkAnims(3)="WalkR_M4203" CrouchTurnRightAnim="CH_TurnR_M4203" CrouchTurnLeftAnim="CH_TurnL_M4203" IdleCrouchAnim="CHIdle_M4203" IdleWeaponAnim="Idle_M4203" IdleRestAnim="Idle_M4203" IdleChatAnim="Idle_M4203" IdleHeavyAnim="Idle_M4203" IdleRifleAnim="Idle_M4203" FireAnims(0)="Fire_M4203" FireAnims(1)="Fire_M4203" FireAnims(2)="Fire_M4203" FireAnims(3)="Fire_M4203" FireAltAnims(0)="Reload_Secondary_M4203" FireAltAnims(1)="Reload_Secondary_M4203" FireAltAnims(2)="Reload_Secondary_M4203" FireAltAnims(3)="Reload_Secondary_M4203" FireCrouchAnims(0)="CHFire_M4203" FireCrouchAnims(1)="CHFire_M4203" FireCrouchAnims(2)="CHFire_M4203" FireCrouchAnims(3)="CHFire_M4203" FireCrouchAltAnims(0)="Reload_Secondary_M4203" FireCrouchAltAnims(1)="Reload_Secondary_M4203" FireCrouchAltAnims(2)="Reload_Secondary_M4203" FireCrouchAltAnims(3)="Reload_Secondary_M4203" HitAnims(0)="HitF_M4203" HitAnims(1)="HitB_M4203" HitAnims(2)="HitL_M4203" HitAnims(3)="HitR_M4203" PostFireBlendStandAnim="Blend_M4203" PostFireBlendCrouchAnim="CHBlend_M4203" MeshRef="KF_Weapons3rd3_Trip.M4M203_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Fire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Fire.uc new file mode 100644 index 0000000..830c88f --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Fire.uc @@ -0,0 +1,4 @@ +class NiceM4M203Fire extends NiceHighROFFire; +defaultproperties +{ FireEndSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_M" FireEndStereoSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_S" AmbientFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop" ProjectileSpeed=44000.000000 RecoilRate=0.065000 maxVerticalRecoilAngle=170 maxHorizontalRecoilAngle=85 ShellEjectClass=Class'ROEffects.KFShellEjectM4Rifle' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_M" StereoFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeM4AssaultRifle' DamageMin=69 DamageMax=69 Momentum=8500.000000 FireRate=0.075000 AmmoClass=Class'NicePack.NiceM4M203Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmo.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmo.uc new file mode 100644 index 0000000..7786a27 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmo.uc @@ -0,0 +1,4 @@ +class NiceM4M203NadeAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM4M203Pickup' AmmoPickupAmount=2 MaxAmmo=12 InitialAmount=6 PickupClass=Class'NicePack.NiceM4M203AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="M203 Grenades" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmoPickup.uc new file mode 100644 index 0000000..ccfff90 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM4M203NadeAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=2 InventoryType=Class'NicePack.NiceM4M203NadeAmmo' PickupMessage="M203 Grenades" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeFire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeFire.uc new file mode 100644 index 0000000..384d766 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeFire.uc @@ -0,0 +1,37 @@ +class NiceM4M203NadeFire extends NiceFire; +defaultproperties +{ + ProjSpawnOffset=(X=5.000000) + EffectiveRange=2500.000000 + ProjectileSpeed=3800.000000 + bulletClass=Class'NicePack.NiceBallisticNade' + ExplosionDamageType=Class'NicePack.NiceDamTypeM79Explosion' + ExplosionDamage=320 + ExplosionRadius=400.000000 + explosionExponent=1.000000 + ExplosionMomentum=75000.000000 + explodeOnPawnHit=True + explodeOnWallHit=True + projAffectedByScream=True + FireAimedAnim="Fire_Iron_Secondary" + RecoilRate=0.100000 + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=50 + FireSoundRef="KF_M79Snd.M79_Fire" + StereoFireSoundRef="KF_M79Snd.M79_FireST" + NoAmmoSoundRef="KF_M79Snd.M79_DryFire" + DamageType=Class'NicePack.NiceDamTypeM79Blunt' + DamageMax=200 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireAnim="Fire_Secondary" + FireForce="AssaultRifleFire" + FireRate=0.000000 + AmmoClass=Class'NicePack.NiceM4M203NadeAmmo' + ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) + BotRefireRate=1.800000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNadeL' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Pickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Pickup.uc new file mode 100644 index 0000000..939923e --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Pickup.uc @@ -0,0 +1,4 @@ +class NiceM4M203Pickup extends NiceWeaponPickup; +defaultproperties +{ crossPerkIndecies(0)=3 Weight=6.000000 cost=750 AmmoCost=40 BuyClipSize=1 PowerValue=30 SpeedValue=90 RangeValue=60 Description="An assault rifle with an attached grenade launcher." ItemName="M4 203" ItemShortName="M4 203" AmmoItemName="5.56mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' SecondaryAmmoShortName="M4 203 Grenades" PrimaryWeaponPickup=Class'NicePack.NiceM4Pickup' CorrespondingPerkIndex=6 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceM4M203AssaultRifle' PickupMessage="You got the M4 203" PickupSound=Sound'KF_M4RifleSnd.foley.WEP_M4_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.M4M203_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203Fire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203Fire.uc new file mode 100644 index 0000000..9b063b4 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203Fire.uc @@ -0,0 +1,4 @@ +class NiceM203Fire extends ScrnM203Fire; +defaultproperties +{ ProjectileClass=Class'NicePack.NiceM203GrenadeProjectile' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203GrenadeProjectile.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203GrenadeProjectile.uc new file mode 100644 index 0000000..595cfee --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203GrenadeProjectile.uc @@ -0,0 +1,4 @@ +class NiceM203GrenadeProjectile extends ScrnM203GrenadeProjectile; +defaultproperties +{ +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmo.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmo.uc new file mode 100644 index 0000000..dfd042b --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmo.uc @@ -0,0 +1,4 @@ +class NiceM203MAmmo extends ScrnM203MAmmo; +defaultproperties +{ PickupClass=Class'NicePack.NiceM203MAmmoPickup' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmoPickup.uc new file mode 100644 index 0000000..e433e85 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM203MAmmoPickup extends ScrnM203MAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceM203MAmmo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MFire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MFire.uc new file mode 100644 index 0000000..aeebb42 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MFire.uc @@ -0,0 +1,4 @@ +class NiceM203MFire extends NiceM203Fire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceM203MAmmo' ProjectileClass=Class'NicePack.NiceM203MGrenadeProjectile' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MGrenadeProjectile.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MGrenadeProjectile.uc new file mode 100644 index 0000000..622b3bb --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MGrenadeProjectile.uc @@ -0,0 +1,9 @@ +class NiceM203MGrenadeProjectile extends ScrnM79MGrenadeProjectile; + +function SuccessfulHealMessage() +{ + if ( ScrnM4203MMedicGun(InstigatorWeapon) != none ) ScrnM4203MMedicGun(InstigatorWeapon).ClientSuccessfulHeal(HealedPlayers.length, HealedHP); +} +defaultproperties +{ +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203AssaultRifle.uc new file mode 100644 index 0000000..6aaa398 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203AssaultRifle.uc @@ -0,0 +1,5 @@ +class NiceM4203AssaultRifle extends ScrnM4203AssaultRifle + config(user); +defaultproperties +{ FireModeClass(0)=Class'NicePack.NiceM4203BulletFire' FireModeClass(1)=Class'NicePack.NiceM203Fire' PickupClass=Class'NicePack.NiceM4203Pickup' ItemName="M4 203 NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203BulletFire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203BulletFire.uc new file mode 100644 index 0000000..5316092 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203BulletFire.uc @@ -0,0 +1,4 @@ +class NiceM4203BulletFire extends ScrnM4203BulletFire; +defaultproperties +{ maxVerticalRecoilAngle=170 maxHorizontalRecoilAngle=85 DamageType=Class'NicePack.NiceDamTypeM4AssaultRifle' DamageMin=46 DamageMax=46 FireRate=0.075000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MBulletFire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MBulletFire.uc new file mode 100644 index 0000000..0027dca --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MBulletFire.uc @@ -0,0 +1,5 @@ +// Can't share fire mod classes with many guns, cuz destorying one of them will unload its assets +class NiceM4203MBulletFire extends NiceM4203BulletFire; +defaultproperties +{ +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MMedicGun.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MMedicGun.uc new file mode 100644 index 0000000..0e81bfa --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MMedicGun.uc @@ -0,0 +1,30 @@ +class NiceM4203MMedicGun extends NiceM4203AssaultRifle + config(user); +var localized string SuccessfulHealMessage; +var ScrnFakedHealingGrenade FakedNade; +replication +{ reliable if( Role == ROLE_Authority ) ClientSuccessfulHeal; +} +simulated function PostBeginPlay() +{ + super.PostBeginPlay(); + if ( Level.NetMode != NM_DedicatedServer ) { SetBoneScale (58, 0.0, 'M203_EmptyShell'); + FakedNade = spawn(class'ScrnFakedHealingGrenade',self); if ( FakedNade != none ) { //FakedNade.SetDrawScale(4.0); SetBoneRotation('M203_Round', rot(0, 6000, 0)); // bone must have a size to properly adjust rotation SetBoneScale (59, 0.0001, 'M203_Round'); AttachToBone(FakedNade, 'M203_Round'); } + } +} + +simulated function Destroyed() +{ + if ( FakedNade != none ) FakedNade.Destroy(); + super.Destroyed(); +} +// The server lets the client know they successfully healed someone +simulated function ClientSuccessfulHeal(int HealedPlayerCount, int HealedAmount) +{ + local string str; + if( PlayerController(Instigator.Controller) != none ) { str = SuccessfulHealMessage; ReplaceText(str, "%c", String(HealedPlayerCount)); ReplaceText(str, "%a", String(HealedAmount)); PlayerController(Instigator.controller).ClientMessage(str, 'CriticalEvent'); + } +} +defaultproperties +{ SuccessfulHealMessage="You healed %c player(-s) with %ahp" bIsTier2Weapon=False SkinRefs(0)="ScrnTex.Weapons.M4203M" FireModeClass(0)=Class'NicePack.NiceM4203MBulletFire' FireModeClass(1)=Class'NicePack.NiceM203MFire' Description="An assault rifle with an attached healing grenade launcher. Shoots in 3-bullet fixed-burst mode." Priority=70 InventoryGroup=4 PickupClass=Class'NicePack.NiceM4203MPickup' ItemName="M4-203M Medic Rifle NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MPickup.uc new file mode 100644 index 0000000..c7d86be --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MPickup.uc @@ -0,0 +1,4 @@ +class NiceM4203MPickup extends NiceM4203Pickup; +defaultproperties +{ cost=1250 AmmoCost=40 PowerValue=30 Description="An assault rifle with an attached healing grenade launcher. Shoots in 3-bullet fixed-burst mode." ItemName="M4-203M Medic Rifle NW" ItemShortName="M4-203M NW" CorrespondingPerkIndex=0 InventoryType=Class'NicePack.NiceM4203MMedicGun' PickupMessage="You got the M4-203M Medic Rifle NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceDamTypeMKb42AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceDamTypeMKb42AssaultRifle.uc new file mode 100644 index 0000000..57b6e2c --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceDamTypeMKb42AssaultRifle.uc @@ -0,0 +1,16 @@ +class NiceDamTypeMKb42AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + bPenetrationHSOnly=True + MaxPenetrations=0 + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceMKb42AssaultRifle' + DeathString="%k killed %o (MKb42)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=5500.000000 + KDeathVel=175.000000 + KDeathUpKick=15.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Ammo.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Ammo.uc new file mode 100644 index 0000000..722fe95 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Ammo.uc @@ -0,0 +1,5 @@ +class NiceMKb42Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceMKb42Pickup' AmmoPickupAmount=30 MaxAmmo=240 InitialAmount=60 PickupClass=Class'NicePack.NiceMKb42AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="MKb42 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AmmoPickup.uc new file mode 100644 index 0000000..019e72b --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceMKb42AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceMKb42Ammo' PickupMessage="Rounds 7.92mm Kurz" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AssaultRifle.uc new file mode 100644 index 0000000..a4f83df --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AssaultRifle.uc @@ -0,0 +1,4 @@ +class NiceMKb42AssaultRifle extends NiceAssaultRifle; +defaultproperties +{ bSemiAutoFireEnabled=False bBurstFireEnabled=True reloadPreEndFrame=0.110000 reloadEndFrame=0.510000 reloadChargeEndFrame=0.670000 reloadMagStartFrame=0.240000 reloadChargeStartFrame=0.560000 MagCapacity=30 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MKB42' bIsTier2Weapon=True MeshRef="KF_Wep_MKB42.MKB42" SkinRefs(0)="KF_Weapons8_Trip_T.Weapons.MKB42_cmb" SelectSoundRef="KF_AK47Snd.AK47_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.MKB42_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MKB42" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=35.000000 FireModeClass(0)=Class'NicePack.NiceMKb42Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="German WWII prototype assault rifle. Used by heroes from the Battle of Stalingrad to the present day!" EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=115 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=13 PickupClass=Class'NicePack.NiceMKb42Pickup' PlayerViewOffset=(X=20.000000,Y=18.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceMKb42Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="MKb42" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Attachment.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Attachment.uc new file mode 100644 index 0000000..ad39ba8 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Attachment.uc @@ -0,0 +1,4 @@ +class NiceMKb42Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M4" MovementAnims(1)="JogB_M4" MovementAnims(2)="JogL_M4" MovementAnims(3)="JogR_M4" TurnLeftAnim="TurnL_M4" TurnRightAnim="TurnR_M4" CrouchAnims(0)="CHWalkF_M4" CrouchAnims(1)="CHWalkB_M4" CrouchAnims(2)="CHWalkL_M4" CrouchAnims(3)="CHWalkR_M4" WalkAnims(0)="WalkF_M4" WalkAnims(1)="WalkB_M4" WalkAnims(2)="WalkL_M4" WalkAnims(3)="WalkR_M4" CrouchTurnRightAnim="CH_TurnR_M4" CrouchTurnLeftAnim="CH_TurnL_M4" IdleCrouchAnim="CHIdle_M4" IdleWeaponAnim="Idle_M4" IdleRestAnim="Idle_M4" IdleChatAnim="Idle_M4" IdleHeavyAnim="Idle_M4" IdleRifleAnim="Idle_M4" FireAnims(0)="Fire_M4" FireAnims(1)="Fire_M4" FireAnims(2)="Fire_M4" FireAnims(3)="Fire_M4" FireAltAnims(0)="Fire_M4" FireAltAnims(1)="Fire_M4" FireAltAnims(2)="Fire_M4" FireAltAnims(3)="Fire_M4" FireCrouchAnims(0)="CHFire_M4" FireCrouchAnims(1)="CHFire_M4" FireCrouchAnims(2)="CHFire_M4" FireCrouchAnims(3)="CHFire_M4" FireCrouchAltAnims(0)="CHFire_M4" FireCrouchAltAnims(1)="CHFire_M4" FireCrouchAltAnims(2)="CHFire_M4" FireCrouchAltAnims(3)="CHFire_M4" HitAnims(0)="HitF_M4" HitAnims(1)="HitB_M4" HitAnims(2)="HitL_M4" HitAnims(3)="HitR_M4" PostFireBlendStandAnim="Blend_M4" PostFireBlendCrouchAnim="CHBlend_M4" MeshRef="KF_Weapons3rd5_Trip.MKB42_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Fire.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Fire.uc new file mode 100644 index 0000000..56cc10e --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Fire.uc @@ -0,0 +1,37 @@ +class NiceMKb42Fire extends NiceFire; +defaultproperties +{ + zedTimeFireSpeedUp=2.000000 + ProjectileSpeed=34250.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.070000 + maxVerticalRecoilAngle=210 + maxHorizontalRecoilAngle=105 + ShellEjectClass=Class'ROEffects.KFShellEjectMkb' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + FireSoundRef="KF_mkb42Snd.mkb42_Fire_Single_M" + StereoFireSoundRef="KF_mkb42Snd.mkb42_Fire_Single_S" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeMKb42AssaultRifle' + DamageMin=99 + DamageMax=99 + Momentum=8500.000000 + bPawnRapidFireAnim=True + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.1750000 + AmmoClass=Class'NicePack.NiceMKb42Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Pickup.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Pickup.uc new file mode 100644 index 0000000..da4260a --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Pickup.uc @@ -0,0 +1,4 @@ +class NiceMKb42Pickup extends NiceWeaponPickup; +defaultproperties +{ Weight=6.000000 cost=750 AmmoCost=30 BuyClipSize=30 PowerValue=40 SpeedValue=85 RangeValue=55 Description="German WWII era prototype assault rifle. Many heroes were known to have used this weapon in Stalingrad." ItemName="MKb42" ItemShortName="MKb42" AmmoItemName="7.92mm Kurz Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceMKb42AssaultRifle' PickupMessage="You got the MKb42" PickupSound=Sound'KF_mkb42Snd.Handling.mkb42_Handling_Bolt_Back' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups5_Trip.Rifles.MKB42_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceDamTypeSCARMK17AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceDamTypeSCARMK17AssaultRifle.uc new file mode 100644 index 0000000..db2db49 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceDamTypeSCARMK17AssaultRifle.uc @@ -0,0 +1,5 @@ +class NiceDamTypeSCARMK17AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ bPenetrationHSOnly=True MaxPenetrations=1 HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceSCARMK17AssaultRifle' DeathString="%k killed %o (SCAR MK17)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=6500.000000 KDeathVel=175.000000 KDeathUpKick=20.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Ammo.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Ammo.uc new file mode 100644 index 0000000..4ca4914 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Ammo.uc @@ -0,0 +1,5 @@ +class NiceSCARMK17Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceSCARMK17Pickup' AmmoPickupAmount=20 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceSCARMK17AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="SCARMK17 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AmmoPickup.uc new file mode 100644 index 0000000..442ccb7 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceSCARMK17AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=20 InventoryType=Class'NicePack.NiceSCARMK17Ammo' PickupMessage="Rounds 7.62x51mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AssaultRifle.uc new file mode 100644 index 0000000..750c84d --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AssaultRifle.uc @@ -0,0 +1,4 @@ +class NiceSCARMK17AssaultRifle extends NiceAK47AssaultRifle; +defaultproperties +{ bSemiAutoFireEnabled=True bBurstFireEnabled=False reloadPreEndFrame=0.175000 reloadEndFrame=0.737500 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.300000 reloadChargeStartFrame=-1.000000 MagazineBone="Magazine" MagCapacity=20 ReloadRate=2.966000 WeaponReloadAnim="Reload_SCAR" Weight=8.000000 StandardDisplayFOV=55.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Scar' bIsTier3Weapon=True MeshRef="KF_Weapons2_Trip.SCAR_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Rifle.Scar_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_SCARSnd.SCAR_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Scar_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Scar" ZoomedDisplayFOV=20.000000 FireModeClass(0)=Class'NicePack.NiceSCARMK17Fire' Description="An advanced tactical assault rifle. Equipped with an aimpoint sight. Fires in semi or full auto with great power and accuracy." DisplayFOV=55.000000 Priority=175 InventoryGroup=4 GroupOffset=4 PickupClass=Class'NicePack.NiceSCARMK17Pickup' PlayerViewOffset=(X=25.000000,Y=20.000000) AttachmentClass=Class'NicePack.NiceSCARMK17Attachment' ItemName="SCAR MK17" +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Attachment.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Attachment.uc new file mode 100644 index 0000000..3a497d6 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Attachment.uc @@ -0,0 +1,4 @@ +class NiceSCARMK17Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="KF_Weapons3rd2_Trip.scar_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Fire.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Fire.uc new file mode 100644 index 0000000..c5c1a8e --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Fire.uc @@ -0,0 +1,4 @@ +class NiceSCARMK17Fire extends NiceFire; +defaultproperties +{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=43500.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.070000 maxVerticalRecoilAngle=280 maxHorizontalRecoilAngle=140 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True FireSoundRef="KF_SCARSnd.SCAR_Fire" StereoFireSoundRef="KF_SCARSnd.SCAR_FireST" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeSCARMK17AssaultRifle' DamageMin=74 DamageMax=74 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.096000 AmmoClass=Class'NicePack.NiceSCARMK17Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Pickup.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Pickup.uc new file mode 100644 index 0000000..379cb7d --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Pickup.uc @@ -0,0 +1,4 @@ +class NiceSCARMK17Pickup extends NiceWeaponPickup; +defaultproperties +{ Weight=8.000000 cost=1250 AmmoCost=40 BuyClipSize=20 PowerValue=45 SpeedValue=85 RangeValue=70 Description="An advanced tactical assault rifle. Equipped with an aimpoint sight. Fires in semi or full auto with great power and accuracy." ItemName="SCAR MK17" ItemShortName="SCAR MK17" AmmoItemName="7.62x51mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.NeonSCARMK17Pickup' InventoryType=Class'NicePack.NiceSCARMK17AssaultRifle' PickupMessage="You got the SCARMK17" PickupSound=Sound'KF_SCARSnd.SCAR_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Rifles.SCAR_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceDamTypeThom.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceDamTypeThom.uc new file mode 100644 index 0000000..a0f3b29 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceDamTypeThom.uc @@ -0,0 +1,5 @@ +class NiceDamTypeThom extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceTactThom' DeathString="%k killed %o (Tactical-Thompson)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThom.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThom.uc new file mode 100644 index 0000000..4049993 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThom.uc @@ -0,0 +1,17 @@ +class NiceTactThom extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +simulated function AltFire(float F){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) LaserType = 1; + else LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ LaserAttachmentBone="bone_laser" reloadPreEndFrame=0.110000 reloadEndFrame=0.380000 reloadChargeEndFrame=0.650000 reloadMagStartFrame=0.260000 reloadChargeStartFrame=0.460000 MagazineBone="thomson-mag" MagCapacity=30 ReloadRate=2.880000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4" SelectedHudImage=Texture'NicePackT.TactThompson.tact_sel' Weight=4.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=70.000000 SleeveNum=2 TraderInfoTexture=Texture'NicePackT.TactThompson.tact_trader' bIsTier2Weapon=True MeshRef="NicePackA.tact_tom" SkinRefs(0)="NicePackT.TactThompson.EOTECH" SkinRefs(1)="NicePackT.TactThompson.holosight_fb" SelectSoundRef="NicePackSnd.TactThompson.tact_deploy" HudImageRef="NicePackT.TactThompson.tact_unsel" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceTactThomFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An excellent tactical Thompson. Not much better than a bullpup, but has lots of ammo and some penetration." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=70.000000 Priority=70 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=1 PickupClass=Class'NicePack.NiceTactThomPickup' PlayerViewOffset=(X=20.000000,Y=21.500000,Z=-9.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceTactThomAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Tactical Thompson" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmo.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmo.uc new file mode 100644 index 0000000..b129240 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmo.uc @@ -0,0 +1,5 @@ +class NiceTactThomAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceTactThomPickup' MaxAmmo=270 InitialAmount=60 PickupClass=Class'NicePack.NiceTactThomAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Tact-Thom bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmoPickup.uc new file mode 100644 index 0000000..29ab8de --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceTactThomAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceTactThomAmmo' PickupMessage="Rounds (Tact-Thom)" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAttachment.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAttachment.uc new file mode 100644 index 0000000..fd892af --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAttachment.uc @@ -0,0 +1,4 @@ +class NiceTactThomAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M4" MovementAnims(1)="JogB_M4" MovementAnims(2)="JogL_M4" MovementAnims(3)="JogR_M4" TurnLeftAnim="TurnL_M4" TurnRightAnim="TurnR_M4" CrouchAnims(0)="CHWalkF_M4" CrouchAnims(1)="CHWalkB_M4" CrouchAnims(2)="CHWalkL_M4" CrouchAnims(3)="CHWalkR_M4" WalkAnims(0)="WalkF_M4" WalkAnims(1)="WalkB_M4" WalkAnims(2)="WalkL_M4" WalkAnims(3)="WalkR_M4" CrouchTurnRightAnim="CH_TurnR_M4" CrouchTurnLeftAnim="CH_TurnL_M4" IdleCrouchAnim="CHIdle_M4" IdleWeaponAnim="Idle_M4" IdleRestAnim="Idle_M4" IdleChatAnim="Idle_M4" IdleHeavyAnim="Idle_M4" IdleRifleAnim="Idle_M4" FireAnims(0)="Fire_M4" FireAnims(1)="Fire_M4" FireAnims(2)="Fire_M4" FireAnims(3)="Fire_M4" FireAltAnims(0)="Fire_M4" FireAltAnims(1)="Fire_M4" FireAltAnims(2)="Fire_M4" FireAltAnims(3)="Fire_M4" FireCrouchAnims(0)="CHFire_M4" FireCrouchAnims(1)="CHFire_M4" FireCrouchAnims(2)="CHFire_M4" FireCrouchAnims(3)="CHFire_M4" FireCrouchAltAnims(0)="CHFire_M4" FireCrouchAltAnims(1)="CHFire_M4" FireCrouchAltAnims(2)="CHFire_M4" FireCrouchAltAnims(3)="CHFire_M4" HitAnims(0)="HitF_M4" HitAnims(1)="HitB_M4" HitAnims(2)="HitL_M4" HitAnims(3)="HitR_M4" PostFireBlendStandAnim="Blend_M4" PostFireBlendCrouchAnim="CHBlend_M4" MeshRef="NicePackA.tact_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomFire.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomFire.uc new file mode 100644 index 0000000..e3d35f4 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomFire.uc @@ -0,0 +1,4 @@ +class NiceTactThomFire extends NiceFire; +defaultproperties +{ ProjectileSpeed=14250.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.080000 maxVerticalRecoilAngle=240 maxHorizontalRecoilAngle=120 ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' ShellEjectBoneName="bone_ejector" bAccuracyBonusForSemiAuto=True FireSoundRef="NicePackSnd.TactThompson.tact_fire_m" StereoFireSoundRef="NicePackSnd.TactThompson.tacT_fire_s" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamTypeThom' DamageMin=20 DamageMax=20 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.080000 AmmoClass=Class'NicePack.NiceTactThomAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=0.500000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomPickup.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomPickup.uc new file mode 100644 index 0000000..77729ba --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomPickup.uc @@ -0,0 +1,4 @@ +class NiceTactThomPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=4.000000 cost=200 AmmoCost=12 BuyClipSize=40 PowerValue=56 SpeedValue=95 RangeValue=70 Description="An excellent tactical Thompson. Weakest weapon in commando's arsenal, but it is extremely light." ItemName="Tactical Thompson" ItemShortName="Tact Thom" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceTactThom' PickupMessage="You got the Tactical-Thompson." PickupSound=Sound'NicePackSnd.TactThompson.bolt_pull' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.TactThompson.tact_pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceDamTypeThompsonDrum.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceDamTypeThompsonDrum.uc new file mode 100644 index 0000000..7c25d69 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceDamTypeThompsonDrum.uc @@ -0,0 +1,5 @@ +class NiceDamTypeThompsonDrum extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceThompsonDrumSMG' DeathString="%k killed %o (Rising Storm Tommy Gun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmo.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmo.uc new file mode 100644 index 0000000..736da29 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmo.uc @@ -0,0 +1,5 @@ +class NiceThompsonDrumAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceThompsonDrumPickup' MaxAmmo=360 InitialAmount=90 PickupClass=Class'KFMod.ThompsonDrumAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="45. ACP bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmoPickup.uc new file mode 100644 index 0000000..4370143 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceThompsonDrumAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=40 InventoryType=Class'NicePack.NiceThompsonDrumAmmo' PickupMessage="Rounds 45. ACP" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAttachment.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAttachment.uc new file mode 100644 index 0000000..ee0e903 --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAttachment.uc @@ -0,0 +1,4 @@ +class NiceThompsonDrumAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_IJC_spThompson_Drum" MovementAnims(1)="JogB_IJC_spThompson_Drum" MovementAnims(2)="JogL_IJC_spThompson_Drum" MovementAnims(3)="JogR_IJC_spThompson_Drum" TurnLeftAnim="TurnL_IJC_spThompson_Drum" TurnRightAnim="TurnR_IJC_spThompson_Drum" CrouchAnims(0)="CHWalkF_IJC_spThompson_Drum" CrouchAnims(1)="CHWalkB_IJC_spThompson_Drum" CrouchAnims(2)="CHWalkL_IJC_spThompson_Drum" CrouchAnims(3)="CHWalkR_IJC_spThompson_Drum" WalkAnims(0)="WalkF_IJC_spThompson_Drum" WalkAnims(1)="WalkB_IJC_spThompson_Drum" WalkAnims(2)="WalkL_IJC_spThompson_Drum" WalkAnims(3)="WalkR_IJC_spThompson_Drum" CrouchTurnRightAnim="CH_TurnR_IJC_spThompson_Drum" CrouchTurnLeftAnim="CH_TurnL_IJC_spThompson_Drum" IdleCrouchAnim="CHIdle_IJC_spThompson_Drum" IdleWeaponAnim="Idle_IJC_spThompson_Drum" IdleRestAnim="Idle_IJC_spThompson_Drum" IdleChatAnim="Idle_IJC_spThompson_Drum" IdleHeavyAnim="Idle_IJC_spThompson_Drum" IdleRifleAnim="Idle_IJC_spThompson_Drum" FireAnims(0)="Fire_IJC_spThompson_Drum" FireAnims(1)="Fire_IJC_spThompson_Drum" FireAnims(2)="Fire_IJC_spThompson_Drum" FireAnims(3)="Fire_IJC_spThompson_Drum" FireAltAnims(0)="Fire_IJC_spThompson_Drum" FireAltAnims(1)="Fire_IJC_spThompson_Drum" FireAltAnims(2)="Fire_IJC_spThompson_Drum" FireAltAnims(3)="Fire_IJC_spThompson_Drum" FireCrouchAnims(0)="CHFire_IJC_spThompson_Drum" FireCrouchAnims(1)="CHFire_IJC_spThompson_Drum" FireCrouchAnims(2)="CHFire_IJC_spThompson_Drum" FireCrouchAnims(3)="CHFire_IJC_spThompson_Drum" FireCrouchAltAnims(0)="CHFire_IJC_spThompson_Drum" FireCrouchAltAnims(1)="CHFire_IJC_spThompson_Drum" FireCrouchAltAnims(2)="CHFire_IJC_spThompson_Drum" FireCrouchAltAnims(3)="CHFire_IJC_spThompson_Drum" HitAnims(0)="HitF_IJC_spThompson_Drum" HitAnims(1)="HitB_IJC_spThompson_Drum" HitAnims(2)="HitL_IJC_spThompson_Drum" HitAnims(3)="HitR_IJC_spThompson_Drum" PostFireBlendStandAnim="Blend_IJC_spThompson_Drum" PostFireBlendCrouchAnim="CHBlend_IJC_spThompson_Drum" MeshRef="KF_Weapons3rd2_IJC.spThompsonDrum_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumFire.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumFire.uc new file mode 100644 index 0000000..ebe439e --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumFire.uc @@ -0,0 +1,4 @@ +class NiceThompsonDrumFire extends NiceHighROFFire; +defaultproperties +{ FireEndSoundRef="KF_IJC_HalloweenSnd.ThompsonSMG_Fire_Loop_End_M" FireEndStereoSoundRef="KF_IJC_HalloweenSnd.ThompsonSMG_Fire_Loop_End_S" AmbientFireSoundRef="KF_IJC_HalloweenSnd.ThompsonSMG_Fire_Loop" ProjectileSpeed=14250.000000 RecoilRate=0.080000 maxVerticalRecoilAngle=240 maxHorizontalRecoilAngle=120 ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' ShellEjectBoneName="Shell_eject" bRandomPitchFireSound=False FireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_M" StereoFireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeThompsonDrum' DamageMin=20 DamageMax=20 Momentum=12500.000000 FireRate=0.085700 AmmoClass=Class'NicePack.NiceThompsonDrumAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.150000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumPickup.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumPickup.uc new file mode 100644 index 0000000..8dabbec --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumPickup.uc @@ -0,0 +1,4 @@ +class NiceThompsonDrumPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=5.000000 cost=500 AmmoCost=15 BuyClipSize=50 PowerValue=35 SpeedValue=80 RangeValue=45 Description="This Tommy gun with a drum magazine was used heavily during the WWII pacific battles." ItemName="Rising Storm Tommy Gun" ItemShortName="R.S. Tommy Gun" AmmoItemName="45. ACP Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceThompsonDrumSMG' PickupMessage="You got the Rising Storm Thompson with Drum Mag" PickupSound=Sound'KF_IJC_HalloweenSnd.Handling.Thompson_Handling_Bolt_Back' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_IJC_Summer_Weps.Thompson_Drum' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumSMG.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumSMG.uc new file mode 100644 index 0000000..5d8da3a --- /dev/null +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumSMG.uc @@ -0,0 +1,4 @@ +class NiceThompsonDrumSMG extends NiceAssaultRifle; +defaultproperties +{ bSemiAutoFireEnabled=False reloadPreEndFrame=0.132000 reloadEndFrame=0.570000 reloadChargeEndFrame=0.810000 reloadMagStartFrame=0.347000 reloadChargeStartFrame=0.670000 MagazineBone="Magazine_Drum" MagCapacity=40 ReloadRate=3.800000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_IJC_spThompson_Drum" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=0 TraderInfoTexture=Texture'KF_IJC_HUD.Trader_Weapon_Icons.Trader_Thompson_Drum' bIsTier2Weapon=True MeshRef="KF_IJC_Summer_Weps1.ThompsonDrum" SkinRefs(1)="KF_IJC_Summer_Weapons.Thompson_Drum.thompson_drum_cmb" SelectSoundRef="KF_IJC_HalloweenSnd.Thompson_Handling_Bolt_Back" HudImageRef="KF_IJC_HUD.WeaponSelect.Thompson_Drum_unselected" SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.Thompson_Drum" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceThompsonDrumFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="This Tommy gun with a drum magazine was used heavily during the WWII pacific battles." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=124 InventoryGroup=3 GroupOffset=20 PickupClass=Class'NicePack.NiceThompsonDrumPickup' PlayerViewOffset=(X=10.000000,Y=16.000000,Z=-7.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceThompsonDrumAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Rising Storm Tommy Gun" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGL.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGL.uc new file mode 100644 index 0000000..cf6049c --- /dev/null +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGL.uc @@ -0,0 +1,16 @@ +class NiceCLGL extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 4 shells during 94 frames tops, with first shell loaded at frame 13, with 22 frames between load moments + generateReloadStages(3, 94, 13, 22); +} +simulated function SetupReloadVars(optional bool bIsActive, optional int animationIndex){ + if(MagAmmoRemainingClient == 0){ generateReloadStages(4, 145, 42, 22); reloadStages[0] = 0.2; ReloadAnim='ReloadLong'; + } + else{ generateReloadStages(3, 94, 13, 22); ReloadAnim='Reload'; + } + UpdateSingleReloadVars(); + super.SetupReloadVars(bIsActive, animationIndex); +} +defaultproperties +{ bChangeClipIcon=True bChangeBulletsIcon=True hudClipTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' hudBulletsTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' reloadType=RTYPE_SINGLE MagCapacity=4 ReloadRate=0.850000 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'NicePackT.CLGL.CLGL_HUD_Trader' bIsTier3Weapon=True MeshRef="NicePackA.CLGLMesh1st" SkinRefs(1)="NicePackT.CLGL.CLGL_CMB" SelectSoundRef="NicePackSnd.CLGL.CLGLSelect" HudImageRef="NicePackT.CLGL.CLGL_HUD_UnSelected" SelectedHudImageRef="NicePackT.CLGL.CLGL_HUD_Selected" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceCLGLFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="A pump-action grenade launcher. Launches high-explosive grenades." DisplayFOV=65.000000 Priority=210 InventoryGroup=4 GroupOffset=6 PickupClass=Class'NicePack.NiceCLGLPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceCLGLAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="China Lake Grenade Launcher" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmo.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmo.uc new file mode 100644 index 0000000..a5f6e3d --- /dev/null +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmo.uc @@ -0,0 +1,4 @@ +class NiceCLGLAmmo extends NiceAmmo; +defaultproperties +{ AmmoPickupAmount=4 MaxAmmo=36 InitialAmount=9 PickupClass=Class'NicePack.NiceCLGLAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="CLGL Grenades" +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmoPickup.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmoPickup.uc new file mode 100644 index 0000000..b3923de --- /dev/null +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceCLGLAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=6 InventoryType=Class'NicePack.NiceCLGLAmmo' PickupMessage="CLGL Grenades" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAttachment.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAttachment.uc new file mode 100644 index 0000000..cd39447 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAttachment.uc @@ -0,0 +1,4 @@ +class NiceCLGLAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNadeL' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_Shotgun" MovementAnims(1)="JogB_Shotgun" MovementAnims(2)="JogL_Shotgun" MovementAnims(3)="JogR_Shotgun" TurnLeftAnim="TurnL_Shotgun" TurnRightAnim="TurnR_Shotgun" CrouchAnims(0)="CHwalkF_Shotgun" CrouchAnims(1)="CHwalkB_Shotgun" CrouchAnims(2)="CHwalkL_Shotgun" CrouchAnims(3)="CHwalkR_Shotgun" WalkAnims(0)="WalkF_Shotgun" WalkAnims(1)="WalkB_Shotgun" WalkAnims(2)="WalkL_Shotgun" WalkAnims(3)="WalkR_Shotgun" CrouchTurnRightAnim="CH_TurnR_Shotgun" CrouchTurnLeftAnim="CH_TurnL_Shotgun" IdleCrouchAnim="CHIdle_Shotgun" IdleWeaponAnim="Idle_Shotgun" IdleRestAnim="Idle_Shotgun" IdleChatAnim="Idle_Shotgun" IdleHeavyAnim="Idle_Shotgun" IdleRifleAnim="Idle_Shotgun" FireAnims(0)="Fire_Shotgun" FireAnims(1)="Fire_Shotgun" FireAnims(2)="Fire_Shotgun" FireAnims(3)="Fire_Shotgun" FireAltAnims(0)="Fire_Shotgun" FireAltAnims(1)="Fire_Shotgun" FireAltAnims(2)="Fire_Shotgun" FireAltAnims(3)="Fire_Shotgun" FireCrouchAnims(0)="CHFire_Shotgun" FireCrouchAnims(1)="CHFire_Shotgun" FireCrouchAnims(2)="CHFire_Shotgun" FireCrouchAnims(3)="CHFire_Shotgun" FireCrouchAltAnims(0)="CHFire_Shotgun" FireCrouchAltAnims(1)="CHFire_Shotgun" FireCrouchAltAnims(2)="CHFire_Shotgun" FireCrouchAltAnims(3)="CHFire_Shotgun" HitAnims(0)="HitF_Shotgun" HitAnims(1)="HitB_Shotgun" HitAnims(2)="HitL_Shotgun" HitAnims(3)="HitR_Shotgun" PostFireBlendStandAnim="Blend_Shotgun" PostFireBlendCrouchAnim="CHBlend_Shotgun" MeshRef="NicePackA.CLGLMesh3rd" +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLFire.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLFire.uc new file mode 100644 index 0000000..bdcf0bd --- /dev/null +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLFire.uc @@ -0,0 +1,35 @@ +class NiceCLGLFire extends NiceFire; +defaultproperties +{ + ProjSpawnOffset=(X=5.000000) + EffectiveRange=2500.000000 + ProjectileSpeed=3800.000000 + bulletClass=Class'NicePack.NiceBallisticNade' + ExplosionDamageType=Class'NicePack.NiceDamTypeCLGLExplosion' + ExplosionDamage=360 + ExplosionRadius=400.000000 + explosionExponent=1.000000 + ExplosionMomentum=75000.000000 + explodeOnPawnHit=True + explodeOnWallHit=True + projAffectedByScream=True + FireAimedAnim="Iron_Fire" + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=50 + FireSoundRef="KF_M32Snd.M32_Fire" + StereoFireSoundRef="KF_M32Snd.M32_FireST" + NoAmmoSoundRef="KF_M79Snd.M79_DryFire" + DamageType=Class'NicePack.NiceDamTypeCLGLBlunt' + DamageMax=175 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireForce="AssaultRifleFire" + FireRate=1.100000 + AmmoClass=Class'NicePack.NiceCLGLAmmo' + ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) + BotRefireRate=1.800000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNadeL' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLPickup.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLPickup.uc new file mode 100644 index 0000000..3d7324d --- /dev/null +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLPickup.uc @@ -0,0 +1,4 @@ +class NiceCLGLPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=6.000000 cost=500 AmmoCost=28 BuyClipSize=4 PowerValue=85 SpeedValue=65 RangeValue=75 Description="A pump-action grenade launcher. Launches high-explosive grenades." ItemName="China Lake Grenade Launcher" ItemShortName="China Lake Launcher" AmmoItemName="CLGL Grenades" AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CorrespondingPerkIndex=6 EquipmentCategoryID=2 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceCLGL' PickupMessage="You got the China Lake Grenade Launcher." PickupSound=Sound'NicePackSnd.CLGL.CLGLPickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.CLGLMeshPickup' DrawScale=1.400000 CollisionRadius=25.000000 CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLBlunt.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLBlunt.uc new file mode 100644 index 0000000..27fd2f6 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLBlunt.uc @@ -0,0 +1,4 @@ +class NiceDamTypeCLGLBlunt extends NiceDamTypeDemoBlunt; +defaultproperties +{ WeaponClass=Class'NicePack.NiceCLGL' +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLExplosion.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLExplosion.uc new file mode 100644 index 0000000..c6ea757 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLExplosion.uc @@ -0,0 +1,4 @@ +class NiceDamTypeCLGLExplosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ WeaponClass=Class'NicePack.NiceCLGL' +} diff --git a/sources/Weapons/Playable/Explosives/HRL/NiceHRL.uc b/sources/Weapons/Playable/Explosives/HRL/NiceHRL.uc new file mode 100644 index 0000000..235c3e8 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HRL/NiceHRL.uc @@ -0,0 +1,4 @@ +class NiceHRL extends HRL; +defaultproperties +{ FireModeClass(0)=Class'NicePack.NiceHRLFire' PickupClass=Class'NicePack.NiceHRLPickup' ItemName="HRL-1 Rocket Launcher NW" +} diff --git a/sources/Weapons/Playable/Explosives/HRL/NiceHRLFire.uc b/sources/Weapons/Playable/Explosives/HRL/NiceHRLFire.uc new file mode 100644 index 0000000..fbf1cb7 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HRL/NiceHRLFire.uc @@ -0,0 +1,4 @@ +class NiceHRLFire extends HRLFire; +defaultproperties +{ ProjectileClass=Class'NicePack.NiceHRLProj' +} diff --git a/sources/Weapons/Playable/Explosives/HRL/NiceHRLPickup.uc b/sources/Weapons/Playable/Explosives/HRL/NiceHRLPickup.uc new file mode 100644 index 0000000..07215c8 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HRL/NiceHRLPickup.uc @@ -0,0 +1,4 @@ +class NiceHRLPickup extends HRLPickup; +defaultproperties +{ ItemName="HRL-1 Rocket Launcher NW" ItemShortName="HRL-1 NW" InventoryType=Class'NicePack.NiceHRL' PickupMessage="You got the HRL-1 Rocket Launcher NW" +} diff --git a/sources/Weapons/Playable/Explosives/HRL/NiceHRLProj.uc b/sources/Weapons/Playable/Explosives/HRL/NiceHRLProj.uc new file mode 100644 index 0000000..8406a09 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HRL/NiceHRLProj.uc @@ -0,0 +1,4 @@ +class NiceHRLProj extends HRLProj; +defaultproperties +{ ArmDistSquared=180000.000000 +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmo.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmo.uc new file mode 100644 index 0000000..7a24532 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmo.uc @@ -0,0 +1,4 @@ +class NiceHopMineAmmo extends HopMineAmmo; +defaultproperties +{ PickupClass=Class'NicePack.NiceHopMineAmmoPickup' +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmoPickup.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmoPickup.uc new file mode 100644 index 0000000..747f79b --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceHopMineAmmoPickup extends HopMineAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceHopMineAmmo' +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineFire.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineFire.uc new file mode 100644 index 0000000..a88d4e6 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineFire.uc @@ -0,0 +1,4 @@ +class NiceHopMineFire extends HopMineFire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceHopMineAmmo' ProjectileClass=Class'NicePack.NiceHopMineProj' +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLPickup.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLPickup.uc new file mode 100644 index 0000000..0a5da8a --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLPickup.uc @@ -0,0 +1,4 @@ +class NiceHopMineLPickup extends HopMineLPickup; +defaultproperties +{ Weight=5.000000 Description="The prototype of Hopmine launcher. But still can be very useful." ItemName="HopMine Launcher NW" ItemShortName="HopMine NW" InventoryType=Class'NicePack.NiceHopMineLchr' PickupMessage="You got the HopMine Launcher NW." +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLchr.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLchr.uc new file mode 100644 index 0000000..1e0ce2a --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLchr.uc @@ -0,0 +1,7 @@ +//============================================================================= +// HopMineLchr +//============================================================================= +class NiceHopMineLchr extends HopMineLchr; +defaultproperties +{ Weight=5.000000 FireModeClass(0)=Class'NicePack.NiceHopMineFire' Description="The prototype of Hopmine launcher." PickupClass=Class'NicePack.NiceHopMineLPickup' ItemName="HopMine Launcher NW" +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineProj.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineProj.uc new file mode 100644 index 0000000..22f0a3b --- /dev/null +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineProj.uc @@ -0,0 +1,23 @@ +Class NiceHopMineProj extends HopMineProj; +#exec obj load file="KF_GrenadeSnd.uax" +#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_SND.uax +#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx +state OnWall +{ + simulated function BeginState() + { if ( SmokeTrail != none ) { SmokeTrail.HandleOwnerDestroyed(); SmokeTrail = none; } bCollideWorld = False; bFixedRotationDir = false; RotationRate = rot(0,0,0); if( Level.NetMode!=NM_DedicatedServer ) { TweenAnim('Down',0.05f); PlaySound(Sound'ScrnWeaponPack_SND.mine.blade_cut'); DotLight = Spawn(Class'HopMineLight',,,Location + (vect(0,0,5) << Rotation)); if( DotLight!=none ) { DotLight.SetBase(Self); DotLight.SetRelativeLocation(vect(0,0,5)); } } if( Level.NetMode!=NM_Client ) { NetUpdateFrequency = 1.f; SetTimer(0.25+FRand()*0.25,true); } + } + simulated function EndState() + { if( Level.NetMode!=NM_Client ) { SetTimer(0,false); NetUpdateFrequency = Default.NetUpdateFrequency; NetUpdateTime = Level.TimeSeconds-1; } + } + function Timer() + { local Controller C; local vector X,Y,Z; local float DotP; local int ThreatLevel; local bool bA,bB; GetAxes(Rotation,X,Y,Z); for( C=Level.ControllerList; C!=none; C=C.nextController ) if( C.Pawn!=none && C.Pawn.Health>0 && VSizeSquared(C.Pawn.Location-Location)<1000000.f ) { X = C.Pawn.Location-Location; DotP = (X Dot Z); if( DotP<0 ) continue; DotP = VSizeSquared(X - (Z * DotP)); if( DotP>90000.f || !FastTrace(C.Pawn.Location,Location) ) continue; if( Monster(C.Pawn)!=none ) { bB = true; if( DotP<35500.f ) { Y = C.Pawn.Location; ThreatLevel+=C.Pawn.HealthMax; } } else bA = true; } if( bA!=bWarningTarget || bB!=bCriticalTarget ) { bWarningTarget = bA; bCriticalTarget = bB; if( DotLight!=none ) DotLight.SetMode(bA,bB); NetUpdateTime = Level.TimeSeconds-1; } if( bB && ThreatLevel>400 ) { bWarningTarget = false; bCriticalTarget = false; RepLaunchPos = Y; GoToState('LaunchMine'); } else if( InstigatorController==none || bNeedsDetonate || (WeaponOwner!=none && WeaponOwner.NumMinesOut>WeaponOwner.MaximumMines) ) { bWarningTarget = false; bCriticalTarget = false; RepLaunchPos = Location + Z*(150.f+FRand()*250.f); GoToState('LaunchMine'); } + } + simulated function PostNetReceive() + { if( RepLaunchPos!=vect(0,0,0) ) GoToState('LaunchMine'); else if( DotLight!=none ) DotLight.SetMode(bWarningTarget,bCriticalTarget); + } +} +defaultproperties +{ +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWBlunt.uc b/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWBlunt.uc new file mode 100644 index 0000000..c42f509 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWBlunt.uc @@ -0,0 +1,4 @@ +class NiceDamTypeLAWBlunt extends NiceDamTypeDemoBlunt; +defaultproperties +{ WeaponClass=Class'NicePack.NiceLAW' +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWExplosion.uc b/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWExplosion.uc new file mode 100644 index 0000000..02e7cbf --- /dev/null +++ b/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWExplosion.uc @@ -0,0 +1,4 @@ +class NiceDamTypeLAWExplosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ WeaponClass=Class'NicePack.NiceLAW' +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAW.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAW.uc new file mode 100644 index 0000000..d717ee8 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAW.uc @@ -0,0 +1,25 @@ +class NiceLAW extends NiceWeapon; +simulated function ZoomIn(bool bAnimateTransition){ + if(Level.TimeSeconds < FireMode[0].NextFireTime) return; + super.ZoomIn(bAnimateTransition); + if(bAnimateTransition){ if(bZoomOutInterrupted) PlayAnim('Raise',1.0,0.1); else PlayAnim('Raise',1.0,0.1); + } +} +simulated function ZoomOut(bool bAnimateTransition){ + super.ZoomOut(false); + if(bAnimateTransition) TweenAnim(IdleAnim,FastZoomOutTime); +} +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.07; + reloadDesc.trashStartFrame = 0.601; + reloadDesc.resumeFrame = 0.07; + reloadDesc.speedFrame = 0.07; + reloadDesc.animName = 'AimFire'; + autoReloadsDescriptions[0] = reloadDesc; + super.PostBeginPlay(); +} +defaultproperties +{ bChangeClipIcon=True bChangeBulletsIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Law_Rocket' hudBulletsTexture=Texture'KillingFloorHUD.HUD.Hud_Law_Rocket' reloadType=RTYPE_AUTO ForceZoomOutOnFireTime=0.100000 MagCapacity=1 ReloadRate=3.000000 bHoldToReload=True WeaponReloadAnim="Reload_LAW" MinimumFireRange=300 Weight=9.000000 bHasAimingMode=True IdleAimAnim="AimIdle" StandardDisplayFOV=75.000000 SleeveNum=3 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Law' bIsTier3Weapon=True MeshRef="KF_Weapons_Trip.LAW_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Supers.law_cmb" SkinRefs(1)="KF_Weapons_Trip_T.Supers.law_reddot_shdr" SkinRefs(2)="KF_Weapons_Trip_T.Supers.rocket_cmb" SelectSoundRef="KF_LAWSnd.LAW_Select" HudImageRef="KillingFloorHUD.WeaponSelect.LAW_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.LAW" PlayerIronSightFOV=90.000000 ZoomTime=0.260000 ZoomedDisplayFOV=65.000000 FireModeClass(0)=Class'NicePack.NiceLAWFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToRocketLauncher" bSniping=False Description="The Light Anti Tank Weapon is, as its name suggests, a military grade heavy weapons platform designed to disable or outright destroy armored vehicles." EffectOffset=(X=50.000000,Y=1.000000,Z=10.000000) DisplayFOV=75.000000 Priority=195 HudColor=(G=0) InventoryGroup=4 GroupOffset=9 PickupClass=Class'NicePack.NiceLAWPickup' PlayerViewOffset=(X=30.000000,Y=30.000000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceLAWAttachment' IconCoords=(X1=429,Y1=212,X2=508,Y2=251) ItemName="L.A.W" AmbientGlow=2 +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmo.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmo.uc new file mode 100644 index 0000000..d5aedc8 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmo.uc @@ -0,0 +1,5 @@ +class NiceLAWAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ AmmoPickupAmount=2 MaxAmmo=20 InitialAmount=5 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=458,Y1=34,X2=511,Y2=78) ItemName="L.A.W Rockets" +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmoPickup.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmoPickup.uc new file mode 100644 index 0000000..d0a8a10 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceLAWAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=2 InventoryType=Class'NicePack.NiceLAWAmmo' PickupMessage="HEAT Rockets" StaticMesh=StaticMesh'KillingFloorStatics.LAWAmmo' DrawScale=0.500000 CollisionRadius=40.000000 +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWAttachment.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAttachment.uc new file mode 100644 index 0000000..61f0e79 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAttachment.uc @@ -0,0 +1,4 @@ +class NiceLAWAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'KFMod.KFLawMuzzFlash' MovementAnims(0)="JogF_LAW" MovementAnims(1)="JogB_LAW" MovementAnims(2)="JogL_LAW" MovementAnims(3)="JogR_LAW" TurnLeftAnim="TurnL_LAW" TurnRightAnim="TurnR_LAW" CrouchAnims(0)="CHwalkF_LAW" CrouchAnims(1)="CHwalkB_LAW" CrouchAnims(2)="CHwalkL_LAW" CrouchAnims(3)="CHwalkR_LAW" WalkAnims(0)="WalkF_LAW" WalkAnims(1)="WalkB_LAW" WalkAnims(2)="WalkL_LAW" WalkAnims(3)="WalkR_LAW" CrouchTurnRightAnim="CH_TurnR_LAW" CrouchTurnLeftAnim="CH_TurnL_LAW" IdleCrouchAnim="CHIdle_LAW" IdleWeaponAnim="Idle_LAW" IdleRestAnim="Idle_LAW" IdleChatAnim="Idle_LAW" IdleHeavyAnim="Idle_LAW" IdleRifleAnim="Idle_LAW" FireAnims(0)="Fire_LAW" FireAnims(1)="Fire_LAW" FireAnims(2)="Fire_LAW" FireAnims(3)="Fire_LAW" FireAltAnims(0)="Fire_LAW" FireAltAnims(1)="Fire_LAW" FireAltAnims(2)="Fire_LAW" FireAltAnims(3)="Fire_LAW" FireCrouchAnims(0)="CHFire_LAW" FireCrouchAnims(1)="CHFire_LAW" FireCrouchAnims(2)="CHFire_LAW" FireCrouchAnims(3)="CHFire_LAW" FireCrouchAltAnims(0)="CHFire_LAW" FireCrouchAltAnims(1)="CHFire_LAW" FireCrouchAltAnims(2)="CHFire_LAW" FireCrouchAltAnims(3)="CHFire_LAW" HitAnims(0)="HitF_LAW" HitAnims(1)="HitB_LAW" HitAnims(2)="HitL_LAW" HitAnims(3)="HitR_LAW" PostFireBlendStandAnim="Blend_LAW" PostFireBlendCrouchAnim="CHBlend_LAW" MeshRef="KF_Weapons3rd_Trip.LAW_3rd" bHeavy=True +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWFire.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWFire.uc new file mode 100644 index 0000000..066da71 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWFire.uc @@ -0,0 +1,40 @@ +class NiceLAWFire extends NiceFire; +defaultproperties +{ + ProjSpawnOffset=(X=5.000000) + KickMomentum=(X=-45.000000,Z=25.000000) + ProjectileSpeed=7250.000000 + bulletClass=Class'NicePack.NiceRocket' + ExplosionDamageType=Class'NicePack.NiceDamTypeLAWExplosion' + ExplosionDamage=1200 + ExplosionRadius=400.000000 + explosionExponent=1.000000 + ExplosionMomentum=75000.000000 + explodeOnPawnHit=True + explodeOnWallHit=True + maxVerticalRecoilAngle=1000 + maxHorizontalRecoilAngle=250 + bRandomPitchFireSound=False + FireSoundRef="KF_LAWSnd.LAW_Fire" + StereoFireSoundRef="KF_LAWSnd.LAW_FireST" + NoAmmoSoundRef="KF_LAWSnd.LAW_DryFire" + DamageType=Class'NicePack.NiceDamTypeLAWBlunt' + DamageMax=750 + bSplashDamage=True + bRecommendSplashDamage=True + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireAnim="AimFire" + FireForce="redeemer_shoot" + FireRate=0.000000 + AmmoClass=Class'NicePack.NiceLAWAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) + ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) + ShakeRotTime=5.000000 + ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=3.000000 + BotRefireRate=3.250000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' + Spread=0.100000 +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWPickup.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWPickup.uc new file mode 100644 index 0000000..d82fbe7 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWPickup.uc @@ -0,0 +1,5 @@ +class NiceLAWPickup extends NiceWeaponPickup; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +defaultproperties +{ Weight=9.000000 cost=1250 AmmoCost=30 BuyClipSize=1 PowerValue=100 SpeedValue=20 RangeValue=64 Description="Light Anti Tank weapon. Designed to punch through armored vehicles." ItemName="L.A.W" ItemShortName="L.A.W" AmmoItemName="L.A.W Rockets" AmmoMesh=StaticMesh'KillingFloorStatics.LAWAmmo' CorrespondingPerkIndex=6 EquipmentCategoryID=3 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceLAW' RespawnTime=60.000000 PickupMessage="You got the L.A.W." PickupSound=Sound'KF_LAWSnd.LAW_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Super.LAW_Pickup' CollisionRadius=35.000000 CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Blunt.uc b/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Blunt.uc new file mode 100644 index 0000000..edc3abc --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Blunt.uc @@ -0,0 +1,4 @@ +class NiceDamTypeM32Blunt extends NiceDamTypeDemoBlunt; +defaultproperties +{ WeaponClass=Class'NicePack.NiceM32GrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Explosion.uc b/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Explosion.uc new file mode 100644 index 0000000..4ceab5d --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Explosion.uc @@ -0,0 +1,4 @@ +class NiceDamTypeM32Explosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ WeaponClass=Class'NicePack.NiceM32GrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32Ammo.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32Ammo.uc new file mode 100644 index 0000000..a30865e --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32Ammo.uc @@ -0,0 +1,4 @@ +class NiceM32Ammo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM32Pickup' AmmoPickupAmount=6 MaxAmmo=36 InitialAmount=9 PickupClass=Class'NicePack.NiceM32AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="M32 Grenades" +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32AmmoPickup.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32AmmoPickup.uc new file mode 100644 index 0000000..f2ede89 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM32AmmoPickup extends KFAmmoPickup; +defaultproperties +{ AmmoAmount=6 InventoryType=Class'NicePack.NiceM32Ammo' PickupMessage="M32 Grenades" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32Attachment.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32Attachment.uc new file mode 100644 index 0000000..59738a4 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32Attachment.uc @@ -0,0 +1,4 @@ +class NiceM32Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNadeL' MovementAnims(0)="JogF_M32_MGL" MovementAnims(1)="JogB_M32_MGL" MovementAnims(2)="JogL_M32_MGL" MovementAnims(3)="JogR_M32_MGL" TurnLeftAnim="TurnL_M32_MGL" TurnRightAnim="TurnR_M32_MGL" CrouchAnims(0)="CHWalkF_M32_MGL" CrouchAnims(1)="CHWalkB_M32_MGL" CrouchAnims(2)="CHWalkL_M32_MGL" CrouchAnims(3)="CHWalkR_M32_MGL" WalkAnims(0)="WalkF_M32_MGL" WalkAnims(1)="WalkB_M32_MGL" WalkAnims(2)="WalkL_M32_MGL" WalkAnims(3)="WalkR_M32_MGL" CrouchTurnRightAnim="CH_TurnR_M32_MGL" CrouchTurnLeftAnim="CH_TurnL_M32_MGL" IdleCrouchAnim="CHIdle_M32_MGL" IdleWeaponAnim="Idle_M32_MGL" IdleRestAnim="Idle_M32_MGL" IdleChatAnim="Idle_M32_MGL" IdleHeavyAnim="Idle_M32_MGL" IdleRifleAnim="Idle_M32_MGL" FireAnims(0)="Fire_M32_MGL" FireAnims(1)="Fire_M32_MGL" FireAnims(2)="Fire_M32_MGL" FireAnims(3)="Fire_M32_MGL" FireAltAnims(0)="Fire_M32_MGL" FireAltAnims(1)="Fire_M32_MGL" FireAltAnims(2)="Fire_M32_MGL" FireAltAnims(3)="Fire_M32_MGL" FireCrouchAnims(0)="CHFire_M32_MGL" FireCrouchAnims(1)="CHFire_M32_MGL" FireCrouchAnims(2)="CHFire_M32_MGL" FireCrouchAnims(3)="CHFire_M32_MGL" FireCrouchAltAnims(0)="CHFire_M32_MGL" FireCrouchAltAnims(1)="CHFire_M32_MGL" FireCrouchAltAnims(2)="CHFire_M32_MGL" FireCrouchAltAnims(3)="CHFire_M32_MGL" HitAnims(0)="HitF_M32_MGL" HitAnims(1)="HitB_M32_MGL" HitAnims(2)="HitL_M32_MGL" HitAnims(3)="HitR_M32_MGL" PostFireBlendStandAnim="Blend_M32_MGL" PostFireBlendCrouchAnim="CHBlend_M32_MGL" MeshRef="KF_Weapons3rd2_Trip.M32_MGL_3rd" +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32Fire.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32Fire.uc new file mode 100644 index 0000000..82f16c4 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32Fire.uc @@ -0,0 +1,35 @@ +class NiceM32Fire extends NiceFire; +defaultproperties +{ + ProjSpawnOffset=(X=5.000000) + EffectiveRange=2500.000000 + ProjectileSpeed=3800.000000 + bulletClass=Class'NicePack.NiceBallisticNade' + ExplosionDamageType=Class'NicePack.NiceDamTypeM32Explosion' + ExplosionDamage=360 + ExplosionRadius=400.000000 + explosionExponent=1.000000 + ExplosionMomentum=75000.000000 + explodeOnPawnHit=True + explodeOnWallHit=True + projAffectedByScream=True + FireAimedAnim="Iron_Fire" + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=50 + FireSoundRef="KF_M32Snd.M32_Fire" + StereoFireSoundRef="KF_M32Snd.M32_FireST" + NoAmmoSoundRef="KF_M79Snd.M79_DryFire" + DamageType=Class'NicePack.NiceDamTypeM32Blunt' + DamageMax=175 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireForce="AssaultRifleFire" + FireRate=0.330000 + AmmoClass=Class'NicePack.NiceM32Ammo' + ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) + BotRefireRate=1.800000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNadeL' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32GrenadeLauncher.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32GrenadeLauncher.uc new file mode 100644 index 0000000..db94773 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32GrenadeLauncher.uc @@ -0,0 +1,8 @@ +class NiceM32GrenadeLauncher extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 6 shells during 300 frames tops, with first shell loaded at frame 40, with 49 frames between load moments + generateReloadStages(6, 300, 40, 49); +} +defaultproperties +{ bChangeClipIcon=True bChangeBulletsIcon=True hudClipTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' hudBulletsTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' reloadType=RTYPE_SINGLE MagCapacity=6 ReloadRate=1.634000 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True WeaponReloadAnim="Reload_M32_MGL" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M32' bIsTier3Weapon=True MeshRef="KF_Weapons2_Trip.M32_MGL_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.M32_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_M79Snd.M79_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M32_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M32" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceM32Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="An advanced semi automatic grenade launcher. Launches high explosive grenades." DisplayFOV=65.000000 Priority=210 InventoryGroup=4 GroupOffset=6 PickupClass=Class'NicePack.NiceM32Pickup' PlayerViewOffset=(X=18.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM32Attachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="M32 Grenade Launcher" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32Pickup.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32Pickup.uc new file mode 100644 index 0000000..3ac7d90 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32Pickup.uc @@ -0,0 +1,5 @@ +class NiceM32Pickup extends NiceWeaponPickup; +defaultproperties +{ Weight=7.000000 AmmoCost=60 + cost=1000 BuyClipSize=6 PowerValue=85 SpeedValue=65 RangeValue=75 Description="An advanced semi automatic grenade launcher. Launches high explosive grenades." ItemName="M32 Grenade Launcher" ItemShortName="M32 Launcher" AmmoItemName="M32 Grenades" AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CorrespondingPerkIndex=6 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.CamoM32Pickup' MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceM32GrenadeLauncher' PickupMessage="You got the M32 Multiple Grenade Launcher." PickupSound=Sound'KF_M79Snd.M79_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.M32_MGL_Pickup' CollisionRadius=25.000000 CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Blunt.uc b/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Blunt.uc new file mode 100644 index 0000000..c2a3ce9 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Blunt.uc @@ -0,0 +1,4 @@ +class NiceDamTypeM79Blunt extends NiceDamTypeDemoBlunt; +defaultproperties +{ WeaponClass=Class'NicePack.NiceM79GrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Explosion.uc b/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Explosion.uc new file mode 100644 index 0000000..7e650fa --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Explosion.uc @@ -0,0 +1,4 @@ +class NiceDamTypeM79Explosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ WeaponClass=Class'NicePack.NiceM79GrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79Ammo.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79Ammo.uc new file mode 100644 index 0000000..0e9a942 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79Ammo.uc @@ -0,0 +1,4 @@ +class NiceM79Ammo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM79Pickup' AmmoPickupAmount=3 MaxAmmo=24 InitialAmount=6 PickupClass=Class'NicePack.NiceM79AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="M79 Incendiary Grenades" +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79AmmoPickup.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79AmmoPickup.uc new file mode 100644 index 0000000..1ee3c36 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM79AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=3 InventoryType=Class'NicePack.NiceM79Ammo' PickupMessage="M79 Incendiary Grenades" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79Attachment.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79Attachment.uc new file mode 100644 index 0000000..8b38369 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79Attachment.uc @@ -0,0 +1,4 @@ +class NiceM79Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNadeL' MovementAnims(0)="JogF_M79" MovementAnims(1)="JogB_M79" MovementAnims(2)="JogL_M79" MovementAnims(3)="JogR_M79" TurnLeftAnim="TurnL_M79" TurnRightAnim="TurnR_M79" CrouchAnims(0)="CHWalkF_M79" CrouchAnims(1)="CHWalkB_M79" CrouchAnims(2)="CHWalkL_M79" CrouchAnims(3)="CHWalkR_M79" WalkAnims(0)="WalkF_M79" WalkAnims(1)="WalkB_M79" WalkAnims(2)="WalkL_M79" WalkAnims(3)="WalkR_M79" CrouchTurnRightAnim="CH_TurnR_M79" CrouchTurnLeftAnim="CH_TurnL_M79" IdleCrouchAnim="CHIdle_M79" IdleWeaponAnim="Idle_M79" IdleRestAnim="Idle_M79" IdleChatAnim="Idle_M79" IdleHeavyAnim="Idle_M79" IdleRifleAnim="Idle_M79" FireAnims(0)="Fire_M79" FireAnims(1)="Fire_M79" FireAnims(2)="Fire_M79" FireAnims(3)="Fire_M79" FireAltAnims(0)="Fire_M79" FireAltAnims(1)="Fire_M79" FireAltAnims(2)="Fire_M79" FireAltAnims(3)="Fire_M79" FireCrouchAnims(0)="CHFire_M79" FireCrouchAnims(1)="CHFire_M79" FireCrouchAnims(2)="CHFire_M79" FireCrouchAnims(3)="CHFire_M79" FireCrouchAltAnims(0)="CHFire_M79" FireCrouchAltAnims(1)="CHFire_M79" FireCrouchAltAnims(2)="CHFire_M79" FireCrouchAltAnims(3)="CHFire_M79" HitAnims(0)="HitF_M79" HitAnims(1)="HitB_M79" HitAnims(2)="HitL_M79" HitAnims(3)="HitR_M79" PostFireBlendStandAnim="Blend_M79" PostFireBlendCrouchAnim="CHBlend_M79" MeshRef="KF_Weapons3rd2_Trip.M79_3rd" +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79Fire.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79Fire.uc new file mode 100644 index 0000000..f2403cf --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79Fire.uc @@ -0,0 +1,36 @@ +class NiceM79Fire extends NiceFire; +defaultproperties +{ + ProjSpawnOffset=(X=5.000000) + EffectiveRange=2500.000000 + ProjectileSpeed=3800.000000 + bulletClass=Class'NicePack.NiceBallisticNade' + ExplosionDamageType=Class'NicePack.NiceDamTypeM79Explosion' + ExplosionDamage=360 + ExplosionRadius=400.000000 + explosionExponent=1.000000 + ExplosionMomentum=75000.000000 + explodeOnPawnHit=True + explodeOnWallHit=True + projAffectedByScream=True + FireAimedAnim="Iron_Fire" + RecoilRate=0.100000 + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=50 + FireSoundRef="KF_M79Snd.M79_Fire" + StereoFireSoundRef="KF_M79Snd.M79_FireST" + NoAmmoSoundRef="KF_M79Snd.M79_DryFire" + DamageType=Class'NicePack.NiceDamTypeM79Blunt' + DamageMax=175 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireForce="AssaultRifleFire" + FireRate=0.000000 + AmmoClass=Class'NicePack.NiceM79Ammo' + ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) + BotRefireRate=1.800000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNadeL' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79GrenadeLauncher.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79GrenadeLauncher.uc new file mode 100644 index 0000000..d5121c5 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79GrenadeLauncher.uc @@ -0,0 +1,17 @@ +class NiceM79GrenadeLauncher extends NiceWeapon; +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.101; + reloadDesc.trashStartFrame = 0.65;//0.869; + reloadDesc.resumeFrame = 0.101; + reloadDesc.speedFrame = 0.101; + reloadDesc.animName = 'Fire'; + autoReloadsDescriptions[0] = reloadDesc; + reloadDesc.animName = 'Iron_Fire'; + autoReloadsDescriptions[1] = reloadDesc; + super.PostBeginPlay(); +} +defaultproperties +{ bChangeClipIcon=True bChangeBulletsIcon=True hudClipTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' hudBulletsTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' reloadType=RTYPE_AUTO ForceZoomOutOnFireTime=0.400000 MagCapacity=1 ReloadRate=0.010000 ReloadAnimRate=1.000000 bHoldToReload=True Weight=4.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M79' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.M79_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.M79_cmb" SelectSoundRef="KF_M79Snd.M79_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M79_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M79" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM79Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="A classic Vietnam era grenade launcher. Launches single high explosive grenades." DisplayFOV=65.000000 Priority=162 InventoryGroup=3 GroupOffset=11 PickupClass=Class'NicePack.NiceM79Pickup' PlayerViewOffset=(X=18.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM79Attachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="M79 Grenade Launcher" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79Pickup.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79Pickup.uc new file mode 100644 index 0000000..6b5a6cd --- /dev/null +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79Pickup.uc @@ -0,0 +1,4 @@ +class NiceM79Pickup extends NiceWeaponPickup; +defaultproperties +{ crossPerkIndecies(0)=10 Weight=4.000000 cost=250 AmmoCost=10 BuyClipSize=3 PowerValue=85 SpeedValue=5 RangeValue=75 Description="A classic Vietnam era grenade launcher. Launches single high explosive grenades." ItemName="M79 Grenade Launcher" ItemShortName="M79 Launcher" AmmoItemName="M79 Grenades" AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CorrespondingPerkIndex=6 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.GoldenM79Pickup' MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceM79GrenadeLauncher' PickupMessage="You got the M79 Grenade Launcher." PickupSound=Sound'KF_M79Snd.M79_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.M79_Pickup' CollisionRadius=25.000000 CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NiceDamTypePipeBomb.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NiceDamTypePipeBomb.uc new file mode 100644 index 0000000..9dcb6bf --- /dev/null +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NiceDamTypePipeBomb.uc @@ -0,0 +1,12 @@ +class NiceDamTypePipeBomb extends NiceWeaponDamageType; +static function GetHitEffects(out class HitEffects[4], int VictimHealth) +{ + HitEffects[0] = class'HitSmoke'; + if(VictimHealth <= 0) + HitEffects[1] = class'KFHitFlame'; + else if (FRand() < 0.8) + HitEffects[1] = class'KFHitFlame'; +} +defaultproperties +{ bIsExplosive=True bCheckForHeadShots=False WeaponClass=Class'NicePack.NicePipeBombExplosive' DeathString="%o filled %k's body with shrapnel." FemaleSuicide="%o blew up." MaleSuicide="%o blew up." bLocationalHit=False bThrowRagdoll=True bExtraMomentumZ=True DamageThreshold=1 DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=4000.000000 KDeathVel=300.000000 KDeathUpKick=800.000000 HumanObliterationThreshhold=600 +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombExplosive.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombExplosive.uc new file mode 100644 index 0000000..34fb69b --- /dev/null +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombExplosive.uc @@ -0,0 +1,4 @@ +class NicePipeBombExplosive extends ScrnPipeBombExplosive; +defaultproperties +{ FireModeClass(0)=Class'NicePack.NicePipeBombFire' PickupClass=Class'NicePack.NicePipeBombPickup' ItemName="PipeBomb NW" +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombFire.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombFire.uc new file mode 100644 index 0000000..f3854ba --- /dev/null +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombFire.uc @@ -0,0 +1,4 @@ +class NicePipeBombFire extends ScrnPipeBombFire; +defaultproperties +{ ProjectileClass=Class'NicePack.NicePipeBombProjectile' +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombPickup.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombPickup.uc new file mode 100644 index 0000000..c2741f6 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombPickup.uc @@ -0,0 +1,4 @@ +class NicePipeBombPickup extends ScrnPipeBombPickup; +defaultproperties +{ cost=100 AmmoCost=100 ItemName="Pipe Bomb NW" ItemShortName="Pipe Bomb NW" AmmoItemName="Pipe Bomb NW" InventoryType=Class'NicePack.NicePipeBombExplosive' +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombProjectile.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombProjectile.uc new file mode 100644 index 0000000..dd1a8e3 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombProjectile.uc @@ -0,0 +1,15 @@ +class NicePipeBombProjectile extends ScrnPipeBombProjectile; +function TakeDamage(int Damage, Pawn instigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex){ + local bool bIsFakePlayer; + if(KFMonster(instigatedBy) != none && KFMonster(instigatedBy).Health <= 0) return; + if(damageType == class'NiceDamTypePipeBomb' || Damage < 5 || (Damage < 25 && damageType.IsA('SirenScreamDamage'))) return; + bIsFakePlayer = (KFPawn(instigatedBy) != none || FakePlayerPawn(instigatedBy) != none) && (instigatedBy.PlayerReplicationInfo == none || instigatedBy.PlayerReplicationInfo.bOnlySpectator); + bIsFakePlayer = bIsFakePlayer || (instigatedBy == none && !DamageType.default.bCausedByWorld); + // Don't let our own explosives blow this up!!! + if(bIsFakePlayer || (KFPawn(instigatedBy) != none && Instigator != none && Instigator != instigatedBy)) return; + if(damageType == class'SirenScreamDamage') Disintegrate(HitLocation, vect(0,0,1)); + else Explode(HitLocation, vect(0,0,1)); +} +defaultproperties +{ Damage=2000.000000 MyDamageType=Class'NicePack.NiceDamTypePipeBomb' +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceBallisticHarpoon.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceBallisticHarpoon.uc new file mode 100644 index 0000000..3595079 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceBallisticHarpoon.uc @@ -0,0 +1,38 @@ +class NiceBallisticHarpoon extends NiceBullet; +// Have we added this harpoon to a stuck projectiles list? +var bool bAddedMyself; +/*simulated function Tick(float delta){ + local NiceSealSquealHarpoonBomber harpoonWeap; + if(bInitFinished && !bAddedMyself && bStuck && nicePlayer == localPlayer){ + bAddedMyself = true; + harpoonWeap = NiceSealSquealHarpoonBomber(sourceWeapon); + harpoonWeap.stuckProjectiles[harpoonWeap.stuckProjectiles.Length] = stuckID; + } + super.Tick(delta); +} +function KillBullet(){ + local int index; + local NiceSealSquealHarpoonBomber harpoonWeap; + if(bStuck && sourceWeapon != none){ + harpoonWeap = NiceSealSquealHarpoonBomber(sourceWeapon); + for(index = 0;index < harpoonWeap.stuckProjectiles.Length;index ++) + if(harpoonWeap.stuckProjectiles[index] == stuckID){ + NiceSealSquealHarpoonBomber(sourceWeapon).stuckProjectiles[index] = -1; + break; + } + } + super.KillBullet(); +}*/ +defaultproperties +{ + charMinExplosionDist=300.000000 + bDisableComplexMovement=False + movementFallTime=1.000000 + TrailClass=Class'KFMod.SealSquealFuseEmitter' + trailXClass=None + regularImpact=(noiseRef="KF_FY_SealSquealSND.WEP_Harpoon_Hit_Flesh") + explosionImpact=(bImportanEffect=True,decalClass=Class'KFMod.KFScorchMark',EmitterClass=Class'KFMod.KFNadeLExplosion',emitterShiftWall=20.000000,emitterShiftPawn=20.000000,noiseRef="KF_FY_SealSquealSND.WEP_Harpoon_Explode",noiseVolume=2.000000) + disintegrationImpact=(EmitterClass=Class'KFMod.SirenNadeDeflect',noiseRef="Inf_Weapons.faust_explode_distant02",noiseVolume=2.000000) + StaticMeshRef="KF_IJC_Halloween_Weps2.Harpoon_Projectile" + AmbientSoundRef="KF_IJC_HalloweenSnd.KF_FlarePistol_Projectile_Loop" +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealBlunt.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealBlunt.uc new file mode 100644 index 0000000..0f08ded --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealBlunt.uc @@ -0,0 +1,5 @@ +class NiceDamTypeSealSquealBlunt extends NiceDamTypeDemoBlunt + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceSealSquealHarpoonBomber' +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealExplosion.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealExplosion.uc new file mode 100644 index 0000000..a7f5e23 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealExplosion.uc @@ -0,0 +1,4 @@ +class NiceDamTypeSealSquealExplosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceSealSquealHarpoonBomber' +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmo.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmo.uc new file mode 100644 index 0000000..e95265a --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmo.uc @@ -0,0 +1,4 @@ +class NiceSealSquealAmmo extends NiceAmmo; +defaultproperties +{ AmmoPickupAmount=3 MaxAmmo=24 InitialAmount=6 PickupClass=Class'NicePack.NiceSealSquealAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="SealSqueal Harpoon Bombs" +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmoPickup.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmoPickup.uc new file mode 100644 index 0000000..17d93c8 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceSealSquealAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=3 InventoryType=Class'NicePack.NiceSealSquealAmmo' PickupMessage="SealSqueal Harpoon Bombs" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAttachment.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAttachment.uc new file mode 100644 index 0000000..ece4e8a --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAttachment.uc @@ -0,0 +1,4 @@ +class NiceSealSquealAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'KFMod.SealSquealMuzzleFlash3P' MovementAnims(0)="JogF_IJC_SealSqueal" MovementAnims(1)="JogB_IJC_SealSqueal" MovementAnims(2)="JogL_IJC_SealSqueal" MovementAnims(3)="JogR_IJC_SealSqueal" TurnLeftAnim="TurnL_IJC_SealSqueal" TurnRightAnim="TurnR_IJC_SealSqueal" CrouchAnims(0)="CHWalkF_IJC_SealSqueal" CrouchAnims(1)="CHWalkB_IJC_SealSqueal" CrouchAnims(2)="CHWalkL_IJC_SealSqueal" CrouchAnims(3)="CHWalkR_IJC_SealSqueal" WalkAnims(0)="WalkF_IJC_SealSqueal" WalkAnims(1)="WalkB_IJC_SealSqueal" WalkAnims(2)="WalkL_IJC_SealSqueal" WalkAnims(3)="WalkR_IJC_SealSqueal" CrouchTurnRightAnim="CH_TurnR_IJC_SealSqueal" CrouchTurnLeftAnim="CH_TurnL_IJC_SealSqueal" IdleCrouchAnim="CHIdle_IJC_SealSqueal" IdleWeaponAnim="Idle_IJC_SealSqueal" IdleRestAnim="Idle_IJC_SealSqueal" IdleChatAnim="Idle_IJC_SealSqueal" IdleHeavyAnim="Idle_IJC_SealSqueal" IdleRifleAnim="Idle_IJC_SealSqueal" FireAnims(0)="Fire_IJC_SealSqueal" FireAnims(1)="Fire_IJC_SealSqueal" FireAnims(2)="Fire_IJC_SealSqueal" FireAnims(3)="Fire_IJC_SealSqueal" FireAltAnims(0)="Fire_IJC_SealSqueal" FireAltAnims(1)="Fire_IJC_SealSqueal" FireAltAnims(2)="Fire_IJC_SealSqueal" FireAltAnims(3)="Fire_IJC_SealSqueal" FireCrouchAnims(0)="CHFire_IJC_SealSqueal" FireCrouchAnims(1)="CHFire_IJC_SealSqueal" FireCrouchAnims(2)="CHFire_IJC_SealSqueal" FireCrouchAnims(3)="CHFire_IJC_SealSqueal" FireCrouchAltAnims(0)="CHFire_IJC_SealSqueal" FireCrouchAltAnims(1)="CHFire_IJC_SealSqueal" FireCrouchAltAnims(2)="CHFire_IJC_SealSqueal" FireCrouchAltAnims(3)="CHFire_IJC_SealSqueal" HitAnims(0)="HitF_IJC_SealSqueal" HitAnims(1)="HitB_IJC_SealSqueal" HitAnims(2)="HitL_IJC_SealSqueal" HitAnims(3)="HitR_IJC_SealSqueal" PostFireBlendStandAnim="Blend_IJC_SealSqueal" PostFireBlendCrouchAnim="CHBlend_IJC_SealSqueal" MeshRef="KF_Weapons3rd3_IJC.SealSqueal_3rd" +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealFire.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealFire.uc new file mode 100644 index 0000000..bf0f7a3 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealFire.uc @@ -0,0 +1,38 @@ +class NiceSealSquealFire extends NiceFire; +defaultproperties +{ + ProjSpawnOffset=(X=5.000000) + EffectiveRange=2500.000000 + ProjectileSpeed=3000.000000 + bulletClass=Class'NicePack.NiceBallisticHarpoon' + ExplosionDamageType=Class'NicePack.NiceDamTypeSealSquealExplosion' + ExplosionDamage=480 + ExplosionRadius=200.000000 + explosionExponent=1.000000 + ExplosionMomentum=75000.000000 + fuseTime=15.000000 + explodeOnFuse=True + bShouldStick=True + FireAimedAnim="Iron_Fire" + maxVerticalRecoilAngle=1500 + maxHorizontalRecoilAngle=250 + FireSoundRef="KF_FY_SealSquealSND.WEP_Harpoon_Fire_M" + StereoFireSoundRef="KF_FY_SealSquealSND.WEP_Harpoon_Fire" + NoAmmoSoundRef="KF_M79Snd.M79_DryFire" + DamageType=Class'NicePack.NiceDamTypeSealSquealBlunt' + DamageMax=150 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireForce="AssaultRifleFire" + FireRate=0.750000 + AmmoClass=Class'NicePack.NiceSealSquealAmmo' + ShakeRotMag=(X=75.000000,Y=75.000000,Z=400.000000) + ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=10000.000000) + ShakeRotTime=3.500000 + ShakeOffsetMag=(X=6.000000,Y=1.000000,Z=8.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.500000 + BotRefireRate=1.800000 + FlashEmitterClass=Class'KFMod.SealSquealMuzzleFlash1P' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealHarpoonBomber.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealHarpoonBomber.uc new file mode 100644 index 0000000..42050cd --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealHarpoonBomber.uc @@ -0,0 +1,71 @@ +class NiceSealSquealHarpoonBomber extends NiceWeapon; +// Stuck projectiles, fired from this weapon +var array stuckProjectiles; +/*simulated function ExplodeAllHarpoons(){ + local int i; + for(i = 0;i < stuckProjectiles.Length;i ++){ + if(stuckProjectiles[i] < 0) + continue; + NicePlayerController(instigator.controller).ExplodeStuckBullet(stuckProjectiles[i]); + } + stuckProjectiles.Length = 0; +} +simulated function SetupReloadVars(optional bool bIsActive, optional int animationIndex){ + if(Role < ROLE_Authority) + ExplodeAllHarpoons(); + super.SetupReloadVars(bIsActive, animationIndex); +} +simulated function AltFire(float f){ + ExplodeAllHarpoons(); +} +simulated function Destroyed(){ + if(Role < ROLE_Authority) + ExplodeAllHarpoons(); + super.Destroyed(); +}*/ +defaultproperties +{ + reloadPreEndFrame=0.195000 + reloadEndFrame=0.537000 + reloadChargeEndFrame=0.861000 + reloadMagStartFrame=0.325000 + reloadChargeStartFrame=0.724000 + MagCapacity=3 + ReloadRate=4.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_IJC_SealSqueal" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=70.000000 + TraderInfoTexture=Texture'KF_IJC_HUD.Trader_Weapon_Icons.Trader_SealSqueal' + bIsTier2Weapon=True + MeshRef="KF_IJC_Halloween_Weps_2.SealSqueal" + SkinRefs(0)="KF_IJC_Halloween_Weapons2.SealSqueal.SealSqueal_cmb" + SelectSoundRef="KF_FY_SealSquealSND.WEP_Harpoon_Foley_Select" + HudImageRef="KF_IJC_HUD.WeaponSelect.SealSqueal_unselected" + SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.SealSqueal" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=60.000000 + FireModeClass(0)=Class'NicePack.NiceSealSquealFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="Shoot the zeds with this harpoon gun and watch them squeal.. and then explode!" + DisplayFOV=70.000000 + Priority=171 + InventoryGroup=4 + GroupOffset=22 + PickupClass=Class'NicePack.NiceSealSquealPickup' + PlayerViewOffset=(X=15.000000,Y=20.000000,Z=-8.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceSealSquealAttachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="SealSqueal Harpoon Bomber" + LightType=LT_None + LightBrightness=0.000000 + LightRadius=0.000000 +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealPickup.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealPickup.uc new file mode 100644 index 0000000..1c72cf7 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealPickup.uc @@ -0,0 +1,4 @@ +class NiceSealSquealPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=6.000000 cost=750 AmmoCost=30 BuyClipSize=3 PowerValue=90 SpeedValue=35 RangeValue=85 Description="Shoot the zeds with this harpoon gun and watch them squeal.. and then explode!" ItemName="SealSqueal Harpoon Bomber" ItemShortName="SealSqueal" AmmoItemName="SealSqueal Harpoon Bombs" CorrespondingPerkIndex=6 EquipmentCategoryID=2 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceSealSquealHarpoonBomber' PickupMessage="You got the SealSqueal Harpoon Bomb Launcher." PickupSound=Sound'KF_FY_SealSquealSND.foley.WEP_Harpoon_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_IJC_Halloween_Weps2.SealSqueal_Pickup' CollisionRadius=25.000000 CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmo.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmo.uc new file mode 100644 index 0000000..ff03c8a --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmo.uc @@ -0,0 +1,13 @@ +//============================================================================= +// SeekerSixAmmo +//============================================================================= +// Ammunition class for the SeekerSix mini rocket launcher +//============================================================================= +// Killing Floor Source +// Copyright (C) 2013 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class NiceSeekerSixAmmo extends SeekerSixAmmo; +defaultproperties +{ MaxAmmo=66 InitialAmount=30 PickupClass=Class'NicePack.NiceSeekerSixAmmoPickup' +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmoPickup.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmoPickup.uc new file mode 100644 index 0000000..a99a624 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceSeekerSixAmmoPickup extends SeekerSixAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceSeekerSixAmmo' +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixFire.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixFire.uc new file mode 100644 index 0000000..74b2686 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixFire.uc @@ -0,0 +1,13 @@ +//============================================================================= +// SeekerSixFire +//============================================================================= +// Primary fire class for the SeekerSix mini rocket launcher +//============================================================================= +// Killing Floor Source +// Copyright (C) 2013 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class NiceSeekerSixFire extends SeekerSixFire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceSeekerSixAmmo' ProjectileClass=Class'NicePack.NiceSeekerSixRocketProjectile' +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixMultiFire.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixMultiFire.uc new file mode 100644 index 0000000..0f39a84 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixMultiFire.uc @@ -0,0 +1,4 @@ +class NiceSeekerSixMultiFire extends SeekerSixMultiFire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceSeekerSixAmmo' ProjectileClass=Class'NicePack.NiceSeekerSixRocketProjectile' +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixPickup.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixPickup.uc new file mode 100644 index 0000000..4ebcac1 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixPickup.uc @@ -0,0 +1,4 @@ +class NiceSeekerSixPickup extends SeekerSixPickup; +defaultproperties +{ AmmoCost=20 ItemName="SeekerSix Rocket Launcher NW" ItemShortName="SeekerSix NW" InventoryType=Class'NicePack.NiceSeekerSixRocketLauncher' PickupMessage="You got the SeekerSix Mini Rocket Launcher NW." +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketLauncher.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketLauncher.uc new file mode 100644 index 0000000..44e0781 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketLauncher.uc @@ -0,0 +1,19 @@ +class NiceSeekerSixRocketLauncher extends SeekerSixRocketLauncher; +//============================================================================= +// Functions +//============================================================================= +function Projectile SpawnProjectile(Vector Start, Rotator Dir) +{ + local NiceSeekerSixRocketProjectile Rocket; + local NiceSeekerSixSeekingRocketProjectile SeekingRocket; + bBreakLock = true; + if (bLockedOn && SeekTarget != none) + { SeekingRocket = Spawn(class'NiceSeekerSixSeekingRocketProjectile',,, Start, Dir); SeekingRocket.Seeking = SeekTarget; return SeekingRocket; + } + else + { Rocket = Spawn(class'NiceSeekerSixRocketProjectile',,, Start, Dir); return Rocket; + } +} +defaultproperties +{ AppID=0 FireModeClass(0)=Class'NicePack.NiceSeekerSixFire' FireModeClass(1)=Class'NicePack.NiceSeekerSixMultiFire' PickupClass=Class'NicePack.NiceSeekerSixPickup' ItemName="SeekerSix Rocket Launcher NW" +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketProjectile.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketProjectile.uc new file mode 100644 index 0000000..c853736 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketProjectile.uc @@ -0,0 +1,4 @@ +class NiceSeekerSixRocketProjectile extends SeekerSixRocketProjectile; +defaultproperties +{ ImpactDamage=150 Damage=250.000000 +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixSeekingRocketProjectile.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixSeekingRocketProjectile.uc new file mode 100644 index 0000000..3db7342 --- /dev/null +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixSeekingRocketProjectile.uc @@ -0,0 +1,27 @@ +class NiceSeekerSixSeekingRocketProjectile extends NiceSeekerSixRocketProjectile; +var Actor Seeking; +var vector InitialDir; +replication +{ + reliable if( bNetInitial && (Role==ROLE_Authority) ) Seeking, InitialDir; +} +simulated function Timer() +{ + local vector ForceDir; + local float VelMag; + if ( InitialDir == vect(0,0,0) ) InitialDir = Normal(Velocity); + Acceleration = vect(0,0,0); + Super.Timer(); + if ( (Seeking != none) && (Seeking != Instigator) ) + { // Do normal guidance to target. ForceDir = Normal(Seeking.Location - Location); + if( (ForceDir Dot InitialDir) > 0 ) { VelMag = VSize(Velocity); // Increase the multiplier that is currently 0.8 to make the rocket track better if you need to ForceDir = Normal(ForceDir * 0.8 * VelMag + Velocity); Velocity = VelMag * ForceDir; Acceleration += 5 * ForceDir; } // Update rocket so it faces in the direction its going. SetRotation(rotator(Velocity)); + } +} +simulated function PostBeginPlay() +{ + Super.PostBeginPlay(); + SetTimer(0.1, true); +} +defaultproperties +{ +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1AR.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1AR.uc new file mode 100644 index 0000000..c1a93c5 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1AR.uc @@ -0,0 +1,13 @@ +class NiceAUG_A1AR extends NiceScopedWeapon; +#EXEC OBJ LOAD FILE=HMG_T.utx +#EXEC OBJ LOAD FILE=HMG_S.uax +#EXEC OBJ LOAD FILE=HMG_A.ukx +simulated function AltFire(float F){ + if(ReadyToFire(0)) DoToggle(); +} +exec function SwitchModes(){ + DoToggle(); +} +defaultproperties +{ lenseMaterialID=4 scopePortalFOVHigh=17.000000 scopePortalFOV=17.000000 ZoomMatRef="HMG_T.AUG.AUG-A1_scope_FB" ScriptedTextureFallbackRef="HMG_T.AUG.alpha_lens_64x64" CrosshairTexRef="HMG_T.AUG.AUG-A1_scope" reloadPreEndFrame=0.400000 reloadEndFrame=0.645000 reloadChargeEndFrame=0.805000 reloadMagStartFrame=0.500000 reloadChargeStartFrame=0.700000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=70.000000 MagCapacity=30 ReloadRate=3.500000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_BullPup" Weight=9.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'HMG_T.AUG.trader_AUG_A1' bIsTier2Weapon=True MeshRef="HMG_A.AUG_A1_mesh" SkinRefs(0)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" SkinRefs(1)="HMG_T.AUG.body" SkinRefs(2)="HMG_T.AUG.mag" SkinRefs(3)="HMG_T.AUG.Rec" SkinRefs(4)="HMG_T.AUG.alpha_lens_64x64" SelectSoundRef="HMG_S.AUGND.aug_draw" HudImageRef="HMG_T.AUG.AUG_A1_Unselected" SelectedHudImageRef="HMG_T.AUG.AUG_A1_Selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=70.000000 FireModeClass(0)=Class'NicePack.NiceAUG_A1ARFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="Steyr AUG 1977 Steyr-Daimler-Puch AG & Co KG" DisplayFOV=65.000000 Priority=170 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=3 PickupClass=Class'NicePack.NiceAUG_A1ARPickup' PlayerViewOffset=(X=15.000000,Y=12.000000,Z=-2.000000) BobDamping=5.000000 AttachmentClass=Class'NicePack.NiceAUG_A1ARAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="Steyr AUG A1" +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmo.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmo.uc new file mode 100644 index 0000000..a3d199d --- /dev/null +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmo.uc @@ -0,0 +1,4 @@ +class NiceAUG_A1ARAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceAUG_A1ARPickup' AmmoPickupAmount=30 MaxAmmo=240 InitialAmount=60 PickupClass=Class'NicePack.NiceAUG_A1ARAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="5.56mm NATO" +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmoPickup.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmoPickup.uc new file mode 100644 index 0000000..4b958e2 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceAUG_A1ARAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceAUG_A1ARAmmo' PickupMessage="5.56mm NATO" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAttachment.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAttachment.uc new file mode 100644 index 0000000..0093a6b --- /dev/null +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAttachment.uc @@ -0,0 +1,4 @@ +class NiceAUG_A1ARAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="HMG_A.AUG_A1_3rd" bHeavy=True bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.800000 +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARFire.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARFire.uc new file mode 100644 index 0000000..d02cd2e --- /dev/null +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARFire.uc @@ -0,0 +1,4 @@ +class NiceAUG_A1ARFire extends NiceHeavyFire; +defaultproperties +{ ProjectileSpeed=48500.000000 FireAimedAnim="Idle_Iron" RecoilRate=0.080000 maxVerticalRecoilAngle=500 maxHorizontalRecoilAngle=250 ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True FireSoundRef="HMG_S.AUGND.aug_fire" StereoFireSoundRef="HMG_S.AUGND.aug_fire" NoAmmoSoundRef="HMG_S.AUGND.aug_empty" DamageType=Class'NicePack.NiceDamTypeAUG_A1AR' DamageMin=105 DamageMax=105 Momentum=12000.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.200000 AmmoClass=Class'NicePack.NiceAUG_A1ARAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=0.500000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARPickup.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARPickup.uc new file mode 100644 index 0000000..7307039 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARPickup.uc @@ -0,0 +1,5 @@ +class NiceAUG_A1ARPickup extends NiceWeaponPickup; +defaultproperties +{ + cost=1000 Weight=9.000000 AmmoCost=80 BuyClipSize=25 PowerValue=45 SpeedValue=65 RangeValue=90 Description="Steyr AUG 1977 Steyr-Daimler-Puch AG & Co KG" ItemName="Steyr AUG A1" ItemShortName="AUG A1" AmmoItemName="Rounds 5.56mm NATO" CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceAUG_A1AR' PickupMessage="You picked up the Steyr AUG A1" PickupSound=Sound'HMG_S.AUG.aug_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.AUG_A1_st' CollisionRadius=30.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceDamTypeAUG_A1AR.uc b/sources/Weapons/Playable/Heavy/AUG/NiceDamTypeAUG_A1AR.uc new file mode 100644 index 0000000..3f65dc7 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/AUG/NiceDamTypeAUG_A1AR.uc @@ -0,0 +1,5 @@ +class NiceDamTypeAUG_A1AR extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ bodyDestructionMult=1.000000 HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceAUG_A1AR' DeathString="%k killed %o (Steyr AUG A1)." bRagdollBullet=True DamageThreshold=1 KDamageImpulse=5000.000000 KDeathVel=600.000000 KDeathUpKick=20.000000 +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGun.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGun.uc new file mode 100644 index 0000000..be675a0 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGun.uc @@ -0,0 +1,8 @@ +class NiceChainGun extends ChainGun; +// Don't use alt fire to toggle +simulated function AltFire(float F){} +// Don't switch fire mode +exec function SwitchModes(){} +defaultproperties +{ MagCapacity=160 Weight=12.000000 FireModeClass(0)=Class'NicePack.NiceChainGunFire' FireModeClass(1)=Class'NicePack.NiceChainGunAltFire' PickupClass=Class'NicePack.NiceChainGunPickup' ItemName="Patriarch's Chaingun" +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAltFire.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAltFire.uc new file mode 100644 index 0000000..0bc463c --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAltFire.uc @@ -0,0 +1,4 @@ +class NiceChainGunAltFire extends ChainGunAltFire; +defaultproperties +{ FireRate=1.500000 AmmoClass=Class'NicePack.NiceRocketAmmo' ProjectileClass=Class'NicePack.NiceRocketProj' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmo.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmo.uc new file mode 100644 index 0000000..af09a8f --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmo.uc @@ -0,0 +1,4 @@ +class NiceChainGunAmmo extends ChainGunAmmo; +defaultproperties +{ MaxAmmo=480 InitialAmount=120 PickupClass=Class'NicePack.NiceChainGunAmmoPickup' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmoPickup.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmoPickup.uc new file mode 100644 index 0000000..eb6372f --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceChainGunAmmoPickup extends ChainGunAmmoPickup; +defaultproperties +{ AmmoAmount=120 InventoryType=Class'NicePack.NiceChainGunAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunFire.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunFire.uc new file mode 100644 index 0000000..532e62a --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunFire.uc @@ -0,0 +1,4 @@ +class NiceChainGunFire extends ChainGunFire; +defaultproperties +{ maxVerticalRecoilAngle=68 maxHorizontalRecoilAngle=34 DamageType=Class'NicePack.NiceDamTypeCG' AmmoClass=Class'NicePack.NiceChainGunAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunPickup.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunPickup.uc new file mode 100644 index 0000000..917e098 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunPickup.uc @@ -0,0 +1,4 @@ +class NiceChainGunPickup extends ChainGunPickup; +defaultproperties +{ Weight=12.000000 cost=2500 AmmoCost=160 BuyClipSize=75 ItemName="Pat's Chaingun" ItemShortName="Chaingun" InventoryType=Class'NicePack.NiceChainGun' PickupMessage="You got the Patriarch's Chain Gun NW." +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeCG.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeCG.uc new file mode 100644 index 0000000..db1e4dd --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeCG.uc @@ -0,0 +1,5 @@ +class NiceDamTypeCG extends NiceDamTypeSPAM + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceChainGun' DeathString="%k killed %o (Pat's Chain Gun)." DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=14500.000000 KDeathVel=1500.000000 KDeathUpKick=200.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeRocket.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeRocket.uc new file mode 100644 index 0000000..556c4f6 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeRocket.uc @@ -0,0 +1,4 @@ +class NiceDamTypeRocket extends DamTypeLAW; +defaultproperties +{ WeaponClass=Class'NicePack.NiceChainGun' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocket.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocket.uc new file mode 100644 index 0000000..b858d46 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocket.uc @@ -0,0 +1,4 @@ +class NiceRocket extends NiceBullet; +defaultproperties +{ charMinExplosionDist=250.000000 bDisableComplexMovement=False movementAcceleration=(Z=-490.000000) movementFallTime=1.000000 TrailClass=Class'ROEffects.PanzerfaustTrail' trailXClass=None explosionImpact=(bImportanEffect=True,decalClass=Class'ROEffects.RocketMarkDirt',EmitterClass=Class'KFMod.LawExplosion',emitterShiftWall=20.000000,emitterShiftPawn=20.000000,noiseRef="KF_LAWSnd.Rocket_Explode",noiseVolume=2.000000) disintegrationImpact=(EmitterClass=Class'KFMod.SirenNadeDeflect',noiseRef="Inf_Weapons.faust_explode_distant02",noiseVolume=2.000000) StaticMeshRef="KillingFloorStatics.LAWRocket" DrawScale=0.700000 +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmo.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmo.uc new file mode 100644 index 0000000..ccb2fcd --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmo.uc @@ -0,0 +1,8 @@ +//============================================================================= +// LAW Ammo. +//============================================================================= +class NiceRocketammo extends Rocketammo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ MaxAmmo=16 PickupClass=Class'NicePack.NiceRocketAmmoPickup' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmoPickup.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmoPickup.uc new file mode 100644 index 0000000..67aaf57 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceRocketAmmoPickup extends RocketAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceRocketAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketProj.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketProj.uc new file mode 100644 index 0000000..01f3802 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketProj.uc @@ -0,0 +1,4 @@ +class NiceRocketProj extends NiceHRLProj; +defaultproperties +{ Damage=750.000000 MyDamageType=Class'NicePack.NiceDamTypeRocket' +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceDamTypeThompsonH.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceDamTypeThompsonH.uc new file mode 100644 index 0000000..688777c --- /dev/null +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceDamTypeThompsonH.uc @@ -0,0 +1,5 @@ +class NiceDamTypeThompsonH extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ HeadShotDamageMult=1.100000 WeaponClass=Class'NicePack.NiceThompsonH' DeathString="%k killed %o (Heavy Tommy Gun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=5500.000000 KDeathVel=100.000000 KDeathUpKick=15.000000 +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonH.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonH.uc new file mode 100644 index 0000000..f887797 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonH.uc @@ -0,0 +1,4 @@ +class NiceThompsonH extends NiceHeavyGun; +defaultproperties +{ reloadPreEndFrame=0.196000 reloadEndFrame=0.587000 reloadChargeEndFrame=0.783000 reloadMagStartFrame=0.380000 reloadChargeStartFrame=0.641000 MagazineBone="mag" MagCapacity=40 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'HMG_T.Thompson.Thompson_Trader' bIsTier2Weapon=True MeshRef="HMG_A.thompson_mesh" SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(1)="HMG_T.Thompson.Main" SkinRefs(2)="HMG_T.Thompson.stuff" SelectSoundRef="KF_IJC_HalloweenSnd.Thompson_Handling_Bolt_Back" HudImageRef="HMG_T.Thompson.Thompson_unselected" SelectedHudImageRef="HMG_T.Thompson.Thompson_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceThompsonHFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 Description="Alternative, heavier version of the Thompson gun. Uses different type of ammunition, the one more suited for straight-up destroying zed, rather than quickly dispatching them." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=95 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceThompsonHPickup' PlayerViewOffset=(X=4.000000,Y=5.000000,Z=-3.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceThompsonHAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Heavy Tommy Gun" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmo.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmo.uc new file mode 100644 index 0000000..657daa0 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmo.uc @@ -0,0 +1,5 @@ +class NiceThompsonHAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceThompsonHPickup' AmmoPickupAmount=60 MaxAmmo=360 InitialAmount=90 PickupClass=Class'NicePack.NiceThompsonHAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="45. ACP bullets" +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmoPickup.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmoPickup.uc new file mode 100644 index 0000000..538a68e --- /dev/null +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceThompsonHAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=60 InventoryType=Class'NicePack.NiceThompsonHAmmo' PickupMessage="Rounds 45. ACP" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAttachment.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAttachment.uc new file mode 100644 index 0000000..04d0e62 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAttachment.uc @@ -0,0 +1,4 @@ +class NiceThompsonHAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="HMG_A.thompson_3rd" bHeavy=True bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.800000 +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHFire.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHFire.uc new file mode 100644 index 0000000..3f876b3 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHFire.uc @@ -0,0 +1,4 @@ +class NiceThompsonHFire extends NiceHeavyFire; +defaultproperties +{ ProjectileSpeed=14250.000000 FireAimedAnim="Fire" RecoilRate=0.050000 maxVerticalRecoilAngle=400 maxHorizontalRecoilAngle=200 ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_M" StereoFireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeThompsonH' DamageMin=90 DamageMax=90 Momentum=7500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.400000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.079000 AmmoClass=Class'NicePack.NiceThompsonHAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHPickup.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHPickup.uc new file mode 100644 index 0000000..1f621ad --- /dev/null +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHPickup.uc @@ -0,0 +1,4 @@ +class NiceThompsonHPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=6.000000 cost=500 AmmoCost=30 BuyClipSize=40 PowerValue=30 SpeedValue=90 RangeValue=50 Description="Alternative, heavier version of the Thompson gun. Uses different type of ammunition, the one more suited for straight-up destroying zed, rather than quickly dispatching them." ItemName="Heavy Tommy Gun" ItemShortName="Heavy Tommy" AmmoItemName=".45 ACP" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceThompsonH' PickupMessage="You've got the Thompson Submachine Gun" PickupSound=Sound'KF_IJC_HalloweenSnd.Handling.Thompson_Handling_Bolt_Back' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.thompson_st' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceDamTypeM249SAW.uc b/sources/Weapons/Playable/Heavy/M249/NiceDamTypeM249SAW.uc new file mode 100644 index 0000000..1e85d60 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M249/NiceDamTypeM249SAW.uc @@ -0,0 +1,6 @@ +class NiceDamTypeM249SAW extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ bodyDestructionMult=1.000000 WeaponClass=Class'NicePack.NiceM249SAW' DeathString="%k killed %o (M249 SAW)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=12500.000000 KDeathVel=1200.000000 KDeathUpKick=125.000000 VehicleDamageScaling=0.700000 + flinchMultiplier=0.9 +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249Ammo.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249Ammo.uc new file mode 100644 index 0000000..d673b3e --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249Ammo.uc @@ -0,0 +1,5 @@ +class NiceM249Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM249Pickup' AmmoPickupAmount=80 MaxAmmo=240 InitialAmount=120 PickupClass=Class'NicePack.NiceM249AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Rounds 5.56x45mm NATO" +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249AmmoPickup.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249AmmoPickup.uc new file mode 100644 index 0000000..011fa5c --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM249AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=80 InventoryType=Class'NicePack.NiceM249Ammo' PickupMessage="Rounds 5.56x45mm NATO" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249Attachment.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249Attachment.uc new file mode 100644 index 0000000..1dbbe1f --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249Attachment.uc @@ -0,0 +1,4 @@ +class NiceM249Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="IS_Fire_AK47" FireAltAnims(1)="IS_Fire_AK47" FireAltAnims(2)="IS_Fire_AK47" FireAltAnims(3)="IS_Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="HMG_A.m249_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.700000 +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249Fire.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249Fire.uc new file mode 100644 index 0000000..1d7a35a --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249Fire.uc @@ -0,0 +1,4 @@ +class NiceM249Fire extends NiceHeavyFire; +defaultproperties +{ ProjectileSpeed=48250.000000 FireAimedAnim="Fire" RecoilRate=0.040000 maxVerticalRecoilAngle=550 maxHorizontalRecoilAngle=225 ShellEjectClass=Class'ROEffects.KFShellEjectAK' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="HMG_S.M249.m249_shoot_mono" StereoFireSoundRef="HMG_S.M249.m249_shoot_stereo" NoAmmoSoundRef="HMG_S.M249.m249_empty" DamageType=Class'NicePack.NiceDamTypeM249SAW' DamageMin=125 DamageMax=125 Momentum=12500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.400000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.084 AmmoClass=Class'NicePack.NiceM249Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249Pickup.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249Pickup.uc new file mode 100644 index 0000000..dde40d1 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249Pickup.uc @@ -0,0 +1,5 @@ +class NiceM249Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=7.000000 cost=1250 AmmoCost=250 BuyClipSize=80 PowerValue=62 SpeedValue=92 RangeValue=60 Description="The M249 SAW/LMG is the US produced version of the the Belgian-made FN Minimi. The M249 uses the 5.56x45mm NATO round, which lowers the weight of the gun when loaded yet grants the user with highly accurate yet reasonably powerful fire." ItemName="M249 SAW" ItemShortName="M249 SAW" AmmoItemName="5.56x45mm NATO" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceM249SAW' PickupMessage="You picked up the M249 SAW SE" PickupSound=Sound'HMG_S.M249.m249_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.M249_ST' CollisionRadius=25.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249SAW.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249SAW.uc new file mode 100644 index 0000000..e0570ce --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249SAW.uc @@ -0,0 +1,41 @@ +class NiceM249SAW extends NiceHeavyGun; +simulated function Notify_ShowBullets(){ + SetBoneScale (0, 1.0, 'Bullet01b'); + SetBoneScale (1, 1.0, 'Bullet02b'); + SetBoneScale (2, 1.0, 'Bullet03b'); + SetBoneScale (3, 1.0, 'Bullet04b'); + SetBoneScale (4, 1.0, 'Bullet05b'); + SetBoneScale (5, 1.0, 'Bullet06b'); + SetBoneScale (6, 1.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); +} +simulated function Notify_HideBullets(){ + if(MagAmmoRemaining == 0){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 0.0, 'Bullet07b'); SetBoneScale (7, 0.0, 'Bullet08b'); SetBoneScale (8, 0.0, 'Bullet09b'); SetBoneScale (9, 0.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 1){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 0.0, 'Bullet07b'); SetBoneScale (7, 0.0, 'Bullet08b'); SetBoneScale (8, 0.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 2){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 0.0, 'Bullet07b'); SetBoneScale (7, 0.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 3){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 0.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 4){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 5){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 6){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 7){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 1.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 8){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 1.0, 'Bullet03b'); SetBoneScale (3, 1.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 9){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 1.0, 'Bullet02b'); SetBoneScale (2, 1.0, 'Bullet03b'); SetBoneScale (3, 1.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } + else{ SetBoneScale (0, 1.0, 'Bullet01b'); SetBoneScale (1, 1.0, 'Bullet02b'); SetBoneScale (2, 1.0, 'Bullet03b'); SetBoneScale (3, 1.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); + } +} +defaultproperties +{ + Weight=7.000000 reloadPreEndFrame=0.140000 reloadEndFrame=0.693000 reloadChargeEndFrame=0.933000 reloadMagStartFrame=0.140000 reloadChargeStartFrame=0.813000 MagazineBone="clip" MagCapacity=80 ReloadRate=5.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'HMG_T.M249.m249_Trader' bIsTier3Weapon=True MeshRef="HMG_A.m249mesh" SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(1)="HMG_T.M249.v_m249" SkinRefs(2)="HMG_T.M249.v_m249_addons" SkinRefs(3)="HMG_T.M249.v_m249_box" SkinRefs(4)="HMG_T.M249.v_m249_bullets" SkinRefs(5)="HMG_T.M249.v_m249_front" SkinRefs(6)="HMG_T.M249.v_m249_heatshield" SkinRefs(7)="HMG_T.M249.v_m249_lid" SkinRefs(8)="HMG_T.M249.v_m249_receiver" SkinRefs(9)="HMG_T.M249.v_m249_sights" SkinRefs(10)="HMG_T.M249.v_m249_stock" SelectSoundRef="HMG_S.M249.m249_select" HudImageRef="HMG_T.M249.m249_Unselected" SelectedHudImageRef="HMG_T.M249.m249_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceM249Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectAnimRate=1.000000 SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The M249 SAW/LMG is the US produced version of the the Belgian-made FN Minimi. The M249 uses the 5.56x45mm NATO round, which lowers the weight of the gun when loaded yet grants the user with highly accurate yet reasonably powerful fire." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=150 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=7 PickupClass=Class'NicePack.NiceM249Pickup' PlayerViewOffset=(X=5.000000,Y=5.500000,Z=-3.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceM249Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M249 SAW" DrawScale=0.600000 TransientSoundVolume=1.250000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AAssaultRifle.uc b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AAssaultRifle.uc new file mode 100644 index 0000000..2b41f0d --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AAssaultRifle.uc @@ -0,0 +1,5 @@ +class NiceDamTypeM41AAssaultRifle extends NiceDamTypeSPAM + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceM41AAssaultRifle' DeathString="%k killed %o (Pulse Rifle)." DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=13500.000000 KDeathVel=1400.000000 KDeathUpKick=150.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41ABlunt.uc b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41ABlunt.uc new file mode 100644 index 0000000..c337dd6 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41ABlunt.uc @@ -0,0 +1,4 @@ +class NiceDamTypeM41ABlunt extends NiceDamageTypeVetEnforcerBullets; +defaultproperties +{ WeaponClass=Class'NicePack.NiceM41AAssaultRifle' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AExplosion.uc b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AExplosion.uc new file mode 100644 index 0000000..c90189f --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AExplosion.uc @@ -0,0 +1,4 @@ +class NiceDamTypeM41AExplosion extends NiceDamageTypeVetEnforcerBullets; +defaultproperties +{ bIsExplosive=True WeaponClass=Class'NicePack.NiceM41AAssaultRifle' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AGrenade.uc b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AGrenade.uc new file mode 100644 index 0000000..e7a597e --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AGrenade.uc @@ -0,0 +1,4 @@ +class NiceDamTypeM41AGrenade extends DamTypeM203Grenade; +defaultproperties +{ WeaponClass=Class'NicePack.NiceM41AAssaultRifle' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AALTFire.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AALTFire.uc new file mode 100644 index 0000000..ffeef22 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AALTFire.uc @@ -0,0 +1,4 @@ +class NiceM41AALTFire extends NiceFire; +defaultproperties +{ ProjSpawnOffset=(X=5.000000) EffectiveRange=2500.000000 ProjectileSpeed=3800.000000 bulletClass=Class'NicePack.NiceBallisticNade' ExplosionDamageType=Class'NicePack.NiceDamTypeM41AExplosion' ExplosionDamage=350 ExplosionRadius=400.000000 explosionExponent=1.000000 ExplosionMomentum=75000.000000 explodeOnPawnHit=True explodeOnWallHit=True projAffectedByScream=True FireAimedAnim="Iron_Fire" RecoilRate=0.100000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=50 FireSoundRef="KF_M79Snd.M79_Fire" StereoFireSoundRef="KF_M79Snd.M79_FireST" NoAmmoSoundRef="KF_M79Snd.M79_DryFire" DamageType=Class'NicePack.NiceDamTypeM41ABlunt' DamageMax=200 bWaitForRelease=True TransientSoundVolume=1.800000 FireAnim="AltFire" FireForce="AssaultRifleFire" FireRate=0.000000 AmmoClass=Class'NicePack.NiceM41AProjectileAmmo' ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) BotRefireRate=1.800000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNadeL' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmo.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmo.uc new file mode 100644 index 0000000..ba4fd13 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmo.uc @@ -0,0 +1,5 @@ +class NiceM41AAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM41APickup' AmmoPickupAmount=66 MaxAmmo=300 InitialAmount=75 PickupClass=Class'NicePack.NiceM41AAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M41A 10 mm caseless ammunition" +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmoPickup.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmoPickup.uc new file mode 100644 index 0000000..7d49b6a --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM41AAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=66 InventoryType=Class'NicePack.NiceM41AAmmo' PickupMessage="M41A 10 mm caseless ammunition" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AAssaultRifle.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAssaultRifle.uc new file mode 100644 index 0000000..29318dc --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAssaultRifle.uc @@ -0,0 +1,56 @@ +class NiceM41AAssaultRifle extends NiceWeapon; + +var string MyMessage; +var ScriptedTexture AmmoDigitsScriptedTexture; +var Font AmmoDigitsFont; +var color AmmoDigitsColor, LowAmmoDigitsColor; +var int OldAmmoAmount; +var float MyYaw; + +simulated function RenderOverlays( Canvas Canvas ){ + if(AmmoAmount(0) <= 0){ if(OldAmmoAmount != -5){ OldAmmoAmount = -5; AmmoDigitsColor.R = 218; AmmoDigitsColor.G = 18; AmmoDigitsColor.B = 18; MyMessage = "--"; ++ AmmoDigitsScriptedTexture.Revision; } + } + else if(bIsReloading){ if(OldAmmoAmount != -4){ OldAmmoAmount = -4; AmmoDigitsColor.R = 218; AmmoDigitsColor.G = 218; AmmoDigitsColor.B = 18; MyMessage = "RL"; ++ AmmoDigitsScriptedTexture.Revision; } + } + else if(OldAmmoAmount!=(MagAmmoRemaining + 1)){ OldAmmoAmount = MagAmmoRemaining+1; if(MagAmmoRemaining <= (MagCapacity>>2)) AmmoDigitsColor = LowAmmoDigitsColor; AmmoDigitsColor = default.AmmoDigitsColor; MyMessage = String(MagAmmoRemaining); ++ AmmoDigitsScriptedTexture.Revision; + } + AmmoDigitsScriptedTexture.Client = Self; + Super.RenderOverlays(Canvas); + default.PlayerViewPivot.Yaw = 0; + AmmoDigitsScriptedTexture.Client = None; +} + +simulated function RenderTexture(ScriptedTexture Tex){ + local int w, h; + Tex.TextSize( MyMessage, AmmoDigitsFont, w, h ); + Tex.DrawText( ( Tex.USize / 2 ) - ( w / 2.2 ), ( Tex.VSize / 2 ) - ( h / 2.0 ),MyMessage, AmmoDigitsFont, AmmoDigitsColor ); +} + +simulated function ZoomIn(bool bAnimateTransition){ + default.PlayerViewPivot.Yaw = 0; + PlayerViewPivot.Yaw = 0; + super.ZoomIn(bAnimateTransition); +} + +simulated function ZoomOut(bool bAnimateTransition){ + default.PlayerViewPivot.Yaw = MyYaw; + PlayerViewPivot.Yaw = MyYaw; + super.ZoomOut(bAnimateTransition); +} + +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.05; + reloadDesc.trashStartFrame = 0.183; + reloadDesc.resumeFrame = 0.06; + reloadDesc.speedFrame = 0.04; + reloadDesc.animName = 'AltFire'; + autoReloadsDescriptions[0] = reloadDesc; + super.PostBeginPlay(); +} + +defaultproperties +{ + Weight=7.000000 AmmoDigitsScriptedTexture=ScriptedTexture'HMG_T.M41A.AmmoText' AmmoDigitsFont=Font'BDFonts.DigitalMed' AmmoDigitsColor=(B=177,G=148,R=76,A=255) LowAmmoDigitsColor=(B=18,G=18,R=218,A=255) MyYaw=-648.000000 reloadPreEndFrame=0.198000 reloadEndFrame=0.716000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.247000 reloadChargeStartFrame=-1.000000 MagazineBone="mag" MagCapacity=66 ReloadRate=2.000000 bHasSecondaryAmmo=True bReduceMagAmmoOnSecondaryFire=False ReloadAnim="Reload" ReloadAnimRate=1.500000 WeaponReloadAnim="Reload_SCAR" bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'HMG_T.M41A.Trader_M41A' bIsTier3Weapon=True MeshRef="HMG_A.M41APulseRifle" SkinRefs(0)="HMG_T.M41A.M41A_cmb_final" SelectSoundRef="HMG_S.M41A.Select" HudImageRef="HMG_T.M41A.HUD.M41A_unselected" SelectedHudImageRef="HMG_T.M41A.HUD.M41A_selected" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM41AFire' FireModeClass(1)=Class'NicePack.NiceM41AALTFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 Description="M41A Pulse Rifle. Designed to kill Aliens. Looks especially cool in Sigourney Weaver's hands." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=160 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=7 PickupClass=Class'NicePack.NiceM41APickup' PlayerViewOffset=(X=25.000000,Y=24.000000,Z=8.000000) PlayerViewPivot=(Yaw=-648) BobDamping=6.000000 AttachmentClass=Class'ScrnHMG.M41AAttachmentBeta' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M41A Pulse Rifle" TransientSoundVolume=5.250000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AFire.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AFire.uc new file mode 100644 index 0000000..5b890df --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AFire.uc @@ -0,0 +1,4 @@ +class NiceM41AFire extends NiceFire; +defaultproperties +{ ProjectileSpeed=100000.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.050000 maxVerticalRecoilAngle=100 maxHorizontalRecoilAngle=50 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="Shell Feeder" FireSoundRef="HMG_S.M41A.M41AFireMono" StereoFireSoundRef="HMG_S.M41A.M41AFire" NoAmmoSoundRef="HMG_S.M41A.DryFire" DamageType=Class'NicePack.NiceDamTypeM41AAssaultRifle' DamageMin=75 DamageMax=75 Momentum=13500.000000 bPawnRapidFireAnim=True TransientSoundVolume=5.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.070000 AmmoClass=Class'NicePack.NiceM41AAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ScrnHMG.MuzzleFlashM41A' aimerror=42.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41APickup.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41APickup.uc new file mode 100644 index 0000000..d0f89c9 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41APickup.uc @@ -0,0 +1,5 @@ +// secondary pickup required for grenades +class NiceM41APickup extends NiceM41APrimaryPickup; +defaultproperties +{ crossPerkIndecies(0)=6 AmmoCost=60 BuyClipSize=1 SecondaryAmmoShortName="M41A Frag Grenades" PrimaryWeaponPickup=Class'NicePack.NiceM41APrimaryPickup' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41APrimaryPickup.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41APrimaryPickup.uc new file mode 100644 index 0000000..8a715e5 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41APrimaryPickup.uc @@ -0,0 +1,5 @@ +class NiceM41APrimaryPickup extends NiceWeaponPickup; +defaultproperties +{ cost=750 + Weight=7.000000 AmmoCost=66 BuyClipSize=66 PowerValue=70 SpeedValue=100 RangeValue=80 Description="M41A Pulse Rifle. Designed to kill Aliens. Looks especially cool in Sigourney Weaver's hands." ItemName="M41A Pulse Rifle" ItemShortName="Pulse Rifle" AmmoItemName="M41A 10 mm caseless ammunition" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceM41AAssaultRifle' PickupMessage="You got the M41A" PickupSound=Sound'HMG_S.M41A.Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.M41APickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmo.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmo.uc new file mode 100644 index 0000000..6189fe1 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmo.uc @@ -0,0 +1,4 @@ +class NiceM41AProjectileAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM41APickup' AmmoPickupAmount=1 MaxAmmo=8 InitialAmount=2 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=434,Y1=253,X2=506,Y2=292) ItemName="M41A Grenades" +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmoPickup.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmoPickup.uc new file mode 100644 index 0000000..fc879ea --- /dev/null +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM41AProjectileAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=2 InventoryType=Class'NicePack.NiceM41AProjectileAmmo' PickupMessage="M41A Grenades" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceDamTypeRPK47MG.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceDamTypeRPK47MG.uc new file mode 100644 index 0000000..ce8d937 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceDamTypeRPK47MG.uc @@ -0,0 +1,6 @@ +class NiceDamTypeRPK47MG extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceRPK47MachineGun' DeathString="%k killed %o (RPK47)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=6500.000000 KDeathVel=400.000000 KDeathUpKick=80.000000 + flinchMultiplier=0.75 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Ammo.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Ammo.uc new file mode 100644 index 0000000..ccbb841 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Ammo.uc @@ -0,0 +1,4 @@ +class NiceRPK47Ammo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceRPK47Pickup' AmmoPickupAmount=50 MaxAmmo=250 InitialAmount=50 PickupClass=Class'NicePack.NiceRPK47AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Rounds 7.62mm" +} diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47AmmoPickup.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47AmmoPickup.uc new file mode 100644 index 0000000..c3670b3 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceRPK47AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=50 InventoryType=Class'NicePack.NiceRPK47Ammo' PickupMessage="7.62mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Attachment.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Attachment.uc new file mode 100644 index 0000000..dfc1ac2 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Attachment.uc @@ -0,0 +1,4 @@ +class NiceRPK47Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="HMG_A.RPK47_3rd" bHeavy=True bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.750000 +} diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Fire.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Fire.uc new file mode 100644 index 0000000..658907f --- /dev/null +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Fire.uc @@ -0,0 +1,4 @@ +class NiceRPK47Fire extends NiceHeavyFire; +defaultproperties +{ ProjectileSpeed=37250.000000 contBonus=1.400000 FireAimedAnim="Fire_Iron" RecoilRate=0.050000 maxVerticalRecoilAngle=400 maxHorizontalRecoilAngle=200 ShellEjectClass=Class'ROEffects.KFShellEjectAK' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="HMG_S.RPK.rpk47_shoot" StereoFireSoundRef="HMG_S.RPK.rpk47_shoot" NoAmmoSoundRef="HMG_S.RPK.rpk47_empty" DamageType=Class'NicePack.NiceDamTypeRPK47MG' DamageMin=100 DamageMax=100 Momentum=10500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.300000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.109000 AmmoClass=Class'NicePack.NiceRPK47Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' aimerror=42.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47MachineGun.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47MachineGun.uc new file mode 100644 index 0000000..fd45c02 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47MachineGun.uc @@ -0,0 +1,5 @@ +class NiceRPK47MachineGun extends NiceHeavyGun; + +defaultproperties +{ reloadPreEndFrame=0.140000 reloadEndFrame=0.500000 reloadChargeEndFrame=0.710000 reloadMagStartFrame=0.280000 reloadChargeStartFrame=0.550000 MagazineBone="clip" MagCapacity=50 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'HMG_T.RPK.RPK47_Trader' bIsTier2Weapon=True MeshRef="HMG_A.RPK47_mesh" SkinRefs(0)="HMG_T.RPK.RPK_0" SkinRefs(1)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" SkinRefs(2)="HMG_T.RPK.RPK_1" SkinRefs(3)="HMG_T.RPK.RPK_2" SkinRefs(4)="HMG_T.RPK.RPK_3" SkinRefs(5)="HMG_T.RPK.RPK_4" SkinRefs(6)="HMG_T.RPK.RPK_5" SkinRefs(7)="HMG_T.RPK.RPK_6" SkinRefs(8)="HMG_T.RPK.RPK_7" SkinRefs(9)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="HMG_S.RPK.rpk47_select" HudImageRef="HMG_T.RPK.RPK47_Unselected" SelectedHudImageRef="HMG_T.RPK.RPK47_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceRPK47Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The RPK (Russian: Ruchnoy Pulemyot Kalashnikova, Kalashnikov hand-held machine gun) is a 7.62x39mm light machine gun of Soviet design, developed by Mikhail Kalashnikov in the late 1950s, parallel with the AKM assault rifle." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=125 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceRPK47Pickup' PlayerViewOffset=(X=8.000000,Y=8.000000,Z=-3.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceRPK47Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="RPK-47" TransientSoundVolume=1.250000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Pickup.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Pickup.uc new file mode 100644 index 0000000..33dd43c --- /dev/null +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Pickup.uc @@ -0,0 +1,6 @@ +class NiceRPK47Pickup extends NiceWeaponPickup; + +defaultproperties +{ + cost=250 Weight=8.000000 AmmoCost=45 BuyClipSize=30 PowerValue=49 SpeedValue=86 RangeValue=70 Description="The RPK (Russian: Ruchnoy Pulemyot Kalashnikova, Kalashnikov hand-held machine gun) is a 7.62x39mm light machine gun of Soviet design, developed by Mikhail Kalashnikov in the late 1950s, parallel with the AKM assault rifle." ItemName="RPK-47" ItemShortName="RPK-47" AmmoItemName="Rounds 7.62x39mm" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceRPK47MachineGun' PickupMessage="You picked up the RPK-47" PickupSound=Sound'HMG_S.RPK.rpk47_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.RPK47_st' CollisionRadius=25.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceDamTypeSA80LSW.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceDamTypeSA80LSW.uc new file mode 100644 index 0000000..a742a39 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceDamTypeSA80LSW.uc @@ -0,0 +1,5 @@ +class NiceDamTypeSA80LSW extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ goodDecapMod=0.750000 stunMultiplier=1.400000 HeadShotDamageMult=1.000000 WeaponClass=Class'NicePack.NiceSA80LSW' DeathString="%k killed %o (SA80 LSW)." bRagdollBullet=True DamageThreshold=1 KDamageImpulse=3000.000000 KDeathVel=300.000000 KDeathUpKick=40.000000 +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSW.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSW.uc new file mode 100644 index 0000000..cc1e208 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSW.uc @@ -0,0 +1,5 @@ +class NiceSA80LSW extends NiceScopedWeapon; +#exec OBJ LOAD FILE=ScopeShaders.utx +defaultproperties +{ lenseMaterialID=8 scopePortalFOVHigh=13.000000 scopePortalFOV=13.000000 tileSize=512 ZoomMatRef="HMG_T.SA80.SA80crosshairs_FB" ScriptedTextureFallbackRef="HMG_T.SA80.alpha_lens_64x64" CrosshairTexRef="HMG_T.SA80.SA80crosshairs" reloadPreEndFrame=0.131000 reloadEndFrame=0.570000 reloadChargeEndFrame=0.738000 reloadMagStartFrame=0.290000 reloadChargeStartFrame=0.664000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=50.000000 MagCapacity=30 ReloadRate=3.500000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_BullPup" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'HMG_T.SA80.SA80LSW_Trader' MeshRef="HMG_A.SA80LSW_mesh" SkinRefs(0)="HMG_T.SA80.SA80LSW_1" SkinRefs(1)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" SkinRefs(2)="HMG_T.SA80.SA80LSW_2" SkinRefs(3)="HMG_T.SA80.SA80LSW_3" SkinRefs(4)="HMG_T.SA80.SA80LSW_4" SkinRefs(5)="HMG_T.SA80.SA80LSW_5" SkinRefs(6)="HMG_T.SA80.SA80LSW_6" SkinRefs(7)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SkinRefs(8)="HMG_T.SA80.alpha_lens_64x64" SelectSoundRef="HMG_S.SA80.SA80LSW_select" HudImageRef="HMG_T.SA80.SA80LSW_Unselected" SelectedHudImageRef="HMG_T.SA80.SA80LSW_selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceSA80LSWFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="An odd member of a heavy machinegunner's arsenal, SA80 LSW was modified to have a stable aim and use ammunition that's good for both precise shots at vulnerable points and mangling whole zed's bodies." DisplayFOV=65.000000 Priority=100 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=3 PickupClass=Class'NicePack.NiceSA80LSWPickup' PlayerViewOffset=(X=20.000000,Y=10.000000,Z=-2.000000) BobDamping=5.000000 AttachmentClass=Class'NicePack.NiceSA80LSWAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="SA80 LSW" +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmo.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmo.uc new file mode 100644 index 0000000..aa19610 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmo.uc @@ -0,0 +1,4 @@ +class NiceSA80LSWAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceSA80LSWPickup' AmmoPickupAmount=30 MaxAmmo=360 InitialAmount=90 PickupClass=Class'NicePack.NiceSA80LSWAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="5.56x45" +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmoPickup.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmoPickup.uc new file mode 100644 index 0000000..5dac048 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceSA80LSWAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceSA80LSWAmmo' PickupMessage="5.56x45" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAttachment.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAttachment.uc new file mode 100644 index 0000000..c36b453 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAttachment.uc @@ -0,0 +1,4 @@ +class NiceSA80LSWAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="HMG_A.SA80LSW_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=1.100000 +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWFire.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWFire.uc new file mode 100644 index 0000000..4465c22 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWFire.uc @@ -0,0 +1,4 @@ +class NiceSA80LSWFire extends NiceHeavyFire; +defaultproperties +{ ProjectileSpeed=46500.000000 FireAimedAnim="Iron_Idle" RecoilRate=0.050000 maxVerticalRecoilAngle=300 maxHorizontalRecoilAngle=150 ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True FireSoundRef="HMG_S.SA80.SA80LSW_shot" StereoFireSoundRef="HMG_S.SA80.SA80LSW_shot" NoAmmoSoundRef="HMG_S.SA80.SA80LSW_empty" DamageType=Class'NicePack.NiceDamTypeSA80LSW' DamageMin=70 DamageMax=70 Momentum=12500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.400000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.200000 AmmoClass=Class'NicePack.NiceSA80LSWAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=0.500000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWPickup.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWPickup.uc new file mode 100644 index 0000000..3ea80b9 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWPickup.uc @@ -0,0 +1,5 @@ +class NiceSA80LSWPickup extends NiceWeaponPickup; +defaultproperties +{ + cost=200 Weight=5.000000 AmmoCost=30 BuyClipSize=30 PowerValue=41 SpeedValue=60 RangeValue=60 Description="An odd member of a heavy machinegunner's arsenal, SA80 LSW was modified to have a stable aim and use ammunition that's good for both precise shots at vulnerable points and mangling whole zed's bodies." ItemName="SA80 LSW" ItemShortName="SA80 LSW" AmmoItemName="Rounds 5.56x45" CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceSA80LSW' PickupMessage="You picked up the SA80 LSW" PickupSound=Sound'HMG_S.SA80.SA80LSW_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.SA80LSW_st' DrawScale=1.500000 CollisionRadius=30.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceDamTypeStinger.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceDamTypeStinger.uc new file mode 100644 index 0000000..804feae --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceDamTypeStinger.uc @@ -0,0 +1,5 @@ +class NiceDamTypeStinger extends NiceDamTypeSPAM + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceStinger' DeathString="%k killed %o (Stinger)." +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStinger.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStinger.uc new file mode 100644 index 0000000..6f1eed0 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStinger.uc @@ -0,0 +1,4 @@ +class NiceStinger extends Stinger; +defaultproperties +{ MagCapacity=160 Weight=8.000000 FireModeClass(0)=Class'NicePack.NiceStingerFire' FireModeClass(1)=Class'NicePack.NiceStingerAltFire' PickupClass=Class'NicePack.NiceStingerPickup' ItemName="Stinger Minigun" +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAltFire.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAltFire.uc new file mode 100644 index 0000000..20df584 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAltFire.uc @@ -0,0 +1,4 @@ +class NiceStingerAltFire extends StingerAltFire; +defaultproperties +{ DamageMin=120 DamageMax=120 AmmoClass=Class'NicePack.NiceStingerAmmo' AmmoPerFire=6 +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmo.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmo.uc new file mode 100644 index 0000000..cb4fab5 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmo.uc @@ -0,0 +1,5 @@ +class NiceStingerAmmo extends StingerAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ AmmoPickupAmount=80 MaxAmmo=640 InitialAmount=160 PickupClass=Class'NicePack.NiceStingerAmmoPickup' +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmoPickup.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmoPickup.uc new file mode 100644 index 0000000..0941af5 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceStingerAmmoPickup extends StingerAmmoPickup; +defaultproperties +{ AmmoAmount=80 InventoryType=Class'NicePack.NiceStingerAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerFire.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerFire.uc new file mode 100644 index 0000000..edec40a --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerFire.uc @@ -0,0 +1,4 @@ +class NiceStingerFire extends StingerFire; +defaultproperties +{ maxVerticalRecoilAngle=112 maxHorizontalRecoilAngle=56 DamageType=Class'NicePack.NiceDamTypeStinger' DamageMin=45 DamageMax=45 AmmoClass=Class'NicePack.NiceStingerAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerPickup.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerPickup.uc new file mode 100644 index 0000000..d4f2fa8 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerPickup.uc @@ -0,0 +1,4 @@ +class NiceStingerPickup extends StingerPickup; +defaultproperties +{ Weight=8.000000 cost=750 AmmoCost=150 BuyClipSize=80 ItemName="Stinger Minigun" ItemShortName="Stinger" InventoryType=Class'NicePack.NiceStinger' +} diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceDamTypeXMV850M.uc b/sources/Weapons/Playable/Heavy/XMV/NiceDamTypeXMV850M.uc new file mode 100644 index 0000000..4043cc7 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/XMV/NiceDamTypeXMV850M.uc @@ -0,0 +1,6 @@ +class NiceDamTypeXMV850M extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceXMV850M' DeathString="%k killed %o (XMV850 Minigun)." + //stunMultiplier=0.5 bRagdollBullet=True KDamageImpulse=51500.000000 KDeathVel=275.000000 KDeathUpKick=45.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Ammo.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Ammo.uc new file mode 100644 index 0000000..73230f0 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Ammo.uc @@ -0,0 +1,5 @@ +class NiceXMV850Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceXMV850Pickup' AmmoPickupAmount=80 MaxAmmo=480 InitialAmount=120 PickupClass=Class'NicePack.NiceXMV850AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="XMV850 bullets" +} diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850AmmoPickup.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850AmmoPickup.uc new file mode 100644 index 0000000..6ca8154 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceXMV850AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=80 InventoryType=Class'NicePack.NiceXMV850Ammo' PickupMessage="Rounds 7.62x51mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Attachment.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Attachment.uc new file mode 100644 index 0000000..6b3a7a6 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Attachment.uc @@ -0,0 +1,19 @@ +class NiceXMV850Attachment extends NiceAttachment; +var byte NetBarrelSpeed; +var int BarrelTurn; +var float BarrelSpeed; +replication +{ + reliable if(Role == ROLE_Authority) NetBarrelSpeed; +} +simulated event Tick(float dt){ + local Rotator bt; + super.Tick(dt); + if(Role == ROLE_Authority) NetBarrelSpeed = byte(BarrelSpeed * float(255)); + else BarrelSpeed = float(NetBarrelSpeed) / 255.00; + if(Level.NetMode != NM_DedicatedServer){ BarrelTurn += int(BarrelSpeed * float(655360) * dt); bt.Roll = BarrelTurn; SetBoneRotation('Barrels', bt); + } +} +defaultproperties +{ LaserAttachmentBone="Muzzle" mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="ejector" MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="HMG_A.XMV850_3rd" bHeavy=True bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Fire.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Fire.uc new file mode 100644 index 0000000..a8f87b1 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Fire.uc @@ -0,0 +1,15 @@ +class NiceXMV850Fire extends NiceHeavyFire; + +simulated function HandleRecoil(float Rec) +{ + local float truncatedContLenght; + local float recoilMod; + truncatedContLenght = FMin(currentContLenght, 20.0); + recoilMod = 1.0 - (truncatedContLenght / 20.0); + super.HandleRecoil(Rec * recoilMod); +} + +defaultproperties +{ ProjectileSpeed=42650.000000 maxBonusContLenght=5 + contBonusReset=false FireAimedAnim="FireLoop" RecoilRate=0.040000 maxVerticalRecoilAngle=450 maxHorizontalRecoilAngle=225 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="ejector" FireSoundRef="HMG_S.XMV.XMV-Fire-1" StereoFireSoundRef="HMG_S.XMV.XMV-Fire-1" NoAmmoSoundRef="HMG_S.M41A.DryFire" DamageType=Class'NicePack.NiceDamTypeXMV850M' DamageMin=30 DamageMax=30 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireAnim="FireLoop" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.065000 AmmoClass=Class'NicePack.NiceXMV850Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850M.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850M.uc new file mode 100644 index 0000000..19a8c9f --- /dev/null +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850M.uc @@ -0,0 +1,55 @@ +class NiceXMV850M extends NiceHeavyGun; +var float DesiredSpeed; +var float BarrelSpeed; +var int BarrelTurn; +var Sound BarrelSpinSound, BarrelStopSound, BarrelStartSound; +var String BarrelSpinSoundRef, BarrelStopSoundRef, BarrelStartSoundRef; +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ + local NiceXMV850M W; + super.PreloadAssets(Inv, bSkipRefCount); + if(default.BarrelSpinSound == none && default.BarrelSpinSoundRef != "") default.BarrelSpinSound = sound(DynamicLoadObject(default.BarrelSpinSoundRef, class'sound', true)); + if(default.BarrelStopSound == none && default.BarrelStopSoundRef != "") default.BarrelStopSound = sound(DynamicLoadObject(default.BarrelStopSoundRef, class'sound', true)); + if(default.BarrelStartSound == none && default.BarrelStartSoundRef != "") default.BarrelStartSound = sound(DynamicLoadObject(default.BarrelStartSoundRef, class'sound', true)); + W = NiceXMV850M(Inv); + if(W != none){ W.BarrelSpinSound = default.BarrelSpinSound; W.BarrelStopSound = default.BarrelStopSound; W.BarrelStartSound = default.BarrelStartSound; + } +} +static function bool UnloadAssets(){ + if(super.UnloadAssets()){ default.BarrelSpinSound = none; default.BarrelStopSound = none; default.BarrelStartSound = none; + } + return true; +} +// XMV uses custom hands +simulated function HandleSleeveSwapping(){} +simulated event WeaponTick(float dt){ + local Rotator bt; + super.WeaponTick(dt); + bt.Roll = BarrelTurn; + SetBoneRotation('Barrels', bt); + DesiredSpeed = 0.50; +} +simulated event Tick(float dt){ + local float OldBarrelTurn; + super.Tick(dt); + if(FireMode[0].IsFiring()){ BarrelSpeed = BarrelSpeed + FClamp(DesiredSpeed - BarrelSpeed, -0.20 * dt, 0.40 * dt); BarrelTurn += int(BarrelSpeed * float(655360) * dt); + } + else{ if(BarrelSpeed > 0){ BarrelSpeed = FMax(BarrelSpeed - 0.10 * dt, 0.01); OldBarrelTurn = float(BarrelTurn); BarrelTurn += int(BarrelSpeed * float(655360) * dt); if(BarrelSpeed <= 0.03 && (int(OldBarrelTurn / 10922.67) < int(float(BarrelTurn) / 10922.67))){ BarrelTurn = int(float(int(float(BarrelTurn) / 10922.67)) * 10922.67); BarrelSpeed = 0.00; PlaySound(BarrelStopSound, SLOT_none, 0.50,, 32.00, 1.00, true); AmbientSound = none; } } + } + if(BarrelSpeed > 0){ AmbientSound = BarrelSpinSound; SoundPitch = byte(float(32) + float(96) * BarrelSpeed); + } + + if(NiceXMV850Attachment(ThirdPersonActor) != none) NiceXMV850Attachment(ThirdPersonActor).BarrelSpeed = BarrelSpeed; +} +simulated function AltFire(float F){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) LaserType = 3; + else LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ BarrelSpinSoundRef="HMG_S.XMV.XMV-BarrelSpinLoop" BarrelStopSoundRef="HMG_S.XMV.XMV-BarrelSpinEnd" BarrelStartSoundRef="HMG_S.XMV.XMV-BarrelSpinStart" LaserAttachmentOffset=(X=120.000000,Z=-10.000000) LaserAttachmentBone="Muzzle" reloadPreEndFrame=0.201000 reloadEndFrame=0.729000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.340000 reloadChargeStartFrame=-1.000000 MagazineBone="BeltBone1" MagCapacity=160 ReloadRate=4.400000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload" Weight=7.000000 StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'HMG_T.XMV.Trader_XMV850' MeshRef="HMG_A.XMV850Mesh" SkinRefs(0)="HMG_T.XMV.XMV850_Main" SkinRefs(1)="HMG_T.XMV.Hands_Shdr" SkinRefs(2)="HMG_T.XMV.XMV850_Barrels_Shdr" SelectSoundRef="HMG_S.XMV.XMV-Pullout" HudImageRef="HMG_T.XMV.XMV850_Unselected" SelectedHudImageRef="HMG_T.XMV.XMV850_Selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=20.000000 FireModeClass(0)=Class'NicePack.NiceXMV850Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="Putaway" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="Minigun with reduced fire rate down to 950RPM. But still badass and has laser sight." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=135 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceXMV850Pickup' PlayerViewOffset=(X=30.000000,Y=20.000000,Z=-10.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceXMV850Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="XMV850 Minigun" TransientSoundVolume=0.625000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Pickup.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Pickup.uc new file mode 100644 index 0000000..08ec2b5 --- /dev/null +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Pickup.uc @@ -0,0 +1,9 @@ +class NiceXMV850Pickup extends NiceWeaponPickup; + +#EXEC OBJ LOAD FILE=HMG_T.utx +#EXEC OBJ LOAD FILE=HMG_S.uax +#EXEC OBJ LOAD FILE=HMG_A.ukx + +defaultproperties +{ Weight=7.000000 cost=1000 AmmoCost=100 BuyClipSize=80 PowerValue=40 SpeedValue=100 RangeValue=50 Description="Minigun with reduced fire rate down to 950RPM. But still badass and has laser sight." ItemName="XMV850 Minigun" ItemShortName="XMV850 Minigun" AmmoItemName="7.62x51mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceXMV850M' PickupMessage="You got the XMV850 Minigun." PickupSound=Sound'HMG_S.XMV.XMV-Pullout' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.XMV850Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceDamTypeFT.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceDamTypeFT.uc new file mode 100644 index 0000000..c7f0641 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceDamTypeFT.uc @@ -0,0 +1,5 @@ +class NiceDamTypeFT extends NiceDamTypeFire + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceFlameThrower' DeathString="%k incinerated %o (Flamethrower)." +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameAmmo.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameAmmo.uc new file mode 100644 index 0000000..93accc4 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameAmmo.uc @@ -0,0 +1,4 @@ +class NiceFlameAmmo extends ScrnFlameAmmo; +defaultproperties +{ AmmoPickupAmount=30 MaxAmmo=200 InitialAmount=60 +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameBurstFire.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameBurstFire.uc new file mode 100644 index 0000000..22a3bed --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameBurstFire.uc @@ -0,0 +1,6 @@ +// +//============================================================================= +class NiceFlameBurstFire extends ScrnFlameBurstFire ; +defaultproperties +{ AmmoClass=Class'NicePack.NiceFlameAmmo' ProjectileClass=Class'NicePack.NiceFlameTendril' +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameNade.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameNade.uc new file mode 100644 index 0000000..cf56f5b --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameNade.uc @@ -0,0 +1,48 @@ +class NiceFlameNade extends NiceNade; +#exec OBJ LOAD FILE=KF_GrenadeSnd.uax +simulated function HurtRadius(float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation){ + local actor Victims; + local float damageScale, dist; + local vector dirs; + local int NumKilled; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + if(bHurtEntry) return; + bHurtEntry = true; + foreach CollidingActors(class 'Actor', Victims, DamageRadius, HitLocation){ // null pawn variables here just to be sure they didn't left from previous iteration // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! P = none; KFMonsterVictim = none; KFP = none; // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if((Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims) == none ){ dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if(Instigator == none || Instigator.Controller == none) Victims.SetDelayedDamageInstigatorController(InstigatorController); if(Victims == LastTouched) LastTouched = none; + P = Pawn(Victims); + if(P != none){ for(i = 0; i < CheckedPawns.Length; i++){ if(CheckedPawns[i] == P){ bAlreadyChecked = true; break; } } + if(bAlreadyChecked){ bAlreadyChecked = false; P = none; continue; } + KFMonsterVictim = KFMonster(Victims); + if(KFMonsterVictim != none && KFMonsterVictim.Health <= 0) KFMonsterVictim = none; + KFP = KFPawn(Victims); + if(KFMonsterVictim != none ) damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); else if(KFP != none) damageScale *= KFP.GetExposureTo(HitLocation); + CheckedPawns[CheckedPawns.Length] = P; + if(damageScale <= 0){ P = none; continue; } else P = none; } + if(KFP != none || KFMonsterVictim != none || Nade(Victims) != none) Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); + if(Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0) NumKilled++; } + } + if(Role == ROLE_Authority){ if(NumKilled >= 4) KFGameType(Level.Game).DramaticEvent(0.05); else if(NumKilled >= 2) KFGameType(Level.Game).DramaticEvent(0.03); + } + bHurtEntry = false; +} +simulated function Explode(vector HitLocation, vector HitNormal){ + local PlayerController LocalPlayer; + bHasExploded = True; + BlowUp(HitLocation); + // Incendiary Effects.. + PlaySound(sound'KF_GrenadeSnd.FlameNade_Explode',, 100.5 * TransientSoundVolume); + if(EffectIsRelevant(Location, false)){ Spawn(Class'KFIncendiaryExplosion',,, HitLocation, rotator(vect(0,0,1))); Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); + } + // Shake nearby players screens + LocalPlayer = Level.GetLocalPlayerController(); + if((LocalPlayer != none) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5))) LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); + Destroy(); +} +defaultproperties +{ AvoidMarkerClass=Class'NicePack.NiceAvoidMarkerFlame' MyDamageType=Class'NicePack.NiceDamTypeFlameNade' +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameTendril.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameTendril.uc new file mode 100644 index 0000000..5acc7a9 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameTendril.uc @@ -0,0 +1,28 @@ +//============================================================================= +// Flame +//============================================================================= +class NiceFlameTendril extends ScrnFlameTendril; +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dir; + local KFMonster KFMonsterVictim; + + if ( bHurtEntry ) return; + bHurtEntry = true; + foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation ) + { KFMonsterVictim = none; //tbs // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') ) { dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = none; KFMonsterVictim = KFMonster(Victims); + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + } + /* + if ( (LastTouched != none) && (LastTouched != self) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) + { Victims = LastTouched; LastTouched = none; dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController(InstigatorController); Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + */ + bHurtEntry = false; +} +defaultproperties +{ Damage=16.000000 MyDamageType=Class'NicePack.NiceDamTypeFT' +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrower.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrower.uc new file mode 100644 index 0000000..9a293ab --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrower.uc @@ -0,0 +1,41 @@ +//============================================================================= +// FlameChucker +//============================================================================= +class NiceFlameThrower extends ScrnFlameThrower; +var bool bFiring; +simulated function bool StartFire(int Mode) +{ + if(MagAmmoRemaining >= 1 && FireMode[Mode].AllowFire()) + bFiring = true; + return Super.StartFire(Mode); +} +simulated event StopFire(int Mode) +{ + if(MagAmmoRemaining < 1 || Mode != 0){ + bFiring = false; + Super.StopFire(0); + } +} +simulated function bool PutDown() +{ + if ( bFiring && Instigator != none && Instigator.PendingWeapon != none && AmmoAmount(0) > 0 ) { Instigator.PendingWeapon = none; return false; + } + return Super.PutDown(); +} +function bool AllowReload() +{ + if ( bFiring ) return false; return Super.AllowReload(); +} +simulated function WeaponTick(float dt) +{ + if(MagAmmoRemaining < 1 && bFiring) + StartFire(0); + Super.WeaponTick(dt); +// if(FireMode[0].bIsFiring) +// Skins[4] = Shader 'KillingFloorWeapons.FlameThrower.FTFireShader'; +// else +// Skins[4] = default.Skins[4]; +} +defaultproperties +{ MagCapacity=30 Weight=8.000000 bModeZeroCanDryFire=False FireModeClass(0)=Class'NicePack.NiceFlameBurstFire' PickupClass=Class'NicePack.NiceFlameThrowerPickup' ItemName="FlameThrower NW" +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrowerPickup.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrowerPickup.uc new file mode 100644 index 0000000..52e6e1d --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrowerPickup.uc @@ -0,0 +1,7 @@ +//============================================================================= +// L85 Pickup. +//============================================================================= +class NiceFlameThrowerPickup extends ScrnFlameThrowerPickup; +defaultproperties +{ ItemName="FlameThrower NW" ItemShortName="Flamer NW" InventoryType=Class'NicePack.NiceFlameThrower' PickupMessage="You got the Flamethrower NW." +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileFire.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileFire.uc new file mode 100644 index 0000000..4be3466 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileFire.uc @@ -0,0 +1,4 @@ +class NiceDamTypeFlareProjectileFire extends NiceDamTypeFire; +defaultproperties +{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceFlareRevolver' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileImpact.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileImpact.uc new file mode 100644 index 0000000..787ce71 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileImpact.uc @@ -0,0 +1,4 @@ +class NiceDamTypeFlareProjectileImpact extends ScrnDamTypeFlareProjectileImpact; +defaultproperties +{ +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolver.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolver.uc new file mode 100644 index 0000000..332c97a --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolver.uc @@ -0,0 +1,42 @@ +class NiceDualFlareRevolver extends ScrnDualFlareRevolver; +function bool HandlePickupQuery( pickup Item ) +{ + if ( Item.InventoryType==Class'NicePack.NiceFlareRevolver' ) + { if( LastHasGunMsgTime < Level.TimeSeconds && PlayerController(Instigator.Controller) != none ) { LastHasGunMsgTime = Level.TimeSeconds + 0.5; PlayerController(Instigator.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 1); } + return True; + } + return Super.HandlePickupQuery(Item); +} +function DropFrom(vector StartLocation) +{ + local int m; + local KFWeaponPickup Pickup; + local int AmmoThrown, OtherAmmo; + local KFWeapon SinglePistol; + if( !bCanThrow ) return; + AmmoThrown = AmmoAmount(0); + ClientWeaponThrown(); + for (m = 0; m < NUM_FIRE_MODES; m++) + { if (FireMode[m].bIsFiring) StopFire(m); + } + if ( Instigator != none ) DetachFromPawn(Instigator); + if( Instigator.Health > 0 ) + { OtherAmmo = AmmoThrown / 2; AmmoThrown -= OtherAmmo; SinglePistol = Spawn(Class'NicePack.NiceFlareRevolver'); SinglePistol.SellValue = SellValue / 2; SinglePistol.GiveTo(Instigator); SinglePistol.Ammo[0].AmmoAmount = OtherAmmo; SinglePistol.MagAmmoRemaining = MagAmmoRemaining / 2; MagAmmoRemaining = Max(MagAmmoRemaining-SinglePistol.MagAmmoRemaining,0); + } + Pickup = Spawn(class'NicePack.NiceFlareRevolverPickup',,, StartLocation); + if ( Pickup != none ) + { Pickup.InitDroppedPickupFor(self); Pickup.DroppedBy = PlayerController(Instigator.Controller); Pickup.Velocity = Velocity; //fixing dropping exploit Pickup.SellValue = SellValue / 2; Pickup.Cost = Pickup.SellValue / 0.75; Pickup.AmmoAmount[0] = AmmoThrown; Pickup.MagAmmoRemaining = MagAmmoRemaining; if (Instigator.Health > 0) Pickup.bThrown = true; + } + Destroyed(); + Destroy(); +} +simulated function bool PutDown() +{ + if ( Instigator.PendingWeapon == none || Instigator.PendingWeapon.class == class'NicePack.NiceFlareRevolver' ) + { bIsReloading = false; + } + return super.PutDown(); +} +defaultproperties +{ AppID=0 FireModeClass(0)=Class'NicePack.NiceDualFlareRevolverFire' DemoReplacement=Class'NicePack.NiceFlareRevolver' PickupClass=Class'NicePack.NiceDualFlareRevolverPickup' ItemName="Dual Flare revolvers NW" +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmo.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmo.uc new file mode 100644 index 0000000..55147e2 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmo.uc @@ -0,0 +1,4 @@ +class NiceDualFlareRevolverAmmo extends ScrnDualFlareRevolverAmmo; +defaultproperties +{ PickupClass=Class'NicePack.NiceDualFlareRevolverAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmoPickup.uc new file mode 100644 index 0000000..5f66301 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDualFlareRevolverAmmoPickup extends ScrnDualFlareRevolverAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceDualFlareRevolverAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverFire.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverFire.uc new file mode 100644 index 0000000..4e77c66 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverFire.uc @@ -0,0 +1,4 @@ +class NiceDualFlareRevolverFire extends ScrnDualFlareRevolverFire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceDualFlareRevolverAmmo' ProjectileClass=Class'NicePack.NiceFlareRevolverProjectile' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverPickup.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverPickup.uc new file mode 100644 index 0000000..9eddb6c --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverPickup.uc @@ -0,0 +1,4 @@ +class NiceDualFlareRevolverPickup extends ScrnDualFlareRevolverPickup; +defaultproperties +{ ItemName="Dual Flare Revolvers NW" ItemShortName="Dual Flare Rev. NW" InventoryType=Class'NicePack.NiceDualFlareRevolver' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolver.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolver.uc new file mode 100644 index 0000000..fc3de4f --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolver.uc @@ -0,0 +1,23 @@ +class NiceFlareRevolver extends ScrnFlareRevolver; +simulated function bool PutDown() +{ + if ( Instigator.PendingWeapon.class == class'NicePack.NiceDualFlareRevolver' ) + { bIsReloading = false; + } + return super(KFWeapon).PutDown(); +} + +function GiveTo( pawn Other, optional Pickup Pickup ) +{ + local KFPlayerReplicationInfo KFPRI; + local KFWeaponPickup WeapPickup; + KFPRI = KFPlayerReplicationInfo(Other.PlayerReplicationInfo); + WeapPickup = KFWeaponPickup(Pickup); + //pick the lowest sell value + if ( WeapPickup != none && KFPRI != none && KFPRI.ClientVeteranSkill != none ) { SellValue = 0.75 * min(WeapPickup.Cost, WeapPickup.default.Cost * KFPRI.ClientVeteranSkill.static.GetCostScaling(KFPRI, WeapPickup.class)); + } + Super.GiveTo(Other,Pickup); +} +defaultproperties +{ AppID=0 FireModeClass(0)=Class'NicePack.NiceFlareRevolverFire' PickupClass=Class'NicePack.NiceFlareRevolverPickup' ItemName="Flare Revolver NW" +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmo.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmo.uc new file mode 100644 index 0000000..14efe61 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmo.uc @@ -0,0 +1,4 @@ +class NiceFlareRevolverAmmo extends ScrnFlareRevolverAmmo; +defaultproperties +{ PickupClass=Class'NicePack.NiceFlareRevolverAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmoPickup.uc new file mode 100644 index 0000000..f665755 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceFlareRevolverAmmoPickup extends ScrnFlareRevolverAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceFlareRevolverAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverFire.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverFire.uc new file mode 100644 index 0000000..57c690a --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverFire.uc @@ -0,0 +1,4 @@ +class NiceFlareRevolverFire extends ScrnFlareRevolverFire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceFlareRevolverAmmo' ProjectileClass=Class'NicePack.NiceFlareRevolverProjectile' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverPickup.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverPickup.uc new file mode 100644 index 0000000..884bdc3 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverPickup.uc @@ -0,0 +1,24 @@ +class NiceFlareRevolverPickup extends ScrnFlareRevolverPickup; +function inventory SpawnCopy( pawn Other ) { + local Inventory CurInv; + local KFWeapon PistolInInventory; + For( CurInv=Other.Inventory; CurInv!=none; CurInv=CurInv.Inventory ) { PistolInInventory = KFWeapon(CurInv); if( PistolInInventory != none && PistolInInventory.class == default.InventoryType ) { // destroy the inventory to force parent SpawnCopy() to make a new instance of class // we specified below if( Inventory!=none ) Inventory.Destroy(); // spawn dual guns instead of another instance of single InventoryType = DualInventoryType; // Make dualies to cost twice of lowest value in case of PERKED+UNPERKED pistols SellValue = 2 * min(SellValue, PistolInInventory.SellValue); AmmoAmount[0]+= PistolInInventory.AmmoAmount(0); MagAmmoRemaining+= PistolInInventory.MagAmmoRemaining; CurInv.Destroyed(); CurInv.Destroy(); Return Super(KFWeaponPickup).SpawnCopy(Other); } + } + InventoryType = Default.InventoryType; + Return Super(KFWeaponPickup).SpawnCopy(Other); +} +function bool CheckCanCarry(KFHumanPawn Hm) { + local Inventory CurInv; + local bool bHasSinglePistol; + local float AddWeight; + AddWeight = class(default.InventoryType).default.Weight; + for ( CurInv = Hm.Inventory; CurInv != none; CurInv = CurInv.Inventory ) { if ( CurInv.class == default.DualInventoryType ) { //already have duals, can't carry a single if ( LastCantCarryTime < Level.TimeSeconds && PlayerController(Hm.Controller) != none ) { LastCantCarryTime = Level.TimeSeconds + 0.5; PlayerController(Hm.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2); } return false; } else if ( CurInv.class == default.InventoryType ) { bHasSinglePistol = true; AddWeight = default.DualInventoryType.default.Weight - AddWeight; break; } + } + if ( !Hm.CanCarry(AddWeight) ) { if ( LastCantCarryTime < Level.TimeSeconds && PlayerController(Hm.Controller) != none ) { LastCantCarryTime = Level.TimeSeconds + 0.5; PlayerController(Hm.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2); } + return false; + } + return true; +} +defaultproperties +{ DualInventoryType=Class'NicePack.NiceDualFlareRevolver' ItemName="Flare Revolver NW" ItemShortName="Flare Rev. NW" InventoryType=Class'NicePack.NiceFlareRevolver' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverProjectile.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverProjectile.uc new file mode 100644 index 0000000..02e0633 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverProjectile.uc @@ -0,0 +1,43 @@ +class NiceFlareRevolverProjectile extends ScrnFlareRevolverProjectile; +//overrided to use alternate burning mechanism +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dirs; + local int NumKilled; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + if ( bHurtEntry ) return; + bHurtEntry = true; + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) { // null pawn variables here just to be sure they didn't left from previous iteration // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! P = none; KFMonsterVictim = none; KFP = none; // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none && KFBulletWhipAttachment(Victims)==none ) { dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = none; + P = Pawn(Victims); + if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } + if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; continue; } + KFMonsterVictim = KFMonster(Victims); + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } + KFP = KFPawn(Victims); + if( KFMonsterVictim != none ) { damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); } else if( KFP != none ) { damageScale *= KFP.GetExposureTo(HitLocation); } + CheckedPawns[CheckedPawns.Length] = P; + if ( damageScale <= 0) { P = none; continue; } else { P = none; } } + Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType//Class'NicePack.NiceDamTypeFlareProjectileFire' ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType,//Class'NicePack.NiceDamTypeFlareProjectileFire', Momentum, HitLocation); + if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { NumKilled++; } } + } + /* + if ( (LastTouched != none) && (LastTouched != self) && (LastTouched != Instigator) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) + { Victims = LastTouched; LastTouched = none; dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController(InstigatorController); + log("Part 2 Doing "$(damageScale * DamageAmount)$" damage to "$Victims); Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + */ + if( Role == ROLE_Authority ) + { if( NumKilled >= 4 ) { KFGameType(Level.Game).DramaticEvent(0.05); } else if( NumKilled >= 2 ) { KFGameType(Level.Game).DramaticEvent(0.03); } + } + bHurtEntry = false; +} +defaultproperties +{ ImpactDamageType=Class'NicePack.NiceDamTypeFlareProjectileImpact' MyDamageType=Class'NicePack.NiceDamTypeFlareProjectileFire' +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFR.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFR.uc new file mode 100644 index 0000000..83115dc --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFR.uc @@ -0,0 +1,5 @@ +class NiceDamTypeHFR extends NiceDamTypeFire + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceHFR' DeathString="%k incinerated %o (Horzine Flame Rifle)." +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc new file mode 100644 index 0000000..0b2c9ea --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc @@ -0,0 +1,5 @@ +class NiceDamTypeHFRAssaultRifle extends NiceDamTypeFire + abstract; +defaultproperties +{ heatPart=0.500000 HeadShotDamageMult=6.000000 bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceHFR' DeathString="%k killed %o (Horzine Flame Rifle)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' KDamageImpulse=5500.000000 KDeathVel=175.000000 KDeathUpKick=15.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc new file mode 100644 index 0000000..cec1283 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc @@ -0,0 +1,296 @@ +// Modification of the AAR525 weapons by: [B.R]HekuT +class NiceHFR extends KFWeapon; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +#exec OBJ LOAD FILE=KF_Weapons5_Scopes_Trip_T.utx +var() Material ZoomMat; +var() int lenseMaterialID; +var() float scopePortalFOVHigh; +var() float scopePortalFOV; +var() vector XoffsetScoped; +var() vector XoffsetHighDetail; +var() int scopePitch; +var() int scopeYaw; +var() int scopePitchHigh; +var() int scopeYawHigh; +var ScriptedTexture ScopeScriptedTexture; +var Shader ScopeScriptedShader; +var Material ScriptedTextureFallback; +var Combiner ScriptedScopeCombiner; +var Combiner ScriptedScopeStatic; +var texture TexturedScopeTexture; +var bool bInitializedScope; +var string ZoomMatRef; +var string ScriptedTextureFallbackRef; +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount) +{ + super.PreloadAssets(Inv, bSkipRefCount); + default.ZoomMat = FinalBlend(DynamicLoadObject(default.ZoomMatRef, class'FinalBlend', true)); + default.ScriptedTextureFallback = texture(DynamicLoadObject(default.ScriptedTextureFallbackRef, class'texture', true)); + if ( M99SniperRifle(Inv) != none ) + { M99SniperRifle(Inv).ZoomMat = default.ZoomMat; M99SniperRifle(Inv).ScriptedTextureFallback = default.ScriptedTextureFallback; + } +} +static function bool UnloadAssets() +{ + if ( super.UnloadAssets() ) + { default.ZoomMat = none; default.ScriptedTextureFallback = none; + } + return true; +} +exec function pfov(int thisFOV) +{ + if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; + scopePortalFOV = thisFOV; +} +exec function pPitch(int num) +{ + if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; + scopePitch = num; + scopePitchHigh = num; +} +exec function pYaw(int num) +{ + if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; + scopeYaw = num; + scopeYawHigh = num; +} +simulated exec function TexSize(int i, int j) +{ + if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; + ScopeScriptedTexture.SetSize(i, j); +} +simulated function bool ShouldDrawPortal() +{ + if( bAimingRifle ) return true; + else return false; +} +simulated function PostBeginPlay() +{ + super.PostBeginPlay(); + KFScopeDetail = class'KFMod.KFWeapon'.default.KFScopeDetail; + UpdateScopeMode(); +} +simulated function UpdateScopeMode() +{ + if (Level.NetMode != NM_DedicatedServer && Instigator != none && Instigator.IsLocallyControlled() && Instigator.IsHumanControlled() ) + { if( KFScopeDetail == KF_ModelScope ) { scopePortalFOV = default.scopePortalFOV; ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); if (bAimingRifle) { PlayerViewOffset = XoffsetScoped; } + if( ScopeScriptedTexture == none ) { ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); } + ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; ScopeScriptedTexture.SetSize(512,512); ScopeScriptedTexture.Client = Self; + if( ScriptedScopeCombiner == none ) { ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeCombiner.Material1 = Texture'KF_Weapons5_Scopes_Trip_T.Scope.MilDot'; ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeCombiner.CombineOperation = CO_Multiply; ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; } + if( ScopeScriptedShader == none ) { ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; } + bInitializedScope = true; } else if( KFScopeDetail == KF_ModelScopeHigh ) { scopePortalFOV = scopePortalFOVHigh; ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); if (bAimingRifle) { PlayerViewOffset = XoffsetHighDetail; } + if( ScopeScriptedTexture == none ) { ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); } ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; ScopeScriptedTexture.SetSize(1024,1024); ScopeScriptedTexture.Client = Self; + if( ScriptedScopeCombiner == none ) { ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeCombiner.Material1 = Texture'KF_Weapons5_Scopes_Trip_T.Scope.MilDot'; ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeCombiner.CombineOperation = CO_Multiply; ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; } + if( ScopeScriptedShader == none ) { ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; } + bInitializedScope = true; } else if (KFScopeDetail == KF_TextureScope) { ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); PlayerViewOffset.X = default.PlayerViewOffset.X; + bInitializedScope = true; } + } +} +simulated event RenderTexture(ScriptedTexture Tex) +{ + local rotator RollMod; + RollMod = Instigator.GetViewRotation(); + if(Owner != none && Instigator != none && Tex != none && Tex.Client != none) Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,Owner,(Instigator.Location + Instigator.EyePosition()), RollMod, scopePortalFOV ); +} +/** + * Handles all the functionality for zooming in including + * setting the parameters for the weapon, pawn, and playercontroller + * + * @param bAnimateTransition whether or not to animate this zoom transition + */ +simulated function ZoomIn(bool bAnimateTransition) +{ + super(BaseKFWeapon).ZoomIn(bAnimateTransition); + bAimingRifle = True; + if( KFHumanPawn(Instigator)!=none ) KFHumanPawn(Instigator).SetAiming(True); + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { if( AimInSound != none ) { PlayOwnedSound(AimInSound, SLOT_Interact,,,,, false); } + } +} +/** + * Handles all the functionality for zooming out including + * setting the parameters for the weapon, pawn, and playercontroller + * + * @param bAnimateTransition whether or not to animate this zoom transition + */ +simulated function ZoomOut(bool bAnimateTransition) +{ + super.ZoomOut(bAnimateTransition); + bAimingRifle = False; + if( KFHumanPawn(Instigator)!=none ) KFHumanPawn(Instigator).SetAiming(False); + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { if( AimOutSound != none ) { PlayOwnedSound(AimOutSound, SLOT_Interact,,,,, false); } KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); + } +} +simulated event OnZoomInFinished() +{ + local name anim; + local float frame, rate; + GetAnimParams(0, anim, frame, rate); + if (ClientState == WS_ReadyToFire) + { if (anim == IdleAnim) { PlayIdle(); } + } + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none && KFScopeDetail == KF_TextureScope ) + { KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); + } +} +simulated event RenderOverlays(Canvas Canvas) +{ + local int m; + local PlayerController PC; + if (Instigator == none) return; + PC = PlayerController(Instigator.Controller); + if(PC == none) return; + if(!bInitializedScope && PC != none ) + { UpdateScopeMode(); + } + Canvas.DrawActor(none, false, true); + for (m = 0; m < NUM_FIRE_MODES; m++) + { if (FireMode[m] != none) { FireMode[m].DrawMuzzleFlash(Canvas); } + } + + SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); + SetRotation( Instigator.GetViewRotation() + ZoomRotInterp); + PreDrawFPWeapon(); + if(bAimingRifle && PC != none && (KFScopeDetail == KF_ModelScope || KFScopeDetail == KF_ModelScopeHigh)) { if (ShouldDrawPortal()) { if ( ScopeScriptedTexture != none ) { Skins[LenseMaterialID] = ScopeScriptedShader; ScopeScriptedTexture.Client = Self; ScopeScriptedTexture.Revision = (ScopeScriptedTexture.Revision +1); } } + bDrawingFirstPerson = true; Canvas.DrawBoundActor(self, false, false,DisplayFOV,PC.Rotation,rot(0,0,0),Instigator.CalcZoomedDrawOffset(self)); bDrawingFirstPerson = false; + } + else if( KFScopeDetail == KF_TextureScope && PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle) + { Skins[LenseMaterialID] = ScriptedTextureFallback; + SetZoomBlendColor(Canvas); + Canvas.Style = ERenderStyle.STY_Normal; Canvas.SetPos(0, 0); Canvas.DrawTile(ZoomMat, (Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); Canvas.SetPos(Canvas.SizeX, 0); Canvas.DrawTile(ZoomMat, -(Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); + Canvas.Style = 255; Canvas.SetPos((Canvas.SizeX - Canvas.SizeY) / 2,0); Canvas.DrawTile(ZoomMat, Canvas.SizeY, Canvas.SizeY, 0.0, 0.0, 1024, 1024); + Canvas.Font = Canvas.MedFont; Canvas.SetDrawColor(200,150,0); + Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.43); Canvas.DrawText("Zoom: 3.0"); + Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.47); + } else { Skins[LenseMaterialID] = ScriptedTextureFallback; bDrawingFirstPerson = true; Canvas.DrawActor(self, false, false, DisplayFOV); bDrawingFirstPerson = false; } +} +simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV) +{ + local KFPlayerController KFPC; + local float ResX, ResY; + local float AspectRatio; + KFPC = KFPlayerController(Level.GetLocalPlayerController()); + if( KFPC == none ) + { return AdjustFOV; + } + ResX = float(GUIController(KFPC.Player.GUIController).ResX); + ResY = float(GUIController(KFPC.Player.GUIController).ResY); + AspectRatio = ResX / ResY; + if ( KFPC.bUseTrueWideScreenFOV && AspectRatio >= 1.60 ) //1.6 = 16/10 which is 16:10 ratio and 16:9 comes to 1.77 + { return CalcFOVForAspectRatio(AdjustFOV); + } + else + { return AdjustFOV; + } +} +simulated function AdjustIngameScope() +{ + local PlayerController PC; + if(Instigator == none || PlayerController(Instigator.Controller) == none) return; + PC = PlayerController(Instigator.Controller); + if( !bHasScope ) return; + switch (KFScopeDetail) + { case KF_ModelScope: if( bAimingRifle ) DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); if ( PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); +} } break; + case KF_TextureScope: if( bAimingRifle ) DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); if ( bAimingRifle && PC.DesiredFOV != PlayerIronSightFOV ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); } } break; + case KF_ModelScopeHigh: if( bAimingRifle ) { if( ZoomedDisplayFOVHigh > 0 ) { DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); } else { DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); } } if ( bAimingRifle && PC.DesiredFOV == PlayerIronSightFOV ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); } } break; + } + UpdateScopeMode(); +} +simulated event Destroyed() +{ + if (ScopeScriptedTexture != none) + { ScopeScriptedTexture.Client = none; Level.ObjectPool.FreeObject(ScopeScriptedTexture); ScopeScriptedTexture=none; + } + if (ScriptedScopeCombiner != none) + { ScriptedScopeCombiner.Material2 = none; Level.ObjectPool.FreeObject(ScriptedScopeCombiner); ScriptedScopeCombiner = none; + } + if (ScopeScriptedShader != none) + { ScopeScriptedShader.Diffuse = none; ScopeScriptedShader.SelfIllumination = none; Level.ObjectPool.FreeObject(ScopeScriptedShader); ScopeScriptedShader = none; + } + Super.Destroyed(); +} +simulated function PreTravelCleanUp() +{ + if (ScopeScriptedTexture != none) + { ScopeScriptedTexture.Client = none; Level.ObjectPool.FreeObject(ScopeScriptedTexture); ScopeScriptedTexture=none; + } + if (ScriptedScopeCombiner != none) + { ScriptedScopeCombiner.Material2 = none; Level.ObjectPool.FreeObject(ScriptedScopeCombiner); ScriptedScopeCombiner = none; + } + if (ScopeScriptedShader != none) + { ScopeScriptedShader.Diffuse = none; ScopeScriptedShader.SelfIllumination = none; Level.ObjectPool.FreeObject(ScopeScriptedShader); ScopeScriptedShader = none; + } +} +state PendingClientWeaponSet +{ + simulated function Timer() + { if ( Pawn(Owner) != none && !bIsReloading ) { ClientWeaponSet(bPendingSwitch); } + if ( IsInState('PendingClientWeaponSet') ) { SetTimer(0.1, false); } + } + simulated function BeginState() + { SetTimer(0.1, false); + } + simulated function EndState() + { + } +} +simulated function SetZoomBlendColor(Canvas c) +{ + local Byte val; + local Color clr; + local Color fog; + clr.R = 255; + clr.G = 255; + clr.B = 255; + clr.A = 255; + if( Instigator.Region.Zone.bDistanceFog ) + { fog = Instigator.Region.Zone.DistanceFogColor; val = 0; val = Max( val, fog.R); val = Max( val, fog.G); val = Max( val, fog.B); if( val > 128 ) { val -= 128; clr.R -= val; clr.G -= val; clr.B -= val; } + } + c.DrawColor = clr; +} +function bool RecommendRangedAttack() +{ + return true; +} +function float SuggestAttackStyle() +{ + return -1.0; +} +function bool RecommendLongRangedAttack() +{ + return true; +} +simulated function AnimEnd(int channel) +{ + if(!FireMode[1].IsInState('FireLoop')) + { Super.AnimEnd(channel); + } +} +simulated function WeaponTick(float dt) +{ + Super.WeaponTick(dt); +} +simulated function bool StartFire(int Mode) +{ + if( Mode == 0 ) return super.StartFire(Mode); + if( !super.StartFire(Mode) ) return false; + + if( AmmoAmount(0) <= 0 ) + { return false; + } + AnimStopLooping(); + if( !FireMode[Mode].IsInState('FireLoop') && (AmmoAmount(0) > 0) ) + { FireMode[Mode].StartFiring(); return true; + } + else + { return false; + } + return true; +} +defaultproperties +{ lenseMaterialID=3 scopePortalFOVHigh=22.000000 scopePortalFOV=12.000000 ZoomMatRef="KillingFloorWeapons.Xbow.CommandoCrossFinalBlend" ScriptedTextureFallbackRef="NicePackT.HFR.CBLens_cmb" bHasScope=True ZoomedDisplayFOVHigh=35.000000 MagCapacity=10 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=0.600000 WeaponReloadAnim="Reload_M4" bSteadyAim=True Weight=7.000000 bHasAimingMode=True IdleAimAnim="Idle" StandardDisplayFOV=60.000000 bModeZeroCanDryFire=True SleeveNum=0 TraderInfoTexture=Texture'NicePackT.HFR.AAR525S_Trader' bIsTier2Weapon=True MeshRef="NicePackA.HFR" SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(1)="NicePackT.HFR.AAR525S_TEX_cmb" SkinRefs(2)="KF_Weapons_Trip_T.Rifles.crossbow_cmb" SelectSoundRef="KF_AK47Snd.AK47_Select" HudImageRef="NicePackT.HFR.AAR525S_unselected" SelectedHudImageRef="NicePackT.HFR.AAR525S_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceHFRPFire' FireModeClass(1)=Class'NicePack.NiceHFRBurstFire' PutDownAnim="PutDown" AIRating=0.700000 CurrentRating=0.700000 Description="Advanced horzine flame rifle." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=145 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=8 PickupClass=Class'NicePack.NiceHFRPickup' PlayerViewOffset=(X=18.000000,Y=15.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceHFRAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Horzine flame rifle" DrawScale=0.900000 TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc new file mode 100644 index 0000000..658f2b8 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc @@ -0,0 +1,5 @@ +class NiceHFRAmmo extends KFAmmunition; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ AmmoPickupAmount=15 MaxAmmo=100 InitialAmount=40 PickupClass=Class'NicePack.NiceHFRAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Fire balloon" +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc new file mode 100644 index 0000000..b6d2eeb --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceHFRAmmoPickup extends KFAmmoPickup; +defaultproperties +{ AmmoAmount=15 InventoryType=Class'NicePack.NiceHFRAmmo' PickupMessage="Fire balloon" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAttachment.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAttachment.uc new file mode 100644 index 0000000..97a1722 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAttachment.uc @@ -0,0 +1,4 @@ +class NiceHFRAttachment extends KFWeaponAttachment; +defaultproperties +{ mTracerClass=Class'KFMod.SPSniperTracer' MovementAnims(0)="JogF_M4203" MovementAnims(1)="JogB_M4203" MovementAnims(2)="JogL_M4203" MovementAnims(3)="JogR_M4203" TurnLeftAnim="TurnL_M4203" TurnRightAnim="TurnR_M4203" CrouchAnims(0)="CHWalkF_M4203" CrouchAnims(1)="CHWalkB_M4203" CrouchAnims(2)="CHWalkL_M4203" CrouchAnims(3)="CHWalkR_M4203" WalkAnims(0)="WalkF_M4203" WalkAnims(1)="WalkB_M4203" WalkAnims(2)="WalkL_M4203" WalkAnims(3)="WalkR_M4203" CrouchTurnRightAnim="CH_TurnR_M4203" CrouchTurnLeftAnim="CH_TurnL_M4203" IdleCrouchAnim="CHIdle_M4203" IdleWeaponAnim="Idle_M4203" IdleRestAnim="Idle_M4203" IdleChatAnim="Idle_M4203" IdleHeavyAnim="Idle_M4203" IdleRifleAnim="Idle_M4203" FireAnims(0)="Fire_M4203" FireAnims(1)="Fire_M4203" FireAnims(2)="Fire_M4203" FireAnims(3)="Fire_M4203" FireAltAnims(0)="Reload_Secondary_M4203" FireAltAnims(1)="Reload_Secondary_M4203" FireAltAnims(2)="Reload_Secondary_M4203" FireAltAnims(3)="Reload_Secondary_M4203" FireCrouchAnims(0)="CHFire_M4203" FireCrouchAnims(1)="CHFire_M4203" FireCrouchAnims(2)="CHFire_M4203" FireCrouchAnims(3)="CHFire_M4203" FireCrouchAltAnims(0)="Reload_Secondary_M4203" FireCrouchAltAnims(1)="Reload_Secondary_M4203" FireCrouchAltAnims(2)="Reload_Secondary_M4203" FireCrouchAltAnims(3)="Reload_Secondary_M4203" HitAnims(0)="HitF_M4203" HitAnims(1)="HitB_M4203" HitAnims(2)="HitL_M4203" HitAnims(3)="HitR_M4203" PostFireBlendStandAnim="Blend_M4203" PostFireBlendCrouchAnim="CHBlend_M4203" MeshRef="NicePackA.HFR_3rd" WeaponAmbientScale=2.000000 SplashEffect=Class'ROEffects.BulletSplashEmitter' +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBurstFire.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBurstFire.uc new file mode 100644 index 0000000..919ef05 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBurstFire.uc @@ -0,0 +1,4 @@ +class NiceHFRBurstFire extends FlameBurstFire; +defaultproperties +{ FireLoopAnim="Fire_Flame" AmmoClass=Class'NicePack.NiceHFRAmmo' ProjectileClass=Class'NicePack.NiceHFRTendril' +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlame.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlame.uc new file mode 100644 index 0000000..61aacd5 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlame.uc @@ -0,0 +1,20 @@ +class NiceHFRFlame extends HitFlame; +var float LastFlameSpawnTime; +var () float FlameSpawnInterval; +var Emitter SecondaryFlame; +state Ticking +{ + simulated function Tick( float dt ) + { if( LifeSpan < 2.0 ) { mRegenRange[0] *= LifeSpan * 0.5; mRegenRange[1] = mRegenRange[0]; SoundVolume = byte(float(SoundVolume) * (LifeSpan * 0.5)); } + if (Level.TimeSeconds - LastFlameSpawnTime > FlameSpawnInterval) { if( SecondaryFlame != none ) { SecondaryFlame.Kill(); } SecondaryFlame = Spawn(class'NicePack.NiceHFRFlameB',self); } + } +} +simulated function Destroyed() +{ + if( SecondaryFlame != none ) + { SecondaryFlame.Kill(); + } +} +defaultproperties +{ FlameSpawnInterval=0.500000 mParticleType=PT_Stream mLifeRange(0)=1.000000 mLifeRange(1)=1.500000 mRegenRange(0)=60.000000 mRegenRange(1)=60.000000 mMassRange(0)=0.500000 mMassRange(1)=1.000000 mSizeRange(0)=4.000000 mSizeRange(1)=8.000000 mGrowthRate=-52.000000 mAttenKa=0.000000 mAttenKb=0.000000 mRandTextures=True mAttraction=100.000000 Physics=PHYS_Trailer AmbientSound=Sound'Amb_Destruction.Fire.Kessel_Fire_Small_Barrel' Skins(0)=Texture'KFX.KFFlames' Style=STY_Additive SoundVolume=255 TransientSoundVolume=0.000000 TransientSoundRadius=50.000000 bNotOnDedServer=False +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlameB.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlameB.uc new file mode 100644 index 0000000..344667a --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlameB.uc @@ -0,0 +1,5 @@ +class NiceHFRFlameB extends Emitter; +defaultproperties +{ Begin Object Class=SpriteEmitter Name=SpriteEmitter0 UseColorScale=True FadeOut=True SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True UseRandomSubdivision=True ColorScale(1)=(RelativeTime=0.300000,Color=(B=255,G=255,R=255)) ColorScale(2)=(RelativeTime=0.750000,Color=(B=255,G=255,R=255)) ColorScale(3)=(RelativeTime=1.000000) ColorMultiplierRange=(Z=(Min=0.670000,Max=2.000000)) FadeOutStartTime=0.501500 MaxParticles=15 StartLocationShape=PTLS_Sphere SphereRadiusRange=(Max=1.000000) SpinsPerSecondRange=(X=(Max=0.070000)) StartSpinRange=(X=(Max=1.000000)) SizeScale(0)=(RelativeTime=1.000000,RelativeSize=1.250000) StartSizeRange=(X=(Min=1.000000,Max=15.000000),Y=(Min=0.000000,Max=0.000000),Z=(Min=0.000000,Max=0.000000)) ScaleSizeByVelocityMultiplier=(X=0.000000,Y=0.000000,Z=0.000000) ScaleSizeByVelocityMax=0.000000 Texture=Texture'KillingFloorWeapons.FlameThrower.FlameThrowerFire' TextureUSubdivisions=1 TextureVSubdivisions=1 SecondsBeforeInactive=30.000000 LifetimeRange=(Min=0.450000,Max=0.850000) StartVelocityRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=2.000000,Max=25.000000)) MaxAbsVelocity=(X=100.000000,Y=100.000000,Z=100.000000) End Object Emitters(0)=SpriteEmitter'NicePack.NiceHFRFlameB.SpriteEmitter0' + LightType=LT_Pulse LightHue=30 LightSaturation=100 LightBrightness=300.000000 LightRadius=4.000000 bNoDelete=False bDynamicLight=True bNetTemporary=True Physics=PHYS_Trailer +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc new file mode 100644 index 0000000..f79fa3a --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc @@ -0,0 +1,4 @@ +class NiceHFRPFire extends KFFire; +defaultproperties +{ FireAimedAnim="Fire_Iron" RecoilRate=0.120000 maxVerticalRecoilAngle=500 bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_M" StereoFireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeHFRAssaultRifle' DamageMax=50 Momentum=8500.000000 bWaitForRelease=True TransientSoundVolume=1.200000 TransientSoundRadius=500.000000 FireLoopAnim="Fire" FireAnimRate=0.909000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.600000 AmmoClass=Class'NicePack.NiceHFRAmmo' AmmoPerFire=1 ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPSniper' aimerror=42.000000 Spread=0.015000 SpreadStyle=SS_Random +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc new file mode 100644 index 0000000..6746b23 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc @@ -0,0 +1,4 @@ +class NiceHFRPickup extends KFWeaponPickup; +defaultproperties +{ Weight=7.000000 AmmoCost=30 BuyClipSize=15 PowerValue=100 SpeedValue=100 RangeValue=40 Description="Advanced horzine flame rifle." ItemName="Horzine flame rifle" ItemShortName="HFR" AmmoItemName="Fire balloon" AmmoMesh=StaticMesh'KillingFloorStatics.FT_AmmoMesh' CorrespondingPerkIndex=5 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceHFR' PickupMessage="You got the HFR." PickupSound=Sound'KF_AK47Snd.AK47_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.HFR.AAR525_Black_Pickup' CollisionRadius=30.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc new file mode 100644 index 0000000..ba7c044 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc @@ -0,0 +1,4 @@ +class NiceHFRTendril extends FlameTendril; +defaultproperties +{ Damage=36.000000 MyDamageType=Class'NicePack.NiceDamTypeHFR' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun.uc new file mode 100644 index 0000000..287de45 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun.uc @@ -0,0 +1,5 @@ +class NiceDamTypeHuskGun extends NiceDamTypeFire + abstract; +defaultproperties +{ bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceHuskGun' DeathString="%k killed %o (Husk Gun)." FemaleSuicide="%o blew up." MaleSuicide="%o blew up." +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGunProjectileImpact.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGunProjectileImpact.uc new file mode 100644 index 0000000..17f56a8 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGunProjectileImpact.uc @@ -0,0 +1,14 @@ +class NiceDamTypeHuskGunProjectileImpact extends NiceDamTypeFire; +static function GetHitEffects(out class HitEffects[4], int VictimHealth) +{ + HitEffects[0] = class'HitSmoke'; + if( VictimHealth <= 0 ) HitEffects[1] = class'KFHitFlame'; + else if ( FRand() < 0.8 ) HitEffects[1] = class'KFHitFlame'; +} +static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount) +{ + KFStatsAndAchievements.AddFlameThrowerDamage(Amount); +} +defaultproperties +{ HeadShotDamageMult=1.500000 bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceHuskGun' DeathString="%k killed %o (Husk Gun)." FemaleSuicide="%o blew up." MaleSuicide="%o blew up." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 HumanObliterationThreshhold=200 +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun_Alt.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun_Alt.uc new file mode 100644 index 0000000..384de67 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun_Alt.uc @@ -0,0 +1,5 @@ +class NiceDamTypeHuskGun_Alt extends NiceDamTypeHuskGun + abstract; +defaultproperties +{ HeadShotDamageMult=1.000000 bCheckForHeadShots=False DeathString="%k burned down %o with Napalm." FemaleSuicide="%o burned her pretty butt up." MaleSuicide="%o burned his a** up." +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGun.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGun.uc new file mode 100644 index 0000000..aa4d677 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGun.uc @@ -0,0 +1,52 @@ +/** + * Attempt to make Husk Gun actually usefull. + */ + +class NiceHuskGun extends ScrnHuskGun; +/* +// both fire modes share the same ammo pool, so don't give ammo twice +function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned) +{ + local bool bJustSpawnedAmmo; + local int addAmount, InitialAmount; + local float AddMultiplier; + UpdateMagCapacity(Instigator.PlayerReplicationInfo); + if ( FireMode[m] != none && FireMode[m].AmmoClass != none ) + { Ammo[m] = Ammunition(Instigator.FindInventoryType(FireMode[m].AmmoClass)); bJustSpawnedAmmo = false; + if ( bNoAmmoInstances ) { if ( (FireMode[m].AmmoClass == none) || ((m != 0) && (FireMode[m].AmmoClass == FireMode[0].AmmoClass)) ) return; + InitialAmount = FireMode[m].AmmoClass.Default.InitialAmount; + if(WP!=none && WP.bThrown==true) InitialAmount = WP.AmmoAmount[m]; else { // Other change - if not thrown, give the gun a full clip MagAmmoRemaining = MagCapacity; } + if ( Ammo[m] != none ) { addamount = InitialAmount + Ammo[m].AmmoAmount; Ammo[m].Destroy(); } else addAmount = InitialAmount; + AddAmmo(addAmount,m); } else { if ( (Ammo[m] == none) && (FireMode[m].AmmoClass != none) ) { Ammo[m] = Spawn(FireMode[m].AmmoClass, Instigator); Instigator.AddInventory(Ammo[m]); bJustSpawnedAmmo = true; } else if ( (m == 0) || (FireMode[m].AmmoClass != FireMode[0].AmmoClass) ) bJustSpawnedAmmo = ( bJustSpawned || ((WP != none) && !WP.bWeaponStay) ); + // and here is the modification for instanced ammo actors + if(WP!=none && WP.bThrown==true) { addAmount = WP.AmmoAmount[m]; } else if ( bJustSpawnedAmmo ) { if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none ) { AddMultiplier = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.static.AddExtraAmmoFor(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), FireMode[m].AmmoClass); } else { AddMultiplier = 1.0; } + if (default.MagCapacity == 0) addAmount = 0; // prevent division by zero. else addAmount = Ammo[m].InitialAmount * (float(MagCapacity) / float(default.MagCapacity)) * AddMultiplier; } + //removed: WP.Class == class'BoomstickPickup' -- (c) PooSH if ( WP != none && m > 0 ) { return; } + Ammo[m].AddAmmo(addAmount); Ammo[m].GotoState(''); } + } +} +*/ +/* +simulated function bool ConsumeAmmo( int Mode, float Load, optional bool bAmountNeededIsMax ) +{ + return super.ConsumeAmmo(0, Load, bAmountNeededIsMax); +} +simulated function int AmmoAmount(int mode) +{ + return super.AmmoAmount(0); +} +*/ +/* +//v2.60: Reload speed bonus affects charge rate +simulated function bool StartFire(int Mode) +{ + local ScrnHuskGunFire f; + local KFPlayerReplicationInfo KFPRI; + if ( super.StartFire(Mode) ) { f = ScrnHuskGunFire(FireMode[Mode]); if ( Mode == 0 && f != none ) { f.MaxChargeTime = f.default.MaxChargeTime; KFPRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo); if ( KFPRI != none && KFPRI.ClientVeteranSkill != none) f.MaxChargeTime /= KFPRI.ClientVeteranSkill.static.GetReloadSpeedModifier(KFPRI, self); } return true; + } + return false; +} +*/ +defaultproperties +{ Weight=8.000000 FireModeClass(0)=Class'NicePack.NiceHuskGunFire' FireModeClass(1)=Class'NicePack.NiceHuskGunAltFire' PickupClass=Class'NicePack.NiceHuskGunPickup' ItemName="Husk Gun / Napalm Launcher NW" +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAltFire.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAltFire.uc new file mode 100644 index 0000000..b5c5c6c --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAltFire.uc @@ -0,0 +1,29 @@ +// NAPALM THROWER +class NiceHuskGunAltFire extends ScrnHuskGunAltFire; +/* +//instant shot, without holding +function ModeHoldFire() { } +function Charge() { } +function PlayPreFire() { } +function Timer() { } +function class GetDesiredProjectileClass() +{ + return ProjectileClass; +} +function PostSpawnProjectile(Projectile P) +{ + super(KFShotgunFire).PostSpawnProjectile(P); // bypass HuskGunFire +} +simulated function bool AllowFire() +{ + return (Weapon.AmmoAmount(ThisModeNum) >= MaxChargeAmmo); +} +function ModeDoFire() +{ + if (!AllowFire()) return; Weapon.ConsumeAmmo(ThisModeNum, MaxChargeAmmo-1); // +1 will be consumed in parent function + super(KFShotgunFire).ModeDoFire(); +} +*/ +defaultproperties +{ MaxChargeAmmo=30 ProjectileClass=Class'NicePack.NiceHuskGunProjectile_Alt' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmo.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmo.uc new file mode 100644 index 0000000..7a0a7b9 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmo.uc @@ -0,0 +1,4 @@ +class NiceHuskGunAmmo extends ScrnHuskGunAmmo; +defaultproperties +{ MaxAmmo=150 InitialAmount=75 PickupClass=Class'NicePack.NiceHuskGunAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmoPickup.uc new file mode 100644 index 0000000..557258f --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceHuskGunAmmoPickup extends ScrnHuskGunAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceHuskGunAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunFire.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunFire.uc new file mode 100644 index 0000000..d255809 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunFire.uc @@ -0,0 +1,93 @@ +class NiceHuskGunFire extends ScrnHuskGunFire; +/* +var int AmmoInCharge; //current charged amount var() int MaxChargeAmmo; //maximum charge + +function Timer() +{ + //local PlayerController Player; + //consume ammo while charging + if ( HoldTime > 0.0 && !bNowWaiting && AmmoInCharge < MaxChargeAmmo && Weapon.AmmoAmount(ThisModeNum) > 0 ) { Charge(); // if (AmmoInCharge == MaxChargeAmmo) { // Player = Level.GetLocalPlayerController(); // if (Player != none) // Player.ReceiveLocalizedMessage(class'ScrnBalanceSrv.ScrnPlayerMessage',0); // } + } + super.Timer(); +} +function Charge() +{ + local int AmmoShouldConsumed; + if( HoldTime < MaxChargeTime) AmmoShouldConsumed = clamp(round(MaxChargeAmmo*HoldTime/MaxChargeTime), 1, MaxChargeAmmo); + else AmmoShouldConsumed = MaxChargeAmmo;// full charge + if (AmmoShouldConsumed != AmmoInCharge) { if (AmmoShouldConsumed - AmmoInCharge > Weapon.AmmoAmount(ThisModeNum)) AmmoShouldConsumed = Weapon.AmmoAmount(ThisModeNum) + AmmoInCharge; Weapon.ConsumeAmmo(ThisModeNum, AmmoShouldConsumed - AmmoInCharge); AmmoInCharge = AmmoShouldConsumed; ScrnHuskGun(Weapon).ChargeAmount = GetChargeAmount(); + } +} +function float GetChargeAmount() +{ + return float(AmmoInCharge) / float(MaxChargeAmmo); +} +simulated function bool AllowFire() +{ + return (Weapon.AmmoAmount(ThisModeNum) >= AmmoPerFire); +} +*/ +//overrided to restore old damage radius +//(c) PooSH +function PostSpawnProjectile(Projectile P) +{ + local HuskGunProjectile HGP; + super(KFShotgunFire).PostSpawnProjectile(P); + HGP = HuskGunProjectile(p); + if ( HGP != none ) { if( AmmoInCharge < MaxChargeAmmo ) { HGP.ImpactDamage *= AmmoInCharge; HGP.Damage *= 1.0 + GetChargeAmount(); // up to 2x damage HGP.DamageRadius *= 1.0 + 2 * GetChargeAmount();// up 2x the damage radius } else { HGP.ImpactDamage *= MaxChargeAmmo; //50*10 = 500 HGP.Damage *= 2.0; // up from 2x HGP.DamageRadius *= 3.0; // down from x3 } AmmoInCharge = 0; //reset charge after spawning a projectile ScrnHuskGun(Weapon).ChargeAmount = 0; + } +} +/* +//copy pasted and cutted out ammo consuming, because we did it in time +function ModeDoFire() +{ + local float Rec; + if (!AllowFire() && HoldTime ~= 0) return; + Spread = Default.Spread; + Rec = 1; + + if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none ) + { Spread *= KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.ModifyRecoilSpread(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self, Rec); + } + if( !bFiringDoesntAffectMovement ) + { if (FireRate > 0.25) { Instigator.Velocity.x *= 0.1; Instigator.Velocity.y *= 0.1; } else { Instigator.Velocity.x *= 0.5; Instigator.Velocity.y *= 0.5; } + } + if (!AllowFire() && HoldTime ~= 0) return; + if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); + // server + if (Weapon.Role == ROLE_Authority) + { Charge(); + DoFireEffect(); HoldTime = 0; // if bot decides to stop firing, HoldTime must be reset first if ( (Instigator == none) || (Instigator.Controller == none) ) return; + if ( AIController(Instigator.Controller) != none ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); + Instigator.DeactivateSpawnProtection(); + } + // client + if (Instigator.IsLocallyControlled()) + { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); + } + else // server + { ServerPlayFiring(); + } + Weapon.IncrementFlashCount(ThisModeNum); + // set the next firing time. must be careful here so client and server do not get out of sync + if (bFireOnRelease) + { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; + } + else + { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); + } + Load = AmmoPerFire; + HoldTime = 0; + AmmoInCharge = 0; + if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != none) + { bIsFiring = false; Weapon.PutDown(); + } + // client + if (Instigator.IsLocallyControlled()) + { HandleRecoil(Rec); + } +} +*/ +defaultproperties +{ WeakProjectileClass=Class'NicePack.NiceHuskGunProjectile_Weak' StrongProjectileClass=Class'NicePack.NiceHuskGunProjectile_Strong' AmmoClass=Class'NicePack.NiceHuskGunAmmo' ProjectileClass=Class'NicePack.NiceHuskGunProjectile' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunPickup.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunPickup.uc new file mode 100644 index 0000000..da8bfd4 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunPickup.uc @@ -0,0 +1,4 @@ +class NiceHuskGunPickup extends ScrnHuskGunPickup; +defaultproperties +{ Weight=8.000000 ItemName="Husk Gun / Napalm Launcher NW" ItemShortName="Husk Gun NW" InventoryType=Class'NicePack.NiceHuskGun' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile.uc new file mode 100644 index 0000000..cc6d6b9 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile.uc @@ -0,0 +1,74 @@ +class NiceHuskGunProjectile extends ScrnHuskGunProjectile; +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + local vector X; + local Vector TempHitLocation, HitNormal; + local array HitPoints; + local KFPawn HitPawn; + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) return; + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { return; + } + // Don't allow hits on poeple on the same team + if( KFHumanPawn(Other) != none && Instigator != none && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { return; + } + if( !bDud ) + { Explode(HitLocation,Normal(HitLocation-Other.Location)); + } + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { OrigLoc = Instigator.Location; + } + X = Vector(Rotation); + if( Role == ROLE_Authority ) + { if( ROBulletWhipAttachment(Other) != none ) { if(!Other.Base.bDeleteMe) { Other = Instigator.HitPointTrace(TempHitLocation, HitNormal, HitLocation + (200 * X), HitPoints, HitLocation,, 1); + if( Other == none || HitPoints.Length == 0 ) return; + HitPawn = KFPawn(Other); + if (Role == ROLE_Authority) { if ( HitPawn != none ) { // Hit detection debugging /*log("Bullet hit "$HitPawn.PlayerReplicationInfo.PlayerName); HitPawn.HitStart = HitLocation; HitPawn.HitEnd = HitLocation + (65535 * X);*/ + if( !HitPawn.bDeleteMe ) HitPawn.ProcessLocationalDamage(ImpactDamage, Instigator, TempHitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType,HitPoints); + // Hit detection debugging //if( Level.NetMode == NM_Standalone) // HitPawn.DrawBoneLocation(); } } } } else { if (Pawn(Other) != none && Pawn(Other).IsHeadShot(HitLocation, X, 1.0)) { Pawn(Other).TakeDamage(ImpactDamage * HeadShotDamageMult, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); } else { Other.TakeDamage(ImpactDamage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); } } + } +} +// Overrided to not use alternate burning mechanism +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dirs; + local int NumKilled; + local Pawn P; + local KFMonster KFMonsterVictim; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + //local int OldHealth; + if ( bHurtEntry ) return; + bHurtEntry = true; + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) { // null pawn variables here just to be sure they didn't left from previous iteration // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! P = none; KFMonsterVictim = none; KFP = none; if(Victims == none) continue; // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none && KFBulletWhipAttachment(Victims)==none ) { dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = none; + P = Pawn(Victims); + if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } + if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; continue; } + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } + KFMonsterVictim = KFMonster(Victims); KFP = KFPawn(Victims); + if( KFMonsterVictim != none ) damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); else if( KFP != none ) damageScale *= KFP.GetExposureTo(HitLocation); + CheckedPawns[CheckedPawns.Length] = P; + if ( damageScale <= 0) continue; } + Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); + if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { NumKilled++; } } + } + if( Role == ROLE_Authority ) + { if( NumKilled >= 4 ) { KFGameType(Level.Game).DramaticEvent(0.05); } else if( NumKilled >= 2 ) { KFGameType(Level.Game).DramaticEvent(0.03); } + } + bHurtEntry = false; +} +defaultproperties +{ HeadShotDamageMult=1.500000 ImpactDamageType=Class'NicePack.NiceDamTypeHuskGunProjectileImpact' ImpactDamage=50 +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Alt.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Alt.uc new file mode 100644 index 0000000..08892e7 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Alt.uc @@ -0,0 +1,43 @@ +class NiceHuskGunProjectile_Alt extends NiceHuskGunProjectile_Strong; +/* +//can't be destroyed by Siren's scream +//Explode only by heavy explosive damage +function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) +{ + if ( !bDud && !bHasExploded && Damage >= 100 && class(damageType) != none && class(damageType).default.bIsExplosive ) { Explode(HitLocation, vect(0,0,0)); + } +} +*/ +/* +simulated function float MosterDamageMult( KFMonster Victim ) +{ + float mult; + mult = super.MosterDamageMult(); + // prevent big monsters from 1-shot be killed by hitting all projectiles + if ( KFMonsterVictim.bBurnified && KFMonsterVictim.default.Health >= 1000 ) mult *= 0.5; + return mult; +} +*/ +/* +// copy-pasted with deletion of impact damage +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) return; + // Don't collide with bullet whip attachments + if( ROBulletWhipAttachment(Other) != none ) + { return; + } + // Don't allow hits on people on the same team + //if( KFHumanPawn(Other) != none && Instigator != none + // && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + //{ + // return; + //} + if( !bDud && !bHasExploded ) + { Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +}*/ +defaultproperties +{ HeadShotDamageMult=1.000000 ExplosionSoundVolume=1.000000 ImpactDamageType=Class'NicePack.NiceDamTypeHuskGun_Alt' ImpactDamage=0 AmbientVolumeScale=1.000000 Speed=750.000000 MaxSpeed=1000.000000 Damage=35.000000 DamageRadius=500.000000 MyDamageType=Class'NicePack.NiceDamTypeHuskGun_Alt' LifeSpan=5.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Strong.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Strong.uc new file mode 100644 index 0000000..400a858 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Strong.uc @@ -0,0 +1,4 @@ +class NiceHuskGunProjectile_Strong extends NiceHuskGunProjectile; +defaultproperties +{ ExplosionEmitter=Class'KFMod.FlameImpact_Strong' FlameTrailEmitterClass=Class'KFMod.FlameThrowerHusk_Strong' ExplosionSoundVolume=2.000000 ExplosionDecal=Class'KFMod.FlameThrowerBurnMark_Large' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Weak.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Weak.uc new file mode 100644 index 0000000..80d434b --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Weak.uc @@ -0,0 +1,4 @@ +class NiceHuskGunProjectile_Weak extends NiceHuskGunProjectile; +defaultproperties +{ ExplosionEmitter=Class'KFMod.FlameImpact_Weak' FlameTrailEmitterClass=Class'KFMod.FlameThrowerHusk_Weak' ExplosionSoundVolume=1.250000 ExplosionDecal=Class'KFMod.FlameThrowerBurnMark_Small' +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79Inc.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79Inc.uc new file mode 100644 index 0000000..9d40bc0 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79Inc.uc @@ -0,0 +1,5 @@ +// Incendiary M79 +class NiceM79Inc extends ScrnM79Inc; +defaultproperties +{ FireModeClass(0)=Class'NicePack.NiceM79IncFire' PickupClass=Class'NicePack.NiceM79IncPickup' ItemName="M79 Incendiary NW" +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmo.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmo.uc new file mode 100644 index 0000000..86021d1 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmo.uc @@ -0,0 +1,4 @@ +class NiceM79IncAmmo extends ScrnM79IncAmmo; +defaultproperties +{ PickupClass=Class'NicePack.NiceM79IncAmmoPickup' ItemName="M79 Incendiary Grenades NW" +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmoPickup.uc new file mode 100644 index 0000000..9c469e4 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM79IncAmmoPickup extends ScrnM79IncAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceM79IncAmmo' PickupMessage="M79 Incendiary Grenades NW" +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncFire.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncFire.uc new file mode 100644 index 0000000..11007bf --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncFire.uc @@ -0,0 +1,4 @@ +class NiceM79IncFire extends ScrnM79IncFire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceM79IncAmmo' ProjectileClass=Class'NicePack.NiceM79IncGrenadeProjectile' +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncGrenadeProjectile.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncGrenadeProjectile.uc new file mode 100644 index 0000000..f6ae6d4 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncGrenadeProjectile.uc @@ -0,0 +1,72 @@ +class NiceM79IncGrenadeProjectile extends ScrnM79IncGrenadeProjectile; +#exec OBJ LOAD FILE=KF_GrenadeSnd.uax +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dirs; + local int NumKilled; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + + if ( bHurtEntry ) return; + bHurtEntry = true; + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) + { // null pawn variables here just to be sure they didn't left from previous iteration // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! P = none; KFMonsterVictim = none; KFP = none; // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none ) { dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = none; + P = Pawn(Victims); + if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } + if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; // and if you forget to re-null it somewhere?!! and then look for a bug during 2 days?!! Damned Tripwire, I hate you so much continue; } + KFMonsterVictim = KFMonster(Victims); + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } + KFP = KFPawn(Victims); + if( KFMonsterVictim != none ) { damageScale *= KFMonsterVictim.GetExposureTo(HitLocation/*Location + 15 * -Normal(PhysicsVolume.Gravity)*/); } else if( KFP != none ) { damageScale *= KFP.GetExposureTo(HitLocation/*Location + 15 * -Normal(PhysicsVolume.Gravity)*/); } + CheckedPawns[CheckedPawns.Length] = P; + if ( damageScale <= 0) { P = none; continue; } else { //Victims = P; P = none; } } + Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { NumKilled++; } } + } + /* + if ( (LastTouched != none) && (LastTouched != self) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) + { Victims = LastTouched; LastTouched = none; dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController(InstigatorController); Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + */ + if( Role == ROLE_Authority ) + { if( NumKilled >= 4 ) { KFGameType(Level.Game).DramaticEvent(0.05); } else if( NumKilled >= 2 ) { KFGameType(Level.Game).DramaticEvent(0.03); } + } + bHurtEntry = false; +} + +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) return; + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { return; + } + // Don't allow hits on people on the same team - except hardcore mode + if( !class'ScrnBalance'.default.Mut.bHardcore && KFHumanPawn(Other) != none && Instigator != none && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { return; + } + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { OrigLoc = Instigator.Location; + } + if( !bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0)) ) + { if( Role == ROLE_Authority ) { AmbientSound=none; PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0); Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType ); } bDud = true; Velocity = vect(0,0,0); LifeSpan=1.0; SetPhysics(PHYS_Falling); + } + if( !bDud ) + { Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} +defaultproperties +{ MyDamageType=Class'NicePack.NiceDamTypeFlameNade' +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncPickup.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncPickup.uc new file mode 100644 index 0000000..3f0f6da --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncPickup.uc @@ -0,0 +1,4 @@ +class NiceM79IncPickup extends ScrnM79IncPickup; +defaultproperties +{ ItemName="M79 Incendiary NW" ItemShortName="M79 Inc NW" InventoryType=Class'NicePack.NiceM79Inc' PickupMessage="You got the M79 Incendiary Grenade Launcher NW." +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceDamTypeMAC10Z.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceDamTypeMAC10Z.uc new file mode 100644 index 0000000..b0757e7 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceDamTypeMAC10Z.uc @@ -0,0 +1,5 @@ +class NiceDamTypeMAC10Z extends NiceDamTypeFire + abstract; +defaultproperties +{ heatPart=0.150000 bSniperWeapon=True bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceMAC10Z' +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Ammo.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Ammo.uc new file mode 100644 index 0000000..44ea829 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Ammo.uc @@ -0,0 +1,5 @@ +class NiceMAC10Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceMAC10Pickup' AmmoPickupAmount=30 MaxAmmo=300 InitialAmount=75 PickupClass=Class'NicePack.NiceMAC10AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="MAC-10 bullets" +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10AmmoPickup.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10AmmoPickup.uc new file mode 100644 index 0000000..29c2f86 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceMAC10AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceMAC10Ammo' PickupMessage="Rounds .45 cal" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Fire.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Fire.uc new file mode 100644 index 0000000..9dca348 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Fire.uc @@ -0,0 +1,4 @@ +class NiceMAC10Fire extends NiceHighROFFire; +defaultproperties +{ FireEndSoundRef="KF_MAC10MPSnd.MAC10_Fire_Loop_End_M" FireEndStereoSoundRef="KF_MAC10MPSnd.MAC10_Fire_Loop_End_S" AmbientFireSoundRef="KF_MAC10MPSnd.MAC10_Fire_Loop" ProjectileSpeed=18300.000000 RecoilRate=0.050000 maxVerticalRecoilAngle=150 maxHorizontalRecoilAngle=100 RecoilVelocityScale=1.500000 ShellEjectClass=Class'ROEffects.KFShellEjectMac' ShellEjectBoneName="Mac11_Ejector" bRandomPitchFireSound=False FireSoundRef="KF_MAC10MPSnd.MAC10_Silenced_Fire" StereoFireSoundRef="KF_MAC10MPSnd.MAC10_Silenced_FireST" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeMAC10Z' DamageMin=36 DamageMax=36 Momentum=6500.000000 FireRate=0.052000 AmmoClass=Class'NicePack.NiceMAC10Ammo' ShakeRotMag=(X=35.000000,Y=35.000000,Z=200.000000) ShakeRotRate=(X=8000.000000,Y=8000.000000,Z=8000.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(X=4.500000,Y=2.800000,Z=5.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=35.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Pickup.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Pickup.uc new file mode 100644 index 0000000..d5a1c56 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Pickup.uc @@ -0,0 +1,4 @@ +class NiceMAC10Pickup extends NiceWeaponPickup; +defaultproperties +{ bBackupWeapon=True crossPerkIndecies(0)=2 Weight=3.000000 cost=200 AmmoCost=10 BuyClipSize=30 PowerValue=30 SpeedValue=98 RangeValue=40 Description="A highly compact machine pistol. Can be fired in semi or full auto." ItemName="MAC-10" ItemShortName="MAC-10" AmmoItemName=".45 Cal" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=5 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceMAC10Z' PickupMessage="You got the MAC-10" PickupSound=Sound'KF_MAC10MPSnd.MAC10_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.MAC10_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Z.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Z.uc new file mode 100644 index 0000000..750f324 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Z.uc @@ -0,0 +1,9 @@ +class NiceMAC10Z extends NiceWeapon; +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +simulated function AltFire(float F){ + DoToggle(); +} +defaultproperties +{ reloadPreEndFrame=0.115000 reloadEndFrame=0.538000 reloadChargeEndFrame=0.750000 reloadMagStartFrame=0.288000 reloadChargeStartFrame=0.644000 MagazineBone="Mac11_Mag" MagCapacity=30 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 FlashBoneName="tipS" WeaponReloadAnim="Reload_Mac10" Weight=3.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Mac_10' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.Mac10_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.MAC10_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.MAC10_SIL_cmb" SelectSoundRef="KF_MAC10MPSnd.MAC10_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Mac_10_Unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Mac_10" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceMAC10Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A highly compact machine pistol. Can be fired in semi or full auto." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=75 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=6 PickupClass=Class'NicePack.NiceMAC10Pickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'KFMod.MAC10Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="MAC10" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtecta.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtecta.uc new file mode 100644 index 0000000..e6da9ac --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtecta.uc @@ -0,0 +1,15 @@ +class NiceProtecta extends Protecta; +// Use alt fire to switch fire modes +simulated function AltFire(float F) +{ + if(ReadyToFire(0)) + { DoToggle(); + } +} +exec function SwitchModes() +{ + DoToggle(); +} +defaultproperties +{ FireModeClass(0)=Class'NicePack.NiceProtectaFire' PickupClass=Class'NicePack.NiceProtectaPickup' ItemName="Flare Shotgun 'Protecta' NW" +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmo.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmo.uc new file mode 100644 index 0000000..70903b9 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmo.uc @@ -0,0 +1,4 @@ +class NiceProtectaAmmo extends ProtectaAmmo; +defaultproperties +{ PickupClass=Class'NicePack.NiceProtectaAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmoPickup.uc new file mode 100644 index 0000000..8974252 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceProtectaAmmoPickup extends ProtectaAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceProtectaAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFire.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFire.uc new file mode 100644 index 0000000..c87fca8 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFire.uc @@ -0,0 +1,15 @@ +class NiceProtectaFire extends ProtectaFire; +simulated function bool AllowFire() +{ + if( KFWeapon(Weapon).bIsReloading && KFWeapon(Weapon).MagAmmoRemaining < 1) return false; + if(KFPawn(Instigator).SecondaryItem!=none) return false; + if( KFPawn(Instigator).bThrowingNade ) return false; + if( Level.TimeSeconds - LastClickTime>FireRate ) + { LastClickTime = Level.TimeSeconds; + } + if( KFWeapon(Weapon).MagAmmoRemaining<1 ) return false; + return super(WeaponFire).AllowFire(); +} +defaultproperties +{ maxVerticalRecoilAngle=1000 maxHorizontalRecoilAngle=300 AmmoClass=Class'NicePack.NiceProtectaAmmo' ProjectileClass=Class'NicePack.NiceProtectaFlare' +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFlare.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFlare.uc new file mode 100644 index 0000000..82eaa33 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFlare.uc @@ -0,0 +1,4 @@ +class NiceProtectaFlare extends NiceFlareRevolverProjectile; +defaultproperties +{ Speed=4500.000000 MaxSpeed=5000.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaPickup.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaPickup.uc new file mode 100644 index 0000000..386f6c7 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaPickup.uc @@ -0,0 +1,4 @@ +class NiceProtectaPickup extends ProtectaPickup; +defaultproperties +{ ItemName="Protecta NW" ItemShortName="Protecta NW" InventoryType=Class'NicePack.NiceProtecta' PickupMessage="You got the Protecta NW" +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceDamTypeThompsonInc.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceDamTypeThompsonInc.uc new file mode 100644 index 0000000..ee89048 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceDamTypeThompsonInc.uc @@ -0,0 +1,5 @@ +class NiceDamTypeThompsonInc extends NiceDamTypeFire + abstract; +defaultproperties +{ heatPart=0.300000 bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceThompsonInc' +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonInc.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonInc.uc new file mode 100644 index 0000000..2383e52 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonInc.uc @@ -0,0 +1,5 @@ +class NiceThompsonInc extends ScrnThompsonInc + config(user); +defaultproperties +{ FireModeClass(0)=Class'NicePack.NiceThompsonIncFire' PickupClass=Class'NicePack.NiceThompsonIncPickup' ItemName="Incendiary Tommy Gun NW" +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmo.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmo.uc new file mode 100644 index 0000000..f5db7ca --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmo.uc @@ -0,0 +1,5 @@ +class NiceThompsonIncAmmo extends ScrnThompsonIncAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ PickupClass=Class'NicePack.NiceThompsonIncAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmoPickup.uc new file mode 100644 index 0000000..e12c9b9 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceThompsonIncAmmoPickup extends ScrnThompsonIncAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceThompsonIncAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncFire.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncFire.uc new file mode 100644 index 0000000..a60a892 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncFire.uc @@ -0,0 +1,34 @@ +class NiceThompsonIncFire extends ScrnThompsonIncFire; +// Overwritten to not switch damage types for the firebug +function DoTrace(Vector Start, Rotator Dir) +{ + local Vector X,Y,Z, End, HitLocation, HitNormal, ArcEnd; + local Actor Other; + local KFWeaponAttachment WeapAttach; + local array HitPoints; + local KFPawn HitPawn; + MaxRange(); + Weapon.GetViewAxes(X, Y, Z); + if ( Weapon.WeaponCentered() ) + { ArcEnd = (Instigator.Location + Weapon.EffectOffset.X * X + 1.5 * Weapon.EffectOffset.Z * Z); + } + else + { ArcEnd = (Instigator.Location + Instigator.CalcDrawOffset(Weapon) + Weapon.EffectOffset.X * X + Weapon.Hand * Weapon.EffectOffset.Y * Y + Weapon.EffectOffset.Z * Z); + } + X = Vector(Dir); + End = Start + TraceRange * X; + Other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1); + if ( Other != none && Other != Instigator && Other.Base != Instigator ) + { WeapAttach = KFWeaponAttachment(Weapon.ThirdPersonActor); + if ( !Other.bWorldGeometry ) { // Update hit effect except for pawns if ( !Other.IsA('Pawn') && !Other.IsA('HitScanBlockingVolume') && !Other.IsA('ExtendedZCollision') ) { if( WeapAttach!=none ) { WeapAttach.UpdateHit(Other, HitLocation, HitNormal); } } + HitPawn = KFPawn(Other); + if ( HitPawn != none ) { if ( !HitPawn.bDeleteMe ) { HitPawn.ProcessLocationalDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType, HitPoints); } } else Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType); } else { HitLocation = HitLocation + 2.0 * HitNormal; + if ( WeapAttach != none ) { WeapAttach.UpdateHit(Other,HitLocation,HitNormal); } } + } + else + { HitLocation = End; HitNormal = Normal(Start - End); + } +} +defaultproperties +{ DamageType=Class'NicePack.NiceDamTypeThompsonInc' AmmoClass=Class'NicePack.NiceThompsonIncAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncPickup.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncPickup.uc new file mode 100644 index 0000000..6796254 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncPickup.uc @@ -0,0 +1,4 @@ +class NiceThompsonIncPickup extends ScrnThompsonIncPickup; +defaultproperties +{ ItemName="Tommy Gun Incendiary NW" ItemShortName="Tommy Gun Inc. NW" InventoryType=Class'NicePack.NiceThompsonInc' PickupMessage="You got the Incendiary Tommy Gun NW" +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceDamTypeTrenchgun.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceDamTypeTrenchgun.uc new file mode 100644 index 0000000..8442e22 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceDamTypeTrenchgun.uc @@ -0,0 +1,5 @@ +class NiceDamTypeTrenchgun extends NiceDamTypeFire + abstract; +defaultproperties +{ heatPart=0.400000 MaxPenetrations=3 bIsPowerWeapon=True bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceTrenchgun' DeathString="%k killed %o (Trenchgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgun.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgun.uc new file mode 100644 index 0000000..26b1dc7 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgun.uc @@ -0,0 +1,8 @@ +class NiceTrenchgun extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 6 shells during 143 frames tops, with first shell loaded at frame 14, with 18 frames between load moments + generateReloadStages(6, 143, 14, 18); +} +defaultproperties +{ reloadType=RTYPE_SINGLE ForceZoomOutOnFireTime=0.010000 MagCapacity=6 ReloadRate=0.700000 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=8.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_TrenchGun' bIsTier2Weapon=True MeshRef="KF_Wep_TrenchGun.TrenchGun" SkinRefs(0)="KF_Weapons8_Trip_T.Weapons.Trenchgun_cmb" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.TrenchGun_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.TrenchGun" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceTrenchgunFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 bShowChargingBar=True Description="A WWII-era trench shotgun in 12 gauge, loaded with Dragon's Breath flame rounds. Toasty." DisplayFOV=65.000000 Priority=142 InventoryGroup=3 GroupOffset=14 PickupClass=Class'NicePack.NiceTrenchgunPickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-8.000000) BobDamping=7.000000 AttachmentClass=Class'KFMod.TrenchgunAttachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="Dragon's Breath Trenchgun" TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmo.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmo.uc new file mode 100644 index 0000000..61fea07 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmo.uc @@ -0,0 +1,5 @@ +class NiceTrenchgunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceTrenchgunPickup' AmmoPickupAmount=6 MaxAmmo=48 InitialAmount=24 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmoPickup.uc new file mode 100644 index 0000000..41bffcd --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceTrenchgunAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=8 InventoryType=Class'NicePack.NiceTrenchgunAmmo' PickupMessage="Dragon's Breath Shells" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunFire.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunFire.uc new file mode 100644 index 0000000..206ab89 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunFire.uc @@ -0,0 +1,4 @@ +class NiceTrenchgunFire extends NiceShotgunFire; +defaultproperties +{ ProjPerFire=14 bRandomPitchFireSound=True FireSoundRef="KF_ShotgunDragonsBreathSnd.ShotgunDragon_Fire_Single_M" StereoFireSoundRef="KF_ShotgunDragonsBreathSnd.ShotgunDragon_Fire_Single_S" DamageType=Class'NicePack.NiceDamTypeTrenchgun' DamageMax=18 AmmoClass=Class'NicePack.NiceTrenchgunAmmo' FlashEmitterClass=Class'KFMod.TrenchgunMuzzFlash' +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunPickup.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunPickup.uc new file mode 100644 index 0000000..f0b3717 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunPickup.uc @@ -0,0 +1,4 @@ +class NiceTrenchgunPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=8.000000 cost=1250 BuyClipSize=6 PowerValue=75 SpeedValue=40 RangeValue=15 Description="A WWII-era trench shotgun in 12 gauge, loaded with Dragon's Breath flame rounds. Toasty." ItemName="Trenchgun" ItemShortName="Trenchgun" AmmoItemName="Dragon's breath shells" CorrespondingPerkIndex=5 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceTrenchgun' PickupMessage="You got the Trenchgun." PickupSound=Sound'KF_ShotgunDragonsBreathSnd.Handling.TrenchGun_Pump_Back' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups5_Trip.Rifles.TrenchGun_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxe.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxe.uc new file mode 100644 index 0000000..75ee17f --- /dev/null +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxe.uc @@ -0,0 +1,4 @@ +class NiceAxe extends NiceMeleeWeapon; +defaultproperties +{ weaponRange=80.000000 BloodSkinSwitchArray=0 BloodyMaterialRef="KF_Weapons_Trip_T.melee.axe_bloody_cmb" bSpeedMeUp=True Weight=5.000000 StandardDisplayFOV=75.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Axe' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Axe_Trip" SkinRefs(0)="KF_Weapons_Trip_T.melee.axe_cmb" SelectSoundRef="KF_AxeSnd.Axe_Select" HudImageRef="KillingFloorHUD.WeaponSelect.Axe_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Axe" FireModeClass(0)=Class'NicePack.NiceAxeFire' FireModeClass(1)=Class'NicePack.NiceAxeFireB' AIRating=0.300000 Description="A common two-handed fireman's axe." DisplayFOV=75.000000 Priority=55 GroupOffset=3 PickupClass=Class'NicePack.NiceAxePickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceAxeAttachment' IconCoords=(X1=169,Y1=39,X2=241,Y2=77) ItemName="Axe" +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxeAttachment.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxeAttachment.uc new file mode 100644 index 0000000..091e8a2 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxeAttachment.uc @@ -0,0 +1,4 @@ +class NiceAxeAttachment extends NiceMeleeAttachment; +defaultproperties +{ MovementAnims(0)="JogF_Axe" MovementAnims(1)="JogB_Axe" MovementAnims(2)="JogL_Axe" MovementAnims(3)="JogR_Axe" TurnLeftAnim="TurnL_Axe" TurnRightAnim="TurnR_Axe" CrouchAnims(0)="CHwalkF_Axe" CrouchAnims(1)="CHwalkB_Axe" CrouchAnims(2)="CHwalkL_Axe" CrouchAnims(3)="CHwalkR_Axe" CrouchTurnRightAnim="CH_TurnR_Axe" CrouchTurnLeftAnim="CH_TurnL_Axe" IdleCrouchAnim="CHIdle_Axe" IdleWeaponAnim="Idle_Axe" IdleRestAnim="Idle_Axe" IdleChatAnim="Idle_Axe" IdleHeavyAnim="Idle_Axe" IdleRifleAnim="Idle_Axe" FireAnims(0)="Attack1_Axe" FireAnims(1)="Attack2_Axe" FireAnims(2)="Attack3_Axe" FireAnims(3)="Attack3_Axe" FireAltAnims(0)="Attack1_Axe" FireAltAnims(1)="Attack2_Axe" FireAltAnims(2)="Attack3_Axe" FireAltAnims(3)="Attack3_Axe" FireCrouchAnims(0)="CHAttack1_Axe" FireCrouchAnims(1)="CHAttack2_Axe" FireCrouchAnims(2)="CHAttack3_Axe" FireCrouchAnims(3)="CHAttack3_Axe" FireCrouchAltAnims(0)="CHAttack1_Axe" FireCrouchAltAnims(1)="CHAttack2_Axe" FireCrouchAltAnims(2)="CHAttack3_Axe" FireCrouchAltAnims(3)="CHAttack3_Axe" HitAnims(0)="HitF_Axe" HitAnims(1)="HitB_Axe" HitAnims(2)="HitL_Axe" HitAnims(3)="HitR_Axe" PostFireBlendStandAnim="Blend_Axe" PostFireBlendCrouchAnim="CHBlend_Axe" MeshRef="KF_Weapons3rd_Trip.Axe_3rd" +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxeFire.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxeFire.uc new file mode 100644 index 0000000..6251dd6 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxeFire.uc @@ -0,0 +1,4 @@ +class NiceAxeFire extends NiceMeleeFire; +defaultproperties +{ weaponRange=90.000000 damageDelay=0.600000 FireAnims(0)="Fire" FireAnims(1)="Fire2" FireAnims(2)="fire3" FireAnims(3)="Fire4" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" WideDamageMinHitAngle=0.750000 DamageType=Class'NicePack.NiceDamTypeAxe' DamageMax=175 FireAnimRate=0.893333 FireRate=1.100000 BotRefireRate=0.850000 +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxeFireB.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxeFireB.uc new file mode 100644 index 0000000..3c7928d --- /dev/null +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxeFireB.uc @@ -0,0 +1,4 @@ +class NiceAxeFireB extends NiceMeleeFire; +defaultproperties +{ weaponRange=90.000000 damageDelay=0.760000 FireAnims(0)="PowerAttack" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" DamageType=Class'NicePack.NiceDamTypeAxe' DamageMax=275 bWaitForRelease=True FireRate=1.333000 BotRefireRate=0.850000 +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxePickup.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxePickup.uc new file mode 100644 index 0000000..3e296c8 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxePickup.uc @@ -0,0 +1,4 @@ +class NiceAxePickup extends NiceWeaponPickup; +defaultproperties +{ Weight=5.000000 cost=250 PowerValue=56 SpeedValue=32 RangeValue=-20 Description="A sturdy fireman's axe." ItemName="Axe" ItemShortName="Axe" CorrespondingPerkIndex=4 VariantClasses(0)=Class'KFMod.GoldenKatanaPickup' InventoryType=Class'NicePack.NiceAxe' PickupMessage="You got the Fire Axe." PickupSound=Sound'KF_AxeSnd.Axe_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.melee.Axe_Pickup' CollisionRadius=27.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceDamTypeAxe.uc b/sources/Weapons/Playable/Melee/Axe/NiceDamTypeAxe.uc new file mode 100644 index 0000000..1b5b276 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Axe/NiceDamTypeAxe.uc @@ -0,0 +1,4 @@ +class NiceDamTypeAxe extends NiceDamageTypeVetBerserker; +defaultproperties +{ HeadShotDamageMult=1.300000 WeaponClass=Class'NicePack.NiceAxe' PawnDamageSounds(0)=SoundGroup'KF_AxeSnd.Axe_HitFlesh' VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymore.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymore.uc new file mode 100644 index 0000000..8a0a73c --- /dev/null +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymore.uc @@ -0,0 +1,4 @@ +class NiceClaymore extends NiceMeleeWeapon; +defaultproperties +{ weaponRange=100.000000 BloodSkinSwitchArray=0 BloodyMaterialRef="KF_Weapons4_Trip_T.Claymore_Bloody_cmb" bSpeedMeUp=True Weight=6.000000 StandardDisplayFOV=75.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Claymore' bIsTier2Weapon=True MeshRef="KF_Wep_Claymore.Claymore_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Claymore_cmb" SelectSoundRef="KF_ClaymoreSnd.WEP_Claymore_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Claymore_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Claymore" FireModeClass(0)=Class'NicePack.NiceClaymoreFire' FireModeClass(1)=Class'NicePack.NiceClaymoreFireB' AIRating=0.400000 CurrentRating=0.600000 Description="A medieval claymore sword." DisplayFOV=75.000000 Priority=105 GroupOffset=4 PickupClass=Class'NicePack.NiceClaymorePickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceClaymoreAttachment' IconCoords=(X1=246,Y1=80,X2=332,Y2=106) ItemName="Claymore Sword" +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreAttachment.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreAttachment.uc new file mode 100644 index 0000000..81a749b --- /dev/null +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreAttachment.uc @@ -0,0 +1,4 @@ +class NiceClaymoreAttachment extends NiceMeleeAttachment; +defaultproperties +{ MovementAnims(0)="JogF_Katana" MovementAnims(1)="JogB_Katana" MovementAnims(2)="JogL_Katana" MovementAnims(3)="JogR_Katana" TurnLeftAnim="TurnL_Katana" TurnRightAnim="TurnR_Katana" CrouchAnims(0)="CHWalkF_Katana" CrouchAnims(1)="CHWalkB_Katana" CrouchAnims(2)="CHWalkL_Katana" CrouchAnims(3)="CHWalkR_Katana" CrouchTurnRightAnim="CH_TurnR_Katana" CrouchTurnLeftAnim="CH_TurnL_Katana" IdleCrouchAnim="CHIdle_Katana" IdleWeaponAnim="Idle_Katana" IdleRestAnim="Idle_Katana" IdleChatAnim="Idle_Katana" IdleHeavyAnim="Idle_Katana" IdleRifleAnim="Idle_Katana" FireAnims(0)="FastAttack1_Claymore" FireAnims(1)="FastAttack2_Claymore" FireAnims(2)="FastAttack3_Claymore" FireAnims(3)="FastAttack4_Claymore" FireAltAnims(0)="HardAttack1_Claymore" FireAltAnims(1)="HardAttack1_Claymore" FireAltAnims(2)="HardAttack1_Claymore" FireAltAnims(3)="HardAttack1_Claymore" FireCrouchAnims(0)="CHFastAttack1_Claymore" FireCrouchAnims(1)="CHFastAttack2_Claymore" FireCrouchAnims(2)="CHFastAttack3_Claymore" FireCrouchAnims(3)="CHFastAttack4_Claymore" FireCrouchAltAnims(0)="CHHardAttack1_Claymore" FireCrouchAltAnims(1)="CHHardAttack1_Claymore" FireCrouchAltAnims(2)="CHHardAttack1_Claymore" FireCrouchAltAnims(3)="CHHardAttack1_Claymore" HitAnims(0)="HitF_Katana" HitAnims(1)="HitB_Katana" HitAnims(2)="HitL_Katana" HitAnims(3)="HitR_Katana" PostFireBlendStandAnim="Blend_Katana" PostFireBlendCrouchAnim="CHBlend_Katana" MeshRef="KF_Weapons3rd3_Trip.Claymore_3rd" +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFire.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFire.uc new file mode 100644 index 0000000..954e1c6 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFire.uc @@ -0,0 +1,4 @@ +class NiceClaymoreFire extends NiceMeleeFire; +defaultproperties +{ weaponRange=110.000000 damageDelay=0.570000 FireAnims(0)="Fire" FireAnims(1)="Fire2" FireAnims(2)="fire3" FireAnims(3)="Fire4" FireAnims(4)="Fire5" FireAnims(5)="Fire6" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_ClaymoreSnd.Claymore_Impact_Flesh" WideDamageMinHitAngle=0.833333 DamageType=Class'NicePack.NiceDamTypeClaymore' DamageMax=210 bWaitForRelease=True FireAnimRate=1.105263 FireRate=0.950000 BotRefireRate=1.000000 +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFireB.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFireB.uc new file mode 100644 index 0000000..68765fb --- /dev/null +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFireB.uc @@ -0,0 +1,4 @@ +class NiceClaymoreFireB extends NiceMeleeFire; +defaultproperties +{ weaponRange=110.000000 damageDelay=0.970000 FireAnims(0)="HardAttack" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_ClaymoreSnd.Claymore_Impact_Flesh" WideDamageMinHitAngle=0.600000 DamageType=Class'NicePack.NiceDamTypeClaymore' DamageMax=320 bWaitForRelease=True FireRate=1.250000 BotRefireRate=1.100000 +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymorePickup.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymorePickup.uc new file mode 100644 index 0000000..e8ced08 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymorePickup.uc @@ -0,0 +1,5 @@ +class NiceClaymorePickup extends NiceWeaponPickup; +defaultproperties +{ + cost=1000 Weight=6.000000 PowerValue=75 SpeedValue=40 RangeValue=-23 Description="A medieval claymore sword." ItemName="Claymore Sword" ItemShortName="Claymore" CorrespondingPerkIndex=4 InventoryType=Class'NicePack.NiceClaymore' PickupMessage="You got the Claymore Sword." PickupSound=Sound'KF_ClaymoreSnd.foley.WEP_Claymore_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.melee.Claymore_Pickup' CollisionRadius=27.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceDamTypeClaymore.uc b/sources/Weapons/Playable/Melee/Claymore/NiceDamTypeClaymore.uc new file mode 100644 index 0000000..2d45164 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Claymore/NiceDamTypeClaymore.uc @@ -0,0 +1,4 @@ +class NiceDamTypeClaymore extends NiceDamageTypeVetBerserker; +defaultproperties +{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceClaymore' PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh' KDamageImpulse=3000.000000 VehicleDamageScaling=0.500000 +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceDamTypeKatana.uc b/sources/Weapons/Playable/Melee/Katana/NiceDamTypeKatana.uc new file mode 100644 index 0000000..7cad523 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Katana/NiceDamTypeKatana.uc @@ -0,0 +1,4 @@ +class NiceDamTypeKatana extends NiceDamageTypeVetBerserker; +defaultproperties +{ HeadShotDamageMult=1.300000 WeaponClass=Class'NicePack.NiceKatana' PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh' VehicleDamageScaling=0.500000 +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatana.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatana.uc new file mode 100644 index 0000000..af33800 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatana.uc @@ -0,0 +1,4 @@ +class NiceKatana extends NiceMeleeWeapon; +defaultproperties +{ weaponRange=90.000000 BloodSkinSwitchArray=0 BloodyMaterialRef="KF_Weapons2_Trip_T.melee.Katana_Bloody_cmb" bSpeedMeUp=True Weight=3.000000 StandardDisplayFOV=75.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Katana' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.Katana_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.melee.Katana_cmb" SelectSoundRef="KF_KatanaSnd.Katana_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.katana_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Katana" FireModeClass(0)=Class'NicePack.NiceKatanaFire' FireModeClass(1)=Class'NicePack.NiceKatanaFireB' AIRating=0.400000 CurrentRating=0.600000 Description="An incredibly sharp katana sword." DisplayFOV=75.000000 Priority=110 GroupOffset=5 PickupClass=Class'NicePack.NiceKatanaPickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceKatanaAttachment' IconCoords=(X1=246,Y1=80,X2=332,Y2=106) ItemName="Katana" +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatanaAttachment.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatanaAttachment.uc new file mode 100644 index 0000000..ebeb395 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatanaAttachment.uc @@ -0,0 +1,4 @@ +class NiceKatanaAttachment extends NiceMeleeAttachment; +defaultproperties +{ MovementAnims(0)="JogF_Katana" MovementAnims(1)="JogB_Katana" MovementAnims(2)="JogL_Katana" MovementAnims(3)="JogR_Katana" TurnLeftAnim="TurnL_Katana" TurnRightAnim="TurnR_Katana" CrouchAnims(0)="CHWalkF_Katana" CrouchAnims(1)="CHWalkB_Katana" CrouchAnims(2)="CHWalkL_Katana" CrouchAnims(3)="CHWalkR_Katana" CrouchTurnRightAnim="CH_TurnR_Katana" CrouchTurnLeftAnim="CH_TurnL_Katana" IdleCrouchAnim="CHIdle_Katana" IdleWeaponAnim="Idle_Katana" IdleRestAnim="Idle_Katana" IdleChatAnim="Idle_Katana" IdleHeavyAnim="Idle_Katana" IdleRifleAnim="Idle_Katana" FireAnims(0)="FastAttack1_Katana" FireAnims(1)="FastAttack2_Katana" FireAnims(2)="FastAttack3_Katana" FireAnims(3)="FastAttack4_Katana" FireAltAnims(0)="HardAttack1_Katana" FireAltAnims(1)="HardAttack1_Katana" FireAltAnims(2)="HardAttack1_Katana" FireAltAnims(3)="HardAttack1_Katana" FireCrouchAnims(0)="CHFastAttack1_Katana" FireCrouchAnims(1)="CHFastAttack2_Katana" FireCrouchAnims(2)="CHFastAttack3_Katana" FireCrouchAnims(3)="CHFastAttack4_Katana" FireCrouchAltAnims(0)="CHHardAttack1_Katana" FireCrouchAltAnims(1)="CHHardAttack1_Katana" FireCrouchAltAnims(2)="CHHardAttack1_Katana" FireCrouchAltAnims(3)="CHHardAttack1_Katana" HitAnims(0)="HitF_Katana" HitAnims(1)="HitB_Katana" HitAnims(2)="HitL_Katana" HitAnims(3)="HitR_Katana" PostFireBlendStandAnim="Blend_Katana" PostFireBlendCrouchAnim="CHBlend_Katana" MeshRef="KF_Weapons3rd_Trip.Katana_3rd" +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatanaFire.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatanaFire.uc new file mode 100644 index 0000000..4da6f8c --- /dev/null +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatanaFire.uc @@ -0,0 +1,4 @@ +class NiceKatanaFire extends NiceMeleeFire; +defaultproperties +{ weaponRange=95.000000 damageDelay=0.358209 FireAnims(0)="Fire" FireAnims(1)="Fire2" FireAnims(2)="fire3" FireAnims(3)="Fire4" FireAnims(4)="Fire5" FireAnims(5)="Fire6" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_KatanaSnd.Katana_HitFlesh" DamageType=Class'NicePack.NiceDamTypeKatana' DamageMax=135 FireAnimRate=0.893333 FireRate=0.750000 BotRefireRate=0.850000 +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatanaFireB.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatanaFireB.uc new file mode 100644 index 0000000..745d2c6 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatanaFireB.uc @@ -0,0 +1,4 @@ +class NiceKatanaFireB extends NiceMeleeFire; +defaultproperties +{ weaponRange=95.000000 damageDelay=0.650000 FireAnims(0)="HardAttack" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" WideDamageMinHitAngle=0.650000 DamageType=Class'NicePack.NiceDamTypeKatana' DamageMax=205 bWaitForRelease=True FireRate=1.000000 BotRefireRate=0.850000 +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatanaPickup.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatanaPickup.uc new file mode 100644 index 0000000..41cbf54 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatanaPickup.uc @@ -0,0 +1,4 @@ +class NiceKatanaPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=3.000000 cost=750 PowerValue=60 SpeedValue=55 RangeValue=-21 Description="An incredibly sharp katana sword." ItemName="Katana" ItemShortName="Katana" CorrespondingPerkIndex=4 VariantClasses(0)=Class'KFMod.GoldenKatanaPickup' InventoryType=Class'NicePack.NiceKatana' PickupMessage="You got the Katana." PickupSound=Sound'KF_AxeSnd.Axe_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.melee.Katana_pickup' CollisionRadius=27.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceDamTypeKnife.uc b/sources/Weapons/Playable/Melee/Knife/NiceDamTypeKnife.uc new file mode 100644 index 0000000..88d2da2 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Knife/NiceDamTypeKnife.uc @@ -0,0 +1,4 @@ +class NiceDamTypeKnife extends NiceDamageTypeVetBerserker; +defaultproperties +{ HeadShotDamageMult=1.100000 WeaponClass=Class'NicePack.NiceKnife' KDamageImpulse=1500.000000 VehicleDamageScaling=0.500000 +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceKnife.uc b/sources/Weapons/Playable/Melee/Knife/NiceKnife.uc new file mode 100644 index 0000000..9cb3478 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Knife/NiceKnife.uc @@ -0,0 +1,4 @@ +class NiceKnife extends NiceMeleeWeapon; +defaultproperties +{ weaponRange=65.000000 BloodyMaterial=Combiner'KF_Weapons_Trip_T.melee.knife_bloody_cmb' BloodSkinSwitchArray=0 bSpeedMeUp=True HudImage=Texture'KillingFloorHUD.WeaponSelect.knife_unselected' SelectedHudImage=Texture'KillingFloorHUD.WeaponSelect.knife' Weight=0.000000 bKFNeverThrow=True StandardDisplayFOV=75.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Knife' bIsTier2Weapon=True FireModeClass(0)=Class'NicePack.NiceKnifeFire' FireModeClass(1)=Class'NicePack.NiceKnifeFireB' SelectSound=SoundGroup'KF_KnifeSnd.Knife_Select' AIRating=0.200000 CurrentRating=0.200000 Description="Military Combat Knife" DisplayFOV=75.000000 Priority=45 GroupOffset=1 PickupClass=Class'NicePack.NiceKnifePickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceKnifeAttachment' IconCoords=(X1=246,Y1=80,X2=332,Y2=106) ItemName="Knife" Mesh=SkeletalMesh'KF_Weapons_Trip.Knife_Trip' Skins(0)=Combiner'KF_Weapons_Trip_T.melee.knife_cmb' +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceKnifeAttachment.uc b/sources/Weapons/Playable/Melee/Knife/NiceKnifeAttachment.uc new file mode 100644 index 0000000..f898990 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Knife/NiceKnifeAttachment.uc @@ -0,0 +1,4 @@ +class NiceKnifeAttachment extends NiceMeleeAttachment; +defaultproperties +{ MovementAnims(0)="JogF_Knife" MovementAnims(1)="JogB_Knife" MovementAnims(2)="JogL_Knife" MovementAnims(3)="JogR_Knife" TurnLeftAnim="TurnL_Knife" TurnRightAnim="TurnR_Knife" CrouchAnims(0)="CHwalkF_Knife" CrouchAnims(1)="CHwalkB_Knife" CrouchAnims(2)="CHwalkL_Knife" CrouchAnims(3)="CHwalkR_Knife" CrouchTurnRightAnim="CH_TurnR_Knife" CrouchTurnLeftAnim="CH_TurnL_Knife" IdleCrouchAnim="CHIdle_Knife" IdleWeaponAnim="Idle_Knife" IdleRestAnim="Idle_Knife" IdleChatAnim="Idle_Knife" IdleHeavyAnim="Idle_Knife" IdleRifleAnim="Idle_Knife" FireAnims(0)="Attack2_Knife" FireAnims(1)="Attack2_Knife" FireAnims(2)="Attack2_Knife" FireAnims(3)="Attack2_Knife" FireAltAnims(0)="Attack1_Knife" FireAltAnims(1)="Attack1_Knife" FireAltAnims(2)="Attack1_Knife" FireAltAnims(3)="Attack1_Knife" FireCrouchAnims(0)="CHAttack2_Knife" FireCrouchAnims(1)="CHAttack2_Knife" FireCrouchAnims(2)="CHAttack2_Knife" FireCrouchAnims(3)="CHAttack2_Knife" FireCrouchAltAnims(0)="CHAttack1_Knife" FireCrouchAltAnims(1)="CHAttack1_Knife" FireCrouchAltAnims(2)="CHAttack1_Knife" FireCrouchAltAnims(3)="CHAttack1_Knife" HitAnims(0)="HitF_Knife" HitAnims(1)="HitB_Knife" HitAnims(2)="HitL_Knife" HitAnims(3)="HitR_Knife" PostFireBlendStandAnim="Blend_Knife" PostFireBlendCrouchAnim="CHBlend_Knife" Mesh=SkeletalMesh'KF_Weapons3rd_Trip.Knife_3rd' +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceKnifeFire.uc b/sources/Weapons/Playable/Melee/Knife/NiceKnifeFire.uc new file mode 100644 index 0000000..e7e637f --- /dev/null +++ b/sources/Weapons/Playable/Melee/Knife/NiceKnifeFire.uc @@ -0,0 +1,26 @@ +class NiceKnifeFire extends NiceMeleeFire; +var name LastFireAnim; +/*function name GetCorrectAnim(bool bLoop, bool bAimed){ + FireAnim = super.GetCorrectAnim(bLoop, bAimed); + if( LastFireAnim == FireAnims[1] && FireAnim == FireAnims[2] + || LastFireAnim == FireAnims[2] && FireAnim == FireAnims[1] + || LastFireAnim == FireAnims[2] && FireAnim == FireAnims[2]) + FireAnim = FireAnims[0]; + LastFireAnim = FireAnim; + return FireAnim; +}*/ +defaultproperties +{ + damageDelay=0.450000 + MeleeHitSounds(0)=SoundGroup'KF_KnifeSnd.Knife_HitFlesh' + FireAnims(0)="Fire" + FireAnims(1)="Fire2" + FireAnims(2)="fire3" + FireAnims(3)="Fire4" + HitEffectClass=Class'KFMod.KnifeHitEffect' + WideDamageMinHitAngle=0.750000 + DamageType=Class'NicePack.NiceDamTypeKnife' + DamageMax=19 + FireRate=0.600000 + BotRefireRate=0.300000 +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceKnifeFireB.uc b/sources/Weapons/Playable/Melee/Knife/NiceKnifeFireB.uc new file mode 100644 index 0000000..e8bd0c3 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Knife/NiceKnifeFireB.uc @@ -0,0 +1,4 @@ +class NiceKnifeFireB extends NiceMeleeFire; +defaultproperties +{ weaponRange=95.000000 damageDelay=0.600000 MeleeHitSounds(0)=SoundGroup'KF_KnifeSnd.Knife_HitFlesh' FireAnims(0)="Stab" HitEffectClass=Class'KFMod.KnifeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" DamageType=Class'NicePack.NiceDamTypeKnife' DamageMax=55 bWaitForRelease=True FireRate=1.100000 BotRefireRate=1.100000 +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceKnifePickup.uc b/sources/Weapons/Playable/Melee/Knife/NiceKnifePickup.uc new file mode 100644 index 0000000..ce322f3 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Knife/NiceKnifePickup.uc @@ -0,0 +1,4 @@ +class NiceKnifePickup extends NiceWeaponPickup; +defaultproperties +{ Weight=0.000000 cost=50 PowerValue=5 SpeedValue=60 RangeValue=-20 Description="Basic kitchen utensil. Sharp." ItemName="Knife" ItemShortName="Knife" CorrespondingPerkIndex=4 InventoryType=Class'NicePack.NiceKnife' PickupMessage="You got the Kitchen Knife." PickupSound=None PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.melee.Knife_pickup' CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceDamTypeMachete.uc b/sources/Weapons/Playable/Melee/Machete/NiceDamTypeMachete.uc new file mode 100644 index 0000000..7e02d72 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Machete/NiceDamTypeMachete.uc @@ -0,0 +1,4 @@ +class NiceDamTypeMachete extends NiceDamageTypeVetBerserker; +defaultproperties +{ WeaponClass=Class'NicePack.NiceMachete' PawnDamageSounds(0)=SoundGroup'KF_AxeSnd.Axe_HitFlesh' KDamageImpulse=3000.000000 VehicleDamageScaling=0.500000 +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceMachete.uc b/sources/Weapons/Playable/Melee/Machete/NiceMachete.uc new file mode 100644 index 0000000..bcddbf7 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Machete/NiceMachete.uc @@ -0,0 +1,4 @@ +class NiceMachete extends NiceMeleeWeapon; +defaultproperties +{ weaponRange=80.000000 BloodSkinSwitchArray=0 BloodyMaterialRef="KF_Weapons_Trip_T.melee.machete_bloody_cmb" bSpeedMeUp=True Weight=1.000000 StandardDisplayFOV=70.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Machete' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Machete_Trip" SkinRefs(0)="KF_Weapons_Trip_T.melee.Machete_cmb" SkinRefs(1)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SelectSoundRef="KF_MacheteSnd.Machete_Select" HudImageRef="KillingFloorHUD.WeaponSelect.machette_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.machette" FireModeClass(0)=Class'NicePack.NiceMacheteFire' FireModeClass(1)=Class'NicePack.NiceMacheteFireB' AIRating=0.400000 CurrentRating=0.400000 Description="A machete - commonly used for hacking through brush, or the limbs of ZEDs." DisplayFOV=70.000000 Priority=50 GroupOffset=2 PickupClass=Class'NicePack.NiceMachetePickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceMacheteAttachment' IconCoords=(Y1=407,X2=118,Y2=442) ItemName="Machete" +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceMacheteAttachment.uc b/sources/Weapons/Playable/Melee/Machete/NiceMacheteAttachment.uc new file mode 100644 index 0000000..5873169 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Machete/NiceMacheteAttachment.uc @@ -0,0 +1,4 @@ +class NiceMacheteAttachment extends NiceMeleeAttachment; +defaultproperties +{ MovementAnims(0)="JogF_Pipe" MovementAnims(1)="JogB_Pipe" MovementAnims(2)="JogL_Pipe" MovementAnims(3)="JogR_Pipe" TurnLeftAnim="TurnL_Pipe" TurnRightAnim="TurnR_Pipe" CrouchAnims(0)="CHwalkF_Pipe" CrouchAnims(1)="CHwalkB_Pipe" CrouchAnims(2)="CHwalkL_Pipe" CrouchAnims(3)="CHwalkR_Pipe" CrouchTurnRightAnim="CH_TurnR_Pipe" CrouchTurnLeftAnim="CH_TurnL_Pipe" IdleCrouchAnim="CHIdle_Pipe" IdleWeaponAnim="Idle_Pipe" IdleRestAnim="Idle_Pipe" IdleChatAnim="Idle_Pipe" IdleHeavyAnim="Idle_Pipe" IdleRifleAnim="Idle_Pipe" FireAnims(0)="Attack1_Pipe" FireAnims(1)="Attack2_Pipe" FireAnims(2)="Attack3_Pipe" FireAnims(3)="Attack4_Pipe" FireAltAnims(0)="Attack1_Pipe" FireAltAnims(1)="Attack2_Pipe" FireAltAnims(2)="Attack3_Pipe" FireAltAnims(3)="Attack4_Pipe" FireCrouchAnims(0)="CHAttack1_Pipe" FireCrouchAnims(1)="CHAttack2_Pipe" FireCrouchAnims(2)="CHAttack3_Pipe" FireCrouchAnims(3)="CHAttack3_Pipe" FireCrouchAltAnims(0)="CHAttack1_Pipe" FireCrouchAltAnims(1)="CHAttack2_Pipe" FireCrouchAltAnims(2)="CHAttack2_Pipe" FireCrouchAltAnims(3)="CHAttack3_Pipe" HitAnims(0)="HitF_Pipe" HitAnims(1)="HitB_Pipe" HitAnims(2)="HitL_Pipe" HitAnims(3)="HitR_Pipe" PostFireBlendStandAnim="Blend_Pipe" PostFireBlendCrouchAnim="CHBlend_Pipe" MeshRef="KF_Weapons3rd_Trip.machete_3rd" +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceMacheteFire.uc b/sources/Weapons/Playable/Melee/Machete/NiceMacheteFire.uc new file mode 100644 index 0000000..57fa71a --- /dev/null +++ b/sources/Weapons/Playable/Melee/Machete/NiceMacheteFire.uc @@ -0,0 +1,27 @@ +class NiceMacheteFire extends NiceMeleeFire; +var name LastFireAnim; +/*function name GetCorrectAnim(bool bLoop, bool bAimed){ + FireAnim = super.GetCorrectAnim(bLoop, bAimed); + if( LastFireAnim == FireAnims[1] && FireAnim == FireAnims[2] + || LastFireAnim == FireAnims[2] && FireAnim == FireAnims[1] + || LastFireAnim == FireAnims[2] && FireAnim == FireAnims[2]) + FireAnim = FireAnims[0]; + LastFireAnim = FireAnim; + return FireAnim; +}*/ +defaultproperties +{ + weaponRange=95.000000 + damageDelay=0.570000 + FireAnims(0)="Fire" + FireAnims(1)="Fire2" + FireAnims(2)="fire3" + FireAnims(3)="Fire4" + HitEffectClass=Class'KFMod.KnifeHitEffect' + MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" + DamageType=Class'NicePack.NiceDamTypeMachete' + DamageMax=70 + FireAnimRate=0.893333 + FireRate=0.710000 + BotRefireRate=0.710000 +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceMacheteFireB.uc b/sources/Weapons/Playable/Melee/Machete/NiceMacheteFireB.uc new file mode 100644 index 0000000..43c5630 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Machete/NiceMacheteFireB.uc @@ -0,0 +1,4 @@ +class NiceMacheteFireB extends NiceMeleeFire; +defaultproperties +{ weaponRange=95.000000 damageDelay=0.710000 FireAnims(0)="PowerAttack" HitEffectClass=Class'KFMod.KnifeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" DamageType=Class'NicePack.NiceDamTypeMachete' DamageMax=130 bWaitForRelease=True FireRate=1.100000 BotRefireRate=0.710000 +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceMachetePickup.uc b/sources/Weapons/Playable/Melee/Machete/NiceMachetePickup.uc new file mode 100644 index 0000000..9f9b2f7 --- /dev/null +++ b/sources/Weapons/Playable/Melee/Machete/NiceMachetePickup.uc @@ -0,0 +1,4 @@ +class NiceMachetePickup extends NiceWeaponPickup; +defaultproperties +{ Weight=1.000000 cost=200 PowerValue=35 SpeedValue=56 RangeValue=-20 Description="A machete - commonly used for hacking through brush, or the limbs of ZEDs." ItemName="Machete" ItemShortName="Machete" CorrespondingPerkIndex=4 InventoryType=Class'NicePack.NiceMachete' PickupMessage="You got a machete." PickupSound=Sound'KF_MacheteSnd.Machete_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.melee.machette_pickup' CollisionRadius=28.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/PKM/NiceDamTypePKM.uc b/sources/Weapons/Playable/PKM/NiceDamTypePKM.uc new file mode 100644 index 0000000..d09ff6b --- /dev/null +++ b/sources/Weapons/Playable/PKM/NiceDamTypePKM.uc @@ -0,0 +1,5 @@ +class NiceDamTypePKM extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NicePKM' DeathString="%k killed %o (PKM)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=8500.000000 KDeathVel=1000.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/PKM/NicePKM.uc b/sources/Weapons/Playable/PKM/NicePKM.uc new file mode 100644 index 0000000..688150d --- /dev/null +++ b/sources/Weapons/Playable/PKM/NicePKM.uc @@ -0,0 +1,4 @@ +class NicePKM extends NiceAssaultRifle; +defaultproperties +{ bSemiAutoFireEnabled=False reloadPreEndFrame=0.079000 reloadEndFrame=0.758000 reloadChargeEndFrame=0.858000 reloadMagStartFrame=0.356000 reloadChargeStartFrame=0.805000 MagazineBone="cartridge01" MagCapacity=80 ReloadRate=6.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 FlashBoneName="tip_1" WeaponReloadAnim="Reload_M14" bHasAimingMode=True IdleAimAnim="Iron_Idle" QuickPutDownTime=0.300000 QuickBringUpTime=0.300000 StandardDisplayFOV=65.000000 SleeveNum=2 TraderInfoTexture=Texture'HMG_T.PKM.PKM_Trader' bIsTier2Weapon=True MeshRef="HMG_A.pkmmesh" SkinRefs(0)="HMG_T.PKM.wpn_pkm" SkinRefs(1)="HMG_T.PKM.wpn_pkm_lenta" SkinRefs(2)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SelectSoundRef="HMG_S.PKM.pkm_draw" HudImageRef="HMG_T.PKM.PKM_Unselected" SelectedHudImageRef="HMG_T.PKM.PKM_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NicePKMFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The PKM (Kalashnikov's Machine-gun Modernized) adopted to service in 1969. It is a modernized, product-improved version of the PK (Pulemyot Kalashnikova)." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=190 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NicePKMPickup' PlayerViewOffset=(X=-10.000000,Y=18.000000,Z=-11.000000) BobDamping=5.000000 AttachmentClass=Class'NicePack.NicePKMAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="PKM" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/PKM/NicePKMAmmo.uc b/sources/Weapons/Playable/PKM/NicePKMAmmo.uc new file mode 100644 index 0000000..1304220 --- /dev/null +++ b/sources/Weapons/Playable/PKM/NicePKMAmmo.uc @@ -0,0 +1,5 @@ +class NicePKMAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NicePKMPickup' AmmoPickupAmount=80 MaxAmmo=240 InitialAmount=120 PickupClass=Class'NicePack.NicePKMAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Rounds 7.62mm" +} diff --git a/sources/Weapons/Playable/PKM/NicePKMAmmoPickup.uc b/sources/Weapons/Playable/PKM/NicePKMAmmoPickup.uc new file mode 100644 index 0000000..0bb8a5c --- /dev/null +++ b/sources/Weapons/Playable/PKM/NicePKMAmmoPickup.uc @@ -0,0 +1,4 @@ +class NicePKMAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=80 InventoryType=Class'NicePack.NicePKMAmmo' PickupMessage="7.62mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/PKM/NicePKMAttachment.uc b/sources/Weapons/Playable/PKM/NicePKMAttachment.uc new file mode 100644 index 0000000..0e2591b --- /dev/null +++ b/sources/Weapons/Playable/PKM/NicePKMAttachment.uc @@ -0,0 +1,9 @@ +class NicePKMAttachment extends NiceAttachment; +simulated function DoFlashEmitter(){ + if(mMuzFlash3rd == none){ mMuzFlash3rd = Spawn(mMuzFlashClass); AttachToBone(mMuzFlash3rd, 'wpn_silencer'); + } + if(mMuzFlash3rd != none) mMuzFlash3rd.SpawnParticle(1); +} +defaultproperties +{ mMuzFlashClass=Class'ScrnHMG.MuzzleFlash3rdPKM' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'ScrnHMG.PKMShellSpewer' ShellEjectBoneName="magazin" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="HMG_A.pkm3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.700000 +} diff --git a/sources/Weapons/Playable/PKM/NicePKMFire.uc b/sources/Weapons/Playable/PKM/NicePKMFire.uc new file mode 100644 index 0000000..91b13dd --- /dev/null +++ b/sources/Weapons/Playable/PKM/NicePKMFire.uc @@ -0,0 +1,4 @@ +class NicePKMFire extends NiceHeavyFire; +defaultproperties +{ ProjectileSpeed=41250.000000 MaxBurstLength=5 FireAimedAnim="Fire" RecoilRate=0.055000 maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 ShellEjectClass=Class'ScrnHMG.KFShellEjectPKM' ShellEjectBoneName="shell_13" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="HMG_S.PKM.pkm_shoot_mono" StereoFireSoundRef="HMG_S.PKM.pkm_shoot_stereo" NoAmmoSoundRef="HMG_S.PKM.pkm_empty" DamageType=Class'NicePack.NiceDamTypePKM' DamageMin=104 DamageMax=104 Momentum=10900.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.500000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.095000 AmmoClass=Class'NicePack.NicePKMAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ScrnHMG.MuzzleFlash1stPKM' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/PKM/NicePKMPickup.uc b/sources/Weapons/Playable/PKM/NicePKMPickup.uc new file mode 100644 index 0000000..b7c6dc5 --- /dev/null +++ b/sources/Weapons/Playable/PKM/NicePKMPickup.uc @@ -0,0 +1,5 @@ +class NicePKMPickup extends NiceWeaponPickup; +defaultproperties +{ + cost=1000 AmmoCost=160 BuyClipSize=80 PowerValue=55 SpeedValue=86 RangeValue=70 Description="The PKM (Kalashnikov's Machine-gun Modernized) adopted to service in 1969. It is a modernized, product-improved version of the PK (Pulemyot Kalashnikova)" ItemName="PKM" ItemShortName="PKM" AmmoItemName="PKM 7.62x54mmR" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NicePKM' PickupMessage="You picked up the PKM" PickupSound=Sound'HMG_S.PKM.pkm_holster' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.PkmSM' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mm.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mm.uc new file mode 100644 index 0000000..7c8427c --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mm.uc @@ -0,0 +1,26 @@ +class Nice9mm extends NiceSingle; +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ + super.PreloadAssets(Inv, bSkipRefCount); + // A bit of a temporary hack. + // There's currently no nice way to call preload assets function for a grenade, so just always load nails' resources + //class'NicePack.NiceNail'.static.PreloadAssets(); +} +defaultproperties +{ + DualClass=Class'NicePack.NiceDual9mm' + reloadPreEndFrame=0.117000 + reloadEndFrame=0.617000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.167000 + reloadChargeStartFrame=-1.000000 + HudImage=Texture'KillingFloorHUD.WeaponSelect.single_9mm_unselected' + SelectedHudImage=Texture'KillingFloorHUD.WeaponSelect.single_9mm' + FireModeClass(0)=Class'NicePack.Nice9mmFire' + SelectSound=Sound'KF_9MMSnd.9mm_Select' + Description="A 9mm Pistol. What it lacks in stopping power, it compensates for with a quick refire." + PickupClass=Class'NicePack.Nice9mmPickup' + AttachmentClass=Class'NicePack.Nice9mmAttachment' + ItemName="Beretta" + Mesh=SkeletalMesh'KF_Weapons_Trip.9mm_Trip' + Skins(0)=Combiner'KF_Weapons_Trip_T.Pistols.Ninemm_cmb' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmo.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmo.uc new file mode 100644 index 0000000..9365ee1 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmo.uc @@ -0,0 +1,5 @@ +class Nice9mmAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.Nice9mmPickup' AmmoPickupAmount=30 MaxAmmo=240 InitialAmount=60 PickupClass=Class'KFMod.SingleAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="9mm bullets" +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmoPickup.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmoPickup.uc new file mode 100644 index 0000000..0ceaa92 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmoPickup.uc @@ -0,0 +1,4 @@ +class Nice9mmAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.Nice9mmAmmo' RespawnTime=0.000000 PickupMessage="Rounds (9mm)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmAttachment.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAttachment.uc new file mode 100644 index 0000000..52f7fa9 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAttachment.uc @@ -0,0 +1,4 @@ +class Nice9mmAttachment extends NiceSingleAttachment; +defaultproperties +{ Mesh=SkeletalMesh'KF_Weapons3rd_Trip.Single9mm_3rd' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmFire.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmFire.uc new file mode 100644 index 0000000..17db5be --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmFire.uc @@ -0,0 +1,4 @@ +class Nice9mmFire extends NiceSingleFire; +defaultproperties +{ ProjectileSpeed=21300.000000 maxVerticalRecoilAngle=75 maxHorizontalRecoilAngle=35 StereoFireSound=SoundGroup'KF_9MMSnd.9mm_FireST' DamageType=Class'NicePack.NiceDamType9mm' FireSound=SoundGroup'KF_9MMSnd.9mm_Fire' NoAmmoSound=Sound'KF_9MMSnd.9mm_DryFire' AmmoClass=Class'NicePack.Nice9mmAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmPickup.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmPickup.uc new file mode 100644 index 0000000..28a220a --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmPickup.uc @@ -0,0 +1,4 @@ +class Nice9mmPickup extends NiceSinglePickup; +defaultproperties +{ bBackupWeapon=True cost=100 Description="A 9mm Pistol. What it lacks in stopping power, it compensates for with a quick refire." ItemName="Beretta" ItemShortName="Beretta" InventoryType=Class'NicePack.Nice9mm' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDamType9mm.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDamType9mm.uc new file mode 100644 index 0000000..e28498d --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDamType9mm.uc @@ -0,0 +1,5 @@ +class NiceDamType9mm extends NiceWeaponDamageType + abstract; +defaultproperties +{ HeadShotDamageMult=1.000000 WeaponClass=Class'NicePack.Nice9mm' DeathString="%k killed %o (Beretta)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=750.000000 KDeathVel=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mm.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mm.uc new file mode 100644 index 0000000..7051d4e --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mm.uc @@ -0,0 +1,4 @@ +class NiceDual9mm extends NiceDualies; +defaultproperties +{ SingleClass=Class'NicePack.Nice9mm' HudImage=Texture'KillingFloorHUD.WeaponSelect.dual_9mm_unselected' SelectedHudImage=Texture'KillingFloorHUD.WeaponSelect.dual_9mm' Weight=1.000000 FireModeClass(0)=Class'NicePack.NiceDual9mmFire' SelectSound=Sound'KFPlayerSound.getweaponout' Description="A pair of 9mm pistols. What they lack in stopping power, they compensate for with a quick refire." PickupClass=Class'NicePack.NiceDual9mmPickup' AttachmentClass=Class'NicePack.NiceDual9mmAttachment' ItemName="Dual Berettas" Mesh=SkeletalMesh'KF_Weapons_Trip.Dual9mm' Skins(0)=Combiner'KF_Weapons_Trip_T.Pistols.Ninemm_cmb' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmo.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmo.uc new file mode 100644 index 0000000..1583e0c --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmo.uc @@ -0,0 +1,5 @@ +class NiceDual9mmAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceDual9mmPickup' AmmoPickupAmount=15 MaxAmmo=240 InitialAmount=60 PickupClass=Class'NicePack.NiceDual9mmAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="Dual 9mm bullets" +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmoPickup.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmoPickup.uc new file mode 100644 index 0000000..f23d803 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDual9mmAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=15 InventoryType=Class'NicePack.NiceDual9mmAmmo' PickupMessage="Rounds (9mm)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAttachment.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAttachment.uc new file mode 100644 index 0000000..2d2c776 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAttachment.uc @@ -0,0 +1,4 @@ +class NiceDual9mmAttachment extends NiceDualiesAttachment; +defaultproperties +{ Mesh=SkeletalMesh'KF_Weapons3rd_Trip.Single9mm_3rd' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmFire.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmFire.uc new file mode 100644 index 0000000..326f8c4 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmFire.uc @@ -0,0 +1,4 @@ +class NiceDual9mmFire extends NiceDualiesFire; +defaultproperties +{ ProjectileSpeed=19000.000000 maxVerticalRecoilAngle=75 maxHorizontalRecoilAngle=35 StereoFireSound=SoundGroup'KF_9MMSnd.9mm_FireST' DamageType=Class'NicePack.NiceDamType9mm' FireSound=SoundGroup'KF_9MMSnd.9mm_Fire' NoAmmoSound=Sound'KF_9MMSnd.9mm_DryFire' AmmoClass=Class'NicePack.NiceDual9mmAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmPickup.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmPickup.uc new file mode 100644 index 0000000..45fe85a --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmPickup.uc @@ -0,0 +1,4 @@ +class NiceDual9mmPickup extends NiceDualiesPickup; +defaultproperties +{ bBackupWeapon=True cost=200 ItemName="Dual Berettas" ItemShortName="Dual Berettas" InventoryType=Class'NicePack.NiceDual9mm' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlus.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlus.uc new file mode 100644 index 0000000..fb15080 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlus.uc @@ -0,0 +1,18 @@ +class Nice9mmPlus extends NiceSingle; +simulated function AltFire(float F){ + if(bIsDual) super.AltFire(F); + else ToggleLaser(); +} +simulated function SecondDoToggle(){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) LaserType = 1; + else LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ DualClass=Class'NicePack.NiceDual9mmPlus' bUseFlashlightToToggle=True reloadPreEndFrame=0.117000 reloadEndFrame=0.617000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.167000 reloadChargeStartFrame=-1.000000 bTorchEnabled=True SleeveNum=0 TraderInfoTexture=Texture'NicePackT.NinePP.HUD_Single_Trader' MeshRef="NicePackA.NinePP.Single_1P" SkinRefs(1)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SkinRefs(2)="ScrnWeaponPack_T.MedicPistol.frame_cmb" SkinRefs(3)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SkinRefs(4)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SelectSoundRef="KF_9MMSnd.9mm_Select" HudImageRef="NicePackT.NinePP.HUD_Single_UnSelected" SelectedHudImageRef="NicePackT.NinePP.HUD_Single_Selected" FireModeClass(0)=Class'NicePack.Nice9mmPlusFire' Description="A 9mm handgun, with a functional laser sight and flashlight. The barrel has been replaced with one that can chamber hotter ammunition loads, meaning faster bullets, meaning more damage!" GroupOffset=3 PickupClass=Class'NicePack.Nice9mmPlusPickup' AttachmentClass=Class'NicePack.Nice9mmPlusAttachment' ItemName="Beretta" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmo.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmo.uc new file mode 100644 index 0000000..198d3f0 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmo.uc @@ -0,0 +1,4 @@ +class Nice9mmPlusAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.Nice9mmPlusPickup' AmmoPickupAmount=15 MaxAmmo=150 InitialAmount=60 PickupClass=Class'NicePack.Nice9mmPlusAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="9mm +P+ bullets" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmoPickup.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmoPickup.uc new file mode 100644 index 0000000..64faabb --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmoPickup.uc @@ -0,0 +1,4 @@ +class Nice9mmPlusAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=15 InventoryType=Class'NicePack.Nice9mmPlusAmmo' RespawnTime=0.000000 PickupMessage="Rounds (9mm +P+)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAttachment.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAttachment.uc new file mode 100644 index 0000000..ec8a11b --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAttachment.uc @@ -0,0 +1,4 @@ +class Nice9mmPlusAttachment extends NiceSingleAttachment; +defaultproperties +{ MeshRef="NicePackA.NinePP.Single_3P" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusFire.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusFire.uc new file mode 100644 index 0000000..ec097ac --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusFire.uc @@ -0,0 +1,4 @@ +class Nice9mmPlusFire extends NiceSingleFire; +defaultproperties +{ ProjectileSpeed=21300.000000 maxVerticalRecoilAngle=0 maxHorizontalRecoilAngle=0 FireSoundRef="NicePackSnd.NinePP.Fire1" StereoFireSoundRef="NicePackSnd.NinePP.Fire1" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamType9mmPlus' FireRate=0.250000 AmmoClass=Class'NicePack.Nice9mmPlusAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusPickup.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusPickup.uc new file mode 100644 index 0000000..674e77b --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusPickup.uc @@ -0,0 +1,4 @@ +class Nice9mmPlusPickup extends NiceSinglePickup; +defaultproperties +{ bBackupWeapon=True cost=100 AmmoCost=8 Description="A 9mm handgun, with a functional laser sight and flashlight. The barrel has been replaced with one that can chamber hotter ammunition loads, meaning faster bullets, meaning more damage!" ItemName="Beretta" ItemShortName="9mm" InventoryType=Class'NicePack.Nice9mmPlus' PickupMessage="You got the 9mm!" StaticMesh=StaticMesh'NicePackSM.NinePP.Pickup' DrawScale=0.100000 +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDamType9mmPlus.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDamType9mmPlus.uc new file mode 100644 index 0000000..3a03fce --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDamType9mmPlus.uc @@ -0,0 +1,5 @@ +class NiceDamType9mmPlus extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ goodDecapMod=0.500000 WeaponClass=Class'NicePack.Nice9mmPlus' DeathString="%k killed %o (Beretta)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=750.000000 KDeathVel=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlus.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlus.uc new file mode 100644 index 0000000..b7f64d2 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlus.uc @@ -0,0 +1,17 @@ +class NiceDual9mmPlus extends NiceDualies; +simulated function SecondDoToggle(){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) LaserType = 1; + else LaserType = 0; + ApplyLaserState(); +} +simulated function ApplyLaserState(){ + super(NiceWeapon).ApplyLaserState(); +} +defaultproperties +{ SingleClass=Class'NicePack.Nice9mmPlus' bUseFlashlightToToggle=True Weight=1.000000 bTorchEnabled=True SleeveNum=0 TraderInfoTexture=Texture'NicePackT.NinePP.HUD_Dual_Trader' MeshRef="NicePackA.NinePP.Dual_1P" SkinRefs(1)="ScrnWeaponPack_T.MedicPistol.NinePP.Frame_cmb" SkinRefs(2)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SkinRefs(3)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SkinRefs(4)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SelectSoundRef="KFPlayerSound.getweaponout" HudImageRef="NicePackT.NinePP.HUD_Dual_UnSelected" SelectedHudImageRef="NicePackT.NinePP.HUD_Dual_Selected" FireModeClass(0)=Class'NicePack.NiceDual9mmPlusFire' Description="A pair of custom 9mm +P+ handguns. These have been improved with a laser sight and more powerful ammunition" GroupOffset=4 PickupClass=Class'NicePack.NiceDual9mmPickup' AttachmentClass=Class'NicePack.NiceDual9mmPlusAttachment' ItemName="Dual Berettas" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmo.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmo.uc new file mode 100644 index 0000000..0040d1b --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmo.uc @@ -0,0 +1,4 @@ +class NiceDual9mmPlusAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceDual9mmPlusPickup' AmmoPickupAmount=15 MaxAmmo=150 InitialAmount=60 PickupClass=Class'NicePack.NiceDual9mmPlusAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="9mm +P+ bullets" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmoPickup.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmoPickup.uc new file mode 100644 index 0000000..7e24afc --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDual9mmPlusAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=15 InventoryType=Class'NicePack.NiceDual9mmPlusAmmo' PickupMessage="Rounds (9mm +P+)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAttachment.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAttachment.uc new file mode 100644 index 0000000..99c5fed --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAttachment.uc @@ -0,0 +1,4 @@ +class NiceDual9mmPlusAttachment extends NiceDualiesAttachment; +defaultproperties +{ BrotherMesh=SkeletalMesh'NicePackA.NinePP.Single_3P' MeshRef="NicePackA.NinePP.Single_3P" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusFire.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusFire.uc new file mode 100644 index 0000000..4a61d57 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusFire.uc @@ -0,0 +1,4 @@ +class NiceDual9mmPlusFire extends NiceDualiesFire; +defaultproperties +{ ProjectileSpeed=21300.000000 maxVerticalRecoilAngle=0 maxHorizontalRecoilAngle=0 FireSoundRef="NicePackSnd.NinePP.Fire1" StereoFireSoundRef="NicePackSnd.NinePP.Fire1" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamType9mmPlus' Momentum=10000.000000 bWaitForRelease=False FireRate=0.125000 AmmoClass=Class'NicePack.NiceDual9mmPlusAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusPickup.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusPickup.uc new file mode 100644 index 0000000..3abb66e --- /dev/null +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusPickup.uc @@ -0,0 +1,4 @@ +class NiceDual9mmPlusPickup extends NiceDualiesPickup; +defaultproperties +{ bBackupWeapon=True cost=200 AmmoCost=16 Description="A pair of custom 9mm handguns. These have been improved with a laser sight and more powerful ammunition" ItemName="Dual Berettas" ItemShortName="Dual Berettas" InventoryType=Class'NicePack.NiceDual9mmPlus' PickupMessage="You got the Dual 9mm +P+!" +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColt.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColt.uc new file mode 100644 index 0000000..def2997 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColt.uc @@ -0,0 +1,8 @@ +class NiceColt extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 6 shells during 132 frames tops, with first shell loaded at frame 36, with 11 frames between load moments + generateReloadStages(6, 132, 36, 11); +} +defaultproperties +{ reloadType=RTYPE_SINGLE alwaysPlayAnimEnd=True FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) MagCapacity=6 ReloadRate=6.100000 ReloadAnim="Reload" ReloadAnimRate=1.200000 bHoldToReload=True WeaponReloadAnim="Reload_Revolver" Weight=5.000000 bHasAimingMode=True IdleAimAnim="IronIdle" StandardDisplayFOV=70.000000 SleeveNum=0 TraderInfoTexture=Texture'ScrnWeaponPack_T.Colt.Trader_WColt' MeshRef="ScrnWeaponPack_A.colt_weapon" SkinRefs(1)="ScrnWeaponPack_T.Colt.ColtV2_T" HudImageRef="ScrnWeaponPack_T.Colt.WColt_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.Colt.WColt" ZoomedDisplayFOV=65.000000 FireModeClass(0)=Class'NicePack.NiceColtFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectSound=Sound'KF_9MMSnd.9mm_Select' AIRating=0.250000 CurrentRating=0.250000 bShowChargingBar=True Description="The Colt Python is a double action handgun chambered for the .357 Magnum cartridge, built on Colt's large I-frame. Pythons have a reputation for accuracy, smooth trigger pull, and a tight cylinder lock-up." DisplayFOV=70.000000 Priority=110 InventoryGroup=2 GroupOffset=15 PickupClass=Class'NicePack.NiceColtPickup' PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceColtAttachment' IconCoords=(X1=434,Y1=253,X2=506,Y2=292) ItemName="Colt Python" +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmo.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmo.uc new file mode 100644 index 0000000..834d04a --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmo.uc @@ -0,0 +1,5 @@ +class NiceColtAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceColtPickup' AmmoPickupAmount=6 MaxAmmo=96 InitialAmount=24 PickupClass=Class'NicePack.NiceColtAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName=".357 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmoPickup.uc new file mode 100644 index 0000000..80fab5b --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceColtAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=6 InventoryType=Class'NicePack.NiceColtAmmo' RespawnTime=0.000000 PickupMessage=".357 Ammo" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtAttachment.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtAttachment.uc new file mode 100644 index 0000000..67b365c --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtAttachment.uc @@ -0,0 +1,4 @@ +class NiceColtAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol' mTracerClass=Class'KFMod.KFLargeTracer' MovementAnims(0)="JogF_Single9mm" MovementAnims(1)="JogB_Single9mm" MovementAnims(2)="JogL_Single9mm" MovementAnims(3)="JogR_Single9mm" TurnLeftAnim="TurnL_Single9mm" TurnRightAnim="TurnR_Single9mm" CrouchAnims(0)="CHwalkF_Single9mm" CrouchAnims(1)="CHwalkB_Single9mm" CrouchAnims(2)="CHwalkL_Single9mm" CrouchAnims(3)="CHwalkR_Single9mm" CrouchTurnRightAnim="CH_TurnR_Single9mm" CrouchTurnLeftAnim="CH_TurnL_Single9mm" IdleCrouchAnim="CHIdle_Single9mm" IdleWeaponAnim="Idle_Single9mm" IdleRestAnim="Idle_Single9mm" IdleChatAnim="Idle_Single9mm" IdleHeavyAnim="Idle_Single9mm" IdleRifleAnim="Idle_Single9mm" FireAnims(0)="Fire_Single9mm" FireAnims(1)="Fire_Single9mm" FireAnims(2)="Fire_Single9mm" FireAnims(3)="Fire_Single9mm" FireAltAnims(0)="Fire_Single9mm" FireAltAnims(1)="Fire_Single9mm" FireAltAnims(2)="Fire_Single9mm" FireAltAnims(3)="Fire_Single9mm" FireCrouchAnims(0)="CHFire_Single9mm" FireCrouchAnims(1)="CHFire_Single9mm" FireCrouchAnims(2)="CHFire_Single9mm" FireCrouchAnims(3)="CHFire_Single9mm" FireCrouchAltAnims(0)="CHFire_Single9mm" FireCrouchAltAnims(1)="CHFire_Single9mm" FireCrouchAltAnims(2)="CHFire_Single9mm" FireCrouchAltAnims(3)="CHFire_Single9mm" HitAnims(0)="HitF_Single9mm" HitAnims(1)="HitB_Single9mm" HitAnims(2)="HitL_Single9mm" HitAnims(3)="HitR_Single9mm" PostFireBlendStandAnim="Blend_Single9mm" PostFireBlendCrouchAnim="CHBlend_Single9mm" MeshRef="ScrnWeaponPack_A.W_Colt_Python_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtFire.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtFire.uc new file mode 100644 index 0000000..803df43 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtFire.uc @@ -0,0 +1,4 @@ +class NiceColtFire extends NiceFire; +defaultproperties +{ RecoilRate=0.850000 maxVerticalRecoilAngle=150 maxHorizontalRecoilAngle=75 FireSoundRef="ScrnWeaponPack_SND.Colt.357_fire3" StereoFireSoundRef="ScrnWeaponPack_SND.Colt.ScrnWeaponPack.357_fire3_ST" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeColt' DamageMin=175 DamageMax=175 Momentum=10000.000000 bWaitForRelease=True bAttachSmokeEmitter=True TransientSoundVolume=2.500000 FireAnimRate=1.200000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.900000 AmmoClass=Class'NicePack.NiceColtAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=10000.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(X=6.000000,Y=1.000000,Z=8.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.350000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=30.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtPickup.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtPickup.uc new file mode 100644 index 0000000..c05c1ce --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtPickup.uc @@ -0,0 +1,4 @@ +class NiceColtPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=5.000000 cost=1500 AmmoCost=40 BuyClipSize=6 PowerValue=85 SpeedValue=20 RangeValue=35 Description="The Colt Python is a double action handgun chambered for the .357 Magnum cartridge, built on Colt's large I-frame. Pythons have a reputation for accuracy, smooth trigger pull, and a tight cylinder lock-up." ItemName="Colt Python" ItemShortName="Colt" AmmoItemName=".357" CorrespondingPerkIndex=2 EquipmentCategoryID=1 InventoryType=Class'NicePack.NiceColt' PickupMessage="You got the Colt Python handgun" PickupSound=Sound'KF_9MMSnd.9mm_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.WColt_Pickup' CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColt.uc b/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColt.uc new file mode 100644 index 0000000..a407674 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColt.uc @@ -0,0 +1,5 @@ +class NiceDamTypeColt extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ MaxPenetrations=1 PenDmgReduction=0.500000 HeadShotDamageMult=1.300000 WeaponClass=Class'NicePack.NiceColt' DeathString="%k killed %o (Colt Python)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=12000.000000 KDeathVel=800.000000 KDeathUpKick=160.000000 VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColtProj.uc b/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColtProj.uc new file mode 100644 index 0000000..a94fe96 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColtProj.uc @@ -0,0 +1,5 @@ +class NiceDamTypeColtProj extends NiceDamTypeShotgun + abstract; +defaultproperties +{ DeathString="%k killed %o (Colt Python)." +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContender.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContender.uc new file mode 100644 index 0000000..2d35308 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContender.uc @@ -0,0 +1,15 @@ +class NiceContender extends NiceScopedWeapon; +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 3 / 37; + reloadDesc.trashStartFrame = 21 / 37; + reloadDesc.resumeFrame = 13 / 37; + reloadDesc.speedFrame = 3 / 37; + reloadDesc.animName = 'Fire'; + autoReloadsDescriptions[0] = reloadDesc; + super.PostBeginPlay(); +} +defaultproperties +{ lenseMaterialID=1 scopePortalFOVHigh=8.000000 scopePortalFOV=8.000000 tileSize=512 ZoomMatRef="NicePackT.Contender.gdcw_acog_FB" ScriptedTextureFallbackRef="NicePackT.Contender.alpha_lens_64x64" CrosshairTexRef="NicePackT.Contender.gdcw_acog" bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_AUTO bHasScope=True ZoomedDisplayFOVHigh=25.000000 MagCapacity=1 ReloadRate=1.376000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_HuntingShotgun" Weight=3.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=55.000000 SleeveNum=3 TraderInfoTexture=Texture'NicePackT.Contender.g2contender_trader' bIsTier2Weapon=True MeshRef="NicePackA.Contender.G2ContenderMesh" SkinRefs(0)="NicePackT.Contender.Contender_diffuse_cmb" SkinRefs(1)="NicePackT.Contender.alpha_lens_64x64" SkinRefs(2)="NicePackT.Contender.uv1024_cmb" SkinRefs(3)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SkinRefs(4)="NicePackT.Contender.Bullet_cmb" SelectSoundRef="NicePackSnd.Contender.G2_Pickup" HudImageRef="NicePackT.Contender.g2contender_unselected" SelectedHudImageRef="NicePackT.Contender.g2contender_selected" PlayerIronSightFOV=40.000000 ZoomTime=0.285000 ZoomedDisplayFOV=25.000000 FireModeClass(0)=Class'NicePack.NiceContenderFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" PutDownAnimRate=1.000000 AIRating=0.550000 CurrentRating=0.550000 Description="Thompson G2 Contender - hinting pistol" DisplayFOV=55.000000 Priority=120 InventoryGroup=2 GroupOffset=16 PickupClass=Class'NicePack.NiceContenderPickup' PlayerViewOffset=(X=13.000000,Y=14.000000,Z=-5.500000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceContenderAttachment' ItemName="Thompson Contender" +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmo.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmo.uc new file mode 100644 index 0000000..5beb7b4 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmo.uc @@ -0,0 +1,4 @@ +class NiceContenderAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceContenderPickup' AmmoPickupAmount=8 MaxAmmo=40 InitialAmount=10 PickupClass=Class'NicePack.NiceContenderAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName=".35 rem" +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmoPickup.uc new file mode 100644 index 0000000..6e11d09 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceContenderAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=8 InventoryType=Class'NicePack.NiceContenderAmmo' PickupMessage=".35 rem" StaticMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderAttachment.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAttachment.uc new file mode 100644 index 0000000..dacbffe --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAttachment.uc @@ -0,0 +1,4 @@ +class NiceContenderAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol' MovementAnims(0)="JogF_HuntingShotgun" MovementAnims(1)="JogB_HuntingShotgun" MovementAnims(2)="JogL_HuntingShotgun" MovementAnims(3)="JogR_HuntingShotgun" TurnLeftAnim="TurnL_HuntingShotgun" TurnRightAnim="TurnR_HuntingShotgun" CrouchAnims(0)="CHwalkF_HuntingShotgun" CrouchAnims(1)="CHwalkB_HuntingShotgun" CrouchAnims(2)="CHwalkL_HuntingShotgun" CrouchAnims(3)="CHwalkR_HuntingShotgun" WalkAnims(0)="WalkF_HuntingShotgun" WalkAnims(1)="WalkB_HuntingShotgun" WalkAnims(2)="WalkL_HuntingShotgun" WalkAnims(3)="WalkR_HuntingShotgun" CrouchTurnRightAnim="CH_TurnR_HuntingShotgun" CrouchTurnLeftAnim="CH_TurnL_HuntingShotgun" IdleCrouchAnim="CHIdle_HuntingShotgun" IdleWeaponAnim="Idle_HuntingShotgun" IdleRestAnim="Idle_HuntingShotgun" IdleChatAnim="Idle_HuntingShotgun" IdleHeavyAnim="Idle_HuntingShotgun" IdleRifleAnim="Idle_HuntingShotgun" FireAnims(0)="Fire_HuntingShotgun" FireAnims(1)="Fire_HuntingShotgun" FireAnims(2)="Fire_HuntingShotgun" FireAnims(3)="Fire_HuntingShotgun" FireAltAnims(0)="Fire_HuntingShotgun" FireAltAnims(1)="Fire_HuntingShotgun" FireAltAnims(2)="Fire_HuntingShotgun" FireAltAnims(3)="Fire_HuntingShotgun" FireCrouchAnims(0)="CHFire_HuntingShotgun" FireCrouchAnims(1)="CHFire_HuntingShotgun" FireCrouchAnims(2)="CHFire_HuntingShotgun" FireCrouchAnims(3)="CHFire_HuntingShotgun" FireCrouchAltAnims(0)="CHFire_HuntingShotgun" FireCrouchAltAnims(1)="CHFire_HuntingShotgun" FireCrouchAltAnims(2)="CHFire_HuntingShotgun" FireCrouchAltAnims(3)="CHFire_HuntingShotgun" HitAnims(0)="HitF_HuntingShotgun" HitAnims(1)="HitB_HuntingShotgun" HitAnims(2)="HitL_HuntingShotgun" HitAnims(3)="HitR_HuntingShotgun" PostFireBlendStandAnim="Blend_HuntingShotgun" PostFireBlendCrouchAnim="CHBlend_HuntingShotgun" MeshRef="NicePackA.Contender.G2Contender_3rd" DrawScale=2.200000 +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderFire.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderFire.uc new file mode 100644 index 0000000..0b27e76 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderFire.uc @@ -0,0 +1,4 @@ +class NiceContenderFire extends NiceFire; +defaultproperties +{ EffectiveRange=25000.000000 ProjectileSpeed=30000.000000 FireAimedAnim="Fire" RecoilRate=0.100000 maxVerticalRecoilAngle=350 maxHorizontalRecoilAngle=175 bRandomPitchFireSound=False FireSoundRef="NicePackSnd.Contender.G2_Shot" StereoFireSoundRef="NicePackSnd.Contender.G2_Shot" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeContender' DamageMin=156 DamageMax=156 bWaitForRelease=True TransientSoundVolume=1.800000 FireForce="AssaultRifleFire" FireRate=1.600000 AmmoClass=Class'NicePack.NiceContenderAmmo' ShakeRotMag=(X=5.000000,Y=7.000000,Z=3.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeOffsetMag=(X=5.000000,Y=5.000000,Z=5.000000) BotRefireRate=3.570000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=0.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderPickup.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderPickup.uc new file mode 100644 index 0000000..bec842f --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderPickup.uc @@ -0,0 +1,5 @@ +class NiceContenderPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=3.000000 AmmoCost=8 + cost=1000 BuyClipSize=1 PowerValue=60 SpeedValue=35 RangeValue=90 Description="Thompson G2 Contender - hunting pistol" ItemName="Thompson Contender" ItemShortName="Contender" AmmoItemName=".35 rem" CorrespondingPerkIndex=2 EquipmentCategoryID=2 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceContender' PickupMessage="You got the Thompson G2 Contender" PickupSound=Sound'NicePackSnd.Contender.G2_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.Contender.G2Contender_sm' DrawScale=2.000000 CollisionRadius=10.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceDamTypeContender.uc b/sources/Weapons/Playable/Pistols/Contender/NiceDamTypeContender.uc new file mode 100644 index 0000000..3d17de1 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Contender/NiceDamTypeContender.uc @@ -0,0 +1,7 @@ +class NiceDamTypeContender extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ + stunMultiplier=1.500000 + HeadShotDamageMult=2.500000 WeaponClass=Class'NicePack.NiceContender' DeathString="%k killed %o with Contender." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=1850.000000 KDeathVel=150.000000 KDeathUpKick=5.000000 VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDamTypeDeagle.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDamTypeDeagle.uc new file mode 100644 index 0000000..2b7dfeb --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDamTypeDeagle.uc @@ -0,0 +1,6 @@ +class NiceDamTypeDeagle extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ + goodDecapMod=0.750000 MaxPenetrations=4 WeaponClass=Class'NicePack.NiceDeagle' DeathString="%k killed %o (Deagle)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=6500.000000 KDeathVel=400.000000 KDeathUpKick=80.000000 VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagle.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagle.uc new file mode 100644 index 0000000..1f59c5d --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagle.uc @@ -0,0 +1,4 @@ +class NiceDeagle extends NiceSingle; +defaultproperties +{ DualClass=Class'NicePack.NiceDualDeagle' reloadPreEndFrame=0.197000 reloadEndFrame=0.682000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.288000 reloadChargeStartFrame=-1.000000 MagCapacity=8 ReloadRate=2.200000 Weight=2.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Handcannon' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Handcannon_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Pistols.deagle_cmb" SelectSoundRef="KF_HandcannonSnd.50AE_Select" HudImageRef="KillingFloorHUD.WeaponSelect.handcannon_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.handcannon" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDeagleFire' AIRating=0.450000 CurrentRating=0.450000 Description=".50 calibre action express handgun. This is about as big and nasty as personal weapons are going to get. But with a 7 round magazine, it should be used conservatively. " EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=100 GroupOffset=11 PickupClass=Class'NicePack.NiceDeaglePickup' PlayerViewOffset=(X=5.000000,Y=20.000000) AttachmentClass=Class'NicePack.NiceDeagleAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Desert Eagle" bUseDynamicLights=True TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmo.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmo.uc new file mode 100644 index 0000000..4a77018 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmo.uc @@ -0,0 +1,5 @@ +class NiceDeagleAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceDeaglePickup' AmmoPickupAmount=8 MaxAmmo=72 InitialAmount=24 PickupClass=Class'NicePack.NiceDeagleAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Deagle bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmoPickup.uc new file mode 100644 index 0000000..2a2386f --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDeagleAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=8 InventoryType=Class'NicePack.NiceDeagleAmmo' PickupMessage="Rounds (.300 JHP)" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAttachment.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAttachment.uc new file mode 100644 index 0000000..8c207ef --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAttachment.uc @@ -0,0 +1,4 @@ +class NiceDeagleAttachment extends NiceSingleAttachment; +defaultproperties +{ mTracerClass=Class'KFMod.KFLargeTracer' MeshRef="KF_Weapons3rd_Trip.Handcannon_3rd" bHeavy=True +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleFire.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleFire.uc new file mode 100644 index 0000000..2adb18c --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleFire.uc @@ -0,0 +1,4 @@ +class NiceDeagleFire extends NiceSingleFire; +defaultproperties +{ ProjectileSpeed=23500.000000 FireAimedAnim="Iron_Fire" maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 ShellEjectClass=Class'ROEffects.KFShellEjectHandCannon' FireSoundRef="KF_HandcannonSnd.50AE_Fire" StereoFireSoundRef="KF_HandcannonSnd.50AE_FireST" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeDeagle' DamageMin=105 DamageMax=105 Momentum=20000.000000 FireLoopAnim= FireEndAnim= FireAnimRate=1.000000 FireRate=0.500000 AmmoClass=Class'NicePack.NiceDeagleAmmo' ShakeRotMag=(Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.650000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=40.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeaglePickup.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeaglePickup.uc new file mode 100644 index 0000000..ea11ae4 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeaglePickup.uc @@ -0,0 +1,4 @@ +class NiceDeaglePickup extends NiceSinglePickup; +defaultproperties +{ Weight=2.000000 cost=250 AmmoCost=11 BuyClipSize=8 PowerValue=65 SpeedValue=35 RangeValue=60 Description="50 Cal AE handgun. A powerful personal choice for personal defense." ItemName="Desert Eagle" ItemShortName="Deagle" AmmoItemName=".300 JHP Ammo" AmmoMesh=None VariantClasses(0)=Class'NicePack.SkinGoldenDeaglePickup' InventoryType=Class'NicePack.NiceDeagle' PickupMessage="You got the Desert Eagle" PickupSound=Sound'KF_HandcannonSnd.50AE_Pickup' StaticMesh=StaticMesh'KF_pickups_Trip.pistol.deagle_pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagle.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagle.uc new file mode 100644 index 0000000..86177a0 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagle.uc @@ -0,0 +1,4 @@ +class NiceDualDeagle extends NiceDualies; +defaultproperties +{ SingleClass=Class'NicePack.NiceDeagle' altFlashBoneName="tip01" leftEject=0.120000 rightEject=0.111000 rightInsert=0.778000 MagCapacity=16 FlashBoneName="tip" Weight=4.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Dual_Handcannons' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Dual50_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Pistols.deagle_cmb" SelectSoundRef="KF_HandcannonSnd.50AE_Select" HudImageRef="KillingFloorHUD.WeaponSelect.dual_handcannon_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.dual_handcannon" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualDeagleFire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual .50 calibre action express handgun. Dual 50's is double the fun." DisplayFOV=60.000000 Priority=125 GroupOffset=12 PickupClass=Class'NicePack.NiceDualDeaglePickup' PlayerViewOffset=(X=25.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceDualDeagleAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual Desert Eagles" DrawScale=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmo.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmo.uc new file mode 100644 index 0000000..2272701 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmo.uc @@ -0,0 +1,5 @@ +class NiceDualDeagleAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceDualDeaglePickup' AmmoPickupAmount=8 MaxAmmo=72 InitialAmount=24 PickupClass=Class'NicePack.NiceDualDeagleAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Deagle bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmoPickup.uc new file mode 100644 index 0000000..cc8050e --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDualDeagleAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=8 InventoryType=Class'NicePack.NiceDualDeagleAmmo' PickupMessage="Rounds (.300 JHP)" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAttachment.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAttachment.uc new file mode 100644 index 0000000..adeb2d8 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAttachment.uc @@ -0,0 +1,4 @@ +class NiceDualDeagleAttachment extends NiceDualiesAttachment; +defaultproperties +{ BrotherMesh=SkeletalMesh'KF_Weapons3rd_Trip.Handcannon_3rd' mTracerClass=Class'KFMod.KFLargeTracer' MeshRef="KF_Weapons3rd_Trip.Handcannon_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleFire.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleFire.uc new file mode 100644 index 0000000..6c0cfa7 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleFire.uc @@ -0,0 +1,4 @@ +class NiceDualDeagleFire extends NiceDualiesFire; +defaultproperties +{ ProjectileSpeed=23500.000000 maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 ShellEjectClass=Class'ROEffects.KFShellEjectHandCannon' FireSoundRef="KF_HandcannonSnd.50AE_Fire" StereoFireSoundRef="KF_HandcannonSnd.50AE_FireST" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeDeagle' DamageMin=120 DamageMax=120 Momentum=20000.000000 FireRate=0.250000 AmmoClass=Class'NicePack.NiceDualDeagleAmmo' ShakeRotMag=(Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=40.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeaglePickup.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeaglePickup.uc new file mode 100644 index 0000000..9149caf --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeaglePickup.uc @@ -0,0 +1,4 @@ +class NiceDualDeaglePickup extends NiceDualiesPickup; +defaultproperties +{ Weight=4.000000 cost=500 AmmoCost=22 BuyClipSize=8 PowerValue=85 SpeedValue=35 RangeValue=60 Description="A pair of 50 Cal AE handguns." ItemName="Dual Desert Eagles" ItemShortName="Dual Deagles" AmmoItemName=".300 JHP Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.DeagleAmmo' VariantClasses(0)=Class'NicePack.SkinGoldenDualDeaglePickup' InventoryType=Class'NicePack.NiceDualDeagle' PickupMessage="You found another Handcannon" PickupSound=Sound'KF_HandcannonSnd.50AE_Pickup' StaticMesh=StaticMesh'KF_pickups_Trip.pistol.deagle_pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDamTypeGlock.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDamTypeGlock.uc new file mode 100644 index 0000000..27626d5 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDamTypeGlock.uc @@ -0,0 +1,6 @@ +class NiceDamTypeGlock extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ + goodDecapMod=0.500000 HeadShotDamageMult=1.100000 WeaponClass=Class'NicePack.NiceGlock' DeathString="%k killed %o with Glock." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=1850.000000 KDeathVel=150.000000 KDeathUpKick=5.000000 VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlock.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlock.uc new file mode 100644 index 0000000..19ca862 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlock.uc @@ -0,0 +1,5 @@ +class NiceDualGlock extends NiceDualies; +defaultproperties +{ SingleClass=Class'NicePack.NiceGlock' bLoadResourcesAsMaterial=True MagCapacity=24 StandardDisplayFOV=65.000000 SleeveNum=4 TraderInfoTexture=Texture'NicePackT.Glock17.DualGlock17_trader' bIsTier2Weapon=True + Weight=2.000000 MeshRef="NicePackA.Glock17.v2_dual_Glock17" SkinRefs(0)="NicePackT.Glock17.frame_cmb" SkinRefs(1)="NicePackT.Glock17.17Slide_cmb" SkinRefs(2)="NicePackT.Glock17.Internals_cmb" SkinRefs(3)="NicePackT.Glock17.Magazine_cmb" SkinRefs(4)="KF_Weapons_Trip_T.hands.hands_1stP_military_diff" SelectSoundRef="KF_MK23Snd.MK23_Select" HudImageRef="NicePackT.Glock17.DualGlock17_unselect" SelectedHudImageRef="NicePackT.Glock17.DualGlock17_select" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualGlockFire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual Glock-17 match grade pistols. Dual 9mm is double the fun." DisplayFOV=65.000000 Priority=90 GroupOffset=6 PickupClass=Class'NicePack.NiceDualGlockPickup' PlayerViewOffset=(X=25.000000) BobDamping=3.800000 AttachmentClass=Class'NicePack.NiceDualGlockAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual Glock-17" DrawScale=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmo.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmo.uc new file mode 100644 index 0000000..d4bd626 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmo.uc @@ -0,0 +1,4 @@ +class NiceDualGlockAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceDualGlockPickup' AmmoPickupAmount=12 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceDualGlockAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Glock-17 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmoPickup.uc new file mode 100644 index 0000000..6cede34 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDualGlockAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=12 InventoryType=Class'NicePack.NiceDualGlockAmmo' PickupMessage="Rounds (9x19mm)" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAttachment.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAttachment.uc new file mode 100644 index 0000000..93fdca8 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAttachment.uc @@ -0,0 +1,4 @@ +class NiceDualGlockAttachment extends NiceDualiesAttachment; +defaultproperties +{ BrotherMesh=SkeletalMesh'NicePackA.Glock17.SingleGlock17_3rd' MeshRef="NicePackA.Glock17.SingleGlock17_3rd" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockFire.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockFire.uc new file mode 100644 index 0000000..bb23c0c --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockFire.uc @@ -0,0 +1,4 @@ +class NiceDualGlockFire extends NiceDualiesFire; +defaultproperties +{ ProjectileSpeed=18750.000000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=100 ShellEjectClass=Class'NicePack.NiceGlockShell' FireSoundRef="NicePackSnd.Glock17.glock17_Fire" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeGlock' DamageMax=35 Momentum=18000.000000 bWaitForRelease=False FireRate=0.087500 AmmoClass=Class'NicePack.NiceDualGlockAmmo' ShakeRotMag=(Z=290.000000) ShakeRotRate=(X=10080.000000,Y=10080.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 FlashEmitterClass=Class'KFMod.MuzzleFlashMK' aimerror=40.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockPickup.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockPickup.uc new file mode 100644 index 0000000..8ae098c --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockPickup.uc @@ -0,0 +1,4 @@ +class NiceDualGlockPickup extends NiceDualiesPickup; +defaultproperties +{ bBackupWeapon=True Weight=4.000000 cost=250 BuyClipSize=12 PowerValue=70 SpeedValue=45 RangeValue=60 Description="Dual Glock-17 match grade pistols. Dual 9mm is double the fun." ItemName="Dual Glock-17" ItemShortName="Dual Glock-17" AmmoItemName="9mm Ammo" InventoryType=Class'NicePack.NiceDualGlock' PickupMessage="You found another - Glock-17" PickupSound=Sound'KF_MK23Snd.MK23_Pickup' StaticMesh=StaticMesh'NicePackSM.Glock17.singleGlock17_stc' +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlock.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlock.uc new file mode 100644 index 0000000..a5b1e14 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlock.uc @@ -0,0 +1,4 @@ +class NiceGlock extends NiceSingle; +defaultproperties +{ DualClass=Class'NicePack.NiceDualGlock' reloadPreEndFrame=0.117000 reloadEndFrame=0.617000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.250000 reloadChargeStartFrame=-1.000000 MagCapacity=12 Weight=1.000000 StandardDisplayFOV=65.000000 SleeveNum=4 TraderInfoTexture=Texture'NicePackT.Glock17.SingleGlock17_trader' bIsTier2Weapon=True MeshRef="NicePackA.Glock17.v_glock17" SkinRefs(0)="NicePackT.Glock17.Frame_cmb" SkinRefs(1)="NicePackT.Glock17.17Slide_cmb" SkinRefs(2)="NicePackT.Glock17.Internals_cmb" SkinRefs(3)="NicePackT.Glock17.Magazine_cmb" SkinRefs(4)="KF_Weapons_Trip_T.hands.hands_1stP_military_diff" SelectSoundRef="KF_MK23Snd.MK23_Select" HudImageRef="NicePackT.Glock17.SingleGlock17_unselect" SelectedHudImageRef="NicePackT.Glock17.SingleGlock17_select" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceGlockFire' AIRating=0.450000 CurrentRating=0.450000 Description="Specifically for the needs of the army and police special forces company Glock created version of the model 17." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=65 GroupOffset=5 PickupClass=Class'NicePack.NiceGlockPickup' PlayerViewOffset=(X=10.000000,Y=18.750000,Z=-7.000000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceGlockAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Glock-17" bUseDynamicLights=True TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmo.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmo.uc new file mode 100644 index 0000000..8e50a21 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmo.uc @@ -0,0 +1,4 @@ +class NiceGlockAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceGlockPickup' AmmoPickupAmount=12 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceGlockAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Glock-17 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmoPickup.uc new file mode 100644 index 0000000..129ed46 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceGlockAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=12 InventoryType=Class'NicePack.NiceGlockAmmo' PickupMessage="Rounds (9x19mm)" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockAttachment.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAttachment.uc new file mode 100644 index 0000000..48ce2ec --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAttachment.uc @@ -0,0 +1,4 @@ +class NiceGlockAttachment extends NiceSingleAttachment; +defaultproperties +{ MeshRef="NicePackA.Glock17.SingleGlock17_3rd" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockFire.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockFire.uc new file mode 100644 index 0000000..1401102 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockFire.uc @@ -0,0 +1,4 @@ +class NiceGlockFire extends NiceSingleFire; +defaultproperties +{ ProjectileSpeed=18750.000000 RecoilRate=0.030000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=100 FireSoundRef="NicePackSnd.Glock17.glock17_Fire" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeGlock' DamageMax=35 Momentum=18000.000000 FireRate=0.17500000 AmmoClass=Class'NicePack.NiceGlockAmmo' ShakeRotMag=(Z=290.000000) ShakeRotRate=(X=10080.000000,Y=10080.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.650000 FlashEmitterClass=Class'KFMod.MuzzleFlashMK' +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockPickup.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockPickup.uc new file mode 100644 index 0000000..f1d75bb --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockPickup.uc @@ -0,0 +1,4 @@ +class NiceGlockPickup extends NiceSinglePickup; +defaultproperties +{ bBackupWeapon=True Weight=2.000000 cost=125 BuyClipSize=12 PowerValue=50 SpeedValue=45 RangeValue=60 Description="Specifically for the needs of the army and police special forces company Glock created version of the model 17." ItemName="Glock-17" ItemShortName="Glock-17" AmmoItemName="9mm Ammo" InventoryType=Class'NicePack.NiceGlock' PickupMessage="You got the Glock-17" PickupSound=Sound'KF_MK23Snd.MK23_Pickup' StaticMesh=StaticMesh'NicePackSM.Glock17.singleGlock17_stc' +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockShell.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockShell.uc new file mode 100644 index 0000000..ee55c9b --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockShell.uc @@ -0,0 +1,9 @@ +class NiceGlockShell extends KFShellEject; +simulated function Trigger(Actor Other, Pawn EventInstigator){ + Emitters[0].SpawnParticle(1); + Emitters[1].SpawnParticle(3); +} +defaultproperties +{ Begin Object Class=MeshEmitter Name=MeshEmitter10 StaticMesh=StaticMesh'kf_generic_sm.Bullet_Shells.Handcannon_Shell' RespawnDeadParticles=False ZTest=False SpinParticles=True AutomaticInitialSpawning=False Acceleration=(Z=-500.000000) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) MaxParticles=25 UseRotationFrom=PTRS_Actor SpinsPerSecondRange=(X=(Min=-3.000000,Max=3.000000),Y=(Min=-3.000000,Max=3.000000),Z=(Min=-3.000000,Max=3.000000)) StartSizeRange=(X=(Min=2.500000,Max=2.500000),Y=(Min=2.500000,Max=2.500000),Z=(Min=2.500000,Max=2.500000)) LifetimeRange=(Min=5.000000,Max=5.000000) StartVelocityRange=(X=(Min=-45.000000,Max=45.000000),Y=(Min=-45.000000,Max=45.000000),Z=(Min=180.000000,Max=220.000000)) End Object Emitters(0)=MeshEmitter'KFMod.MK23Shell.MeshEmitter10' + Begin Object Class=SpriteEmitter Name=SpriteEmitter93 UseDirectionAs=PTDU_Up UseCollision=True UseColorScale=True FadeOut=True FadeIn=True RespawnDeadParticles=False ZTest=False UseSizeScale=True UseRegularSizeScale=False UniformSize=True ScaleSizeXByVelocity=True AutomaticInitialSpawning=False Acceleration=(Z=-210.000000) DampingFactorRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000)) ColorScale(0)=(Color=(B=255,G=255,R=187)) ColorScale(1)=(RelativeTime=0.214286,Color=(G=103,R=206,A=255)) ColorScale(2)=(RelativeTime=0.439286,Color=(B=100,G=177,R=255,A=255)) ColorScale(3)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255)) ColorScale(4)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255)) ColorScale(5)=(RelativeTime=1.000000,Color=(R=128,A=255)) ColorScale(6)=(RelativeTime=1.000000) ColorScale(7)=(RelativeTime=1.000000) FadeOutStartTime=0.336000 FadeInEndTime=0.064000 MaxParticles=25 SizeScale(0)=(RelativeSize=1.000000) SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.250000) StartSizeRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000)) ScaleSizeByVelocityMultiplier=(X=0.010000,Y=0.010000) Texture=Texture'KFX.KFSparkHead' LifetimeRange=(Min=1.500000,Max=1.500000) StartVelocityRange=(X=(Min=-100.000000,Max=100.000000),Y=(Min=-100.000000,Max=100.000000),Z=(Min=50.000000,Max=100.000000)) End Object Emitters(1)=SpriteEmitter'KFMod.MK23Shell.SpriteEmitter93' +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDamTypeJudge.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDamTypeJudge.uc new file mode 100644 index 0000000..2636faf --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDamTypeJudge.uc @@ -0,0 +1,5 @@ +class NiceDamTypeJudge extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ bFinisher=True MaxPenetrations=-1 HeadShotDamageMult=1.400000 WeaponClass=Class'NicePack.NiceJudgePistol' DeathString="%k killed %o with Taurus Raging Judge." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=12000.000000 KDeathVel=800.000000 KDeathUpKick=160.000000 VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmo.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmo.uc new file mode 100644 index 0000000..f439143 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmo.uc @@ -0,0 +1,4 @@ +class NiceDualJudgeAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceDualJudgePistolPickup' AmmoPickupAmount=5 MaxAmmo=60 InitialAmount=15 PickupClass=Class'NicePack.NiceDualJudgeAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Judge bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmoPickup.uc new file mode 100644 index 0000000..2d0d2f4 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDualJudgeAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=5 InventoryType=Class'NicePack.NiceDualJudgeAmmo' PickupMessage="Rounds (.45 ACP)" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistol.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistol.uc new file mode 100644 index 0000000..46a83de --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistol.uc @@ -0,0 +1,4 @@ +class NiceDualJudgePistol extends NiceDualies; +defaultproperties +{ SingleClass=Class'NicePack.NiceJudgePistol' leftEject=0.192000 rightEject=0.626000 leftInsert=0.396000 rightInsert=0.747000 MagCapacity=10 ReloadRate=5.933333 ReloadAnimRate=1.200000 WeaponReloadAnim="Reload_DualRevolver" Weight=8.000000 StandardDisplayFOV=60.000000 SleeveNum=6 TraderInfoTexture=Texture'NicePackT.judge.dualjuj_p_trader' bIsTier2Weapon=True MeshRef="NicePackA.Judge.dual_judges" SkinRefs(0)="NicePackT.Judge.kfjudge_cmb" SkinRefs(1)="NicePackT.Judge.trit_grn_shdr" SkinRefs(2)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" SkinRefs(3)="NicePackT.Judge.jujload" SkinRefs(4)="NicePackT.Judge.trit_red_shdr" SkinRefs(5)="NicePackT.Judge.juj_shell_cmb" SelectSoundRef="NicePackSnd.Judge.judge_draw" HudImageRef="NicePackT.Judge.dualjuj_p_unsel" SelectedHudImageRef="NicePackT.Judge.dualjuj_p_sel" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualJudgePistolFire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual .50 calibre action express handgun. Dual 50's is double the fun." DisplayFOV=60.000000 Priority=125 GroupOffset=14 PickupClass=Class'NicePack.NiceDualJudgePistolPickup' PlayerViewOffset=(X=25.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceDualJudgePistolAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual Raging Judges" DrawScale=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolAttachment.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolAttachment.uc new file mode 100644 index 0000000..eb916ef --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolAttachment.uc @@ -0,0 +1,4 @@ +class NiceDualJudgePistolAttachment extends NiceDualiesAttachment; +defaultproperties +{ BrotherMesh=SkeletalMesh'NicePackA.judge.juj_3rd' mTracerClass=None mShellCaseEmitterClass=None MeshRef="NicePackA.Judge.juj_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolFire.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolFire.uc new file mode 100644 index 0000000..0b226bc --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolFire.uc @@ -0,0 +1,4 @@ +class NiceDualJudgePistolFire extends NiceDualiesFire; +defaultproperties +{ ProjectileSpeed=31600.000000 maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 FireSoundRef="NicePackSnd.Judge.raging_judge_fire_m" StereoFireSoundRef="NicePackSnd.Judge.raging_judge_fire_s" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamTypeJudge' DamageMin=125 DamageMax=125 TransientSoundVolume=2.000000 TransientSoundRadius=500.000000 TweenTime=0.000000 FireRate=0.325000 AmmoClass=Class'NicePack.NiceDualJudgeAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) ShakeRotTime=5.000000 ShakeOffsetMag=(Y=2.000000) ShakeOffsetTime=3.000000 FlashEmitterClass=Class'NicePack.NiceJudgePistolFlash' aimerror=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolPickup.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolPickup.uc new file mode 100644 index 0000000..1e0699e --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolPickup.uc @@ -0,0 +1,4 @@ +class NiceDualJudgePistolPickup extends NiceDualiesPickup; +defaultproperties +{ Weight=8.000000 cost=2500 AmmoCost=30 BuyClipSize=5 PowerValue=85 SpeedValue=35 RangeValue=60 Description="A pair of 50 Cal AE handguns." ItemName="Dual Raging Judges" ItemShortName="Dual Raging Judges" AmmoItemName=".300 JHP Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.DeagleAmmo' VariantClasses(0)=Class'NicePack.SkinGoldenDualJudgePistolPickup' InventoryType=Class'NicePack.NiceDualJudgePistol' PickupMessage="You found another Taurus Raging Judge." PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' StaticMesh=StaticMesh'NicePackSM.judge.judge_pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmo.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmo.uc new file mode 100644 index 0000000..c31233f --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmo.uc @@ -0,0 +1,4 @@ +class NiceJudgeAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceJudgePistolPickup' AmmoPickupAmount=5 MaxAmmo=60 InitialAmount=15 PickupClass=Class'NicePack.NiceJudgeAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Judge bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmoPickup.uc new file mode 100644 index 0000000..0ed7be1 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceJudgeAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=5 InventoryType=Class'NicePack.NiceJudgeAmmo' PickupMessage="Rounds (.45 ACP)" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeBarrelSmoke.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeBarrelSmoke.uc new file mode 100644 index 0000000..b272cd1 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeBarrelSmoke.uc @@ -0,0 +1,11 @@ +class NiceJudgeBarrelSmoke extends SpeedTrail; +var float WaitCount; +simulated function Tick(float DeltaTime){ + super.Tick(DeltaTime); + WaitCount += DeltaTime; + if(WaitCount > 1.500000){ mRegen = False; mRegenRange[0]=0.000000; mRegenRange[1]=0.000000; + } +} +defaultproperties +{ mLifeRange(0)=1.000000 mLifeRange(1)=1.000000 mRegenRange(0)=30.000000 mRegenRange(1)=30.000000 mDirDev=(X=0.100000,Y=0.100000,Z=0.010000) mPosDev=(X=0.000000,Y=0.000000,Z=0.000000) mSpeedRange(0)=50.000000 mSpeedRange(1)=50.000000 mSizeRange(0)=10.000000 mSizeRange(1)=10.000000 mGrowthRate=-10.000000 mColorRange(0)=(A=128) mColorRange(1)=(A=128) LifeSpan=3.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistol.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistol.uc new file mode 100644 index 0000000..262adba --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistol.uc @@ -0,0 +1,4 @@ +class NiceJudgePistol extends NiceSingle; +defaultproperties +{ DualClass=Class'NicePack.NiceDualJudgePistol' reloadPreEndFrame=0.272000 reloadEndFrame=0.790000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.400000 reloadChargeStartFrame=-1.000000 MagCapacity=5 ReloadRate=2.277778 ReloadAnimRate=1.200000 WeaponReloadAnim="Reload_Revolver" Weight=4.000000 StandardDisplayFOV=60.000000 SleeveNum=6 TraderInfoTexture=Texture'NicePackT.judge.juj_p_trader' bIsTier2Weapon=True MeshRef="NicePackA.Judge.judge" SkinRefs(0)="NicePackT.Judge.kfjudge_cmb" SkinRefs(1)="NicePackT.Judge.trit_grn_shdr" SkinRefs(2)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" SkinRefs(3)="NicePackT.Judge.jujload" SkinRefs(4)="NicePackT.Judge.trit_red_shdr" SkinRefs(5)="NicePackT.Judge.juj_shell_cmb" SelectSoundRef="NicePackSnd.Judge.judge_draw" HudImageRef="NicePackT.Judge.juj_p_unsel" SelectedHudImageRef="NicePackT.Judge.juj_p_sel" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceJudgePistolFire' SelectAnimRate=1.000000 BringUpTime=0.533333 AIRating=0.450000 CurrentRating=0.450000 Description=".50 calibre action express handgun. This is about as big and nasty as personal weapons are going to get. But with a 5 round magazine, it should be used conservatively." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=100 GroupOffset=13 PickupClass=Class'NicePack.NiceJudgePistolPickup' PlayerViewOffset=(X=30.000000,Y=20.000000) AttachmentClass=Class'NicePack.NiceJudgePistolAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Taurus Raging Judge" bUseDynamicLights=True TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolAttachment.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolAttachment.uc new file mode 100644 index 0000000..9029b16 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolAttachment.uc @@ -0,0 +1,4 @@ +class NiceJudgePistolAttachment extends NiceSingleAttachment; +defaultproperties +{ mTracerClass=None MeshRef="NicePackA.Judge.juj_3rd" bHeavy=True +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFire.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFire.uc new file mode 100644 index 0000000..202ca96 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFire.uc @@ -0,0 +1,4 @@ +class NiceJudgePistolFire extends NiceSingleFire; +defaultproperties +{ ProjectileSpeed=31600.000000 maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 FireSoundRef="NicePackSnd.Judge.raging_judge_fire_m" StereoFireSoundRef="NicePackSnd.Judge.raging_judge_fire_s" NoAmmoSoundRef="KF_PumpSGSnd.SG_DryFire" DamageType=Class'NicePack.NiceDamTypeJudge' DamageMin=125 DamageMax=125 TransientSoundVolume=2.000000 TransientSoundRadius=500.000000 FireAnimRate=1.000000 TweenTime=0.000000 FireRate=0.650000 AmmoClass=Class'NicePack.NiceJudgeAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) ShakeRotTime=5.000000 ShakeOffsetMag=(Y=2.000000) ShakeOffsetTime=3.000000 BotRefireRate=1.500000 FlashEmitterClass=Class'NicePack.NiceJudgePistolFlash' aimerror=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFlash.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFlash.uc new file mode 100644 index 0000000..48859cc --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFlash.uc @@ -0,0 +1,9 @@ +class NiceJudgePistolFlash extends ROMuzzleFlash1st; +simulated function Trigger(Actor Other, Pawn EventInstigator){ + Emitters[0].SpawnParticle(2); + Emitters[1].SpawnParticle(1); +} +defaultproperties +{ Begin Object Class=SpriteEmitter Name=SpriteEmitter0 RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True AutomaticInitialSpawning=False BlendBetweenSubdivisions=True UseSubdivisionScale=True UseRandomSubdivision=True Opacity=0.500000 CoordinateSystem=PTCS_Relative UseRotationFrom=PTRS_Actor StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000)) SizeScale(0)=(RelativeSize=4.000000) SizeScale(1)=(RelativeTime=0.500000,RelativeSize=4.000000) SizeScale(2)=(RelativeTime=1.000000,RelativeSize=3.000000) StartSizeRange=(X=(Min=11.000000,Max=11.000000)) DrawStyle=PTDS_Brighten Texture=Texture'Effects_Tex.Weapons.STGmuzzleflash_4frame' TextureUSubdivisions=2 TextureVSubdivisions=2 LifetimeRange=(Min=0.100000,Max=0.100000) End Object Emitters(0)=SpriteEmitter'NicePack.NiceJudgePistolFlash.SpriteEmitter0' + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 RespawnDeadParticles=False UniformSize=True AutomaticInitialSpawning=False Opacity=0.100000 MaxParticles=1 StartSizeRange=(X=(Min=50.000000,Max=50.000000)) DrawStyle=PTDS_Brighten Texture=Texture'Effects_Tex.Smoke.MuzzleCorona1stP' LifetimeRange=(Min=0.100000,Max=0.100000) End Object Emitters(1)=SpriteEmitter'NicePack.NiceJudgePistolFlash.SpriteEmitter1' +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolPickup.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolPickup.uc new file mode 100644 index 0000000..61625b8 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolPickup.uc @@ -0,0 +1,4 @@ +class NiceJudgePistolPickup extends NiceSinglePickup; +defaultproperties +{ Weight=4.000000 cost=2500 AmmoCost=15 BuyClipSize=5 PowerValue=65 SpeedValue=35 RangeValue=60 Description="50 Cal AE handgun. A powerful personal choice for personal defense." ItemName="Raging Judge" ItemShortName="Raging Judge" AmmoItemName=".300 JHP Ammo" VariantClasses(0)=Class'NicePack.SkinGoldenJudgePistolPickup' InventoryType=Class'NicePack.NiceJudgePistol' PickupMessage="You got the Taurus Raging Judge." PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' StaticMesh=StaticMesh'NicePackSM.judge.judge_pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeTracer.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeTracer.uc new file mode 100644 index 0000000..808eda6 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeTracer.uc @@ -0,0 +1,4 @@ +class NiceJudgeTracer extends pclSmoke; +defaultproperties +{ mParticleType=PT_Stream mStartParticles=0 mMaxParticles=40 mLifeRange(0)=0.050000 mLifeRange(1)=0.050000 mRegenRange(0)=60.000000 mRegenRange(1)=60.000000 mSpawnVecB=(X=20.000000,Z=0.000000) mSizeRange(0)=2.000000 mSizeRange(1)=2.000000 mGrowthRate=-0.500000 mColorRange(0)=(B=82,G=231,R=252,A=60) mColorRange(1)=(B=82,G=231,R=252,A=60) mNumTileColumns=1 mNumTileRows=1 Physics=PHYS_Trailer LifeSpan=1.300000 Skins(0)=Texture'KFX.TransTrailT' Style=STY_Additive +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDamTypeMK23Pistol.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDamTypeMK23Pistol.uc new file mode 100644 index 0000000..2f29728 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDamTypeMK23Pistol.uc @@ -0,0 +1,6 @@ +class NiceDamTypeMK23Pistol extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ decapType=DB_DROP badDecapMod=0.900000 + flinchMultiplier=2 HeadShotDamageMult=1.5//2.250000 WeaponClass=Class'NicePack.NiceMK23Pistol' DeathString="%k killed %o with MK23." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=1850.000000 KDeathVel=150.000000 KDeathUpKick=5.000000 VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Ammo.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Ammo.uc new file mode 100644 index 0000000..505c3ac --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Ammo.uc @@ -0,0 +1,4 @@ +class NiceDualMK23Ammo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceDualMK23Pickup' AmmoPickupAmount=12 MaxAmmo=144 PickupClass=Class'NicePack.NiceDualMK23AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="MK23 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23AmmoPickup.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23AmmoPickup.uc new file mode 100644 index 0000000..44f29a2 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDualMK23AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=12 InventoryType=Class'NicePack.NiceDualMK23Ammo' PickupMessage="Rounds (.45 ACP)" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Attachment.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Attachment.uc new file mode 100644 index 0000000..fcafe21 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Attachment.uc @@ -0,0 +1,4 @@ +class NiceDualMK23Attachment extends NiceDualiesAttachment; +defaultproperties +{ BrotherMesh=SkeletalMesh'KF_Weapons3rd4_Trip.MK23_3rd' MeshRef="KF_Weapons3rd4_Trip.MK23_3rd" +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Fire.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Fire.uc new file mode 100644 index 0000000..e27bc38 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Fire.uc @@ -0,0 +1,4 @@ +class NiceDualMK23Fire extends NiceDualiesFire; +defaultproperties +{ ProjectileSpeed=13000.000000 maxVerticalRecoilAngle=400 maxHorizontalRecoilAngle=200 ShellEjectClass=Class'KFMod.MK23Shell' FireSoundRef="KF_MK23Snd.MK23_Fire_M" StereoFireSoundRef="KF_MK23Snd.MK23_Fire_S" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeMK23Pistol' DamageMin=55 DamageMax=55 Momentum=18000.000000 NoAmmoSound=None FireRate=0.175000 AmmoClass=Class'NicePack.NiceDualMK23Ammo' ShakeRotMag=(Z=290.000000) ShakeRotRate=(X=10080.000000,Y=10080.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 FlashEmitterClass=Class'KFMod.MuzzleFlashMK' aimerror=40.000000 +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pickup.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pickup.uc new file mode 100644 index 0000000..ee8ddf7 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pickup.uc @@ -0,0 +1,4 @@ +class NiceDualMK23Pickup extends NiceDualiesPickup; +defaultproperties +{ Weight=4.000000 cost=500 AmmoCost=32 BuyClipSize=12 PowerValue=70 SpeedValue=45 RangeValue=60 Description="Dual MK23 match grade pistols. Dual 45's is double the fun." ItemName="DualMK23" ItemShortName="DualMK23" AmmoItemName=".45 ACP Ammo" InventoryType=Class'NicePack.NiceDualMK23Pistol' PickupMessage="You found another - MK23" PickupSound=Sound'KF_MK23Snd.MK23_Pickup' StaticMesh=StaticMesh'KF_pickups4_Trip.Pistols.MK23_Pickup' +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pistol.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pistol.uc new file mode 100644 index 0000000..e04970c --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pistol.uc @@ -0,0 +1,14 @@ +class NiceDualMK23Pistol extends NiceDualies; +simulated function SecondDoToggle(){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) LaserType = 2; + else LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ SingleClass=Class'NicePack.NiceMK23Pistol' leftEject=0.079000 rightEject=0.086000 leftInsert=0.329000 rightInsert=0.650000 bUseFlashlightToToggle=True bAllowFreeDot=True LaserAttachmentRotation=(Yaw=16384) altLaserAttachmentRotation=(Yaw=16384) LaserAttachmentBone="Tip_Right" altLaserAttachmentBone="Tip_Left" MagCapacity=24 ReloadRate=4.466700 Weight=4.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Dual_MK23' bIsTier2Weapon=True MeshRef="KF_Wep_Dual_MK23.Dual_MK23" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.MK23_SHDR" SelectSoundRef="KF_MK23Snd.MK23_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Dual_MK23_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Dual_MK23" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualMK23Fire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual MK23 match grade pistols. Dual 45's is double the fun." DisplayFOV=60.000000 Priority=90 GroupOffset=10 PickupClass=Class'NicePack.NiceDualMK23Pickup' PlayerViewOffset=(X=25.000000) BobDamping=3.800000 AttachmentClass=Class'NicePack.NiceDualMK23Attachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual MK23s" DrawScale=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Ammo.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Ammo.uc new file mode 100644 index 0000000..d427a1f --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Ammo.uc @@ -0,0 +1,4 @@ +class NiceMK23Ammo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceMK23Pickup' AmmoPickupAmount=12 MaxAmmo=144 InitialAmount=36 PickupClass=Class'NicePack.NiceMK23AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="MK23 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23AmmoPickup.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23AmmoPickup.uc new file mode 100644 index 0000000..73956a4 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceMK23AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=12 InventoryType=Class'NicePack.NiceMK23Ammo' PickupMessage="Rounds (.45 ACP)" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Attachment.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Attachment.uc new file mode 100644 index 0000000..8db3689 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Attachment.uc @@ -0,0 +1,4 @@ +class NiceMK23Attachment extends NiceSingleAttachment; +defaultproperties +{ MeshRef="KF_Weapons3rd4_Trip.MK23_3rd" +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Fire.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Fire.uc new file mode 100644 index 0000000..ab96d2e --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Fire.uc @@ -0,0 +1,4 @@ +class NiceMK23Fire extends NiceSingleFire; +defaultproperties +{ ProjectileSpeed=13000.000000 maxVerticalRecoilAngle=400 maxHorizontalRecoilAngle=200 FireSoundRef="KF_MK23Snd.MK23_Fire_M" StereoFireSoundRef="KF_MK23Snd.MK23_Fire_S" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeMK23Pistol' DamageMin=55 DamageMax=55 Momentum=18000.000000 FireLoopAnim= FireEndAnim= FireRate=0.350000 AmmoClass=Class'NicePack.NiceMK23Ammo' ShakeRotMag=(Z=290.000000) ShakeRotRate=(X=10080.000000,Y=10080.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.650000 FlashEmitterClass=Class'KFMod.MuzzleFlashMK' +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pickup.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pickup.uc new file mode 100644 index 0000000..efabe2d --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pickup.uc @@ -0,0 +1,4 @@ +class NiceMK23Pickup extends NiceSinglePickup; +defaultproperties +{ Weight=2.000000 cost=250 AmmoCost=16 BuyClipSize=12 PowerValue=50 SpeedValue=45 RangeValue=60 Description="Match grade 45 caliber pistol. Good balance between power, ammo count and rate of fire." ItemName="MK23" ItemShortName="MK23" AmmoItemName=".45 ACP Ammo" AmmoMesh=None InventoryType=Class'NicePack.NiceMK23Pistol' PickupMessage="You got the MK.23" PickupSound=Sound'KF_MK23Snd.MK23_Pickup' StaticMesh=StaticMesh'KF_pickups4_Trip.Pistols.MK23_Pickup' +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pistol.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pistol.uc new file mode 100644 index 0000000..82f629b --- /dev/null +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pistol.uc @@ -0,0 +1,18 @@ +class NiceMK23Pistol extends NiceSingle; +simulated function AltFire(float F){ + if(bIsDual) super.AltFire(F); + else ToggleLaser(); +} +simulated function SecondDoToggle(){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) LaserType = 2; + else LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ DualClass=Class'NicePack.NiceDualMK23Pistol' bUseFlashlightToToggle=True LaserAttachmentRotation=(Yaw=16384) LaserAttachmentBone="tip" reloadPreEndFrame=0.156000 reloadEndFrame=0.636000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.286000 reloadChargeStartFrame=-1.000000 MagCapacity=12 ReloadRate=2.600000 Weight=2.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MK23' bIsTier2Weapon=True MeshRef="KF_Wep_MK23.MK23" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.MK23_SHDR" SelectSoundRef="KF_MK23Snd.MK23_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.MK23_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MK23" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceMK23Fire' AIRating=0.450000 CurrentRating=0.450000 Description="Match grade 45 caliber pistol. Good balance between power, ammo count and rate of fire." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=65 GroupOffset=9 PickupClass=Class'NicePack.NiceMK23Pickup' PlayerViewOffset=(X=10.000000,Y=18.750000,Z=-7.000000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceMK23Attachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="MK23" bUseDynamicLights=True TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDamTypeMagnumPistol.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDamTypeMagnumPistol.uc new file mode 100644 index 0000000..81aec9e --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDamTypeMagnumPistol.uc @@ -0,0 +1,4 @@ +class NiceDamTypeMagnumPistol extends NiceDamageTypeVetSharpshooter; +defaultproperties +{ flinchMultiplier=2.5 stunMultiplier=6.0 MaxPenetrations=2 PenDmgReduction=0.990000 HeadShotDamageMult=1.1 WeaponClass=Class'NicePack.NiceMagnumPistol' KDamageImpulse=3250.000000 KDeathVel=200.000000 KDeathUpKick=40.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnum.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnum.uc new file mode 100644 index 0000000..a1a45b3 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnum.uc @@ -0,0 +1,5 @@ +class NiceDualMagnum extends NiceDualies; +defaultproperties +{ SingleClass=Class'NicePack.NiceMagnumPistol' leftEject=0.660000 rightEject=0.115000 leftInsert=0.800000 rightInsert=0.375000 MagCapacity=12 + Weight=2.000000 ReloadRate=2.23125//3.570000 ReloadAnimRate=2//1.250000 WeaponReloadAnim="Reload_DualRevolver" StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_DualRevolver' bIsTier2Weapon=True MeshRef="KF_Wep_DualRevolver.DualRevolver_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" SelectSoundRef="KF_RevolverSnd.WEP_Revolver_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.DualRevolver_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.DualRevolver" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualMagnumFire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual 44 Magnum Pistols. Make my day!" DisplayFOV=60.000000 Priority=120 GroupOffset=8 PickupClass=Class'NicePack.NiceDualMagnumPickup' PlayerViewOffset=(X=25.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceDualMagnumAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual 44 Magnums" DrawScale=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmo.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmo.uc new file mode 100644 index 0000000..47ecac1 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmo.uc @@ -0,0 +1,4 @@ +class NiceDualMagnumAmmo extends NiceAmmo; +defaultproperties +{ AmmoPickupAmount=12 MaxAmmo=120 InitialAmount=30 PickupClass=Class'NicePack.NiceDualMagnumAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="44 Magnum bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmoPickup.uc new file mode 100644 index 0000000..011ddd7 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDualMagnumAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=12 InventoryType=Class'NicePack.NiceDualMagnumAmmo' PickupMessage="Rounds (44 Mag)" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAttachment.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAttachment.uc new file mode 100644 index 0000000..b8a5dac --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAttachment.uc @@ -0,0 +1,4 @@ +class NiceDualMagnumAttachment extends NiceDualiesAttachment; +defaultproperties +{ BrotherMesh=SkeletalMesh'KF_Weapons3rd3_Trip.revolver_3rd' mTracerClass=Class'KFMod.KFLargeTracer' mShellCaseEmitterClass=None MeshRef="KF_Weapons3rd3_Trip.revolver_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumFire.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumFire.uc new file mode 100644 index 0000000..549193a --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumFire.uc @@ -0,0 +1,4 @@ +class NiceDualMagnumFire extends NiceDualiesFire; +defaultproperties +{ ProjectileSpeed=22500.000000 maxVerticalRecoilAngle=300 maxHorizontalRecoilAngle=150 ShellEjectClass=None FireSoundRef="KF_RevolverSnd.Revolver_Fire_M" StereoFireSoundRef="KF_RevolverSnd.Revolver_Fire_S" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeMagnumPistol' DamageMin=61 DamageMax=61 Momentum=15000.000000 bWaitForRelease=False FireRate=0.125000 AmmoClass=Class'NicePack.NiceDualMagnumAmmo' ShakeRotMag=(Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=40.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumPickup.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumPickup.uc new file mode 100644 index 0000000..f3f0e40 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumPickup.uc @@ -0,0 +1,4 @@ +class NiceDualMagnumPickup extends NiceDualiesPickup; +defaultproperties +{ Weight=2.000000 cost=250 AmmoCost=16 BuyClipSize=6 PowerValue=80 SpeedValue=50 RangeValue=65 Description="A pair of 44 Magnum Pistols. Make my day!" ItemName="Dual 44 Magnums" ItemShortName="Dual 44s" AmmoItemName="44 Magnum Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.DeagleAmmo' InventoryType=Class'KFMod.Dual44Magnum' PickupMessage="You found another 44 Magnum" PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' StaticMesh=StaticMesh'KF_pickups3_Trip.Pistols.revolver_Pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmo.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmo.uc new file mode 100644 index 0000000..fc30320 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmo.uc @@ -0,0 +1,4 @@ +class NiceMagnumAmmo extends NiceAmmo; +defaultproperties +{ AmmoPickupAmount=6 MaxAmmo=120 InitialAmount=30 PickupClass=Class'NicePack.NiceMagnumAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="44 Magnum bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmoPickup.uc new file mode 100644 index 0000000..70a2743 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceMagnumAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=6 InventoryType=Class'NicePack.NiceMagnumAmmo' PickupMessage="Rounds (44 Mag)" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAttachment.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAttachment.uc new file mode 100644 index 0000000..bfb1d2d --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAttachment.uc @@ -0,0 +1,4 @@ +class NiceMagnumAttachment extends NiceSingleAttachment; +defaultproperties +{ mTracerClass=Class'KFMod.KFLargeTracer' MeshRef="KF_Weapons3rd3_Trip.revolver_3rd" bHeavy=True +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumFire.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumFire.uc new file mode 100644 index 0000000..db4dc68 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumFire.uc @@ -0,0 +1,4 @@ +class NiceMagnumFire extends NiceSingleFire; +defaultproperties +{ ProjectileSpeed=22500.000000 FireAimedAnim="Iron_Fire" maxHorizontalRecoilAngle=150 ShellEjectClass=None FireSoundRef="KF_RevolverSnd.Revolver_Fire_M" StereoFireSoundRef="KF_RevolverSnd.Revolver_Fire_S" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeMagnumPistol' DamageMin=61 DamageMax=61 Momentum=15000.000000 bPawnRapidFireAnim=False FireLoopAnim= FireEndAnim= FireAnimRate=1.000000 FireRate=0.250000//0.3 AmmoClass=Class'NicePack.NiceMagnumAmmo' ShakeRotMag=(Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.650000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=40.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPickup.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPickup.uc new file mode 100644 index 0000000..a58b3a3 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPickup.uc @@ -0,0 +1,4 @@ +class NiceMagnumPickup extends NiceSinglePickup; +defaultproperties +{ Weight=1.000000 cost=125 AmmoCost=8 BuyClipSize=6 PowerValue=60 SpeedValue=40 RangeValue=65 Description="44 Magnum pistol, the most 'powerful' handgun in the world. Do you feel lucky?" ItemName="44 Magnum" ItemShortName="44 Magnum" AmmoItemName="44 Magnum Ammo" AmmoMesh=None InventoryType=Class'NicePack.NiceMagnumPistol' PickupMessage="You got the 44 Magnum" PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' StaticMesh=StaticMesh'KF_pickups3_Trip.Pistols.revolver_Pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPistol.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPistol.uc new file mode 100644 index 0000000..bbf6421 --- /dev/null +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPistol.uc @@ -0,0 +1,4 @@ +class NiceMagnumPistol extends NiceSingle; +defaultproperties +{ DualClass=Class'NicePack.NiceDualMagnum' reloadPreEndFrame=0.220000 reloadEndFrame=0.750000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.380000 reloadChargeStartFrame=-1.000000 MagCapacity=6 ReloadRate=1.2625 ReloadAnimRate=2 WeaponReloadAnim="Reload_Revolver" Weight=1.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Revolver' bIsTier2Weapon=True MeshRef="KF_Wep_Revolver.Revolver_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" SelectSoundRef="KF_RevolverSnd.WEP_Revolver_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Revolver_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Revolver" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceMagnumFire' AIRating=0.450000 CurrentRating=0.450000 Description="44 Magnum pistol, the most 'powerful' handgun in the world. Do you feel lucky?" EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=105 GroupOffset=7 PickupClass=Class'NicePack.NiceMagnumPickup' PlayerViewOffset=(X=12.000000,Y=15.000000,Z=-7.000000) AttachmentClass=Class'NicePack.NiceMagnumAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="44 Magnum" bUseDynamicLights=True TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissM.uc b/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissM.uc new file mode 100644 index 0000000..8e2eeda --- /dev/null +++ b/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissM.uc @@ -0,0 +1,5 @@ +class NiceDamTypeKrissM extends NiceDamTypeMedicBullet + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceKrissMMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissMDart.uc b/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissMDart.uc new file mode 100644 index 0000000..19bc6d0 --- /dev/null +++ b/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissMDart.uc @@ -0,0 +1,5 @@ +class NiceDamTypeKrissMDart extends NiceDamTypeMedicDart + abstract; +defaultproperties +{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceKrissMMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAltFire.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAltFire.uc new file mode 100644 index 0000000..7e54892 --- /dev/null +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAltFire.uc @@ -0,0 +1,4 @@ +class NiceKrissMAltFire extends NiceMedicDartFire; +defaultproperties +{ DamageType=Class'NicePack.NiceDamTypeKrissMDart' AmmoPerFire=75 +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmo.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmo.uc new file mode 100644 index 0000000..5640f8f --- /dev/null +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmo.uc @@ -0,0 +1,4 @@ +class NiceKrissMAmmo extends NiceAmmo; +defaultproperties +{ AmmoPickupAmount=33 MaxAmmo=528 InitialAmount=132 PickupClass=Class'NicePack.NiceKrissMAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="45. ACP bullets" +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmoPickup.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmoPickup.uc new file mode 100644 index 0000000..173686a --- /dev/null +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceKrissMAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=33 InventoryType=Class'NicePack.NiceKrissMAmmo' PickupMessage="Rounds 45. ACP" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAttachment.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAttachment.uc new file mode 100644 index 0000000..d50f498 --- /dev/null +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAttachment.uc @@ -0,0 +1,4 @@ +class NiceKrissMAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_Kriss" MovementAnims(1)="JogB_Kriss" MovementAnims(2)="JogL_Kriss" MovementAnims(3)="JogR_Kriss" TurnLeftAnim="TurnL_Kriss" TurnRightAnim="TurnR_Kriss" CrouchAnims(0)="CHWalkF_Kriss" CrouchAnims(1)="CHWalkB_Kriss" CrouchAnims(2)="CHWalkL_Kriss" CrouchAnims(3)="CHWalkR_Kriss" WalkAnims(0)="WalkF_Kriss" WalkAnims(1)="WalkB_Kriss" WalkAnims(2)="WalkL_Kriss" WalkAnims(3)="WalkR_Kriss" CrouchTurnRightAnim="CH_TurnR_Kriss" CrouchTurnLeftAnim="CH_TurnL_Kriss" IdleCrouchAnim="CHIdle_Kriss" IdleWeaponAnim="Idle_Kriss" IdleRestAnim="Idle_Kriss" IdleChatAnim="Idle_Kriss" IdleHeavyAnim="Idle_Kriss" IdleRifleAnim="Idle_Kriss" FireAnims(0)="Fire_Kriss" FireAnims(1)="Fire_Kriss" FireAnims(2)="Fire_Kriss" FireAnims(3)="Fire_Kriss" FireAltAnims(0)="Fire_Kriss" FireAltAnims(1)="Fire_Kriss" FireAltAnims(2)="Fire_Kriss" FireAltAnims(3)="Fire_Kriss" FireCrouchAnims(0)="CHFire_Kriss" FireCrouchAnims(1)="CHFire_Kriss" FireCrouchAnims(2)="CHFire_Kriss" FireCrouchAnims(3)="CHFire_Kriss" FireCrouchAltAnims(0)="CHFire_Kriss" FireCrouchAltAnims(1)="CHFire_Kriss" FireCrouchAltAnims(2)="CHFire_Kriss" FireCrouchAltAnims(3)="CHFire_Kriss" HitAnims(0)="HitF_Kriss" HitAnims(1)="HitB_Kriss" HitAnims(2)="HitL_Kriss" HitAnims(3)="HitR_Kriss" PostFireBlendStandAnim="Blend_Kriss" PostFireBlendCrouchAnim="CHBlend_Kriss" MeshRef="KF_Weapons3rd6_Trip.Kriss_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMFire.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMFire.uc new file mode 100644 index 0000000..5c8a50e --- /dev/null +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMFire.uc @@ -0,0 +1,4 @@ +class NiceKrissMFire extends NiceHighROFFire; +defaultproperties +{ FireEndSoundRef="KF_KrissSND.Kriss_Fire_End" FireEndStereoSoundRef="KF_KrissSND.KF_WEP_KRISS_END_S" AmbientFireSoundRef="KF_KrissSND.Kriss_Fire_Loop" ProjectileSpeed=15200.000000 RecoilRate=0.100000 maxVerticalRecoilAngle=20 maxHorizontalRecoilAngle=10 RecoilVelocityScale=0.000000 ShellEjectClass=Class'KFMod.ShellEjectKriss' ShellEjectBoneName="Shell_eject" NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" DamageType=Class'NicePack.NiceDamTypeKrissM' DamageMin=35 DamageMax=35 Momentum=12500.000000 FireRate=0.040000 AmmoClass=Class'NicePack.NiceKrissMAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMMedicGun.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMMedicGun.uc new file mode 100644 index 0000000..1c5eb7c --- /dev/null +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMMedicGun.uc @@ -0,0 +1,4 @@ +class NiceKrissMMedicGun extends NiceMedicGun; +defaultproperties +{ medicChargeRegenRate=20.000000 reloadPreEndFrame=0.150000 reloadEndFrame=0.580000 reloadChargeEndFrame=0.780000 reloadMagStartFrame=0.290000 reloadChargeStartFrame=0.680000 MagCapacity=33 ReloadRate=3.330000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_Kriss" Weight=4.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_KRISS' bIsTier3Weapon=True MeshRef="KF_Wep_Kriss.Kriss_Trip" SkinRefs(0)="Kf_Weapons9_Trip_T.Weapons.Medic_Kriss_cmb" SelectSoundRef="KF_KrissSND.KF_WEP_KRISS_Handling_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.KRISS_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.KRISS" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceKrissMFire' FireModeClass(1)=Class'NicePack.NiceKrissMAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The KRISS Vector has a very high rate of fire and is equipped with the attachment for the Horzine medical darts." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=120 InventoryGroup=3 GroupOffset=17 PickupClass=Class'NicePack.NiceKrissMPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceKrissMAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="KRISS Vector Medic Gun" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMPickup.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMPickup.uc new file mode 100644 index 0000000..70358b4 --- /dev/null +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMPickup.uc @@ -0,0 +1,4 @@ +class NiceKrissMPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=4.000000 cost=750 BuyClipSize=33 PowerValue=50 SpeedValue=90 RangeValue=40 Description="The KRISS Vector has a very high rate of fire and is equipped with the attachment for the Horzine medical darts." ItemName="KRISS Vector Medic Gun" ItemShortName="KRISS Vector" AmmoItemName="45. ACP Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.NeonKrissMPickup' InventoryType=Class'NicePack.NiceKrissMMedicGun' PickupMessage="You got the KRISS Vector Medic Gun" PickupSound=Sound'KF_KrissSND.Handling.KF_WEP_KRISS_Handling_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups6_Trip.Rifles.Kriss_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3M.uc b/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3M.uc new file mode 100644 index 0000000..7282bba --- /dev/null +++ b/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3M.uc @@ -0,0 +1,5 @@ +class NiceDamTypeM7A3M extends NiceDamTypeMedicBullet + abstract; +defaultproperties +{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceM7A3MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3MDart.uc b/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3MDart.uc new file mode 100644 index 0000000..c12ee60 --- /dev/null +++ b/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3MDart.uc @@ -0,0 +1,5 @@ +class NiceDamTypeM7A3MDart extends NiceDamTypeMedicDart + abstract; +defaultproperties +{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceM7A3MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAltFire.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAltFire.uc new file mode 100644 index 0000000..6815772 --- /dev/null +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAltFire.uc @@ -0,0 +1,4 @@ +class NiceM7A3MAltFire extends NiceMedicDartFire; +defaultproperties +{ DamageType=Class'NicePack.NiceDamTypeM7A3MDart' +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmo.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmo.uc new file mode 100644 index 0000000..989fa52 --- /dev/null +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmo.uc @@ -0,0 +1,4 @@ +class NiceM7A3MAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM7A3MPickup' AmmoPickupAmount=15 MaxAmmo=300 InitialAmount=75 PickupClass=Class'NicePack.NiceM7A3MAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M7A3 bullets" +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmoPickup.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmoPickup.uc new file mode 100644 index 0000000..d75d111 --- /dev/null +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM7A3MAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=15 InventoryType=Class'NicePack.NiceM7A3MAmmo' PickupMessage="Rounds 7.6x40mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAttachment.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAttachment.uc new file mode 100644 index 0000000..9a9b73a --- /dev/null +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAttachment.uc @@ -0,0 +1,4 @@ +class NiceM7A3MAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_Kriss" MovementAnims(1)="JogB_Kriss" MovementAnims(2)="JogL_Kriss" MovementAnims(3)="JogR_Kriss" TurnLeftAnim="TurnL_Kriss" TurnRightAnim="TurnR_Kriss" CrouchAnims(0)="CHWalkF_Kriss" CrouchAnims(1)="CHWalkB_Kriss" CrouchAnims(2)="CHWalkL_Kriss" CrouchAnims(3)="CHWalkR_Kriss" WalkAnims(0)="WalkF_Kriss" WalkAnims(1)="WalkB_Kriss" WalkAnims(2)="WalkL_Kriss" WalkAnims(3)="WalkR_Kriss" CrouchTurnRightAnim="CH_TurnR_Kriss" CrouchTurnLeftAnim="CH_TurnL_Kriss" IdleCrouchAnim="CHIdle_Kriss" IdleWeaponAnim="Idle_Kriss" IdleRestAnim="Idle_Kriss" IdleChatAnim="Idle_Kriss" IdleHeavyAnim="Idle_Kriss" IdleRifleAnim="Idle_Kriss" FireAnims(0)="Fire_Kriss" FireAnims(1)="Fire_Kriss" FireAnims(2)="Fire_Kriss" FireAnims(3)="Fire_Kriss" FireAltAnims(0)="Fire_Kriss" FireAltAnims(1)="Fire_Kriss" FireAltAnims(2)="Fire_Kriss" FireAltAnims(3)="Fire_Kriss" FireCrouchAnims(0)="CHFire_Kriss" FireCrouchAnims(1)="CHFire_Kriss" FireCrouchAnims(2)="CHFire_Kriss" FireCrouchAnims(3)="CHFire_Kriss" FireCrouchAltAnims(0)="CHFire_Kriss" FireCrouchAltAnims(1)="CHFire_Kriss" FireCrouchAltAnims(2)="CHFire_Kriss" FireCrouchAltAnims(3)="CHFire_Kriss" HitAnims(0)="HitF_Kriss" HitAnims(1)="HitB_Kriss" HitAnims(2)="HitL_Kriss" HitAnims(3)="HitR_Kriss" PostFireBlendStandAnim="Blend_Kriss" PostFireBlendCrouchAnim="CHBlend_Kriss" MeshRef="KF_Weapons3rd4_Trip.M7A3_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MFire.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MFire.uc new file mode 100644 index 0000000..57fcb50 --- /dev/null +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MFire.uc @@ -0,0 +1,4 @@ +class NiceM7A3MFire extends NiceFire; +defaultproperties +{ ProjectileSpeed=21250.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.085000 maxVerticalRecoilAngle=120 maxHorizontalRecoilAngle=60 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True FireSoundRef="KF_M7A3Snd.M7A3_Fire_M" StereoFireSoundRef="KF_M7A3Snd.M7A3_Fire_S" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeM7A3M' DamageMin=70 DamageMax=70 Momentum=7000.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.050000 FireForce="AssaultRifleFire" FireRate=0.080000 AmmoClass=Class'NicePack.NiceM7A3MAmmo' ShakeRotMag=(X=30.000000,Y=30.000000,Z=240.000000) ShakeRotRate=(X=8500.000000,Y=8500.000000,Z=8500.000000) ShakeRotTime=2.500000 ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.500000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MMedicGun.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MMedicGun.uc new file mode 100644 index 0000000..dfc759b --- /dev/null +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MMedicGun.uc @@ -0,0 +1,72 @@ +class NiceM7A3MMedicGun extends NiceMedicGun; +var localized string ReloadMessage; +var localized string EmptyMessage; +var Material ScopeGreen; +var Material ScopeRed; +var ScriptedTexture MyScriptedTexture; +var string MyMessage; +var Font MyFont; +var Font MyFont2; +var Font SmallMyFont; +var color MyFontColor; +var color MyFontColor2; +var int OldValue; + +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount) +{ + if(default.ScopeGreen == none) default.ScopeGreen = Material(DynamicLoadObject("KF_Weapons5_Scopes_Trip_T.M7A3.Scope_Finall", class'Material', true)); + if(default.ScopeRed == none) default.ScopeRed = Material(DynamicLoadObject("KF_Weapons5_Scopes_Trip_T.M7A3.ScopeRed_Shader", class'Material', true)); + if(default.MyScriptedTexture == none) default.MyScriptedTexture = ScriptedTexture(DynamicLoadObject("KF_Weapons5_Scopes_Trip_T.M7A3_Ammo_Script.AmmoNumber", class'ScriptedTexture', true)); + if(default.MyFont == none) default.MyFont = Font(DynamicLoadObject("IJCFonts.DigitalBig", class'Font', true)); + if(default.MyFont2 == none) default.MyFont2 = Font(DynamicLoadObject("IJCFonts.DigitalBig", class'Font', true)); + if(default.SmallMyFont == none) default.SmallMyFont = Font(DynamicLoadObject("IJCFonts.DigitalMed", class'Font', true)); + if(M7A3MMedicGun(Inv) != none){ M7A3MMedicGun(Inv).ScopeGreen = default.ScopeGreen; M7A3MMedicGun(Inv).ScopeRed = default.ScopeRed; M7A3MMedicGun(Inv).MyScriptedTexture = default.MyScriptedTexture; M7A3MMedicGun(Inv).MyFont = default.MyFont; M7A3MMedicGun(Inv).MyFont2 = default.MyFont2; M7A3MMedicGun(Inv).SmallMyFont = default.SmallMyFont; + } + super.PreloadAssets(Inv, bSkipRefCount); +} +static function bool UnloadAssets(){ + if(super.UnloadAssets()){ default.ScopeGreen = none; default.ScopeRed = none; default.MyScriptedTexture = none; default.MyFont = none; default.MyFont2 = none; default.SmallMyFont = none; return true; + } + return false; +} +simulated final function SetTextColor(byte R, byte G, byte B){ + MyFontColor.R = R; + MyFontColor.G = G; + MyFontColor.B = B; + MyFontColor.A = 255; +} +simulated final function SetTextColor2(byte R, byte G, byte B){ + MyFontColor2.R = R; + MyFontColor2.G = G; + MyFontColor2.B = B; + MyFontColor2.A = 255; + } +simulated function RenderOverlays(Canvas Canvas){ + if(medicCharge >= 50){ SetTextColor2(76,148,177); MyScriptedTexture.Revision ++; + } + else{ SetTextColor2(218,18,18); MyScriptedTexture.Revision ++; + } + if(AmmoAmount(0) <= 0){ if(OldValue != -5){ OldValue = -5; Skins[2] = ScopeRed; MyFont = SmallMyFont; SetTextColor(218,18,18); MyMessage = EmptyMessage; MyScriptedTexture.Revision ++; } + } + else if(bIsReloading){ if(OldValue != -4){ OldValue = -4; MyFont = SmallMyFont; SetTextColor(32,187,112); MyMessage = ReloadMessage; ++MyScriptedTexture.Revision; } + } + else if(OldValue != (MagAmmoRemaining + 1)){ OldValue = MagAmmoRemaining+1; Skins[2] = ScopeGreen; MyFont = Default.MyFont; + if(MagAmmoRemaining <= (MagCapacity/2)) SetTextColor(32,187,112); if(MagAmmoRemaining <= (MagCapacity / 3)){ SetTextColor(218,18,18); Skins[2] = ScopeRed; } if(MagAmmoRemaining >= (MagCapacity/2)) SetTextColor(76,148,177); MyMessage = String(MagAmmoRemaining); + MyScriptedTexture.Revision ++; + } + MyScriptedTexture.Client = Self; + Super.RenderOverlays(Canvas); + MyScriptedTexture.Client = None; +} +simulated function RenderTexture(ScriptedTexture Tex){ + local int w, h; + // Ammo + Tex.TextSize( MyMessage, MyFont, w, h ); + Tex.DrawText( ( Tex.USize / 2 ) - ( w / 2 ), ( Tex.VSize / 2 ) - ( h / 1.2 ),MyMessage, MyFont, MyFontColor ); + // Health + Tex.TextSize( int(medicCharge), MyFont2, w, h ); + Tex.DrawText( ( Tex.USize / 2 ) - ( w / 2 ), ( Tex.VSize / 2 ) - 8, int(medicCharge), MyFont2, MyFontColor2 ); +} +defaultproperties +{ ReloadMessage="REL" EmptyMessage="Empty" MyFontColor=(B=177,G=148,R=76,A=255) MyFontColor2=(B=177,G=148,R=76,A=255) reloadPreEndFrame=0.148000 reloadEndFrame=0.519000 reloadChargeEndFrame=0.740000 reloadMagStartFrame=0.222000 reloadChargeStartFrame=0.531000 MagCapacity=30 ReloadRate=3.066000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M7A3" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=3 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M7A3' bIsTier3Weapon=True MeshRef="KF_Wep_M7A3.M7A3" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.M7A3_cmb" SkinRefs(1)="KF_Weapons5_Scopes_Trip_T.M7A3_Ammo_Script.AmmoShader" SkinRefs(2)="KF_Weapons5_Scopes_Trip_T.M7A3.Scope_Finall" SelectSoundRef="KF_M7A3Snd.M7A3_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M7A3_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M7A3" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM7A3MFire' FireModeClass(1)=Class'NicePack.NiceM7A3MAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An advanced Horzine prototype assault rifle. Modified to fire healing darts." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=100 InventoryGroup=4 GroupOffset=13 PickupClass=Class'NicePack.NiceM7A3MPickup' PlayerViewOffset=(X=20.000000,Y=15.000000,Z=-5.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM7A3MAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M7A3 Medic Gun" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MPickup.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MPickup.uc new file mode 100644 index 0000000..f1169d8 --- /dev/null +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MPickup.uc @@ -0,0 +1,4 @@ +class NiceM7A3MPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=5.000000 cost=1250 AmmoCost=50 BuyClipSize=30 PowerValue=45 SpeedValue=60 RangeValue=55 Description="An advanced Horzine prototype assault rifle. Modified to fire healing darts." ItemName="M7A3 Medic Gun" ItemShortName="M7A3M" AmmoItemName="7.6x40mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceM7A3MMedicGun' PickupMessage="You got the M7A3 Medic Gun" PickupSound=Sound'KF_M7A3Snd.M7A3_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups4_Trip.Rifles.M7A3_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5M.uc b/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5M.uc new file mode 100644 index 0000000..056a74f --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5M.uc @@ -0,0 +1,5 @@ +class NiceDamTypeMP5M extends NiceDamTypeMedicBullet + abstract; +defaultproperties +{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceMP5MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5MDart.uc b/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5MDart.uc new file mode 100644 index 0000000..795fe86 --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5MDart.uc @@ -0,0 +1,5 @@ +class NiceDamTypeMP5MDart extends NiceDamTypeMedicDart + abstract; +defaultproperties +{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceMP5MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAltFire.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAltFire.uc new file mode 100644 index 0000000..bfaf798 --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAltFire.uc @@ -0,0 +1,4 @@ +class NiceMP5MAltFire extends NiceMedicDartFire; +defaultproperties +{ DamageType=Class'NicePack.NiceDamTypeMP5MDart' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmo.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmo.uc new file mode 100644 index 0000000..657f55b --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmo.uc @@ -0,0 +1,4 @@ +class NiceMP5MAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceMP5MPickup' AmmoPickupAmount=30 MaxAmmo=600 InitialAmount=150 PickupClass=Class'NicePack.NiceMP5MAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="MP5M bullets" +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmoPickup.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmoPickup.uc new file mode 100644 index 0000000..8289d36 --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceMP5MAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=30 InventoryType=Class'NicePack.NiceMP5MAmmo' PickupMessage="Rounds 9x19mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAttachment.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAttachment.uc new file mode 100644 index 0000000..19297fe --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAttachment.uc @@ -0,0 +1,4 @@ +class NiceMP5MAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_MP5" MovementAnims(1)="JogB_MP5" MovementAnims(2)="JogL_MP5" MovementAnims(3)="JogR_MP5" TurnLeftAnim="TurnL_MP5" TurnRightAnim="TurnR_MP5" CrouchAnims(0)="CHWalkF_MP5" CrouchAnims(1)="CHWalkB_MP5" CrouchAnims(2)="CHWalkL_MP5" CrouchAnims(3)="CHWalkR_MP5" WalkAnims(0)="WalkF_MP5" WalkAnims(1)="WalkB_MP5" WalkAnims(2)="WalkL_MP5" WalkAnims(3)="WalkR_MP5" CrouchTurnRightAnim="CH_TurnR_MP5" CrouchTurnLeftAnim="CH_TurnL_MP5" IdleCrouchAnim="CHIdle_MP5" IdleWeaponAnim="Idle_MP5" IdleRestAnim="Idle_MP5" IdleChatAnim="Idle_MP5" IdleHeavyAnim="Idle_MP5" IdleRifleAnim="Idle_MP5" FireAnims(0)="Fire_MP5" FireAnims(1)="Fire_MP5" FireAnims(2)="Fire_MP5" FireAnims(3)="Fire_MP5" FireAltAnims(0)="Fire_MP5" FireAltAnims(1)="Fire_MP5" FireAltAnims(2)="Fire_MP5" FireAltAnims(3)="Fire_MP5" FireCrouchAnims(0)="CHFire_MP5" FireCrouchAnims(1)="CHFire_MP5" FireCrouchAnims(2)="CHFire_MP5" FireCrouchAnims(3)="CHFire_MP5" FireCrouchAltAnims(0)="CHFire_MP5" FireCrouchAltAnims(1)="CHFire_MP5" FireCrouchAltAnims(2)="CHFire_MP5" FireCrouchAltAnims(3)="CHFire_MP5" HitAnims(0)="HitF_MP5" HitAnims(1)="HitB_MP5" HitAnims(2)="HitL_MP5" HitAnims(3)="HitR_MP5" PostFireBlendStandAnim="Blend_MP5" PostFireBlendCrouchAnim="CHBlend_MP5" MeshRef="KF_Weapons3rd3_Trip.Mp5_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MFire.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MFire.uc new file mode 100644 index 0000000..41eaf73 --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MFire.uc @@ -0,0 +1,4 @@ +class NiceMP5MFire extends NiceHighROFFire; +defaultproperties +{ FireEndSoundRef="KF_MP5Snd.MP5_Fire_Loop_End_M" FireEndStereoSoundRef="KF_MP5Snd.MP5_Fire_Loop_End_S" AmbientFireSoundRef="KF_MP5Snd.MP5_Fire_Loop" ProjectileSpeed=21250.000000 RecoilRate=0.075000 maxVerticalRecoilAngle=160 maxHorizontalRecoilAngle=80 RecoilVelocityScale=0.000000 ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' ShellEjectBoneName="Shell_eject" NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" DamageType=Class'NicePack.NiceDamTypeMP5M' DamageMin=35 DamageMax=35 Momentum=5500.000000 FireRate=0.075000 AmmoClass=Class'NicePack.NiceMP5MAmmo' ShakeRotMag=(X=25.000000,Y=25.000000,Z=125.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(X=4.000000,Y=2.500000,Z=5.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MMedicGun.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MMedicGun.uc new file mode 100644 index 0000000..af19c6d --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MMedicGun.uc @@ -0,0 +1,45 @@ +class NiceMP5MMedicGun extends NiceMedicGun; +var bool chargerOpen; +var float chargerStartOpeningTiming, chargerOpenedTiming, chargeCloseTiming; +var const string chargerStartOpeningTimeStr, chargerOpenedTimeStr, chargeCloseTimeStr; +function NicePlainData.Data GetNiceData(){ + local NicePlainData.Data transferData; + transferData = super.GetNiceData(); + class'NicePlainData'.static.SetBool(transferData, "MP5MChargerOpen", chargerOpen); + return transferData; +} +function SetNiceData(NicePlainData.Data transferData, optional NiceHumanPawn newOwner){ + super.SetNiceData(transferData, newOwner); + chargerOpen = class'NicePlainData'.static.GetBool(transferData, "MP5MChargerOpen", false); +} +simulated function PostBeginPlay(){ + local EventRecord record; + // Setup reload events + record.eventName = chargerStartOpeningTimeStr; + record.eventFrame = chargerStartOpeningTiming; + relEvents[relEvents.Length] = record; + record.eventName = chargerOpenedTimeStr; + record.eventFrame = chargerOpenedTiming; + relEvents[relEvents.Length] = record; + record.eventName = chargeCloseTimeStr; + record.eventFrame = chargeCloseTiming; + relEvents[relEvents.Length] = record; + super.PostBeginPlay(); +} +simulated function ReloadEvent(string eventName){ + local float magStart; + // Calculate the point from which we should resume the magazine part + if(bMagazineOut) magStart = 0.605; + else if(IsMagazineFull()) magStart = 0.868; + else magStart = 0.351; + // Jump if needed + if(eventName ~= chargerStartOpeningTimeStr && (bRoundInChamber || chargerOpen)){ ScrollAnim(magStart); lastEventCheckFrame = magStart; + } + // Flag changes + if(eventName ~= chargerOpenedTimeStr){ chargerOpen = true; if(bMagazineOut || !IsMagazineFull()){ ScrollAnim(magStart); lastEventCheckFrame = magStart; } + } + if(eventName ~= chargeCloseTimeStr) chargerOpen = false; +} +defaultproperties +{ chargerOpen=True chargerStartOpeningTiming=0.010000 chargerOpenedTiming=0.175000 chargeCloseTiming=0.895000 chargerStartOpeningTimeStr="openChargerS" chargerOpenedTimeStr="openChargerE" chargeCloseTimeStr="closeCharger" reloadPreEndFrame=0.544000 reloadEndFrame=0.728000 reloadChargeEndFrame=0.895000 MagazineBone="Empty_Magazine" MagCapacity=30 ReloadRate=3.040000 ReloadAnim="Reload" ReloadAnimRate=1.250000 WeaponReloadAnim="Reload_MP5" Weight=4.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Mp5Medic' bIsTier2Weapon=True MeshRef="KF_Wep_MP5.MP5_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.MP5_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_MP5Snd.WEP_MP5_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Mp5Medic_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Mp5Medic" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceMP5MFire' FireModeClass(1)=Class'NicePack.NiceMP5MAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="MP5 sub machine gun. Modified to fire healing darts. Better damage and healing than MP7M with a larger mag." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=80 InventoryGroup=3 GroupOffset=4 PickupClass=Class'NicePack.NiceMP5MPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceMP5MAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="MP5M Medic Gun" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MPickup.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MPickup.uc new file mode 100644 index 0000000..e0bd83f --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MPickup.uc @@ -0,0 +1,4 @@ +class NiceMP5MPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=4.000000 cost=250 AmmoCost=10 BuyClipSize=30 PowerValue=30 SpeedValue=85 RangeValue=45 Description="MP5 sub machine gun. Modified to fire healing darts. Better damage and healing than MP7M with a larger mag." ItemName="MP5M Medic Gun" ItemShortName="MP5M" AmmoItemName="9x19mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.CamoMP5MPickup' InventoryType=Class'NicePack.NiceMP5MMedicGun' PickupMessage="You got the MP5M Medic Gun" PickupSound=Sound'KF_MP5Snd.foley.WEP_MP5_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.Mp5_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7M.uc b/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7M.uc new file mode 100644 index 0000000..54216be --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7M.uc @@ -0,0 +1,5 @@ +class NiceDamTypeMP7M extends NiceDamTypeMedicBullet + abstract; +defaultproperties +{ bPenetrationHSOnly=True MaxPenetrations=1 HeadShotDamageMult=2.250000 WeaponClass=Class'NicePack.NiceMP7MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7MDart.uc b/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7MDart.uc new file mode 100644 index 0000000..e3c049c --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7MDart.uc @@ -0,0 +1,5 @@ +class NiceDamTypeMP7MDart extends NiceDamTypeMedicDart + abstract; +defaultproperties +{ HeadShotDamageMult=3.000000 WeaponClass=Class'NicePack.NiceMP7MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAltFire.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAltFire.uc new file mode 100644 index 0000000..82e4a30 --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAltFire.uc @@ -0,0 +1,4 @@ +class NiceMP7MAltFire extends NiceMedicDartFire; +defaultproperties +{ DamageType=Class'NicePack.NiceDamTypeMP7MDart' AmmoPerFire=35 +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmo.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmo.uc new file mode 100644 index 0000000..7ddb7ba --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmo.uc @@ -0,0 +1,4 @@ +class NiceMP7MAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceMP7MPickup' MaxAmmo=400 InitialAmount=100 PickupClass=Class'NicePack.NiceMP7MAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="MP7M bullets" +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmoPickup.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmoPickup.uc new file mode 100644 index 0000000..c66870f --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceMP7MAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=40 InventoryType=Class'NicePack.NiceMP7MAmmo' PickupMessage="Rounds 4.6x30mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAttachment.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAttachment.uc new file mode 100644 index 0000000..d64dbe1 --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAttachment.uc @@ -0,0 +1,4 @@ +class NiceMP7MAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_MP7" MovementAnims(1)="JogB_MP7" MovementAnims(2)="JogL_MP7" MovementAnims(3)="JogR_MP7" TurnLeftAnim="TurnL_MP7" TurnRightAnim="TurnR_MP7" CrouchAnims(0)="CHWalkF_MP7" CrouchAnims(1)="CHWalkB_MP7" CrouchAnims(2)="CHWalkL_MP7" CrouchAnims(3)="CHWalkR_MP7" WalkAnims(0)="WalkF_MP7" WalkAnims(1)="WalkB_MP7" WalkAnims(2)="WalkL_MP7" WalkAnims(3)="WalkR_MP7" CrouchTurnRightAnim="CH_TurnR_MP7" CrouchTurnLeftAnim="CH_TurnL_MP7" IdleCrouchAnim="CHIdle_MP7" IdleWeaponAnim="Idle_MP7" IdleRestAnim="Idle_MP7" IdleChatAnim="Idle_MP7" IdleHeavyAnim="Idle_MP7" IdleRifleAnim="Idle_MP7" FireAnims(0)="Fire_MP7" FireAnims(1)="Fire_MP7" FireAnims(2)="Fire_MP7" FireAnims(3)="Fire_MP7" FireAltAnims(0)="Fire_MP7" FireAltAnims(1)="Fire_MP7" FireAltAnims(2)="Fire_MP7" FireAltAnims(3)="Fire_MP7" FireCrouchAnims(0)="CHFire_MP7" FireCrouchAnims(1)="CHFire_MP7" FireCrouchAnims(2)="CHFire_MP7" FireCrouchAnims(3)="CHFire_MP7" FireCrouchAltAnims(0)="CHFire_MP7" FireCrouchAltAnims(1)="CHFire_MP7" FireCrouchAltAnims(2)="CHFire_MP7" FireCrouchAltAnims(3)="CHFire_MP7" HitAnims(0)="HitF_MP7" HitAnims(1)="HitB_MP7" HitAnims(2)="HitL_MP7" HitAnims(3)="HitR_MP7" PostFireBlendStandAnim="Blend_MP7" PostFireBlendCrouchAnim="CHBlend_MP7" MeshRef="KF_Weapons3rd2_Trip.mp7_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MFire.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MFire.uc new file mode 100644 index 0000000..0365294 --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MFire.uc @@ -0,0 +1,4 @@ +class NiceMP7MFire extends NiceHighROFFire; +defaultproperties +{ FireEndSoundRef="KF_MP7Snd.MP7_tail" FireEndStereoSoundRef="KF_MP7Snd.MP7_tailST" AmbientFireSoundRef="KF_MP7Snd.MP7_FireLoop" ProjectileSpeed=36750.000000 RecoilRate=0.060000 maxVerticalRecoilAngle=70 maxHorizontalRecoilAngle=35 RecoilVelocityScale=0.000000 ShellEjectClass=Class'ROEffects.KFShellEjectMP' ShellEjectBoneName="Shell_eject" NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" DamageType=Class'NicePack.NiceDamTypeMP7M' DamageMin=20 DamageMax=20 Momentum=5500.000000 FireRate=0.063000 AmmoClass=Class'NicePack.NiceMP7MAmmo' ShakeRotMag=(X=25.000000,Y=25.000000,Z=125.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(X=4.000000,Y=2.500000,Z=5.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' Spread=0.012000 SpreadStyle=SS_Random +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MMedicGun.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MMedicGun.uc new file mode 100644 index 0000000..461a713 --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MMedicGun.uc @@ -0,0 +1,4 @@ +class NiceMP7MMedicGun extends NiceMedicGun; +defaultproperties +{ medicChargeRegenRate=7.000000 reloadPreEndFrame=0.074000 reloadEndFrame=0.574000 reloadChargeEndFrame=0.809000 reloadMagStartFrame=0.117000 reloadChargeStartFrame=0.681000 MagCapacity=40 ReloadRate=3.166000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_MP7" Weight=3.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MP7m' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.MP7_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.MP_7_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_MP7Snd.MP7_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.MP7m_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MP7m" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceMP7MFire' FireModeClass(1)=Class'NicePack.NiceMP7MAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An advanced prototype submachine gun. Modified to fire healing darts." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=90 InventoryGroup=3 GroupOffset=5 PickupClass=Class'NicePack.NiceMP7MPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceMP7MAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="MP7M Medic Gun" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MPickup.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MPickup.uc new file mode 100644 index 0000000..89e8184 --- /dev/null +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MPickup.uc @@ -0,0 +1,4 @@ +class NiceMP7MPickup extends NiceWeaponPickup; +defaultproperties +{ bBackupWeapon=True Weight=3.000000 cost=200 BuyClipSize=40 PowerValue=22 SpeedValue=95 RangeValue=45 Description="Prototype sub machine gun. Modified to fire healing darts." ItemName="MP7M Medic Gun" ItemShortName="MP7M" AmmoItemName="4.6x30mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceMP7MMedicGun' PickupMessage="You got the MP7M Medic Gun" PickupSound=Sound'KF_MP7Snd.MP7_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.MP7_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Ammo.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Ammo.uc new file mode 100644 index 0000000..9c28ccb --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Ammo.uc @@ -0,0 +1,5 @@ +class NiceAA12Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceAA12Pickup' AmmoPickupAmount=20 MaxAmmo=100 InitialAmount=25 PickupClass=Class'NicePack.NiceAA12AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AmmoPickup.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AmmoPickup.uc new file mode 100644 index 0000000..351a44d --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceAA12AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=20 InventoryType=Class'NicePack.NiceAA12Ammo' PickupMessage="12-Gauge Drum" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Attachment.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Attachment.uc new file mode 100644 index 0000000..3a5b35c --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Attachment.uc @@ -0,0 +1,4 @@ +class NiceAA12Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_AA12" MovementAnims(1)="JogB_AA12" MovementAnims(2)="JogL_AA12" MovementAnims(3)="JogR_AA12" TurnLeftAnim="TurnL_AA12" TurnRightAnim="TurnR_AA12" CrouchAnims(0)="CHWalkF_AA12" CrouchAnims(1)="CHWalkB_AA12" CrouchAnims(2)="CHWalkL_AA12" CrouchAnims(3)="CHWalkR_AA12" WalkAnims(0)="WalkF_AA12" WalkAnims(1)="WalkB_AA12" WalkAnims(2)="WalkL_AA12" WalkAnims(3)="WalkR_AA12" CrouchTurnRightAnim="CH_TurnR_AA12" CrouchTurnLeftAnim="CH_TurnL_AA12" IdleCrouchAnim="CHIdle_AA12" IdleWeaponAnim="Idle_AA12" IdleRestAnim="Idle_AA12" IdleChatAnim="Idle_AA12" IdleHeavyAnim="Idle_AA12" IdleRifleAnim="Idle_AA12" FireAnims(0)="Fire_AA12" FireAnims(1)="Fire_AA12" FireAnims(2)="Fire_AA12" FireAnims(3)="Fire_AA12" FireAltAnims(0)="Fire_AA12" FireAltAnims(1)="Fire_AA12" FireAltAnims(2)="Fire_AA12" FireAltAnims(3)="Fire_AA12" FireCrouchAnims(0)="CHFire_AA12" FireCrouchAnims(1)="CHFire_AA12" FireCrouchAnims(2)="CHFire_AA12" FireCrouchAnims(3)="CHFire_AA12" FireCrouchAltAnims(0)="CHFire_AA12" FireCrouchAltAnims(1)="CHFire_AA12" FireCrouchAltAnims(2)="CHFire_AA12" FireCrouchAltAnims(3)="CHFire_AA12" HitAnims(0)="HitF_AA12" HitAnims(1)="HitB_AA12" HitAnims(2)="HitL_AA12" HitAnims(3)="HitR_AA12" PostFireBlendStandAnim="Blend_AA12" PostFireBlendCrouchAnim="CHBlend_AA12" MeshRef="KF_Weapons3rd2_Trip.AA12_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AutoShotgun.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AutoShotgun.uc new file mode 100644 index 0000000..8aae5a0 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AutoShotgun.uc @@ -0,0 +1,15 @@ +class NiceAA12AutoShotgun extends NiceWeapon; + +// Use alt fire to switch fire modes +simulated function AltFire(float F){ + DoToggle(); +} + +exec function SwitchModes(){ + DoToggle(); +} + +defaultproperties +{ reloadPreEndFrame=0.473000 reloadEndFrame=0.828000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.591000 reloadChargeStartFrame=-1.000000 MagCapacity=20 + Weight=6.000000 ReloadRate=3.133000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AA12" bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_AA12' bIsTier3Weapon=True MeshRef="KF_Weapons2_Trip.AA12_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.AA12_cmb" SelectSoundRef="KF_AA12Snd.AA12_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.AA12_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.AA12" PlayerIronSightFOV=80.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceAA12Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An advanced fully automatic shotgun." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=200 InventoryGroup=4 GroupOffset=10 PickupClass=Class'NicePack.NiceAA12Pickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-2.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceAA12Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="AA12 Shotgun" TransientSoundVolume=1.250000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Fire.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Fire.uc new file mode 100644 index 0000000..5d066d0 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Fire.uc @@ -0,0 +1,4 @@ +class NiceAA12Fire extends NiceShotgunFire; +defaultproperties +{ ProjPerFire=5 KickMomentum=(X=-35.000000,Z=5.000000) maxVerticalRecoilAngle=1000 maxHorizontalRecoilAngle=500 ShellEjectClass=Class'ROEffects.KFShellEjectShotty' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_AA12Snd.AA12_Fire" StereoFireSoundRef="KF_AA12Snd.AA12_FireST" NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" DamageType=Class'NicePack.NiceDamTypeAA12Shotgun' DamageMax=48 Momentum=60000.000000 bWaitForRelease=False FireAnimRate=1.000000 FireRate=0.200000 AmmoClass=Class'NicePack.NiceAA12Ammo' ShakeRotMag=(Z=250.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(Z=6.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Pickup.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Pickup.uc new file mode 100644 index 0000000..279fb47 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Pickup.uc @@ -0,0 +1,4 @@ +class NiceAA12Pickup extends NiceWeaponPickup; +defaultproperties +{ cost=1250 AmmoCost=80 BuyClipSize=20 PowerValue=85 SpeedValue=65 RangeValue=20 Description="An advanced fully automatic shotgun." ItemName="AA12 Shotgun" ItemShortName="AA12 Shotgun" AmmoItemName="12-gauge drum" CorrespondingPerkIndex=1 EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.GoldenAA12Pickup' InventoryType=Class'NicePack.NiceAA12AutoShotgun' PickupMessage="You got the AA12 auto shotgun." PickupSound=Sound'KF_AA12Snd.AA12_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Shotguns.AA12_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceDamTypeAA12Shotgun.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceDamTypeAA12Shotgun.uc new file mode 100644 index 0000000..bf5e4ce --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceDamTypeAA12Shotgun.uc @@ -0,0 +1,5 @@ +class NiceDamTypeAA12Shotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ MaxPenetrations=5 PenDmgReduction=0.900000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceAA12AutoShotgun' DeathString="%k killed %o (AA12 Shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmo.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmo.uc new file mode 100644 index 0000000..0fcfe55 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmo.uc @@ -0,0 +1,4 @@ +class NiceBenelliAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceBenelliPickup' AmmoPickupAmount=6 MaxAmmo=60 InitialAmount=15 PickupClass=Class'NicePack.NiceBenelliAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmoPickup.uc new file mode 100644 index 0000000..014b44d --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceBenelliAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=6 InventoryType=Class'NicePack.NiceBenelliAmmo' PickupMessage="12-Gauge Shells" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAttachment.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAttachment.uc new file mode 100644 index 0000000..d335d45 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAttachment.uc @@ -0,0 +1,4 @@ +class NiceBenelliAttachment extends NiceShotgunAttachment; +defaultproperties +{ FireAnims(0)="Fire_Benelli" FireAnims(1)="Fire_Benelli" FireAnims(2)="Fire_Benelli" FireAnims(3)="Fire_Benelli" FireAltAnims(0)="Fire_Benelli" FireAltAnims(1)="Fire_Benelli" FireAltAnims(2)="Fire_Benelli" FireAltAnims(3)="Fire_Benelli" FireCrouchAnims(0)="CHFire_Benelli" FireCrouchAnims(1)="CHFire_Benelli" FireCrouchAnims(2)="CHFire_Benelli" FireCrouchAnims(3)="CHFire_Benelli" FireCrouchAltAnims(0)="CHFire_Benelli" FireCrouchAltAnims(1)="CHFire_Benelli" FireCrouchAltAnims(2)="CHFire_Benelli" FireCrouchAltAnims(3)="CHFire_Benelli" MeshRef="KF_Weapons3rd3_Trip.Benelli_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliFire.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliFire.uc new file mode 100644 index 0000000..4646c37 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliFire.uc @@ -0,0 +1,4 @@ +class NiceBenelliFire extends NiceShotgunFire; +defaultproperties +{ KickMomentum=(X=-45.000000,Z=10.000000) ShellEjectClass=Class'ROEffects.KFShellEjectBenelli' ShellEjectBoneName="Shell_eject" DamageType=Class'NicePack.NiceDamTypeBenelli' FireAnimRate=1.000000 FireRate=0.200000 AmmoClass=Class'NicePack.NiceBenelliAmmo' BotRefireRate=0.200000 +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliPickup.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliPickup.uc new file mode 100644 index 0000000..ccfeeb0 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliPickup.uc @@ -0,0 +1,4 @@ +class NiceBenelliPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=8.000000 cost=500 BuyClipSize=6 PowerValue=70 SpeedValue=60 RangeValue=15 Description="A military tactical shotgun with semi automatic fire capability. Holds up to 6 shells. " ItemName="Benelli shotgun" ItemShortName="Benelli shotgun" AmmoItemName="12-gauge shells" CorrespondingPerkIndex=1 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.GoldenBenelliPickup' InventoryType=Class'NicePack.NiceBenelliShotgun' PickupMessage="You got the Benelli shotgun" PickupSound=Sound'KF_M4ShotgunSnd.foley.WEP_Benelli_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.Benelli_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliShotgun.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliShotgun.uc new file mode 100644 index 0000000..35a2648 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliShotgun.uc @@ -0,0 +1,8 @@ +class NiceBenelliShotgun extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 6 shells during 174 frames tops, with first shell loaded at frame 22, with 24 frames between load moments + generateReloadStages(6, 174, 22, 24); +} +defaultproperties +{ bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_SINGLE FirstPersonFlashlightOffset=(X=-25.000000,Y=-18.000000,Z=8.000000) MagCapacity=6 ReloadRate=0.750000 ReloadAnim="Reload" ReloadAnimRate=1.200000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=5.000000 bTorchEnabled=True bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Beneli' bIsTier2Weapon=True MeshRef="KF_Wep_Benelli.Benelli_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Benelli_M4_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_M4ShotgunSnd.WEP_Benelli_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Beneli_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Beneli" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceBenelliFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 bShowChargingBar=True Description="A military tactical shotgun with semi automatic fire capability. Holds up to 6 shells. " DisplayFOV=65.000000 Priority=170 InventoryGroup=3 GroupOffset=9 PickupClass=Class'NicePack.NiceBenelliPickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceBenelliAttachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="Benelli shotgun" TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceDamTypeBenelli.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceDamTypeBenelli.uc new file mode 100644 index 0000000..24b352d --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceDamTypeBenelli.uc @@ -0,0 +1,5 @@ +class NiceDamTypeBenelli extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ MaxPenetrations=3 MediumZedPenDmgReduction=1.000000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceBenelliShotgun' DeathString="%k killed %o (Benelli Shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStick.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStick.uc new file mode 100644 index 0000000..29eb1b6 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStick.uc @@ -0,0 +1,52 @@ +class NiceBoomStick extends NiceWeapon; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +var float glueTiming; +var float firstShellTiming, secondShellTiming, jumpTiming; +var const string firstShellStr, secondShellStr, jumpStr; +simulated function PostBeginPlay(){ + local EventRecord record; + local AutoReloadAnimDesc reloadDesc; + // Setup animation timings + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.056; + reloadDesc.trashStartFrame = secondShellTiming; + reloadDesc.resumeFrame = 0.056; + reloadDesc.speedFrame = 0.056; + // Setup all possible fire animations + reloadDesc.animName = 'Fire_Both'; + autoReloadsDescriptions[0] = reloadDesc; + reloadDesc.animName = 'Fire_Both_Iron'; + autoReloadsDescriptions[1] = reloadDesc; + reloadDesc.animName = 'Fire_Last'; + autoReloadsDescriptions[2] = reloadDesc; + reloadDesc.animName = 'Fire_Last_Iron'; + autoReloadsDescriptions[3] = reloadDesc; + // Setup reload events + record.eventName = jumpStr; + record.eventFrame = jumpTiming; + relEvents[relEvents.Length] = record; + record.eventName = firstShellStr; + record.eventFrame = firstShellTiming; + relEvents[relEvents.Length] = record; + record.eventName = secondShellStr; + record.eventFrame = secondShellTiming; + relEvents[relEvents.Length] = record; + super.PostBeginPlay(); +} +simulated function ReloadEvent(string eventName){ + if(eventName ~= jumpStr && GetMagazineAmmo() > 0) SetAnimFrame(glueTiming); + if(eventName ~= firstShellStr) MagAmmoRemainingClient = Min(1, AmmoAmount(0)); + else if(eventName ~= secondShellStr) MagAmmoRemainingClient = Min(2, AmmoAmount(0)); + ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); +} +simulated function AddAutoReloadedAmmo(){ + MagAmmoRemainingClient = Min(2, AmmoAmount(0)); + ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); +} +simulated function bool AltFireCanForceInterruptReload(){ + return (GetMagazineAmmo() > 0); +} +defaultproperties +{ glueTiming=0.633330 firstShellTiming=0.555550 secondShellTiming=0.733330 jumpTiming=0.388880 firstShellStr="firstShell" secondShellStr="secondShellStr" jumpStr="jumpStr" bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_AUTO ForceZoomOutOnFireTime=0.010000 ForceZoomOutOnAltFireTime=0.010000 MagCapacity=2 + Weight=6.000000 ReloadRate=2.250000 ReloadAnim="Reload" ReloadAnimRate=1.100000 bHoldToReload=True WeaponReloadAnim="Reload_HuntingShotgun" bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Hunting_Shotgun' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.BoomStick_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Shotguns.boomstick_cmb" SelectSoundRef="KF_DoubleSGSnd.2Barrel_Select" HudImageRef="KillingFloorHUD.WeaponSelect.BoomStic_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.BoomStick" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceBoomStickAltFire' FireModeClass(1)=Class'NicePack.NiceBoomStickFire' PutDownAnim="PutDown" AIRating=0.900000 CurrentRating=0.900000 bSniping=False Description="A double barreled shotgun used by big game hunters. It fires two slugs simultaneously and can bring down even the largest targets, quickly." DisplayFOV=55.000000 Priority=160 InventoryGroup=4 GroupOffset=2 PickupClass=Class'NicePack.NiceBoomStickPickup' PlayerViewOffset=(X=8.000000,Y=14.000000,Z=-8.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceBoomStickAttachment' ItemName="Hunting Shotgun" bUseDynamicLights=True TransientSoundVolume=1.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAltFire.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAltFire.uc new file mode 100644 index 0000000..2c5fc91 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAltFire.uc @@ -0,0 +1,26 @@ +class NiceBoomStickAltFire extends NiceBoomStickFire; +// Overload to force last shot to have a different animation with reload +// NICETODO: uncomment this +/*function name GetCorrectAnim(bool bLoop, bool bAimed){ + if(currentContext.sourceWeapon != none && currentContext.sourceWeapon.MagAmmoRemainingClient > 0) + return super.GetCorrectAnim(bLoop, bAimed); + if(bAimed) + return 'Fire_Last_Iron'; + else + return 'Fire_Last'; + return FireAnim; +}*/ +defaultproperties +{ + KickMomentum=(X=-50.000000,Z=22.000000) + FireAimedAnim="Fire_Iron" + maxVerticalRecoilAngle=1500 + FireSoundRef="KF_DoubleSGSnd.2Barrel_Fire" + StereoFireSoundRef="KF_DoubleSGSnd.2Barrel_FireST" + TransientSoundVolume=1.800000 + FireAnim="Fire" + AmmoPerFire=1 + ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) + ShakeRotTime=5.000000 + ShakeOffsetTime=3.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAttachment.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAttachment.uc new file mode 100644 index 0000000..4185a16 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAttachment.uc @@ -0,0 +1,4 @@ +class NiceBoomStickAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_HuntingShotgun" MovementAnims(1)="JogB_HuntingShotgun" MovementAnims(2)="JogL_HuntingShotgun" MovementAnims(3)="JogR_HuntingShotgun" TurnLeftAnim="TurnL_HuntingShotgun" TurnRightAnim="TurnR_HuntingShotgun" CrouchAnims(0)="CHwalkF_HuntingShotgun" CrouchAnims(1)="CHwalkB_HuntingShotgun" CrouchAnims(2)="CHwalkL_HuntingShotgun" CrouchAnims(3)="CHwalkR_HuntingShotgun" WalkAnims(0)="WalkF_HuntingShotgun" WalkAnims(1)="WalkB_HuntingShotgun" WalkAnims(2)="WalkL_HuntingShotgun" WalkAnims(3)="WalkR_HuntingShotgun" CrouchTurnRightAnim="CH_TurnR_HuntingShotgun" CrouchTurnLeftAnim="CH_TurnL_HuntingShotgun" IdleCrouchAnim="CHIdle_HuntingShotgun" IdleWeaponAnim="Idle_HuntingShotgun" IdleRestAnim="Idle_HuntingShotgun" IdleChatAnim="Idle_HuntingShotgun" IdleHeavyAnim="Idle_HuntingShotgun" IdleRifleAnim="Idle_HuntingShotgun" FireAnims(0)="Fire_HuntingShotgun" FireAnims(1)="Fire_HuntingShotgun" FireAnims(2)="Fire_HuntingShotgun" FireAnims(3)="Fire_HuntingShotgun" FireAltAnims(0)="Fire_HuntingShotgun" FireAltAnims(1)="Fire_HuntingShotgun" FireAltAnims(2)="Fire_HuntingShotgun" FireAltAnims(3)="Fire_HuntingShotgun" FireCrouchAnims(0)="CHFire_HuntingShotgun" FireCrouchAnims(1)="CHFire_HuntingShotgun" FireCrouchAnims(2)="CHFire_HuntingShotgun" FireCrouchAnims(3)="CHFire_HuntingShotgun" FireCrouchAltAnims(0)="CHFire_HuntingShotgun" FireCrouchAltAnims(1)="CHFire_HuntingShotgun" FireCrouchAltAnims(2)="CHFire_HuntingShotgun" FireCrouchAltAnims(3)="CHFire_HuntingShotgun" HitAnims(0)="HitF_HuntingShotgun" HitAnims(1)="HitB_HuntingShotgun" HitAnims(2)="HitL_HuntingShotgun" HitAnims(3)="HitR_HuntingShotgun" PostFireBlendStandAnim="Blend_HuntingShotgun" PostFireBlendCrouchAnim="CHBlend_HuntingShotgun" MeshRef="KF_Weapons3rd_Trip.HuntingShot_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickFire.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickFire.uc new file mode 100644 index 0000000..7715c02 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickFire.uc @@ -0,0 +1,62 @@ +class NiceBoomStickFire extends NiceShotgunFire; +var Emitter Flash2Emitter; +var name MuzzleBoneLeft; +var name MuzzleBoneRight; +simulated function InitEffects(){ + if((Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != none)) + return; + if((FlashEmitterClass != none) && ((FlashEmitter == none) || FlashEmitter.bDeleteMe)){ + FlashEmitter = Weapon.Spawn(FlashEmitterClass); + Weapon.AttachToBone(FlashEmitter, MuzzleBoneLeft); + } + if((FlashEmitterClass != none) && ((Flash2Emitter == none) || Flash2Emitter.bDeleteMe)){ + Flash2Emitter = Weapon.Spawn(FlashEmitterClass); + Weapon.AttachToBone(Flash2Emitter, MuzzleBoneRight); + } + if((SmokeEmitterClass != none) && ((SmokeEmitter == none) || SmokeEmitter.bDeleteMe)) + SmokeEmitter = Weapon.Spawn(SmokeEmitterClass); +} +simulated function DestroyEffects(){ + super.DestroyEffects(); + if(Flash2Emitter != none) + Flash2Emitter.Destroy(); +}//MEANTODO +/*function FlashMuzzleFlash(){ + if(currentContext.sourceWeapon == none) + return; + if(currentContext.sourceWeapon.MagAmmoRemainingClient == 2){ + if(Flash2Emitter != none) + Flash2Emitter.Trigger(Weapon, Instigator); + } + else if(FlashEmitter != none) + FlashEmitter.Trigger(Weapon, Instigator); +}*/ +defaultproperties +{ + MuzzleBoneLeft="Tip_Left" + MuzzleBoneRight="Tip_Right" + FireIncompleteAnim="Fire_Last" + FireIncompleteAimedAnim="Fire_Last_Iron" + bCanFireIncomplete=True + ProjPerFire=10 + KickMomentum=(X=-105.000000,Z=55.000000) + FireAimedAnim="Fire_Both_Iron" + RecoilRate=0.070000 + maxVerticalRecoilAngle=3200 + FireSoundRef="KF_DoubleSGSnd.2Barrel_Fire_Dual" + StereoFireSoundRef="KF_DoubleSGSnd.2Barrel_Fire_DualST" + NoAmmoSoundRef="KF_DoubleSGSnd.2Barrel_DryFire" + DamageType=Class'NicePack.NiceDamTypeDBShotgun' + DamageMax=63 + TransientSoundVolume=1.900000 + FireAnim="Fire_Both" + FireRate=0.000000 + AmmoClass=Class'NicePack.NiceDBShotgunAmmo' + AmmoPerFire=2 + ShakeRotMag=(X=75.000000,Y=75.000000,Z=600.000000) + ShakeRotTime=6.000000 + ShakeOffsetTime=3.500000 + BotRefireRate=2.500000 + aimerror=2.000000 + Spread=3000.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickPickup.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickPickup.uc new file mode 100644 index 0000000..541f908 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickPickup.uc @@ -0,0 +1,5 @@ +class NiceBoomStickPickup extends NiceWeaponPickup; +var int SingleShotCount; +defaultproperties +{ cost=500 BuyClipSize=2 PowerValue=90 SpeedValue=30 RangeValue=12 Description="A double barreled shotgun used by big game hunters." ItemName="Hunting Shotgun" ItemShortName="Hunting Shotgun" AmmoItemName="12-gauge Hunting shells" CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceBoomStick' PickupMessage="You got the Hunting Shotgun" PickupSound=Sound'KF_DoubleSGSnd.2Barrel_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Shotgun.boomstick_pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmo.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmo.uc new file mode 100644 index 0000000..f495687 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmo.uc @@ -0,0 +1,5 @@ +class NiceDBShotgunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceBoomStickPickup' AmmoPickupAmount=6 MaxAmmo=64 InitialAmount=16 PickupClass=Class'NicePack.NiceDBShotgunAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) ItemName="Shotgun Ammo" +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmoPickup.uc new file mode 100644 index 0000000..8ba6658 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceDBShotgunAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=6 InventoryType=Class'NicePack.NiceDBShotgunAmmo' PickupMessage="12 Gauge Premium Slugs" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceDamTypeDBShotgun.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDamTypeDBShotgun.uc new file mode 100644 index 0000000..972ef97 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDamTypeDBShotgun.uc @@ -0,0 +1,5 @@ +class NiceDamTypeDBShotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ MaxPenetrations=4 MediumZedPenDmgReduction=1.000000 PenDmgReduction=0.800000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceBoomStick' DeathString="%k killed %o (Hunting shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceDamTypeKSGShotgun.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceDamTypeKSGShotgun.uc new file mode 100644 index 0000000..ea0ba41 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceDamTypeKSGShotgun.uc @@ -0,0 +1,5 @@ +class NiceDamTypeKSGShotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ MaxPenetrations=3 BigZedPenDmgReduction=0.000000 MediumZedPenDmgReduction=0.250000 PenDmgReduction=0.900000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceKSGShotgun' DeathString="%k killed %o (HSG Shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAltFire.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAltFire.uc new file mode 100644 index 0000000..860f9c9 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAltFire.uc @@ -0,0 +1,4 @@ +class NiceKSGAltFire extends NiceKSGFire; +defaultproperties +{ ProjPerFire=18 DamageMax=19 bWaitForRelease=False FireAnimRate=1.000000 FireRate=0.820000 Spread=1500.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmo.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmo.uc new file mode 100644 index 0000000..a1b794f --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmo.uc @@ -0,0 +1,5 @@ +class NiceKSGAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceKSGPickup' AmmoPickupAmount=12 MaxAmmo=84 InitialAmount=15 PickupClass=Class'NicePack.NiceKSGAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmoPickup.uc new file mode 100644 index 0000000..c045f22 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceKSGAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=12 InventoryType=Class'KFMod.ShotgunAmmo' PickupMessage="12-Gauge Drum" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAttachment.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAttachment.uc new file mode 100644 index 0000000..147d484 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAttachment.uc @@ -0,0 +1,4 @@ +class NiceKSGAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_MP5" MovementAnims(1)="JogB_MP5" MovementAnims(2)="JogL_MP5" MovementAnims(3)="JogR_MP5" TurnLeftAnim="TurnL_MP5" TurnRightAnim="TurnR_MP5" CrouchAnims(0)="CHWalkF_MP5" CrouchAnims(1)="CHWalkB_MP5" CrouchAnims(2)="CHWalkL_MP5" CrouchAnims(3)="CHWalkR_MP5" WalkAnims(0)="WalkF_MP5" WalkAnims(1)="WalkB_MP5" WalkAnims(2)="WalkL_MP5" WalkAnims(3)="WalkR_MP5" CrouchTurnRightAnim="CH_TurnR_MP5" CrouchTurnLeftAnim="CH_TurnL_MP5" IdleCrouchAnim="CHIdle_MP5" IdleWeaponAnim="Idle_MP5" IdleRestAnim="Idle_MP5" IdleChatAnim="Idle_MP5" IdleHeavyAnim="Idle_MP5" IdleRifleAnim="Idle_MP5" FireAnims(0)="Fire_KSG" FireAnims(1)="Fire_KSG" FireAnims(2)="Fire_KSG" FireAnims(3)="Fire_KSG" FireAltAnims(0)="Fire_KSG" FireAltAnims(1)="Fire_KSG" FireAltAnims(2)="Fire_KSG" FireAltAnims(3)="Fire_KSG" FireCrouchAnims(0)="CHFire_KSG" FireCrouchAnims(1)="CHFire_KSG" FireCrouchAnims(2)="CHFire_KSG" FireCrouchAnims(3)="CHFire_KSG" FireCrouchAltAnims(0)="CHFire_KSG" FireCrouchAltAnims(1)="CHFire_KSG" FireCrouchAltAnims(2)="CHFire_KSG" FireCrouchAltAnims(3)="CHFire_KSG" HitAnims(0)="HitF_MP5" HitAnims(1)="HitB_MP5" HitAnims(2)="HitL_MP5" HitAnims(3)="HitR_MP5" PostFireBlendStandAnim="Blend_MP5" PostFireBlendCrouchAnim="CHBlend_MP5" MeshRef="KF_Weapons3rd4_Trip.KSG_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGFire.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGFire.uc new file mode 100644 index 0000000..b10eb89 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGFire.uc @@ -0,0 +1,4 @@ +class NiceKSGFire extends NiceShotgunFire; +defaultproperties +{ ProjPerFire=12 maxVerticalRecoilAngle=1000 maxHorizontalRecoilAngle=500 ShellEjectClass=Class'KFMod.KSGShellEject' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_KSGSnd.KSG_Fire_M" StereoFireSoundRef="KF_KSGSnd.KSG_Fire_S" NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" DamageType=Class'NicePack.NiceDamTypeKSGShotgun' DamageMax=25 FireAnimRate=0.869565 FireRate=0.943000 AmmoClass=Class'NicePack.NiceKSGAmmo' BotRefireRate=0.250000 Spread=1000.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGPickup.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGPickup.uc new file mode 100644 index 0000000..db275b7 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGPickup.uc @@ -0,0 +1,4 @@ +class NiceKSGPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=7.000000 cost=500 AmmoCost=15 BuyClipSize=12 PowerValue=70 SpeedValue=50 RangeValue=30 Description="An advanced Horzine prototype tactical shotgun. Features a large capacity ammo magazine and selectable tight/wide spread fire modes." ItemName="HSG-1 Shotgun" ItemShortName="HSG-1 Shotgun" AmmoItemName="12-gauge mag" CorrespondingPerkIndex=1 EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.NeonKSGPickup' InventoryType=Class'NicePack.NiceKSGShotgun' PickupMessage="You got the Horzine HSG-1 shotgun" PickupSound=Sound'KF_KSGSnd.KSG_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups4_Trip.Shotguns.KSG_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGShotgun.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGShotgun.uc new file mode 100644 index 0000000..1e272a1 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGShotgun.uc @@ -0,0 +1,4 @@ +class NiceKSGShotgun extends NiceWeapon; +defaultproperties +{ reloadPreEndFrame=0.126000 reloadEndFrame=0.650000 reloadChargeEndFrame=0.850000 reloadMagStartFrame=0.316000 reloadChargeStartFrame=0.820000 activeSlowdown=0.800000 activeSpeedup=1.300000 ForceZoomOutOnFireTime=0.010000 MagCapacity=12 ReloadRate=3.160000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_KSG" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_KSG' bIsTier2Weapon=True MeshRef="KF_Wep_KSG_Shotgun.KSG_Shotgun" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.KSG_SHDR" SelectSoundRef="KF_KSGSnd.KSG_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.KSG_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.KSG" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceKSGFire' FireModeClass(1)=Class'NicePack.NiceKSGAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An advanced Horzine prototype tactical shotgun. Features a large capacity ammo magazine and selectable tight/wide spread fire modes." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=100 InventoryGroup=3 GroupOffset=12 PickupClass=Class'NicePack.NiceKSGPickup' PlayerViewOffset=(X=15.000000,Y=20.000000,Z=-7.000000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceKSGAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="HSG-1 Shotgun" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceDamTypeMoss12Z.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceDamTypeMoss12Z.uc new file mode 100644 index 0000000..0020c5b --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceDamTypeMoss12Z.uc @@ -0,0 +1,5 @@ +class NiceDamTypeMoss12Z extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ MaxPenetrations=3 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceMoss12Z' DeathString="%k killed %o (Moss 12)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Ammo.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Ammo.uc new file mode 100644 index 0000000..c627403 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Ammo.uc @@ -0,0 +1,5 @@ +class NiceMoss12Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceMoss12Pickup' AmmoPickupAmount=6 MaxAmmo=60 InitialAmount=16 PickupClass=Class'NicePack.NiceMoss12AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12AmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12AmmoPickup.uc new file mode 100644 index 0000000..ad86e08 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceMoss12AmmoPickup extends KFAmmoPickup; +defaultproperties +{ AmmoAmount=6 InventoryType=Class'NicePack.NiceMoss12Ammo' PickupMessage="12-Gauge Shells" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Attachment.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Attachment.uc new file mode 100644 index 0000000..828edcd --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Attachment.uc @@ -0,0 +1,9 @@ +class NiceMoss12Attachment extends NiceAttachment; +simulated function DoFlashEmitter(){ + if (mMuzFlash3rd == none){ mMuzFlash3rd = Spawn(mMuzFlashClass); AttachToBone(mMuzFlash3rd, 'tip'); + } + if(mMuzFlash3rd != none) mMuzFlash3rd.SpawnParticle(1); +} +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_Shotgun" MovementAnims(1)="JogB_Shotgun" MovementAnims(2)="JogL_Shotgun" MovementAnims(3)="JogR_Shotgun" TurnLeftAnim="TurnL_Shotgun" TurnRightAnim="TurnR_Shotgun" CrouchAnims(0)="CHwalkF_Shotgun" CrouchAnims(1)="CHwalkB_Shotgun" CrouchAnims(2)="CHwalkL_Shotgun" CrouchAnims(3)="CHwalkR_Shotgun" WalkAnims(0)="WalkF_Shotgun" WalkAnims(1)="WalkB_Shotgun" WalkAnims(2)="WalkL_Shotgun" WalkAnims(3)="WalkR_Shotgun" CrouchTurnRightAnim="CH_TurnR_Shotgun" CrouchTurnLeftAnim="CH_TurnL_Shotgun" IdleCrouchAnim="CHIdle_Shotgun" IdleWeaponAnim="Idle_Shotgun" IdleRestAnim="Idle_Shotgun" IdleChatAnim="Idle_Shotgun" IdleHeavyAnim="Idle_Shotgun" IdleRifleAnim="Idle_Shotgun" FireAnims(0)="Fire_Shotgun" FireAnims(1)="Fire_Shotgun" FireAnims(2)="Fire_Shotgun" FireAnims(3)="Fire_Shotgun" FireAltAnims(0)="Fire_Shotgun" FireAltAnims(1)="Fire_Shotgun" FireAltAnims(2)="Fire_Shotgun" FireAltAnims(3)="Fire_Shotgun" FireCrouchAnims(0)="CHFire_Shotgun" FireCrouchAnims(1)="CHFire_Shotgun" FireCrouchAnims(2)="CHFire_Shotgun" FireCrouchAnims(3)="CHFire_Shotgun" FireCrouchAltAnims(0)="CHFire_Shotgun" FireCrouchAltAnims(1)="CHFire_Shotgun" FireCrouchAltAnims(2)="CHFire_Shotgun" FireCrouchAltAnims(3)="CHFire_Shotgun" HitAnims(0)="HitF_Shotgun" HitAnims(1)="HitB_Shotgun" HitAnims(2)="HitL_Shotgun" HitAnims(3)="HitR_Shotgun" PostFireBlendStandAnim="Blend_Shotgun" PostFireBlendCrouchAnim="CHBlend_Shotgun" MeshRef="NicePackA.Moss12_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Fire.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Fire.uc new file mode 100644 index 0000000..57f61dc --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Fire.uc @@ -0,0 +1,4 @@ +class NiceMoss12Fire extends NiceShotgunFire; +defaultproperties +{ ProjectileSpeed=3500.000000 FireSoundRef="NicePackSnd.SG_Fire" StereoFireSoundRef="NicePackSnd.SG_FireST" NoAmmoSoundRef="NicePackSnd.SG_DryFire" DamageType=Class'NicePack.NiceDamTypeMoss12Z' DamageMax=25 AmmoClass=Class'NicePack.NiceMoss12Ammo' +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Pickup.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Pickup.uc new file mode 100644 index 0000000..a37442b --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Pickup.uc @@ -0,0 +1,4 @@ +class NiceMoss12Pickup extends NiceWeaponPickup; +defaultproperties +{ bBackupWeapon=True Weight=6.000000 cost=200 AmmoCost=15 BuyClipSize=6 PowerValue=70 SpeedValue=40 RangeValue=15 Description="Lightened pump shotgun model. Shoots weaker rounds, but is easy to reload." ItemName="Moss 12" ItemShortName="Moss 12" AmmoItemName="12-gauge shells" CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceMoss12Z' PickupMessage="You got the Moss 12" PickupSound=Sound'NicePackSnd.Moss12.SG_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.Moss12.KF_Moss12' CollisionRadius=35.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Z.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Z.uc new file mode 100644 index 0000000..5e7e835 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Z.uc @@ -0,0 +1,15 @@ +class NiceMoss12Z extends NiceWeapon; +var() float ThrowGrenadeAnimRate; +var() name ThrowGrenadeAnim; +simulated function fillSubReloadStages(){ + // Loading 8 shells during 175 frames tops, with first shell loaded at frame 16, with 17 frames between load moments + generateReloadStages(8, 175, 16, 17); + reloadStages[3] = 69.0 / 175.0; + reloadStages[4] = 87.0 / 175.0; + reloadStages[5] = 105.0 / 175.0; + reloadStages[6] = 123.0 / 175.0; + reloadStages[7] = 140.0 / 175.0; +} +defaultproperties +{ reloadType=RTYPE_SINGLE FirstPersonFlashlightOffset=(X=-25.000000,Y=-18.000000,Z=8.000000) MagCapacity=6 ReloadRate=0.444444 ReloadAnim="Reload" ReloadAnimRate=1.200000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'NicePackT.Moss12.Trader_Moss12' MeshRef="NicePackA.Moss12Weapon" SkinRefs(0)="NicePackT.Moss12.Moss12_2048x2048" SelectSoundRef="NicePackSnd.SG_Select" HudImageRef="NicePackT.Moss12.Trader_Moss12_unselected" SelectedHudImageRef="NicePackT.Moss12.Trader_Moss12_selected" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceMoss12Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 Description="Lightened pump shotgun model. Shoots weaker rounds, but is easy to reload." DisplayFOV=65.000000 Priority=15 InventoryGroup=3 GroupOffset=1 PickupClass=Class'NicePack.NiceMoss12Pickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceMoss12Attachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="Moss 12" TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceDamTypeNailGun.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceDamTypeNailGun.uc new file mode 100644 index 0000000..07f90d9 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceDamTypeNailGun.uc @@ -0,0 +1,5 @@ +class NiceDamTypeNailGun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ MaxPenetrations=3 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceNailGun' DeathString="%k killed %o (Nail)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNail.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNail.uc new file mode 100644 index 0000000..a236e6d --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNail.uc @@ -0,0 +1,4 @@ +class NiceNail extends NiceShotgunPellet; +defaultproperties +{ bDisableComplexMovement=False movementAcceleration=(Z=-300.000000) bShouldBounce=True trailXClass=Class'KFMod.NailGunTracer' regularImpact=(bPlayROEffect=False,decalClass=Class'KFMod.NailGunDecal',EmitterClass=Class'ROEffects.ROBulletHitMetalEffect',emitterShiftWall=20.000000,emitterShiftPawn=20.000000,noiseRef="ProjectileSounds.Bullets.Impact_Metal",noiseVolume=1.000000) StaticMeshRef="EffectsSM.Weapons.Vlad_9000_Nail" +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGun.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGun.uc new file mode 100644 index 0000000..ba4f18c --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGun.uc @@ -0,0 +1,7 @@ +class NiceNailGun extends NiceWeapon; +simulated function bool AltFireCanForceInterruptReload(){ + return GetMagazineAmmo() > 0; +} +defaultproperties +{ reloadPreEndFrame=0.178000 reloadEndFrame=0.700000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.278000 reloadChargeStartFrame=-1.000000 FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) MagCapacity=42 ReloadRate=2.600000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_Vlad9000" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Vlad9000' bIsTier2Weapon=True MeshRef="KF_Wep_Vlad9000.Vlad9000" SkinRefs(0)="KF_Weapons8_Trip_T.Weapons.Vlad_9000_cmb" SelectSoundRef="KF_NailShotgun.KF_NailShotgun_Pickup" HudImageRef="KillingFloor2HUD.WeaponSelect.Vlad9000_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Vlad9000" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceNailGunFire' FireModeClass(1)=Class'NicePack.NiceNailGunAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The Black and Wrecker Vlad 9000 nail gun. Designed for putting barns together. Or nailing Zeds to them." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=150 InventoryGroup=3 GroupOffset=15 PickupClass=Class'NicePack.NiceNailGunPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-10.000000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceNailGunAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Vlad the Impaler" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAltFire.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAltFire.uc new file mode 100644 index 0000000..a0f7898 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAltFire.uc @@ -0,0 +1,4 @@ +class NiceNailGunAltFire extends NiceNailGunFire; +defaultproperties +{ bCanFireIncomplete=True ProjectileSpeed=3500.000000 AmmoPerFire=7 SpreadStyle=SS_Random +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAmmo.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAmmo.uc new file mode 100644 index 0000000..c715d55 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAmmo.uc @@ -0,0 +1,5 @@ +class NiceNailGunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceNailGunPickup' AmmoPickupAmount=42 MaxAmmo=210 InitialAmount=105 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAttachment.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAttachment.uc new file mode 100644 index 0000000..3003a5d --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAttachment.uc @@ -0,0 +1,4 @@ +class NiceNailGunAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNailGun' TurnLeftAnim="TurnL_Bullpup" TurnRightAnim="TurnR_Bullpup" WalkAnims(0)="WalkF_Bullpup" WalkAnims(1)="WalkB_Bullpup" WalkAnims(2)="WalkL_Bullpup" WalkAnims(3)="WalkR_Bullpup" CrouchTurnRightAnim="CH_TurnR_Bullpup" CrouchTurnLeftAnim="CH_TurnL_Bullpup" MeshRef="KF_Weapons3rd5_Trip.Vlad9000_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunFire.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunFire.uc new file mode 100644 index 0000000..1186223 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunFire.uc @@ -0,0 +1,7 @@ +class NiceNailGunFire extends NiceShotgunFire; +simulated function bool ShouldBounce(){ + return true; +} +defaultproperties +{ ProjPerFire=1 KickMomentum=(X=-25.000000,Z=0.000000) ProjectileSpeed=9260.0 bShouldBounce=True bCausePain=True bulletClass=Class'NicePack.NiceNail' maxVerticalRecoilAngle=1250 maxHorizontalRecoilAngle=750 bRandomPitchFireSound=True FireSoundRef="KF_NailShotgun.NailShotgun_Fire_Single_M" StereoFireSoundRef="KF_NailShotgun.NailShotgun_Fire_Single_S" NoAmmoSoundRef="KF_NailShotgun.KF_NailShotgun_Dryfire" DamageType=Class'NicePack.NiceDamTypeNailGun' DamageMax=66 FireAnimRate=1.250000 FireRate=0.400000 AmmoClass=Class'NicePack.NiceNailGunAmmo' ShakeRotTime=3.000000 ShakeOffsetTime=2.000000 BotRefireRate=0.500000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNailGun' SpreadStyle=SS_None +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunPickup.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunPickup.uc new file mode 100644 index 0000000..19d602c --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunPickup.uc @@ -0,0 +1,4 @@ +class NiceNailGunPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=8.000000 cost=250 AmmoCost=30 BuyClipSize=42 PowerValue=70 SpeedValue=55 RangeValue=25 Description="The Black and Wrecker Vlad 9000 nail gun. Designed for putting barns together. Or nailing Zeds to them." ItemName="Vlad the Impaler" ItemShortName="Vlad 9000" AmmoItemName="Nails" CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceNailGun' PickupMessage="You got the Vlad 9000." PickupSound=Sound'KF_NailShotgun.Handling.KF_NailShotgun_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups5_Trip.Rifles.Vlad9000_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceDamTypeShotgun.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceDamTypeShotgun.uc new file mode 100644 index 0000000..d0adf03 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceDamTypeShotgun.uc @@ -0,0 +1,9 @@ +class NiceDamTypeShotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ /*MaxPenetrations=3 bIsPowerWeapon=True*/ + MaxPenetrations=4 + MediumZedPenDmgReduction=1.000000 + PenDmgReduction=0.800000 + bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceShotgun' DeathString="%k killed %o (Shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgun.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgun.uc new file mode 100644 index 0000000..38c0edd --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgun.uc @@ -0,0 +1,14 @@ +class NiceShotgun extends NiceWeapon; + +simulated function fillSubReloadStages(){ + // Loading 8 shells during 173 frames tops, with first shell loaded at frame 15, with 18 frames between load moments + generateReloadStages(8, 173, 15, 18); + // Make corrections, based on notify sound positioning + /*reloadStages[0] = 16.0 / 173.0; + reloadStages[2] = 50.0 / 173.0; + reloadStages[7] = 140.0 / 173.0;*/ +} + +defaultproperties +{ bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_SINGLE FirstPersonFlashlightOffset=(X=-25.000000,Y=-18.000000,Z=8.000000) ForceZoomOutOnFireTime=0.010000 MagCapacity=8 ReloadRate=0.666667 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=4.000000 bTorchEnabled=True bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Combat_Shotgun' MeshRef="KF_Weapons_Trip.Shotgun_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Shotguns.shotgun_cmb" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="KillingFloorHUD.WeaponSelect.combat_shotgun_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.combat_shotgun" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceShotgunFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 bShowChargingBar=True Description="A rugged tactical pump action shotgun common to police divisions the world over. It accepts a maximum of 8 shells and can fire in rapid succession." DisplayFOV=65.000000 Priority=135 InventoryGroup=3 GroupOffset=2 PickupClass=Class'NicePack.NiceShotgunPickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceShotgunAttachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="Shotgun" TransientSoundVolume=1.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmo.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmo.uc new file mode 100644 index 0000000..ea2dd40 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmo.uc @@ -0,0 +1,5 @@ +class NiceShotgunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceShotgunPickup' AmmoPickupAmount=4 MaxAmmo=32 InitialAmount=8 PickupClass=Class'NicePack.NiceShotgunAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmoPickup.uc new file mode 100644 index 0000000..4aeb106 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceShotgunAmmoPickup extends KFAmmoPickup; +defaultproperties +{ AmmoAmount=4 InventoryType=Class'NicePack.NiceShotgunAmmo' PickupMessage="12-Gauge Shells" StaticMesh=None +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAttachment.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAttachment.uc new file mode 100644 index 0000000..2393380 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAttachment.uc @@ -0,0 +1,29 @@ +class NiceShotgunAttachment extends NiceAttachment; +var Actor TacShine; +var Effects TacShineCorona; +var bool bBeamEnabled; +simulated event ThirdPersonEffects(){ + if(FiringMode == 1) return; + super.ThirdPersonEffects(); +} +simulated function Destroyed() +{ + if(TacShineCorona != none) TacShineCorona.Destroy(); + if (TacShine != none) TacShine.Destroy(); + super.Destroyed(); +} +simulated function UpdateTacBeam( float Dist ){ + local vector Sc; + if(!bBeamEnabled){ if(TacShine == none){ TacShine = Spawn(Class'Single'.Default.TacShineClass,Owner,,,); AttachToBone(TacShine,'FlashLight'); TacShine.RemoteRole = ROLE_none; } else TacShine.bHidden = False; if(TacShineCorona == none){ TacShineCorona = Spawn(class 'KFTacLightCorona',Owner,,,); AttachToBone(TacShineCorona,'FlashLight'); TacShineCorona.RemoteRole = ROLE_none; } TacShineCorona.bHidden = False; bBeamEnabled = True; + } + Sc = TacShine.DrawScale3D; + Sc.Y = FClamp(Dist/90.f,0.02,1.f); + if(TacShine.DrawScale3D != Sc) TacShine.SetDrawScale3D(Sc); +} +simulated function TacBeamGone(){ + if(bBeamEnabled){ if(TacShine != none) TacShine.bHidden = True; if(TacShineCorona != none) TacShineCorona.bHidden = True; bBeamEnabled = False; + } +} +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_Shotgun" MovementAnims(1)="JogB_Shotgun" MovementAnims(2)="JogL_Shotgun" MovementAnims(3)="JogR_Shotgun" TurnLeftAnim="TurnL_Shotgun" TurnRightAnim="TurnR_Shotgun" CrouchAnims(0)="CHwalkF_Shotgun" CrouchAnims(1)="CHwalkB_Shotgun" CrouchAnims(2)="CHwalkL_Shotgun" CrouchAnims(3)="CHwalkR_Shotgun" WalkAnims(0)="WalkF_Shotgun" WalkAnims(1)="WalkB_Shotgun" WalkAnims(2)="WalkL_Shotgun" WalkAnims(3)="WalkR_Shotgun" CrouchTurnRightAnim="CH_TurnR_Shotgun" CrouchTurnLeftAnim="CH_TurnL_Shotgun" IdleCrouchAnim="CHIdle_Shotgun" IdleWeaponAnim="Idle_Shotgun" IdleRestAnim="Idle_Shotgun" IdleChatAnim="Idle_Shotgun" IdleHeavyAnim="Idle_Shotgun" IdleRifleAnim="Idle_Shotgun" FireAnims(0)="Fire_Shotgun" FireAnims(1)="Fire_Shotgun" FireAnims(2)="Fire_Shotgun" FireAnims(3)="Fire_Shotgun" FireAltAnims(0)="Fire_Shotgun" FireAltAnims(1)="Fire_Shotgun" FireAltAnims(2)="Fire_Shotgun" FireAltAnims(3)="Fire_Shotgun" FireCrouchAnims(0)="CHFire_Shotgun" FireCrouchAnims(1)="CHFire_Shotgun" FireCrouchAnims(2)="CHFire_Shotgun" FireCrouchAnims(3)="CHFire_Shotgun" FireCrouchAltAnims(0)="CHFire_Shotgun" FireCrouchAltAnims(1)="CHFire_Shotgun" FireCrouchAltAnims(2)="CHFire_Shotgun" FireCrouchAltAnims(3)="CHFire_Shotgun" HitAnims(0)="HitF_Shotgun" HitAnims(1)="HitB_Shotgun" HitAnims(2)="HitL_Shotgun" HitAnims(3)="HitR_Shotgun" PostFireBlendStandAnim="Blend_Shotgun" PostFireBlendCrouchAnim="CHBlend_Shotgun" MeshRef="KF_Weapons3rd_Trip.Shotgun_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunFire.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunFire.uc new file mode 100644 index 0000000..873c745 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunFire.uc @@ -0,0 +1,4 @@ +class NiceShotgunFire extends NiceFire; +defaultproperties +{ bProjectileFire=True ProjPerFire=10//7 ProjSpawnOffset=(X=25.000000,Y=5.000000,Z=-6.000000) EffectiveRange=700.000000 KickMomentum=(X=-85.000000,Z=15.000000) LowGravKickMomentumScale=10.000000 ProjectileSpeed=18200.000000 bulletClass=Class'NicePack.NiceShotgunPellet' FireAimedAnim="Fire_Iron" RecoilRate=0.050000 maxVerticalRecoilAngle=1500 maxHorizontalRecoilAngle=900 bRandomPitchFireSound=False FireSoundRef="KF_PumpSGSnd.SG_Fire" StereoFireSoundRef="KF_PumpSGSnd.SG_FireST" NoAmmoSoundRef="KF_PumpSGSnd.SG_DryFire" DamageType=Class'NicePack.NiceDamTypeShotgun' DamageMax=63//56 Momentum=50000.000000 bWaitForRelease=True bAttachSmokeEmitter=True TransientSoundVolume=2.000000 TransientSoundRadius=500.000000 FireEndAnim= FireAnimRate=0.950000 FireForce="FlakCannonFire" FireRate=0.965000 AmmoClass=Class'NicePack.NiceShotgunAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) ShakeRotTime=5.000000 ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=3.000000 BotRefireRate=1.500000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=1.000000 Spread=3000.0//1125.000000 SpreadStyle=SS_Random +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPellet.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPellet.uc new file mode 100644 index 0000000..bc95c82 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPellet.uc @@ -0,0 +1,4 @@ +class NiceShotgunPellet extends NiceBullet; +defaultproperties +{ movementAcceleration=(Z=-1200.000000) regularImpact=(decalClass=Class'KFMod.ShotgunDecal') +} diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPickup.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPickup.uc new file mode 100644 index 0000000..cc2c2f9 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPickup.uc @@ -0,0 +1,5 @@ +class NiceShotgunPickup extends NiceWeaponPickup; + +defaultproperties +{ bBackupWeapon=True Weight=6.000000 cost=200 AmmoCost=15 BuyClipSize=8 PowerValue=70 SpeedValue=40 RangeValue=15 Description="A rugged tactical pump action shotgun common to police divisions the world over. It accepts a maximum of 8 shells and can fire in rapid succession." ItemName="Shotgun" ItemShortName="Shotgun" AmmoItemName="12-gauge shells" CorrespondingPerkIndex=1 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.CamoShotgunPickup' InventoryType=Class'NicePack.NiceShotgun' PickupMessage="You got the Shotgun" PickupSound=Sound'KF_PumpSGSnd.SG_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Shotgun.shotgun_pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceDamTypeSaiga12c.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceDamTypeSaiga12c.uc new file mode 100644 index 0000000..5a1c55b Binary files /dev/null and b/sources/Weapons/Playable/Shotguns/Saiga/NiceDamTypeSaiga12c.uc differ diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12c.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12c.uc new file mode 100644 index 0000000..79fac5a --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12c.uc @@ -0,0 +1,4 @@ +class NiceSaiga12c extends NiceWeapon; +defaultproperties +{ reloadPreEndFrame=0.250000 reloadEndFrame=0.525000 reloadChargeEndFrame=0.788000 reloadMagStartFrame=0.444000 reloadChargeStartFrame=0.596000 MagazineBone="wpn_mag" MagCapacity=8 ReloadRate=3.133000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=2 TraderInfoTexture=Texture'ScrnWeaponPack_T.saiga.Saiga_Trader' bIsTier3Weapon=True MeshRef="ScrnWeaponPack_A.saigacmesh" SkinRefs(0)="ScrnWeaponPack_T.saiga.saiga" SkinRefs(1)="ScrnWeaponPack_T.saiga.saigaparts" SkinRefs(2)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(3)="ScrnWeaponPack_T.saiga.wpn_gilza1" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="ScrnWeaponPack_T.saiga.Saiga_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.saiga.Saiga_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceSaiga12cFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 Description="12-gauge combat shotgun, visually patterned after the Kalashnikov series of assault rifles. Shoots small amount of high-damage projectiles." EffectOffset=(X=100.000000,Y=25.000000,Z=-100.000000) DisplayFOV=65.000000 Priority=160 InventoryGroup=4 GroupOffset=10 PickupClass=Class'NicePack.NiceSaiga12cPickup' PlayerViewOffset=(X=10.000000,Y=8.000000,Z=-4.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceSaiga12cAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Saiga-12s" DrawScale=0.850000 TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmo.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmo.uc new file mode 100644 index 0000000..91587ee --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmo.uc @@ -0,0 +1,5 @@ +class NiceSaiga12cAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceSaiga12cPickup' AmmoPickupAmount=8 MaxAmmo=72 InitialAmount=18 PickupClass=Class'NicePack.NiceSaiga12cAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmoPickup.uc new file mode 100644 index 0000000..82b1e16 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceSaiga12cAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=8 InventoryType=Class'NicePack.NiceSaiga12cAmmo' PickupMessage="12-gauge" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAttachment.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAttachment.uc new file mode 100644 index 0000000..fd78980 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAttachment.uc @@ -0,0 +1,4 @@ +class NiceSaiga12cAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' ShellEjectBoneName="wpn_scope" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.saigac3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.650000 +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cFire.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cFire.uc new file mode 100644 index 0000000..4da58bd --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cFire.uc @@ -0,0 +1,9 @@ +class NiceSaiga12cFire extends NiceShotgunFire; +function InitEffects() +{ + Super.InitEffects(); + if(FlashEmitter != none) Weapon.AttachToBone(FlashEmitter, 'tip'); +} +defaultproperties +{ ProjPerFire=4 KickMomentum=(X=-95.000000,Z=25.000000) ProjectileSpeed=3500.000000 FireAimedAnim="Fire" maxVerticalRecoilAngle=1300 maxHorizontalRecoilAngle=700 FireSoundRef="ScrnWeaponPack_SND.saiga.shot_mono" StereoFireSoundRef="ScrnWeaponPack_SND.saiga.shot_stereo" NoAmmoSoundRef="ScrnWeaponPack_SND.saiga.Saiga_empty" DamageType=Class'NicePack.NiceDamTypeSaiga12c' DamageMax=66 Momentum=60000.000000 bModeExclusive=False FireRate=0.600000 AmmoClass=Class'NicePack.NiceSaiga12cAmmo' BotRefireRate=0.250000 Spread=825.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cPickup.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cPickup.uc new file mode 100644 index 0000000..cb2413d --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cPickup.uc @@ -0,0 +1,4 @@ +class NiceSaiga12cPickup extends NiceWeaponPickup; +defaultproperties +{ AmmoCost=50 BuyClipSize=8 PowerValue=87 SpeedValue=45 RangeValue=20 Description="12-gauge combat shotgun, visually patterned after the Kalashnikov series of assault rifles. Shoots small amount of high-damage projectiles." ItemName="Saiga-12s" ItemShortName="Saiga-12s" AmmoItemName="12-gauge" CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceSaiga12c' PickupMessage="You've got Saiga-12s" PickupSound=Sound'KF_AA12Snd.AA12_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.saiga_sm' CollisionRadius=35.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceDamTypeSpas.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceDamTypeSpas.uc new file mode 100644 index 0000000..c86b37d --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceDamTypeSpas.uc @@ -0,0 +1,5 @@ +class NiceDamTypeSpas extends NiceDamTypeShotgun + abstract; +defaultproperties +{ WeaponClass=Class'NicePack.NiceSpas' DeathString="%k killed %o (SPAS-12)." +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpas.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpas.uc new file mode 100644 index 0000000..71d68f4 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpas.uc @@ -0,0 +1,10 @@ +class NiceSpas extends NiceWeapon; + +simulated function fillSubReloadStages(){ + // Loading 8 shells during 173 frames tops, with first shell loaded at frame 17, with 18 frames between load moments + generateReloadStages(8, 173, 17, 18); +} + +defaultproperties +{ bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_SINGLE ForceZoomOutOnFireTime=0.010000 MagCapacity=5 ReloadRate=0.666667 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True Weight=8.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'ScrnWeaponPack_T.Spas.Spas_Unselected' MeshRef="ScrnWeaponPack_A.spas12_1st" SkinRefs(0)="ScrnWeaponPack_T.SPAS.shotgun_cmb" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="ScrnWeaponPack_T.SPAS.Spas_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.SPAS.Spas_Selected" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceSpasFire' FireModeClass(1)=Class'NicePack.NiceSpasAltFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 Description="The SPAS12 is a dual-mode shotgun, that can also be used for firing slugs." DisplayFOV=65.000000 Priority=135 InventoryGroup=3 GroupOffset=2 PickupClass=Class'NicePack.NiceSpasPickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceSpasAttachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="SPAS-12" TransientSoundVolume=1.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAltFire.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAltFire.uc new file mode 100644 index 0000000..57664cb --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAltFire.uc @@ -0,0 +1,4 @@ +class NiceSpasAltFire extends NiceSpasFire; +defaultproperties +{ maxVerticalRecoilAngle=300 maxHorizontalRecoilAngle=180 FireAnimRate=0.650000 FireRate=1.400000 Spread=0.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmo.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmo.uc new file mode 100644 index 0000000..d07c8cc --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmo.uc @@ -0,0 +1,5 @@ +class NiceSpasAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceSpasPickup' AmmoPickupAmount=8 MaxAmmo=64 InitialAmount=16 PickupClass=Class'NicePack.NiceSpasAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmoPickup.uc new file mode 100644 index 0000000..14d2b3a --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceSpasAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=8 InventoryType=Class'NicePack.NiceSpasAmmo' PickupMessage="12-Gauge Shells" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAttachment.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAttachment.uc new file mode 100644 index 0000000..d60f1c5 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAttachment.uc @@ -0,0 +1,4 @@ +class NiceSpasAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_Shotgun" MovementAnims(1)="JogB_Shotgun" MovementAnims(2)="JogL_Shotgun" MovementAnims(3)="JogR_Shotgun" TurnLeftAnim="TurnL_Shotgun" TurnRightAnim="TurnR_Shotgun" CrouchAnims(0)="CHwalkF_Shotgun" CrouchAnims(1)="CHwalkB_Shotgun" CrouchAnims(2)="CHwalkL_Shotgun" CrouchAnims(3)="CHwalkR_Shotgun" WalkAnims(0)="WalkF_Shotgun" WalkAnims(1)="WalkB_Shotgun" WalkAnims(2)="WalkL_Shotgun" WalkAnims(3)="WalkR_Shotgun" CrouchTurnRightAnim="CH_TurnR_Shotgun" CrouchTurnLeftAnim="CH_TurnL_Shotgun" IdleCrouchAnim="CHIdle_Shotgun" IdleWeaponAnim="Idle_Shotgun" IdleRestAnim="Idle_Shotgun" IdleChatAnim="Idle_Shotgun" IdleHeavyAnim="Idle_Shotgun" IdleRifleAnim="Idle_Shotgun" FireAnims(0)="Fire_Shotgun" FireAnims(1)="Fire_Shotgun" FireAnims(2)="Fire_Shotgun" FireAnims(3)="Fire_Shotgun" FireAltAnims(0)="Fire_Shotgun" FireAltAnims(1)="Fire_Shotgun" FireAltAnims(2)="Fire_Shotgun" FireAltAnims(3)="Fire_Shotgun" FireCrouchAnims(0)="CHFire_Shotgun" FireCrouchAnims(1)="CHFire_Shotgun" FireCrouchAnims(2)="CHFire_Shotgun" FireCrouchAnims(3)="CHFire_Shotgun" FireCrouchAltAnims(0)="CHFire_Shotgun" FireCrouchAltAnims(1)="CHFire_Shotgun" FireCrouchAltAnims(2)="CHFire_Shotgun" FireCrouchAltAnims(3)="CHFire_Shotgun" HitAnims(0)="HitF_Shotgun" HitAnims(1)="HitB_Shotgun" HitAnims(2)="HitL_Shotgun" HitAnims(3)="HitR_Shotgun" PostFireBlendStandAnim="Blend_Shotgun" PostFireBlendCrouchAnim="CHBlend_Shotgun" MeshRef="ScrnWeaponPack_A.Spas12_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasFire.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasFire.uc new file mode 100644 index 0000000..06955e4 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasFire.uc @@ -0,0 +1,4 @@ +class NiceSpasFire extends NiceShotgunFire; +defaultproperties +{ DamageType=Class'NicePack.NiceDamTypeSpas' AmmoClass=Class'NicePack.NiceSpasAmmo' +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasPickup.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasPickup.uc new file mode 100644 index 0000000..3816e49 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasPickup.uc @@ -0,0 +1,6 @@ +class NiceSpasPickup extends NiceWeaponPickup; + +defaultproperties +{ + cost=750 Weight=8.000000 BuyClipSize=10 PowerValue=55 SpeedValue=40 RangeValue=17 Description="The SPAS12 is a dual-mode shotgun, that can also be used for firing slugs." ItemName="SPAS-12" ItemShortName="SPAS-12" AmmoItemName="12-gauge shells" CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceSpas' PickupMessage="You got the SPAS-12" PickupSound=Sound'KF_PumpSGSnd.SG_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.spas12_pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +} \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceDamTypeSPShotgun.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceDamTypeSPShotgun.uc new file mode 100644 index 0000000..d376a42 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceDamTypeSPShotgun.uc @@ -0,0 +1,5 @@ +class NiceDamTypeSPShotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ MaxPenetrations=5 PenDmgReduction=0.900000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceSPAutoShotgun' DeathString="%k killed %o (M.C.Z. Thrower)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPAutoShotgun.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPAutoShotgun.uc new file mode 100644 index 0000000..e663d1b --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPAutoShotgun.uc @@ -0,0 +1,19 @@ +class NiceSPAutoShotgun extends NiceWeapon; +// Toggle semi/auto fire +simulated function DoToggle (){} +// Set the new fire mode on the server +function ServerChangeFireMode(bool bNewWaitForRelease){} +exec function SwitchModes(){} +simulated function WeaponTick(float dt) +{ + local float SteamCharge; + local rotator DialRot; + super.WeaponTick(dt); + if(Level.NetMode!=NM_DedicatedServer){ if(FireMode[1].NextFireTime >= Level.TimeSeconds) SteamCharge = 1.0 - ((FireMode[1].NextFireTime - Level.TimeSeconds)/FireMode[1].FireRate); else SteamCharge = 1.0; + if(SteamCharge > 0.1 && FireMode[0].NextFireTime >= Level.TimeSeconds) SteamCharge -= 0.1 * ((FireMode[0].NextFireTime - Level.TimeSeconds)/FireMode[0].FireRate); + DialRot.roll = 26500 - ( 53000 * SteamCharge ); SetBoneRotation('Dail2',DialRot,1.0); + } +} +defaultproperties +{ reloadPreEndFrame=0.143000 reloadEndFrame=0.633000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.276000 reloadChargeStartFrame=-1.000000 MagCapacity=10 ReloadRate=2.640000 ReloadAnim="Reload" ReloadAnimRate=1.250000 WeaponReloadAnim="Reload_IJC_spJackHammer" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'KF_IJC_HUD.Trader_Weapon_Icons.Trader_Jackhammer' MeshRef="KF_IJC_Summer_Weps1.Jackhammer" SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(1)="KF_IJC_Summer_Weapons.Jackhammer.jackhammer_cmb" SkinRefs(2)="KF_Weapons_Trip_T.Rifles.crossbow_cmb" SelectSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Select" HudImageRef="KF_IJC_HUD.WeaponSelect.Jackhammer_unselected" SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.Jackhammer" PlayerIronSightFOV=80.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceSPShotgunFire' FireModeClass(1)=Class'NicePack.NiceSPShotgunAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A device for throwing lead and getting sodding enemies out of your face." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=167 InventoryGroup=4 GroupOffset=15 PickupClass=Class'NicePack.NiceSPShotgunPickup' PlayerViewOffset=(X=20.000000,Y=23.000000,Z=-2.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceSPShotgunAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Multichamber ZED Thrower" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmo.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmo.uc new file mode 100644 index 0000000..910ba81 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmo.uc @@ -0,0 +1,4 @@ +class NiceSPGrenadeAmmo extends SPGrenadeAmmo; +defaultproperties +{ AmmoPickupAmount=2 MaxAmmo=16 InitialAmount=8 PickupClass=Class'NicePack.NiceSPGrenadeAmmoPickup' +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmoPickup.uc new file mode 100644 index 0000000..49f94ff --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceSPGrenadeAmmoPickup extends SPGrenadeAmmoPickup; +defaultproperties +{ AmmoAmount=2 InventoryType=Class'NicePack.NiceSPGrenadeAmmo' +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeFire.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeFire.uc new file mode 100644 index 0000000..a4aea87 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeFire.uc @@ -0,0 +1,4 @@ +class NiceSPGrenadeFire extends SPGrenadeFire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceSPGrenadeAmmo' ProjectileClass=Class'NicePack.NiceSPGrenadeProjectile' +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeLauncher.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeLauncher.uc new file mode 100644 index 0000000..594da3c --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeLauncher.uc @@ -0,0 +1,4 @@ +class NiceSPGrenadeLauncher extends SPGrenadeLauncher; +defaultproperties +{ AppID=0 FireModeClass(0)=Class'NicePack.NiceSPGrenadeFire' PickupClass=Class'NicePack.NiceSPGrenadePickup' ItemName="The Orca Bomb Propeller NW" +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadePickup.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadePickup.uc new file mode 100644 index 0000000..03026a7 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadePickup.uc @@ -0,0 +1,4 @@ +class NiceSPGrenadePickup extends SPGrenadePickup; +defaultproperties +{ AmmoCost=12 ItemName="The Orca Bomb Propeller NW" ItemShortName="The Orca NW" InventoryType=Class'NicePack.NiceSPGrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeProjectile.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeProjectile.uc new file mode 100644 index 0000000..ecdc7b7 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeProjectile.uc @@ -0,0 +1,5 @@ +class NiceSPGrenadeProjectile extends SPGrenadeProjectile; +#exec OBJ LOAD FILE=ProjectileSounds.uax +defaultproperties +{ Damage=450.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAltFire.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAltFire.uc new file mode 100644 index 0000000..d10caf3 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAltFire.uc @@ -0,0 +1,54 @@ +class NiceSPShotgunAltFire extends NiceShotgunFire; +var InterpCurve AppliedMomentumCurve; // How much momentum to apply to a zed based on how much mass it has +var float WideDamageMinHitAngle; // The angle to do sweeping strikes in front of the player. If zero do no strikes +var float PushRange; // The range to push zeds away when firing +simulated function bool AllowFire(){ + if(currentContext.sourceWeapon == none || KFPawn(Instigator) == none) return false; + if(currentContext.sourceWeapon.bIsReloading) return false; + if(KFPawn(Instigator).SecondaryItem!=none) return false; + if(KFPawn(Instigator).bThrowingNade) return false; + // No ammo so just always fire + return true; +} +// No need to client-side this one +function bool IsClientSide(){ + return false; +} +// And there's nothing to force +function bool shouldFireProjectile(){ + return false; +} +function DoFireEffect(){ + local Vector StartProj, StartTrace, X,Y,Z; + local Rotator Aim; + local Vector HitLocation, HitNormal; + local Actor Other; + local Pawn Victims; + local vector dir, lookdir; + local float DiffAngle, VictimDist; + local float AppliedMomentum; + local vector vMomentum; + Instigator.MakeNoise(1.0); + Weapon.GetViewAxes(X,Y,Z); + StartTrace = Instigator.Location + Instigator.EyePosition(); + StartProj = StartTrace + X*ProjSpawnOffset.X; + if (!Weapon.WeaponCentered() && !KFWeap.bAimingRifle) StartProj = StartProj + Weapon.Hand * Y*ProjSpawnOffset.Y + Z*ProjSpawnOffset.Z; + // check if projectile would spawn through a wall and adjust start location accordingly + Other = Weapon.Trace(HitLocation, HitNormal, StartProj, StartTrace, false); + if(Other != none) StartProj = HitLocation; + Aim = AdjustAim(StartProj, AimError); + if(WideDamageMinHitAngle > 0){ foreach Weapon.VisibleCollidingActors(class'Pawn', Victims, (PushRange * 2), StartTrace){ if(Victims.Health <= 0) continue; if(Victims != Instigator){ // Don't push team mates if(Victims.GetTeamNum() == Instigator.GetTeamNum()) continue; VictimDist = VSizeSquared(Instigator.Location - Victims.Location); if(VictimDist > (((PushRange * 1.1) * (PushRange * 1.1)) + (Victims.CollisionRadius * Victims.CollisionRadius))) continue; + lookdir = Normal(Vector(Instigator.GetViewRotation())); dir = Normal(Victims.Location - Instigator.Location); DiffAngle = lookdir dot dir; dir = Normal((Victims.Location + Victims.EyePosition()) - Instigator.Location); + if(DiffAngle > WideDamageMinHitAngle){ AppliedMomentum = InterpCurveEval(AppliedMomentumCurve,Victims.Mass); HandleAchievement( Victims ); + vMomentum = (dir * AppliedMomentum)/Victims.Mass; Victims.AddVelocity(vMomentum); if(KFMonster(Victims) != none) KFMonster(Victims).BreakGrapple(); } } } + } + if(Instigator != none && Instigator.Physics == PHYS_Falling && Instigator.PhysicsVolume.Gravity.Z > class'PhysicsVolume'.default.Gravity.Z) Instigator.AddVelocity((KickMomentum * 10.0) >> Instigator.GetViewRotation()); +} +function HandleAchievement(Pawn Victim){ + local KFSteamStatsAndAchievements KFSteamStats; + if(Victim.IsA('NiceZombieScrake')){ if(PlayerController(Instigator.Controller) != none){ KFSteamStats = KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements); if(KFSteamStats != none) KFSteamStats.CheckAndSetAchievementComplete(KFSteamStats.KFACHIEVEMENT_PushScrakeSPJ); } + } +} +defaultproperties +{ AppliedMomentumCurve=(Points=((OutVal=10000.000000),(InVal=350.000000,OutVal=175000.000000),(InVal=600.000000,OutVal=250000.000000))) WideDamageMinHitAngle=0.600000 PushRange=150.000000 ProjPerFire=0 KickMomentum=(X=-35.000000,Z=5.000000) maxVerticalRecoilAngle=3200 FireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Secondary_Fire_M" StereoFireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Secondary_Fire_S" NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" bWaitForRelease=False bModeExclusive=False FireAnimRate=1.000000 FireRate=1.200000 AmmoClass=None AmmoPerFire=0 ShakeRotMag=(Z=250.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(Z=6.000000) ShakeOffsetTime=1.250000 BotRefireRate=1.750000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPShotgunAlt' Spread=0.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmo.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmo.uc new file mode 100644 index 0000000..c5501b2 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmo.uc @@ -0,0 +1,5 @@ +class NiceSPShotgunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceSPShotgunPickup' AmmoPickupAmount=10 MaxAmmo=80 InitialAmount=20 PickupClass=Class'NicePack.NiceSPShotgunAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmoPickup.uc new file mode 100644 index 0000000..8934fcc --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceSPShotgunAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=10 InventoryType=Class'NicePack.NiceSPShotgunAmmo' PickupMessage="12-Gauge Drum" StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAttachment.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAttachment.uc new file mode 100644 index 0000000..bfc1602 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAttachment.uc @@ -0,0 +1,4 @@ +class NiceSPShotgunAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSPShotgun' MovementAnims(0)="JogF_AA12" MovementAnims(1)="JogB_AA12" MovementAnims(2)="JogL_AA12" MovementAnims(3)="JogR_AA12" TurnLeftAnim="TurnL_AA12" TurnRightAnim="TurnR_AA12" CrouchAnims(0)="CHWalkF_AA12" CrouchAnims(1)="CHWalkB_AA12" CrouchAnims(2)="CHWalkL_AA12" CrouchAnims(3)="CHWalkR_AA12" WalkAnims(0)="WalkF_AA12" WalkAnims(1)="WalkB_AA12" WalkAnims(2)="WalkL_AA12" WalkAnims(3)="WalkR_AA12" CrouchTurnRightAnim="CH_TurnR_AA12" CrouchTurnLeftAnim="CH_TurnL_AA12" IdleCrouchAnim="CHIdle_AA12" IdleWeaponAnim="Idle_AA12" IdleRestAnim="Idle_AA12" IdleChatAnim="Idle_AA12" IdleHeavyAnim="Idle_AA12" IdleRifleAnim="Idle_AA12" FireAnims(0)="Fire_AA12" FireAnims(1)="Fire_AA12" FireAnims(2)="Fire_AA12" FireAnims(3)="Fire_AA12" FireAltAnims(0)="Fire_AA12" FireAltAnims(1)="Fire_AA12" FireAltAnims(2)="Fire_AA12" FireAltAnims(3)="Fire_AA12" FireCrouchAnims(0)="CHFire_AA12" FireCrouchAnims(1)="CHFire_AA12" FireCrouchAnims(2)="CHFire_AA12" FireCrouchAnims(3)="CHFire_AA12" FireCrouchAltAnims(0)="CHFire_AA12" FireCrouchAltAnims(1)="CHFire_AA12" FireCrouchAltAnims(2)="CHFire_AA12" FireCrouchAltAnims(3)="CHFire_AA12" HitAnims(0)="HitF_AA12" HitAnims(1)="HitB_AA12" HitAnims(2)="HitL_AA12" HitAnims(3)="HitR_AA12" PostFireBlendStandAnim="Blend_AA12" PostFireBlendCrouchAnim="CHBlend_AA12" MeshRef="KF_Weapons3rd2_IJC.spJackHammer_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunFire.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunFire.uc new file mode 100644 index 0000000..8e908cf --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunFire.uc @@ -0,0 +1,4 @@ +class NiceSPShotgunFire extends NiceShotgunFire; +defaultproperties +{ KickMomentum=(X=-35.000000,Z=5.000000) ProjectileSpeed=3500.000000 maxVerticalRecoilAngle=1000 maxHorizontalRecoilAngle=500 ShellEjectClass=Class'ROEffects.KFShellEjectShotty' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Primary_Fire_M" StereoFireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Primary_Fire_S" NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" DamageType=Class'NicePack.NiceDamTypeSPShotgun' DamageMax=30 Momentum=60000.000000 bWaitForRelease=False FireAnimRate=1.200000 FireRate=0.292000 AmmoClass=Class'NicePack.NiceSPShotgunAmmo' ShakeRotMag=(Z=250.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(Z=6.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.250000 Spread=1500.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunPickup.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunPickup.uc new file mode 100644 index 0000000..5b99e33 --- /dev/null +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunPickup.uc @@ -0,0 +1,4 @@ +class NiceSPShotgunPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=7.000000 AmmoCost=30 BuyClipSize=8 PowerValue=60 SpeedValue=50 RangeValue=20 Description="A device for throwing lead and getting sodding enemies out of your face." ItemName="Multichamber ZED Thrower" ItemShortName="M.C.Z. Thrower" AmmoItemName="M.C.Z. Drum" CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceSPAutoShotgun' PickupMessage="You got the Multichamber Lead Thrower." PickupSound=Sound'KF_SP_ZEDThrowerSnd.KFO_Shotgun_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_IJC_Summer_Weps.Jackhammer' CollisionRadius=35.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbow.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbow.uc new file mode 100644 index 0000000..0c06851 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbow.uc @@ -0,0 +1,34 @@ +class NiceCrossbow extends NiceScopedWeapon; +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.349; + reloadDesc.trashStartFrame = 0.857; + reloadDesc.resumeFrame = 0.349; + reloadDesc.speedFrame = 0.143; + reloadDesc.animName = 'Fire'; + autoReloadsDescriptions[0] = reloadDesc; + reloadDesc.animName = 'Fire_Iron'; + autoReloadsDescriptions[1] = reloadDesc; + super.PostBeginPlay(); +} +// Adjust a single FOV based on the current aspect ratio. Adjust FOV is the default NON-aspect ratio adjusted FOV to adjust +simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV){ + local KFPlayerController KFPC; + local float ResX, ResY; + local float AspectRatio; + KFPC = KFPlayerController(Level.GetLocalPlayerController()); + if(KFPC == none) return AdjustFOV; + ResX = float(GUIController(KFPC.Player.GUIController).ResX); + ResY = float(GUIController(KFPC.Player.GUIController).ResY); + AspectRatio = ResX / ResY; + if(KFPC.bUseTrueWideScreenFOV && AspectRatio >= 1.60) return CalcFOVForAspectRatio(AdjustFOV); + else return AdjustFOV; +} +simulated event Destroyed(){ + PreTravelCleanUp(); + Super.Destroyed(); +} +defaultproperties +{ lenseMaterialID=2 scopePortalFOVHigh=22.000000 scopePortalFOV=12.000000 ZoomMatRef="KillingFloorWeapons.Xbow.CommandoCrossFinalBlend" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" CrosshairTexRef="KillingFloorWeapons.CommandoCross" reloadType=RTYPE_AUTO bHasScope=True ZoomedDisplayFOVHigh=35.000000 ForceZoomOutOnFireTime=0.400000 MagCapacity=1 ReloadRate=0.010000 ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_Crossbow" Weight=9.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_CrossBow' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Crossbow_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Rifles.crossbow_cmb" SelectSoundRef="KF_XbowSnd.Xbow_Select" HudImageRef="KillingFloorHUD.WeaponSelect.Crossbow_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Crossbow" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=60.000000 FireModeClass(0)=Class'NicePack.NiceCrossbowFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="Recreational hunting weapon, equipped with powerful scope and firing trigger. Comes with special ammunition, designed to tear through low-resistance materials." DisplayFOV=65.000000 Priority=140 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=1 PickupClass=Class'NicePack.NiceCrossbowPickup' PlayerViewOffset=(X=15.000000,Y=16.000000,Z=-12.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceCrossbowAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="Compound Crossbow" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmo.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmo.uc new file mode 100644 index 0000000..3a66364 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmo.uc @@ -0,0 +1,5 @@ +class NiceCrossbowAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceCrossbowPickup' AmmoPickupAmount=4 MaxAmmo=40 PickupClass=Class'NicePack.NiceCrossbowAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="An arrow" +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmoPickup.uc new file mode 100644 index 0000000..416f013 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceCrossbowAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=4 InventoryType=Class'NicePack.NiceCrossbowAmmo' PickupMessage="Bolts" StaticMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAttachment.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAttachment.uc new file mode 100644 index 0000000..942269c --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAttachment.uc @@ -0,0 +1,4 @@ +class NiceCrossbowAttachment extends NiceAttachment; +defaultproperties +{ bDoFiringEffects=False MovementAnims(0)="JogF_Crossbow" MovementAnims(1)="JogB_Crossbow" MovementAnims(2)="JogL_Crossbow" MovementAnims(3)="JogR_Crossbow" TurnLeftAnim="TurnL_Crossbow" TurnRightAnim="TurnR_Crossbow" CrouchAnims(0)="CHwalkF_Crossbow" CrouchAnims(1)="CHwalkB_Crossbow" CrouchAnims(2)="CHwalkL_Crossbow" CrouchAnims(3)="CHwalkR_Crossbow" WalkAnims(0)="WalkF_Crossbow" WalkAnims(1)="WalkB_Crossbow" WalkAnims(2)="WalkL_Crossbow" WalkAnims(3)="WalkR_Crossbow" CrouchTurnRightAnim="CH_TurnR_Crossbow" CrouchTurnLeftAnim="CH_TurnL_Crossbow" IdleCrouchAnim="CHIdle_Crossbow" IdleWeaponAnim="Idle_Crossbow" IdleRestAnim="Idle_Crossbow" IdleChatAnim="Idle_Crossbow" IdleHeavyAnim="Idle_Crossbow" IdleRifleAnim="Idle_Crossbow" FireAnims(0)="Fire_Crossbow" FireAnims(1)="Fire_Crossbow" FireAnims(2)="Fire_Crossbow" FireAnims(3)="Fire_Crossbow" FireAltAnims(0)="Fire_Crossbow" FireAltAnims(1)="Fire_Crossbow" FireAltAnims(2)="Fire_Crossbow" FireAltAnims(3)="Fire_Crossbow" FireCrouchAnims(0)="CHFire_Crossbow" FireCrouchAnims(1)="CHFire_Crossbow" FireCrouchAnims(2)="CHFire_Crossbow" FireCrouchAnims(3)="CHFire_Crossbow" FireCrouchAltAnims(0)="CHFire_Crossbow" FireCrouchAltAnims(1)="CHFire_Crossbow" FireCrouchAltAnims(2)="CHFire_Crossbow" FireCrouchAltAnims(3)="CHFire_Crossbow" HitAnims(0)="HitF_Crossbow" HitAnims(1)="HitB_Crossbow" HitAnims(2)="HitL_Crossbow" HitAnims(3)="HitR_Crossbow" PostFireBlendStandAnim="Blend_Crossbow" PostFireBlendCrouchAnim="CHBlend_Crossbow" MeshRef="KF_Weapons3rd_Trip.Crossbow_3rd" +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowFire.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowFire.uc new file mode 100644 index 0000000..979cf41 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowFire.uc @@ -0,0 +1,4 @@ +class NiceCrossbowFire extends NiceFire; +defaultproperties +{ bProjectileFire=True ProjSpawnOffset=(X=25.000000) EffectiveRange=2500.000000 ProjectileSpeed=20000.000000 FireAimedAnim="Fire_Iron" maxVerticalRecoilAngle=100 maxHorizontalRecoilAngle=25 bRandomPitchFireSound=False FireSoundRef="KF_XbowSnd.Xbow_Fire" NoAmmoSoundRef="KF_XbowSnd.Xbow_DryFire" DamageType=Class'NicePack.NiceDamTypeCrossbow' DamageMax=300 Momentum=150000.000000 bWaitForRelease=True TransientSoundVolume=1.800000 FireForce="AssaultRifleFire" FireRate=0.000000 AmmoClass=Class'NicePack.NiceCrossbowAmmo' ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) BotRefireRate=1.800000 aimerror=1.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowPickup.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowPickup.uc new file mode 100644 index 0000000..cb7810e --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowPickup.uc @@ -0,0 +1,5 @@ +class NiceCrossbowPickup extends NiceWeaponPickup; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +defaultproperties +{ Weight=9.000000 AmmoCost=10 BuyClipSize=1 PowerValue=64 SpeedValue=50 RangeValue=100 Description="Recreational hunting weapon, equipped with powerful scope and firing trigger. Comes with special ammunition, designed to tear through low-resistance materials." ItemName="Crossbow" ItemShortName="Crossbow" AmmoItemName="Crossbow Bolts" AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CorrespondingPerkIndex=2 EquipmentCategoryID=3 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceCrossbow' PickupMessage="You got the Crossbow" PickupSound=Sound'KF_XbowSnd.Xbow_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.crossbow_pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceDamTypeCrossbow.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceDamTypeCrossbow.uc new file mode 100644 index 0000000..1eeaa22 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceDamTypeCrossbow.uc @@ -0,0 +1,10 @@ +class NiceDamTypeCrossbow extends NiceDamageTypeVetSharpshooter; +static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ) +{ + local NiceMonster niceKilled; + niceKilled = NiceMonster(Killed); + if(KFStatsAndAchievements!=none && (Killed.BurnDown > 0 || (niceKilled != none && niceKilled.bOnFire == true) )) KFStatsAndAchievements.AddBurningCrossbowKill(); +} +defaultproperties +{ MaxPenetrations=-1 BigZedPenDmgReduction=0.000000 MediumZedPenDmgReduction=1.000000 PenDmgReduction=1.000000 HeadShotDamageMult=4.000000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceCrossbow' bThrowRagdoll=True bRagdollBullet=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' DamageThreshold=1 KDamageImpulse=2000.000000 KDeathVel=110.000000 KDeathUpKick=10.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceDamTypeHuntingRifle.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceDamTypeHuntingRifle.uc new file mode 100644 index 0000000..347691d --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceDamTypeHuntingRifle.uc @@ -0,0 +1,5 @@ +class NiceDamTypeHuntingRifle extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ stunMultiplier=1.500000 MaxPenetrations=5 BigZedPenDmgReduction=0.750000 MediumZedPenDmgReduction=1.000000 HeadShotDamageMult=1.900000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceHuntingRifle' DeathString="%k killed %o (Hunting Rifle)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=2250.000000 KDeathVel=115.000000 KDeathUpKick=5.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifle.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifle.uc new file mode 100644 index 0000000..3595c76 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifle.uc @@ -0,0 +1,4 @@ +class NiceHuntingRifle extends NiceScopedWeapon; +defaultproperties +{ lenseMaterialID=2 scopePortalFOVHigh=22.000000 scopePortalFOV=12.000000 ZoomMatRef="ScrnWeaponPack_T.BDHR.RifleCrossFinal" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.Rifles.CBLens_cmb" CrosshairTexRef="ScrnWeaponPack_T.BDHR.BDHR.HRCross" reloadPreEndFrame=0.180000 reloadEndFrame=0.590000 reloadChargeEndFrame=0.930000 reloadChargeStartFrame=0.610000 bHasScope=True ZoomedDisplayFOVHigh=45.000000 MagCapacity=5 ReloadRate=3.200000 ReloadAnim="Reload" ReloadAnimRate=1.400000 WeaponReloadAnim="Reload_M14" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'ScrnWeaponPack_T.BDHR.huntingrifle_Trader' MeshRef="ScrnWeaponPack_A.hunt_rifle" SkinRefs(0)="ScrnWeaponPack_T.BDHR.HR_Final" SkinRefs(1)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SkinRefs(2)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="ScrnWeaponPack_T.BDHR.HR_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.BDHR.HR_selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=60.000000 FireModeClass(0)=Class'NicePack.NiceHuntingRifleFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="A rugged and reliable scoped rifle with great penetrative power." DisplayFOV=65.000000 Priority=10 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=3 PickupClass=Class'NicePack.NiceHuntingRiflePickup' PlayerViewOffset=(X=15.000000,Y=16.000000,Z=-4.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceHuntingRifleAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="Hunting Rifle" +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmo.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmo.uc new file mode 100644 index 0000000..af7edbd --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmo.uc @@ -0,0 +1,5 @@ +class NiceHuntingRifleAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceHuntingRiflePickup' AmmoPickupAmount=5 MaxAmmo=40 PickupClass=Class'NicePack.NiceHuntingRifleAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Rifle bullets" +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmoPickup.uc new file mode 100644 index 0000000..453fdfc --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceHuntingRifleAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=5 InventoryType=Class'NicePack.NiceHuntingRifleAmmo' PickupMessage=".308 rounds" StaticMesh=None +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAttachment.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAttachment.uc new file mode 100644 index 0000000..09b6c45 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAttachment.uc @@ -0,0 +1,4 @@ +class NiceHuntingRifleAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSTG' mTracerClass=Class'KFMod.KFNewTracer' MovementAnims(0)="WalkF_Winchester" MovementAnims(1)="WalkB_Winchester" MovementAnims(2)="WalkL_Winchester" MovementAnims(3)="WalkL_Winchester" TurnLeftAnim="TurnL_Winchester" TurnRightAnim="TurnR_Winchester" CrouchAnims(0)="CHwalkF_Winchester" CrouchAnims(1)="CHwalkB_Winchester" CrouchAnims(2)="CHwalkL_Winchester" CrouchAnims(3)="CHwalkR_Winchester" WalkAnims(0)="WalkF_Winchester" WalkAnims(1)="WalkB_Winchester" WalkAnims(2)="WalkL_Winchester" WalkAnims(3)="WalkL_Winchester" CrouchTurnRightAnim="CH_TurnR_Winchester" CrouchTurnLeftAnim="CH_TurnL_Winchester" IdleCrouchAnim="CHIdle_Winchester" IdleWeaponAnim="IS_Idle_Winchester" IdleRestAnim="IS_Idle_Winchester" IdleChatAnim="IS_Idle_Winchester" IdleHeavyAnim="IS_Idle_Winchester" IdleRifleAnim="IS_Idle_Winchester" FireAnims(0)="Claw" FireAnims(1)="Claw" FireAnims(2)="Claw" FireAnims(3)="Claw" FireAltAnims(0)="IS_Fire_Winchester" FireAltAnims(1)="IS_Fire_Winchester" FireAltAnims(2)="IS_Fire_Winchester" FireAltAnims(3)="IS_Fire_Winchester" FireCrouchAnims(0)="CHFire_Winchester" FireCrouchAnims(1)="CHFire_Winchester" FireCrouchAnims(2)="CHFire_Winchester" FireCrouchAnims(3)="CHFire_Winchester" FireCrouchAltAnims(0)="CHFire_Winchester" FireCrouchAltAnims(1)="CHFire_Winchester" FireCrouchAltAnims(2)="CHFire_Winchester" FireCrouchAltAnims(3)="CHFire_Winchester" HitAnims(0)="HitF_Winchester" HitAnims(1)="HitB_Winchester" HitAnims(2)="HitL_Winchester" HitAnims(3)="HitR_Winchester" PostFireBlendStandAnim="Blend_Winchester" PostFireBlendCrouchAnim="CHBlend_Winchester" MeshRef="ScrnWeaponPack_A.HuntingRifle3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleFire.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleFire.uc new file mode 100644 index 0000000..978e712 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleFire.uc @@ -0,0 +1,4 @@ +class NiceHuntingRifleFire extends NiceFire; +defaultproperties +{ ProjectileSpeed=35000.000000 zoomOutOnShot=True FireAimedAnim="Fire_Iron" RecoilRate=0.100000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=62 FireSoundRef="ScrnWeaponPack_SND.BDHR.awp1_mono" StereoFireSoundRef="ScrnWeaponPack_SND.BDHR.awp1_stereo" NoAmmoSoundRef="KF_RifleSnd.Rifle_DryFire" DamageType=Class'NicePack.NiceDamTypeHuntingRifle' DamageMin=300 DamageMax=300 Momentum=18000.000000 bWaitForRelease=True bModeExclusive=False bAttachSmokeEmitter=True TransientSoundVolume=1.800000 FireLoopAnim= FireEndAnim= FireAnimRate=2.714000 FireForce="ShockRifleFire" FireRate=0.700000 AmmoClass=Class'NicePack.NiceHuntingRifleAmmo' ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=2.000000 ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.650000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRiflePickup.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRiflePickup.uc new file mode 100644 index 0000000..b4c0a35 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRiflePickup.uc @@ -0,0 +1,7 @@ +//============================================================================= +// HuntingRifle Pickup. +//============================================================================= +class NiceHuntingRiflePickup extends NiceWeaponPickup; +defaultproperties +{ Weight=6.000000 cost=750 AmmoCost=35 BuyClipSize=5 PowerValue=55 SpeedValue=42 RangeValue=95 Description="A rugged and reliable scoped rifle with great penetrative power." ItemName="Hunting Rifle" ItemShortName="Hunter R." AmmoItemName="Rifle bullets" CorrespondingPerkIndex=2 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceHuntingRifle' PickupMessage="You got the Hunting Rifle" PickupSound=Sound'KF_RifleSnd.RifleBase.Rifle_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.HR_Pickup' CollisionRadius=30.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceDamTypeM14EBR.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceDamTypeM14EBR.uc new file mode 100644 index 0000000..18617a4 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceDamTypeM14EBR.uc @@ -0,0 +1,13 @@ +class NiceDamTypeM14EBR extends NiceDamageTypeVetCommando + abstract; +static function ScoredHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class MonsterClass, bool bLaserSightedM14EBRKill) +{ + super.ScoredHeadshot( KFStatsAndAchievements, MonsterClass, bLaserSightedM14EBRKill ); + if ( KFStatsAndAchievements != none ) + { KFStatsAndAchievements.AddHeadshotsWithSPSOrM14( MonsterClass ); + } +} +defaultproperties +{ + badDecapMod=0.6000 bIsProjectile=True HeadShotDamageMult=2.250000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceM14EBRBattleRifle' DeathString="%k killed %o (M14 EBR)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' KDamageImpulse=7500.000000 KDeathVel=175.000000 KDeathUpKick=25.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmo.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmo.uc new file mode 100644 index 0000000..e26bc1d --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmo.uc @@ -0,0 +1,5 @@ +class NiceM14EBRAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM14EBRPickup' AmmoPickupAmount=20 MaxAmmo=160 InitialAmount=40 PickupClass=Class'NicePack.NiceM14EBRAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M14EBR bullets" +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmoPickup.uc new file mode 100644 index 0000000..4298c4f --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM14EBRAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=20 InventoryType=Class'NicePack.NiceM14EBRAmmo' PickupMessage="Rounds 7.62x51mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAttachment.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAttachment.uc new file mode 100644 index 0000000..6c256f9 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAttachment.uc @@ -0,0 +1,4 @@ +class NiceM14EBRAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M14" MovementAnims(1)="JogB_M14" MovementAnims(2)="JogL_M14" MovementAnims(3)="JogR_M14" TurnLeftAnim="TurnL_M14" TurnRightAnim="TurnR_M14" CrouchAnims(0)="CHWalkF_M14" CrouchAnims(1)="CHWalkB_M14" CrouchAnims(2)="CHWalkL_M14" CrouchAnims(3)="CHWalkR_M14" WalkAnims(0)="WalkF_M14" WalkAnims(1)="WalkB_M14" WalkAnims(2)="WalkL_M14" WalkAnims(3)="WalkR_M14" CrouchTurnRightAnim="CH_TurnR_M14" CrouchTurnLeftAnim="CH_TurnL_M14" IdleCrouchAnim="CHIdle_M14" IdleWeaponAnim="Idle_M14" IdleRestAnim="Idle_M14" IdleChatAnim="Idle_M14" IdleHeavyAnim="Idle_M14" IdleRifleAnim="Idle_M14" FireAnims(0)="Fire_M14" FireAnims(1)="Fire_M14" FireAnims(2)="Fire_M14" FireAnims(3)="Fire_M14" FireAltAnims(0)="Fire_M14" FireAltAnims(1)="Fire_M14" FireAltAnims(2)="Fire_M14" FireAltAnims(3)="Fire_M14" FireCrouchAnims(0)="CHFire_M14" FireCrouchAnims(1)="CHFire_M14" FireCrouchAnims(2)="CHFire_M14" FireCrouchAnims(3)="CHFire_M14" FireCrouchAltAnims(0)="CHFire_M14" FireCrouchAltAnims(1)="CHFire_M14" FireCrouchAltAnims(2)="CHFire_M14" FireCrouchAltAnims(3)="CHFire_M14" HitAnims(0)="HitF_M14" HitAnims(1)="HitB_M14" HitAnims(2)="HitL_M14" HitAnims(3)="HitR_M14" PostFireBlendStandAnim="Blend_M14" PostFireBlendCrouchAnim="CHBlend_M14" MeshRef="KF_Weapons3rd2_Trip.M14_EBR_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRBattleRifle.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRBattleRifle.uc new file mode 100644 index 0000000..33cae6a --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRBattleRifle.uc @@ -0,0 +1,7 @@ +class NiceM14EBRBattleRifle extends NiceWeapon; +simulated function AltFire(float F){ + ToggleLaser(); +} +defaultproperties +{ reloadPreEndFrame=0.120000 reloadEndFrame=0.590000 reloadChargeEndFrame=0.810000 reloadMagStartFrame=0.200000 reloadChargeStartFrame=0.710000 MagCapacity=20 ReloadRate=3.366000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M14" Weight=8.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M14' bIsTier3Weapon=True MeshRef="KF_Weapons2_Trip.M14_EBR_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Rifle.M14_cmb" SelectSoundRef="KF_M14EBRSnd.M14EBR_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M14_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M14" PlayerIronSightFOV=60.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM14EBRFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="Updated M14 Enhanced Battle Rifle - Semi Auto variant. Equipped with a laser sight. A special lens allows to change laser's color on the fly." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=165 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=5 PickupClass=Class'NicePack.NiceM14EBRPickup' PlayerViewOffset=(X=25.000000,Y=17.000000,Z=-8.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM14EBRAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M14 EBR" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRFire.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRFire.uc new file mode 100644 index 0000000..ca57c23 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRFire.uc @@ -0,0 +1,4 @@ +class NiceM14EBRFire extends NiceFire; +defaultproperties +{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=42650.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.085000 maxVerticalRecoilAngle=500 maxHorizontalRecoilAngle=125 ShellEjectClass=Class'ROEffects.KFShellEjectEBR' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_M14EBRSnd.M14EBR_Fire" StereoFireSoundRef="KF_M14EBRSnd.M14EBR_FireST" NoAmmoSoundRef="KF_M14EBRSnd.M14EBR_DryFire" DamageType=Class'NicePack.NiceDamTypeM14EBR' DamageMin=120 DamageMax=120 Momentum=9500.000000 bPawnRapidFireAnim=True bWaitForRelease=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.250000 AmmoClass=Class'NicePack.NiceM14EBRAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRPickup.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRPickup.uc new file mode 100644 index 0000000..2dfd5bb --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRPickup.uc @@ -0,0 +1,5 @@ +class NiceM14EBRPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=8.000000 + cost=1000 AmmoCost=15 BuyClipSize=20 PowerValue=55 SpeedValue=20 RangeValue=95 Description="Updated M14 Enhanced Battle Rifle - Semi Auto variant. Equipped with a laser sight. A special lens allows to change laser's color on the fly." ItemName="M14 EBR" ItemShortName="M14 EBR" AmmoItemName="7.62x51mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceM14EBRBattleRifle' PickupMessage="You got the M14 EBR" PickupSound=Sound'KF_M14EBRSnd.M14EBR_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Rifles.M14_EBR_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceDamTypeM99SniperRifle.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceDamTypeM99SniperRifle.uc new file mode 100644 index 0000000..96b6835 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceDamTypeM99SniperRifle.uc @@ -0,0 +1,9 @@ +class NiceDamTypeM99SniperRifle extends NiceDamageTypeVetSharpshooter + abstract; +static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ){ + if(KFStatsAndAchievements != none){ if(Killed.IsA('NiceZombieScrake') || Killed.IsA('MeanZombieScrake')) KFStatsAndAchievements.AddM99Kill(); if(Killed.IsA('NiceZombieHusk') || Killed.IsA('MeanZombieHusk')) KFStatsAndAchievements.AddHuskAndZedOneShotKill(true, false); else KFStatsAndAchievements.AddHuskAndZedOneShotKill(false, true); + } +} +defaultproperties +{ prReqMultiplier=0.600000 prReqPrecise=0.600000 MaxPenetrations=-1 BigZedPenDmgReduction=0.750000 MediumZedPenDmgReduction=1.000000 PenDmgReduction=1.000000 HeadShotDamageMult=2.100000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceM99SniperRifle' DeathString="%k put a bullet in %o's head." FemaleSuicide="%o shot herself in the head." MaleSuicide="%o shot himself in the head." bThrowRagdoll=True bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) DamageThreshold=1 KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.650000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Ammo.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Ammo.uc new file mode 100644 index 0000000..1c0cedd --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Ammo.uc @@ -0,0 +1,5 @@ +class NiceM99Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceM99Pickup' AmmoPickupAmount=2 MaxAmmo=20 InitialAmount=5 PickupClass=Class'NicePack.NiceM99AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="50 Cal Bullets" +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99AmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99AmmoPickup.uc new file mode 100644 index 0000000..66655aa --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99AmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceM99AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=2 InventoryType=Class'NicePack.NiceM99Ammo' PickupMessage="50 Cal Bullets" StaticMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Attachment.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Attachment.uc new file mode 100644 index 0000000..a7bf41c --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Attachment.uc @@ -0,0 +1,4 @@ +class NiceM99Attachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPTRD' MovementAnims(0)="JogF_M4203" MovementAnims(1)="JogB_M4203" MovementAnims(2)="JogL_M4203" MovementAnims(3)="JogR_M4203" TurnLeftAnim="TurnL_M4203" TurnRightAnim="TurnR_M4203" CrouchAnims(0)="CHWalkF_M4203" CrouchAnims(1)="CHWalkB_M4203" CrouchAnims(2)="CHWalkL_M4203" CrouchAnims(3)="CHWalkR_M4203" WalkAnims(0)="WalkF_M4203" WalkAnims(1)="WalkB_M4203" WalkAnims(2)="WalkL_M4203" WalkAnims(3)="WalkR_M4203" CrouchTurnRightAnim="CH_TurnR_M4203" CrouchTurnLeftAnim="CH_TurnL_M4203" IdleCrouchAnim="CHIdle_M4203" IdleWeaponAnim="Idle_M4203" IdleRestAnim="Idle_M4203" IdleChatAnim="Idle_M4203" IdleHeavyAnim="Idle_M4203" IdleRifleAnim="Idle_M4203" FireAnims(0)="Fire_M99" FireAnims(1)="Fire_M99" FireAnims(2)="Fire_M99" FireAnims(3)="Fire_M99" FireAltAnims(0)="Fire_M99" FireAltAnims(1)="Fire_M99" FireAltAnims(2)="Fire_M99" FireAltAnims(3)="Fire_M99" FireCrouchAnims(0)="CHFire_M99" FireCrouchAnims(1)="CHFire_M99" FireCrouchAnims(2)="CHFire_M99" FireCrouchAnims(3)="CHFire_M99" FireCrouchAltAnims(0)="CHFire_M99" FireCrouchAltAnims(1)="CHFire_M99" FireCrouchAltAnims(2)="CHFire_M99" FireCrouchAltAnims(3)="CHFire_M99" HitAnims(0)="HitF_M4203" HitAnims(1)="HitB_M4203" HitAnims(2)="HitL_M4203" HitAnims(3)="HitR_M4203" PostFireBlendStandAnim="Blend_M4203" PostFireBlendCrouchAnim="CHBlend_M4203" MeshRef="KF_Weapons3rd4_Trip.M99_Sniper_3rd" +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Fire.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Fire.uc new file mode 100644 index 0000000..22ae6de --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Fire.uc @@ -0,0 +1,4 @@ +class NiceM99Fire extends NiceFire; +defaultproperties +{ ProjectileSpeed=40000.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.100000 maxVerticalRecoilAngle=2000 maxHorizontalRecoilAngle=1000 bRandomPitchFireSound=False FireSoundRef="KF_M99Snd.M99_Fire_M" StereoFireSoundRef="KF_M99Snd.M99_Fire_S" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeM99SniperRifle' DamageMin=750 DamageMax=750 Momentum=150000.000000 bWaitForRelease=True TransientSoundVolume=1.800000 FireAnimRate=0.850000 FireForce="AssaultRifleFire" FireRate=0.000000 AmmoClass=Class'NicePack.NiceM99Ammo' ShakeRotMag=(X=5.000000,Y=7.000000,Z=3.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeOffsetMag=(X=5.000000,Y=5.000000,Z=5.000000) BotRefireRate=3.570000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stPTRD' aimerror=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Pickup.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Pickup.uc new file mode 100644 index 0000000..b2e0e5b --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Pickup.uc @@ -0,0 +1,4 @@ +class NiceM99Pickup extends NiceWeaponPickup; +defaultproperties +{ cost=1250 AmmoCost=60 BuyClipSize=1 PowerValue=95 SpeedValue=30 RangeValue=100 Description="M99 50 Caliber Single Shot Sniper Rifle - The ultimate in long range accuracy and knock down power. But to land a proper shot with it one needs to be extra precise and aim at his target for at least a solid second." ItemName="M99 AMR" ItemShortName="M99 AMR" AmmoItemName="50 Cal Bullets" CorrespondingPerkIndex=2 EquipmentCategoryID=3 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceM99SniperRifle' PickupMessage="You got the M99 Sniper Rifle" PickupSound=Sound'KF_M99Snd.M99_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups4_Trip.Rifles.M99_Sniper_Pickup' CollisionRadius=25.000000 CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99SniperRifle.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99SniperRifle.uc new file mode 100644 index 0000000..83f713b --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99SniperRifle.uc @@ -0,0 +1,23 @@ +class NiceM99SniperRifle extends NiceScopedWeapon; +#exec OBJ LOAD FILE=..\Textures\KF_Weapons5_Scopes_Trip_T.utx +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.43; + reloadDesc.trashStartFrame = 0.882; + reloadDesc.resumeFrame = 0.473; + reloadDesc.speedFrame = 0.129; + reloadDesc.animName = 'Fire'; + autoReloadsDescriptions[0] = reloadDesc; + reloadDesc.animName = 'Fire_Iron'; + autoReloadsDescriptions[1] = reloadDesc; + super.PostBeginPlay(); +} +simulated function bool StartFire(int Mode){ + if(super.StartFire(Mode)){ if(Instigator != none && PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none){ KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnShotM99(); } return true; + } + return false; +} +defaultproperties +{ lenseMaterialID=2 scopePortalFOVHigh=20.000000 scopePortalFOV=13.330000 ZoomMatRef="KF_Weapons5_Scopes_Trip_T.M99.MilDotFinalBlend" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" CrosshairTexRef="KF_Weapons5_Scopes_Trip_T.Scope.MilDot" bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_AUTO bHasScope=True ZoomedDisplayFOVHigh=18.000000 ForceZoomOutOnFireTime=0.400000 MagCapacity=1 ReloadRate=0.010000 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M99' bIsTier3Weapon=True MeshRef="KF_Wep_M99_Sniper.M99_Sniper" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.M99_cmb" SelectSoundRef="KF_M99Snd.M99_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M99_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M99" PlayerIronSightFOV=30.000000 ZoomTime=0.285000 ZoomedDisplayFOV=30.000000 FireModeClass(0)=Class'NicePack.NiceM99Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" PutDownAnimRate=2.000000 SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="M99 50 Caliber Single Shot Sniper Rifle - The ultimate in long range accuracy and knock down power. But to land a proper shot with it one needs to be extra precise and aim at his target for at least a solid second." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=190 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" MinReloadPct=0.800000 InventoryGroup=4 GroupOffset=14 PickupClass=Class'NicePack.NiceM99Pickup' PlayerViewOffset=(X=15.000000,Y=15.000000,Z=-2.500000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceM99Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M99AMR" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceDamTypeMauler.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceDamTypeMauler.uc new file mode 100644 index 0000000..d62e385 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceDamTypeMauler.uc @@ -0,0 +1,9 @@ +class NiceDamTypeMauler extends NiceDamageTypeVetSharpshooter + abstract; +static function ScoredNiceHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class MonsterClass, int HL){ + super.ScoredNiceHeadshot(KFStatsAndAchievements, MonsterClass, HL); + if(KFStatsAndAchievements != none) KFStatsAndAchievements.AddHeadshotsWithSPSOrM14(MonsterClass); +} +defaultproperties +{ stunMultiplier=1.250000 HeadShotDamageMult=4.000000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceMaulerRifle' DeathString="%k killed %o (S.P. Mauler)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' KDamageImpulse=7500.000000 KDeathVel=175.000000 KDeathUpKick=25.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmo.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmo.uc new file mode 100644 index 0000000..bc10985 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmo.uc @@ -0,0 +1,4 @@ +class NiceMaulerAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceMaulerPickup' AmmoPickupAmount=10 MaxAmmo=80 InitialAmount=20 PickupClass=Class'NicePack.NiceMaulerAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="S.P. Mauler bullets" +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmoPickup.uc new file mode 100644 index 0000000..6f65f65 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceMaulerAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=10 InventoryType=Class'NicePack.NiceMaulerAmmo' PickupMessage="S.P. Mauler bullets" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAttachment.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAttachment.uc new file mode 100644 index 0000000..182782b --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAttachment.uc @@ -0,0 +1,4 @@ +class NiceMaulerAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSPSniper' mTracerClass=Class'NicePack.NiceMaulerTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M14" MovementAnims(1)="JogB_M14" MovementAnims(2)="JogL_M14" MovementAnims(3)="JogR_M14" TurnLeftAnim="TurnL_M14" TurnRightAnim="TurnR_M14" CrouchAnims(0)="CHWalkF_M14" CrouchAnims(1)="CHWalkB_M14" CrouchAnims(2)="CHWalkL_M14" CrouchAnims(3)="CHWalkR_M14" WalkAnims(0)="WalkF_M14" WalkAnims(1)="WalkB_M14" WalkAnims(2)="WalkL_M14" WalkAnims(3)="WalkR_M14" CrouchTurnRightAnim="CH_TurnR_M14" CrouchTurnLeftAnim="CH_TurnL_M14" IdleCrouchAnim="CHIdle_M14" IdleWeaponAnim="Idle_M14" IdleRestAnim="Idle_M14" IdleChatAnim="Fire_spSinper" IdleHeavyAnim="Idle_M14" IdleRifleAnim="Idle_M14" FireAnims(0)="Fire_spSinper" FireAnims(1)="Fire_spSinper" FireAnims(2)="Fire_spSinper" FireAnims(3)="Fire_spSinper" FireAltAnims(0)="Fire_spSinper" FireAltAnims(1)="Fire_spSinper" FireAltAnims(2)="Fire_spSinper" FireAltAnims(3)="Fire_spSinper" FireCrouchAnims(0)="CHFire_spSinper" FireCrouchAnims(1)="CHFire_spSinper" FireCrouchAnims(2)="CHFire_spSinper" FireCrouchAnims(3)="CHFire_spSinper" FireCrouchAltAnims(0)="CHFire_spSinper" FireCrouchAltAnims(1)="CHFire_spSinper" FireCrouchAltAnims(2)="CHFire_spSinper" FireCrouchAltAnims(3)="CHFire_spSinper" HitAnims(0)="HitF_M14" HitAnims(1)="HitB_M14" HitAnims(2)="HitL_M14" HitAnims(3)="HitR_M14" PostFireBlendStandAnim="Blend_M14" PostFireBlendCrouchAnim="CHBlend_M14" MeshRef="NicePackA.spSniper_3rd" SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerFire.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerFire.uc new file mode 100644 index 0000000..2d44435 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerFire.uc @@ -0,0 +1,4 @@ +class NiceMaulerFire extends NiceFire; +defaultproperties +{ ProjectileSpeed=37950.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.120000 maxVerticalRecoilAngle=125 maxHorizontalRecoilAngle=87 ShellEjectClass=Class'ROEffects.KFShellEjectEBR' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_M" StereoFireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_S" NoAmmoSoundRef="KF_M14EBRSnd.M14EBR_DryFire" DamageType=Class'NicePack.NiceDamTypeMauler' DamageMin=121 DamageMax=121 Momentum=13000.000000 bWaitForRelease=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" FireAnimRate=1.600000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.587500 AmmoClass=Class'NicePack.NiceMaulerAmmo' ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=2.000000 ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPSniper' aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerPickup.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerPickup.uc new file mode 100644 index 0000000..dfd6ddf --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerPickup.uc @@ -0,0 +1,4 @@ +class NiceMaulerPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=6.000000 cost=750 AmmoCost=50 BuyClipSize=10 PowerValue=60 SpeedValue=10 RangeValue=95 Description="A finely crafted rifle with relatively low impact damage, but able to deal devastating blows with precise aiming." ItemName="Silver-Plated Mauler" ItemShortName="S.P. Mauler" AmmoItemName="S.P. Mauler bullets" CorrespondingPerkIndex=2 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceMaulerRifle' PickupMessage="You got the Silver-Plated Mauler" PickupSound=Sound'NicePackSnd.Silver.KFO_Sniper_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.Silver.SniperRifle' CollisionRadius=25.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerRifle.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerRifle.uc new file mode 100644 index 0000000..f661342 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerRifle.uc @@ -0,0 +1,6 @@ +class NiceMaulerRifle extends NiceWeapon + config(user); +#exec OBJ LOAD FILE=NicePackSM.usx +defaultproperties +{ reloadPreEndFrame=0.200000 reloadEndFrame=0.550000 reloadChargeEndFrame=0.894000 reloadMagStartFrame=0.280000 reloadChargeStartFrame=0.647000 MagCapacity=10 ReloadRate=2.866000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_spSinper" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=0 TraderInfoTexture=Texture'NicePackT.Silver.Trader_Sniper' bIsTier2Weapon=True MeshRef="NicePackA.SniperRifle" SkinRefs(1)="NicePackT.Silver.Sniper_cmb" SkinRefs(2)="NicePackT.Silver.sniperrifle_scope_shader" SelectSoundRef="NicePackSnd.Silver.KFO_Sniper_Select" HudImageRef="KF_IJC_HUD.WeaponSelect.Sniper_unselected" SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.Sniper" PlayerIronSightFOV=60.000000 ZoomedDisplayFOV=25.000000 FireModeClass(0)=Class'NicePack.NiceMaulerFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A finely crafted rifle with relatively low impact damage, but able to deal devastating blows with precise aiming." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=155 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=18 PickupClass=Class'NicePack.NiceMaulerPickup' PlayerViewOffset=(X=25.000000,Y=17.000000,Z=-8.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceMaulerAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="S.P. Mauler" TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerTracer.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerTracer.uc new file mode 100644 index 0000000..28ab907 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerTracer.uc @@ -0,0 +1,4 @@ +class NiceMaulerTracer extends KFNewTracer; +defaultproperties +{ Begin Object Class=SpriteEmitter Name=SpriteEmitter13 UseDirectionAs=PTDU_Right RespawnDeadParticles=False UseAbsoluteTimeForSizeScale=True UseRegularSizeScale=False ScaleSizeXByVelocity=True AutomaticInitialSpawning=False ExtentMultiplier=(X=0.200000) ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000)) MaxParticles=100 StartSizeRange=(X=(Min=30.000000,Max=30.000000),Y=(Min=3.000000,Max=3.000000)) ScaleSizeByVelocityMultiplier=(X=0.001000) DrawStyle=PTDS_Brighten Texture=Texture'Effects_Tex_Steampunk.Steampunk_Tracer' LifetimeRange=(Min=0.100000,Max=0.100000) StartVelocityRange=(Z=(Min=10000.000000,Max=10000.000000)) End Object Emitters(0)=SpriteEmitter'NicePack.NiceMaulerTracer.SpriteEmitter13' +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVD.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVD.uc new file mode 100644 index 0000000..7f647ae --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVD.uc @@ -0,0 +1,4 @@ +class NiceDamTypeSVD extends NiceDamageTypeVetSharpshooter; +defaultproperties +{ prReqMultiplier=0.400000 prReqPrecise=0.400000 MaxPenetrations=3 BigZedPenDmgReduction=0.750000 MediumZedPenDmgReduction=0.900000 PenDmgReduction=0.950000 HeadShotDamageMult=4.200000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceSVD' DeathString="%k killed %o (SVD)." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=4000.000000 KDeathVel=170.000000 KDeathUpKick=10.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDS.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDS.uc new file mode 100644 index 0000000..d5d1728 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDS.uc @@ -0,0 +1,4 @@ +class NiceDamTypeSVDS extends NiceDamageTypeVetSharpshooter; +defaultproperties +{ MaxPenetrations=1 BigZedPenDmgReduction=0.750000 MediumZedPenDmgReduction=0.900000 PenDmgReduction=0.950000 HeadShotDamageMult=4.200000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceSVDS' DeathString="%k killed %o (SVD)." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=4000.000000 KDeathVel=170.000000 KDeathUpKick=10.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDm.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDm.uc new file mode 100644 index 0000000..7dd5d34 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDm.uc @@ -0,0 +1,5 @@ +class NiceDamTypeSVDm extends KFWeaponDamageType + abstract; +defaultproperties +{ HeadShotDamageMult=1.000000 bIsMeleeDamage=True WeaponClass=Class'NicePack.NiceSVD' DeathString="%k killed %o (SVD)." PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh' KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=1.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVD.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVD.uc new file mode 100644 index 0000000..46efab1 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVD.uc @@ -0,0 +1,4 @@ +class NiceSVD extends NiceSVDS; +defaultproperties +{ lenseMaterialID=4 scopePortalFOVHigh=12.000000 scopePortalFOV=12.000000 reloadPreEndFrame=0.115000 reloadEndFrame=0.607000 reloadChargeEndFrame=0.870000 reloadMagStartFrame=0.251000 reloadChargeStartFrame=0.730000 MagazineBone="Bone_Magazine" ZoomedDisplayFOVHigh=32.000000 MagCapacity=10 ReloadRate=3.600000 ReloadAnimRate=1.250000 WeaponReloadAnim="Reload_AK47" Weight=8.000000 IdleAimAnim="Idle_Iron" TraderInfoTexture=Texture'ScrnWeaponPack_T.SVD.SVD_Trader' MeshRef="ScrnWeaponPack_A.SVD_mesh" SkinRefs(0)="ScrnWeaponPack_T.SVD.SVD_tex_1_cmb" SkinRefs(1)="KF_Weapons5_Trip_T.First_Sleeves.Steampunk_DJ_Scully_First_Person_Sleeves" SkinRefs(2)="ScrnWeaponPack_T.SVD.SVD_tex_2_cmb" SkinRefs(3)="ScrnWeaponPack_T.SVD.SVD_tex_3_cmb" SkinRefs(4)="ScrnWeaponPack_T.SVD.AlphaLens" SkinRefs(5)="ScrnWeaponPack_T.SVD.SVD_tex_4_cmb" HudImageRef="ScrnWeaponPack_T.SVD.SVD_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.SVD.SVD_selected" PlayerIronSightFOV=22.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceSVDFire' FireModeClass(1)=Class'NicePack.NiceSVDFireB' Description="The Dragunov sniper rifle is a semi-automatic sniper rifle/designated marksman rifle. It's shots are extra powerful, but require more precision." Priority=190 PickupClass=Class'NicePack.NiceSVDPickup' PlayerViewOffset=(X=6.000000,Y=22.000000,Z=-12.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceSVDAttachment' ItemName="SVD (Dragunov)" +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAmmo.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAmmo.uc new file mode 100644 index 0000000..6cd402e --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAmmo.uc @@ -0,0 +1,4 @@ +class NiceSVDAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceSVDPickup' AmmoPickupAmount=10 MaxAmmo=60 InitialAmount=15 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="7.62x54mm" +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAttachment.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAttachment.uc new file mode 100644 index 0000000..14b73b0 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAttachment.uc @@ -0,0 +1,4 @@ +class NiceSVDAttachment extends NiceAttachment; +defaultproperties +{ bSecondaryModeNoEffects=True mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlash3rdSVD' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'ScrnWeaponPack.KFShellSpewerSVD' MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="FastAttack2_Knife" FireAltAnims(1)="FastAttack2_Knife" FireAltAnims(2)="FastAttack2_Knife" FireAltAnims(3)="FastAttack2_Knife" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFastAttack2_Knife" FireCrouchAltAnims(1)="CHFastAttack2_Knife" FireCrouchAltAnims(2)="CHFastAttack2_Knife" FireCrouchAltAnims(3)="CHFastAttack2_Knife" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.SVD_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' LightBrightness=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFire.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFire.uc new file mode 100644 index 0000000..730c060 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFire.uc @@ -0,0 +1,4 @@ +class NiceSVDFire extends NiceSVDSFire; +defaultproperties +{ ProjectileSpeed=41500.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.150000 maxVerticalRecoilAngle=375 maxHorizontalRecoilAngle=150 DamageType=Class'NicePack.NiceDamTypeSVD' DamageMin=180 DamageMax=180 FireAnimRate=0.500000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.700000 AmmoClass=Class'NicePack.NiceSVDAmmo' BotRefireRate=1.200000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFireB.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFireB.uc new file mode 100644 index 0000000..a32f7b3 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFireB.uc @@ -0,0 +1,13 @@ +class NiceSVDFireB extends KFMeleeFire; + +simulated function bool AllowFire() +{ + if(KFWeapon(Weapon).bIsReloading) return false; + if(KFPawn(Instigator).SecondaryItem!=none) return false; + if(KFPawn(Instigator).bThrowingNade) return false; + if ( KFWeapon(Weapon).bAimingRifle ) return false; + return Super.AllowFire(); +} +defaultproperties +{ MeleeDamage=65 ProxySize=0.150000 weaponRange=90.000000 DamagedelayMin=0.160000 DamagedelayMax=0.160000 hitDamageClass=Class'NicePack.NiceDamTypeSVDm' MeleeHitSounds(0)=Sound'KF_AxeSnd.AxeImpactBase.Axe_HitFlesh4' HitEffectClass=Class'ScrnWeaponPack.SVDHitEffect' bWaitForRelease=True FireAnim="MeleeAttack" FireRate=1.100000 BotRefireRate=1.100000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDPickup.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDPickup.uc new file mode 100644 index 0000000..d311ef6 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDPickup.uc @@ -0,0 +1,7 @@ +class NiceSVDPickup extends NiceWeaponPickup; +#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx +defaultproperties +{ Weight=8.000000 + cost=1250 AmmoCost=50 BuyClipSize=10 PowerValue=90 SpeedValue=40 RangeValue=100 Description="The Dragunov sniper rifle is a semi-automatic sniper rifle/designated marksman rifle. It's shots are extra powerful, but require more precision." ItemName="SVD (Dragunov) " ItemShortName="SVD" AmmoItemName="7.64x54mm" CorrespondingPerkIndex=2 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceSVD' PickupMessage="You've got the Dragunov Sniper Rifle (SVD)" PickupSound=Sound'ScrnWeaponPack_SND.SVD.SVD_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.SVD_st' CollisionRadius=30.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDS.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDS.uc new file mode 100644 index 0000000..2e2fb6d --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDS.uc @@ -0,0 +1,4 @@ +class NiceSVDS extends NiceScopedWeapon; +defaultproperties +{ lenseMaterialID=3 scopePortalFOVHigh=10.000000 scopePortalFOV=10.000000 ZoomMatRef="ScrnWeaponPack_T.SVD.PSO1ScopeFinalBlend" ScriptedTextureFallbackRef="ScrnWeaponPack_T.SVD.AlphaLens" CrosshairTexRef="ScrnWeaponPack_T.SVD.PSO1Scope" reloadPreEndFrame=0.140000 reloadEndFrame=0.610000 reloadChargeEndFrame=0.920000 reloadMagStartFrame=0.354000 reloadChargeStartFrame=0.610000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=55.000000 MagCapacity=5 ReloadRate=3.500000 ReloadAnim="Reload" ReloadAnimRate=0.800000 WeaponReloadAnim="Reload_M14" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'ScrnWeaponPack_T.SVDS.SVD-cTrader' MeshRef="ScrnWeaponPack_A.SVDS_mesh" SkinRefs(0)="ScrnWeaponPack_T.SVDS.Svd_D_Sh" SkinRefs(1)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SkinRefs(2)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SkinRefs(3)="ScrnWeaponPack_T.SVD.AlphaLens" SelectSoundRef="ScrnWeaponPack_SND.SVD.SVD_select" HudImageRef="ScrnWeaponPack_T.SVDS.SVD-cUnselected" SelectedHudImageRef="ScrnWeaponPack_T.SVDS.SVD-cSelected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceSVDSFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="The Dragunov sniper rifle with folding stock (formally Russian: Snayperskaya Vintovka Dragunova Skladnaya, SVDS) is a compact variant of the SVD, which was developed in the early 1990s. It features a tubular metal stock that folds to the right side of the receiver and a synthetic pistol grip." DisplayFOV=65.000000 Priority=150 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=3 PickupClass=Class'NicePack.NiceSVDSPickup' PlayerViewOffset=(X=7.000000,Y=9.000000,Z=-4.000000) BobDamping=5.000000 AttachmentClass=Class'NicePack.NiceSVDSAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="SVDS" +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmo.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmo.uc new file mode 100644 index 0000000..ce13c9b --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmo.uc @@ -0,0 +1,4 @@ +class NiceSVDSAmmo extends NiceAmmo; +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceSVDSPickup' AmmoPickupAmount=5 MaxAmmo=60 InitialAmount=15 PickupClass=Class'NicePack.NiceSVDSAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="7.62x54mm" +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmoPickup.uc new file mode 100644 index 0000000..3895489 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceSVDSAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=5 InventoryType=Class'NicePack.NiceSVDSAmmo' PickupMessage="7x62mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAttachment.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAttachment.uc new file mode 100644 index 0000000..a5e4364 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAttachment.uc @@ -0,0 +1,4 @@ +class NiceSVDSAttachment extends NiceAttachment; +defaultproperties +{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="wpn_scope" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="IS_Fire_AK47" FireAltAnims(1)="IS_Fire_AK47" FireAltAnims(2)="IS_Fire_AK47" FireAltAnims(3)="IS_Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.SVDS_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSFire.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSFire.uc new file mode 100644 index 0000000..4935121 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSFire.uc @@ -0,0 +1,4 @@ +class NiceSVDSFire extends NiceFire; +defaultproperties +{ FireAimedAnim="Fire" RecoilRate=0.200000 maxVerticalRecoilAngle=500 maxHorizontalRecoilAngle=15 ShellEjectClass=Class'ScrnWeaponPack.KFShellEjectSVD' ShellEjectBoneName="Shell_eject" FireSoundRef="ScrnWeaponPack_SND.SVD.SVD_shot" StereoFireSoundRef="ScrnWeaponPack_SND.SVD.SVD_shot" NoAmmoSoundRef="ScrnWeaponPack_SND.SVD.SVD_empty" DamageType=Class'NicePack.NiceDamTypeSVDS' DamageMin=125 DamageMax=125 bWaitForRelease=True bModeExclusive=False TransientSoundVolume=3.800000 FireLoopAnim="Fire" FireForce="ShockRifleFire" FireRate=0.750000 AmmoClass=Class'NicePack.NiceSVDSAmmo' ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=2.000000 ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.550000 FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlash1rdSVD' aimerror=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSPickup.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSPickup.uc new file mode 100644 index 0000000..047faab --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSPickup.uc @@ -0,0 +1,6 @@ +class NiceSVDSPickup extends NiceWeaponPickup; +#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx +defaultproperties +{ Weight=7.000000 cost=1500 AmmoCost=10 BuyClipSize=5 PowerValue=80 SpeedValue=40 RangeValue=100 Description="The Dragunov sniper rifle with folding stock (formally Russian: Snayperskaya Vintovka Dragunova Skladnaya, SVDS) is a compact variant of the SVD, which was developed in the early 1990s. It features a tubular metal stock that folds to the right side of the receiver and a synthetic pistol grip." ItemName="SVDS" ItemShortName="SVDS" AmmoItemName="7.64x54mm" CorrespondingPerkIndex=2 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceSVDS' PickupMessage="You've got the Dragunov Sniper Rifle (SVDS)" PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.svd_c' CollisionRadius=30.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceDamTypeVSSDT.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceDamTypeVSSDT.uc new file mode 100644 index 0000000..feb4e0f --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceDamTypeVSSDT.uc @@ -0,0 +1,4 @@ +class NiceDamTypeVSSDT extends NiceDamageTypeVetSharpshooter; +defaultproperties +{ stunMultiplier=0.500000 HeadShotDamageMult=1.490000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceVSSDT' DeathString="%k killed %o (Vintorez)." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=3000.000000 KDeathVel=110.000000 KDeathUpKick=10.000000 VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDT.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDT.uc new file mode 100644 index 0000000..80c8b75 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDT.uc @@ -0,0 +1,6 @@ +class NiceVSSDT extends NiceScopedWeapon; +simulated function AltFire(float F){} +exec function SwitchModes(){} +defaultproperties +{ lenseMaterialID=2 scopePortalFOVHigh=30.000000 scopePortalFOV=30.000000 ZoomMatRef="ScrnWeaponPack_T.VSS.PSO1ScopeFinalBlend" ScriptedTextureFallbackRef="ScrnWeaponPack_T.SVD.AlphaLens" CrosshairTexRef="ScrnWeaponPack_T.VSS.PSO1Sope" reloadPreEndFrame=0.120000 reloadEndFrame=0.490000 reloadChargeEndFrame=0.764000 reloadMagStartFrame=0.302000 reloadChargeStartFrame=0.613000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=55.000000 MagCapacity=10 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'ScrnWeaponPack_T.VSS.VSSDT_Trader' MeshRef="ScrnWeaponPack_A.vintorezDTmesh" SkinRefs(0)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SkinRefs(1)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SkinRefs(2)="ScrnWeaponPack_T.SVD.AlphaLens" SkinRefs(3)="ScrnWeaponPack_T.VSS.newvss" SkinRefs(4)="ScrnWeaponPack_T.VSS.mag_9x39_cmb" SkinRefs(5)="ScrnWeaponPack_T.VSS.Scope" SelectSoundRef="ScrnWeaponPack_SND.VSS.VSS_Draw" HudImageRef="ScrnWeaponPack_T.VSS.vssDT_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.VSS.vssDT_selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=55.000000 FireModeClass(0)=Class'NicePack.NiceVSSDTFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="The VSS (Special Sniper Rifle), also called the Vintorez (thread cutter), is a suppressed sniper rifle that is extremely suitable for quick dispatching of an enemy." DisplayFOV=65.000000 Priority=160 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=3 PickupClass=Class'NicePack.NiceVSSDTPickup' PlayerViewOffset=(X=12.000000,Y=12.000000,Z=-3.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceVSSDTAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="VSS (Vintorez)" +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmo.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmo.uc new file mode 100644 index 0000000..4bb705b --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmo.uc @@ -0,0 +1,5 @@ +class NiceVSSDTAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ WeaponPickupClass=Class'NicePack.NiceVSSDTPickup' AmmoPickupAmount=10 MaxAmmo=80 InitialAmount=20 PickupClass=Class'NicePack.NiceVSSDTAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="9x39mm round SP-5" +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmoPickup.uc new file mode 100644 index 0000000..13acf10 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceVSSDTAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ AmmoAmount=10 InventoryType=Class'NicePack.NiceVSSDTAmmo' PickupMessage="9x39mm round SP-5" +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAttachment.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAttachment.uc new file mode 100644 index 0000000..65175d3 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAttachment.uc @@ -0,0 +1,4 @@ +class NiceVSSDTAttachment extends NiceAttachment; +defaultproperties +{ bSpawnLight=False mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlash3rdVSSDT' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="IS_Fire_AK47" FireAltAnims(1)="IS_Fire_AK47" FireAltAnims(2)="IS_Fire_AK47" FireAltAnims(3)="IS_Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.vintorezDT3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.550000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTFire.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTFire.uc new file mode 100644 index 0000000..344c47d --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTFire.uc @@ -0,0 +1,4 @@ +class NiceVSSDTFire extends NiceFire; +defaultproperties +{ ProjectileSpeed=46250.000000 FireAimedAnim="Iron_Idle" RecoilRate=0.100000 maxVerticalRecoilAngle=75 maxHorizontalRecoilAngle=25 ShellEjectClass=Class'ROEffects.KFShellEjectMac' ShellEjectBoneName="Shell_eject" FireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" StereoFireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" NoAmmoSoundRef="KF_RifleSnd.Rifle_DryFire" DamageType=Class'NicePack.NiceDamTypeVSSDT' DamageMin=255 DamageMax=255 bWaitForRelease=True bModeExclusive=False TransientSoundVolume=2.800000 FireLoopAnim= FireForce="ShockRifleFire" FireRate=0.150000 AmmoClass=Class'NicePack.NiceVSSDTAmmo' ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=2.000000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.650000 FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlash3rdVSSDT' aimerror=1.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTPickup.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTPickup.uc new file mode 100644 index 0000000..11130aa --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTPickup.uc @@ -0,0 +1,4 @@ +class NiceVSSDTPickup extends NiceWeaponPickup; +defaultproperties +{ Weight=7.000000 cost=1000 AmmoCost=15 BuyClipSize=10 PowerValue=80 SpeedValue=40 RangeValue=100 Description="The VSS (Special Sniper Rifle), also called the Vintorez (thread cutter), is a suppressed sniper rifle that is extremely suitable for quick dispatching of an enemy." ItemName="VSS (Vintorez)" ItemShortName="VSS" AmmoItemName="Rifle bullets" CorrespondingPerkIndex=2 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceVSSDT' PickupMessage="You've got Vintorez" PickupSound=Sound'KF_RifleSnd.RifleBase.Rifle_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.vintorezDT_sm' DrawScale=1.200000 CollisionRadius=30.000000 CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Winchester/NiceDamTypeWinchester.uc b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceDamTypeWinchester.uc new file mode 100644 index 0000000..4a917c5 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceDamTypeWinchester.uc @@ -0,0 +1,24 @@ +class NiceDamTypeWinchester extends NiceDamageTypeVetSharpshooter + abstract; + +defaultproperties +{ + stunMultiplier=1.500000 + bIsProjectile=True + HeadShotDamageMult=2.500000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceWinchester' + DeathString="%k killed %o (Winchester)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + FlashFog=(X=600.000000) + KDamageImpulse=2250.000000 + KDeathVel=115.000000 + KDeathUpKick=5.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchester.uc b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchester.uc new file mode 100644 index 0000000..59e1e06 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchester.uc @@ -0,0 +1,59 @@ +class NiceWinchester extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 10 shells during 256 frames tops, with first shell loaded at frame 18, with 23 frames between load moments + generateReloadStages(10, 256, 18, 23); +} + +defaultproperties +{ + bChangeClipIcon=True + hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' + reloadType=RTYPE_SINGLE + MagCapacity=10 + ReloadRate=0.416667 + ReloadAnim="Reload" + ReloadAnimRate=1.600000 + bHoldToReload=True + WeaponReloadAnim="Reload_Winchester" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="AimIdle" + StandardDisplayFOV=70.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Winchester' + MeshRef="KF_Weapons_Trip.Winchester_Trip" + SkinRefs(0)="KF_Weapons_Trip_T.Rifles.winchester_cmb" + SelectSoundRef="KF_RifleSnd.Rifle_Select" + HudImageRef="KillingFloorHUD.WeaponSelect.winchester_unselected" + SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Winchester" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceWinchesterFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + AIRating=0.560000 + CurrentRating=0.560000 + bShowChargingBar=True + OldCenteredOffsetY=0.000000 + OldPlayerViewOffset=(X=-8.000000,Y=5.000000,Z=-6.000000) + OldSmallViewOffset=(X=4.000000,Y=11.000000,Z=-12.000000) + OldPlayerViewPivot=(Pitch=800) + OldCenteredRoll=3000 + Description="A rugged and reliable single-shot rifle." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=70.000000 + Priority=85 + CenteredOffsetY=-5.000000 + CenteredRoll=3000 + CenteredYaw=-1500 + InventoryGroup=3 + GroupOffset=3 + PickupClass=Class'NicePack.NiceWinchesterPickup' + PlayerViewOffset=(X=8.000000,Y=14.000000,Z=-8.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceWinchesterAttachment' + ItemName="Winchester" + bUseDynamicLights=True + DrawScale=0.900000 + TransientSoundVolume=50.000000 +} diff --git a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterAmmo.uc b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterAmmo.uc similarity index 99% rename from sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterAmmo.uc rename to sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterAmmo.uc index d13076f..8ecf02b 100644 --- a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterAmmo.uc +++ b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterAmmo.uc @@ -1,5 +1,4 @@ class NiceWinchesterAmmo extends NiceAmmo; - #EXEC OBJ LOAD FILE=InterfaceContent.utx defaultproperties diff --git a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterAmmoPickup.uc similarity index 100% rename from sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterAmmoPickup.uc rename to sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterAmmoPickup.uc diff --git a/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterAttachment.uc b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterAttachment.uc new file mode 100644 index 0000000..243e423 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterAttachment.uc @@ -0,0 +1,55 @@ +class NiceWinchesterAttachment extends NiceAttachment; + +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSTG' + mTracerClass=Class'KFMod.KFLargeTracer' + MovementAnims(0)="JogF_Winchester" + MovementAnims(1)="JogB_Winchester" + MovementAnims(2)="JogL_Winchester" + MovementAnims(3)="JogR_Winchester" + TurnLeftAnim="TurnL_Winchester" + TurnRightAnim="TurnR_Winchester" + CrouchAnims(0)="CHwalkF_Winchester" + CrouchAnims(1)="CHwalkB_Winchester" + CrouchAnims(2)="CHwalkL_Winchester" + CrouchAnims(3)="CHwalkR_Winchester" + WalkAnims(0)="WalkF_Winchester" + WalkAnims(1)="WalkB_Winchester" + WalkAnims(2)="WalkL_Winchester" + WalkAnims(3)="WalkR_Winchester" + CrouchTurnRightAnim="CH_TurnR_Winchester" + CrouchTurnLeftAnim="CH_TurnL_Winchester" + IdleCrouchAnim="CHIdle_Winchester" + IdleWeaponAnim="Idle_Winchester" + IdleRestAnim="Idle_Winchester" + IdleChatAnim="Idle_Winchester" + IdleHeavyAnim="Idle_Winchester" + IdleRifleAnim="Idle_Winchester" + FireAnims(0)="Fire_Winchester" + FireAnims(1)="Fire_Winchester" + FireAnims(2)="Fire_Winchester" + FireAnims(3)="Fire_Winchester" + FireAltAnims(0)="Fire_Winchester" + FireAltAnims(1)="Fire_Winchester" + FireAltAnims(2)="Fire_Winchester" + FireAltAnims(3)="Fire_Winchester" + FireCrouchAnims(0)="CHFire_Winchester" + FireCrouchAnims(1)="CHFire_Winchester" + FireCrouchAnims(2)="CHFire_Winchester" + FireCrouchAnims(3)="CHFire_Winchester" + FireCrouchAltAnims(0)="CHFire_Winchester" + FireCrouchAltAnims(1)="CHFire_Winchester" + FireCrouchAltAnims(2)="CHFire_Winchester" + FireCrouchAltAnims(3)="CHFire_Winchester" + HitAnims(0)="HitF_Winchester" + HitAnims(1)="HitB_Winchester" + HitAnims(2)="HitL_Winchester" + HitAnims(3)="HitR_Winchester" + PostFireBlendStandAnim="Blend_Winchester" + PostFireBlendCrouchAnim="CHBlend_Winchester" + MeshRef="KF_Weapons3rd_Trip.Winchester_3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterFire.uc b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterFire.uc new file mode 100644 index 0000000..92eaf13 --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterFire.uc @@ -0,0 +1,37 @@ +class NiceWinchesterFire extends NiceFire; + +defaultproperties +{ + ProjectileSpeed=37950.000000 + FireAimedAnim="AimFire" + RecoilRate=0.100000 + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=64 + FireSoundRef="KF_RifleSnd.Rifle_Fire" + StereoFireSoundRef="KF_RifleSnd.Rifle_FireST" + NoAmmoSoundRef="KF_RifleSnd.Rifle_DryFire" + DamageType=Class'NicePack.NiceDamTypeWinchester' + DamageMin=156 + DamageMax=156 + Momentum=18000.000000 + bPawnRapidFireAnim=True + bWaitForRelease=True + bModeExclusive=False + bAttachSmokeEmitter=True + TransientSoundVolume=1.800000 + FireLoopAnim= + FireEndAnim= + FireAnimRate=1.600000 + FireForce="ShockRifleFire" + FireRate=0.562500 + AmmoClass=Class'NicePack.NiceWinchesterAmmo' + ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=0.650000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' + aimerror=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterPickup.uc b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterPickup.uc new file mode 100644 index 0000000..95cffce --- /dev/null +++ b/sources/Weapons/Playable/SniperWeapons/Winchester/NiceWinchesterPickup.uc @@ -0,0 +1,24 @@ +class NiceWinchesterPickup extends NiceWeaponPickup; + +defaultproperties +{ + Weight=6.000000 + cost=200 + BuyClipSize=10 + PowerValue=50 + SpeedValue=35 + RangeValue=90 + Description="A rugged and reliable single-shot rifle." + ItemName="Winchester" + ItemShortName="Winchester" + AmmoItemName="Winchester bullets" + CorrespondingPerkIndex=2 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceWinchester' + PickupMessage="You got Winchester" + PickupSound=Sound'KF_RifleSnd.RifleBase.Rifle_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.LeverAction_pickup' + CollisionRadius=30.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrower.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrower.uc new file mode 100644 index 0000000..44f193b --- /dev/null +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrower.uc @@ -0,0 +1,4 @@ +class NiceBlowerThrower extends BlowerThrower; +defaultproperties +{ AppID=0 FireModeClass(0)=Class'NicePack.NiceBlowerThrowerFire' FireModeClass(1)=Class'NicePack.NiceBlowerThrowerAltFire' PickupClass=Class'NicePack.NiceBlowerThrowerPickup' ItemName="BlowerThrower NW" +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAltFire.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAltFire.uc new file mode 100644 index 0000000..ddf05eb --- /dev/null +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAltFire.uc @@ -0,0 +1,4 @@ +class NiceBlowerThrowerAltFire extends BlowerThrowerAltFire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceBlowerThrowerAmmo' +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmo.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmo.uc new file mode 100644 index 0000000..8195e7a --- /dev/null +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmo.uc @@ -0,0 +1,5 @@ +class NiceBlowerThrowerAmmo extends BlowerThrowerAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ MaxAmmo=400 PickupClass=Class'NicePack.NiceBlowerThrowerAmmoPickup' +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmoPickup.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmoPickup.uc new file mode 100644 index 0000000..3d56059 --- /dev/null +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmoPickup.uc @@ -0,0 +1,4 @@ +class NiceBlowerThrowerAmmoPickup extends BlowerThrowerAmmoPickup; +defaultproperties +{ InventoryType=Class'NicePack.NiceBlowerThrowerAmmo' +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerFire.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerFire.uc new file mode 100644 index 0000000..5d7c314 --- /dev/null +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerFire.uc @@ -0,0 +1,4 @@ +class NiceBlowerThrowerFire extends BlowerThrowerFire; +defaultproperties +{ AmmoClass=Class'NicePack.NiceBlowerThrowerAmmo' +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerPickup.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerPickup.uc new file mode 100644 index 0000000..fd7c21c --- /dev/null +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerPickup.uc @@ -0,0 +1,4 @@ +class NiceBlowerThrowerPickup extends BlowerThrowerPickup; +defaultproperties +{ ItemName="Blower Thrower Bile Launcher NW" ItemShortName="Blower Thrower NW" InventoryType=Class'NicePack.NiceBlowerThrower' PickupMessage="You got the BlowerThrower NW" +} diff --git a/sources/Weapons/Playable/TestWeapons/NiceFlame9mm.uc b/sources/Weapons/Playable/TestWeapons/NiceFlame9mm.uc new file mode 100644 index 0000000..9620338 --- /dev/null +++ b/sources/Weapons/Playable/TestWeapons/NiceFlame9mm.uc @@ -0,0 +1,4 @@ +class NiceFlame9mm extends ScrnSingle; +defaultproperties +{ FireModeClass(0)=Class'NicePack.NiceFlame9mmFire' PickupClass=Class'NicePack.NiceFlame9mmPickup' ItemName="MOTHER OF FLAMES" +} diff --git a/sources/Weapons/Playable/TestWeapons/NiceFlame9mmFire.uc b/sources/Weapons/Playable/TestWeapons/NiceFlame9mmFire.uc new file mode 100644 index 0000000..5744e1a --- /dev/null +++ b/sources/Weapons/Playable/TestWeapons/NiceFlame9mmFire.uc @@ -0,0 +1,4 @@ +class NiceFlame9mmFire extends ScrnSingleFire; +defaultproperties +{ DamageType=Class'NicePack.NiceDamTypeFire' +} diff --git a/sources/Weapons/Playable/TestWeapons/NiceFlame9mmPickup.uc b/sources/Weapons/Playable/TestWeapons/NiceFlame9mmPickup.uc new file mode 100644 index 0000000..7f58874 --- /dev/null +++ b/sources/Weapons/Playable/TestWeapons/NiceFlame9mmPickup.uc @@ -0,0 +1,4 @@ +class NiceFlame9mmPickup extends ScrnSinglePickup; +defaultproperties +{ ItemName="MOTHER OF FLAME AND FIRE AND RAGE" ItemShortName="HAIL FIRE GODDES" InventoryType=Class'NicePack.NiceFlame9mm' +} diff --git a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceDamTypeWinGun.uc b/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceDamTypeWinGun.uc deleted file mode 100644 index d6d8189..0000000 --- a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceDamTypeWinGun.uc +++ /dev/null @@ -1,24 +0,0 @@ -class NiceDamTypeWinGun extends NiceDamageTypeVetSharpshooter - abstract; - -defaultproperties -{ - stunMultiplier=1.500000 - bIsProjectile=True - HeadShotDamageMult=200.000000 - bSniperWeapon=True - WeaponClass=Class'NicePack.NiceWinchester' - DeathString="%k killed %o (Winchester)." - FemaleSuicide="%o shot herself in the foot." - MaleSuicide="%o shot himself in the foot." - bRagdollBullet=True - bBulletHit=True - PawnDamageEmitter=Class'ROEffects.ROBloodPuff' - LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' - LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' - FlashFog=(X=600.000000) - KDamageImpulse=2250.000000 - KDeathVel=115.000000 - KDeathUpKick=5.000000 - VehicleDamageScaling=0.700000 -} \ No newline at end of file diff --git a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceDamTypeWinchester.uc b/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceDamTypeWinchester.uc deleted file mode 100644 index 199801c..0000000 --- a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceDamTypeWinchester.uc +++ /dev/null @@ -1,24 +0,0 @@ -class NiceDamTypeWinchester extends NiceDamageTypeVetSharpshooter - abstract; - -defaultproperties -{ - stunMultiplier=1.500000 - bIsProjectile=True - HeadShotDamageMult=2.000000 - bSniperWeapon=True - WeaponClass=Class'NicePack.NiceWinchester' - DeathString="%k killed %o (Winchester)." - FemaleSuicide="%o shot herself in the foot." - MaleSuicide="%o shot himself in the foot." - bRagdollBullet=True - bBulletHit=True - PawnDamageEmitter=Class'ROEffects.ROBloodPuff' - LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' - LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' - FlashFog=(X=600.000000) - KDamageImpulse=2250.000000 - KDeathVel=115.000000 - KDeathUpKick=5.000000 - VehicleDamageScaling=0.700000 -} \ No newline at end of file diff --git a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchester.uc b/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchester.uc deleted file mode 100644 index b0bf4f7..0000000 --- a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchester.uc +++ /dev/null @@ -1,91 +0,0 @@ -class NiceWinchester extends NiceWeapon; - -simulated function fillSubReloadStages(){ - // Loading 10 shells during 256 frames tops, with first shell loaded at frame 18, with 23 frames between load moments - generateReloadStages(10, 256, 18, 23); -} - -static function FillInAppearance(){ - local WeaponVariant variant; - local WeaponModel model; - local WeaponSkin skin, fancySkin; - local WeaponSoundSet soundSet; - local WeaponAnimationSet anims; - local NiceAmmoType ammoType; - local NiceAmmoEffects ammoEffects; - soundSet.selectSoundRef = "KF_RifleSnd.Rifle_Select"; - soundSet.fireSoundRefs[0] = "KF_RifleSnd.Rifle_Fire"; - soundSet.stereoFireSoundRefs[0] = "KF_RifleSnd.Rifle_FireST"; - soundSet.noAmmoSoundRefs[0] = "KF_RifleSnd.Rifle_DryFire"; - skin.ID = "Lever Action Rifle"; - skin.paintRefs[0] = "KF_Weapons_Trip_T.Rifles.winchester_cmb"; - fancySkin.ID = "Winchester"; - fancySkin.paintRefs[0] = "NicePackT.Skins1st.OldLAR_cmb"; - model.ID = "Winchester"; - model.firstMeshRef = "KF_Weapons_Trip.Winchester_Trip"; - model.hudImageRef = "KillingFloorHUD.WeaponSelect.winchester_unselected"; - model.selectedHudImageRef = "KillingFloorHUD.WeaponSelect.Winchester"; - model.skins[0] = skin; - model.skins[1] = fancySkin; - model.soundSet = soundSet; - anims.idleAnim = 'Idle'; - anims.idleAimedAnim = 'AimIdle'; - anims.selectAnim = 'Select'; - anims.putDownAnim = 'PutDown'; - anims.reloadAnim = 'Reload'; - anims.fireAnimSets[0].justFire.anim = 'Fire'; - anims.fireAnimSets[0].justFire.rate = 1.6; - anims.fireAnimSets[0].aimed.anim = 'AimFire'; - anims.fireAnimSets[0].aimed.rate = 1.6; - model.animations = anims; - model.playerViewOffset = Vect(8.0, 14.0, -8.0); - model.effectOffset = Vect(100.0, 25.0, -10.0); - variant.models[0] = model; - ammoEffects.ammoID = "regular"; - ammoEffects.fireTypeID = "crude"; - variant.ammoEffects[0] = ammoEffects; - ammoEffects.ammoID = "irregular"; - ammoEffects.fireTypeID = "fine"; - variant.ammoEffects[1] = ammoEffects; - default.variants[0] = variant; - // Ammo - ammoType.ID = "regular"; - ammoType.spaceMult = 1.0; - ammoType.amount = 20; - default.availableAmmoTypes[0] = ammoType; - ammoType.ID = "irregular"; - ammoType.spaceMult = 1.0; - ammoType.amount = 20; - default.availableAmmoTypes[1] = ammoType; -} - -defaultproperties -{ - bChangeClipIcon=true - hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' - reloadType=RTYPE_SINGLE - MagCapacity=10 - ReloadRate=0.416667 - ReloadAnimRate=1.600000 - bHoldToReload=True - Weight=6.000000 - bHasAimingMode=True - StandardDisplayFOV=70.000000 - DisplayFOV=70.000000 - PlayerIronSightFOV=70.000000 - ZoomedDisplayFOV=50.000000 - SleeveNum=2 - TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Winchester' - FireModeClass(0)=Class'NicePack.NiceWinchesterFire' - FireModeClass(1)=Class'KFMod.NoFire' - bShowChargingBar=True - Description="A rugged and reliable single-shot rifle." - Priority=85 - InventoryGroup=3 - GroupOffset=3 - PickupClass=Class'NicePack.NiceWinchesterPickup' - AttachmentClass=Class'NicePack.NiceWinchesterAttachment' - ItemName="Winchester" - TransientSoundVolume=50.000000 - BobDamping=6.000000 -} \ No newline at end of file diff --git a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterAttachment.uc b/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterAttachment.uc deleted file mode 100644 index c105f95..0000000 --- a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterAttachment.uc +++ /dev/null @@ -1,55 +0,0 @@ -class NiceWinchesterAttachment extends NiceAttachment; - -defaultproperties -{ - mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSTG' - mTracerClass=Class'KFMod.KFLargeTracer' - MovementAnims(0)="JogF_Winchester" - MovementAnims(1)="JogB_Winchester" - MovementAnims(2)="JogL_Winchester" - MovementAnims(3)="JogR_Winchester" - TurnLeftAnim="TurnL_Winchester" - TurnRightAnim="TurnR_Winchester" - CrouchAnims(0)="CHwalkF_Winchester" - CrouchAnims(1)="CHwalkB_Winchester" - CrouchAnims(2)="CHwalkL_Winchester" - CrouchAnims(3)="CHwalkR_Winchester" - WalkAnims(0)="WalkF_Winchester" - WalkAnims(1)="WalkB_Winchester" - WalkAnims(2)="WalkL_Winchester" - WalkAnims(3)="WalkR_Winchester" - CrouchTurnRightAnim="CH_TurnR_Winchester" - CrouchTurnLeftAnim="CH_TurnL_Winchester" - IdleCrouchAnim="CHIdle_Winchester" - IdleWeaponAnim="Idle_Winchester" - IdleRestAnim="Idle_Winchester" - IdleChatAnim="Idle_Winchester" - IdleHeavyAnim="Idle_Winchester" - IdleRifleAnim="Idle_Winchester" - FireAnims(0)="Fire_Winchester" - FireAnims(1)="Fire_Winchester" - FireAnims(2)="Fire_Winchester" - FireAnims(3)="Fire_Winchester" - FireAltAnims(0)="Fire_Winchester" - FireAltAnims(1)="Fire_Winchester" - FireAltAnims(2)="Fire_Winchester" - FireAltAnims(3)="Fire_Winchester" - FireCrouchAnims(0)="CHFire_Winchester" - FireCrouchAnims(1)="CHFire_Winchester" - FireCrouchAnims(2)="CHFire_Winchester" - FireCrouchAnims(3)="CHFire_Winchester" - FireCrouchAltAnims(0)="CHFire_Winchester" - FireCrouchAltAnims(1)="CHFire_Winchester" - FireCrouchAltAnims(2)="CHFire_Winchester" - FireCrouchAltAnims(3)="CHFire_Winchester" - HitAnims(0)="HitF_Winchester" - HitAnims(1)="HitB_Winchester" - HitAnims(2)="HitL_Winchester" - HitAnims(3)="HitR_Winchester" - PostFireBlendStandAnim="Blend_Winchester" - PostFireBlendCrouchAnim="CHBlend_Winchester" - MeshRef="KF_Weapons3rd_Trip.Winchester_3rd" - bHeavy=True - SplashEffect=Class'ROEffects.BulletSplashEmitter' - CullDistance=5000.000000 -} \ No newline at end of file diff --git a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterFire.uc b/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterFire.uc deleted file mode 100644 index a7daf73..0000000 --- a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterFire.uc +++ /dev/null @@ -1,40 +0,0 @@ -class NiceWinchesterFire extends NiceFire; - -simulated function FillFireType(){ - local NWFireType fireType; - fireType.fireTypeName = "crude"; - fireType.weapon.bulletsAmount = 1; - fireType.weapon.ammoPerFire = 1; - fireType.weapon.bCanFireIncomplete = false; - fireType.weapon.fireRate = 0.562500; - fireType.movement.bulletClass = class'NiceBullet'; - fireType.movement.speed = 37950.0; - fireType.rebound.recoilVertical = 150; - fireType.rebound.recoilHorizontal = 64; - fireType.bullet.damage = 136; - fireType.bullet.momentum = 18000; - fireType.bullet.shotDamageType = class'NicePack.NiceDamTypeWinchester'; - fireTypes[0] = fireType; - fireType.fireTypeName = "fine"; - fireType.bullet.damage = 10; - fireType.bullet.shotDamageType = class'NicePack.NiceDamTypeWinGun'; - fireTypes[1] = fireType; -} - -defaultproperties -{ - DamageType=Class'NicePack.NiceDamTypeWinchester' - bPawnRapidFireAnim=true - bWaitForRelease=false - bModeExclusive=False - bAttachSmokeEmitter=True - TransientSoundVolume=1.800000 - AmmoClass=Class'NicePack.NiceWinchesterAmmo' - ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) - ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) - ShakeRotTime=2.000000 - ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) - ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) - ShakeOffsetTime=2.000000 - FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' -} \ No newline at end of file diff --git a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterPickup.uc b/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterPickup.uc deleted file mode 100644 index 07c4834..0000000 --- a/sources/Weapons/Playable/WeaponTypes/SniperWeapons/Winchester/NiceWinchesterPickup.uc +++ /dev/null @@ -1,24 +0,0 @@ -class NiceWinchesterPickup extends NiceWeaponPickup; - -defaultproperties -{ - Weight=6.000000 - cost=200 - BuyClipSize=10 - PowerValue=50 - SpeedValue=35 - RangeValue=90 - Description="A rugged and reliable single-shot rifle." - ItemName="Winchester" - ItemShortName="Winchester" - AmmoItemName="Winchester bullets" - CorrespondingPerkIndex=2 - EquipmentCategoryID=2 - InventoryType=Class'NicePack.NiceWinchester' - PickupMessage="You got Winchester" - PickupSound=Sound'KF_RifleSnd.RifleBase.Rifle_Pickup' - PickupForce="AssaultRiflePickup" - StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.LeverAction_pickup' - CollisionRadius=30.000000 - CollisionHeight=5.000000 -} \ No newline at end of file diff --git a/sources/Weapons/Skins/SkinCamoSCARMK17AssaultRifle.uc b/sources/Weapons/Skins/SkinCamoSCARMK17AssaultRifle.uc new file mode 100644 index 0000000..61d6d35 --- /dev/null +++ b/sources/Weapons/Skins/SkinCamoSCARMK17AssaultRifle.uc @@ -0,0 +1,4 @@ +class SkinCamoSCARMK17AssaultRifle extends NiceSCARMK17AssaultRifle; +defaultproperties +{ SkinRefs(0)="NicePackT.Skins1st.Scar_cmb" PickupClass=Class'NicePack.SkinCamoSCARMK17Pickup' AttachmentClass=Class'NicePack.SkinCamoSCARMK17Attachment' +} diff --git a/sources/Weapons/Skins/SkinCamoSCARMK17Attachment.uc b/sources/Weapons/Skins/SkinCamoSCARMK17Attachment.uc new file mode 100644 index 0000000..718785e --- /dev/null +++ b/sources/Weapons/Skins/SkinCamoSCARMK17Attachment.uc @@ -0,0 +1,4 @@ +class SkinCamoSCARMK17Attachment extends NiceSCARMK17Attachment; +defaultproperties +{ SkinRefs(0)="NicePackT.Skins3rd.scar_3rd" +} diff --git a/sources/Weapons/Skins/SkinCamoSCARMK17Pickup.uc b/sources/Weapons/Skins/SkinCamoSCARMK17Pickup.uc new file mode 100644 index 0000000..2def995 --- /dev/null +++ b/sources/Weapons/Skins/SkinCamoSCARMK17Pickup.uc @@ -0,0 +1,4 @@ +class SkinCamoSCARMK17Pickup extends NiceSCARMK17Pickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinCamoSCARMK17AssaultRifle' +} diff --git a/sources/Weapons/Skins/SkinCowboyMagnum.uc b/sources/Weapons/Skins/SkinCowboyMagnum.uc new file mode 100644 index 0000000..30cbd99 --- /dev/null +++ b/sources/Weapons/Skins/SkinCowboyMagnum.uc @@ -0,0 +1,5 @@ +class SkinCowboyMagnum extends NiceMagnumPistol; +#exec obj load file="NicePackT.utx" +defaultproperties +{ SkinRefs(0)="NicePackT.Skins1st.Revolver_cmb" PickupClass=Class'NicePack.SkinCowboyMagnumPickup' AttachmentClass=Class'NicePack.SkinCowboyMagnumAttachment' +} diff --git a/sources/Weapons/Skins/SkinCowboyMagnumAttachment.uc b/sources/Weapons/Skins/SkinCowboyMagnumAttachment.uc new file mode 100644 index 0000000..37890a4 --- /dev/null +++ b/sources/Weapons/Skins/SkinCowboyMagnumAttachment.uc @@ -0,0 +1,4 @@ +class SkinCowboyMagnumAttachment extends NiceMagnumAttachment; +defaultproperties +{ SkinRefs(0)="NicePackT.Skins3rd.revolver_3rd" +} diff --git a/sources/Weapons/Skins/SkinCowboyMagnumPickup.uc b/sources/Weapons/Skins/SkinCowboyMagnumPickup.uc new file mode 100644 index 0000000..0c0a515 --- /dev/null +++ b/sources/Weapons/Skins/SkinCowboyMagnumPickup.uc @@ -0,0 +1,4 @@ +class SkinCowboyMagnumPickup extends NiceMagnumPickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinCowboyMagnum' +} diff --git a/sources/Weapons/Skins/SkinDualCowboyMagnum.uc b/sources/Weapons/Skins/SkinDualCowboyMagnum.uc new file mode 100644 index 0000000..415d49a --- /dev/null +++ b/sources/Weapons/Skins/SkinDualCowboyMagnum.uc @@ -0,0 +1,5 @@ +class SkinDualCowboyMagnum extends NiceDualMagnum; +#exec obj load file="NicePackT.utx" +defaultproperties +{ SkinRefs(0)="NicePackT.Skins1st.Revolver_cmb" PickupClass=Class'NicePack.SkinDualCowboyMagnumPickup' AttachmentClass=Class'NicePack.SkinDualCowboyMagnumAttachment' +} diff --git a/sources/Weapons/Skins/SkinDualCowboyMagnumAttachment.uc b/sources/Weapons/Skins/SkinDualCowboyMagnumAttachment.uc new file mode 100644 index 0000000..acd6c38 --- /dev/null +++ b/sources/Weapons/Skins/SkinDualCowboyMagnumAttachment.uc @@ -0,0 +1,4 @@ +class SkinDualCowboyMagnumAttachment extends NiceDualMagnumAttachment; +defaultproperties +{ SkinRefs(0)="NicePackT.Skins3rd.revolver_3rd" +} diff --git a/sources/Weapons/Skins/SkinDualCowboyMagnumPickup.uc b/sources/Weapons/Skins/SkinDualCowboyMagnumPickup.uc new file mode 100644 index 0000000..8e274f1 --- /dev/null +++ b/sources/Weapons/Skins/SkinDualCowboyMagnumPickup.uc @@ -0,0 +1,4 @@ +class SkinDualCowboyMagnumPickup extends NiceDualMagnumPickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinDualCowboyMagnum' +} diff --git a/sources/Weapons/Skins/SkinDualExecutioner.uc b/sources/Weapons/Skins/SkinDualExecutioner.uc new file mode 100644 index 0000000..2dd858b --- /dev/null +++ b/sources/Weapons/Skins/SkinDualExecutioner.uc @@ -0,0 +1,5 @@ +class SkinDualExecutioner extends NiceDualDeagle; +#exec obj load file="NicePackT.utx" +defaultproperties +{ SkinRefs(0)="NicePackT.Skins1st.deagle_cmb" PickupClass=Class'NicePack.SkinDualExecutionerPickup' AttachmentClass=Class'NicePack.SkinDualExecutionerAttachment' +} diff --git a/sources/Weapons/Skins/SkinDualExecutionerAttachment.uc b/sources/Weapons/Skins/SkinDualExecutionerAttachment.uc new file mode 100644 index 0000000..2bc6ce3 --- /dev/null +++ b/sources/Weapons/Skins/SkinDualExecutionerAttachment.uc @@ -0,0 +1,4 @@ +class SkinDualExecutionerAttachment extends NiceDualDeagleAttachment; +defaultproperties +{ SkinRefs(0)="NicePackT.Skins3rd.Exectutioner_3rd" +} diff --git a/sources/Weapons/Skins/SkinDualExecutionerPickup.uc b/sources/Weapons/Skins/SkinDualExecutionerPickup.uc new file mode 100644 index 0000000..a5805f4 --- /dev/null +++ b/sources/Weapons/Skins/SkinDualExecutionerPickup.uc @@ -0,0 +1,4 @@ +class SkinDualExecutionerPickup extends NiceDualDeaglePickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinDualExecutioner' +} diff --git a/sources/Weapons/Skins/SkinExecutioner.uc b/sources/Weapons/Skins/SkinExecutioner.uc new file mode 100644 index 0000000..bd4d1a9 --- /dev/null +++ b/sources/Weapons/Skins/SkinExecutioner.uc @@ -0,0 +1,5 @@ +class SkinExecutioner extends NiceDeagle; +#exec obj load file="NicePackT.utx" +defaultproperties +{ SkinRefs(0)="NicePackT.Skins1st.deagle_cmb" PickupClass=Class'NicePack.SkinExecutionerPickup' AttachmentClass=Class'NicePack.SkinExecutionerAttachment' +} diff --git a/sources/Weapons/Skins/SkinExecutionerAttachment.uc b/sources/Weapons/Skins/SkinExecutionerAttachment.uc new file mode 100644 index 0000000..ee80011 --- /dev/null +++ b/sources/Weapons/Skins/SkinExecutionerAttachment.uc @@ -0,0 +1,4 @@ +class SkinExecutionerAttachment extends NiceDeagleAttachment; +defaultproperties +{ SkinRefs(0)="NicePackT.Skins3rd.Exectutioner_3rd" +} diff --git a/sources/Weapons/Skins/SkinExecutionerPickup.uc b/sources/Weapons/Skins/SkinExecutionerPickup.uc new file mode 100644 index 0000000..6277ec1 --- /dev/null +++ b/sources/Weapons/Skins/SkinExecutionerPickup.uc @@ -0,0 +1,4 @@ +class SkinExecutionerPickup extends NiceDeaglePickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinExecutioner' +} diff --git a/sources/Weapons/Skins/SkinGoldenDeagle.uc b/sources/Weapons/Skins/SkinGoldenDeagle.uc new file mode 100644 index 0000000..6cb32a7 --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenDeagle.uc @@ -0,0 +1,4 @@ +class SkinGoldenDeagle extends NiceDeagle; +defaultproperties +{ SkinRefs(0)="KF_Weapons_Gold_T.Weapons.Gold_deagle_cmb" PickupClass=Class'NicePack.SkinGoldenDeaglePickup' AttachmentClass=Class'NicePack.SkinGoldenDeagleAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenDeagleAttachment.uc b/sources/Weapons/Skins/SkinGoldenDeagleAttachment.uc new file mode 100644 index 0000000..1fadf28 --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenDeagleAttachment.uc @@ -0,0 +1,4 @@ +class SkinGoldenDeagleAttachment extends NiceDeagleAttachment; +defaultproperties +{ SkinRefs(0)="KF_Weapons3rd_Gold_T.Weapons.Gold_3rdP_Handcannon_cmb" MeshRef="KF_Wp3rdGold_Trip.HandcannonGold_3rd" +} diff --git a/sources/Weapons/Skins/SkinGoldenDeaglePickup.uc b/sources/Weapons/Skins/SkinGoldenDeaglePickup.uc new file mode 100644 index 0000000..413dfba --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenDeaglePickup.uc @@ -0,0 +1,4 @@ +class SkinGoldenDeaglePickup extends NiceDeaglePickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinGoldenDeagle' Skins(0)=Texture'KF_Weapons3rd_Gold_T.Weapons.Gold_Handcannon_3rd' +} diff --git a/sources/Weapons/Skins/SkinGoldenDualDeagle.uc b/sources/Weapons/Skins/SkinGoldenDualDeagle.uc new file mode 100644 index 0000000..9a3cad3 --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenDualDeagle.uc @@ -0,0 +1,4 @@ +class SkinGoldenDualDeagle extends NiceDualDeagle; +defaultproperties +{ SkinRefs(0)="KF_Weapons_Gold_T.Weapons.Gold_deagle_cmb" PickupClass=Class'NicePack.SkinGoldenDualDeaglePickup' AttachmentClass=Class'NicePack.SkinGoldenDualDeagleAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenDualDeagleAttachment.uc b/sources/Weapons/Skins/SkinGoldenDualDeagleAttachment.uc new file mode 100644 index 0000000..36c4e8e --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenDualDeagleAttachment.uc @@ -0,0 +1,5 @@ +class SkinGoldenDualDeagleAttachment extends NiceDualDeagleAttachment; +#exec OBJ LOAD FILE=KF_Weapons3rd_Gold_T.utx +defaultproperties +{ SkinRefs(0)="KF_Weapons3rd_Gold_T.Weapons.Gold_3rdP_Handcannon_cmb" MeshRef="KF_Wp3rdGold_Trip.HandcannonGold_3rd" +} diff --git a/sources/Weapons/Skins/SkinGoldenDualDeaglePickup.uc b/sources/Weapons/Skins/SkinGoldenDualDeaglePickup.uc new file mode 100644 index 0000000..65dd603 --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenDualDeaglePickup.uc @@ -0,0 +1,4 @@ +class SkinGoldenDualDeaglePickup extends NiceDualDeaglePickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinGoldenDualDeagle' StaticMesh=StaticMesh'KF_pickupsGold_Trip.HandcannonGold_Pickup' Skins(0)=Texture'KF_Weapons3rd_Gold_T.Weapons.Gold_Handcannon_3rd' +} diff --git a/sources/Weapons/Skins/SkinGoldenDualJudgeAttachment.uc b/sources/Weapons/Skins/SkinGoldenDualJudgeAttachment.uc new file mode 100644 index 0000000..c80101f --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenDualJudgeAttachment.uc @@ -0,0 +1,4 @@ +class SkinGoldenDualJudgeAttachment extends NiceDualJudgePistolAttachment; +defaultproperties +{ BrotherMesh=SkeletalMesh'NicePackA.judge.juj_3rd_gold' MeshRef="NicePackA.Judge.juj_3rd_gold" +} diff --git a/sources/Weapons/Skins/SkinGoldenDualJudgePistol.uc b/sources/Weapons/Skins/SkinGoldenDualJudgePistol.uc new file mode 100644 index 0000000..9a2aba3 --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenDualJudgePistol.uc @@ -0,0 +1,4 @@ +class SkinGoldenDualJudgePistol extends NiceDualJudgePistol; +defaultproperties +{ TraderInfoTexture=Texture'NicePackT.judge.dualjuj_p_gold_trader' SkinRefs(0)="NicePackT.Judge.kfjudge_gold_cmb" PickupClass=Class'NicePack.SkinGoldenDualJudgePistolPickup' AttachmentClass=Class'NicePack.SkinGoldenDualJudgeAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenDualJudgePistolPickup.uc b/sources/Weapons/Skins/SkinGoldenDualJudgePistolPickup.uc new file mode 100644 index 0000000..10f9e6d --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenDualJudgePistolPickup.uc @@ -0,0 +1,4 @@ +class SkinGoldenDualJudgePistolPickup extends NiceDualJudgePistolPickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinGoldenDualJudgePistol' PickupMessage="You got another golden Raging Judge." +} diff --git a/sources/Weapons/Skins/SkinGoldenJudgeAttachment.uc b/sources/Weapons/Skins/SkinGoldenJudgeAttachment.uc new file mode 100644 index 0000000..86488b4 --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenJudgeAttachment.uc @@ -0,0 +1,4 @@ +class SkinGoldenJudgeAttachment extends NiceJudgePistolAttachment; +defaultproperties +{ MeshRef="NicePackA.Judge.juj_3rd_gold" +} diff --git a/sources/Weapons/Skins/SkinGoldenJudgePistol.uc b/sources/Weapons/Skins/SkinGoldenJudgePistol.uc new file mode 100644 index 0000000..dad95c5 --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenJudgePistol.uc @@ -0,0 +1,4 @@ +class SkinGoldenJudgePistol extends NiceJudgePistol; +defaultproperties +{ TraderInfoTexture=Texture'NicePackT.judge.juj_p_gold_trader' SkinRefs(0)="NicePackT.Judge.kfjudge_gold_cmb" PickupClass=Class'NicePack.SkinGoldenJudgePistolPickup' AttachmentClass=Class'NicePack.SkinGoldenJudgeAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenJudgePistolPickup.uc b/sources/Weapons/Skins/SkinGoldenJudgePistolPickup.uc new file mode 100644 index 0000000..a2a4ee4 --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenJudgePistolPickup.uc @@ -0,0 +1,4 @@ +class SkinGoldenJudgePistolPickup extends NiceJudgePistolPickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinGoldenJudgePistol' PickupMessage="You got the gold Raging Judge." +} diff --git a/sources/Weapons/Skins/SkinGoldenKriss.uc b/sources/Weapons/Skins/SkinGoldenKriss.uc new file mode 100644 index 0000000..f10764c --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenKriss.uc @@ -0,0 +1,5 @@ +class SkinGoldenKriss extends ScrnKrissMMedicGun; +#exec obj load file="NicePackT.utx" +defaultproperties +{ SkinRefs(0)="NicePackT.Skins1st.Gold_Kriss_cmb" PickupClass=Class'NicePack.SkinGoldenKrissPickup' AttachmentClass=Class'NicePack.SkinGoldenKrissAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenKrissAttachment.uc b/sources/Weapons/Skins/SkinGoldenKrissAttachment.uc new file mode 100644 index 0000000..1b1ca2b --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenKrissAttachment.uc @@ -0,0 +1,4 @@ +class SkinGoldenKrissAttachment extends NeonKrissMAttachment; +defaultproperties +{ SkinRefs(0)="NicePackT.Skins3rd.Kriss_Gold_3rd" +} diff --git a/sources/Weapons/Skins/SkinGoldenKrissPickup.uc b/sources/Weapons/Skins/SkinGoldenKrissPickup.uc new file mode 100644 index 0000000..2b75880 --- /dev/null +++ b/sources/Weapons/Skins/SkinGoldenKrissPickup.uc @@ -0,0 +1,4 @@ +class SkinGoldenKrissPickup extends ScrnKrissMPickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinGoldenKriss' +} diff --git a/sources/Weapons/Skins/SkinM14EBR2Pro.uc b/sources/Weapons/Skins/SkinM14EBR2Pro.uc new file mode 100644 index 0000000..c7f8705 --- /dev/null +++ b/sources/Weapons/Skins/SkinM14EBR2Pro.uc @@ -0,0 +1,5 @@ +class SkinM14EBR2Pro extends NiceM14EBRBattleRifle; +#exec obj load file="NicePackT.utx" +defaultproperties +{ SkinRefs(0)="NicePackT.Skins1st.M14_cmb" PickupClass=Class'NicePack.SkinM14EBR2ProPickup' AttachmentClass=Class'NicePack.SkinM14EBR2ProAttachment' +} diff --git a/sources/Weapons/Skins/SkinM14EBR2ProAttachment.uc b/sources/Weapons/Skins/SkinM14EBR2ProAttachment.uc new file mode 100644 index 0000000..4e0127e --- /dev/null +++ b/sources/Weapons/Skins/SkinM14EBR2ProAttachment.uc @@ -0,0 +1,4 @@ +class SkinM14EBR2ProAttachment extends NiceM14EBRAttachment; +defaultproperties +{ SkinRefs(0)="NicePackT.Skins3rd.M14_3rd" +} diff --git a/sources/Weapons/Skins/SkinM14EBR2ProPickup.uc b/sources/Weapons/Skins/SkinM14EBR2ProPickup.uc new file mode 100644 index 0000000..a53ea7f --- /dev/null +++ b/sources/Weapons/Skins/SkinM14EBR2ProPickup.uc @@ -0,0 +1,4 @@ +class SkinM14EBR2ProPickup extends NiceM14EBRPickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinM14EBR2Pro' +} diff --git a/sources/Weapons/Skins/SkinRetroLAR.uc b/sources/Weapons/Skins/SkinRetroLAR.uc new file mode 100644 index 0000000..e246e4f --- /dev/null +++ b/sources/Weapons/Skins/SkinRetroLAR.uc @@ -0,0 +1,5 @@ +class SkinRetroLAR extends NiceWinchester; +#exec obj load file="NicePackT.utx" +defaultproperties +{ SkinRefs(0)="NicePackT.Skins1st.OldLAR_cmb" PickupClass=Class'NicePack.SkinRetroLARPickup' +} diff --git a/sources/Weapons/Skins/SkinRetroLARPickup.uc b/sources/Weapons/Skins/SkinRetroLARPickup.uc new file mode 100644 index 0000000..5fcee4f --- /dev/null +++ b/sources/Weapons/Skins/SkinRetroLARPickup.uc @@ -0,0 +1,4 @@ +class SkinRetroLARPickup extends NiceWinchesterPickup; +defaultproperties +{ InventoryType=Class'NicePack.SkinRetroLAR' +}