diff --git a/CombinedCD2/Classes/CD_ChatCommander.uc b/CombinedCD2/Classes/CD_ChatCommander.uc index 46b0c24..1c414ce 100644 Binary files a/CombinedCD2/Classes/CD_ChatCommander.uc and b/CombinedCD2/Classes/CD_ChatCommander.uc differ diff --git a/CombinedCD2/Classes/CD_PickupQueryHandler.uc b/CombinedCD2/Classes/CD_PickupQueryHandler.uc new file mode 100644 index 0000000..69aa8c1 --- /dev/null +++ b/CombinedCD2/Classes/CD_PickupQueryHandler.uc @@ -0,0 +1,79 @@ +class CD_PickupQueryHandler extends Object + within CD_Survival; + +var private CD_DroppedPickup CDDP; +var private KFWeapon Weap; +var private CD_PlayerController CDPC; +var private CD_Pawn_Human Player; +var private class WeapDefClass; + +public function Initialize(Pawn OwnerPawn, Actor Pickup) +{ + CDDP = CD_DroppedPickup(Pickup); + Weap = KFWeapon(CDDP.Inventory); + WeapDefClass = class(Weap.class.default.InstantHitDamageTypes[3]).default.WeaponDef; + + CDPC = CD_PlayerController(OwnerPawn.Controller); + Player = CD_Pawn_Human(OwnerPawn); +} + +public function bool PickupQuery(optional bool bIgnoreDualQuery) +{ + if(CDDP == none || Weap == none || CDPC == none || Player == none || WeapDefClass == none) + { + return true; + } + + return ( bIgnoreDualQuery || DualQuery() ) && LowAmmoQuery() && OthersQuery(); +} + +private function bool DualQuery() +{ + return !( Outer.MyKFGRI.bTraderIsOpen && CDPC.bDisableDual && Player.IsGonnaBeDual(Weap) ); +} + +private function bool LowAmmoQuery() +{ + return !( Outer.MyKFGRI.bWaveIsActive && IsDisableLowAmmo() && CDDP.IsLowAmmo() ); +} + +private function bool OthersQuery() +{ + return !( CDDP.OriginalOwner != Player.PlayerReplicationInfo && IsUnobtainableOthers() ); +} + +private function bool IsDisableLowAmmo() +{ + local int index; + local PlayerReplicationInfo PRI; + PRI = Player.PlayerReplicationinfo; + + index = Outer.PickupSettings.Find('PRI', PRI); + + if(index != INDEX_NONE) + { + return Outer.PickupSettings[index].DisableLowAmmo; + } + + return false; +} + +private function bool IsUnobtainableOthers() +{ + local bool bLocked; + local bool bDisableOthers; + local bool bAuthorized; + local int registryIndex, settingIndex; + local PlayerReplicationinfo PRI; + PRI = Player.PlayerReplicationinfo; + + registryIndex = Outer.PickupTracker.WeaponPickupRegistry.Find('KFDP', CDDP); + bLocked = (registryIndex != INDEX_NONE && Outer.PickupTracker.WeaponPickupRegistry[registryIndex].bLocked); + + settingIndex = Outer.PickupSettings.Find('PRI', PRI); + bDisableOthers = (settingIndex != INDEX_NONE && Outer.PickupSettings[settingIndex].DisableOthers); + + bAuthorized = CDPC.IsAllowedWeapon(WeapDefClass, true, false); + + return (bLocked || bDisableOthers || !bAuthorized); +} \ No newline at end of file diff --git a/CombinedCD2/Classes/CD_PlayerController.uc b/CombinedCD2/Classes/CD_PlayerController.uc index 8bdc000..75867d9 100644 Binary files a/CombinedCD2/Classes/CD_PlayerController.uc and b/CombinedCD2/Classes/CD_PlayerController.uc differ diff --git a/CombinedCD2/Classes/CD_SettingManager.uc b/CombinedCD2/Classes/CD_SettingManager.uc new file mode 100644 index 0000000..cb42915 --- /dev/null +++ b/CombinedCD2/Classes/CD_SettingManager.uc @@ -0,0 +1,207 @@ +class CD_SettingManager extends Object; + +var CD_DynamicSetting + BossHPFakesSetting, + CohortSizeSetting, + WaveSizeFakesSetting, + FleshpoundHPFakesSetting, + QuarterPoundHPFakesSetting, + MaxMonstersSetting, + SpawnPollSetting, + ScrakeHPFakesSetting, + SpawnModSetting, + TrashHPFakesSetting, + ZTSpawnSlowdownSetting; + +var CD_BasicSetting + AlbinoAlphasSetting, + AlbinoCrawlersSetting, + AlbinoGorefastsSetting, + AutoPauseSetting, + BossSetting, + CountHeadshotsPerPelletSetting, + FleshpoundRageSpawnsSetting, + SpawnCycleSetting, + TraderTimeSetting, + EnableReadySystemSetting, + ZedsTeleportCloserSetting, + ZTSpawnModeSetting, + StartwithFullAmmoSetting, + StartwithFullGrenadeSetting, + StartwithFullArmorSetting, + StartingWeaponTierSetting, + BossDifficultySetting, + DisableBossMinionsSetting, + DisableSpawnersSetting, + DisableRobotsSetting, + DisableBossSetting; + +var array DynamicSettings; +var array BasicSettings; +var array AllSettings; + +public function Initialize(CD_Survival OuterClass, string Options) +{ + SetupBasicSettings(OuterClass); + SetupDynamicSettings(OuterClass); + SortAllSettingsByName(); + ParseCDGameOptions( Options ); +} + +private function SortAllSettingsByName() +{ + AllSettings.sort(SettingNameComparator); +} + +private function int SettingNameComparator( CD_Setting a, CD_Setting b ) +{ + local string an, bn; + + an = a.GetOptionName(); + bn = b.GetOptionName(); + + if ( an < bn ) + { + return 1; + } + else if ( an > bn ) + { + return -1; + } + return 0; +} + +private function SetupBasicSettings(CD_Survival OuterClass) +{ + AlbinoAlphasSetting = new(OuterClass) class'CD_BasicSetting_AlbinoAlphas'; + RegisterBasicSetting( AlbinoAlphasSetting ); + + AlbinoCrawlersSetting = new(OuterClass) class'CD_BasicSetting_AlbinoCrawlers'; + RegisterBasicSetting( AlbinoCrawlersSetting ); + + AlbinoGorefastsSetting = new(OuterClass) class'CD_BasicSetting_AlbinoGorefasts'; + RegisterBasicSetting( AlbinoGorefastsSetting ); + + AutoPauseSetting = new(OuterClass) class'CD_BasicSetting_AutoPause'; + RegisterBasicSetting( AutoPauseSetting ); + + BossSetting = new(OuterClass) class'CD_BasicSetting_Boss'; + RegisterBasicSetting( BossSetting ); + + BossDifficultySetting = new(OuterClass) class'CD_BasicSetting_BossDifficulty'; + RegisterBasicSetting( BossDifficultySetting ); + + CountHeadshotsPerPelletSetting = new(OuterClass) class'CD_BasicSetting_CountHeadshotsPerPellet'; + RegisterBasicSetting( CountHeadshotsPerPelletSetting ); + + DisableBossSetting = new(OuterClass) class'CD_BasicSetting_DisableBoss'; + RegisterBasicSetting( DisableBossSetting ); + + DisableBossMinionsSetting = new(OuterClass) class'CD_BasicSetting_DisableBossMinions'; + RegisterBasicSetting( DisableBossMinionsSetting ); + + DisableRobotsSetting = new(OuterClass) class'CD_BasicSetting_DisableRobots'; + RegisterBasicSetting( DisableRobotsSetting ); + + DisableSpawnersSetting = new(OuterClass) class'CD_BasicSetting_DisableSpawners'; + RegisterBasicSetting( DisableSpawnersSetting ); + + EnableReadySystemSetting = new(OuterClass) class'CD_BasicSetting_EnableReadySystem'; + RegisterBasicSetting( EnableReadySystemSetting ); + + FleshpoundRageSpawnsSetting = new(OuterClass) class'CD_BasicSetting_FleshpoundRageSpawns'; + RegisterBasicSetting( FleshpoundRageSpawnsSetting ); + + StartingWeaponTierSetting = new(OuterClass) class'CD_BasicSetting_StartingWeaponTier'; + RegisterBasicSetting( StartingWeaponTierSetting ); + + StartwithFullAmmoSetting = new(OuterClass) class'CD_BasicSetting_StartwithFullAmmo'; + RegisterBasicSetting( StartwithFullAmmoSetting ); + + StartwithFullArmorSetting = new(OuterClass) class'CD_BasicSetting_StartwithFullArmor'; + RegisterBasicSetting( StartwithFullArmorSetting ); + + StartwithFullGrenadeSetting = new(OuterClass) class'CD_BasicSetting_StartwithFullGrenade'; + RegisterBasicSetting( StartwithFullGrenadeSetting ); + + SpawnCycleSetting = new(OuterClass) class'CD_BasicSetting_SpawnCycle'; + RegisterBasicSetting( SpawnCycleSetting ); + + TraderTimeSetting = new(OuterClass) class'CD_BasicSetting_TraderTime'; + RegisterBasicSetting( TraderTimeSetting ); + + ZedsTeleportCloserSetting = new(OuterClass) class'CD_BasicSetting_ZedsTeleportCloser'; + RegisterBasicSetting( ZedsTeleportCloserSetting ); + + ZTSpawnModeSetting = new(OuterClass) class'CD_BasicSetting_ZTSpawnMode'; + RegisterBasicSetting( ZTSpawnModeSetting ); +} + +private function SetupDynamicSettings(CD_Survival OuterClass) +{ + BossHPFakesSetting = new(OuterClass) class'CD_DynamicSetting_BossHPFakes'; + BossHPFakesSetting.IniDefsArray = OuterClass.BossHPFakesDefs; + RegisterDynamicSetting( BossHPFakesSetting ); + + CohortSizeSetting = new(OuterClass) class'CD_DynamicSetting_CohortSize'; + CohortSizeSetting.IniDefsArray = OuterClass.CohortSizeDefs; + RegisterDynamicSetting( CohortSizeSetting ); + + WaveSizeFakesSetting = new(OuterClass) class'CD_DynamicSetting_WaveSizeFakes'; + WaveSizeFakesSetting.IniDefsArray = OuterClass.WaveSizeFakesDefs; + RegisterDynamicSetting( WaveSizeFakesSetting ); + + MaxMonstersSetting = new(OuterClass) class'CD_DynamicSetting_MaxMonsters'; + MaxMonstersSetting.IniDefsArray = OuterClass.MaxMonstersDefs; + RegisterDynamicSetting( MaxMonstersSetting ); + + SpawnModSetting = new(OuterClass) class'CD_DynamicSetting_SpawnMod'; + SpawnModSetting.IniDefsArray = OuterClass.SpawnModDefs; + RegisterDynamicSetting( SpawnModSetting ); + + SpawnPollSetting = new(OuterClass) class'CD_DynamicSetting_SpawnPoll'; + SpawnPollSetting.IniDefsArray = OuterClass.SpawnPollDefs; + RegisterDynamicSetting( SpawnPollSetting ); + + ScrakeHPFakesSetting = new(OuterClass) class'CD_DynamicSetting_ScrakeHPFakes'; + ScrakeHPFakesSetting.IniDefsArray = OuterClass.ScrakeHPFakesDefs; + RegisterDynamicSetting( ScrakeHPFakesSetting ); + + FleshpoundHPFakesSetting = new(OuterClass) class'CD_DynamicSetting_FleshpoundHPFakes'; + FleshpoundHPFakesSetting.IniDefsArray = OuterClass.FleshpoundHPFakesDefs; + RegisterDynamicSetting( FleshpoundHPFakesSetting ); + + QuarterPoundHPFakesSetting = new(OuterClass) class'CD_DynamicSetting_QuarterPoundHPFakes'; + QuarterPoundHPFakesSetting.IniDefsArray = OuterClass.QuarterPoundHPFakesDefs; + RegisterDynamicSetting( QuarterPoundHPFakesSetting ); + + TrashHPFakesSetting = new(OuterClass) class'CD_DynamicSetting_TrashHPFakes'; + TrashHPFakesSetting.IniDefsArray = OuterClass.TrashHPFakesDefs; + RegisterDynamicSetting( TrashHPFakesSetting ); + + ZTSpawnSlowdownSetting = new(OuterClass) class'CD_DynamicSetting_ZTSpawnSlowdown'; + ZTSpawnSlowdownSetting.IniDefsArray = OuterClass.ZTSpawnSlowdownDefs; + RegisterDynamicSetting( ZTSpawnSlowdownSetting ); +} + +private function RegisterBasicSetting( const out CD_BasicSetting BasicSetting ) +{ + BasicSettings.AddItem( BasicSetting ); + AllSettings.AddItem( BasicSetting ); +} + +private function RegisterDynamicSetting( const out CD_DynamicSetting DynamicSetting ) +{ + DynamicSettings.AddItem( DynamicSetting ); + AllSettings.AddItem( DynamicSetting ); +} + +private function ParseCDGameOptions( const out string Options ) +{ + local int i; + + for ( i = 0; i < AllSettings.Length; i++ ) + { + AllSettings[i].InitFromOptions( Options ); + } +} \ No newline at end of file diff --git a/CombinedCD2/Classes/CD_SettingSynchronizer.uc b/CombinedCD2/Classes/CD_SettingSynchronizer.uc new file mode 100644 index 0000000..511afd6 --- /dev/null +++ b/CombinedCD2/Classes/CD_SettingSynchronizer.uc @@ -0,0 +1,54 @@ +class CD_SettingSynchronizer extends Object + within CD_Survival; + +// Perk, skill, weapon, auth level +public function SynchSettings(CD_PlayerController CDPC) +{ + local CD_PerkInfo PerkRestriction; + local CD_SkillInfo SkillRestriction; + local CD_WeaponInfo WeaponRestriction; + + CDPC.ResetSettings(); + CDPC.ReceiveAuthority(Outer.AuthorityHandler.GetAuthorityLevel(CDPC)); + CDPC.GetCDPRI().AuthorityLevel = Outer.AuthorityHandler.GetAuthorityLevel(CDPC); + CDPC.ReceiveLevelRestriction(Outer.AuthorityHandler.bRequireLv25); + CDPC.ReceiveAntiOvercap(Outer.AuthorityHandler.bAntiOvercap); + + foreach Outer.AuthorityHandler.PerkRestrictions(PerkRestriction) + { + CDPC.ReceivePerkRestrictions(PerkRestriction); + } + + foreach Outer.AuthorityHandler.SkillRestrictions(SkillRestriction) + { + CDPC.ReceiveSkillRestrictions(SkillRestriction); + } + + foreach Outer.AuthorityHandler.WeaponRestrictions(WeaponRestriction) + { + CDPC.ReceiveWeaponRestrictions(WeaponRestriction); + } + + CDPC.SynchFinished(); +} + +public function ResynchSettings() +{ + local CD_PlayerController CDPC; + + foreach Outer.WorldInfo.AllControllers(class'CD_PlayerController', CDPC) + { + SynchSettings(CDPC); + } +} + +public function SendAuthList(CD_PlayerController CDPC) +{ + local int i; + + for(i=0; i 0.f && ZTSpawnSlowdownFloat > 1.f ) + { + if ( ZedTimeRemaining < ZedTimeBlendOutTime ) + { + // if zed time is running out, interpolate between [1.0, ZTSS] using the same lerp-alpha-factor that TickZedTime uses + // When zed time first starts to fade, we will use a divisor slightly less than ZTSS + // When zed time is on the last tick before it is completely over, we will use a divisor slightly more than 1.0 + // IOW, the divisor decreases towards one as zed time fades out + // See TickZedTime in KFGameInfo for background + SlowDivisor = Lerp(1.0, ZTSpawnSlowdownFloat, ZedTimeRemaining / ZedTimeBlendOutTime); + } + else + { + // if zed time is going strong, just use ZTSS + SlowDivisor = ZTSpawnSlowdownFloat; + } + + LocalDilation = LocalDilation / SlowDivisor; + + `cdlog("SpawnManagerWakeup's slowed clockwork timedilation: " $ LocalDilation $ " (ZTSS=" $ SlowDivisor $ ")", Outer.bLogControlledDifficulty); + } + else + { + `cdlog("SpawnManagerWakeup's realtime clockwork timedilation: " $ LocalDilation, Outer.bLogControlledDifficulty); + } + + Outer.ModifyTimerTimeDilation('SpawnManagerWakeup', LocalDilation, self); +} + +private function SpawnManagerWakeup() +{ + if ( Outer.SpawnManager != none ) + { + Outer.SpawnManager.Update(); + } +} \ No newline at end of file diff --git a/CombinedCDContent/Classes/CD_TimeAttack.uc b/CombinedCDContent/Classes/CD_TimeAttack.uc deleted file mode 100644 index 23a288c..0000000 --- a/CombinedCDContent/Classes/CD_TimeAttack.uc +++ /dev/null @@ -1,101 +0,0 @@ -class CD_TimeAttack extends CD_Survival - config( CombinedCDContent ); - -var byte ActualWaveNum; - -function StartMatch() -{ - ActualWaveNum = 0; - - super.StartMatch(); - - SpawnManager.bTemporarilyEndless = true; - MyKFGRI.bWaveIsEndless = true; - SetTimer(180.f, false, 'EndCurrentWave'); -} - -state TraderOpen -{ - local KFPlayerController KFPC; - - function BeginState(name PreviousStateName) - { - MyKFGRI.SetWaveActive(false, GetGameIntensityForMusic()); - - ForEach WorldInfo.AllControllers(class'KFPlayerController', KFPC) - { - if( KFPC.GetPerk() != none ) - { - KFPC.GetPerk().OnWaveEnded(); - } - KFPC.ApplyPendingPerks(); - } - - StartHumans(); - - OpenTrader(); - - if ( AllowBalanceLogging() ) - { - LogPlayersDosh(GBE_TraderOpen); - } - - SetTimer(TimeBetweenWaves, false, nameof(CloseTraderTimer)); - } - - function EndState(name NextStateName) - { - StartHumans(); - super.EndState(NextStateName); - SetTimer(180.f, false, 'EndCurrentWave'); - } -} - -function WaveEnded( EWaveEndCondition WinCondition ) -{ - local string CDSettingChangeMessage; - - if(WinCondition == WEC_TeamWipedOut) - SaveFinalSettings(); - - super(KFGameInfo_Survival).WaveEnded( WinCondition ); - - if ( ApplyStagedConfig( CDSettingChangeMessage, "Staged settings applied:" ) ) - { - BroadcastCDEcho( CDSettingChangeMessage ); - RefleshWebInfo(); - } -} - -function StartWave() -{ - ActualWaveNum++; - if(WaveNum == 10) - { - WaveNum = 9; - MyKFGRI.WaveNum = ActualWaveNum; - } - - super.StartWave(); -} - -exec function EndCurrentWave() -{ - ClearTimer('EndCurrentWave'); - WaveEnded(WEC_WaveWon); -} - -exec function SetWave(byte NewWaveNum) -{ - return; -} - -exec function WinMatch() -{ - return; -} - -defaultproperties -{ - DifficultyInfoClass=class'CombinedCDContent.CD_DifficultyInfo_TimeAttack' -} \ No newline at end of file diff --git a/CombinedCDContent/Classes/UTestMode.uc b/CombinedCDContent/Classes/UTestMode.uc index 2bf90f0..f4f4513 100644 --- a/CombinedCDContent/Classes/UTestMode.uc +++ b/CombinedCDContent/Classes/UTestMode.uc @@ -85,7 +85,7 @@ event PostBeginPlay() MySTMGRI.bLargeLess = bLargeLess; MYSTMGRI.bHSOnly = bHSOnly; MySTMGRI.nFakedPlayers = ZedHPFakes; - RefleshWebInfo(); + RefreshWebInfo(); bNVBlockDramatic = bDisableZedTime; // an variable called in DramaEvent() SaveConfig(); @@ -428,7 +428,7 @@ function MaintainTrashChallenge() MaxMonstersInt += 4; MaxMonsters = string(MaxMonstersInt); - RefleshWebInfo(); + RefreshWebInfo(); if(MaxMonstersInt < 32) SetTimer(30.f, false, 'MaintainTrashChallenge'); @@ -465,7 +465,7 @@ exec function DisableRespawn(bool bDisable) bDisableRespawn = bDisable; } -function RefleshWebInfo() +function RefreshWebInfo() { MySTMGRI.CDInfoParams.SC = SpawnCycle; MySTMGRI.CDInfoParams.MM = MaxMonsters; @@ -483,7 +483,7 @@ function SetParams(CD_PlayerController CDPC, string S) { ChatCommander.RunCDChatCommandIfAuthorized(CDPC, S); SaveConfig(); - RefleshWebInfo(); + RefreshWebInfo(); } function ModTraderDash(bool bDash){ return; }