Compare commits

..

No commits in common. "master" and "v1.8.0" have entirely different histories.

8 changed files with 28 additions and 118 deletions

View File

@ -230,7 +230,6 @@ private function PostInit()
{ {
if (RepInfo.PendingSync) if (RepInfo.PendingSync)
{ {
RepInfo.PrepareSync(Self, LogLevel, KFGI.KFGFxManagerClass, DLCSkinUpdateRequired.Value, bApplyPatch);
RepInfo.Replicate(WeapDefs); RepInfo.Replicate(WeapDefs);
} }
} }
@ -349,11 +348,12 @@ public function bool CreateRepInfo(Controller C)
if (RepInfo == None) return false; if (RepInfo == None) return false;
RepInfo.PrepareSync(Self, KFPlayerController(C), LogLevel, DLCSkinUpdateRequired.Value, bApplyPatch);
RepInfos.AddItem(RepInfo); RepInfos.AddItem(RepInfo);
if (ReadyToSync) if (ReadyToSync)
{ {
RepInfo.PrepareSync(Self, LogLevel, KFGI.KFGFxManagerClass, DLCSkinUpdateRequired.Value, bApplyPatch);
RepInfo.Replicate(WeapDefs); RepInfo.Replicate(WeapDefs);
} }
else else

View File

@ -23,9 +23,8 @@ private function CTI_GFxObject_TraderItems GetCTI_TraderItems()
private function CTI_InventoryManager GetCTI_IM() private function CTI_InventoryManager GetCTI_IM()
{ {
if (CTI_IM != Pawn.InvManager) if (CTI_IM == None)
{ {
`Log_Base("Update InvManager:" @ String(CTI_IM) @ "<-" @ String(Pawn.InvManager));
CTI_IM = CTI_InventoryManager(Pawn.InvManager); CTI_IM = CTI_InventoryManager(Pawn.InvManager);
} }

View File

@ -1,18 +1,5 @@
class CTI_InventoryManager extends KFInventoryManager; class CTI_InventoryManager extends KFInventoryManager;
var private CTI_RepInfo RepInfo;
public function Initialize(CTI_RepInfo _RepInfo)
{
RepInfo = _RepInfo;
}
public function OwnerDied()
{
RepInfo.SetTimer(1.0f, false, nameof(RepInfo.InitInventoryManager));
Super.OwnerDied();
}
// simulated function final BuyAmmo( float AmountPurchased, EItemType ItemType, optional byte ItemIndex, optional bool bSecondaryAmmo ) // simulated function final BuyAmmo( float AmountPurchased, EItemType ItemType, optional byte ItemIndex, optional bool bSecondaryAmmo )
public simulated function CTI_BuyAmmo(float AmountPurchased, EItemType ItemType, optional int ItemIndex, optional bool bSecondaryAmmo) public simulated function CTI_BuyAmmo(float AmountPurchased, EItemType ItemType, optional int ItemIndex, optional bool bSecondaryAmmo)
{ {
@ -470,35 +457,6 @@ private reliable server function CTI_ServerBuyGrenade(int AmountPurchased)
} }
} }
public simulated function int GetWeaponBlocks(const out STraderItem ShopItem, optional int OverrideLevelValue = INDEX_NONE)
{
local int ItemUpgradeLevel;
local KFPlayerController KFPC;
local Inventory InventoryItem;
if (ShopItem.SingleClassName != '' && OverrideLevelValue == INDEX_NONE && ClassNameIsInInventory(ShopItem.SingleClassName, InventoryItem))
{
ItemUpgradeLevel = KFWeapon(InventoryItem).CurrentWeaponUpgradeIndex;
}
else
{
if (OverrideLevelValue != INDEX_NONE)
{
ItemUpgradeLevel = OverrideLevelValue;
}
else
{
KFPC = KFPlayerController(Instigator.Owner);
if (KFPC != None)
{
ItemUpgradeLevel = KFPC.GetPurchaseHelper().GetItemUpgradeLevelByClassName(ShopItem.ClassName);
}
}
}
return ShopItem.BlocksRequired + (ItemUpgradeLevel > INDEX_NONE ? ShopItem.WeaponUpgradeWeight[ItemUpgradeLevel] : 0);
}
defaultproperties defaultproperties
{ {

View File

@ -23,8 +23,6 @@ var public bool PendingSync;
var private CTI CTI; var private CTI CTI;
var private E_LogLevel LogLevel; var private E_LogLevel LogLevel;
var private class<KFGFxMoviePlayer_Manager> FrontEndClass;
var private GameReplicationInfo GRI; var private GameReplicationInfo GRI;
var private KFPlayerController KFPC; var private KFPlayerController KFPC;
var private KFPlayerReplicationInfo KFPRI; var private KFPlayerReplicationInfo KFPRI;
@ -51,7 +49,7 @@ var private bool ClientReady, ServerReady;
replication replication
{ {
if (bNetInitial && Role == ROLE_Authority) if (bNetInitial && Role == ROLE_Authority)
LogLevel, SkinUpdateRequired, PatchRequired, FrontEndClass; LogLevel, SkinUpdateRequired, PatchRequired;
} }
public simulated function bool SafeDestroy() public simulated function bool SafeDestroy()
@ -62,50 +60,24 @@ public simulated function bool SafeDestroy()
} }
public function PrepareSync( public function PrepareSync(
CTI _CTI, E_LogLevel _LogLevel, CTI _CTI, KFPlayerController _KFPC, E_LogLevel _LogLevel,
class<KFGFxMoviePlayer_Manager> _FrontEndClass,
bool _SkinUpdateRequired, bool _PatchRequired) bool _SkinUpdateRequired, bool _PatchRequired)
{ {
`Log_Trace(); `Log_Trace();
CTI = _CTI; CTI = _CTI;
KFPC = _KFPC;
LogLevel = _LogLevel; LogLevel = _LogLevel;
FrontEndClass = _FrontEndClass;
SkinUpdateRequired = _SkinUpdateRequired; SkinUpdateRequired = _SkinUpdateRequired;
PatchRequired = _PatchRequired; PatchRequired = _PatchRequired;
} }
private reliable client function ClientSetFrontEnd()
{
if (FrontEndClass == None || GetKFPRI() == None)
{
`Log_Debug("Wait for frontend");
SetTimer(1.0f, false, nameof(ClientSetFrontEnd));
return;
}
if (KFPC.MyGFxManager != None && KFPC.MyGFxManager.class == FrontEndClass)
{
`Log_Debug("MyGFxManager is ok:" @ String(KFPC.MyGFxManager.class));
return;
}
KFPC.MyGFxManager.CloseMenus(true);
KFPC.MyGFxManager = None;
KFPC.ClientSetFrontEnd(FrontEndClass, KFPRI.bOnlySpectator);
`Log_Debug(String(FrontEndClass) @ "initialized.");
}
public function Replicate(const out Array<class<KFWeaponDefinition> > WeapDefs) public function Replicate(const out Array<class<KFWeaponDefinition> > WeapDefs)
{ {
`Log_Trace(); `Log_Trace();
ServerReady = !PatchRequired; ServerReady = !PatchRequired;
ClientSetFrontEnd();
if (PatchRequired) if (PatchRequired)
{ {
if (GetKFPC() != None) if (GetKFPC() != None)
@ -120,15 +92,14 @@ public function Replicate(const out Array<class<KFWeaponDefinition> > WeapDefs)
RepArray = WeapDefs; RepArray = WeapDefs;
RepData.Size = RepArray.Length; RepData.Size = RepArray.Length;
if (WorldInfo.NetMode != NM_StandAlone) if (WorldInfo.NetMode == NM_StandAlone)
{ {
Progress(RepArray.Length, RepArray.Length);
return;
}
Sync(); Sync();
} }
else
{
Finished();
}
}
private reliable server function Sync() private reliable server function Sync()
{ {
@ -208,10 +179,7 @@ private simulated function Finished()
if (KFGRI != None) if (KFGRI != None)
{ {
`Log_Debug("Finished: Trader.static.OverwriteTraderItems"); `Log_Debug("Finished: Trader.static.OverwriteTraderItems");
if (WorldInfo.NetMode != NM_StandAlone)
{
Trader.static.OverwriteTraderItems(KFGRI, RepArray, PatchRequired, LogLevel); Trader.static.OverwriteTraderItems(KFGRI, RepArray, PatchRequired, LogLevel);
}
`Log_Info("Trader items successfully synchronized!"); `Log_Info("Trader items successfully synchronized!");
} }
else else
@ -446,12 +414,6 @@ private reliable server function Cleanup()
{ {
`Log_Trace(); `Log_Trace();
if (PatchRequired)
{
`Log_Debug("Skip cleanup to keep CTI_RepInfo alive");
return;
}
`Log_Debug("Cleanup" @ GetKFPC() @ GetKFPRI() == None? "" : GetKFPRI().PlayerName); `Log_Debug("Cleanup" @ GetKFPC() @ GetKFPRI() == None? "" : GetKFPRI().PlayerName);
if (!CTI.DestroyRepInfo(GetKFPC())) if (!CTI.DestroyRepInfo(GetKFPC()))
{ {
@ -472,7 +434,7 @@ public function InitInventoryManager()
`Log_Trace(); `Log_Trace();
if (GetKFPRI() == None || !KFPRI.bHasSpawnedIn || KFPC.Pawn == None) if (GetKFPRI() == None || !KFPRI.bHasSpawnedIn)
{ {
`Log_Debug("Wait for spawn (InventoryManager)"); `Log_Debug("Wait for spawn (InventoryManager)");
SetTimer(1.0f, false, nameof(InitInventoryManager)); SetTimer(1.0f, false, nameof(InitInventoryManager));
@ -483,7 +445,6 @@ public function InitInventoryManager()
KFPC.Pawn.InventoryManagerClass = InventoryManager; KFPC.Pawn.InventoryManagerClass = InventoryManager;
NextInventoryManger = Spawn(KFPC.Pawn.InventoryManagerClass, KFPC.Pawn); NextInventoryManger = Spawn(KFPC.Pawn.InventoryManagerClass, KFPC.Pawn);
CTI_InventoryManager(NextInventoryManger).Initialize(Self);
if (NextInventoryManger == None) if (NextInventoryManger == None)
{ {

View File

@ -2,7 +2,7 @@ class RemoveItems extends Object
dependson(CTI) dependson(CTI)
config(CTI); config(CTI);
var public config bool bALL; var public config bool bAll;
var public config bool bHRG; var public config bool bHRG;
var public config bool bDLC; var public config bool bDLC;
var private config Array<String> Item; var private config Array<String> Item;
@ -29,11 +29,11 @@ public static function InitConfig(int Version, int LatestVersion)
private static function ApplyDefault() private static function ApplyDefault()
{ {
default.bALL = false; default.bAll = false;
default.bHRG = false; default.bHRG = false;
default.bDLC = false; default.bDLC = false;
default.Item.Length = 0; default.Item.Length = 0;
default.Item.AddItem("KFGame.SomeWeapon"); default.Item.AddItem("KFGame.KFWeapDef_9mmDual");
} }
public static function Array<class<KFWeaponDefinition> > Load(E_LogLevel LogLevel) public static function Array<class<KFWeaponDefinition> > Load(E_LogLevel LogLevel)
@ -45,7 +45,7 @@ public static function Array<class<KFWeaponDefinition> > Load(E_LogLevel LogLeve
local int Line; local int Line;
`Log_Info("Load items to remove:"); `Log_Info("Load items to remove:");
if (default.bALL) if (default.bAll)
{ {
`Log_Info("Remove all default items"); `Log_Info("Remove all default items");
} }

Binary file not shown.

Binary file not shown.

View File

@ -20,17 +20,15 @@ No. This mod is not whitelisted and will de-rank your server. Any XP gained will
[h1]Usage (single player)[/h1] [h1]Usage (single player)[/h1]
[olist] [olist]
[*]Subscribe to this mutator; [*]Subscribe to this mutator;
[*]Start KF2;
[*]Create a file [b](*)[/b]: [b]C:\Users\<username>\Documents\My Games\KillingFloor2\KFGame\Config\KFCTI.ini[/b] [*]Create a file [b](*)[/b]: [b]C:\Users\<username>\Documents\My Games\KillingFloor2\KFGame\Config\KFCTI.ini[/b]
with the following content: with the following content:
[b][CTI.CTI] [b][CTI.CTI]
Version=0[/b] Version=0[/b]
[*]Start KF2; [*]Open console (~) and input:
[*]Open console (~) and start any map with CTI (this will generate the default KFCTI.ini content):
[b]open KF-BioticsLab?Mutator=CTI.Mut[/b] [b]open KF-BioticsLab?Mutator=CTI.Mut[/b]
[*]Close the game and configure CTI as you need (see the [b]Setup (KFCTI.ini)[/b] section below); (replace the map and add the parameters you need)
[*]Start KF2, open the console, start the game: [*]<Enter>.
[b]open KF-BioticsLab?Mutator=CTI.Mut[/b]
(replace the map and add the parameters you need).
[/olist] [/olist]
[h1]Usage (server)[/h1] [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] [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]
@ -42,18 +40,15 @@ Version=0[/b]
[*]Add the following string to the [b][OnlineSubsystemSteamworks.KFWorkshopSteamworks][/b] section (create one if it doesn't exist): [*]Add the following string to the [b][OnlineSubsystemSteamworks.KFWorkshopSteamworks][/b] section (create one if it doesn't exist):
[b]ServerSubscribedWorkshopItems=2830826239[/b] [b]ServerSubscribedWorkshopItems=2830826239[/b]
[*]Start the server and wait while the mutator is downloading; [*]Start the server and wait while the mutator is downloading;
[*]When the download is complete, close the server;
[*]Create a file [b](*)[/b]: [b]<kf2-server>\KFGame\Config\KFCTI.ini[/b] [*]Create a file [b](*)[/b]: [b]<kf2-server>\KFGame\Config\KFCTI.ini[/b]
with the following content: with the following content:
[b][CTI.CTI] [b][CTI.CTI]
Version=0[/b] Version=0[/b]
[*]Add mutator to server start parameters: [b]?Mutator=CTI.Mut[/b] and start the server (this will generate the default KFCTI.ini content); [*]Add mutator to server start parameters: [b]?Mutator=CTI.Mut[/b] and restart the server.
[*]Close the server and configure CTI as you need (see the [b]Setup (KFCTI.ini)[/b] section below);
[*]Start the server (with [b]?Mutator=CTI.Mut[/b]) again.
[/olist] [/olist]
[h1][b](*)[/b] Buggy config variables initialization[/h1] [h1][b](*)[/b] Buggy config variables initialization[/h1]
CTI, like many other mutators, initializes the config by relying on the unreal script feature which uses default values for each data type that is not explicitly specified. For the int type (which is used to store the config version) this is zero - detecting zero allows to understand that the mutator is being used for the first time (which means it's need to generate a config). But now the game contains a bug that initializes the config values randomly if they are not explicitly set. Thus, the config may have incorrect values or not be created at all. This is why I recommend explicitly set [b]Version=0[/b] in the config for the first time. CTI, like many other mutators, initializes the config by relying on the unreal script feature which uses default values for each data type that is not explicitly specified. For the int type (which is used to store the config version) this is zero - detecting zero allows to understand that the mutator is being used for the first time (which means it's need to generate a config). But now the game contains a bug that initializes the config values randomly if they are not explicitly set. Thus, the config may have incorrect values or not be created at all. This is why I recommend explicitly set Version=0 in the config for the first time.
Unfortunately I can't do anything about it because it's a game problem (not mutator). I hope TWI fixes this someday. Unfortunately I can't do anything about it because it's a game problem (not mutator). I hope TWI fixes this someday.
@ -61,11 +56,11 @@ Unfortunately I can't do anything about it because it's a game problem (not muta
[list] [list]
[*][b]bDisableItemLimitCheck[/b]: The original game does not support more than 256 trader items, adding items above this limit causes bugs. If this problem is solved (For example, if you are using a mutator that has already fixed this problem or by enabling [b]bApplyPatch[/b]) then it can be set [b]bDisableItemLimitCheck=True[/b] to remove the limit, otherwise it is better to leave it [b]False[/b]. [*][b]bDisableItemLimitCheck[/b]: The original game does not support more than 256 trader items, adding items above this limit causes bugs. If this problem is solved (For example, if you are using a mutator that has already fixed this problem or by enabling [b]bApplyPatch[/b]) then it can be set [b]bDisableItemLimitCheck=True[/b] to remove the limit, otherwise it is better to leave it [b]False[/b].
[*]Set [b]bApplyPatch=True[/b] to fix some base classes of the game: this fixes problems when adding more than 256 items to a trader and will allow players to sell weapons that have been removed from trader inventory. Note that enabling this parameter replaces the following classes: [b]KFAutoPurchaseHelper[/b], [b]KFInventoryManager[/b], [b]KFGFxMenu_Trader[/b], [b]KFGFxObject_TraderItems[/b]. There may be compatibility issues with mutators that also replace them. [*]Set [b]bApplyPatch=True[/b] to fix some base classes of the game: this fixes problems when adding more than 256 items to a trader and will allow players to sell weapons that have been removed from trader inventory. Note that enabling this parameter replaces the following classes: KFAutoPurchaseHelper, KFInventoryManager, KFGFxMenu_Trader, KFGFxObject_TraderItems. There may be compatibility issues with mutators that also replace them.
[*]Set [b]bPreloadContent=True[/b] to load weapon models in advance and have no lags when someone buys weapons. In some cases (usually if there is a lot of custom content), enabling preload can cause models to disappear. It is recommended to test how this setting affects the game for your server configuration and then decide whether to enable preloading or not. [*]Set [b]bPreloadContent=True[/b] to load weapon models in advance and have no lags during the game. In some cases (usually if there is a lot of custom content), enabling preload can cause models to disappear. It is recommended to test how this setting affects the game for your server configuration and then decide whether to enable preloading or not.
[*]Set [b]bOfficialWeaponsList=True[/b] to have an auto-updated list of all official weapons in the config (for a convenient copy-paste) or leave it [b]False[/b] if you want a clean config without unnecessary things. [*]Set [b]bOfficialWeaponsList=True[/b] to have an auto-updated list of all official weapons in the config (for a convenient copy-paste).
[*]Set [b]UnlockDLC[/b] to customize DLC weapon unlocks. Here are the possible values: [*]Set [b]UnlockDLC[/b] to customize DLC weapon unlocks. Here are the possible values:
[list] [list]
@ -78,7 +73,7 @@ Unfortunately I can't do anything about it because it's a game problem (not muta
[*]Use [b][CTI.RemoveItems][/b] to remove items from the trader inventory. [*]Use [b][CTI.RemoveItems][/b] to remove items from the trader inventory.
example: [b]Item=KFGame.KFWeapDef_Mac10[/b] will remove MAC10 from sale. 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). [*]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).
[*]Set [b]bHRG=True[/b] to remove HRG items. [*]Set [b]bHRG=True[/b] to remove HRG items.
[*]Set [b]bDLC=True[/b] to remove DLC items. [*]Set [b]bDLC=True[/b] to remove DLC items.
@ -93,8 +88,5 @@ This is necessary to explicitly initialize the list (because of the bug I wrote
📌 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. 📌 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). 📌 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]Translators:[/h1]
[url=https://steamcommunity.com/profiles/76561199126205919]cheungfatzong[/url] - Traditional [CHT] and Simplified [CHN] Chinese.
[h1]Sources[/h1] [h1]Sources[/h1]
[url=https://github.com/GenZmeY/KF2-CustomTraderInventory]https://github.com/GenZmeY/KF2-CustomTraderInventory[/url] [b](GNU GPLv3)[/b] [url=https://github.com/GenZmeY/KF2-CustomTraderInventory]https://github.com/GenZmeY/KF2-CustomTraderInventory[/url] [b](GNU GPLv3)[/b]