1
0
This commit is contained in:
GenZmeY 2022-12-07 23:25:49 +03:00
parent ea1d43f08f
commit 2131b14e05
25 changed files with 467 additions and 238 deletions

View File

@ -16,11 +16,10 @@ defaultproperties
bArmorStops=false bArmorStops=false
KnockdownPower=20 KnockdownPower=20
StunPower=50 StunPower=25
StumblePower=200 StumblePower=85
GunHitPower=150 GunHitPower=80
MeleeHitPower=100 EMPPower=25
EMPPower=50
WeaponDef=class'KFWeapDef_HVStormCannon' WeaponDef=class'KFWeapDef_HVStormCannon'
} }

View File

@ -286,7 +286,7 @@ function PerkChanged( byte NewPerkIndex, bool bClickedIndex)
bModifiedPerk = true; bModifiedPerk = true;
// Only update perk immediately if we don't have a valid pawn // 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(); SavePerkData();
SelectionContainer.SavePerk( NewPerkIndex ); SelectionContainer.SavePerk( NewPerkIndex );

View File

@ -164,7 +164,8 @@ function LocalizeCheckBoxes()
bShowAllowSeasonalSkins = true; bShowAllowSeasonalSkins = true;
if (ServerMenu.Manager.StartMenu.GetStartMenuState() == EMatchmaking 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 bShowAllowSeasonalSkins = false; // Default if we don't have a season or it's find a match menu
} }

View File

@ -65,6 +65,7 @@ function SetDetails(KFOnlineGameSettings ServerResult)
local GFxObject TempObj; local GFxObject TempObj;
local int Ping, PlayerCount; local int Ping, PlayerCount;
local KFOnlineGameSettings TempOnlingGamesSettings; local KFOnlineGameSettings TempOnlingGamesSettings;
local bool bShowSeasonalSkins;
if(ServerResult != none) if(ServerResult != none)
{ {
@ -93,6 +94,11 @@ function SetDetails(KFOnlineGameSettings ServerResult)
TempObj.SetBool("ranked", TempOnlingGamesSettings.bUsesStats); TempObj.SetBool("ranked", TempOnlingGamesSettings.bUsesStats);
TempObj.SetBool("seasonalSkins", TempOnlingGamesSettings.bNoSeasonalSkins == false); 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; Ping = TempOnlingGamesSettings.PingInMs;
TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) ); TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) );
TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlingGamesSettings.difficulty)); TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlingGamesSettings.difficulty));

View File

@ -283,7 +283,8 @@ function BuildServerFilters(KFGFxServerBrowser_Filters Filters, OnlineGameSearch
DisableSeasonalSkins = Filters.bNoSeasonalSkins; 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; DisableSeasonalSkins = false;
} }

View File

@ -244,7 +244,8 @@ function InitializeGameOptions()
TextObject.SetString("privacy",StartMenu.PermissionsTitle); TextObject.SetString("privacy",StartMenu.PermissionsTitle);
TextObject.SetString("inProgress", InProgressString); 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); TextObject.SetBool("bShowAllowSeasonalSkins", false);
} }

View File

@ -73,7 +73,7 @@ simulated function PrintLog(string text)
defaultproperties 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' MovieInfo=SwfMovie'UI_World.RadarWorld_SWF'
bAutoPlay=false bAutoPlay=false
} }

View File

@ -658,6 +658,8 @@ static native final function bool GameModeSupportsMap(int GameMode, string MapNa
*/ */
event InitGame( string Options, out string ErrorMessage ) event InitGame( string Options, out string ErrorMessage )
{ {
local string OptionRead;
Super.InitGame( Options, ErrorMessage ); Super.InitGame( Options, ErrorMessage );
if (UsesModifiedDifficulty()) if (UsesModifiedDifficulty())
@ -679,7 +681,22 @@ event InitGame( string Options, out string ErrorMessage )
GameLength = Clamp(GetIntOption(Options, "GameLength", GameLength), 0, SpawnManagerClasses.Length - 1); 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 ) if( OnlineSub != none && OnlineSub.GetLobbyInterface() != none )
{ {

View File

@ -2306,6 +2306,9 @@ simulated function NotifyWeeklyEventIndex(int EventIndex)
simulated function NotifyAllowSeasonalSkins(int AllowSeasonalSkinsIndex) simulated function NotifyAllowSeasonalSkins(int AllowSeasonalSkinsIndex)
{ {
bAllowSeasonalSkins = (AllowSeasonalSkinsIndex == 0); bAllowSeasonalSkins = (AllowSeasonalSkinsIndex == 0);
`Log("NotifyAllowSeasonalSkins: AllowSeasonalSkins: "$bAllowSeasonalSkins);
bNetDirty = true; bNetDirty = true;
} }

View File

@ -1100,7 +1100,7 @@ function SetLobbyData( string KeyName, string ValueData )
function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent) function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent)
{ {
local string MapName; 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 // 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 // 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 (InOptionsComponent.GetAllowSeasonalSkinsIndex() == 0)
if (GetStartMenuState() == EMatchmaking || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None)
{ {
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 ) return MapName$"?Game="$class'KFGameInfo'.static.GetGameModeClassFromNum( ModeIndex )
$"?Difficulty="$class'KFGameDifficultyInfo'.static.GetDifficultyValue( InOptionsComponent.GetDifficultyIndex() ) $"?Difficulty="$class'KFGameDifficultyInfo'.static.GetDifficultyValue( InOptionsComponent.GetDifficultyIndex() )
$"?GameLength="$LengthIndex $"?GameLength="$LengthIndex
$"?AllowSeasonalSkins="$AllowSeasonalSkinsIndex; $"?AllowSeasonalSkins="$AllowSeasonalSkins;
} }
native function bool GetSearchComplete(KFOnlineGameSearch GameSearch); native function bool GetSearchComplete(KFOnlineGameSearch GameSearch);
@ -1522,7 +1531,9 @@ function BuildServerFilters(OnlineGameInterface GameInterfaceSteam, KFGFxStartGa
//bAllowSeasonal = OptionsComponent.GetAllowSeasonalSkinsIndex() == 0; //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 // bAllowSeasonal = true; // Default if we don't have a season or it's find a match menu
//} //}

View File

@ -755,6 +755,9 @@ var byte StormCannonIDCounter;
var transient bool bShotgunJumping; var transient bool bShotgunJumping;
var int iAllowSeasonalSkins;
cpptext cpptext
{ {
virtual UBOOL Tick( FLOAT DeltaSeconds, ELevelTick TickType ); virtual UBOOL Tick( FLOAT DeltaSeconds, ELevelTick TickType );
@ -1004,37 +1007,78 @@ reliable server event PushV()
ResetVStat(); 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() simulated event name GetSeasonalStateName()
{ {
local int EventId; local int EventId, MapModifiedEventId;
local KFMapInfo KFMI; 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; local KFGameReplicationInfo KFGRI;
EventId = class'KFGameEngine'.static.GetSeasonalEventID(); EventId = class'KFGameEngine'.static.GetSeasonalEventID();
`Log("GetSeasonalStateName: "$EventId);
MapModifiedEventId = SEI_None;
KFMI = KFMapInfo(WorldInfo.GetMapInfo()); KFMI = KFMapInfo(WorldInfo.GetMapInfo());
if (KFMI != none) if (KFMI != none)
{ {
KFMI.ModifySeasonalEventId(EventId); KFMI.ModifySeasonalEventId(MapModifiedEventId);
} }
KFGRI = KFGameReplicationInfo(WorldInfo.GRI); if (MapModifiedEventId == SEI_None)
bIsWWLWeekly = KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12; {
if (bIsWWLWeekly) KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
return 'No_Event';
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 //Remove any year information, just get 1s digit
switch (EventId % 10) switch (EventId % 10)
{ {
case SEI_Summer: case SEI_Summer:
`Log("GetSeasonalStateName: Summer");
return 'Summer_Sideshow'; return 'Summer_Sideshow';
case SEI_Fall: case SEI_Fall:
`Log("GetSeasonalStateName: Fall");
return 'Fall'; return 'Fall';
case SEI_Winter: case SEI_Winter:
`Log("GetSeasonalStateName: Winter");
return 'Winter'; return 'Winter';
case SEI_Spring: case SEI_Spring:
`Log("GetSeasonalStateName: Spring");
return 'Spring'; return 'Spring';
default: default:
`Log("GetSeasonalStateName: No Event");
return 'No_Event'; return 'No_Event';
} }
@ -3229,9 +3273,17 @@ function PlayRMEffect( AkEvent RhythmMethodSound, name RhytmMethodRTPCName, int
function RecievedNewPerkClass() function RecievedNewPerkClass()
{ {
//refresh the needed UI for online. //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(); InitPerkLoadout();
@ -5237,6 +5289,12 @@ event PlayerTick( float DeltaTime )
{ {
super.PlayerTick(DeltaTime); super.PlayerTick(DeltaTime);
if(iAllowSeasonalSkins != GetAllowSeasonalSkins())
{
iAllowSeasonalSkins = GetAllowSeasonalSkins();
UpdateSeasonalState();
}
if( WorldInfo.NetMode != NM_DedicatedServer ) if( WorldInfo.NetMode != NM_DedicatedServer )
{ {
// Update gameplay effects // Update gameplay effects
@ -12323,5 +12381,6 @@ defaultproperties
CurrentRotationAdjustmentTime = 0.0f CurrentRotationAdjustmentTime = 0.0f
StormCannonIDCounter = 0 StormCannonIDCounter = 0
bShotgunJumping=false bShotgunJumping = false
iAllowSeasonalSkins = -1
} }

View File

@ -109,7 +109,7 @@ struct native VIPGameInfo
var transient VIPGameInfo VIPGameData; var transient VIPGameInfo VIPGameData;
// RandomPerk weekly // RandomPerk weekly
var array<class<KFPerk> > LockedPerks; var byte InitialRandomPerk;
cpptext cpptext
{ {
@ -606,10 +606,8 @@ function UpdateVIPDamage()
} }
} }
simulated function ForceNewPerk(class<KFPerk> NewPerk) simulated function ForceNewPerk(byte NewPerkIndex)
{ {
local int NewPerkIndex;
NewPerkIndex = Perklist.Find('PerkClass', NewPerk);
ServerSelectPerk(NewPerkIndex, Perklist[NewPerkIndex].PerkLevel, Perklist[NewPerkIndex].PrestigeLevel, true); ServerSelectPerk(NewPerkIndex, Perklist[NewPerkIndex].PerkLevel, Perklist[NewPerkIndex].PrestigeLevel, true);
SavedPerkIndex = NewPerkIndex; SavedPerkIndex = NewPerkIndex;
ForceNewSavedPerkIndex(NewPerkIndex); ForceNewSavedPerkIndex(NewPerkIndex);
@ -681,4 +679,5 @@ defaultProperties
RandomPerkChosenSoundEvent=AkEvent'WW_UI_Menu.Play_AAR_TOPWEAPON_SLIDEIN_B' RandomPerkChosenSoundEvent=AkEvent'WW_UI_Menu.Play_AAR_TOPWEAPON_SLIDEIN_B'
VIPLowHealthSoundEvent=AkEvent'WW_GLO_Runtime.WeeklyVIPAlarm' VIPLowHealthSoundEvent=AkEvent'WW_GLO_Runtime.WeeklyVIPAlarm'
VIPLowHealthLastTimePlayed = 0.f VIPLowHealthLastTimePlayed = 0.f
InitialRandomPerk=255
} }

View File

@ -70,6 +70,11 @@ replication
bIsTimedExplosive; bIsTimedExplosive;
} }
simulated function bool CanDud()
{
return true;
}
simulated function SyncOriginalLocation() simulated function SyncOriginalLocation()
{ {
local KFPerk InstigatorPerk; local KFPerk InstigatorPerk;
@ -79,10 +84,13 @@ simulated function SyncOriginalLocation()
if( KFP != none ) if( KFP != none )
{ {
InstigatorPerk = KFP.GetPerk(); if (CanDud())
if( InstigatorPerk != none && InstigatorPerk.ShouldNeverDud() )
{ {
ArmDistSquared = 0; InstigatorPerk = KFP.GetPerk();
if( InstigatorPerk != none && InstigatorPerk.ShouldNeverDud() )
{
ArmDistSquared = 0;
}
} }
} }

View File

@ -13,7 +13,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_ZedMKIII" WeaponClassPath="KFGameContent.KFWeap_ZedMKIII"
BuyPrice=2000 BuyPrice=2000
AmmoPricePerMag=60 AmmoPricePerMag=75
ImagePath="wep_ui_zedmkiii_tex.UI_WeaponSelect_ZEDMKIII" ImagePath="wep_ui_zedmkiii_tex.UI_WeaponSelect_ZEDMKIII"
EffectiveRange=100 EffectiveRange=100

View File

@ -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")) 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 //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 //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 //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 //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 //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 //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 //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")) 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"))

View File

@ -35,11 +35,14 @@ defaultproperties
KDeathVel=250 KDeathVel=250
KnockdownPower=20 KnockdownPower=20
StunPower=50 StunPower=25
StumblePower=200 StumblePower=85
GunHitPower=150 GunHitPower=80
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 // 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 GoreDamageGroup=DGT_EMP
EffectGroup=FXG_Electricity EffectGroup=FXG_Electricity

View File

@ -54,7 +54,7 @@ defaultproperties
KDeathVel=200 KDeathVel=200
StumblePower=18 StumblePower=18
StunPower=15 StunPower=5
GunHitPower=15 GunHitPower=15
WeaponDef=class'KFWeapDef_ZedMKIII' WeaponDef=class'KFWeapDef_ZedMKIII'

View File

@ -16,6 +16,21 @@ var int CurrentFrameBooms;
/** Index of event to use as the default block */ /** Index of event to use as the default block */
var int ActiveEventIdx; var int ActiveEventIdx;
/** List with perks in random order */
var array<byte> PerkRouletteRandomList;
var int PerkRouletteRandomInitialIndex;
var int PerkRouletteRandomWaveNum;
struct PerkRoulette_PlayerMessageDelegate
{
var() KFPlayerController_WeeklySurvival KFPC_WS;
var() class<LocalMessage> InMessageClass;
var() int SwitchValue;
};
var array<PerkRoulette_PlayerMessageDelegate> PerkRoulette_PlayersDelegateData;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Statics // Statics
static event class<GameInfo> SetGameType(string MapName, string Options, string Portal) static event class<GameInfo> SetGameType(string MapName, string Options, string Portal)
@ -513,7 +528,14 @@ function SetBossIndex()
function Tick(float DeltaTime) function Tick(float DeltaTime)
{ {
CurrentFrameBooms = 0; CurrentFrameBooms = 0;
super.Tick(DeltaTime); super.Tick(DeltaTime);
if (MyKFGRI.IsRandomPerkMode())
{
// This deals with players joining at any time (lobby, or in wave)
ChooseRandomPerks(false);
}
} }
function TickZedTime( float DeltaTime ) function TickZedTime( float DeltaTime )
@ -548,7 +570,8 @@ function WaveEnded(EWaveEndCondition WinCondition)
// Choose new perk before the end of wave message triggers in supper. // Choose new perk before the end of wave message triggers in supper.
if (MyKFGRI.IsRandomPerkMode() && WinCondition == WEC_WaveWon) if (MyKFGRI.IsRandomPerkMode() && WinCondition == WEC_WaveWon)
{ {
ChooseRandomPerks(); PerkRouletteRandomWaveNum++;
ChooseRandomPerks(true);
} }
super.WaveEnded(WinCondition); super.WaveEnded(WinCondition);
@ -1320,6 +1343,11 @@ function WaveStarted()
ChooseVIP(true); 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 KFPlayerController_WeeklySurvival KFPC_WS;
local array<class<KFPerk> > AvailablePerks;
local int i;
local byte NewPerkIndex;
local bool bPerkFound;
`Log("CHOOSING INITIAL PERKS"); foreach WorldInfo.AllControllers(class'KFPlayerController_WeeklySurvival', KFPC_WS)
for (i = 0; i < KFPC_WS.PerkList.Length; ++i)
{ {
bPerkFound = false; if (KFPC_WS.InitialRandomPerk == 255)
foreach WorldInfo.AllControllers(class'KFPlayerController_WeeklySurvival', OtherKFPC)
{ {
if (OtherKFPC == KFPC_WS) `Log("PLAYER - RandomPerkWaveStart : " $KFPC_WS);
{
continue;
}
if (KFPC_WS.Perklist[i].PerkClass == OtherKFPC.CurrentPerk.Class) ChooseInitialRandomPerk(KFPC_WS);
{
bPerkFound = true;
break;
}
}
if (!bPerkFound)
{
AvailablePerks.AddItem(KFPC_WS.PerkList[i].PerkClass);
} }
} }
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<PerkInfo> PerkList)
{ {
local KFPlayerController_WeeklySurvival KFPC; local array<byte> AvailablePerks;
local array<class<KFPerk> > AvailablePerks; local int i;
local array<class<KFPerk> > PickedPerks; local byte NewRandomIndex;
local int i, j;
local byte NewPerkIndex;
local bool bPerkFound;
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; continue;
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);
}
} }
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) KFPC_WS.ForceNewPerk(PerkRouletteRandomList[NewPerk]);
{
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;
} }
NewPerkIndex = Rand(AvailablePerks.Length); if (isEndWave)
PickedPerks.AddItem(AvailablePerks[NewPerkIndex]); {
KFPC.LockedPerks.AddItem(AvailablePerks[NewPerkIndex]); KFPC_WS.PlayRandomPerkChosenSound();
}
KFPC.ForceNewPerk(AvailablePerks[NewPerkIndex]);
KFPC.PlayRandomPerkChosenSound();
} }
} }
@ -1672,19 +1649,82 @@ event BroadcastLocalizedMessage( class<LocalMessage> InMessageClass, optional in
} }
else else
{ {
BroadcastCustomWaveEndMessage(self, InMessageClass, Switch); BroadcastCustomWaveEndMessage(InMessageClass, Switch);
} }
} }
function BroadcastCustomWaveEndMessage( actor Sender, class<LocalMessage> InMessageClass, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) function BroadcastCustomWaveEndMessage(class<LocalMessage> 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 defaultproperties

View File

@ -326,6 +326,7 @@ defaultproperties
DamageTypeModifiers.Add((DamageType=class'KFDT_Explosive', DamageScale=(0.4))) DamageTypeModifiers.Add((DamageType=class'KFDT_Explosive', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing', DamageScale=(0.75))) 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_RPG7Impact', DamageScale=(4.f)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_MedicMissile', DamageScale=(3.f)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Toxic', DamageScale=(0.25))) DamageTypeModifiers.Add((DamageType=class'KFDT_Toxic', DamageScale=(0.25)))
//special cases //special cases

View File

@ -39,8 +39,8 @@ var AkEvent BurstAkEvent;
/** Decal settings */ /** Decal settings */
var MaterialInterface ImpactDecalMaterial; var MaterialInterface ImpactDecalMaterial;
var float ImpactDecalWidth; var float ImpactDecalMinSize;
var float ImpactDecalHeight; var float ImpactDecalMaxSize;
var float ImpactDecalThickness; var float ImpactDecalThickness;
var int MaxBounces; var int MaxBounces;
@ -184,6 +184,8 @@ simulated function BounceNoCheckRepeatingTouch(vector HitNormal, Actor BouncedOf
* Returns true if projectile actually bounced / was allowed to bounce */ * Returns true if projectile actually bounced / was allowed to bounce */
simulated function bool Bounce( vector HitNormal, Actor BouncedOff ) simulated function bool Bounce( vector HitNormal, Actor BouncedOff )
{ {
local vector StartTrace, EndTrace, TraceLocation, TraceNormal;
// Avoid crazy bouncing // Avoid crazy bouncing
if (CheckRepeatingTouch(BouncedOff)) if (CheckRepeatingTouch(BouncedOff))
{ {
@ -194,6 +196,18 @@ simulated function bool Bounce( vector HitNormal, Actor BouncedOff )
BounceNoCheckRepeatingTouch(HitNormal, 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; return true;
} }
@ -252,8 +266,8 @@ simulated function ProcessBulletTouch(Actor Other, Vector HitLocation, Vector Hi
{ {
local Pawn Victim; local Pawn Victim;
local array<ImpactInfo> HitZoneImpactList; local array<ImpactInfo> HitZoneImpactList;
//local ImpactInfo ImpactInfoFallBack; local ImpactInfo ImpactInfoFallBack;
local vector StartTrace, EndTrace, Direction; //, DirectionFallBack; local vector StartTrace, EndTrace, Direction, DirectionFallBack;
local TraceHitInfo HitInfo; local TraceHitInfo HitInfo;
local KFWeapon KFW; local KFWeapon KFW;
@ -293,6 +307,37 @@ simulated function ProcessBulletTouch(Actor Other, Vector HitLocation, Vector Hi
//`Log("HitZoneImpactList: " $HitZoneImpactList.Length); //`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 ) if ( HitZoneImpactList.length > 0 )
{ {
HitZoneImpactList[0].RayDir = Direction; HitZoneImpactList[0].RayDir = Direction;
@ -323,6 +368,11 @@ simulated function IncrementNumImpacts(Pawn Victim)
return; return;
} }
if (Victim.bCanBeDamaged == false || Victim.IsAliveAndWell() == false)
{
return;
}
KFPC = KFPlayerController(InstigatorController); KFPC = KFPlayerController(InstigatorController);
if (KFPC == none) if (KFPC == none)
@ -446,6 +496,20 @@ simulated function SyncOriginalLocation()
Super.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 defaultproperties
{ {
@ -483,9 +547,9 @@ defaultproperties
AmbientComponent=AmbientAkSoundComponent AmbientComponent=AmbientAkSoundComponent
Components.Add(AmbientAkSoundComponent) Components.Add(AmbientAkSoundComponent)
//ImpactDecalMaterial=DecalMaterial'FX_Mat_Lib.FX_Puke_Mine_Splatter_DM' ImpactDecalMaterial=DecalMaterial'WEP_HRG_BallisticBouncer_EMIT.FX_Ball_Impact_DM'
ImpactDecalWidth=178.f ImpactDecalMinSize=20.f
ImpactDecalHeight=178.f ImpactDecalMaxSize=80.f
ImpactDecalThickness=28.f ImpactDecalThickness=28.f
Begin Object Name=CollisionCylinder Begin Object Name=CollisionCylinder

View File

@ -23,6 +23,12 @@ simulated function bool AllowDemolitionistExplosionChangeRadius()
return false; return false;
} }
// Used by Demolitionist Nuke and Mad Bomber skills
simulated function bool CanDud()
{
return false;
}
simulated protected function PrepareExplosionTemplate() simulated protected function PrepareExplosionTemplate()
{ {
local Weapon OwnerWeapon; local Weapon OwnerWeapon;
@ -60,7 +66,7 @@ defaultproperties
TossZ=0 TossZ=0
GravityScale=1.0 GravityScale=1.0
MomentumTransfer=50000.0 MomentumTransfer=50000.0
ArmDistSquared=150000 // 4 meters ArmDistSquared=75000 // 2m
bCollideWithTeammates=true bCollideWithTeammates=true
@ -97,9 +103,9 @@ defaultproperties
// explosion // explosion
Begin Object Class=KFGameExplosion Name=ExploTemplate0 Begin Object Class=KFGameExplosion Name=ExploTemplate0
Damage=400 Damage=700
DamageRadius=300 DamageRadius=300
DamageFalloffExponent=2 DamageFalloffExponent=1
DamageDelay=0.f DamageDelay=0.f
// Damage Effects // Damage Effects

View File

@ -120,10 +120,17 @@ reliable client function ClientUpdateVisualAmmo(float BoneControlTranslation)
simulated function StartFire(byte FiremodeNum) simulated function StartFire(byte FiremodeNum)
{ {
if (IsTimerActive('RefireCheckTimer') || bBlocked) if (IsTimerActive('RefireCheckTimer'))
{ {
return; return;
} }
if (bBlocked && AmmoCount[0] == 0 && !IsTimerActive(nameof(RefireCheckTimer)) && !IsTimerActive(nameof(UnlockClientFire)))
{
bBlocked = false;
}
if(Role != Role_Authority && FireModeNum == DEFAULT_FIREMODE && HasAmmo(DEFAULT_FIREMODE)) if(Role != Role_Authority && FireModeNum == DEFAULT_FIREMODE && HasAmmo(DEFAULT_FIREMODE))
{ {
bBlocked = true; bBlocked = true;
@ -139,8 +146,6 @@ simulated function StartFire(byte FiremodeNum)
{ {
bBlocked = false; bBlocked = false;
} }
} }
simulated function RefireCheckTimer() simulated function RefireCheckTimer()
@ -640,8 +645,8 @@ defaultproperties
ValueIncreaseTime=0.1 ValueIncreaseTime=0.1
//FOR LERPING DAMANGE //FOR LERPING DAMANGE
MaxDamageByCharge=600 MaxDamageByCharge=200
MinDamageByCharge=60 MinDamageByCharge=10
// FOV // FOV
Meshfov=80 Meshfov=80
MeshIronSightFOV=65 //52 MeshIronSightFOV=65 //52

View File

@ -53,6 +53,29 @@ event PostBeginPlay()
} }
} }
simulated function KFProjectile SpawnAllProjectiles(class<KFProjectile> 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 ) simulated function ProcessInstantHitEx(byte FiringMode, ImpactInfo Impact, optional int NumHits, optional out float out_PenetrationVal, optional int ImpactNum )
{ {
local int HitZoneIdx; local int HitZoneIdx;
@ -85,12 +108,13 @@ simulated function ProcessInstantHitEx(byte FiringMode, ImpactInfo Impact, optio
KFPC.StormCannonIDCounter = 0; 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 // 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 // To completely sync with the logic of TrackingInstanceTimeDelaySeconds
// Simulate start EMP affliction // Simulate start EMP affliction
Target.bEmpPanicked = true; //Target.bEmpPanicked = true;
Target.OnStackingAfflictionChanged(AF_EMP); //Target.OnStackingAfflictionChanged(AF_EMP);
HVStormCannon_ProjectileTracking.AddItem(NewTrackingInstance); HVStormCannon_ProjectileTracking.AddItem(NewTrackingInstance);
@ -124,7 +148,7 @@ function KFPawn_Monster SearchClosestTarget(HVStormCannon_ProjectileTrackingInst
, ReferenceLocation , ReferenceLocation
, true,, HitInfo) , true,, HitInfo)
{ {
if (!CurrentTarget.IsAliveAndWell() || CurrentTarget.bIsCloaking) if (!CurrentTarget.IsAliveAndWell())
{ {
continue; continue;
} }
@ -176,9 +200,10 @@ function UpdateTracking()
if (WorldInfo.TimeSeconds >= HVStormCannon_ProjectileTracking[i].TimeNextJump) if (WorldInfo.TimeSeconds >= HVStormCannon_ProjectileTracking[i].TimeNextJump)
{ {
// DISABLED PER DESIGN REQUEST, WE DO USE NOW DAMAGE TYPE EMP POWER
// Simulate stop EMP affliction // Simulate stop EMP affliction
HVStormCannon_ProjectileTracking[i].LastTarget.bEmpPanicked = false; //HVStormCannon_ProjectileTracking[i].LastTarget.bEmpPanicked = false;
HVStormCannon_ProjectileTracking[i].LastTarget.OnStackingAfflictionChanged(AF_EMP); //HVStormCannon_ProjectileTracking[i].LastTarget.OnStackingAfflictionChanged(AF_EMP);
if (HVStormCannon_ProjectileTracking[i].NumberHits < TrackingDamage.length) if (HVStormCannon_ProjectileTracking[i].NumberHits < TrackingDamage.length)
{ {
@ -187,9 +212,10 @@ function UpdateTracking()
{ {
HVStormCannon_ProjectileTracking[i].TimeNextJump = WorldInfo.TimeSeconds + TrackingInstanceTimeDelaySeconds; HVStormCannon_ProjectileTracking[i].TimeNextJump = WorldInfo.TimeSeconds + TrackingInstanceTimeDelaySeconds;
// DISABLED PER DESIGN REQUEST, WE DO USE NOW DAMAGE TYPE EMP POWER
// Simulate start EMP affliction // Simulate start EMP affliction
NextTarget.bEmpPanicked = true; //NextTarget.bEmpPanicked = true;
NextTarget.OnStackingAfflictionChanged(AF_EMP); //NextTarget.OnStackingAfflictionChanged(AF_EMP);
StartBeamVFX(NextTarget, HVStormCannon_ProjectileTracking[i].IDCounter); StartBeamVFX(NextTarget, HVStormCannon_ProjectileTracking[i].IDCounter);
@ -274,27 +300,6 @@ function int GetID(byte ID)
return WeaponID + ID; return WeaponID + ID;
} }
simulated function KFProjectile SpawnProjectile( class<KFProjectile> 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() simulated function UpdateAmmoCounter()
{ {
local float PercentageAmmo; local float PercentageAmmo;
@ -339,21 +344,22 @@ defaultproperties
AimWarningDelay=(X=0.4f, Y=0.8f) AimWarningDelay=(X=0.4f, Y=0.8f)
AimWarningCooldown=0.0f AimWarningCooldown=0.0f
// Recoil // Recoil
maxRecoilPitch=300 maxRecoilPitch=200 //185
minRecoilPitch=200 minRecoilPitch=165 //150
maxRecoilYaw=150 maxRecoilYaw=190 //175
minRecoilYaw=-150 minRecoilYaw=-165 //-150
RecoilRate=0.08 RecoilRate=0.09
RecoilMaxYawLimit=500 RecoilMaxYawLimit=500
RecoilMinYawLimit=1000 RecoilMinYawLimit=65035
RecoilMaxPitchLimit=1250 RecoilMaxPitchLimit=900
RecoilMinPitchLimit=1500 RecoilMinPitchLimit=65035
RecoilISMaxYawLimit=50 RecoilISMaxYawLimit=150
RecoilISMinYawLimit=1000 RecoilISMinYawLimit=65385
RecoilISMaxPitchLimit=500 RecoilISMaxPitchLimit=375
RecoilISMinPitchLimit=1000 RecoilISMinPitchLimit=65460
RecoilViewRotationScale=0.6 RecoilViewRotationScale=0.6
HippedRecoilModifier=1.5 //1.25
IronSightMeshFOVCompensationScale=1.5 IronSightMeshFOVCompensationScale=1.5
// Inventory // Inventory
@ -409,7 +415,7 @@ defaultproperties
ScopedSensitivityMod=8.0 //16.0 ScopedSensitivityMod=8.0 //16.0
ScopeLenseMICTemplate=MaterialInstanceConstant'WEP_1P_HVStormCannon_MAT.Wep_1stP_HVStormCannon_Lens_MIC' 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))) WeaponUpgrades[1]=(Stats=((Stat=EWUS_Damage0, Scale=1.15f), (Stat=EWUS_Damage1, Scale=1.15f), (Stat=EWUS_Weight, Add=1)))

View File

@ -20,9 +20,6 @@ defaultproperties
FirstPersonMeshName="WEP_1P_Demo_Knife_MESH.Wep_1stP_Demo_Knife_Rig" FirstPersonMeshName="WEP_1P_Demo_Knife_MESH.Wep_1stP_Demo_Knife_Rig"
AttachmentArchetypeName="WEP_Demo_Knife_ARCH.Wep_Demo_Knife_3P" AttachmentArchetypeName="WEP_Demo_Knife_ARCH.Wep_Demo_Knife_3P"
Spread(DEFAULT_FIREMODE)=1.0
Spread(ALTFIRE_FIREMODE)=1.0
Begin Object Name=FirstPersonMesh Begin Object Name=FirstPersonMesh
AnimSets(0)=AnimSet'WEP_1P_CommandoKnife_ANIM.Wep_1stP_CommKnife_Anim' AnimSets(0)=AnimSet'WEP_1P_CommandoKnife_ANIM.Wep_1stP_CommKnife_Anim'
End Object End Object

View File

@ -186,14 +186,14 @@ simulated function Projectile ProjectileFire()
{ {
if (NumShotsFired >= NumBulletsBeforeRocket) if (NumShotsFired >= NumBulletsBeforeRocket)
{ {
WeaponFireSnd[ALTFIRE_FIREMODE]=RocketFireSound; //WeaponFireSnd[ALTFIRE_FIREMODE]=RocketFireSound;
CurrentFireMode = ALTFIRE_FIREMODE; CurrentFireMode = ALTFIRE_FIREMODE;
NumShotsFired = 0; NumShotsFired = 0;
LastShotIsRocket = true; LastShotIsRocket = true;
} }
else else
{ {
WeaponFireSnd[ALTFIRE_FIREMODE]=NormalFireSound; //WeaponFireSnd[ALTFIRE_FIREMODE]=NormalFireSound;
CurrentFireMode = DEFAULT_FIREMODE; CurrentFireMode = DEFAULT_FIREMODE;
++NumShotsFired; ++NumShotsFired;
LastShotIsRocket = false; LastShotIsRocket = false;
@ -283,13 +283,13 @@ simulated state WeaponPuttingDown
simulated function StartRadar() simulated function StartRadar()
{ {
EnemiesInRadar.Length = 0;
SetTimer(RadarUpdateEntitiesTime, true, nameof(UpdateRadarEntities)); SetTimer(RadarUpdateEntitiesTime, true, nameof(UpdateRadarEntities));
} }
simulated function StopRadar() simulated function StopRadar()
{ {
ClearTimer(nameof(UpdateRadarEntities)); ClearTimer(nameof(UpdateRadarEntities));
EnemiesInRadar.Length = 0;
} }
simulated function UpdateRadarEntities() simulated function UpdateRadarEntities()
@ -467,9 +467,9 @@ defaultproperties
MuzzleFlashTemplateName="WEP_ZEDMKIII_ARCH.Wep_ZEDMKIII_MuzzleFlash" MuzzleFlashTemplateName="WEP_ZEDMKIII_ARCH.Wep_ZEDMKIII_MuzzleFlash"
// Ammo // Ammo
MagazineCapacity[0]=100 MagazineCapacity[0]=50
SpareAmmoCapacity[0]=400 SpareAmmoCapacity[0]=350
InitialSpareMags[0]=1 InitialSpareMags[0]=2
bCanBeReloaded=true bCanBeReloaded=true
bReloadFromMagazine=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') 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') 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(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_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(DEFAULT_FIREMODE)=AkEvent'WW_WEP_ZEDMKIII.Play_WEP_ZEDMKIII_Handling_DryFire'
WeaponDryFireSnd(ALTFIRE_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 // Advanced (High RPM) Fire Effects
bLoopingFireAnim(DEFAULT_FIREMODE)=true bLoopingFireAnim(DEFAULT_FIREMODE)=true
bLoopingFireSnd(DEFAULT_FIREMODE)=true 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') //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 //SingleFireSoundIndex=ALTFIRE_FIREMODE
// Attachments // Attachments
bHasIronSights=true bHasIronSights=true