1
0
KF2-Dev-Scripts/KFGame/Classes/KFGameInfo_Entry.uc
2022-10-30 02:52:58 +03:00

528 lines
14 KiB
Ucode

//=============================================================================
// KFGameInfo_Entry
//=============================================================================
// The main menu's game info class
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
// - Christian "schneidzekk" Schneider
//=============================================================================
class KFGameInfo_Entry extends KFGameInfo;
var bool bInitialized;
var int LastSystemTimeMinutes;
var array<KFActor_DoshPile> DoshVaultStacks;
var array<MaterialInstanceActor> TierLights;
var bool bInitPiles;
var int FrontPilesInWorld;
var int FrontPilesActive;
var array<int> TierThreshold;
var string LightMICTagName;
var string LightConeTagName;
var string LightBulbTagName;
var string DoshLitterMICTagName;
var string CustomPawnSpawnPointTagName;
var int FilledPalletCount;
var int LastUpdateDoshAmount;
var() LinearColor WhiteColor;
var() LinearColor OffColor;
var KFPawn_Customization VaultCustomPawn;
var int CalcultedTierValue;
static function PreloadContentClasses();
function bool NeedPlayers();
function Pawn SpawnDefaultPawnFor(Controller NewPlayer, NavigationPoint StartSpot) {}
function InitSpawnManager();
function InitTraderList();
function InitVault()
{
local KFPlayerController KFPC;
local LocalPlayer LP;
local int i;
// To fix custom post processing effect not showing up in main menu
KFPC = KFPlayerController(WorldInfo.GetALocalPlayerController());
if (KFPC == none)
{
return;
}
LP = LocalPlayer(KFPC.Player);
if (LP != None)
{
LP.RemoveAllPostProcessingChains();
LP.InsertPostProcessingChain(LP.Outer.GetWorldPostProcessChain(), INDEX_NONE, true);
}
if (KFPC.myHUD != None)
{
KFPC.myHUD.NotifyBindPostProcessEffects();
}
SetDoshTier(GetTotalDoshTier(KFPC));
InitDoshPiles(KFPC);
SpawnVaultCustomizationPawn(KFPC);
if(!bInitialized)
{
for (i = 0; i < TierThreshold.length; i++)
{
ActiveLightActorsForTier(i, i == 0);
}
}
}
function SpawnVaultCustomizationPawn(KFPlayerController KFPC)
{
local KFGameInfo KFGI;
local NavigationPoint BestStart;
if(VaultCustomPawn != none)
{
return;
}
KFGI = KFGameInfo( WorldInfo.Game );
if( KFGI == none || KFGI.bRestartLevel && WorldInfo.NetMode!=NM_DedicatedServer && WorldInfo.NetMode!=NM_ListenServer )
{
`warn("bRestartLevel && !server, abort from RestartPlayer"@WorldInfo.NetMode);
return;
}
BestStart = GetVaultCustomizationSpawnPoint( KFGI );
VaultCustomPawn = KFPawn_Customization( KFGI.SpawnCustomizationPawn( BestStart ) );
if ( VaultCustomPawn != none )
{
VaultCustomPawn.InitializeCustomizationPawn( KFPC, BestStart );
}
}
function NavigationPoint GetVaultCustomizationSpawnPoint( KFGameInfo KFGI )
{
local NavigationPoint BestStartSpot;
foreach AllActors(class'NavigationPoint', BestStartSpot)
{
if(string(BestStartSpot.Tag) == CustomPawnSpawnPointTagName)
{
return BestStartSpot;
}
}
return BestStartSpot;
}
event InitDoshPiles(KFPlayerController KFPC)
{
if (KFPC == none)
{
return;
}
CalcultedTierValue = GetTotalDoshTier(KFPC);
CollectDoshPiles();
SortDoshPiles();
SpawnDoshPilesForAmount(KFPC.GetLastSeenDoshCount());
InitDoshLitter(CalcultedTierValue);
bInitPiles = true;
}
function InitDoshLitter(int DoshTier)
{
local MaterialInstanceActor DoshLitterMICActor;
local MaterialInstanceConstant MICInst;
foreach AllActors(class'MaterialInstanceActor', DoshLitterMICActor)
{
if (string(DoshLitterMICActor.Tag) == (DoshLitterMICTagName))
{
//DoshLitterMICActor.StaticMeshComponent.CreateAndSetMaterialInstanceConstant(0);
//MaterialInstanceConstant(DoshLitterMICActor.StaticMeshComponent.GetMaterial(0)).SetScalarParameterValue('Dosh_Amount', (float(CalcultedTierValue) / float(TierThreshold.length - 1)));
MICInst = new(self) class'MaterialInstanceConstant';
MICInst.SetParent(DoshLitterMICActor.MatInst);
MICInst.SetScalarParameterValue('Dosh_Amount', (float(CalcultedTierValue)/float(TierThreshold.length-1)) );
DoshLitterMICActor.MatInst = MICInst;
}
}
//DoshLitterMIC.SetScalarParameterValue('Dosh_Amount', 1);
}
function CollectDoshPiles()
{
local KFActor_DoshPile DoshPile;
local int Index;
Index = 0;
DoshVaultStacks.length = 0;
foreach AllActors(class'KFActor_DoshPile', DoshPile)
{
DoshVaultStacks.AddItem(DoshPile);
DoshPile.SetHidden(true);
DoshPile.PileIndexID = Index;
DoshPile.SetValue(0);
Index++;
}
}
function SortDoshPiles()
{
DoshVaultStacks.Sort(CompareItemTags);
}
function int CompareItemTags(Actor Actor1, Actor Actor2)
{
local string Tag1, Tag2;
Tag1 = string(Actor1.Tag);
Tag2 = string(Actor2.Tag);
if(Tag1 == Tag2)
{
return 0;
}
if( Len(Tag1) != Len(Tag2) )
{
return Len(Tag1) > Len(Tag2) ? -1 : 1;
}
return Tag1 > Tag2 ? -1 : 1;
}
function int GetTotalDoshTier(KFPlayerController KFPC)
{
local int TierValue;
local int NumPiles;
local int i;
NumPiles = int(KFPC.GetTotalDoshCount() / class'KFActor_DoshPile'.default.DoshPileMax);
for (i = 0; i < TierThreshold.length; i++)
{
if(NumPiles >= TierThreshold[i])
{
TierValue = i;
}
}
return TierValue;
}
function FinalAnimationPlayed(KFPlayerController KFPC)
{
SetDoshTier(GetTotalDoshTier(KFPC), true);
}
function SetDoshTier(int TierValue, optional bool bFinalAnimation = false)
{
local array<SequenceObject> ActivationEvents;
local KFSeqEvent_DoshVault ActivationEvent;
local int i;
/*for (i = 0; i < TierValue; i++)//Giving this back to kismet for now. -ZG
{
ActiveLightActorsForTier(i, i <= TierValue);
}*/
/*if (bFinalAnimation)
{*/
WorldInfo.GetGameSequence().FindSeqObjectsByClass(class'KFSeqEvent_DoshVault', true, ActivationEvents);
for (i = 0; i < ActivationEvents.Length; i++)
{
ActivationEvent = KFSeqEvent_DoshVault(ActivationEvents[i]);
if (ActivationEvent != none)
{
ActivationEvent.SetDoshTier(TierValue);
}
}
//}
}
//spawn crates up to remaining value
function SpawnDoshPilesForAmount(int LastSeenDoshAmount)
{
local int NumPiles;
local int DoshAccountedFor;
local int i, UpdateID;
local KFActor_DoshPile DoshPile;
NumPiles = int(LastSeenDoshAmount / class'KFActor_DoshPile'.default.DoshPileMax);
FrontPilesActive = (NumPiles % FrontPilesInWorld) + 1;
//Initial dosh count that we have to visually set.
DoshAccountedFor = LastSeenDoshAmount;
//make front piles always visible and give their values first
for (i = 0; i < DoshVaultStacks.length; i++)
{
if(i < FrontPilesInWorld)
{
DoshVaultStacks[i].SetHidden(false);
}
else
{
DoshVaultStacks[i].SetHidden(true);
}
DoshVaultStacks[i].SetValue(0);
}
UpdateID = FrontPilesInWorld;
//fill back rows
while(DoshAccountedFor >= (FrontPilesActive * class'KFActor_DoshPile'.default.DoshPileMax) && DoshAccountedFor > 0 )
{
DoshPile = DoshVaultStacks[UpdateID];
DoshPile.SetHidden(false);
DoshPile.SetValue(FMin(DoshAccountedFor, class'KFActor_DoshPile'.default.DoshPileMax) / class'KFActor_DoshPile'.default.DoshPileMax);
//Remove accounted for dosh so future piles get the correct amount. If we go under 0, set it to 0 and we'll start with a bunch of empty piles
DoshAccountedFor -= class'KFActor_DoshPile'.default.DoshPileMax;
DoshAccountedFor = FMax(DoshAccountedFor, 0.f);
UpdateID++;
}
//front piles
UpdateID = 1;
while(DoshAccountedFor > 0)
{
if(DoshAccountedFor >= class'KFActor_DoshPile'.default.DoshPileMax)
{
DoshPile = DoshVaultStacks[UpdateID];
}
else
{
DoshPile = DoshVaultStacks[0];
}
DoshPile.SetValue(FMin(DoshAccountedFor, class'KFActor_DoshPile'.default.DoshPileMax) / class'KFActor_DoshPile'.default.DoshPileMax);
//Remove accounted for dosh so future piles get the correct amount. If we go under 0, set it to 0 and we'll start with a bunch of empty piles
DoshAccountedFor -= class'KFActor_DoshPile'.default.DoshPileMax;
DoshAccountedFor = FMax(DoshAccountedFor, 0.f);
UpdateID++;
}
}
exec function ActiveLightActorsForTier(int LightTier, optional bool bActive = true)
{
local Light LightActor;
local MaterialInstanceActor LightMIC;
local StaticMeshActor LightCone;
local MaterialInstanceConstant MICInst;
//emissive (MIC)
foreach AllActors(class'MaterialInstanceActor', LightMIC)
{
if(string(LightMIC.Tag) == (LightMICTagName $ LightTier) )
{
MICInst = new(self) class'MaterialInstanceConstant';
MICInst.SetParent(LightMIC.MatInst);
MICInst.SetVectorParameterValue('Emissive_Color', bActive ? WhiteColor : OffColor);
LightMIC.MatInst = MICInst;
}
}
//cones
foreach AllActors(class'StaticMeshActor', LightCone)
{
if(string(LightCone.Tag) == (LightConeTagName $ LightTier) )
{
LightCone.SetHidden(!bActive);
}
}
//lights
foreach AllActors(class'Light', LightActor)
{
if (string(LightActor.Tag) == (LightBulbTagName $ LightTier))
{
LightActor.LightComponent.SetEnabled(bActive);
}
}
}
function UpdateDoshPiles(int NewDoshAmount)
{
local int UpdateID, Idx, i;
local int ValueMultiple;
if(!bInitPiles)
{
InitVault();
}
if(LastUpdateDoshAmount == NewDoshAmount)
{
return;
}
//return;
if(NewDoshAmount <= 0)
{
return; //no reason to update
}
ValueMultiple = int(NewDoshAmount / class'KFActor_DoshPile'.default.DoshPileMax);
UpdateID = (ValueMultiple % FrontPilesInWorld) + 1; //can never be 0
//check for complete row
if(NewDoshAmount % (class'KFActor_DoshPile'.default.DoshPileMax * FrontPilesInWorld) == 0 && LastUpdateDoshAmount != INDEX_NONE)
{
//reset the rows because we are starting a new row
for (i = 0; i < FrontPilesInWorld; i++)
{
DoshVaultStacks[i].SpawnCompleteParticleEffects(false);
}
VaultCustomPawn.PlayEmoteAnimation();
//add the reset row the back piles <-maybe
SpawnDoshPilesForAmount(NewDoshAmount);
}
//check for complete stack
else if( NewDoshAmount % class'KFActor_DoshPile'.default.DoshPileMax == 0 && LastUpdateDoshAmount != INDEX_NONE)
{
if( UpdateID > 1 )
{
//fill the last id up!
DoshVaultStacks[0].SetValue(0);
DoshVaultStacks[0].SpawnCompleteParticleEffects(false);
DoshVaultStacks[UpdateID - 1].SpawnCompleteParticleEffects();
VaultCustomPawn.PlayEmoteAnimation();
}
}
for (Idx = 0; Idx <= UpdateID; ++Idx)
{
if (Idx == (UpdateID) )
{
DoshVaultStacks[0].SetValue( (NewDoshAmount % class'KFActor_DoshPile'.default.DoshPileMax) / class'KFActor_DoshPile'.default.DoshPileMax);
}
else
{
DoshVaultStacks[Idx].SetValue(1.0);
}
}
LastUpdateDoshAmount = NewDoshAmount;
}
// Parse options for this game...
event InitGame( string Options, out string ErrorMessage )
{
if ( ParseOption( Options, "PerformUnitTests" ) ~= "1" )
{
if ( MyAutoTestManager == None )
{
MyAutoTestManager = spawn(AutoTestManagerClass);
}
MyAutoTestManager.InitializeOptions(Options);
}
// Refresh online game data when returning to main menu
// Leaving main menu, aka GameEnded(), happening too late
if ( HasOption( Options, "Closed" ) )
{
class'KFGameEngine'.static.RefreshOnlineGameData();
}
LastSystemTimeMinutes = GetSystemTimeMinutes();
BroadcastHandler = spawn(BroadcastHandlerClass);
InitVault();
}
/**
* Helper for periodic online game data update
* note: Not 100% precise, because we don't bother with days rolling into months
*/
private function int GetSystemTimeMinutes()
{
local int year,month,dayofweek,day,hour,minute,second,msec;
GetSystemTime(year,month,dayofweek,day,hour,minute,second,msec);
return minute + (hour * 60) + (day * 60 * 24);
}
function Tick( float DeltaTime )
{
super.Tick(DeltaTime);
// Quick fix to get the music playing after the startup movies
if( !bInitialized )
{
ForceMenuMusicTrack();
bInitialized = true;
}
}
exec function FinishCraft ()
{
local KFPlayerController KFPC;
foreach LocalPlayerControllers(class'KFPlayerController', KFPC)
{
if(KFPC.MyGfxManager != none && KFPC.MyGFxManager.InventoryMenu != none)
{
KFPC.MyGFxManager.InventoryMenu.FinishCraft();
}
}
}
auto State PendingMatch
{
function RestartPlayer(Controller aPlayer)
{
}
function Timer()
{
local int SystemTimeMinutes;
// Update every minute using system clock for suspend mode.
// Originally tried using GameEnding(), but the TitleData response
// doesn't come back in time for the new map.
SystemTimeMinutes = GetSystemTimeMinutes();
if ( (SystemTimeMinutes - LastSystemTimeMinutes) >= 1 )
{
class'KFGameEngine'.static.RefreshOnlineGameData();
LastSystemTimeMinutes = SystemTimeMinutes;
}
}
function BeginState(Name PreviousStateName)
{
bWaitingToStartMatch = true;
}
function EndState(Name NextStateName)
{
}
}
DefaultProperties
{
LastUpdateDoshAmount=INDEX_NONE
LightMICTagName="TierMIC_"
LightConeTagName="TierCone_"
LightBulbTagName="TierLight_"
DoshLitterMICTagName="DoshLitter"
CustomPawnSpawnPointTagName="KFCustomizationPoint_Vault"
FrontPilesInWorld=10
TierThreshold(0)=0
TierThreshold(1)=30
TierThreshold(2)=70
TierThreshold(3)=100
TierThreshold(4)=130
WhiteColor=(R=1.0f,G=1.0f,B=1.0f)
OffColor=(R=0f,G=0f,B=0f)
SupportedEvents.Empty
SupportedEvents.Add(class'KFSeqEvent_DoshVault')
}