diff --git a/KFGame/Classes/KFAffliction_Shrink.uc b/KFGame/Classes/KFAffliction_Shrink.uc index 58ee778..0c893fa 100644 --- a/KFGame/Classes/KFAffliction_Shrink.uc +++ b/KFGame/Classes/KFAffliction_Shrink.uc @@ -163,7 +163,7 @@ function KillOwner() defaultproperties { - DissipationRate=10 //20 + DissipationRate=200 //20 bNeedsTick=true MaxEffect=10.f; @@ -171,7 +171,7 @@ defaultproperties EffectAppliedByStack=1.0f ApplyEffectVel=100.0f // % per second - RemoveEffectVel=0.5f // % per second + RemoveEffectVel=0.25f // % per second CurrentEffect=0.0f CurrentEffectApplied=0.0f diff --git a/KFGame/Classes/KFGFxHUD_ObjectiveConatiner.uc b/KFGame/Classes/KFGFxHUD_ObjectiveConatiner.uc index 0ce5e92..23b8349 100644 --- a/KFGame/Classes/KFGFxHUD_ObjectiveConatiner.uc +++ b/KFGame/Classes/KFGFxHUD_ObjectiveConatiner.uc @@ -198,14 +198,6 @@ function TickHud(float DeltaTime) local int bStatusWarning, bStatusNotification; local string StatusMessage; local GFxObject DataObject; - local KFGameReplicationInfo KFGRI; - - KFGRI=KFGameReplicationInfo(KFPC.WorldInfo.GRI); - - if (KFGRI.IsContaminationMode()) - { - return; - } if (CurrentObjectiveInterface != none) { diff --git a/KFGame/Classes/KFGFxMoviePlayer_HUD.uc b/KFGame/Classes/KFGFxMoviePlayer_HUD.uc index c1bdbd8..f11a5a0 100644 --- a/KFGame/Classes/KFGFxMoviePlayer_HUD.uc +++ b/KFGame/Classes/KFGFxMoviePlayer_HUD.uc @@ -518,14 +518,17 @@ function TickHud(float DeltaTime) { bBountyHuntVisibility = KFPC.CanUseBountyHunt(); - if (KFGRI.bWaveIsActive == false) + if (KFGRI != none) { - bBountyHuntVisibility = false; + if (KFGRI.bWaveIsActive == false) + { + bBountyHuntVisibility = false; + } + else if (KFGRI.WaveNum == KFGRI.WaveMax) + { + bBountyHuntVisibility = false; + } } - else if (KFGRI.WaveNum == KFGRI.WaveMax) - { - bBountyHuntVisibility = false; - } if (bBountyHuntVisibility != bLastBountyHuntVisibility) { diff --git a/KFGame/Classes/KFGameInfo.uc b/KFGame/Classes/KFGameInfo.uc index ba6c3af..d2863c3 100644 --- a/KFGame/Classes/KFGameInfo.uc +++ b/KFGame/Classes/KFGameInfo.uc @@ -684,8 +684,6 @@ event InitGame( string Options, out string ErrorMessage ) KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(KFGameEngine(class'Engine'.static.GetEngine()).GetIntendedWeeklyEventIndex()); } - `Log("TEST - InitGame : " $WeeklySelectorIndex); - Super.InitGame( Options, ErrorMessage ); if (UsesModifiedDifficulty()) @@ -1182,8 +1180,6 @@ function InitGRIVariables() MyKFGRI.NotifyAllowSeasonalSkins(AllowSeasonalSkinsIndex); MyKFGRI.NotifyWeeklySelector(WeeklySelectorIndex); - `Log("TEST - InitGRIVariables- NotifyWeeklySelector : " $WeeklySelectorIndex); - SetBossIndex(); } diff --git a/KFGame/Classes/KFGameReplicationInfo.uc b/KFGame/Classes/KFGameReplicationInfo.uc index 24b32c8..1f138b6 100644 --- a/KFGame/Classes/KFGameReplicationInfo.uc +++ b/KFGame/Classes/KFGameReplicationInfo.uc @@ -2321,8 +2321,6 @@ simulated function NotifyWeeklySelector(int WeeklySelectorIndex_) WeeklySelectorIndex = WeeklySelectorIndex_; bNetDirty = true; - - `Log("TEST - NotifyWeeklySelector : " $WeeklySelectorIndex); } /** VIP weekly */ diff --git a/KFGame/Classes/KFInventoryManager.uc b/KFGame/Classes/KFInventoryManager.uc index 52f1cc7..4004587 100644 --- a/KFGame/Classes/KFInventoryManager.uc +++ b/KFGame/Classes/KFInventoryManager.uc @@ -1945,8 +1945,9 @@ simulated function final BuyAmmo( float AmountPurchased, EItemType ItemType, opt { local STraderItem WeaponItem; local KFWeapon KFW; - local byte MagAmmoCount; + local int MagAmmoCount; + // Keep 255 because what else? MagAmmoCount = 255; if ( ItemType == EIT_Weapon ) @@ -1973,7 +1974,7 @@ simulated function final BuyAmmo( float AmountPurchased, EItemType ItemType, opt } /** Receive weapon ammo */ -reliable server final private function ServerBuyAmmo(int AmountPurchased, byte ClientAmmoCount, byte ItemIndex, bool bSecondaryAmmo) +reliable server final private function ServerBuyAmmo(int AmountPurchased, int ClientAmmoCount, byte ItemIndex, bool bSecondaryAmmo) { local STraderItem WeaponItem; local KFWeapon KFW; diff --git a/KFGame/Classes/KFMedicWeaponComponent.uc b/KFGame/Classes/KFMedicWeaponComponent.uc index 882e96d..463b575 100644 --- a/KFGame/Classes/KFMedicWeaponComponent.uc +++ b/KFGame/Classes/KFMedicWeaponComponent.uc @@ -144,8 +144,8 @@ function StartHealRecharge() if (Role == ROLE_Authority) { InstigatorPerk = KFW.GetPerk(); - UsedHealRechargeTime = - HealFullRechargeSeconds * KFW.static.GetUpgradeHealRechargeMod(KFW.CurrentWeaponUpgradeIndex); + UsedHealRechargeTime = HealFullRechargeSeconds; + UsedHealRechargeTime *= KFW.static.GetUpgradeHealRechargeMod(KFW.CurrentWeaponUpgradeIndex); InstigatorPerk.ModifyHealerRechargeTime(UsedHealRechargeTime); HealRechargePerSecond = KFW.MagazineCapacity[ALTFIRE_FIREMODE] / UsedHealRechargeTime; diff --git a/KFGame/Classes/KFOnlineStatsWrite.uc b/KFGame/Classes/KFOnlineStatsWrite.uc index d217a03..5a329f5 100644 --- a/KFGame/Classes/KFOnlineStatsWrite.uc +++ b/KFGame/Classes/KFOnlineStatsWrite.uc @@ -1130,7 +1130,7 @@ private event AddToHitsGiven(class DT) private event AddToKills( class MonsterClass, byte Difficulty, class DT, bool bKiller ) { // seasonal event hook - SeasonalEventStats_OnZedKilled(MonsterClass, Difficulty, DT); + SeasonalEventStats_OnZedKilled(MonsterClass, Difficulty, DT, bKiller); if (!bKiller) { @@ -1878,11 +1878,11 @@ final simulated function SeasonalEventStats_OnHitGiven(class DT) } } -final simulated function SeasonalEventStats_OnZedKilled(class MonsterClass, int Difficulty, class DT) +final simulated function SeasonalEventStats_OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { if (SeasonalEventIsValid()) { - SeasonalEvent.OnZedKilled(MonsterClass, Difficulty, DT); + SeasonalEvent.OnZedKilled(MonsterClass, Difficulty, DT, bKiller); } } diff --git a/KFGame/Classes/KFOutbreakEvent.uc b/KFGame/Classes/KFOutbreakEvent.uc index ad9cf1d..900c0f1 100644 --- a/KFGame/Classes/KFOutbreakEvent.uc +++ b/KFGame/Classes/KFOutbreakEvent.uc @@ -656,7 +656,7 @@ var WeeklyOverrides ActiveEvent; /** Stored values of World Info and GRI items incase we need to reset it. */ var CachedOutbreakInfo CachedItems; -function int SetActiveEvent(int ActiveEventIdx, KFGameInfo GameInfo) +function int SetActiveEvent(int ActiveEventIdx, optional KFGameInfo GameInfoForWeeklyIndex = none) { `if(`notdefined(ShippingPC)) local string LocalURL; @@ -667,17 +667,21 @@ function int SetActiveEvent(int ActiveEventIdx, KFGameInfo GameInfo) LocalURL = WorldInfo.GetLocalURL(); LocalURL = Split(LocalURL, "?"); //remove map name - if (GameInfo.WeeklySelectorIndex == -1) // WeeklySelectorIndex overrides the ActiveEventIdx if any + // WeeklySelectorIndex overrides the ActiveEventIdx if any + if (GameInfoForWeeklyIndex == none || GameInfoForWeeklyIndex.WeeklySelectorIndex == -1) { ActiveEventIdx = GetIntOption(LocalURL, "ActiveEventIdx", ActiveEventIdx); // Set WeeklySelectorIndex to the value (ActiveEventIdx is not replicated), so all the flow of the game works the same - GameInfo.WeeklySelectorIndex = ActiveEventIdx + 1; + if (GameInfoForWeeklyIndex != none) + { + GameInfoForWeeklyIndex.WeeklySelectorIndex = ActiveEventIdx + 1; + } } - else if (GameInfo.WeeklySelectorIndex > 0) + else if (GameInfoForWeeklyIndex != none && GameInfoForWeeklyIndex.WeeklySelectorIndex > 0) { // 0 is default, we move one index to the left so it matches first Weekly Mode - ActiveEventIdx = GameInfo.WeeklySelectorIndex - 1; + ActiveEventIdx = GameInfoForWeeklyIndex.WeeklySelectorIndex - 1; } //If our override is out of bounds, see if it's a valid test event @@ -694,10 +698,10 @@ function int SetActiveEvent(int ActiveEventIdx, KFGameInfo GameInfo) ActiveEvent = SetEvents[ActiveEventIdx]; } `else - if (GameInfo.WeeklySelectorIndex > 0) + if (GameInfoForWeeklyIndex != none && GameInfoForWeeklyIndex.WeeklySelectorIndex > 0) { // 0 is default, we move one index to the left so it matches first Weekly Mode - ActiveEventIdx = GameInfo.WeeklySelectorIndex - 1; + ActiveEventIdx = GameInfoForWeeklyIndex.WeeklySelectorIndex - 1; } if(ActiveEventIdx < SetEvents.length) @@ -706,9 +710,11 @@ function int SetActiveEvent(int ActiveEventIdx, KFGameInfo GameInfo) } `endif - `Log("TEST - SetActiveEvent : " $ActiveEventIdx); - - KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(ActiveEventIdx); + // Override this only if we can force a new index via GameInfo + if (GameInfoForWeeklyIndex != none) + { + KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(ActiveEventIdx); + } return ActiveEventIdx; } diff --git a/KFGame/Classes/KFPerk.uc b/KFGame/Classes/KFPerk.uc index 2557691..bf25ecc 100644 --- a/KFGame/Classes/KFPerk.uc +++ b/KFGame/Classes/KFPerk.uc @@ -1316,7 +1316,6 @@ native function bool CanRepairDoors(); function bool RepairArmor( Pawn HealTarget ); function bool IsToxicDmgActive() { return false; } static function class GetToxicDmgTypeClass(){ return default.ToxicDmgTypeClass; } -static function float GetHealRechargeMod(); static function ModifyToxicDmg( out int ToxicDamage ); simulated function float GetSirenScreamStrength(){ return 1.f; } simulated function bool IsHealingSurgeActive(){ return false; } @@ -1327,7 +1326,7 @@ simulated function bool GetHealingShieldActive(){ return false; } simulated function bool IsZedativeActive(){ return false; } function bool CouldBeZedToxicCloud( class KFDT ){ return false; } function ToxicCloudExplode( Controller Killer, Pawn ZedKilled ); - +simulated function float GetDartAmmoCostModifier() { return 1.0f; } /** Firebug functions */ simulated function bool IsFlarotovActive(){ return false; } diff --git a/KFGame/Classes/KFPerk_FieldMedic.uc b/KFGame/Classes/KFPerk_FieldMedic.uc index 12197b8..a527d03 100644 --- a/KFGame/Classes/KFPerk_FieldMedic.uc +++ b/KFGame/Classes/KFPerk_FieldMedic.uc @@ -47,6 +47,7 @@ var int ZedativeDamage; var class ZedativeDamageType; var class ZedativeHealingType; var int ZedativeEffectRadius; +var float DartAmmoCostModifier; enum EMedicPerkSkills { @@ -324,11 +325,6 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau InDamage = Round(TempDamage); } -static function float GetHealRechargeMod() -{ - return GetSkillValue( default.PerkSkills[EMedicAcidicCompound] ); -} - /** Takes the weapons primary damage and calculates the poisoning over time value */ /** * @brief Takes the weapons primary damage and calculates the bleeding over time value @@ -339,7 +335,7 @@ static function ModifyToxicDmg( out int ToxicDamage ) { local float TempDamage; - TempDamage = float(ToxicDamage) * GetHealRechargeMod(); + TempDamage = float(ToxicDamage) * GetSkillValue( default.PerkSkills[EMedicAcidicCompound] ); ToxicDamage = FCeil( TempDamage ); } @@ -588,6 +584,14 @@ static function float GetZedativeEffectRadius() return default.ZedativeEffectRadius; } +simulated function float GetDartAmmoCostModifier() +{ + if (IsAcidicCompoundActive()) + { + return DartAmmoCostModifier; + } + return Super.GetDartAmmoCostModifier(); +} /********************************************************************************************* * @name HUD / UI ********************************************************************************************* */ @@ -639,6 +643,7 @@ simulated function LogPerkSkills() } } + DefaultProperties { PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Medic' @@ -672,6 +677,8 @@ DefaultProperties ToxicDmgTypeClass=class'KFDT_Toxic_AcidicRounds' + DartAmmoCostModifier=0.8f + // explosion Begin Object Class=KFGameExplosion Name=ExploTemplate0 Damage=50 //50 diff --git a/KFGame/Classes/KFPerk_Support.uc b/KFGame/Classes/KFPerk_Support.uc index 86ebd4e..f3f469c 100644 --- a/KFGame/Classes/KFPerk_Support.uc +++ b/KFGame/Classes/KFPerk_Support.uc @@ -216,6 +216,8 @@ function ModifyDamageTaken( out int InDamage, optional class DamageT { TempDamage -= TempDamage * FortitudeDamageResistance; `QALog( "Fortitude Damage Resistance =" @ FortitudeDamageResistance, bLogPerk ); + + InDamage = Round(TempDamage); } } @@ -928,5 +930,5 @@ DefaultProperties AdditionalOnPerkDTNames(2)="KFDT_Ballistic_NailShotgun" FortitudeDamageResistance=0.1f - APDamageModifier=0.05f + APDamageModifier=0.1f } diff --git a/KFGame/Classes/KFPlayerController.uc b/KFGame/Classes/KFPlayerController.uc index fbea2b1..4aa6b36 100644 --- a/KFGame/Classes/KFPlayerController.uc +++ b/KFGame/Classes/KFPlayerController.uc @@ -1014,17 +1014,21 @@ reliable server event PushV() simulated function bool GetAllowSeasonalSkins() { local KFGameReplicationInfo KFGRI; - local bool bIsWWLWeekly, bIsAllowSeasonalSkins; // Situations that shouldn't allow seasonal overrides + local bool bIsWWLWeekly, bIsCastleVolter, bIsAllowSeasonalSkins; // Situations that shouldn't allow seasonal overrides KFGRI = KFGameReplicationInfo(WorldInfo.GRI); bIsWWLWeekly = KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12; + + bIsCastleVolter = Caps(WorldInfo.GetMapName(true)) == "KF-CASTLEVOLTER"; + bIsAllowSeasonalSkins = KFGRI != none && KFGRI.bAllowSeasonalSkins; - //`Log("GetAllowSeasonalSkins: AllowSeasonalSkins: "$bIsAllowSeasonalSkins$" WWLWeekly "$bIsWWLWeekly); - if(bIsWWLWeekly || bIsAllowSeasonalSkins == false) + + if(bIsWWLWeekly || bIsCastleVolter || bIsAllowSeasonalSkins == false) { return false; } + return true; } @@ -7255,8 +7259,12 @@ simulated event InitializeStats() local class StatsReadClass; local class StatsWriteClass; - if ( StatsRead == none && WorldInfo.NetMode != NM_DedicatedServer ) + `Log("InitializeStats()"); + + if ( ( StatsRead == none || StatsWrite == none ) && WorldInfo.NetMode != NM_DedicatedServer ) { + `Log("InitializeStats() - Create objects"); + // BWJ - 1-4-17 - Different stats read for dingo if( WorldInfo.IsConsoleBuild( CONSOLE_Durango ) ) { @@ -7638,7 +7646,23 @@ native reliable client private function ClientNotifyHitGiven(class D /** Kill stat */ function AddZedKill( class MonsterClass, byte Difficulty, class DT, bool bKiller ) { + local KFPlayerController KFPC; + ClientAddZedKill( MonsterClass, Difficulty, DT, bKiller ); + + if (bKiller) + { + foreach WorldInfo.AllControllers(class'KFPlayerController', KFPC) + { + if (KFPC != none + && KFPC != self + && KFPC.IsInState('Spectating') == false + && KFPC.PlayerReplicationInfo.bOnlySpectator == false) + { + KFPC.AddZedKill(MonsterClass, Difficulty, DT, false); + } + } + } } native reliable client private function ClientAddZedKill( class MonsterClass, byte Difficulty, class DT, bool bKiller ); @@ -7666,9 +7690,25 @@ function AddAfflictionCaused(EAfflictionType Type) } native reliable client private function ClientAddAfflictionCaused(EAfflictionType Type); -function AddCollectibleFound(int Limit) +function AddCollectibleFound(int Limit, optional bool bBroadcast = true) { + local KFPlayerController KFPC; + ClientAddCollectibleFound(Limit); + + if (bBroadcast) + { + foreach WorldInfo.AllControllers(class'KFPlayerController', KFPC) + { + if (KFPC != none + && KFPC != self + && KFPC.IsInState('Spectating') == false + && KFPC.PlayerReplicationInfo.bOnlySpectator == false) + { + KFPC.AddCollectibleFound(Limit, false); + } + } + } } native reliable client private function ClientAddCollectibleFound(int Limit); diff --git a/KFGame/Classes/KFSeasonalEventStats.uc b/KFGame/Classes/KFSeasonalEventStats.uc index 3c97b3e..2afd76d 100644 --- a/KFGame/Classes/KFSeasonalEventStats.uc +++ b/KFGame/Classes/KFSeasonalEventStats.uc @@ -68,7 +68,7 @@ final protected simulated function FinishedObjective(int EventIndex, int Objecti } simulated function OnMapObjectiveDeactivated(Actor ObjectiveInterfaceActor); -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT); +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller); simulated function OnZedKilledByHeadshot(class MonsterClass, int Difficulty, class DT); simulated function OnMapCollectibleFound(PlayerReplicationInfo FinderPRI, int CollectibleID); simulated event OnGameWon(class GameClass, int Difficulty, int GameLength, bool bCoOp); diff --git a/KFGame/Classes/KFWeapDef_FAMAS.uc b/KFGame/Classes/KFWeapDef_FAMAS.uc index a83d629..e85b5e7 100644 --- a/KFGame/Classes/KFWeapDef_FAMAS.uc +++ b/KFGame/Classes/KFWeapDef_FAMAS.uc @@ -15,7 +15,7 @@ defaultproperties { WeaponClassPath="KFGameContent.KFWeap_AssaultRifle_FAMAS" - BuyPrice=1200 + BuyPrice=1000 AmmoPricePerMag=25 SecondaryAmmoMagPrice=15 //13 diff --git a/KFGame/Classes/KFWeap_MedicBase.uc b/KFGame/Classes/KFWeap_MedicBase.uc index 999ed66..54262ff 100644 --- a/KFGame/Classes/KFWeap_MedicBase.uc +++ b/KFGame/Classes/KFWeap_MedicBase.uc @@ -214,6 +214,8 @@ simulated function AltFireMode() /** @see KFWeapon::ConsumeAmmo */ simulated function ConsumeAmmo( byte FireModeNum ) { + local KFPerk Perk; + local float DartAmmoCostModifier; // If its not the healing fire mode, return if( FireModeNum != ALTFIRE_FIREMODE ) { @@ -231,11 +233,14 @@ simulated function ConsumeAmmo( byte FireModeNum ) // If AmmoCount is being replicated, don't allow the client to modify it here if (Role == ROLE_Authority || bAllowClientAmmoTracking) { + Perk = GetPerk(); + DartAmmoCostModifier = Perk != none ? Perk.GetDartAmmoCostModifier() : 1.0f; + // Don't consume ammo if magazine size is 0 (infinite ammo with no reload) if (MagazineCapacity[1] > 0 && AmmoCount[1] > 0) { // Reduce ammo amount by heal ammo cost - AmmoCount[1] = Max(AmmoCount[1] - AmmoCost[1], 0); + AmmoCount[1] = Max(AmmoCount[1] - AmmoCost[1] * DartAmmoCostModifier, 0); } } } @@ -411,7 +416,6 @@ function StartHealRecharge() UsedHealRechargeTime = HealFullRechargeSeconds; UsedHealRechargeTime *= static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex); - UsedHealRechargeTime *= InstigatorPerk.GetHealRechargeMod(); InstigatorPerk.ModifyHealerRechargeTime( UsedHealRechargeTime ); // Set the healing recharge rate whenever we start charging diff --git a/KFGame/Classes/KFWeapon.uc b/KFGame/Classes/KFWeapon.uc index 04b034c..79a500c 100644 --- a/KFGame/Classes/KFWeapon.uc +++ b/KFGame/Classes/KFWeapon.uc @@ -4663,7 +4663,7 @@ function int AddSecondaryAmmo(int Amount) * * @param bAmmoSync - If performing a sync the lowest value is typically the most correct */ -reliable client function ClientForceAmmoUpdate(byte NewAmmoCount, int NewSpareAmmoCount, optional bool bAmmoSync) +reliable client function ClientForceAmmoUpdate(int NewAmmoCount, int NewSpareAmmoCount, optional bool bAmmoSync) { if ( Role < ROLE_Authority ) { @@ -6614,7 +6614,7 @@ simulated state WeaponFiring } } -unreliable server function SyncCurrentAmmoCount(byte FireMode, byte CurrentAmmoCount) +unreliable server function SyncCurrentAmmoCount(byte FireMode, int CurrentAmmoCount) { if(AmmoCount[FireMode] != CurrentAmmoCount) { diff --git a/KFGameContent/Classes/KFGameInfo_Endless.uc b/KFGameContent/Classes/KFGameInfo_Endless.uc index f800386..6f10f29 100644 --- a/KFGameContent/Classes/KFGameInfo_Endless.uc +++ b/KFGameContent/Classes/KFGameInfo_Endless.uc @@ -506,7 +506,7 @@ function ReduceDamage(out int Damage, Pawn Injured, Controller InstigatedBy, vec function StartOutbreakRound(int OutbreakIdx) { - OutbreakEvent.SetActiveEvent(OutbreakIdx, self); + OutbreakEvent.SetActiveEvent(OutbreakIdx); OutbreakEvent.UpdateGRI(); OutbreakEvent.SetWorldInfoOverrides(); diff --git a/KFGameContent/Classes/KFGameInfo_Survival.uc b/KFGameContent/Classes/KFGameInfo_Survival.uc index 0345fe4..aa6de75 100644 --- a/KFGameContent/Classes/KFGameInfo_Survival.uc +++ b/KFGameContent/Classes/KFGameInfo_Survival.uc @@ -51,7 +51,9 @@ var protected bool bGunGamePlayerOnLastGun; var transient array BonfireVolumes; // Trader Time modifier for Castle Volter map in the last round +var float CastleVolterTraderLastWaveModifier; var float CastleVolterTraderModifier; +var bool bIsCastleVolterMap; /** Whether this game mode should play music from the get-go (lobby) */ static function bool ShouldPlayMusicAtStart() @@ -77,6 +79,8 @@ event PostBeginPlay() { super.PostBeginPlay(); + bIsCastleVolterMap = Caps(WorldInfo.GetMapName(true)) == "KF-CASTLEVOLTER"; + TimeBetweenWaves = GetTraderTime(); bGunGamePlayerOnLastGun = false; @@ -1130,6 +1134,11 @@ function WaveStarted() UpdateGameSettings(); bWaveStarted = true; + + if (bIsCastleVolterMap) + { + TimeBetweenWaves = GetTraderTime(); + } } /** Do something when there are no AIs left */ @@ -1473,17 +1482,7 @@ function DoTraderTimeCleanup(); /** Handle functionality for opening trader */ function OpenTrader() { - local int UpdatedTimeBetweenWaves; - - UpdatedTimeBetweenWaves = TimeBetweenWaves; - - // In castle volter the trader needs to have a special time - if (WorldInfo.GetMapName(true) == "KF-CastleVolter" && WaveNum == (WaveMax - 1) ) - { - UpdatedTimeBetweenWaves = UpdatedTimeBetweenWaves * CastleVolterTraderModifier; - } - - MyKFGRI.OpenTrader(UpdatedTimeBetweenWaves); + MyKFGRI.OpenTrader(TimeBetweenWaves); NotifyTraderOpened(); } @@ -1929,6 +1928,27 @@ function ClearActorFromBonfire(Actor Other) } } +function float GetTraderTime() +{ + local float TraderTime; + TraderTime = Super.GetTraderTime(); + + // In castle volter the trader needs to have a special time + if (bIsCastleVolterMap) + { + if ( WaveNum == (WaveMax - 1) && !bIsEndlessGame ) + { + TraderTime *= CastleVolterTraderLastWaveModifier; + } + else + { + TraderTime *= CastleVolterTraderModifier; + } + } + + return TraderTime; +} + DefaultProperties { TimeBetweenWaves=60 //This is going to be a difficulty setting later @@ -1938,7 +1958,10 @@ DefaultProperties MaxGameDifficulty=3 bWaveStarted=false bGunGamePlayerOnLastGun=false - CastleVolterTraderModifier = 1.0f; + + CastleVolterTraderLastWaveModifier = 2.5f + CastleVolterTraderModifier = 1.17f + bIsCastleVolterMap = false; ObjectiveSpawnDelay=5 diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Fall2019.uc b/KFGameContent/Classes/KFSeasonalEventStats_Fall2019.uc index f51b73c..aabecb7 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Fall2019.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Fall2019.uc @@ -78,8 +78,13 @@ simulated event OnGameWon(class GameClass, int Difficulty, int GameLen } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { + if (bKiller == false) + { + return; + } + // kill 1500 zeds on asylum if (bObjectiveIsValidForMap[3] != 0) { @@ -107,4 +112,4 @@ defaultproperties { EndlessWaveRequired=15 ZedKillsRequired=1500 -} \ No newline at end of file +} diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Fall2020.uc b/KFGameContent/Classes/KFSeasonalEventStats_Fall2020.uc index 4ca4187..b13fced 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Fall2020.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Fall2020.uc @@ -44,10 +44,15 @@ private event GrantEventItems() } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { local int ObjIdx; + if (bKiller == false) + { + return; + } + // Kill 2000 zeds on any map ObjIdx = 0; if (bObjectiveIsValidForMap[ObjIdx] != 0) @@ -129,4 +134,4 @@ defaultproperties EndlessWaveRequired=15 PowerUpsRequired=10 FallEventIndex=SEI_Fall -} \ No newline at end of file +} diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Fall2023.uc b/KFGameContent/Classes/KFSeasonalEventStats_Fall2023.uc index e2a9019..b555fc9 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Fall2023.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Fall2023.uc @@ -116,23 +116,20 @@ simulated function OnTryCompleteObjective(int ObjectiveIndex, int EventIndex) } // Kill Hans Volter in 5 different maps -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { local int ObjIdx; local KFProfileSettings Profile; ObjIdx = 0; - if (Outer.IsEventObjectiveComplete(ObjIdx)) - { - return; - } - if (bObjectiveIsValidForMap[ObjIdx] != 0) { if (MonsterClass == class'KFPawn_ZedHansBase' || MonsterClass == class'KFPawn_ZedHans') { + // This event can be heard no matter is bKiller true | false, we count for every player on the objective + if (Outer.GetSeasonalEventStatValue(ObjIdx) < HansVolterKillsRequired) // If we still didn't reach the limit.. { Profile = KFProfileSettings(Outer.MyKFPC.OnlineSub.PlayerInterface.GetProfileSettings(Outer.MyKFPC.StoredLocalUserNum)); diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Spring2019.uc b/KFGameContent/Classes/KFSeasonalEventStats_Spring2019.uc index 672abb8..51c0241 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Spring2019.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Spring2019.uc @@ -44,8 +44,13 @@ private event GrantEventItems() } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { + if (bKiller == false) + { + return; + } + if (bObjectiveIsValidForMap[2] != 0) { IncrementSeasonalEventStat(2, 1); @@ -102,4 +107,4 @@ defaultproperties ZedKillsRequired=1500 BossDeathsRequired=15 EndlessWaveRequired=15 -} \ No newline at end of file +} diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Spring2020.uc b/KFGameContent/Classes/KFSeasonalEventStats_Spring2020.uc index ba9b9b7..82392cd 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Spring2020.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Spring2020.uc @@ -69,10 +69,15 @@ simulated event OnGameWon(class GameClass, int Difficulty, int GameLen } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { local int ObjIdx; + if (bKiller == false) + { + return; + } + ObjIdx = 0; if (bObjectiveIsValidForMap[ObjIdx] != 0) { @@ -115,4 +120,4 @@ defaultproperties ZedKillsRequired=1500 BloodBlenderKillsRequired=20 TrapDoorKillsRequired=20 -} \ No newline at end of file +} diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Spring2021.uc b/KFGameContent/Classes/KFSeasonalEventStats_Spring2021.uc index cb5c65e..94e34ff 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Spring2021.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Spring2021.uc @@ -75,10 +75,15 @@ simulated function OnBossDied() } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { local int ObjIdx; + if (bKiller == false) + { + return; + } + // E.D.A.R kills ObjIdx = 2; if (bObjectiveIsValidForMap[ObjIdx] != 0) diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Summer2021.uc b/KFGameContent/Classes/KFSeasonalEventStats_Summer2021.uc index a4fea34..cd26dc2 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Summer2021.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Summer2021.uc @@ -58,12 +58,17 @@ simulated event OnGameWon(class GameClass, int Difficulty, int GameLen } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { local int ObjIdx; local KFPlayerController KFPC; local KFPawn_Human KFP; + if (bKiller == false) + { + return; + } + // Laser Kills ObjIdx = 2; if (bObjectiveIsValidForMap[ObjIdx] != 0) diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Summer2022.uc b/KFGameContent/Classes/KFSeasonalEventStats_Summer2022.uc index 33a1428..883387d 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Summer2022.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Summer2022.uc @@ -61,10 +61,15 @@ simulated event OnGameWon(class GameClass, int Difficulty, int GameLen } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { local int ObjIdx; + if (bKiller == false) + { + return; + } + // Kill 1500 Zeds on any map or mode ObjIdx = 0; if (bObjectiveIsValidForMap[ObjIdx] != 0) @@ -149,4 +154,4 @@ defaultproperties ZedsThrowSeaRequired=50 EndlessWaveRequired=15 LastWaveFinished=-1 -} \ No newline at end of file +} diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Summer2023.uc b/KFGameContent/Classes/KFSeasonalEventStats_Summer2023.uc index 4f9dfb7..5dad78a 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Summer2023.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Summer2023.uc @@ -137,10 +137,15 @@ simulated function OnAfflictionCaused(EAfflictionType Type) } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { local int ObjIdx; + if (bKiller == false) + { + return; + } + // Kill 1500 Zeds with HRG Bombardier ObjIdx = 0; if (bObjectiveIsValidForMap[ObjIdx] != 0) @@ -167,4 +172,4 @@ defaultproperties StandYourGroundRequired=25 EndlessWaveRequired=15 SummerEventIndex=SEI_Summer -} \ No newline at end of file +} diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Xmas2018.uc b/KFGameContent/Classes/KFSeasonalEventStats_Xmas2018.uc index 013f6d5..81f0f33 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Xmas2018.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Xmas2018.uc @@ -76,8 +76,13 @@ simulated function OnMapObjectiveDeactivated(Actor ObjectiveInterfaceActor) } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { + if (bKiller == false) + { + return; + } + if (bObjectiveIsValidForMap[2] != 0) { IncrementSeasonalEventStat(2, 1); @@ -123,4 +128,4 @@ defaultproperties PerfectEscortsRequired=3 ZedKillsRequired=2500 BossDeathsRequired=25 -} \ No newline at end of file +} diff --git a/KFGameContent/Classes/KFSeasonalEventStats_Xmas2019.uc b/KFGameContent/Classes/KFSeasonalEventStats_Xmas2019.uc index 5ad79e8..c1b35d0 100644 --- a/KFGameContent/Classes/KFSeasonalEventStats_Xmas2019.uc +++ b/KFGameContent/Classes/KFSeasonalEventStats_Xmas2019.uc @@ -68,8 +68,13 @@ simulated event OnGameWon(class GameClass, int Difficulty, int GameLen } } -simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT) +simulated function OnZedKilled(class MonsterClass, int Difficulty, class DT, bool bKiller) { + if (bKiller == false) + { + return; + } + if (bObjectiveIsValidForMap[1] != 0) { if (DT == class'KFDT_Trap_SanitariumTentacle') @@ -110,4 +115,4 @@ defaultproperties TentacleTrapKillsRequired=20 SuctionTrapKillsRequired=20 MatriarchKillsRequired=10 -} \ No newline at end of file +} diff --git a/KFGameContent/Classes/KFWeap_AssaultRifle_LazerCutter.uc b/KFGameContent/Classes/KFWeap_AssaultRifle_LazerCutter.uc index 74f1448..2e1cf37 100644 --- a/KFGameContent/Classes/KFWeap_AssaultRifle_LazerCutter.uc +++ b/KFGameContent/Classes/KFWeap_AssaultRifle_LazerCutter.uc @@ -972,7 +972,7 @@ defaultproperties FlameSprayArchetype = SprayActor_Flame'WEP_Laser_Cutter_ARCH.WEP_Laser_Cutter_Flame' ChargeTimePerLevel = 0.7f; - ChargeConsumeTime = 0.082f; //Consumes 25 on full charge + ChargeConsumeTime = 0.084f; //Consumes 25 on full charge OverchargeConsumeTime = 0; //Setting to 0 or below deactivates ammo consumption while holding a charge // Shooting Animations diff --git a/KFGameContent/Classes/KFWeap_Blunt_MedicBat.uc b/KFGameContent/Classes/KFWeap_Blunt_MedicBat.uc index b00c40e..fa5c7af 100644 --- a/KFGameContent/Classes/KFWeap_Blunt_MedicBat.uc +++ b/KFGameContent/Classes/KFWeap_Blunt_MedicBat.uc @@ -166,7 +166,8 @@ function StartHealRecharge() if (Role == ROLE_Authority) { InstigatorPerk = GetPerk(); - UsedHealRechargeTime = HealFullRechargeSeconds * static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex); + UsedHealRechargeTime = HealFullRechargeSeconds; + UsedHealRechargeTime *= static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex); InstigatorPerk.ModifyHealerRechargeTime(UsedHealRechargeTime); // Set the healing recharge rate whenever we start charging diff --git a/KFGameContent/Classes/KFWeap_HRG_93R.uc b/KFGameContent/Classes/KFWeap_HRG_93R.uc index a91f58f..9b162ab 100644 --- a/KFGameContent/Classes/KFWeap_HRG_93R.uc +++ b/KFGameContent/Classes/KFWeap_HRG_93R.uc @@ -42,10 +42,10 @@ defaultproperties bReloadFromMagazine=true // Recoil - maxRecoilPitch=250 - minRecoilPitch=200 - maxRecoilYaw=100 - minRecoilYaw=-100 + maxRecoilPitch=160 + minRecoilPitch=140 + maxRecoilYaw=60 + minRecoilYaw=-60 RecoilRate=0.01 RecoilMaxYawLimit=500 RecoilMinYawLimit=65035 @@ -61,7 +61,7 @@ defaultproperties WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_InstantHit WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_Pistol9mm' FireInterval(DEFAULT_FIREMODE)=+0.08 //0.175 - InstantHitDamage(DEFAULT_FIREMODE)=12.f //15 + InstantHitDamage(DEFAULT_FIREMODE)=15.f //15 InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HRG_93R' Spread(DEFAULT_FIREMODE)=0.015 FireOffset=(X=20,Y=4.0,Z=-3) diff --git a/KFGameContent/Classes/KFWeap_HRG_93R_Dual.uc b/KFGameContent/Classes/KFWeap_HRG_93R_Dual.uc index 6a1ace3..0eba414 100644 --- a/KFGameContent/Classes/KFWeap_HRG_93R_Dual.uc +++ b/KFGameContent/Classes/KFWeap_HRG_93R_Dual.uc @@ -58,10 +58,10 @@ defaultproperties bReloadFromMagazine=true // Recoil - maxRecoilPitch=250 - minRecoilPitch=200 - maxRecoilYaw=100 - minRecoilYaw=-100 + maxRecoilPitch=160 + minRecoilPitch=140 + maxRecoilYaw=60 + minRecoilYaw=-60 RecoilRate=0.01 RecoilMaxYawLimit=500 RecoilMinYawLimit=65035 @@ -77,7 +77,7 @@ defaultproperties WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_InstantHit WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_Pistol9mm' FireInterval(DEFAULT_FIREMODE)=+0.08 - InstantHitDamage(DEFAULT_FIREMODE)=12.0 //15 + InstantHitDamage(DEFAULT_FIREMODE)=15.0 //15 InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HRG_93R' Spread(DEFAULT_FIREMODE)=0.015 BurstAmount=3 @@ -89,7 +89,7 @@ defaultproperties WeaponFireTypes(ALTFIRE_FIREMODE)=EWFT_InstantHit WeaponProjectiles(ALTFIRE_FIREMODE)=class'KFProj_Bullet_Pistol9mm' FireInterval(ALTFIRE_FIREMODE)=+0.08 // about twice as fast as single - InstantHitDamage(ALTFIRE_FIREMODE)=12.0 //15 + InstantHitDamage(ALTFIRE_FIREMODE)=15.0 //15 InstantHitDamageTypes(ALTFIRE_FIREMODE)=class'KFDT_Ballistic_HRG_93R' Spread(ALTFIRE_FIREMODE)=0.015 diff --git a/KFGameContent/Classes/KFWeap_HRG_Healthrower.uc b/KFGameContent/Classes/KFWeap_HRG_Healthrower.uc index 74673a4..720bdea 100644 --- a/KFGameContent/Classes/KFWeap_HRG_Healthrower.uc +++ b/KFGameContent/Classes/KFWeap_HRG_Healthrower.uc @@ -417,7 +417,6 @@ function StartHealRecharge() UsedHealRechargeTime = HealFullRechargeSeconds; UsedHealRechargeTime *= static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex); - UsedHealRechargeTime *= InstigatorPerk.GetHealRechargeMod(); InstigatorPerk.ModifyHealerRechargeTime(UsedHealRechargeTime); // Set the healing recharge rate whenever we start charging diff --git a/KFGameContent/Classes/KFWeap_HRG_Stunner.uc b/KFGameContent/Classes/KFWeap_HRG_Stunner.uc index 882eacd..3351676 100644 --- a/KFGameContent/Classes/KFWeap_HRG_Stunner.uc +++ b/KFGameContent/Classes/KFWeap_HRG_Stunner.uc @@ -104,7 +104,7 @@ defaultproperties FiringStatesArray(DEFAULT_FIREMODE)=WeaponFiring WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_Projectile WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_HRG_Stunner' - InstantHitDamage(DEFAULT_FIREMODE)=60.0 //65.0 + InstantHitDamage(DEFAULT_FIREMODE)=80.0 //65.0 InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HRG_Stunner' PenetrationPower(DEFAULT_FIREMODE)=2.0 FireInterval(DEFAULT_FIREMODE)=0.15 diff --git a/KFGameContent/Classes/KFWeap_LMG_MG3.uc b/KFGameContent/Classes/KFWeap_LMG_MG3.uc index 0019576..faa6583 100644 --- a/KFGameContent/Classes/KFWeap_LMG_MG3.uc +++ b/KFGameContent/Classes/KFWeap_LMG_MG3.uc @@ -485,7 +485,7 @@ defaultproperties LastAmmoCount=-1 NumAltBullets=5 - SpreadWidthDegrees=30 + SpreadWidthDegrees=20 StartingAltBulletPosition=0.0f SpreadMaxOffset=(X=1.2f, Y=1.5f) } diff --git a/KFGameContent/Classes/KFWeap_SMG_G18.uc b/KFGameContent/Classes/KFWeap_SMG_G18.uc index 7ae26a6..e1dd25d 100644 --- a/KFGameContent/Classes/KFWeap_SMG_G18.uc +++ b/KFGameContent/Classes/KFWeap_SMG_G18.uc @@ -376,7 +376,7 @@ defaultproperties WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_G18' InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_G18' FireInterval(DEFAULT_FIREMODE)=+.05455 // 1100 RPM - Spread(DEFAULT_FIREMODE)=0.06 + Spread(DEFAULT_FIREMODE)=0.045 InstantHitDamage(DEFAULT_FIREMODE)=28 FireOffset=(X=30,Y=6.5,Z=-4)