diff --git a/KFGame/Classes/KFGFxServerBrowser_ServerDetails.uc b/KFGame/Classes/KFGFxServerBrowser_ServerDetails.uc index 04a3bca..603c87a 100644 --- a/KFGame/Classes/KFGFxServerBrowser_ServerDetails.uc +++ b/KFGame/Classes/KFGFxServerBrowser_ServerDetails.uc @@ -59,7 +59,7 @@ function SetFavoriteButtonActive(bool bActive) function SetDetails(KFOnlineGameSettings ServerResult) { local GFxObject TempObj; - local int Ping; + local int Ping, PlayerCount; local KFOnlineGameSettings TempOnlingGamesSettings; if(ServerResult != none) @@ -68,7 +68,15 @@ function SetDetails(KFOnlineGameSettings ServerResult) TempObj = CreateObject("Object"); TempObj.SetString("serverName", TempOnlingGamesSettings.OwningPlayerName); - TempObj.SetFloat("playerCount", (TempOnlingGamesSettings.NumPublicConnections-TempOnlingGamesSettings.NumOpenPublicConnections-TempOnlingGamesSettings.NumSpectators)); + + PlayerCount = TempOnlingGamesSettings.NumPublicConnections-TempOnlingGamesSettings.NumOpenPublicConnections; + + if (PlayerCount < 0) + { + PlayerCount = 0; + } + + TempObj.SetFloat("playerCount", PlayerCount); TempObj.SetFloat("maxPlayerCount", TempOnlingGamesSettings.NumPublicConnections); TempObj.SetFloat("waveCount", TempOnlingGamesSettings.CurrentWave); diff --git a/KFGame/Classes/KFGFxServerBrowser_ServerList.uc b/KFGame/Classes/KFGFxServerBrowser_ServerList.uc index 22c747f..78bb48d 100644 --- a/KFGame/Classes/KFGFxServerBrowser_ServerList.uc +++ b/KFGame/Classes/KFGFxServerBrowser_ServerList.uc @@ -921,7 +921,7 @@ function UpdateListDataProvider() local GFxObject TempObj; local KFOnlineGameSearch LatestGameSearch; - local int Ping; + local int Ping, PlayerCount; local KFOnlineGameSettings TempOnlineGamesSettings; LatestGameSearch = KFOnlineGameSearch(SearchDataStore.GetActiveGameSearch()); @@ -954,8 +954,16 @@ function UpdateListDataProvider() TempObj = CreateObject("Object"); - TempObj.SetString("serverName", TempOnlineGamesSettings.OwningPlayerName); - TempObj.SetFloat("playerCount", (TempOnlineGamesSettings.NumPublicConnections-TempOnlineGamesSettings.NumOpenPublicConnections-TempOnlineGamesSettings.NumSpectators)); + TempObj.SetString("serverName", TempOnlineGamesSettings.OwningPlayerName); + + PlayerCount = TempOnlineGamesSettings.NumPublicConnections-TempOnlineGamesSettings.NumOpenPublicConnections; + + if (PlayerCount < 0) + { + PlayerCount = 0; + } + + TempObj.SetFloat("playerCount", PlayerCount); TempObj.SetFloat("maxPlayerCount", TempOnlineGamesSettings.NumPublicConnections); TempObj.SetFloat("waveCount", TempOnlineGamesSettings.CurrentWave); TempObj.SetFloat("maxWaveCount", IsEndlessModeIndex(TempOnlineGamesSettings.Mode) ? INDEX_NONE : TempOnlineGamesSettings.NumWaves); diff --git a/KFGame/Classes/KFGFxStartGameContainer_FindGame.uc b/KFGame/Classes/KFGFxStartGameContainer_FindGame.uc index d551bf4..8b67d53 100644 --- a/KFGame/Classes/KFGFxStartGameContainer_FindGame.uc +++ b/KFGame/Classes/KFGFxStartGameContainer_FindGame.uc @@ -191,10 +191,10 @@ function FillWhatsNew() item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/5588"); WhatsNewItems.AddItem(item); // Featured Full Gear - item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween_FullGearBundle_DoZ", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9119"); + item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Holiday_Shopper", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9262"); WhatsNewItems.AddItem(item); // Featured Outfit Bundle - item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Holiday_Shopper", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9263"); + item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_Shopping_Uniforms", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9263"); WhatsNewItems.AddItem(item); // Featured Weapon Skin Bundle item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Christmas", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9264"); diff --git a/KFGame/Classes/KFGFxStoreContainer_Main.uc b/KFGame/Classes/KFGFxStoreContainer_Main.uc index 33f8400..0e09998 100644 --- a/KFGame/Classes/KFGFxStoreContainer_Main.uc +++ b/KFGame/Classes/KFGFxStoreContainer_Main.uc @@ -447,23 +447,21 @@ DefaultProperties XboxFilterExceptions[0]="Wasteland Bundle" // Wasteland Outfit Bundle - FeaturedItemIDs[0]=7619 //Whatsnew Gold Ticket - FeaturedItemIDs[1]=9119 - FeaturedItemIDs[2]=9120 - FeaturedItemIDs[3]=9121 - FeaturedItemIDs[4]=9122 - FeaturedItemIDs[5]=9123 - FeaturedItemIDs[6]=9124 - FeaturedItemIDs[7]=9125 + FeaturedItemIDs[0]=7944 //Whatsnew Gold Ticket + FeaturedItemIDs[1]=9262 + FeaturedItemIDs[2]=9263 + FeaturedItemIDs[3]=9264 + FeaturedItemIDs[4]=9265 + FeaturedItemIDs[5]=9266 + FeaturedItemIDs[6]=9267 - ConsoleFeaturedItemIDs[0]=7783 //Whatsnew Gold Ticket PSN - ConsoleFeaturedItemIDs[1]=9119 - ConsoleFeaturedItemIDs[2]=9120 - ConsoleFeaturedItemIDs[3]=9121 - ConsoleFeaturedItemIDs[4]=9122 - ConsoleFeaturedItemIDs[5]=9123 - ConsoleFeaturedItemIDs[6]=9124 - ConsoleFeaturedItemIDs[7]=9125 + ConsoleFeaturedItemIDs[0]=7947 //Whatsnew Gold Ticket PSN + ConsoleFeaturedItemIDs[1]=9262 + ConsoleFeaturedItemIDs[2]=9263 + ConsoleFeaturedItemIDs[3]=9264 + ConsoleFeaturedItemIDs[4]=9265 + ConsoleFeaturedItemIDs[5]=9266 + ConsoleFeaturedItemIDs[6]=9267 MaxFeaturedItems=5 } \ No newline at end of file diff --git a/KFGame/Classes/KFGFxWidget_PartyInGame.uc b/KFGame/Classes/KFGFxWidget_PartyInGame.uc index 95f7ec0..365d35f 100644 --- a/KFGame/Classes/KFGFxWidget_PartyInGame.uc +++ b/KFGame/Classes/KFGFxWidget_PartyInGame.uc @@ -143,12 +143,13 @@ function UpdateEndlessPauseButtonVisibility() if (GetPC().WorldInfo.NetMode != NM_Standalone && KFGRI.bMatchHasBegun && (MyKFPRI != none && MyKFPRI.bHasSpawnedIn && !KFGRI.bWaveIsActive) && !KFGRI.bMatchIsOver && KFGRI.bEndlessMode) { + UpdateEndlessPauseButtonText(); - if (!MyKFPRI.bVotedToPauseGame) - { +// if (!MyKFPRI.bVotedToPauseGame) +// { SetBool("endlessPauseButtonVisible", true); - } +// } } else { diff --git a/KFGame/Classes/KFGfxMoviePlayer_Manager.uc b/KFGame/Classes/KFGfxMoviePlayer_Manager.uc index f88afc7..7625bca 100644 --- a/KFGame/Classes/KFGfxMoviePlayer_Manager.uc +++ b/KFGame/Classes/KFGfxMoviePlayer_Manager.uc @@ -2114,7 +2114,7 @@ simulated function HidePauseGameVote() UnloadCurrentPopup(); } - SkipTraderVotePRI = none; + PauseGameVotePRI = none; } function CastYesVotePauseGame() diff --git a/KFGame/Classes/KFInventoryManager.uc b/KFGame/Classes/KFInventoryManager.uc index fabc046..e0a6c60 100644 --- a/KFGame/Classes/KFInventoryManager.uc +++ b/KFGame/Classes/KFInventoryManager.uc @@ -59,6 +59,7 @@ var bool bAutoswitchWeapon; var const float StartedWithWeaponPriceModifier; // The selling price reduction for a weapon that we were given at the start of the game var const float SellPriceModifier; // Multiplied by the original price to get the sell cost +var const float DoshinegunSellModifier; /** Cost scale for weapons not on the active perk */ var float OffPerkCostScale; @@ -2446,12 +2447,15 @@ simulated function int GetAdjustedSellPriceFor( local KFWeapon OwnedWeapon; local TransactionItem TransactionWeapon; local int OwnedItemIdx, ItemUpgradeLevel; + local float OverridenSellPriceModifier; if (OwnedItem.WeaponDef == class'KFWeapDef_9mm') { return 0; } + OverridenSellPriceModifier = OwnedItem.WeaponDef == class'KFWeapDef_Doshinegun' ? DoshinegunSellModifier : SellPriceModifier; + GetWeaponFromClass(OwnedWeapon, OwnedItem.ClassName); if( OwnedWeapon != none && OwnedWeapon.bGivenAtStart ) { @@ -2459,7 +2463,7 @@ simulated function int GetAdjustedSellPriceFor( } else { - AdjustedSellPrice = OwnedItem.WeaponDef.default.BuyPrice * SellPriceModifier; + AdjustedSellPrice = OwnedItem.WeaponDef.default.BuyPrice * OverridenSellPriceModifier; } OwnedItemIdx = TraderOwnedItems.Find('DefaultItem', OwnedItem); @@ -2632,4 +2636,5 @@ defaultproperties SwitchFireModeEvent=AkEvent'WW_UI_PlayerCharacter.Play_WEP_ModeSwitch' bLogInventory=false + DoshinegunSellModifier=0.167f } diff --git a/KFGame/Classes/KFPawn.uc b/KFGame/Classes/KFPawn.uc index d32bbe2..d602f05 100644 --- a/KFGame/Classes/KFPawn.uc +++ b/KFGame/Classes/KFPawn.uc @@ -2461,6 +2461,8 @@ function PostTeleport( Teleporter OutTeleporter ) /** sets whether or not the owner of this pawn can see it */ simulated function SetMeshVisibility(bool bVisible) { + local bool bIsPlayingEmote; + // Handle the main player mesh if (Mesh != None) { @@ -2472,7 +2474,10 @@ simulated function SetMeshVisibility(bool bVisible) HideHead( !bVisible ); // Handle weapon attachment - SetWeaponAttachmentVisibility(bVisible); + + bIsPlayingEmote = KFPlayerController(Controller) != none && KFPlayerController(Controller).PlayerCamera.CameraStyle == 'Emote'; + + SetWeaponAttachmentVisibility(bVisible && !bIsPlayingEmote); // Handle any weapons they might have SetFirstPersonVisibility(!bVisible); diff --git a/KFGame/Classes/KFPawn_Human.uc b/KFGame/Classes/KFPawn_Human.uc index 5661b32..06aa3a6 100644 --- a/KFGame/Classes/KFPawn_Human.uc +++ b/KFGame/Classes/KFPawn_Human.uc @@ -2119,6 +2119,7 @@ client reliable function ClientOverrideHumanDefaults() { local KFPlayerController_WeeklySurvival KFPC_WS; local KFPlayerReplicationInfo KFPRI; + local KFGameReplicationInfo KFGRI; local KFCharacterInfo_Human KFCIH; local int CowboyHatIndex; @@ -2127,8 +2128,10 @@ client reliable function ClientOverrideHumanDefaults() { return; } - - if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12) + + KFGRI = KFGameReplicationInfo(WorldInfo.GRI); + + if (KFGRI != none && KFGRI.CurrentWeeklyIndex == 12) { KFPRI = KFPlayerReplicationInfo(KFPC_WS.PlayerReplicationInfo); if (KFPRI != none) diff --git a/KFGame/Classes/KFPerk_Swat.uc b/KFGame/Classes/KFPerk_Swat.uc index cd1456d..6e04a2e 100644 --- a/KFGame/Classes/KFPerk_Swat.uc +++ b/KFGame/Classes/KFPerk_Swat.uc @@ -195,7 +195,7 @@ simulated function bool HasHeavyArmor() return IsHeavyArmorActive(); } -static simulated private function bool Is9mm( KFWeapon KFW ) +static simulated public function bool Is9mm( KFWeapon KFW ) { return KFW != none && KFW.default.bIsBackupWeapon && !KFW.IsMeleeWeapon(); } @@ -278,7 +278,9 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau if( KFW != none ) { - if( IsBackupActive() && (IsBackupWeapon( KFW ) || IsDual9mm( KFW ) || ClassIsChildOf(DamageType, class'KFDT_Bludgeon')) ) + // KFDT_Bludgeon_Doshinegun_Shot is a special case of Bludgeon damage that doesn't apply this mod. + if( IsBackupActive() && (IsBackupWeapon( KFW ) || IsDual9mm( KFW ) || + ((!IsDoshinegun(KFW) && ClassIsChildOf(DamageType, class'KFDT_Bludgeon') ) || (IsDoshinegun(KFW) && DamageType.Name != 'KFDT_Bludgeon_Doshinegun_Shot' )))) { `QALog( "Backup Damage" @ KFW @ GetPercentage( InDamage, InDamage * GetSkillValue(PerkSkills[ESWAT_Backup])), bLogPerk ); TempDamage += InDamage * GetSkillValue( PerkSkills[ESWAT_Backup] ); diff --git a/KFGame/Classes/KFPlayerReplicationInfo.uc b/KFGame/Classes/KFPlayerReplicationInfo.uc index 8413516..b4b95e4 100644 --- a/KFGame/Classes/KFPlayerReplicationInfo.uc +++ b/KFGame/Classes/KFPlayerReplicationInfo.uc @@ -1568,4 +1568,5 @@ defaultproperties CurrentHeadShotEffectID=-1; bCarryingCollectible=false; + bVotedToPauseGame=false; } diff --git a/KFGame/Classes/KFSM_Zed_Boss_Theatrics.uc b/KFGame/Classes/KFSM_Zed_Boss_Theatrics.uc index 8d4775e..722aab1 100644 --- a/KFGame/Classes/KFSM_Zed_Boss_Theatrics.uc +++ b/KFGame/Classes/KFSM_Zed_Boss_Theatrics.uc @@ -125,6 +125,10 @@ function PlayAnimation() switch (CurrentTheatricType) { case THEATRIC_Entrance: + /** Not initialized when playing intro */ + KFPOwner.SpecialMoveFlags = PackSMFlags(KFPOwner, THEATRIC_Entrance); + Variant = KFPOwner.SpecialMoveFlags >> 4; + AnimName = KFPOwner.PawnAnimInfo.TheatricBossEntranceAnimInfos[Variant].AnimationName; CameraAnim = KFPOwner.PawnAnimInfo.TheatricBossEntranceAnimInfos[Variant].CameraAnimation; CameraAnimOffset = KFPOwner.PawnAnimInfo.TheatricBossEntranceAnimInfos[Variant].CameraAnimOffset; diff --git a/KFGame/Classes/KFVoteCollector.uc b/KFGame/Classes/KFVoteCollector.uc index 7c7f76f..78de2a2 100644 --- a/KFGame/Classes/KFVoteCollector.uc +++ b/KFGame/Classes/KFVoteCollector.uc @@ -441,7 +441,7 @@ function ServerStartVoteSkipTrader(PlayerReplicationInfo PRI) } // A skip trader vote is not allowed while another vote is active - if(bIsKickVoteInProgress) + if(bIsKickVoteInProgress || bIsPauseGameVoteInProgress) { KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_OtherVoteInProgress); return; diff --git a/KFGame/Classes/KFWeap_MinigunBase.uc b/KFGame/Classes/KFWeap_MinigunBase.uc index 005ab5a..a66131a 100644 --- a/KFGame/Classes/KFWeap_MinigunBase.uc +++ b/KFGame/Classes/KFWeap_MinigunBase.uc @@ -57,6 +57,9 @@ var float FiringViewRotationSpeed; /* Pawn movement speed used when the weapon is firing */ var float FiringPawnMovementSpeed; +/** Rotation Speed limit when the weapon is equipped */ +var const float EquippedRotationSpeedLimit; + simulated event ReplicatedEvent(name VarName) { switch (VarName) @@ -375,9 +378,13 @@ simulated event Tick( float DeltaTime ) { NewRotationSpeedLimit = WindUpViewRotationSpeed; } - else + else if (!IsInState('Inactive')) // Weapon hold { - NewRotationSpeedLimit = 2000.0f; + NewRotationSpeedLimit = EquippedRotationSpeedLimit; + } + else // Weapon holstered + { + NewRotationSpeedLimit = OwnerController.default.RotationSpeedLimit; } if( NewRotationSpeedLimit != OwnerController.RotationSpeedLimit ) @@ -624,6 +631,8 @@ defaultproperties bAlwaysRelevant=True bOnlyRelevantToOwner=False + EquippedRotationSpeedLimit=2000; + WindUpViewRotationSpeed=2000 // base rotation WindUpPawnMovementSpeed=1 // base speed diff --git a/KFGame/Classes/KFWeapon.uc b/KFGame/Classes/KFWeapon.uc index 69769c9..e2eb4b2 100644 --- a/KFGame/Classes/KFWeapon.uc +++ b/KFGame/Classes/KFWeapon.uc @@ -4268,7 +4268,7 @@ simulated protected native function int SendClientProjectileExplosion(vector Exp // Compress our fragment impact into a ImpactRepInfo for replication (returns number of impacts sent) simulated protected native function int SendClientFragmentImpact(const out ImpactInfo Impact, class FragmentClass); simulated protected native function vector GetSafeStartTraceLocation(); - +simulated native function Actor DoTraceNative(out Vector OutLocation, Vector StartLocation, Vector EndLocation); /** * Allows subclass to perform extra bullet traces * Network: Local Player diff --git a/KFGameContent/Classes/KFDT_Bludgeon_FlareGun.uc b/KFGameContent/Classes/KFDT_Bludgeon_FlareGun.uc index f6f9485..1435934 100644 --- a/KFGameContent/Classes/KFDT_Bludgeon_FlareGun.uc +++ b/KFGameContent/Classes/KFDT_Bludgeon_FlareGun.uc @@ -12,6 +12,6 @@ class KFDT_Bludgeon_FlareGun extends KFDT_Bludgeon_RifleButt DefaultProperties { WeaponDef=class'KFWeapDef_FlareGun' - ModifierPerkList(0)=class'KFPerk_Gunslinger' - ModifierPerkList(1)=class'KFPerk_Sharpshooter' + ModifierPerkList(1)=class'KFPerk_Gunslinger' + ModifierPerkList(2)=class'KFPerk_Sharpshooter' } \ No newline at end of file diff --git a/KFGameContent/Classes/KFDT_Bludgeon_G18Shield.uc b/KFGameContent/Classes/KFDT_Bludgeon_G18Shield.uc index b4794af..6a3cbdf 100644 --- a/KFGameContent/Classes/KFDT_Bludgeon_G18Shield.uc +++ b/KFGameContent/Classes/KFDT_Bludgeon_G18Shield.uc @@ -21,5 +21,5 @@ defaultproperties MeleeHitPower=100 WeaponDef=class'KFWeapDef_G18' - ModifierPerkList(0)=class'KFPerk_Swat' + ModifierPerkList(1)=class'KFPerk_Swat' } \ No newline at end of file diff --git a/KFGameContent/Classes/KFDT_Bludgeon_HRGWinterbite.uc b/KFGameContent/Classes/KFDT_Bludgeon_HRGWinterbite.uc index 2a9968b..2252546 100644 --- a/KFGameContent/Classes/KFDT_Bludgeon_HRGWinterbite.uc +++ b/KFGameContent/Classes/KFDT_Bludgeon_HRGWinterbite.uc @@ -12,6 +12,6 @@ class KFDT_Bludgeon_HRGWinterbite extends KFDT_Bludgeon_RifleButt DefaultProperties { WeaponDef=class'KFWeapDef_HRGWinterbite' - ModifierPerkList(0)=class'KFPerk_Gunslinger' - ModifierPerkList(1)=class'KFPerk_Sharpshooter' + ModifierPerkList(1)=class'KFPerk_Gunslinger' + ModifierPerkList(2)=class'KFPerk_Sharpshooter' } \ No newline at end of file diff --git a/KFGameContent/Classes/KFDT_Bludgeon_HRG_SonicGun.uc b/KFGameContent/Classes/KFDT_Bludgeon_HRG_SonicGun.uc index 1868fe9..e950b0f 100644 --- a/KFGameContent/Classes/KFDT_Bludgeon_HRG_SonicGun.uc +++ b/KFGameContent/Classes/KFDT_Bludgeon_HRG_SonicGun.uc @@ -10,7 +10,7 @@ class KFDT_Bludgeon_HRG_SonicGun extends KFDT_Bludgeon_RifleButt DefaultProperties { - ModifierPerkList(0)=class'KFPerk_Survivalist' + ModifierPerkList(1)=class'KFPerk_Survivalist' //defaults WeaponDef=class'KFWeapDef_HRG_SonicGun' } \ No newline at end of file diff --git a/KFGameContent/Classes/KFDT_Bludgeon_HRG_Vampire.uc b/KFGameContent/Classes/KFDT_Bludgeon_HRG_Vampire.uc index b595026..2ec73a8 100644 --- a/KFGameContent/Classes/KFDT_Bludgeon_HRG_Vampire.uc +++ b/KFGameContent/Classes/KFDT_Bludgeon_HRG_Vampire.uc @@ -14,6 +14,6 @@ DefaultProperties StumblePower=200 MeleeHitPower=100 - ModifierPerkList(0)=class'KFPerk_FieldMedic' + ModifierPerkList(1)=class'KFPerk_FieldMedic' WeaponDef=class'KFWeapDef_HRG_Vampire' } \ No newline at end of file diff --git a/KFGameContent/Classes/KFGameInfo_Endless.uc b/KFGameContent/Classes/KFGameInfo_Endless.uc index c98258b..6f10f29 100644 --- a/KFGameContent/Classes/KFGameInfo_Endless.uc +++ b/KFGameContent/Classes/KFGameInfo_Endless.uc @@ -666,6 +666,17 @@ function SetMonsterDefaults(KFPawn_Monster P) super.SetMonsterDefaults(P); } +// Save player's stats on leave +function UnregisterPlayer(PlayerController PC) +{ + super.UnregisterPlayer(PC); + + if (GetNumPlayers() == 0 && MyKFGRI.bIsEndlessPaused) + { + ResumeEndlessGame(); + } +} + defaultproperties { bIsEndlessGame = true diff --git a/KFGameContent/Classes/KFOutbreakEvent_Weekly.uc b/KFGameContent/Classes/KFOutbreakEvent_Weekly.uc index e7c88c1..cff12c2 100644 --- a/KFGameContent/Classes/KFOutbreakEvent_Weekly.uc +++ b/KFGameContent/Classes/KFOutbreakEvent_Weekly.uc @@ -656,7 +656,7 @@ defaultproperties bBossRushMode=true, OverrideAmmoPickupModifier=1, WaveAmmoPickupModifiers={( - 0.99, 0.99, 0.99, 0.99, 0.99 + 0.99, 0.99, 0.99, 0.99, 0.99, 0.99 )}, BossRushOverrideParams={(PerWaves={( // WAVE 1 diff --git a/KFGameContent/Classes/KFPawn_ZedBloatKing.uc b/KFGameContent/Classes/KFPawn_ZedBloatKing.uc index 878cafe..719264c 100644 --- a/KFGameContent/Classes/KFPawn_ZedBloatKing.uc +++ b/KFGameContent/Classes/KFPawn_ZedBloatKing.uc @@ -734,7 +734,7 @@ defaultproperties IncapSettings(AF_Microwave)=(Vulnerability=(0.08), Cooldown=10.0, Duration=3.0) IncapSettings(AF_FirePanic)=(Vulnerability=(0.65), Cooldown=15.0, Duration=1.2) IncapSettings(AF_EMP)= (Vulnerability=(0.5), Cooldown=10.0, Duration=2.2) - IncapSettings(AF_Freeze)= (Vulnerability=(0.5), Cooldown=10.0, Duration=1.0) + IncapSettings(AF_Freeze)= (Vulnerability=(0.3), Cooldown=15.0, Duration=1.0) IncapSettings(AF_Snare)= (Vulnerability=(1.0, 2.0, 1.0, 1.0, 2.0), Cooldown=10.5, Duration=3.0) IncapSettings(AF_Bleed)= (Vulnerability=(0.15), Cooldown=10.0) diff --git a/KFGameContent/Classes/KFPawn_ZedMatriarch.uc b/KFGameContent/Classes/KFPawn_ZedMatriarch.uc index 99e36ab..70209b9 100644 --- a/KFGameContent/Classes/KFPawn_ZedMatriarch.uc +++ b/KFGameContent/Classes/KFPawn_ZedMatriarch.uc @@ -438,7 +438,14 @@ function ActivateShield() KFGI.DifficultyInfo.GetAIHealthModifier(self, KFGI.GetModifiedGameDifficulty(), KFGI.GetLivingPlayerCount(), HealthMod, HeadHealthMod); ShieldHealth = ShieldHealthMaxDefaults[KFGI.GetModifiedGameDifficulty()] * HealthMod * ShieldHealthScale; - ShieldHealthMax = ShieldHealth; + + if (KFGI.OutbreakEvent != none && KFGi.OutbreakEvent.ActiveEvent.bBossRushMode) + { + ShieldHealth = ShieldHealth * ArmorInfo.ArmorScale; + } + + + ShieldHealthMax = ShieldHealth; ShieldHealthPctByte = FloatToByte( fClamp(ShieldHealth / ShieldHealthMax, 0.f, 1.f) ); UpdateShield(); diff --git a/KFGameContent/Classes/KFProj_Bullet_HRG_Stunner.uc b/KFGameContent/Classes/KFProj_Bullet_HRG_Stunner.uc new file mode 100644 index 0000000..a85e4d0 --- /dev/null +++ b/KFGameContent/Classes/KFProj_Bullet_HRG_Stunner.uc @@ -0,0 +1,48 @@ +//============================================================================= +// KFProj_Bullet_Pellet +//============================================================================= +// Shotgun pellet class +//============================================================================= +// Killing Floor 2 +// Copyright (C) 2015 Tripwire Interactive LLC +//============================================================================= + +class KFProj_Bullet_HRG_Stunner extends KFProj_Bullet + hidedropdown; + +/** Cached reference to owner weapon */ +var protected KFWeapon OwnerWeapon; + +/** Initialize the projectile */ +function Init( vector Direction ) +{ + super.Init( Direction ); + + OwnerWeapon = KFWeapon( Owner ); + if( OwnerWeapon != none ) + { + OwnerWeapon.LastPelletFireTime = WorldInfo.TimeSeconds; + } +} + +/** Don't allow more than one pellet projectile to perform this check in a single frame */ +function bool ShouldWarnAIWhenFired() +{ + return super.ShouldWarnAIWhenFired() && OwnerWeapon != none && OwnerWeapon.LastPelletFireTime < WorldInfo.TimeSeconds; +} + +defaultproperties +{ + MaxSpeed=7000.0 + Speed=7000.0 + + bWarnAIWhenFired=true + + DamageRadius=0 + + ProjFlightTemplate=ParticleSystem'WEP_HRG_Stunner_EMIT.FX_HRG_Stunner_Tracer' + ProjFlightTemplateZedTime=ParticleSystem'WEP_HRG_Stunner_EMIT.FX_HRG_Stunner_Tracer_ZEDTime' + + AmbientSoundPlayEvent=none + AmbientSoundStopEvent=none +} \ No newline at end of file diff --git a/KFGameContent/Classes/KFProj_Bullet_HRG_Stunner_Alt.uc b/KFGameContent/Classes/KFProj_Bullet_HRG_Stunner_Alt.uc index 79f3866..fc281d0 100644 --- a/KFGameContent/Classes/KFProj_Bullet_HRG_Stunner_Alt.uc +++ b/KFGameContent/Classes/KFProj_Bullet_HRG_Stunner_Alt.uc @@ -38,6 +38,14 @@ simulated protected function PrepareExplosionTemplate() ExplosionTemplate.bIgnoreInstigator = true; } +simulated function AdjustCanDisintigrate() {} + +/** Can be overridden in subclasses to exclude specific projectiles from nuking */ +simulated function bool AllowNuke() +{ + return false; +} + defaultproperties { MaxSpeed=22500.0 @@ -46,8 +54,8 @@ defaultproperties DamageRadius=0 ProjDisintegrateTemplate=ParticleSystem'ZED_Siren_EMIT.FX_Siren_grenade_disable_01' - // ProjFlightTemplate=ParticleSystem'WEP_HRG_Boomy_EMIT.FX_Boomy_Tracer_ZEDTime' - ProjFlightTemplateZedTime=ParticleSystem'WEP_HRG_Boomy_EMIT.FX_Boomy_Tracer_ZEDTime' + ProjFlightTemplate=ParticleSystem'WEP_HRG_Stunner_EMIT.FX_HRG_Stunner_ALT_Tracer_ZEDTime' + ProjFlightTemplateZedTime=ParticleSystem'WEP_HRG_Stunner_EMIT.FX_HRG_Stunner_ALT_Tracer_ZEDTime' // Grenade explosion light Begin Object Class=PointLightComponent Name=ExplosionPointLight diff --git a/KFGameContent/Classes/KFProj_Dosh.uc b/KFGameContent/Classes/KFProj_Dosh.uc index fb1dcde..b111c0c 100644 --- a/KFGameContent/Classes/KFProj_Dosh.uc +++ b/KFGameContent/Classes/KFProj_Dosh.uc @@ -22,6 +22,7 @@ var() float DampenFactorParallel; var transient Vector PreviousLocations [`KFPROJ_DOSH_CACHED_LOCATION]; var transient rotator PreviousRotations [`KFPROJ_DOSH_CACHED_LOCATION]; +var transient Vector Ceiling; // Make sure that last location always exists. simulated event PostBeginPlay() @@ -91,25 +92,43 @@ function SpawnDosh(Actor BouncedOff) { local KFDroppedPickup_Cash P; local int i; + local Vector Pos; + local rotator Rot; if ( WorldInfo.NetMode == NM_Client ) return; if (Pawn(BouncedOff) == none) { - P = Spawn(class'KFDroppedPickup_Cash',,, Location, Rotation,, false); + Pos = Location; + Rot = Rotation; + P = Spawn(class'KFDroppedPickup_Cash',,, Pos, Rot,, false); if (P == none) { for (i = 0; i < `KFPROJ_DOSH_CACHED_LOCATION; ++i) { - P = Spawn(class'KFDroppedPickup_Cash',,, PreviousLocations[i], PreviousRotations[i],, false); + Pos = PreviousLocations[i]; + Rot = PreviousRotations[i]; + P = Spawn(class'KFDroppedPickup_Cash',,, Pos, Rot,, false); if (P != none) { break; } } } + + // DrawDebugSphere( Pos, 20, 8, 0, 255, 255, true ); + if (P != none && RelocateFromCeiling(Pos)) + { + P.Destroy(); + if(Ceiling.Z > -10000) + { + // DrawDebugSphere( Ceiling, 22, 8, 255, 255, 0, true ); + P = Spawn(class'KFDroppedPickup_Cash',,, Ceiling, Rot,, false); + Velocity = vect(0,0,0); + } + } } else { @@ -198,6 +217,36 @@ simulated function SyncOriginalLocation() Super.SyncOriginalLocation(); } +simulated function bool RelocateFromCeiling(Vector Pos) +{ + local Actor HitActorVolume, HitActorWorld, HitActorVolumeBack; + local Vector HitLocationVolume, HitLocationWorld; + local Vector HitNormalUnused; + + HitActorWorld = Owner.Trace(HitLocationWorld, HitNormalUnused, Pos - vect(0,0,10000), Pos, false,,,TRACEFLAG_Bullet); + if(HitActorWorld != none) + { + HitActorVolume = KFWeapon(Owner).DoTraceNative(HitLocationVolume, Pos, Pos - vect(0,0,10000)); + if (HitActorVolume == none || (HitLocationWorld.Z + 80) > HitLocationVolume.Z || IsZero(HitLocationVolume-Pos)) + { + return false; + } + + // DrawDebugSphere( HitLocationWorld , 32, 8, 0, 255, 0, true ); + // DrawDebugSphere( HitLocationVolume, 30, 8, 255, 0, 0, true ); + + HitLocationWorld += vect(0,0,1); + HitActorVolumeBack = KFWeapon(Owner).DoTraceNative(HitLocationVolume, HitLocationWorld, HitLocationWorld + vect(0,0,10000)); + if (HitActorVolumeBack != none && !IsZero(HitLocationVolume-HitLocationWorld)) + { + // DrawDebugSphere( HitLocationVolume, 28, 8, 255, 255, 0, true ); + Ceiling = HitLocationVolume - vect(0,0,10); + return true; + } + } + Ceiling = Vect(0,0,-10000); + return true; +} defaultproperties diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Xmas2021.uc b/KFGameContent/Classes/KFSeasonalEventStats_Xmas2021.uc index d090f8c..921de82 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Xmas2021.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Xmas2021.uc @@ -77,27 +77,6 @@ simulated event OnGameWon(class GameClass, int Difficulty, int GameLen } } -simulated event OnGameEnd(class GameClass) -{ - local int ObjIdx; - local int TotalDoshEarned; - - // Earn 75,000 Dosh through kills, rewards and healing on Carillon Hamlet - ObjIdx = 2; - if (bObjectiveIsValidForMap[ObjIdx] != 0) - { - TotalDoshEarned = Outer.MyKFPC.MatchStats.TotalDoshEarned + Outer.MyKFPC.MatchStats.GetDoshEarnedInWave(); - if(TotalDoshEarned > 0) - { - IncrementSeasonalEventStat(ObjIdx, TotalDoshEarned); - if (Outer.GetSeasonalEventStatValue(ObjIdx) >= DoshRequired) - { - FinishedObjective(SEI_Winter, ObjIdx); - } - } - } -} - simulated event OnWeaponPurchased(class WeaponDef, int Price) { local int ObjIdx; @@ -117,6 +96,22 @@ simulated event OnWeaponPurchased(class WeaponDef, int Price simulated event OnWaveCompleted(class GameClass, int Difficulty, int WaveNum) { local int ObjIdx; + local int TotalDoshEarned; + + // Earn 75,000 Dosh through kills, rewards and healing on Carillon Hamlet + ObjIdx = 2; + if (bObjectiveIsValidForMap[ObjIdx] != 0) + { + TotalDoshEarned = Outer.MyKFPC.MatchStats.TotalDoshEarned + Outer.MyKFPC.MatchStats.GetDoshEarnedInWave(); + if(TotalDoshEarned > 0) + { + IncrementSeasonalEventStat(ObjIdx, TotalDoshEarned); + if (Outer.GetSeasonalEventStatValue(ObjIdx) >= DoshRequired) + { + FinishedObjective(SEI_Winter, ObjIdx); + } + } + } // Complete wave 15 on Endless Hard or higher difficulty on Carillon ObjIdx = 4; diff --git a/KFGameContent/Classes/KFSeqCond_IsWeeklyEvent.uc b/KFGameContent/Classes/KFSeqCond_IsWeeklyEvent.uc index cf6ed0c..f4bbb73 100644 --- a/KFGameContent/Classes/KFSeqCond_IsWeeklyEvent.uc +++ b/KFGameContent/Classes/KFSeqCond_IsWeeklyEvent.uc @@ -12,19 +12,16 @@ var() int WeeklyIndex; function Activated() { - local KFGameInfo KFGI; - KFGI = KFGameInfo(GetWorldInfo().Game); + local KFGameReplicationInfo KFGRI; + KFGRI = KFGameReplicationInfo(GetWorldInfo().GRI); - if (KFGI != none) + if (KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == WeeklyIndex) { - if (KFGI.MyKFGRI != none && KFGI.MyKFGRI.bIsWeeklyMode && class'KFGameEngine'.static.GetWeeklyEventIndexMod() == WeeklyIndex) - { - OutputLinks[0].bHasImpulse = true; - } - else - { - OutputLinks[1].bHasImpulse = true; - } + OutputLinks[0].bHasImpulse = true; + } + else + { + OutputLinks[1].bHasImpulse = true; } } diff --git a/KFGameContent/Classes/KFWeapAttach_Doshinegun.uc b/KFGameContent/Classes/KFWeapAttach_Doshinegun.uc new file mode 100644 index 0000000..f0b860c --- /dev/null +++ b/KFGameContent/Classes/KFWeapAttach_Doshinegun.uc @@ -0,0 +1,34 @@ +//============================================================================= +// KFWeapAttach_Doshinegun +//============================================================================= +// +//============================================================================= +// Killing Floor 2 +// Copyright (C) 2021 Tripwire Interactive LLC +//============================================================================= + +class KFWeapAttach_Doshinegun extends KFWeaponAttachment; + +/** Play a melee attack animation */ +simulated function float PlayMeleeAtkAnim(EWeaponState NewWeaponState, KFPawn P) +{ + local name AnimName; + + if( P.IsFirstPerson() ) + { + return 0.0f; + } + + if (NewWeaponState == WEP_MeleeBasic) + { + AnimName = P.bIsCrouched ? CH_MeleeBasic : MeleeBasic; + return PlayCharacterMeshAnim(P, AnimName, true); + } + + return super.PlayMeleeAtkAnim(NewWeaponState, P); +} + +defaultproperties +{ + +} diff --git a/KFGameContent/Classes/KFWeap_AssaultRifle_Doshinegun.uc b/KFGameContent/Classes/KFWeap_AssaultRifle_Doshinegun.uc index 614132a..f106d7d 100644 --- a/KFGameContent/Classes/KFWeap_AssaultRifle_Doshinegun.uc +++ b/KFGameContent/Classes/KFWeap_AssaultRifle_Doshinegun.uc @@ -11,6 +11,7 @@ class KFWeap_AssaultRifle_Doshinegun extends KFWeap_RifleBase; var int DoshCost; var transient KFPlayerReplicationInfo KFPRI; +var transient bool bIsBeingDropped; simulated function Activate() { @@ -18,16 +19,19 @@ simulated function Activate() super.Activate(); - KFP = KFPawn(Instigator); - if (KFP != none) + if (KFPRI == none) { - KFPRI = KFPlayerReplicationInfo(KFP.PlayerReplicationInfo); + KFP = KFPawn(Instigator); + if (KFP != none) + { + KFPRI = KFPlayerReplicationInfo(KFP.PlayerReplicationInfo); + } } } simulated function bool HasAnyAmmo() { - return AmmoCount[0] > 0 || KFPRI.Score >= DoshCost; + return bIsBeingDropped ? AmmoCount[0] > 0 : (AmmoCount[0] > 0 || KFPRI.Score >= DoshCost); } /** Returns true if weapon can potentially be reloaded */ @@ -105,6 +109,29 @@ simulated state Reloading } } +/** + * Drop this item out in to the world + */ +function DropFrom(vector StartLocation, vector StartVelocity) +{ + bIsBeingDropped=true; + super.DropFrom(StartLocation, StartVelocity); +} + +function SetOriginalValuesFromPickup( KFWeapon PickedUpWeapon ) +{ + local KFPawn KFP; + + bIsBeingDropped=false; + // Reset the replication info + KFP = KFPawn(Instigator); + if (KFP != none) + { + KFPRI = KFPlayerReplicationInfo(KFP.PlayerReplicationInfo); + } + super.SetOriginalValuesFromPickup(PickedUpWeapon); +} + defaultproperties { // FOV @@ -126,7 +153,7 @@ defaultproperties // Zooming/Position PlayerViewOffset=(X=1.0,Y=8.5,Z=-3) - IronSightPosition=(X=5.0,Y=-0.1,Z=-1.5) + IronSightPosition=(X=5.0,Y=0.05,Z=-1.2) // Ammo MagazineCapacity[0]=20 @@ -169,7 +196,7 @@ defaultproperties InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Bludgeon_Doshinegun_Shot' FireInterval(DEFAULT_FIREMODE)=+0.2 Spread(DEFAULT_FIREMODE)=0.015 - InstantHitDamage(DEFAULT_FIREMODE)=55.0 //60.0 + InstantHitDamage(DEFAULT_FIREMODE)=60.0 //55.0 //60.0 FireOffset=(X=30,Y=4.5,Z=-5) // ALT_FIREMODE @@ -179,7 +206,7 @@ defaultproperties WeaponProjectiles(ALTFIRE_FIREMODE)=class'KFProj_Dosh' InstantHitDamageTypes(ALTFIRE_FIREMODE)=class'KFDT_Bludgeon_Doshinegun_Shot' FireInterval(ALTFIRE_FIREMODE)=+0.2 - InstantHitDamage(ALTFIRE_FIREMODE)=55.0 //60.0 + InstantHitDamage(ALTFIRE_FIREMODE)=60.0 //55.0 //60.0 Spread(ALTFIRE_FIREMODE)=0.015 // BASH_FIREMODE @@ -208,13 +235,14 @@ defaultproperties //WeaponUpgrades[2]=(IncrementDamage=1.65f,IncrementWeight=2) //WeaponUpgrades[3]=(IncrementDamage=1.85f,IncrementWeight=3) - WeaponUpgrades[1]=(Stats=((Stat=EWUS_Damage0, Scale=1.2f), (Stat=EWUS_Damage1, Scale=1.15f), (Stat=EWUS_Weight, Add=1))) - WeaponUpgrades[2]=(Stats=((Stat=EWUS_Damage0, Scale=1.4f), (Stat=EWUS_Damage1, Scale=1.3f), (Stat=EWUS_Weight, Add=2))) - WeaponUpgrades[3]=(Stats=((Stat=EWUS_Damage0, Scale=1.6f), (Stat=EWUS_Damage1, Scale=1.45f), (Stat=EWUS_Weight, Add=3))) + WeaponUpgrades[1]=(Stats=((Stat=EWUS_Damage0, Scale=1.23f), (Stat=EWUS_Damage1, Scale=1.23f), (Stat=EWUS_Weight, Add=1))) + WeaponUpgrades[2]=(Stats=((Stat=EWUS_Damage0, Scale=1.47f), (Stat=EWUS_Damage1, Scale=1.47f), (Stat=EWUS_Weight, Add=2))) + WeaponUpgrades[3]=(Stats=((Stat=EWUS_Damage0, Scale=1.70f), (Stat=EWUS_Damage1, Scale=1.70f), (Stat=EWUS_Weight, Add=3))) - DoshCost = 25; + DoshCost = 20; //25; bUsesSecondaryAmmoAltHUD=true bAllowClientAmmoTracking=false + bIsBeingDropped=false } diff --git a/KFGameContent/Classes/KFWeap_HRG_Stunner.uc b/KFGameContent/Classes/KFWeap_HRG_Stunner.uc index bb5f9a4..882eacd 100644 --- a/KFGameContent/Classes/KFWeap_HRG_Stunner.uc +++ b/KFGameContent/Classes/KFWeap_HRG_Stunner.uc @@ -69,7 +69,7 @@ simulated function name GetWeaponFireAnim(byte FireModeNum) defaultproperties { // Inventory - InventorySize=6 + InventorySize=7 //6 GroupPriority=100 WeaponSelectTexture=Texture2D'wep_ui_hrg_stunner_tex.UI_Weapon_Select_HRG_Stunner' @@ -103,7 +103,7 @@ defaultproperties FireModeIconPaths(DEFAULT_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_ShotgunAuto' FiringStatesArray(DEFAULT_FIREMODE)=WeaponFiring WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_Projectile - WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_Pellet' + WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_HRG_Stunner' InstantHitDamage(DEFAULT_FIREMODE)=60.0 //65.0 InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HRG_Stunner' PenetrationPower(DEFAULT_FIREMODE)=2.0 diff --git a/KFGameContent/Classes/KFWeap_Rifle_ParasiteImplanter.uc b/KFGameContent/Classes/KFWeap_Rifle_ParasiteImplanter.uc index 2ba54ea..3f1966a 100644 --- a/KFGameContent/Classes/KFWeap_Rifle_ParasiteImplanter.uc +++ b/KFGameContent/Classes/KFWeap_Rifle_ParasiteImplanter.uc @@ -334,7 +334,7 @@ defaultproperties // Zooming/Position PlayerViewOffset=(X=3.0,Y=8,Z=-1.8) //IronSightPosition=(X=0,Y=-0.07,Z=1.03) - IronSightPosition=(X=0,Y=-0.115,Z=1.0425) + IronSightPosition=(X=0,Y=-0.09,Z=1.042) // AI warning system bWarnAIWhenAiming=true diff --git a/KFGameContent/Classes/KFWeap_Shotgun_Nailgun.uc b/KFGameContent/Classes/KFWeap_Shotgun_Nailgun.uc index 2b72c62..ce53b60 100644 --- a/KFGameContent/Classes/KFWeap_Shotgun_Nailgun.uc +++ b/KFGameContent/Classes/KFWeap_Shotgun_Nailgun.uc @@ -136,7 +136,7 @@ defaultproperties WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Nail_Nailgun' InstantHitDamage(DEFAULT_FIREMODE)=35 InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_NailShotgun' - Spread(DEFAULT_FIREMODE)=0.13 //0.16 + Spread(DEFAULT_FIREMODE)=0.16 PenetrationPower(DEFAULT_FIREMODE)=3.0 FireInterval(DEFAULT_FIREMODE)=0.3 // 200 RPM FireOffset=(X=30,Y=5,Z=-4)