diff --git a/KFGame/Classes/KFDT_HVStormCannonSpread.uc b/KFGame/Classes/KFDT_HVStormCannonSpread.uc index c62a12c..c8acb65 100644 --- a/KFGame/Classes/KFDT_HVStormCannonSpread.uc +++ b/KFGame/Classes/KFDT_HVStormCannonSpread.uc @@ -16,11 +16,10 @@ defaultproperties bArmorStops=false KnockdownPower=20 - StunPower=50 - StumblePower=200 - GunHitPower=150 - MeleeHitPower=100 - EMPPower=50 + StunPower=25 + StumblePower=85 + GunHitPower=80 + EMPPower=25 WeaponDef=class'KFWeapDef_HVStormCannon' } \ No newline at end of file diff --git a/KFGame/Classes/KFGFxMenu_Perks.uc b/KFGame/Classes/KFGFxMenu_Perks.uc index 48850f6..8c6eac4 100644 --- a/KFGame/Classes/KFGFxMenu_Perks.uc +++ b/KFGame/Classes/KFGFxMenu_Perks.uc @@ -286,7 +286,7 @@ function PerkChanged( byte NewPerkIndex, bool bClickedIndex) bModifiedPerk = true; // Only update perk immediately if we don't have a valid pawn - if( KFPC.Pawn == none || !KFPC.Pawn.IsAliveAndWell() ) + if( KFPC.Pawn == none || !KFPC.Pawn.IsAliveAndWell() || KFGRI.bTraderIsOpen ) { SavePerkData(); SelectionContainer.SavePerk( NewPerkIndex ); diff --git a/KFGame/Classes/KFGFxServerBrowser_Filters.uc b/KFGame/Classes/KFGFxServerBrowser_Filters.uc index 0a97c0f..136ec3b 100644 --- a/KFGame/Classes/KFGFxServerBrowser_Filters.uc +++ b/KFGame/Classes/KFGFxServerBrowser_Filters.uc @@ -164,7 +164,8 @@ function LocalizeCheckBoxes() bShowAllowSeasonalSkins = true; if (ServerMenu.Manager.StartMenu.GetStartMenuState() == EMatchmaking - || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None) + || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None + || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_Spring) { bShowAllowSeasonalSkins = false; // Default if we don't have a season or it's find a match menu } diff --git a/KFGame/Classes/KFGFxServerBrowser_ServerDetails.uc b/KFGame/Classes/KFGFxServerBrowser_ServerDetails.uc index ae540d5..6b9a5e1 100644 --- a/KFGame/Classes/KFGFxServerBrowser_ServerDetails.uc +++ b/KFGame/Classes/KFGFxServerBrowser_ServerDetails.uc @@ -65,6 +65,7 @@ function SetDetails(KFOnlineGameSettings ServerResult) local GFxObject TempObj; local int Ping, PlayerCount; local KFOnlineGameSettings TempOnlingGamesSettings; + local bool bShowSeasonalSkins; if(ServerResult != none) { @@ -93,6 +94,11 @@ function SetDetails(KFOnlineGameSettings ServerResult) TempObj.SetBool("ranked", TempOnlingGamesSettings.bUsesStats); TempObj.SetBool("seasonalSkins", TempOnlingGamesSettings.bNoSeasonalSkins == false); + bShowSeasonalSkins = class'KFGameEngine'.static.GetSeasonalEventID() != SEI_None + && class'KFGameEngine'.static.GetSeasonalEventID() != SEI_Spring; + + TempObj.SetBool("showSeasonalSkins", bShowSeasonalSkins); + Ping = TempOnlingGamesSettings.PingInMs; TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) ); TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlingGamesSettings.difficulty)); diff --git a/KFGame/Classes/KFGFxServerBrowser_ServerList.uc b/KFGame/Classes/KFGFxServerBrowser_ServerList.uc index b47a6e7..745f444 100644 --- a/KFGame/Classes/KFGFxServerBrowser_ServerList.uc +++ b/KFGame/Classes/KFGFxServerBrowser_ServerList.uc @@ -283,7 +283,8 @@ function BuildServerFilters(KFGFxServerBrowser_Filters Filters, OnlineGameSearch DisableSeasonalSkins = Filters.bNoSeasonalSkins; - if (class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None) + if (class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None + || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_Spring) { DisableSeasonalSkins = false; } diff --git a/KFGame/Classes/KFGFxStartGameContainer_Options.uc b/KFGame/Classes/KFGFxStartGameContainer_Options.uc index 6576786..46b1c9d 100644 --- a/KFGame/Classes/KFGFxStartGameContainer_Options.uc +++ b/KFGame/Classes/KFGFxStartGameContainer_Options.uc @@ -244,7 +244,8 @@ function InitializeGameOptions() TextObject.SetString("privacy",StartMenu.PermissionsTitle); TextObject.SetString("inProgress", InProgressString); - if (class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None) + if (class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None + || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_Spring) { TextObject.SetBool("bShowAllowSeasonalSkins", false); } diff --git a/KFGame/Classes/KFGFxWorld_WeaponRadar.uc b/KFGame/Classes/KFGFxWorld_WeaponRadar.uc index b9d2541..159dc7a 100644 --- a/KFGame/Classes/KFGFxWorld_WeaponRadar.uc +++ b/KFGame/Classes/KFGFxWorld_WeaponRadar.uc @@ -73,7 +73,7 @@ simulated function PrintLog(string text) defaultproperties { - RenderTexture=TextureRenderTarget2D'WEP_1P_Optics_TEX.Wep_1stP_Optics_R2T' + RenderTexture=TextureRenderTarget2D'WEP_1P_Optics_TEX.Wep_1stP_Radar_R2T' MovieInfo=SwfMovie'UI_World.RadarWorld_SWF' bAutoPlay=false } diff --git a/KFGame/Classes/KFGameInfo.uc b/KFGame/Classes/KFGameInfo.uc index 7511126..eb1d176 100644 --- a/KFGame/Classes/KFGameInfo.uc +++ b/KFGame/Classes/KFGameInfo.uc @@ -658,6 +658,8 @@ static native final function bool GameModeSupportsMap(int GameMode, string MapNa */ event InitGame( string Options, out string ErrorMessage ) { + local string OptionRead; + Super.InitGame( Options, ErrorMessage ); if (UsesModifiedDifficulty()) @@ -679,7 +681,22 @@ event InitGame( string Options, out string ErrorMessage ) GameLength = Clamp(GetIntOption(Options, "GameLength", GameLength), 0, SpawnManagerClasses.Length - 1); } - AllowSeasonalSkinsIndex = GetIntOption(Options, "AllowSeasonalSkins", AllowSeasonalSkinsIndex); + OptionRead = ParseOption(Options, "AllowSeasonalSkins"); + if (OptionRead != "") + { + if (int(OptionRead) == 0) + { + AllowSeasonalSkinsIndex = 1; // disable.. + } + else + { + AllowSeasonalSkinsIndex = 0; // enable.. + } + } + else // If doesn't exist on the Options we default it.. + { + AllowSeasonalSkinsIndex = 0; + } if( OnlineSub != none && OnlineSub.GetLobbyInterface() != none ) { diff --git a/KFGame/Classes/KFGameReplicationInfo.uc b/KFGame/Classes/KFGameReplicationInfo.uc index 77a9ad1..a8ee111 100644 --- a/KFGame/Classes/KFGameReplicationInfo.uc +++ b/KFGame/Classes/KFGameReplicationInfo.uc @@ -2306,6 +2306,9 @@ simulated function NotifyWeeklyEventIndex(int EventIndex) simulated function NotifyAllowSeasonalSkins(int AllowSeasonalSkinsIndex) { bAllowSeasonalSkins = (AllowSeasonalSkinsIndex == 0); + + `Log("NotifyAllowSeasonalSkins: AllowSeasonalSkins: "$bAllowSeasonalSkins); + bNetDirty = true; } diff --git a/KFGame/Classes/KFGfxMenu_StartGame.uc b/KFGame/Classes/KFGfxMenu_StartGame.uc index 647b2cb..06c9892 100644 --- a/KFGame/Classes/KFGfxMenu_StartGame.uc +++ b/KFGame/Classes/KFGfxMenu_StartGame.uc @@ -1100,7 +1100,7 @@ function SetLobbyData( string KeyName, string ValueData ) function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent) { local string MapName; - local int LengthIndex, ModeIndex, AllowSeasonalSkinsIndex; + local int LengthIndex, ModeIndex, AllowSeasonalSkins; // this is ugly, but effectively makes sure that the player isn't solo with versus selected // or other error cases such as when the game isn't fully installed @@ -1141,17 +1141,26 @@ function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent) } } - AllowSeasonalSkinsIndex = InOptionsComponent.GetAllowSeasonalSkinsIndex(); - - if (GetStartMenuState() == EMatchmaking || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None) + if (InOptionsComponent.GetAllowSeasonalSkinsIndex() == 0) { - AllowSeasonalSkinsIndex = 0; // Default if we don't have a season or it's find a match menu + AllowSeasonalSkins = 1; + } + else + { + AllowSeasonalSkins = 0; + } + + if (GetStartMenuState() == EMatchmaking + || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None + || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_Spring) + { + AllowSeasonalSkins = 1; // Default if we don't have a season or it's find a match menu } return MapName$"?Game="$class'KFGameInfo'.static.GetGameModeClassFromNum( ModeIndex ) $"?Difficulty="$class'KFGameDifficultyInfo'.static.GetDifficultyValue( InOptionsComponent.GetDifficultyIndex() ) $"?GameLength="$LengthIndex - $"?AllowSeasonalSkins="$AllowSeasonalSkinsIndex; + $"?AllowSeasonalSkins="$AllowSeasonalSkins; } native function bool GetSearchComplete(KFOnlineGameSearch GameSearch); @@ -1522,7 +1531,9 @@ function BuildServerFilters(OnlineGameInterface GameInterfaceSteam, KFGFxStartGa //bAllowSeasonal = OptionsComponent.GetAllowSeasonalSkinsIndex() == 0; - //if (GetStartMenuState() == EMatchmaking || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None) + //if (GetStartMenuState() == EMatchmaking + // || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None + // || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_Spring) //{ // bAllowSeasonal = true; // Default if we don't have a season or it's find a match menu //} diff --git a/KFGame/Classes/KFPlayerController.uc b/KFGame/Classes/KFPlayerController.uc index f87cf19..2ea8ebc 100644 --- a/KFGame/Classes/KFPlayerController.uc +++ b/KFGame/Classes/KFPlayerController.uc @@ -755,6 +755,9 @@ var byte StormCannonIDCounter; var transient bool bShotgunJumping; +var int iAllowSeasonalSkins; + + cpptext { virtual UBOOL Tick( FLOAT DeltaSeconds, ELevelTick TickType ); @@ -1004,37 +1007,78 @@ reliable server event PushV() ResetVStat(); } + +simulated function int GetAllowSeasonalSkins() +{ + local KFGameReplicationInfo KFGRI; + local bool bIsWWLWeekly, bIsAllowSeasonalSkins; // Situations that shouldn't allow seasonal overrides + + KFGRI = KFGameReplicationInfo(WorldInfo.GRI); + + bIsWWLWeekly = KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12; + bIsAllowSeasonalSkins = KFGRI != none && KFGRI.bAllowSeasonalSkins; + if(bIsWWLWeekly || bIsAllowSeasonalSkins == false) + { + return 0; + } + return 1; +} + simulated event name GetSeasonalStateName() { - local int EventId; + local int EventId, MapModifiedEventId; local KFMapInfo KFMI; - local bool bIsWWLWeekly; // WWL Weekly should not allow seasonal overrides + local bool bIsWWLWeekly, bIsAllowSeasonalSkins ; // Situations that shouldn't allow seasonal overrides local KFGameReplicationInfo KFGRI; EventId = class'KFGameEngine'.static.GetSeasonalEventID(); + `Log("GetSeasonalStateName: "$EventId); + + MapModifiedEventId = SEI_None; + KFMI = KFMapInfo(WorldInfo.GetMapInfo()); if (KFMI != none) { - KFMI.ModifySeasonalEventId(EventId); + KFMI.ModifySeasonalEventId(MapModifiedEventId); } - KFGRI = KFGameReplicationInfo(WorldInfo.GRI); - bIsWWLWeekly = KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12; - if (bIsWWLWeekly) - return 'No_Event'; + if (MapModifiedEventId == SEI_None) + { + KFGRI = KFGameReplicationInfo(WorldInfo.GRI); + + bIsWWLWeekly = KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12; + + bIsAllowSeasonalSkins = KFGRI != none && KFGRI.bAllowSeasonalSkins; + + `Log("GetSeasonalStateName: AllowSeasonalSkins: "$bIsAllowSeasonalSkins$" WWLWeekly "$bIsWWLWeekly); + if (bIsWWLWeekly || bIsAllowSeasonalSkins == false) + { + EventId = SEI_None; + } + } + else + { + `Log("GetSeasonalStateName: ModifySeasonalEventId: "$MapModifiedEventId); + EventId = MapModifiedEventId; + } //Remove any year information, just get 1s digit switch (EventId % 10) { case SEI_Summer: + `Log("GetSeasonalStateName: Summer"); return 'Summer_Sideshow'; case SEI_Fall: + `Log("GetSeasonalStateName: Fall"); return 'Fall'; case SEI_Winter: + `Log("GetSeasonalStateName: Winter"); return 'Winter'; case SEI_Spring: + `Log("GetSeasonalStateName: Spring"); return 'Spring'; default: + `Log("GetSeasonalStateName: No Event"); return 'No_Event'; } @@ -3229,9 +3273,17 @@ function PlayRMEffect( AkEvent RhythmMethodSound, name RhytmMethodRTPCName, int function RecievedNewPerkClass() { //refresh the needed UI for online. - if(MyGfxManager != none && MyGfxManager.TraderMenu != none) + if(MyGfxManager != none ) { - MyGfxManager.TraderMenu.UpdatePlayerInfo(); + if (MyGfxManager.TraderMenu != none) + { + MyGfxManager.TraderMenu.UpdatePlayerInfo(); + } + + if (MyGfxManager.PerksMenu != none) + { + MyGfxManager.PerksMenu.UpdateContainers(CurrentPerk.Class); + } } InitPerkLoadout(); @@ -5237,6 +5289,12 @@ event PlayerTick( float DeltaTime ) { super.PlayerTick(DeltaTime); + if(iAllowSeasonalSkins != GetAllowSeasonalSkins()) + { + iAllowSeasonalSkins = GetAllowSeasonalSkins(); + UpdateSeasonalState(); + } + if( WorldInfo.NetMode != NM_DedicatedServer ) { // Update gameplay effects @@ -12323,5 +12381,6 @@ defaultproperties CurrentRotationAdjustmentTime = 0.0f StormCannonIDCounter = 0 - bShotgunJumping=false + bShotgunJumping = false + iAllowSeasonalSkins = -1 } diff --git a/KFGame/Classes/KFPlayerController_WeeklySurvival.uc b/KFGame/Classes/KFPlayerController_WeeklySurvival.uc index 53d0e36..3ee5510 100644 --- a/KFGame/Classes/KFPlayerController_WeeklySurvival.uc +++ b/KFGame/Classes/KFPlayerController_WeeklySurvival.uc @@ -109,7 +109,7 @@ struct native VIPGameInfo var transient VIPGameInfo VIPGameData; // RandomPerk weekly -var array > LockedPerks; +var byte InitialRandomPerk; cpptext { @@ -606,10 +606,8 @@ function UpdateVIPDamage() } } -simulated function ForceNewPerk(class NewPerk) +simulated function ForceNewPerk(byte NewPerkIndex) { - local int NewPerkIndex; - NewPerkIndex = Perklist.Find('PerkClass', NewPerk); ServerSelectPerk(NewPerkIndex, Perklist[NewPerkIndex].PerkLevel, Perklist[NewPerkIndex].PrestigeLevel, true); SavedPerkIndex = NewPerkIndex; ForceNewSavedPerkIndex(NewPerkIndex); @@ -681,4 +679,5 @@ defaultProperties RandomPerkChosenSoundEvent=AkEvent'WW_UI_Menu.Play_AAR_TOPWEAPON_SLIDEIN_B' VIPLowHealthSoundEvent=AkEvent'WW_GLO_Runtime.WeeklyVIPAlarm' VIPLowHealthLastTimePlayed = 0.f -} + InitialRandomPerk=255 +} \ No newline at end of file diff --git a/KFGame/Classes/KFProj_BallisticExplosive.uc b/KFGame/Classes/KFProj_BallisticExplosive.uc index 2422b97..4847545 100644 --- a/KFGame/Classes/KFProj_BallisticExplosive.uc +++ b/KFGame/Classes/KFProj_BallisticExplosive.uc @@ -70,6 +70,11 @@ replication bIsTimedExplosive; } +simulated function bool CanDud() +{ + return true; +} + simulated function SyncOriginalLocation() { local KFPerk InstigatorPerk; @@ -79,10 +84,13 @@ simulated function SyncOriginalLocation() if( KFP != none ) { - InstigatorPerk = KFP.GetPerk(); - if( InstigatorPerk != none && InstigatorPerk.ShouldNeverDud() ) + if (CanDud()) { - ArmDistSquared = 0; + InstigatorPerk = KFP.GetPerk(); + if( InstigatorPerk != none && InstigatorPerk.ShouldNeverDud() ) + { + ArmDistSquared = 0; + } } } diff --git a/KFGame/Classes/KFWeapDef_ZedMKIII.uc b/KFGame/Classes/KFWeapDef_ZedMKIII.uc index b807304..be9c47b 100644 --- a/KFGame/Classes/KFWeapDef_ZedMKIII.uc +++ b/KFGame/Classes/KFWeapDef_ZedMKIII.uc @@ -13,7 +13,7 @@ DefaultProperties WeaponClassPath="KFGameContent.KFWeap_ZedMKIII" BuyPrice=2000 - AmmoPricePerMag=60 + AmmoPricePerMag=75 ImagePath="wep_ui_zedmkiii_tex.UI_WeaponSelect_ZEDMKIII" EffectiveRange=100 diff --git a/KFGame/Classes/KFWeaponSkinList.uc b/KFGame/Classes/KFWeaponSkinList.uc index 550995c..8e027fa 100644 --- a/KFGame/Classes/KFWeaponSkinList.uc +++ b/KFGame/Classes/KFWeaponSkinList.uc @@ -3712,22 +3712,22 @@ defaultproperties Skins.Add((Id=9479, Weapondef=class'KFWeapDef_G36C', MIC_1P=("wep_skinset64_mat.Wep_1P_Sahara_G36C_MIC","wep_skinset64_mat.Wep_1P_Sahara_Scope_G36C_MIC"), MIC_3P="wep_skinset64_mat.Wep_3P_Sahara_G36C_MIC", MIC_Pickup="wep_skinset64_mat.Wep_3P_Sahara_G36C_Pickup_MIC")) //HVStormCannon Standard - Skins.Add((Id=9569, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("WEP_1P_HVStormCannon_MAT.Wep_1P_HVStormCannon_Scope_MIC","WEP_1P_HVStormCannon_MAT.Wep_1stP_HVStormCannon_Lens_MIC","WEP_1P_HVStormCannon_MAT.Wep_1P_HVStormCannon_MIC"), MIC_3P="wep_3p_hvstormcannon_mat.WEP_3P_HVStormCannon_MIC", MIC_Pickup="wep_3p_hvstormcannon_mat.3P_Pickup_HVStormCannon_MIC")) + Skins.Add((Id=9569, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("WEP_1P_HVStormCannon_MAT.Wep_1P_HVStormCannon_MIC","WEP_1P_HVStormCannon_MAT.Wep_1P_HVStormCannon_Scope_MIC"), MIC_3P="wep_3p_hvstormcannon_mat.WEP_3P_HVStormCannon_MIC", MIC_Pickup="wep_3p_hvstormcannon_mat.3P_Pickup_HVStormCannon_MIC")) //HVStormCannon Lost Planet - Skins.Add((Id=9570, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_LostPlanet_Scope_MIC","WEP_1P_HVStormCannon_MAT.Wep_1stP_HVStormCannon_Lens_MIC","wep_skinset70_mat.Wep_1P_StormCannon_LostPlanet_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_LostPlanet_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_LostPlanet_Pickup_MIC")) + Skins.Add((Id=9570, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_LostPlanet_MIC","wep_skinset70_mat.Wep_1P_StormCannon_LostPlanet_Scope_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_LostPlanet_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_LostPlanet_Pickup_MIC")) //HVStormCannon Morph - Skins.Add((Id=9571, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_Xeno_Scope_MIC","WEP_1P_HVStormCannon_MAT.Wep_1stP_HVStormCannon_Lens_MIC","wep_skinset70_mat.Wep_1P_StormCannon_Xeno_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_Xeno_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_Xeno_Pickup_MIC")) + Skins.Add((Id=9571, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_Xeno_MIC","wep_skinset70_mat.Wep_1P_StormCannon_Xeno_Scope_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_Xeno_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_Xeno_Pickup_MIC")) //HVStormCannon Rebel - Skins.Add((Id=9572, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_Rebel_Scope_MIC","WEP_1P_HVStormCannon_MAT.Wep_1stP_HVStormCannon_Lens_MIC","wep_skinset70_mat.Wep_1P_StormCannon_Rebel_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_Rebel_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_Rebel_Pickup_MIC")) + Skins.Add((Id=9572, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_Rebel_MIC","wep_skinset70_mat.Wep_1P_StormCannon_Rebel_Scope_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_Rebel_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_Rebel_Pickup_MIC")) //HVStormCannon Space Man - Skins.Add((Id=9573, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_SpaceMan_Scope_MIC","WEP_1P_HVStormCannon_MAT.Wep_1stP_HVStormCannon_Lens_MIC","wep_skinset70_mat.Wep_1P_StormCannon_SpaceMan_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_SpaceMan_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_SpaceMan_Pickup_MIC")) + Skins.Add((Id=9573, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_SpaceMan_MIC","wep_skinset70_mat.Wep_1P_StormCannon_SpaceMan_Scope_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_SpaceMan_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_SpaceMan_Pickup_MIC")) //HVStormCannon Tycho - Skins.Add((Id=9574, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_Tycho_Scope_MIC","WEP_1P_HVStormCannon_MAT.Wep_1stP_HVStormCannon_Lens_MIC","wep_skinset70_mat.Wep_1P_StormCannon_Tycho_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_Tycho_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_Tycho_Pickup_MIC")) + Skins.Add((Id=9574, Weapondef=class'KFWeapDef_HVStormCannon', MIC_1P=("wep_skinset70_mat.Wep_1P_StormCannon_Tycho_MIC","wep_skinset70_mat.Wep_1P_StormCannon_Tycho_Scope_MIC"), MIC_3P="wep_skinset70_mat.Wep_3P_StormCannon_Tycho_MIC", MIC_Pickup="wep_skinset70_mat.Wep_3P_StormCannon_Tycho_Pickup_MIC")) //ZEDMKIII Standard Skins.Add((Id=9575, Weapondef=class'KFWeapDef_ZedMKIII', MIC_1P=("WEP_1P_ZEDMKIII_MAT.Wep_1stP_ZEDMKIII_MIC"), MIC_3P="Wep_3P_ZEDMKIII_MAT.Wep_3rdP_ZEDMKIII_MIC", MIC_Pickup="wep_3p_zedmkiii_mat.Wep_3rdP_ZEDMKIII_Pickup_MIC")) diff --git a/KFGameContent/Classes/KFDT_EMP_HVStormCannon.uc b/KFGameContent/Classes/KFDT_EMP_HVStormCannon.uc index ba7fd69..99fc025 100644 --- a/KFGameContent/Classes/KFDT_EMP_HVStormCannon.uc +++ b/KFGameContent/Classes/KFDT_EMP_HVStormCannon.uc @@ -35,11 +35,14 @@ defaultproperties KDeathVel=250 KnockdownPower=20 - StunPower=50 - StumblePower=200 - GunHitPower=150 - MeleeHitPower=100 - EMPPower=0 // Don't use the affliction here, we manage this on KFWeap_HVStormCannon to completely synchronize it with the logic of the weapon + StunPower=25 + StumblePower=85 + GunHitPower=80 + + // DISABLED PER DESIGN REQUEST, WE DO USE NOW DAMAGE TYPE EMP POWER + // Don't use the affliction here, we manage this on KFWeap_HVStormCannon to completely synchronize it with the logic of the weapon + //EMPPower=0 + EMPPower=25 GoreDamageGroup=DGT_EMP EffectGroup=FXG_Electricity diff --git a/KFGameContent/Classes/KFDT_Microwave_ZedMKIII.uc b/KFGameContent/Classes/KFDT_Microwave_ZedMKIII.uc index 7701682..c457146 100644 --- a/KFGameContent/Classes/KFDT_Microwave_ZedMKIII.uc +++ b/KFGameContent/Classes/KFDT_Microwave_ZedMKIII.uc @@ -54,7 +54,7 @@ defaultproperties KDeathVel=200 StumblePower=18 - StunPower=15 + StunPower=5 GunHitPower=15 WeaponDef=class'KFWeapDef_ZedMKIII' diff --git a/KFGameContent/Classes/KFGameInfo_WeeklySurvival.uc b/KFGameContent/Classes/KFGameInfo_WeeklySurvival.uc index b819983..8e9eac3 100644 --- a/KFGameContent/Classes/KFGameInfo_WeeklySurvival.uc +++ b/KFGameContent/Classes/KFGameInfo_WeeklySurvival.uc @@ -16,6 +16,21 @@ var int CurrentFrameBooms; /** Index of event to use as the default block */ var int ActiveEventIdx; +/** List with perks in random order */ +var array PerkRouletteRandomList; + +var int PerkRouletteRandomInitialIndex; +var int PerkRouletteRandomWaveNum; + +struct PerkRoulette_PlayerMessageDelegate +{ + var() KFPlayerController_WeeklySurvival KFPC_WS; + var() class InMessageClass; + var() int SwitchValue; +}; + +var array PerkRoulette_PlayersDelegateData; + //----------------------------------------------------------------------------- // Statics static event class SetGameType(string MapName, string Options, string Portal) @@ -513,7 +528,14 @@ function SetBossIndex() function Tick(float DeltaTime) { CurrentFrameBooms = 0; + super.Tick(DeltaTime); + + if (MyKFGRI.IsRandomPerkMode()) + { + // This deals with players joining at any time (lobby, or in wave) + ChooseRandomPerks(false); + } } function TickZedTime( float DeltaTime ) @@ -548,7 +570,8 @@ function WaveEnded(EWaveEndCondition WinCondition) // Choose new perk before the end of wave message triggers in supper. if (MyKFGRI.IsRandomPerkMode() && WinCondition == WEC_WaveWon) { - ChooseRandomPerks(); + PerkRouletteRandomWaveNum++; + ChooseRandomPerks(true); } super.WaveEnded(WinCondition); @@ -1320,6 +1343,11 @@ function WaveStarted() ChooseVIP(true); } } + + if (MyKFGRI.IsRandomPerkMode()) + { + RandomPerkWaveStarted(); + } } /** @@ -1523,137 +1551,86 @@ simulated function NotifyPlayerStatsInitialized(KFPlayerController_WeeklySurviva } } -function ChooseInitialRandomPerk(KFPlayerController_WeeklySurvival KFPC_WS) +simulated function RandomPerkWaveStarted() { - local KFPlayerController_WeeklySurvival OtherKFPC; - local array > AvailablePerks; - local int i; - local byte NewPerkIndex; - local bool bPerkFound; + local KFPlayerController_WeeklySurvival KFPC_WS; - `Log("CHOOSING INITIAL PERKS"); - - for (i = 0; i < KFPC_WS.PerkList.Length; ++i) + foreach WorldInfo.AllControllers(class'KFPlayerController_WeeklySurvival', KFPC_WS) { - bPerkFound = false; - - foreach WorldInfo.AllControllers(class'KFPlayerController_WeeklySurvival', OtherKFPC) + if (KFPC_WS.InitialRandomPerk == 255) { - if (OtherKFPC == KFPC_WS) - { - continue; - } + `Log("PLAYER - RandomPerkWaveStart : " $KFPC_WS); - if (KFPC_WS.Perklist[i].PerkClass == OtherKFPC.CurrentPerk.Class) - { - bPerkFound = true; - break; - } - } - - if (!bPerkFound) - { - AvailablePerks.AddItem(KFPC_WS.PerkList[i].PerkClass); + ChooseInitialRandomPerk(KFPC_WS); } } - - if (AvailablePerks.Length == 0) - { - for (i = 0; i < KFPC_WS.Perklist.Length; ++i) - { - AvailablePerks.AddItem(KFPC_WS.Perklist[i].PerkClass); - } - KFPC_WS.LockedPerks.Length = 0; - } - - NewPerkIndex = Rand(AvailablePerks.Length); - - KFPC_WS.LockedPerks.AddItem(AvailablePerks[NewPerkIndex]); - KFPC_WS.ForceNewPerk(AvailablePerks[NewPerkIndex]); } -function ChooseRandomPerks() +function InitializeRandomPerkList(array PerkList) { - local KFPlayerController_WeeklySurvival KFPC; - local array > AvailablePerks; - local array > PickedPerks; - local int i, j; - local byte NewPerkIndex; - local bool bPerkFound; + local array AvailablePerks; + local int i; + local byte NewRandomIndex; - foreach WorldInfo.AllControllers(class'KFPlayerController_WeeklySurvival', KFPC) + for (i = 0; i < PerkList.Length; ++i) { - AvailablePerks.Length = 0; + AvailablePerks.Additem(i); + } - for (i = 0; i < KFPC.Perklist.Length; ++i) + while(AvailablePerks.Length > 0) + { + NewRandomIndex = Rand(AvailablePerks.Length); + PerkRouletteRandomList.AddItem(AvailablePerks[NewRandomIndex]); + AvailablePerks.Remove(NewRandomIndex, 1); + } + + PerkRouletteRandomInitialIndex = 0; + PerkRouletteRandomWaveNum = 0; +} + +function ChooseInitialRandomPerk(KFPlayerController_WeeklySurvival KFPC_WS) +{ + if (PerkRouletteRandomList.Length == 0) + { + // First case, fill random array + InitializeRandomPerkList(KFPC_WS.PerkList); + } + + if (KFPC_WS.InitialRandomPerk == 255) + { + // Choose initial random perk + + KFPC_WS.InitialRandomPerk = PerkRouletteRandomInitialIndex; + PerkRouletteRandomInitialIndex = (PerkRouletteRandomInitialIndex + 1) % PerkRouletteRandomList.Length; + + `Log("PLAYER : " $KFPC_WS); + `Log("InitialRandomPerk : " $KFPC_WS.InitialRandomPerk); + } +} + +function ChooseRandomPerks(bool isEndWave) +{ + local KFPlayerController_WeeklySurvival KFPC_WS; + local byte NewPerk; + + foreach WorldInfo.AllControllers(class'KFPlayerController_WeeklySurvival', KFPC_WS) + { + if (KFPC_WS.InitialRandomPerk == 255 || KFPC_WS.PlayerReplicationInfo.bOnlySpectator || KFPC_WS.IsInState('Spectating')) { - bPerkFound = false; - for (j = 0; j < PickedPerks.Length; ++j) - { - if (KFPC.Perklist[i].PerkClass == PickedPerks[j]) - { - bPerkFound = true; - break; - } - } - - if (!bPerkFound) - { - for (j = 0; j < KFPC.LockedPerks.Length; ++j) - { - if (KFPC.Perklist[i].PerkClass == KFPC.LockedPerks[j]) - { - bPerkFound = true; - break; - } - } - } - - if (!bPerkFound) - { - AvailablePerks.AddItem(KFPC.Perklist[i].PerkClass); - } + continue; } - if (AvailablePerks.Length == 0) + // If the perk assigned to this player is different than the one it should have.. reassign + NewPerk = (KFPC_WS.InitialRandomPerk + PerkRouletteRandomWaveNum) % PerkRouletteRandomList.Length; + if (PerkRouletteRandomList[NewPerk] != KFPC_WS.SavedPerkIndex || isEndWave) { - for (i = 0; i < KFPC.Perklist.Length; ++i) - { - bPerkFound = false; - for (j = 0; j < PickedPerks.Length; ++j) - { - if (KFPC.Perklist[i].PerkClass == PickedPerks[j]) - { - bPerkFound = true; - break; - } - } - - if (!bPerkFound && KFPC.Perklist[i].PerkClass != KFPC.CurrentPerk.Class) - { - AvailablePerks.AddItem(KFPC.Perklist[i].PerkClass); - } - } - - if (AvailablePerks.Length == 0) - { - for (i = 0; i < KFPC.Perklist.Length; ++i) - { - AvailablePerks.AddItem(KFPC.Perklist[i].PerkClass); - PickedPerks.Length = 0; - } - } - - KFPC.LockedPerks.Length = 0; + KFPC_WS.ForceNewPerk(PerkRouletteRandomList[NewPerk]); } - NewPerkIndex = Rand(AvailablePerks.Length); - PickedPerks.AddItem(AvailablePerks[NewPerkIndex]); - KFPC.LockedPerks.AddItem(AvailablePerks[NewPerkIndex]); - - KFPC.ForceNewPerk(AvailablePerks[NewPerkIndex]); - - KFPC.PlayRandomPerkChosenSound(); + if (isEndWave) + { + KFPC_WS.PlayRandomPerkChosenSound(); + } } } @@ -1672,19 +1649,82 @@ event BroadcastLocalizedMessage( class InMessageClass, optional in } else { - BroadcastCustomWaveEndMessage(self, InMessageClass, Switch); + BroadcastCustomWaveEndMessage(InMessageClass, Switch); } } -function BroadcastCustomWaveEndMessage( actor Sender, class InMessageClass, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) +function BroadcastCustomWaveEndMessage(class InMessageClass, optional int Switch) { - local KFPlayerController KFPC; + local KFPlayerController_WeeklySurvival KFPC_WS; + local PerkRoulette_PlayerMessageDelegate PlayerMessageData; - foreach WorldInfo.AllControllers(class'KFPlayerController', KFPC) + PerkRoulette_PlayersDelegateData.Remove(0, PerkRoulette_PlayersDelegateData.Length); + ClearTimer(nameof(BroadcastCustomDelegate)); + + foreach WorldInfo.AllControllers(class'KFPlayerController_WeeklySurvival', KFPC_WS) { - KFPC.ReceiveLocalizedMessage( InMessageClass, Switch, RelatedPRI_1, RelatedPRI_2, KFPC.GetPerk().Class); + if (KFPC_WS.InitialRandomPerk == 255) + { + continue; + } + + if (KFPC_WS.Pawn.IsAliveAndWell() == false || KFPC_WS.PlayerReplicationInfo.bOnlySpectator || KFPC_WS.IsInState('Spectating')) + { + PlayerMessageData.KFPC_WS = KFPC_WS; + PlayerMessageData.InMessageClass = InMessageClass; + PlayerMessageData.SwitchValue = Switch; + + PerkRoulette_PlayersDelegateData.AddItem(PlayerMessageData); + + continue; + } + + KFPC_WS.ReceiveLocalizedMessage( InMessageClass, Switch, None, None, KFPC_WS.GetPerk().Class); } + + if (PerkRoulette_PlayersDelegateData.Length > 0) + { + SetTimer(1.f, true, nameof(BroadcastCustomDelegate)); + } } + +function BroadcastCustomDelegate() +{ + local int i; + local PerkRoulette_PlayerMessageDelegate PlayerMessageData; + + for (i = PerkRoulette_PlayersDelegateData.Length - 1 ; i >= 0 ; --i) + { + PlayerMessageData = PerkRoulette_PlayersDelegateData[i]; + + if (PlayerMessageData.KFPC_WS == none) + { + PerkRoulette_PlayersDelegateData.Remove(i, 1); + continue; + } + + if (PlayerMessageData.KFPC_WS.Pawn.IsAliveAndWell() == false + || PlayerMessageData.KFPC_WS.PlayerReplicationInfo.bOnlySpectator + || PlayerMessageData.KFPC_WS.IsInState('Spectating')) + { + continue; + } + + PlayerMessageData.KFPC_WS.ReceiveLocalizedMessage(PlayerMessageData.InMessageClass + , PlayerMessageData.SwitchValue + , None + , None + , PlayerMessageData.KFPC_WS.GetPerk().Class); + + PerkRoulette_PlayersDelegateData.Remove(i, 1); + } + + if (PerkRoulette_PlayersDelegateData.Length == 0) + { + ClearTimer(nameof(BroadcastCustomDelegate)); + } +} + // defaultproperties diff --git a/KFGameContent/Classes/KFPawn_ZedScrake.uc b/KFGameContent/Classes/KFPawn_ZedScrake.uc index c2e98cf..bf50060 100644 --- a/KFGameContent/Classes/KFPawn_ZedScrake.uc +++ b/KFGameContent/Classes/KFPawn_ZedScrake.uc @@ -326,6 +326,7 @@ defaultproperties DamageTypeModifiers.Add((DamageType=class'KFDT_Explosive', DamageScale=(0.4))) DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing', DamageScale=(0.75))) DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_RPG7Impact', DamageScale=(4.f))) + DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_MedicMissile', DamageScale=(3.f))) DamageTypeModifiers.Add((DamageType=class'KFDT_Toxic', DamageScale=(0.25))) //special cases diff --git a/KFGameContent/Classes/KFProj_HRG_BallisticBouncer.uc b/KFGameContent/Classes/KFProj_HRG_BallisticBouncer.uc index 251de2b..2222042 100644 --- a/KFGameContent/Classes/KFProj_HRG_BallisticBouncer.uc +++ b/KFGameContent/Classes/KFProj_HRG_BallisticBouncer.uc @@ -39,8 +39,8 @@ var AkEvent BurstAkEvent; /** Decal settings */ var MaterialInterface ImpactDecalMaterial; -var float ImpactDecalWidth; -var float ImpactDecalHeight; +var float ImpactDecalMinSize; +var float ImpactDecalMaxSize; var float ImpactDecalThickness; var int MaxBounces; @@ -184,6 +184,8 @@ simulated function BounceNoCheckRepeatingTouch(vector HitNormal, Actor BouncedOf * Returns true if projectile actually bounced / was allowed to bounce */ simulated function bool Bounce( vector HitNormal, Actor BouncedOff ) { + local vector StartTrace, EndTrace, TraceLocation, TraceNormal; + // Avoid crazy bouncing if (CheckRepeatingTouch(BouncedOff)) { @@ -194,6 +196,18 @@ simulated function bool Bounce( vector HitNormal, Actor BouncedOff ) BounceNoCheckRepeatingTouch(HitNormal, BouncedOff); + if (WorldInfo.NetMode == NM_DedicatedServer || WorldInfo.NetMode == NM_Standalone) + { + StartTrace = Location; + EndTrace = Location - HitNormal * 200.f; + + Trace(TraceLocation, TraceNormal, EndTrace, StartTrace,,,,TRACEFLAG_Bullet); + + //DrawDebugLine(StartTrace, EndTrace, 0, 0, 255, true); + + SpawnImpactDecal(TraceLocation, HitNormal, fChargePercentage); + } + return true; } @@ -252,8 +266,8 @@ simulated function ProcessBulletTouch(Actor Other, Vector HitLocation, Vector Hi { local Pawn Victim; local array HitZoneImpactList; - //local ImpactInfo ImpactInfoFallBack; - local vector StartTrace, EndTrace, Direction; //, DirectionFallBack; + local ImpactInfo ImpactInfoFallBack; + local vector StartTrace, EndTrace, Direction, DirectionFallBack; local TraceHitInfo HitInfo; local KFWeapon KFW; @@ -293,6 +307,37 @@ simulated function ProcessBulletTouch(Actor Other, Vector HitLocation, Vector Hi //`Log("HitZoneImpactList: " $HitZoneImpactList.Length); + if (HitZoneImpactList.length == 0) + { + // This projectile needs this special case, the projectile bounces with everything constantly while changing cylinder size + // Making it's direction kind of unpredictable when trying to find the hit zones + // If we fail to find one with the default method, trace from Hit Location to Victim Location plus some distance that makes the trace end outside of the Victim + // That will succeed in any case start - end points are inside or outside the collider + + DirectionFallBack = Normal(Victim.Location - StartTrace); + + EndTrace = Victim.Location + DirectionFallBack * (Victim.CylinderComponent.CollisionRadius * 6.0); + + //Victim.DrawDebugSphere(StartTrace, 12, 6, 255, 0, 0, true); + //Victim.DrawDebugSphere(EndTrace, 12, 6, 0, 255, 0, true); + //Victim.DrawDebugLine(StartTrace, EndTrace, 0, 0, 255, true); + + TraceProjHitZones(Victim, EndTrace, StartTrace, HitZoneImpactList); + + // For some reason with the bouncing hitting certain parts doesn't detect hit, we force a fallback + if (HitZoneImpactList.length == 0) + { + //`Log("HitZoneImpactList: USING FALLBACK!"); + + ImpactInfoFallBack.HitActor = Victim; + ImpactInfoFallBack.HitLocation = HitLocation; + ImpactInfoFallBack.HitNormal = Direction; + ImpactInfoFallBack.StartTrace = StartTrace; + + HitZoneImpactList.AddItem(ImpactInfoFallBack); + } + } + if ( HitZoneImpactList.length > 0 ) { HitZoneImpactList[0].RayDir = Direction; @@ -323,6 +368,11 @@ simulated function IncrementNumImpacts(Pawn Victim) return; } + if (Victim.bCanBeDamaged == false || Victim.IsAliveAndWell() == false) + { + return; + } + KFPC = KFPlayerController(InstigatorController); if (KFPC == none) @@ -446,6 +496,20 @@ simulated function SyncOriginalLocation() Super.SyncOriginalLocation(); } +reliable client function SpawnImpactDecal(Vector HitLocation, vector HitNormal, float ChargePercentage ) +{ + local float DecalSize; + + if( WorldInfo.MyDecalManager != none) + { + DecalSize = Lerp(ImpactDecalMinSize, ImpactDecalMaxSize, ChargePercentage); + + //DrawDebugSphere(ProjEffects.GetPosition(), 12, 6, 0, 255, 0, true); + + WorldInfo.MyDecalManager.SpawnDecal( ImpactDecalMaterial, HitLocation, rotator(-HitNormal) + , DecalSize, DecalSize, ImpactDecalThickness, true ); + } +} defaultproperties { @@ -483,9 +547,9 @@ defaultproperties AmbientComponent=AmbientAkSoundComponent Components.Add(AmbientAkSoundComponent) - //ImpactDecalMaterial=DecalMaterial'FX_Mat_Lib.FX_Puke_Mine_Splatter_DM' - ImpactDecalWidth=178.f - ImpactDecalHeight=178.f + ImpactDecalMaterial=DecalMaterial'WEP_HRG_BallisticBouncer_EMIT.FX_Ball_Impact_DM' + ImpactDecalMinSize=20.f + ImpactDecalMaxSize=80.f ImpactDecalThickness=28.f Begin Object Name=CollisionCylinder diff --git a/KFGameContent/Classes/KFProj_Rocket_HRG_MedicMissile.uc b/KFGameContent/Classes/KFProj_Rocket_HRG_MedicMissile.uc index 836a7d1..68720a8 100644 --- a/KFGameContent/Classes/KFProj_Rocket_HRG_MedicMissile.uc +++ b/KFGameContent/Classes/KFProj_Rocket_HRG_MedicMissile.uc @@ -23,6 +23,12 @@ simulated function bool AllowDemolitionistExplosionChangeRadius() return false; } +// Used by Demolitionist Nuke and Mad Bomber skills +simulated function bool CanDud() +{ + return false; +} + simulated protected function PrepareExplosionTemplate() { local Weapon OwnerWeapon; @@ -60,7 +66,7 @@ defaultproperties TossZ=0 GravityScale=1.0 MomentumTransfer=50000.0 - ArmDistSquared=150000 // 4 meters + ArmDistSquared=75000 // 2m bCollideWithTeammates=true @@ -97,9 +103,9 @@ defaultproperties // explosion Begin Object Class=KFGameExplosion Name=ExploTemplate0 - Damage=400 + Damage=700 DamageRadius=300 - DamageFalloffExponent=2 + DamageFalloffExponent=1 DamageDelay=0.f // Damage Effects diff --git a/KFGameContent/Classes/KFWeap_HRG_BallisticBouncer.uc b/KFGameContent/Classes/KFWeap_HRG_BallisticBouncer.uc index 3846e68..a30e887 100644 --- a/KFGameContent/Classes/KFWeap_HRG_BallisticBouncer.uc +++ b/KFGameContent/Classes/KFWeap_HRG_BallisticBouncer.uc @@ -120,10 +120,17 @@ reliable client function ClientUpdateVisualAmmo(float BoneControlTranslation) simulated function StartFire(byte FiremodeNum) { - if (IsTimerActive('RefireCheckTimer') || bBlocked) + if (IsTimerActive('RefireCheckTimer')) { return; } + + if (bBlocked && AmmoCount[0] == 0 && !IsTimerActive(nameof(RefireCheckTimer)) && !IsTimerActive(nameof(UnlockClientFire))) + { + + bBlocked = false; + } + if(Role != Role_Authority && FireModeNum == DEFAULT_FIREMODE && HasAmmo(DEFAULT_FIREMODE)) { bBlocked = true; @@ -139,8 +146,6 @@ simulated function StartFire(byte FiremodeNum) { bBlocked = false; } - - } simulated function RefireCheckTimer() @@ -640,8 +645,8 @@ defaultproperties ValueIncreaseTime=0.1 //FOR LERPING DAMANGE - MaxDamageByCharge=600 - MinDamageByCharge=60 + MaxDamageByCharge=200 + MinDamageByCharge=10 // FOV Meshfov=80 MeshIronSightFOV=65 //52 diff --git a/KFGameContent/Classes/KFWeap_HVStormCannon.uc b/KFGameContent/Classes/KFWeap_HVStormCannon.uc index 640f43b..6dcc073 100644 --- a/KFGameContent/Classes/KFWeap_HVStormCannon.uc +++ b/KFGameContent/Classes/KFWeap_HVStormCannon.uc @@ -53,6 +53,29 @@ event PostBeginPlay() } } +simulated function KFProjectile SpawnAllProjectiles(class KFProjClass, vector RealStartLoc, vector AimDir) +{ + local Vector X, Y, Z, POVLoc; + local Quat R; + local rotator POVRot; + + if (bUsingSights) + { + if (Instigator != None && Instigator.Controller != none) + { + Instigator.Controller.GetPlayerViewPoint(POVLoc, POVRot); + + GetAxes(POVRot, X, Y, Z); + + // 0.32 is a value the artists found that was needed to balance the aim in order to match the iron sight with the bullet impact position + R = QuatFromAxisAndAngle(Y, -0.32f * DegToRad); + AimDir = QuatRotateVector(R, AimDir); + } + } + + return SpawnProjectile(KFProjClass, RealStartLoc, AimDir); +} + simulated function ProcessInstantHitEx(byte FiringMode, ImpactInfo Impact, optional int NumHits, optional out float out_PenetrationVal, optional int ImpactNum ) { local int HitZoneIdx; @@ -85,12 +108,13 @@ simulated function ProcessInstantHitEx(byte FiringMode, ImpactInfo Impact, optio KFPC.StormCannonIDCounter = 0; } + // DISABLED PER DESIGN REQUEST, WE DO USE NOW DAMAGE TYPE EMP POWER // We simulate EMP affliction on Server, we can't use the affliction itself because it's duration is super hard to control // To completely sync with the logic of TrackingInstanceTimeDelaySeconds // Simulate start EMP affliction - Target.bEmpPanicked = true; - Target.OnStackingAfflictionChanged(AF_EMP); + //Target.bEmpPanicked = true; + //Target.OnStackingAfflictionChanged(AF_EMP); HVStormCannon_ProjectileTracking.AddItem(NewTrackingInstance); @@ -124,7 +148,7 @@ function KFPawn_Monster SearchClosestTarget(HVStormCannon_ProjectileTrackingInst , ReferenceLocation , true,, HitInfo) { - if (!CurrentTarget.IsAliveAndWell() || CurrentTarget.bIsCloaking) + if (!CurrentTarget.IsAliveAndWell()) { continue; } @@ -176,9 +200,10 @@ function UpdateTracking() if (WorldInfo.TimeSeconds >= HVStormCannon_ProjectileTracking[i].TimeNextJump) { + // DISABLED PER DESIGN REQUEST, WE DO USE NOW DAMAGE TYPE EMP POWER // Simulate stop EMP affliction - HVStormCannon_ProjectileTracking[i].LastTarget.bEmpPanicked = false; - HVStormCannon_ProjectileTracking[i].LastTarget.OnStackingAfflictionChanged(AF_EMP); + //HVStormCannon_ProjectileTracking[i].LastTarget.bEmpPanicked = false; + //HVStormCannon_ProjectileTracking[i].LastTarget.OnStackingAfflictionChanged(AF_EMP); if (HVStormCannon_ProjectileTracking[i].NumberHits < TrackingDamage.length) { @@ -187,9 +212,10 @@ function UpdateTracking() { HVStormCannon_ProjectileTracking[i].TimeNextJump = WorldInfo.TimeSeconds + TrackingInstanceTimeDelaySeconds; + // DISABLED PER DESIGN REQUEST, WE DO USE NOW DAMAGE TYPE EMP POWER // Simulate start EMP affliction - NextTarget.bEmpPanicked = true; - NextTarget.OnStackingAfflictionChanged(AF_EMP); + //NextTarget.bEmpPanicked = true; + //NextTarget.OnStackingAfflictionChanged(AF_EMP); StartBeamVFX(NextTarget, HVStormCannon_ProjectileTracking[i].IDCounter); @@ -274,27 +300,6 @@ function int GetID(byte ID) return WeaponID + ID; } -simulated function KFProjectile SpawnProjectile( class KFProjClass, vector RealStartLoc, vector AimDir ) -{ - local vector SocketLocation; - local rotator SocketRotation; - local vector SpawnLocation; - local vector SpawnDirection; - - if(bUsingSights && MySkelMesh.GetSocketWorldLocationAndRotation('MuzzleFlash_Scope', SocketLocation, SocketRotation, 0)) - { - SpawnLocation = SocketLocation; - SpawnDirection = vector(SocketRotation); - } - else - { - SpawnLocation = RealStartLoc; - SpawnDirection = AimDir; - } - - return super.SpawnProjectile(KFProjClass, SpawnLocation, SpawnDirection); -} - simulated function UpdateAmmoCounter() { local float PercentageAmmo; @@ -339,21 +344,22 @@ defaultproperties AimWarningDelay=(X=0.4f, Y=0.8f) AimWarningCooldown=0.0f - // Recoil - maxRecoilPitch=300 - minRecoilPitch=200 - maxRecoilYaw=150 - minRecoilYaw=-150 - RecoilRate=0.08 +// Recoil + maxRecoilPitch=200 //185 + minRecoilPitch=165 //150 + maxRecoilYaw=190 //175 + minRecoilYaw=-165 //-150 + RecoilRate=0.09 RecoilMaxYawLimit=500 - RecoilMinYawLimit=1000 - RecoilMaxPitchLimit=1250 - RecoilMinPitchLimit=1500 - RecoilISMaxYawLimit=50 - RecoilISMinYawLimit=1000 - RecoilISMaxPitchLimit=500 - RecoilISMinPitchLimit=1000 + RecoilMinYawLimit=65035 + RecoilMaxPitchLimit=900 + RecoilMinPitchLimit=65035 + RecoilISMaxYawLimit=150 + RecoilISMinYawLimit=65385 + RecoilISMaxPitchLimit=375 + RecoilISMinPitchLimit=65460 RecoilViewRotationScale=0.6 + HippedRecoilModifier=1.5 //1.25 IronSightMeshFOVCompensationScale=1.5 // Inventory @@ -409,7 +415,7 @@ defaultproperties ScopedSensitivityMod=8.0 //16.0 ScopeLenseMICTemplate=MaterialInstanceConstant'WEP_1P_HVStormCannon_MAT.Wep_1stP_HVStormCannon_Lens_MIC' - ScopeMICIndex = 1 + ScopeMICIndex = 2 WeaponUpgrades[1]=(Stats=((Stat=EWUS_Damage0, Scale=1.15f), (Stat=EWUS_Damage1, Scale=1.15f), (Stat=EWUS_Weight, Add=1))) diff --git a/KFGameContent/Classes/KFWeap_Knife_Demolitionist.uc b/KFGameContent/Classes/KFWeap_Knife_Demolitionist.uc index 4a2eb22..8548589 100644 --- a/KFGameContent/Classes/KFWeap_Knife_Demolitionist.uc +++ b/KFGameContent/Classes/KFWeap_Knife_Demolitionist.uc @@ -20,9 +20,6 @@ defaultproperties FirstPersonMeshName="WEP_1P_Demo_Knife_MESH.Wep_1stP_Demo_Knife_Rig" AttachmentArchetypeName="WEP_Demo_Knife_ARCH.Wep_Demo_Knife_3P" - Spread(DEFAULT_FIREMODE)=1.0 - Spread(ALTFIRE_FIREMODE)=1.0 - Begin Object Name=FirstPersonMesh AnimSets(0)=AnimSet'WEP_1P_CommandoKnife_ANIM.Wep_1stP_CommKnife_Anim' End Object diff --git a/KFGameContent/Classes/KFWeap_ZedMKIII.uc b/KFGameContent/Classes/KFWeap_ZedMKIII.uc index 7bcb31b..df297a1 100644 --- a/KFGameContent/Classes/KFWeap_ZedMKIII.uc +++ b/KFGameContent/Classes/KFWeap_ZedMKIII.uc @@ -186,14 +186,14 @@ simulated function Projectile ProjectileFire() { if (NumShotsFired >= NumBulletsBeforeRocket) { - WeaponFireSnd[ALTFIRE_FIREMODE]=RocketFireSound; + //WeaponFireSnd[ALTFIRE_FIREMODE]=RocketFireSound; CurrentFireMode = ALTFIRE_FIREMODE; NumShotsFired = 0; LastShotIsRocket = true; } else { - WeaponFireSnd[ALTFIRE_FIREMODE]=NormalFireSound; + //WeaponFireSnd[ALTFIRE_FIREMODE]=NormalFireSound; CurrentFireMode = DEFAULT_FIREMODE; ++NumShotsFired; LastShotIsRocket = false; @@ -283,13 +283,13 @@ simulated state WeaponPuttingDown simulated function StartRadar() { + EnemiesInRadar.Length = 0; SetTimer(RadarUpdateEntitiesTime, true, nameof(UpdateRadarEntities)); } simulated function StopRadar() { ClearTimer(nameof(UpdateRadarEntities)); - EnemiesInRadar.Length = 0; } simulated function UpdateRadarEntities() @@ -467,9 +467,9 @@ defaultproperties MuzzleFlashTemplateName="WEP_ZEDMKIII_ARCH.Wep_ZEDMKIII_MuzzleFlash" // Ammo - MagazineCapacity[0]=100 - SpareAmmoCapacity[0]=400 - InitialSpareMags[0]=1 + MagazineCapacity[0]=50 + SpareAmmoCapacity[0]=350 + InitialSpareMags[0]=2 bCanBeReloaded=true bReloadFromMagazine=true @@ -526,16 +526,18 @@ defaultproperties NormalFireSound=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Single_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Single_1P') RocketFireSound=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Rocket_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Rocket_1P') - WeaponFireSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_LP_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_LP_1P') - WeaponFireSnd(ALTFIRE_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Single_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Single_1P') + //WeaponFireSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_LP_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_LP_1P') + WeaponFireSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Single_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Single_1P') + //WeaponFireSnd(ALTFIRE_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Single_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Single_1P') + WeaponFireSnd(ALTFIRE_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Rocket_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_Rocket_1P') WeaponDryFireSnd(DEFAULT_FIREMODE)=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Handling_DryFire' WeaponDryFireSnd(ALTFIRE_FIREMODE)=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Handling_DryFire' // Advanced (High RPM) Fire Effects bLoopingFireAnim(DEFAULT_FIREMODE)=true - bLoopingFireSnd(DEFAULT_FIREMODE)=true - WeaponFireLoopEndSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_LP_End_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_LP_End_1P') - SingleFireSoundIndex=ALTFIRE_FIREMODE + bLoopingFireSnd(DEFAULT_FIREMODE)=false + //WeaponFireLoopEndSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_LP_End_3P', FirstPersonCue=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Shoot_LP_End_1P') + //SingleFireSoundIndex=ALTFIRE_FIREMODE // Attachments bHasIronSights=true