upload
This commit is contained in:
parent
ea1d43f08f
commit
2131b14e05
@ -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'
|
||||
}
|
@ -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 );
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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 )
|
||||
{
|
||||
|
@ -2306,6 +2306,9 @@ simulated function NotifyWeeklyEventIndex(int EventIndex)
|
||||
simulated function NotifyAllowSeasonalSkins(int AllowSeasonalSkinsIndex)
|
||||
{
|
||||
bAllowSeasonalSkins = (AllowSeasonalSkinsIndex == 0);
|
||||
|
||||
`Log("NotifyAllowSeasonalSkins: AllowSeasonalSkins: "$bAllowSeasonalSkins);
|
||||
|
||||
bNetDirty = true;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
//}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ struct native VIPGameInfo
|
||||
var transient VIPGameInfo VIPGameData;
|
||||
|
||||
// RandomPerk weekly
|
||||
var array<class<KFPerk> > LockedPerks;
|
||||
var byte InitialRandomPerk;
|
||||
|
||||
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);
|
||||
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
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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"))
|
||||
|
@ -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
|
||||
|
@ -54,7 +54,7 @@ defaultproperties
|
||||
KDeathVel=200
|
||||
|
||||
StumblePower=18
|
||||
StunPower=15
|
||||
StunPower=5
|
||||
GunHitPower=15
|
||||
|
||||
WeaponDef=class'KFWeapDef_ZedMKIII'
|
||||
|
@ -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<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
|
||||
static event class<GameInfo> 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<class<KFPerk> > 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<PerkInfo> PerkList)
|
||||
{
|
||||
local KFPlayerController_WeeklySurvival KFPC;
|
||||
local array<class<KFPerk> > AvailablePerks;
|
||||
local array<class<KFPerk> > PickedPerks;
|
||||
local int i, j;
|
||||
local byte NewPerkIndex;
|
||||
local bool bPerkFound;
|
||||
local array<byte> 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<LocalMessage> InMessageClass, optional in
|
||||
}
|
||||
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
|
||||
|
@ -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
|
||||
|
@ -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<ImpactInfo> 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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 )
|
||||
{
|
||||
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<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()
|
||||
{
|
||||
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)))
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user