Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
559eae0298 | |||
e3535715fa | |||
3218132314 | |||
edda872f5f | |||
eef8aa42f2 | |||
351f3a46b0 |
@ -133,11 +133,41 @@ private function PostInit()
|
||||
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';
|
||||
`Log_Info("DLC unlocked");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (KFGI.GameReplicationInfo == None)
|
||||
{
|
||||
|
8
CTI/Classes/CTI_GFxMoviePlayer_Manager_Versus.uc
Normal file
8
CTI/Classes/CTI_GFxMoviePlayer_Manager_Versus.uc
Normal 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'))
|
||||
}
|
@ -89,9 +89,28 @@ private simulated function bool CheckPartyInGameWidget()
|
||||
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.SetFloat("percent", Percent);
|
||||
@ -114,10 +133,7 @@ private reliable client function ClientSync(class<KFWeaponDefinition> WeapDef, o
|
||||
return;
|
||||
}
|
||||
|
||||
if (CheckPartyInGameWidget())
|
||||
{
|
||||
PartyInGameWidget.SetReadyButtonVisibility(false);
|
||||
}
|
||||
HideReadyButton();
|
||||
|
||||
if (Remove)
|
||||
{
|
||||
@ -126,29 +142,19 @@ private reliable client function ClientSync(class<KFWeaponDefinition> WeapDef, o
|
||||
else
|
||||
{
|
||||
AddItems.AddItem(WeapDef);
|
||||
if (PreloadContent)
|
||||
{
|
||||
Helper.static.PreloadWeapon(WeapDef);
|
||||
}
|
||||
}
|
||||
|
||||
Recieved = RemoveItems.Length + AddItems.Length;
|
||||
if (CheckPartyInGameWidget())
|
||||
{
|
||||
|
||||
UpdateNotification(
|
||||
"Sync items, please wait...",
|
||||
Remove ? "-" : "+" @ Repl(String(WeapDef), "KFWeapDef_", ""),
|
||||
Recieved @ "/" @ SyncSize,
|
||||
(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();
|
||||
}
|
||||
@ -175,22 +181,7 @@ private simulated reliable client function SyncFinished()
|
||||
|
||||
Helper.static.ModifyTrader(KFGRI, RemoveItems, AddItems, ReplaceMode);
|
||||
|
||||
if (PreloadContent)
|
||||
{
|
||||
Helper.static.PreloadContent(AddItems);
|
||||
}
|
||||
if (ForcePreloadContent)
|
||||
{
|
||||
PreloadContentWorkaround();
|
||||
}
|
||||
|
||||
if (CheckPartyInGameWidget())
|
||||
{
|
||||
Notification.SetVisible(false);
|
||||
PartyInGameWidget.SetReadyButtonVisibility(true);
|
||||
PartyInGameWidget.UpdateReadyButtonText();
|
||||
PartyInGameWidget.UpdateReadyButtonVisibility();
|
||||
}
|
||||
ShowReadyButton();
|
||||
|
||||
SafeDestroy();
|
||||
}
|
||||
@ -205,7 +196,13 @@ public reliable server function ServerSync()
|
||||
|
||||
if (SyncSize <= Recieved || WorldInfo.NetMode == NM_StandAlone)
|
||||
{
|
||||
if (ForcePreloadContent)
|
||||
{
|
||||
PreloadContentWorkaround();
|
||||
}
|
||||
|
||||
SyncFinished();
|
||||
|
||||
if (!CTI.DestroyRepLink(Controller(Owner)))
|
||||
{
|
||||
SafeDestroy();
|
||||
@ -224,7 +221,7 @@ public reliable server function ServerSync()
|
||||
}
|
||||
}
|
||||
|
||||
private simulated function PreloadContentWorkaround()
|
||||
private function PreloadContentWorkaround()
|
||||
{
|
||||
local PlayerController PC;
|
||||
local Pawn P;
|
||||
@ -237,6 +234,7 @@ private simulated function PreloadContentWorkaround()
|
||||
|
||||
`Log_Trace(`Location);
|
||||
|
||||
HideReadyButton();
|
||||
PC = GetPlayerController();
|
||||
|
||||
if (PC == None)
|
||||
@ -264,6 +262,13 @@ private simulated function PreloadContentWorkaround()
|
||||
|
||||
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'));
|
||||
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)
|
||||
{
|
||||
if (W != None)
|
||||
@ -285,6 +293,9 @@ private simulated function PreloadContentWorkaround()
|
||||
}
|
||||
}
|
||||
|
||||
HideReadyButton();
|
||||
UpdateNotification("Cleanup", "", "", 0);
|
||||
|
||||
foreach WorldInfo.DynamicActors(class'DroppedPickup', DP)
|
||||
{
|
||||
if (DP.Instigator == P && DP.CreationTime > Time)
|
||||
@ -295,7 +306,7 @@ private simulated function PreloadContentWorkaround()
|
||||
|
||||
KFIM.bInfiniteWeight = false;
|
||||
|
||||
`Log_Info("Force Preload Finished");
|
||||
`Log_Info("Force Preload Finished (" $ PC.PlayerReplicationInfo.PlayerName $ ")");
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
|
@ -52,20 +52,30 @@ public static simulated function ModifyTrader(
|
||||
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 int Index;
|
||||
|
||||
for (Index = 0; Index < WeapDefs.Length; Index++)
|
||||
{
|
||||
KFW = class<KFWeapon> (DynamicLoadObject(WeapDefs[Index].default.WeaponClassPath, class'Class'));
|
||||
KFW = class<KFWeapon> (DynamicLoadObject(WeapDef.default.WeaponClassPath, class'Class'));
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -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]
|
||||
description will come later...
|
||||
[h1]Whitelisted?[/h1]
|
||||
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]
|
||||
[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 |
50
README.md
50
README.md
@ -1 +1,49 @@
|
||||
# KF2-CustomTraderInventory
|
||||
# Custom Trader Inventory
|
||||
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2830826239)
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2830826239)
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2830826239)
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2830826239)
|
||||
[](https://github.com/GenZmeY/KF2-CustomTraderInventory/tags)
|
||||
[](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)
|
||||
|
Reference in New Issue
Block a user