diff --git a/CTI/Classes/CTI.uc b/CTI/Classes/CTI.uc index 4cd4e61..5becf2a 100644 --- a/CTI/Classes/CTI.uc +++ b/CTI/Classes/CTI.uc @@ -7,6 +7,14 @@ const CfgRemoveItems = class'RemoveItems'; const CfgAddItems = class'AddItems'; const Helper = class'Helper'; +struct S_PreloadContent +{ + var class KFWD; + var class 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 RepInfos; var private bool ReadyToSync; +var private Array 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 > Content) +{ + local S_PreloadContent SPC; + + foreach Content(SPC.KFWD) + { + SPC.KFWC = class (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 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); diff --git a/CTI/Classes/CTI_RepInfo.uc b/CTI/Classes/CTI_RepInfo.uc index 56842c8..ea735ab 100644 --- a/CTI/Classes/CTI_RepInfo.uc +++ b/CTI/Classes/CTI_RepInfo.uc @@ -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 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 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 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 } diff --git a/CTI/Classes/Helper.uc b/CTI/Classes/Helper.uc index ec0d89a..7434f3e 100644 --- a/CTI/Classes/Helper.uc +++ b/CTI/Classes/Helper.uc @@ -52,30 +52,6 @@ public static simulated function ModifyTrader( KFGRI.TraderItems = TraderItems; } -public static simulated function PreloadContent(Array > WeapDefs) -{ - local class WeapDef; - - foreach WeapDefs(WeapDef) - { - PreloadWeapon(WeapDef); - } -} - -public static simulated function PreloadWeapon(class WeapDef) -{ - local class KFW; - - KFW = class (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 { diff --git a/CTI/Classes/KFW_Access.uc b/CTI/Classes/KFW_Access.uc new file mode 100644 index 0000000..bc4b7d0 --- /dev/null +++ b/CTI/Classes/KFW_Access.uc @@ -0,0 +1,12 @@ +class KFW_Access extends Object + within KFWeapon; + +public function KFW_StartLoadWeaponContent() +{ + StartLoadWeaponContent(); +} + +defaultproperties +{ + +}