6 Commits

Author SHA1 Message Date
559eae0298 add some comments 2022-07-07 01:24:32 +03:00
e3535715fa hide ready button 2022-07-07 01:03:11 +03:00
3218132314 update description 2022-07-06 23:34:14 +03:00
edda872f5f redesign preloadcontent 2022-07-06 23:13:13 +03:00
eef8aa42f2 add pub content and README.md 2022-07-06 22:54:49 +03:00
351f3a46b0 redesign preloadcontent, add support for versus mode 2022-07-06 22:53:45 +03:00
7 changed files with 209 additions and 60 deletions

View File

@ -133,11 +133,41 @@ private function PostInit()
return; return;
} }
if (UnlockDLC && KFGI.KFGFxManagerClass != class'CTI_GFxMoviePlayer_Manager') // TODO:
// replace shopContainer (KFGFxTraderContainer_Store)
// without replacing KFGFxMoviePlayer_Manager
// but how? 🤔
if (UnlockDLC)
{ {
if (KFGameInfo_VersusSurvival(KFGI) != None)
{
if (KFGI.KFGFxManagerClass != class'CTI_GFxMoviePlayer_Manager_Versus')
{
if (KFGI.KFGFxManagerClass != class'KFGameInfo_VersusSurvival'.default.KFGFxManagerClass)
{
`Log_Warn("Found custom 'KFGFxManagerClass' (" $ KFGI.KFGFxManagerClass $ "), there may be compatibility issues");
`Log_Warn("If you notice problems, try disabling DLC unlock");
}
KFGI.KFGFxManagerClass = class'CTI_GFxMoviePlayer_Manager_Versus';
`Log_Info("DLC unlocked");
}
}
else
{
if (KFGI.KFGFxManagerClass != class'CTI_GFxMoviePlayer_Manager')
{
if (KFGI.KFGFxManagerClass != class'KFGameInfo'.default.KFGFxManagerClass)
{
`Log_Warn("Found custom 'KFGFxManagerClass' (" $ KFGI.KFGFxManagerClass $ "), there may be compatibility issues");
`Log_Warn("If you notice problems, try disabling DLC unlock");
}
KFGI.KFGFxManagerClass = class'CTI_GFxMoviePlayer_Manager'; KFGI.KFGFxManagerClass = class'CTI_GFxMoviePlayer_Manager';
`Log_Info("DLC unlocked"); `Log_Info("DLC unlocked");
} }
}
}
if (KFGI.GameReplicationInfo == None) if (KFGI.GameReplicationInfo == None)
{ {

View File

@ -0,0 +1,8 @@
class CTI_GFxMoviePlayer_Manager_Versus extends KFGFxMoviePlayer_Manager_Versus
dependsOn(CTI_GFxMenu_Trader);
defaultproperties
{
WidgetBindings.Remove((WidgetName="traderMenu",WidgetClass=class'KFGFxMenu_Trader'))
WidgetBindings.Add((WidgetName="traderMenu",WidgetClass=class'CTI_GFxMenu_Trader'))
}

View File

@ -89,9 +89,28 @@ private simulated function bool CheckPartyInGameWidget()
return (PartyInGameWidget != None); return (PartyInGameWidget != None);
} }
private simulated function UpdateNotification(String Title, String Downloading, String Remainig, int Percent) private simulated function HideReadyButton()
{ {
if (Notification != None) if (CheckPartyInGameWidget())
{
PartyInGameWidget.SetReadyButtonVisibility(false);
}
}
private simulated function ShowReadyButton()
{
if (CheckPartyInGameWidget())
{
Notification.SetVisible(false);
PartyInGameWidget.SetReadyButtonVisibility(true);
PartyInGameWidget.UpdateReadyButtonText();
PartyInGameWidget.UpdateReadyButtonVisibility();
}
}
private reliable client function UpdateNotification(String Title, String Downloading, String Remainig, int Percent)
{
if (CheckPartyInGameWidget() && Notification != None)
{ {
Notification.SetString("itemName", Title); Notification.SetString("itemName", Title);
Notification.SetFloat("percent", Percent); Notification.SetFloat("percent", Percent);
@ -114,10 +133,7 @@ private reliable client function ClientSync(class<KFWeaponDefinition> WeapDef, o
return; return;
} }
if (CheckPartyInGameWidget()) HideReadyButton();
{
PartyInGameWidget.SetReadyButtonVisibility(false);
}
if (Remove) if (Remove)
{ {
@ -126,29 +142,19 @@ private reliable client function ClientSync(class<KFWeaponDefinition> WeapDef, o
else else
{ {
AddItems.AddItem(WeapDef); AddItems.AddItem(WeapDef);
if (PreloadContent)
{
Helper.static.PreloadWeapon(WeapDef);
}
} }
Recieved = RemoveItems.Length + AddItems.Length; Recieved = RemoveItems.Length + AddItems.Length;
if (CheckPartyInGameWidget())
{
UpdateNotification( UpdateNotification(
"Sync items, please wait...", "Sync items, please wait...",
Remove ? "-" : "+" @ Repl(String(WeapDef), "KFWeapDef_", ""), Remove ? "-" : "+" @ Repl(String(WeapDef), "KFWeapDef_", ""),
Recieved @ "/" @ SyncSize, Recieved @ "/" @ SyncSize,
(float(Recieved) / float(SyncSize)) * 100); (float(Recieved) / float(SyncSize)) * 100);
}
if (Recieved == SyncSize && (PreloadContent || ForcePreloadContent))
{
if (CheckPartyInGameWidget())
{
UpdateNotification(
"Preload Content, please wait...",
"Game isn't frozen",
"Don't panic",
0);
}
}
ServerSync(); ServerSync();
} }
@ -175,22 +181,7 @@ private simulated reliable client function SyncFinished()
Helper.static.ModifyTrader(KFGRI, RemoveItems, AddItems, ReplaceMode); Helper.static.ModifyTrader(KFGRI, RemoveItems, AddItems, ReplaceMode);
if (PreloadContent) ShowReadyButton();
{
Helper.static.PreloadContent(AddItems);
}
if (ForcePreloadContent)
{
PreloadContentWorkaround();
}
if (CheckPartyInGameWidget())
{
Notification.SetVisible(false);
PartyInGameWidget.SetReadyButtonVisibility(true);
PartyInGameWidget.UpdateReadyButtonText();
PartyInGameWidget.UpdateReadyButtonVisibility();
}
SafeDestroy(); SafeDestroy();
} }
@ -205,7 +196,13 @@ public reliable server function ServerSync()
if (SyncSize <= Recieved || WorldInfo.NetMode == NM_StandAlone) if (SyncSize <= Recieved || WorldInfo.NetMode == NM_StandAlone)
{ {
if (ForcePreloadContent)
{
PreloadContentWorkaround();
}
SyncFinished(); SyncFinished();
if (!CTI.DestroyRepLink(Controller(Owner))) if (!CTI.DestroyRepLink(Controller(Owner)))
{ {
SafeDestroy(); SafeDestroy();
@ -224,7 +221,7 @@ public reliable server function ServerSync()
} }
} }
private simulated function PreloadContentWorkaround() private function PreloadContentWorkaround()
{ {
local PlayerController PC; local PlayerController PC;
local Pawn P; local Pawn P;
@ -237,6 +234,7 @@ private simulated function PreloadContentWorkaround()
`Log_Trace(`Location); `Log_Trace(`Location);
HideReadyButton();
PC = GetPlayerController(); PC = GetPlayerController();
if (PC == None) if (PC == None)
@ -264,6 +262,13 @@ private simulated function PreloadContentWorkaround()
for (Index = 0; Index < AddItems.Length; Index++) for (Index = 0; Index < AddItems.Length; Index++)
{ {
HideReadyButton();
UpdateNotification(
"Game isn't frozen, Don't panic",
"Preload content:",
Index @ "/" @ AddItems.Length,
(float(Index) / float(AddItems.Length)) * 100);
CW = class<Weapon> (DynamicLoadObject(AddItems[Index].default.WeaponClassPath, class'Class')); CW = class<Weapon> (DynamicLoadObject(AddItems[Index].default.WeaponClassPath, class'Class'));
if (CW != None && Weapon(P.FindInventoryType(CW)) == None) if (CW != None && Weapon(P.FindInventoryType(CW)) == None)
{ {
@ -271,6 +276,9 @@ private simulated function PreloadContentWorkaround()
} }
} }
HideReadyButton();
UpdateNotification("Cleanup", "", "", 0);
foreach KFIM.InventoryActors(class'Weapon', W) foreach KFIM.InventoryActors(class'Weapon', W)
{ {
if (W != None) if (W != None)
@ -285,6 +293,9 @@ private simulated function PreloadContentWorkaround()
} }
} }
HideReadyButton();
UpdateNotification("Cleanup", "", "", 0);
foreach WorldInfo.DynamicActors(class'DroppedPickup', DP) foreach WorldInfo.DynamicActors(class'DroppedPickup', DP)
{ {
if (DP.Instigator == P && DP.CreationTime > Time) if (DP.Instigator == P && DP.CreationTime > Time)
@ -295,7 +306,7 @@ private simulated function PreloadContentWorkaround()
KFIM.bInfiniteWeight = false; KFIM.bInfiniteWeight = false;
`Log_Info("Force Preload Finished"); `Log_Info("Force Preload Finished (" $ PC.PlayerReplicationInfo.PlayerName $ ")");
} }
defaultproperties defaultproperties

View File

@ -52,19 +52,29 @@ public static simulated function ModifyTrader(
KFGRI.TraderItems = TraderItems; KFGRI.TraderItems = TraderItems;
} }
public static function PreloadContent(Array<class<KFWeaponDefinition> > WeapDefs) 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; local class<KFWeapon> KFW;
local int Index;
for (Index = 0; Index < WeapDefs.Length; Index++) KFW = class<KFWeapon> (DynamicLoadObject(WeapDef.default.WeaponClassPath, class'Class'));
{
KFW = class<KFWeapon> (DynamicLoadObject(WeapDefs[Index].default.WeaponClassPath, class'Class'));
if (KFW != None) if (KFW != None)
{ {
// This doesn't seem to have any effect right now,
// so we're forced to use a workaround: CTI_RepInfo.PreloadContentWorkaround()
// 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); class'KFWeapon'.static.TriggerAsyncContentLoad(KFW);
} }
}
} }
defaultproperties defaultproperties

View File

@ -1,9 +1,51 @@
[h1]Custom Trader Inventory[/h1] [h1]Features[/h1]
- remove and/or add items;
- unlock DLC weapons;
- correct items sorting (by price);
- can preload content (no lags during trader time);
- don't have to worry about adding new guns after each Tripware update.
[h1]Description[/h1] [h1]Whitelisted?[/h1]
description will come later... No. This mod is not whitelisted and will unrank your server. Any XP gained will not be saved.
[b]Mutator:[/b] CTI.CTIMut [h1]Usage (single player)[/h1]
1. Subscribe to this mutator;
2. Start KF2;
3. Open console (`) and input:
[b]open KF-BioticsLab?Mutator=CTI.CTIMut[/b]
(replace the map and add the parameters you need)
4. <Enter>.
[h1]Usage (server)[/h1]
[b]Note:[/b] [i]If you don't understand what is written here, read the article [url=https://wiki.killingfloor2.com/index.php?title=Dedicated_Server_(Killing_Floor_2)][u]Dedicated Server (KF2 wiki)[/u][/url] before following these instructions.[/i]
1. Open your [b]PCServer-KFEngine.ini[/b] / [b]LinuxServer-KFEngine.ini[/b];
2. Add the following string to the [b][OnlineSubsystemSteamworks.KFWorkshopSteamworks][/b] section (create one if it doesn't exist):
[b]ServerSubscribedWorkshopItems=2830826239[/b]
3. Start the server and wait while the mutator is downloading;
4. Add mutator to server start parameters: [b]?Mutator=CTI.CTIMut[/b] and restart the server.
[h1]Note[/h1]
📌 Mutator does not contain custom weapons. You must have the required weapon packs in your subscriptions to be able to add them to the trader.
📌 If you are using this mutator to add weapons, you should [b]not[/b] use mutators from weapon packs (just having them in subscriptions is enough).
[h1]Setup (KFCTI.ini)[/h1]
Config will be created at the first start.
Set [b]UnlockDLC=True[/b] to allow all players to buy DLC weapons.
Set [b]bForcePreloadContent=True[/b] to preload weapon models and have no lags during trader time.
Use [b][CTI.RemoveItems][/b] to remove items from the trader inventory.
For example: [b]Item=KFGame.KFWeapDef_Mac10[/b] will remove MAC10 from sale.
Set [b]bAll=True[/b] if you want to remove all items (can be useful if you want to set the entire sale list in the [b][CTI.AddItems][/b] section yourself).
Use [b][CTI.AddItems][/b] to add items to the trader inventory.
For example: [b]Item=WeaponPack.KFWeapDef_XM25[/b] will add [url=https://steamcommunity.com/sharedfiles/filedetails/?id=1147408497]XM25[/url] to sale.
[h1]Example config(s)[/h1]
🔗 [url=https://steamcommunity.com/workshop/filedetails/discussion/2830826239/3409804177172972154/]Reinforcement Weapon Pack[/url]
🔗 [url=https://steamcommunity.com/workshop/filedetails/discussion/2830826239/3409804177173363434/]Warface Arsenal[/url]
[h1]Sources[/h1] [h1]Sources[/h1]
[url=https://github.com/GenZmeY/KF2-CustomTraderInventory]https://github.com/GenZmeY/KF2-CustomTraderInventory[/url] [url=https://github.com/GenZmeY/KF2-CustomTraderInventory]https://github.com/GenZmeY/KF2-CustomTraderInventory[/url] (GNU GPLv3)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 256 KiB

View File

@ -1 +1,49 @@
# KF2-CustomTraderInventory # Custom Trader Inventory
[![Steam Workshop](https://img.shields.io/static/v1?message=workshop&logo=steam&labelColor=gray&color=blue&logoColor=white&label=steam%20)](https://steamcommunity.com/sharedfiles/filedetails/?id=2830826239)
[![Steam Subscriptions](https://img.shields.io/steam/subscriptions/2830826239)](https://steamcommunity.com/sharedfiles/filedetails/?id=2830826239)
[![Steam Favorites](https://img.shields.io/steam/favorites/2830826239)](https://steamcommunity.com/sharedfiles/filedetails/?id=2830826239)
[![Steam Update Date](https://img.shields.io/steam/update-date/2830826239)](https://steamcommunity.com/sharedfiles/filedetails/?id=2830826239)
[![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/GenZmeY/KF2-CustomTraderInventory)](https://github.com/GenZmeY/KF2-CustomTraderInventory/tags)
[![GitHub](https://img.shields.io/github/license/GenZmeY/KF2-CustomTraderInventory)](LICENSE)
# Description
Add/Remove Items in the Trader's Inventory
# Features
- remove and/or add items;
- unlock DLC weapons;
- correct items sorting (by price);
- can preload content (no lags during trader time);
- don't have to worry about adding new guns after each Tripware update.
# Usage & Setup
[See steam workshop page](https://steamcommunity.com/sharedfiles/filedetails/?id=2830826239)
# Build
**Note:** If you want to build/test/brew/publish a mutator without git-bash and/or scripts, follow [these instructions](https://tripwireinteractive.atlassian.net/wiki/spaces/KF2SW/pages/26247172/KF2+Code+Modding+How-to) instead of what is described here.
1. Install [Killing Floor 2](https://store.steampowered.com/app/232090/Killing_Floor_2/), Killing Floor 2 - SDK and [git for windows](https://git-scm.com/download/win);
2. open git-bash and go to any folder where you want to store sources:
`cd <ANY_FOLDER_YOU_WANT>`
3. Clone this repository and go to the source folder:
`git clone https://github.com/GenZmeY/KF2-CustomTraderInventory && cd KF2-CustomTraderInventory`
4. Download dependencies:
`git submodule init && git submodule update`
5. Compile:
`./tools/builder -c`
5. The compiled files will be here:
`C:\Users\<USERNAME>\Documents\My Games\KillingFloor2\KFGame\Unpublished\BrewedPC\Script\`
# Testing
Open git-bash in the source folder and run command:
`./tools/builder -t`
(or `./tools/builder -ct` if you haven't compiled the mutator yet)
A local single-user test will be launched with parameters from `builder.cfg` (edit this file if you want to test mutator with different parameters).
# Bug reports
If you find a bug, go to the [issue page](https://github.com/GenZmeY/KF2-CustomTraderInventory/issues) and check if there is a description of your bug. If not, create a new issue.
Describe what the bug looks like and how reproduce it.
# License
[GNU GPLv3](LICENSE)