This commit is contained in:
GenZmeY 2022-07-10 05:49:38 +03:00
parent c1e9a436c4
commit c36fcb61bc
4 changed files with 101 additions and 43 deletions

View File

@ -7,6 +7,14 @@ const CfgRemoveItems = class'RemoveItems';
const CfgAddItems = class'AddItems';
const Helper = class'Helper';
struct S_PreloadContent
{
var class<KFWeaponDefinition> KFWD;
var class<KFWeapon> KFWC;
var KFWeapon KFW;
var KFW_Access KFWA;
};
var private config int Version;
var private config E_LogLevel LogLevel;
var private config bool UnlockDLC;
@ -22,6 +30,8 @@ var private Array<CTI_RepInfo> RepInfos;
var private bool ReadyToSync;
var private Array<S_PreloadContent> PreloadContent;
public simulated function bool SafeDestroy()
{
`Log_Trace(`Location);
@ -185,7 +195,7 @@ private function PostInit()
if (bPreloadContent)
{
Helper.static.PreloadContent(AddItems);
InitPreload(AddItems);
}
ReadyToSync = true;
@ -199,6 +209,51 @@ private function PostInit()
}
}
private function InitPreload(Array<class<KFWeaponDefinition> > Content)
{
local S_PreloadContent SPC;
foreach Content(SPC.KFWD)
{
SPC.KFWC = class<KFWeapon> (DynamicLoadObject(SPC.KFWD.default.WeaponClassPath, class'Class'));
if (SPC.KFWC != None)
{
SPC.KFW = KFGI.Spawn(SPC.KFWC);
if (SPC.KFW == None)
{
`Log_Warn("Spawn failed:" @ SPC.KFWD.default.WeaponClassPath);
continue;
}
SPC.KFWA = new (SPC.KFW) class'KFW_Access';
if (SPC.KFWA == None)
{
`Log_Warn("Spawn failed:" @ SPC.KFWD.default.WeaponClassPath @ "KFW_Access");
continue;
}
PreloadContent.AddItem(SPC);
}
}
`Log_Debug("PreloadContent:" @ PreloadContent.Length);
}
public function StartPreload(class<KFWeaponDefinition> KFWeapDef)
{
local S_PreloadContent SPC;
foreach PreloadContent(SPC)
{
if (SPC.KFWD == KFWeapDef)
{
SPC.KFWA.KFW_StartLoadWeaponContent();
`Log_Debug("Preload:" @ SPC.KFW);
break;
}
}
}
public function NotifyLogin(Controller C)
{
`Log_Trace(`Location);

View File

@ -15,14 +15,13 @@ var private int Recieved;
var private int SyncSize;
var private KFPlayerController KFPC;
var private KFPawn KFP;
var private KFInventoryManager KFIM;
var private KFGFxWidget_PartyInGame PartyInGameWidget;
var private GFxObject Notification;
var private class<Weapon> PreloadWeaponClass;
var private float PreloadWeaponTime;
var private String NotificationHeaderText;
var private String NotificationLeftText;
var private String NotificationRightText;
var private int NotificationPercent;
replication
{
@ -97,7 +96,7 @@ private simulated function bool CheckPartyInGameWidget()
return (PartyInGameWidget != None);
}
private unreliable client function HideReadyButton()
private simulated function HideReadyButton()
{
`Log_Trace(`Location);
@ -120,7 +119,7 @@ private simulated function ShowReadyButton()
}
}
private unreliable client function UpdateNotification(String Title, String Downloading, String Remainig, int Percent)
private simulated function UpdateNotification(String Title, String Downloading, String Remainig, int Percent)
{
`Log_Trace(`Location);
@ -147,8 +146,11 @@ private reliable client function ClientSync(class<KFWeaponDefinition> WeapDef, o
return;
}
HideReadyButton();
if (!IsTimerActive(nameof(KeepNotification)))
{
SetTimer(0.1f, true, nameof(KeepNotification));
}
if (Remove)
{
RemoveItems.AddItem(WeapDef);
@ -156,29 +158,38 @@ private reliable client function ClientSync(class<KFWeaponDefinition> WeapDef, o
else
{
AddItems.AddItem(WeapDef);
if (PreloadContent)
{
Helper.static.PreloadWeapon(WeapDef);
}
}
Recieved = RemoveItems.Length + AddItems.Length;
UpdateNotification(
"Sync trader items, please wait...",
Remove ? "-" : "+" @ Repl(String(WeapDef), "KFWeapDef_", ""),
Recieved @ "/" @ SyncSize,
(float(Recieved) / float(SyncSize)) * 100);
NotificationLeftText = Remove ? "-" : "+" @ Repl(String(WeapDef), "KFWeapDef_", "");
NotificationRightText = Recieved @ "/" @ SyncSize;
if (SyncSize != 0)
{
NotificationPercent = (float(Recieved) / float(SyncSize)) * 100;
}
ServerSync();
}
private simulated function KeepNotification()
{
HideReadyButton();
UpdateNotification(
NotificationHeaderText,
NotificationLeftText,
NotificationRightText,
NotificationPercent);
}
private simulated reliable client function ClientSyncFinished()
{
local KFGameReplicationInfo KFGRI;
`Log_Trace(`Location);
ClearTimer(nameof(KeepNotification));
if (WorldInfo.GRI == None)
{
SetTimer(1.0f, false, nameof(ClientSyncFinished));
@ -224,6 +235,7 @@ public reliable server function ServerSync()
}
else
{
if (PreloadContent) CTI.StartPreload(AddItems[Recieved]);
ClientSync(AddItems[Recieved++ - RemoveItems.Length], false);
}
}
@ -237,4 +249,7 @@ defaultproperties
PendingSync = false
Recieved = 0
NotificationHeaderText = "Sync trader items, please wait..."
NotificationPercent = 0
}

View File

@ -52,30 +52,6 @@ public static simulated function ModifyTrader(
KFGRI.TraderItems = TraderItems;
}
public static simulated function PreloadContent(Array<class<KFWeaponDefinition> > WeapDefs)
{
local class<KFWeaponDefinition> WeapDef;
foreach WeapDefs(WeapDef)
{
PreloadWeapon(WeapDef);
}
}
public static simulated function PreloadWeapon(class<KFWeaponDefinition> WeapDef)
{
local class<KFWeapon> KFW;
KFW = class<KFWeapon> (DynamicLoadObject(WeapDef.default.WeaponClassPath, class'Class'));
if (KFW != None)
{
// This doesn't seem to have any effect right now
// But I still leave it for the future
// in the hope that someday we can preload weapon models using this function
class'KFWeapon'.static.TriggerAsyncContentLoad(KFW);
}
}
defaultproperties
{

12
CTI/Classes/KFW_Access.uc Normal file
View File

@ -0,0 +1,12 @@
class KFW_Access extends Object
within KFWeapon;
public function KFW_StartLoadWeaponContent()
{
StartLoadWeaponContent();
}
defaultproperties
{
}