diff --git a/Core/Helpers/AssortHelper.cs b/Core/Helpers/AssortHelper.cs
new file mode 100644
index 00000000..c479963d
--- /dev/null
+++ b/Core/Helpers/AssortHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class AssortHelper
+{
+
+}
diff --git a/Core/Helpers/BotDifficultyHelper.cs b/Core/Helpers/BotDifficultyHelper.cs
new file mode 100644
index 00000000..961d56a9
--- /dev/null
+++ b/Core/Helpers/BotDifficultyHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class BotDifficultyHelper
+{
+
+}
diff --git a/Core/Helpers/BotGeneratorHelper.cs b/Core/Helpers/BotGeneratorHelper.cs
new file mode 100644
index 00000000..1e35785f
--- /dev/null
+++ b/Core/Helpers/BotGeneratorHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class BotGeneratorHelper
+{
+
+}
diff --git a/Core/Helpers/BotHelper.cs b/Core/Helpers/BotHelper.cs
new file mode 100644
index 00000000..8bbd70e2
--- /dev/null
+++ b/Core/Helpers/BotHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class BotHelper
+{
+
+}
diff --git a/Core/Helpers/BotWeaponGeneratorHelper.cs b/Core/Helpers/BotWeaponGeneratorHelper.cs
new file mode 100644
index 00000000..237209f8
--- /dev/null
+++ b/Core/Helpers/BotWeaponGeneratorHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class BotWeaponGeneratorHelper
+{
+
+}
diff --git a/Core/Helpers/ContainerHelper.cs b/Core/Helpers/ContainerHelper.cs
new file mode 100644
index 00000000..463f7573
--- /dev/null
+++ b/Core/Helpers/ContainerHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class ContainerHelper
+{
+
+}
diff --git a/Core/Helpers/Dialogue/AbstractDialogChatBot.cs b/Core/Helpers/Dialogue/AbstractDialogChatBot.cs
new file mode 100644
index 00000000..a2e4b29e
--- /dev/null
+++ b/Core/Helpers/Dialogue/AbstractDialogChatBot.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialogue;
+
+public class AbstractDialogChatBot
+{
+
+}
diff --git a/Core/Helpers/Dialogue/Commando/ChatCommand.cs b/Core/Helpers/Dialogue/Commando/ChatCommand.cs
new file mode 100644
index 00000000..440718de
--- /dev/null
+++ b/Core/Helpers/Dialogue/Commando/ChatCommand.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialog.Commando;
+
+public class ChatCommand
+{
+
+}
diff --git a/Core/Helpers/Dialogue/Commando/SptCommandoCommands.cs b/Core/Helpers/Dialogue/Commando/SptCommandoCommands.cs
new file mode 100644
index 00000000..b2056c8c
--- /dev/null
+++ b/Core/Helpers/Dialogue/Commando/SptCommandoCommands.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialog.Commando;
+
+public class SptCommandoCommands
+{
+
+}
diff --git a/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/GiveSptCommand.cs b/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/GiveSptCommand.cs
new file mode 100644
index 00000000..40450a11
--- /dev/null
+++ b/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/GiveSptCommand.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialog.Commando.SptCommands.GiveCommand;
+
+public class GiveSptCommand
+{
+
+}
diff --git a/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/SavedCommand.cs b/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/SavedCommand.cs
new file mode 100644
index 00000000..f6abea47
--- /dev/null
+++ b/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/SavedCommand.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialog.Commando.SptCommands.GiveCommand;
+
+public class SavedCommand
+{
+
+}
diff --git a/Core/Helpers/Dialogue/Commando/SptCommands/ProfileCommand/ProfileSptCommand.cs b/Core/Helpers/Dialogue/Commando/SptCommands/ProfileCommand/ProfileSptCommand.cs
new file mode 100644
index 00000000..95257a11
--- /dev/null
+++ b/Core/Helpers/Dialogue/Commando/SptCommands/ProfileCommand/ProfileSptCommand.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialog.Commando.SptCommands.ProfileCommand;
+
+public class ProfileSptCommand
+{
+
+}
diff --git a/Core/Helpers/Dialogue/Commando/SptCommands/SptCommand.cs b/Core/Helpers/Dialogue/Commando/SptCommands/SptCommand.cs
new file mode 100644
index 00000000..e586d3c4
--- /dev/null
+++ b/Core/Helpers/Dialogue/Commando/SptCommands/SptCommand.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialog.Commando.SptCommands;
+
+public class SptCommand
+{
+
+}
diff --git a/Core/Helpers/Dialogue/Commando/SptCommands/TraderCommand/TraderSptCommand.cs b/Core/Helpers/Dialogue/Commando/SptCommands/TraderCommand/TraderSptCommand.cs
new file mode 100644
index 00000000..f0ddda60
--- /dev/null
+++ b/Core/Helpers/Dialogue/Commando/SptCommands/TraderCommand/TraderSptCommand.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialog.Commando.SptCommands.TraderCommand;
+
+public class TraderSptCommand
+{
+
+}
diff --git a/Core/Helpers/Dialogue/CommandoDialogChatBot.cs b/Core/Helpers/Dialogue/CommandoDialogChatBot.cs
new file mode 100644
index 00000000..5a565be4
--- /dev/null
+++ b/Core/Helpers/Dialogue/CommandoDialogChatBot.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialogue;
+
+public class CommandoDialogChatBot
+{
+
+}
diff --git a/Core/Helpers/Dialogue/DialogueChatBot.cs b/Core/Helpers/Dialogue/DialogueChatBot.cs
new file mode 100644
index 00000000..d6d24f29
--- /dev/null
+++ b/Core/Helpers/Dialogue/DialogueChatBot.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialogue;
+
+public class DialogueChatBot
+{
+
+}
diff --git a/Core/Helpers/Dialogue/SptDialogueChatBot.cs b/Core/Helpers/Dialogue/SptDialogueChatBot.cs
new file mode 100644
index 00000000..625de802
--- /dev/null
+++ b/Core/Helpers/Dialogue/SptDialogueChatBot.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers.Dialogue;
+
+public class SptDialogueChatBot
+{
+
+}
diff --git a/Core/Helpers/DialogueHelper.cs b/Core/Helpers/DialogueHelper.cs
new file mode 100644
index 00000000..5c025678
--- /dev/null
+++ b/Core/Helpers/DialogueHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class DialogueHelper
+{
+
+}
diff --git a/Core/Helpers/DurabilityLimitsHelper.cs b/Core/Helpers/DurabilityLimitsHelper.cs
new file mode 100644
index 00000000..657b33ef
--- /dev/null
+++ b/Core/Helpers/DurabilityLimitsHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class DurabilityLimitsHelper
+{
+
+}
diff --git a/Core/Helpers/GameEventHelper.cs b/Core/Helpers/GameEventHelper.cs
new file mode 100644
index 00000000..40790d30
--- /dev/null
+++ b/Core/Helpers/GameEventHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class GameEventHelper
+{
+
+}
diff --git a/Core/Helpers/HandbookHelper.cs b/Core/Helpers/HandbookHelper.cs
new file mode 100644
index 00000000..a4d70611
--- /dev/null
+++ b/Core/Helpers/HandbookHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class HandbookHelper
+{
+
+}
diff --git a/Core/Helpers/HealthHelper.cs b/Core/Helpers/HealthHelper.cs
new file mode 100644
index 00000000..53a64de8
--- /dev/null
+++ b/Core/Helpers/HealthHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class HealthHelper
+{
+
+}
diff --git a/Core/Helpers/HideoutHelper.cs b/Core/Helpers/HideoutHelper.cs
new file mode 100644
index 00000000..5e9aa595
--- /dev/null
+++ b/Core/Helpers/HideoutHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class HideoutHelper
+{
+
+}
diff --git a/Core/Helpers/HttpServerHelper.cs b/Core/Helpers/HttpServerHelper.cs
new file mode 100644
index 00000000..0fb865aa
--- /dev/null
+++ b/Core/Helpers/HttpServerHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class HttpServerHelper
+{
+
+}
diff --git a/Core/Helpers/InRaidHelper.cs b/Core/Helpers/InRaidHelper.cs
new file mode 100644
index 00000000..35940273
--- /dev/null
+++ b/Core/Helpers/InRaidHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class InRaidHelper
+{
+
+}
diff --git a/Core/Helpers/InventoryHelper.cs b/Core/Helpers/InventoryHelper.cs
new file mode 100644
index 00000000..3a4ade47
--- /dev/null
+++ b/Core/Helpers/InventoryHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class InventoryHelper
+{
+
+}
diff --git a/Core/Helpers/ItemHelper.cs b/Core/Helpers/ItemHelper.cs
new file mode 100644
index 00000000..a9be7a25
--- /dev/null
+++ b/Core/Helpers/ItemHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class ItemHelper
+{
+
+}
diff --git a/Core/Helpers/NotificationSendHelper.cs b/Core/Helpers/NotificationSendHelper.cs
new file mode 100644
index 00000000..b848ecf7
--- /dev/null
+++ b/Core/Helpers/NotificationSendHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class NotificationSendHelper
+{
+
+}
diff --git a/Core/Helpers/NotifierHelper.cs b/Core/Helpers/NotifierHelper.cs
new file mode 100644
index 00000000..466d0714
--- /dev/null
+++ b/Core/Helpers/NotifierHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class NotifierHelper
+{
+
+}
diff --git a/Core/Helpers/PaymentHelper.cs b/Core/Helpers/PaymentHelper.cs
new file mode 100644
index 00000000..058c6aeb
--- /dev/null
+++ b/Core/Helpers/PaymentHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class PaymentHelper
+{
+
+}
diff --git a/Core/Helpers/PresetHelper.cs b/Core/Helpers/PresetHelper.cs
new file mode 100644
index 00000000..1f7baa52
--- /dev/null
+++ b/Core/Helpers/PresetHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class PresetHelper
+{
+
+}
diff --git a/Core/Helpers/ProbabilityHelper.cs b/Core/Helpers/ProbabilityHelper.cs
new file mode 100644
index 00000000..8a0a7ee5
--- /dev/null
+++ b/Core/Helpers/ProbabilityHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class ProbabilityHelper
+{
+
+}
diff --git a/Core/Helpers/ProfileHelper.cs b/Core/Helpers/ProfileHelper.cs
new file mode 100644
index 00000000..24ec1eab
--- /dev/null
+++ b/Core/Helpers/ProfileHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class ProfileHelper
+{
+
+}
diff --git a/Core/Helpers/QuestConditionHelper.cs b/Core/Helpers/QuestConditionHelper.cs
new file mode 100644
index 00000000..f64e3508
--- /dev/null
+++ b/Core/Helpers/QuestConditionHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class QuestConditionHelper
+{
+
+}
diff --git a/Core/Helpers/QuestHelper.cs b/Core/Helpers/QuestHelper.cs
new file mode 100644
index 00000000..9739a2f0
--- /dev/null
+++ b/Core/Helpers/QuestHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class QuestHelper
+{
+
+}
diff --git a/Core/Helpers/RagfairHelper.cs b/Core/Helpers/RagfairHelper.cs
new file mode 100644
index 00000000..86596e0b
--- /dev/null
+++ b/Core/Helpers/RagfairHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class RagfairHelper
+{
+
+}
diff --git a/Core/Helpers/RagfairOfferHelper.cs b/Core/Helpers/RagfairOfferHelper.cs
new file mode 100644
index 00000000..8d095748
--- /dev/null
+++ b/Core/Helpers/RagfairOfferHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class RagfairOfferHelper
+{
+
+}
diff --git a/Core/Helpers/RagfairSellHelper.cs b/Core/Helpers/RagfairSellHelper.cs
new file mode 100644
index 00000000..65aa84ec
--- /dev/null
+++ b/Core/Helpers/RagfairSellHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class RagfairSellHelper
+{
+
+}
diff --git a/Core/Helpers/RagfairServerHelper.cs b/Core/Helpers/RagfairServerHelper.cs
new file mode 100644
index 00000000..ef20ffe6
--- /dev/null
+++ b/Core/Helpers/RagfairServerHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class RagfairServerHelper
+{
+
+}
diff --git a/Core/Helpers/RagfairSortHelper.cs b/Core/Helpers/RagfairSortHelper.cs
new file mode 100644
index 00000000..d3b659b3
--- /dev/null
+++ b/Core/Helpers/RagfairSortHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class RagfairSortHelper
+{
+
+}
diff --git a/Core/Helpers/RepairHelper.cs b/Core/Helpers/RepairHelper.cs
new file mode 100644
index 00000000..39f7cd26
--- /dev/null
+++ b/Core/Helpers/RepairHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class RepairHelper
+{
+
+}
diff --git a/Core/Helpers/RepeatableQuestHelper.cs b/Core/Helpers/RepeatableQuestHelper.cs
new file mode 100644
index 00000000..2688a25e
--- /dev/null
+++ b/Core/Helpers/RepeatableQuestHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class RepeatableQuestHelper
+{
+
+}
diff --git a/Core/Helpers/SecureContainerHelper.cs b/Core/Helpers/SecureContainerHelper.cs
new file mode 100644
index 00000000..515eb869
--- /dev/null
+++ b/Core/Helpers/SecureContainerHelper.cs
@@ -0,0 +1,6 @@
+namespace Core.Helpers;
+
+public class SecureContainerHelper
+{
+
+}
diff --git a/Core/Helpers/TradeHelper.cs b/Core/Helpers/TradeHelper.cs
new file mode 100644
index 00000000..ed199769
--- /dev/null
+++ b/Core/Helpers/TradeHelper.cs
@@ -0,0 +1,82 @@
+using Core.Models.Eft.Common;
+using Core.Models.Eft.Common.Tables;
+using Core.Models.Eft.ItemEvent;
+using Core.Models.Eft.Trade;
+
+namespace Core.Helpers;
+
+public class TradeHelper
+{
+ public TradeHelper()
+ {
+
+ }
+
+ ///
+ /// Buy item from flea or trader
+ ///
+ /// Player profile
+ /// data from client
+ /// Session id
+ /// Should item be found in raid
+ /// Item event router response
+ public void buyItem(
+ PmcData pmcData,
+ ProcessBuyTradeRequestData buyRequestData,
+ string sessionID,
+ bool foundInRaid,
+ ItemEventRouterResponse output
+ )
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Sell item to trader
+ ///
+ /// Profile to remove items from
+ /// Profile to accept the money for selling item
+ /// Request data
+ /// Session id
+ /// Item event router response
+ public void sellItem(
+ PmcData profileWithItemsToSell,
+ PmcData profileToReceiveMoney,
+ ProcessSellTradeRequestData sellRequest,
+ string sessionID,
+ ItemEventRouterResponse output
+ )
+ {
+ throw new NotImplementedException();
+ }
+
+ protected void incrementCirculateSoldToTraderCounter(
+ PmcData profileWithItemsToSell,
+ PmcData profileToReceiveMoney,
+ ProcessSellTradeRequestData sellRequest
+ )
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Traders allow a limited number of purchases per refresh cycle (default 60 mins)
+ ///
+ /// Session id
+ /// Profile making the purchase
+ /// Trader assort is purchased from
+ /// the item from trader being bought
+ /// Id of assort being purchased
+ /// How many of the item are being bought
+ protected void checkPurchaseIsWithinTraderItemLimit(
+ string sessionId,
+ PmcData pmcData,
+ string traderId,
+ Item assortBeingPurchased,
+ string assortId,
+ int count
+ )
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/Core/Helpers/TraderAssortHelper.cs b/Core/Helpers/TraderAssortHelper.cs
new file mode 100644
index 00000000..ad5626f1
--- /dev/null
+++ b/Core/Helpers/TraderAssortHelper.cs
@@ -0,0 +1,82 @@
+using Core.Models.Eft.Common.Tables;
+
+namespace Core.Helpers;
+
+public class TraderAssortHelper
+{
+ public TraderAssortHelper()
+ {
+
+ }
+
+ ///
+ /// Get a traders assorts
+ /// Can be used for returning ragfair / fence assorts
+ /// Filter out assorts not unlocked due to level OR quest completion
+ ///
+ /// session id
+ /// traders id
+ /// Should assorts player hasn't unlocked be returned - default false
+ /// a traders' assorts
+ public TraderAssort GetAssort(string sessionId, string traderId, bool showLockedAssorts = false)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Given the blacklist provided, remove root items from assort
+ ///
+ /// Trader assort to modify
+ /// Item TPLs the assort should not have
+ protected void RemoveItemsFromAssort(TraderAssort assortToFilter, List itemsTplsToRemove)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Reset every traders root item `BuyRestrictionCurrent` property to 0
+ ///
+ /// Items to adjust
+ protected void ResetBuyRestrictionCurrentValue(List assortItems)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Create a dict of all assort id = quest id mappings used to work out what items should be shown to player based on the quests they've started/completed/failed
+ ///
+ protected void HydrateMergedQuestAssorts()
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Reset a traders assorts and move nextResupply value to future
+ /// Flag trader as needing a flea offer reset to be picked up by flea update() function
+ ///
+ /// trader details to alter
+ public void ResetExpiredTrader(Trader trader)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Does the supplied trader need its assorts refreshed
+ ///
+ /// Trader to check
+ /// true they need refreshing
+ public bool TraderAssortsHaveExpired(string traderID)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Get an array of pristine trader items prior to any alteration by player (as they were on server start)
+ ///
+ /// trader id
+ /// array of Items
+ protected List GetPristineTraderAssorts(string traderId)
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/Core/Helpers/TraderHelper.cs b/Core/Helpers/TraderHelper.cs
new file mode 100644
index 00000000..d4d0c694
--- /dev/null
+++ b/Core/Helpers/TraderHelper.cs
@@ -0,0 +1,254 @@
+using Core.Models.Eft.Common;
+using Core.Models.Eft.Common.Tables;
+using Core.Models.Eft.Profile;
+using Core.Models.Enums;
+using Core.Models.Spt.Config;
+
+namespace Core.Helpers;
+
+public class TraderHelper
+{
+ private TraderConfig _traderConfig;
+ private Dictionary? _highestTraderPriceItems;
+
+ public TraderHelper()
+ {
+ }
+
+ ///
+ /// Get a trader base object, update profile to reflect players current standing in profile
+ /// when trader not found in profile
+ ///
+ /// Traders Id to get
+ /// Players id
+ /// Trader base
+ public TraderBase GetTrader(string traderID, string sessionID)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Get all assort data for a particular trader
+ ///
+ /// Trader to get assorts for
+ /// TraderAssort
+ public TraderAssort GetTraderAssortsByTraderId(string traderId)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Retrieve the Item from a traders assort data by its id
+ ///
+ /// Trader to get assorts for
+ /// Id of assort to find
+ /// Item object
+ public Item GetTraderAssortItemByAssortId(string traderId, string assortId)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Reset a profiles trader data back to its initial state as seen by a level 1 player
+ /// Does NOT take into account different profile levels
+ ///
+ /// session id of player
+ /// trader id to reset
+ public void ResetTrader(string sessionID, string traderID)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Get the starting standing of a trader based on the current profiles type (e.g. EoD, Standard etc)
+ ///
+ /// Trader id to get standing for
+ /// Raw profile from profiles.json to look up standing from
+ /// Standing value
+ protected double GetStartingStanding(string traderId, ProfileTraderTemplate rawProfileTemplate)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Add a list of suit ids to a profiles suit list, no duplicates
+ ///
+ /// Profile to add to
+ /// Suit Ids to add
+ protected void AddSuitsToProfile(SptProfile fullProfile, List suitIds)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Alter a traders unlocked status
+ ///
+ /// Trader to alter
+ /// New status to use
+ /// Session id of player
+ public void SetTraderUnlockedState(string traderId, bool status, string sessionId)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Add standing to a trader and level them up if exp goes over level threshold
+ ///
+ /// Session id of player
+ /// Traders id to add standing to
+ /// Standing value to add to trader
+ public void AddStandingToTrader(string sessionId, string traderId, double standingToAdd)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Add standing to current standing and clamp value if it goes too low
+ ///
+ /// current trader standing
+ /// standing to add to trader standing
+ /// current standing + added standing (clamped if needed)
+ protected double AddStandingValuesTogether(double currentStanding, double standingToAdd)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Iterate over a profile's traders and ensure they have the correct loyalty level for the player.
+ ///
+ /// Profile to check.
+ public void ValidateTraderStandingsAndPlayerLevelForProfile(string sessionId)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Calculate trader's level based on experience amount and increments level if over threshold.
+ /// Also validates and updates player level if not correct based on XP value.
+ ///
+ /// Trader to check standing of.
+ /// Profile to update trader in.
+ public void LevelUp(string traderID, PmcData pmcData)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Get the next update timestamp for a trader.
+ ///
+ /// Trader to look up update value for.
+ /// Future timestamp.
+ public long GetNextUpdateTimestamp(string traderID)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Get the reset time between trader assort refreshes in seconds.
+ ///
+ /// Trader to look up.
+ /// Time in seconds.
+ public long? GetTraderUpdateSeconds(string traderId)
+ {
+ throw new NotImplementedException();
+ }
+
+ public TraderLoyaltyLevel GetLoyaltyLevel(string traderID, PmcData pmcData)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Store the purchase of an assort from a trader in the player profile
+ ///
+ /// Session id
+ /// New item assort id + count
+ public void AddTraderPurchasesToPlayerProfile(
+ string sessionID,
+ object newPurchaseDetails, // TODO: TYPE FUCKEY { items: { itemId: string; count: number }[]; traderId: string }
+ Item itemPurchased)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// EoD and Unheard get a 20% bonus to personal trader limit purchases
+ ///
+ /// Existing value from trader item
+ /// Profiles game version
+ /// buyRestrictionMax value
+ public double GetAccountTypeAdjustedTraderPurchaseLimit(double buyRestrictionMax, string gameVersion)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Get the highest rouble price for an item from traders
+ /// UNUSED
+ ///
+ /// Item to look up highest price for
+ /// highest rouble cost for item
+ public double GetHighestTraderPriceRouble(string tpl)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Get the highest price item can be sold to trader for (roubles)
+ ///
+ /// Item to look up best trader sell-to price
+ /// Rouble price
+ public double GetHighestSellToTraderPrice(string tpl)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Get a trader enum key by its value
+ ///
+ /// Traders id
+ /// Traders key
+ public Trader GetTraderById(string traderId)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Validates that the provided traderEnumValue exists in the Traders enum. If the value is valid, it returns the
+ /// same enum value, effectively serving as a trader ID; otherwise, it logs an error and returns an empty string.
+ /// This method provides a runtime check to prevent undefined behavior when using the enum as a dictionary key.
+ ///
+ /// For example, instead of this:
+ /// const traderId = Traders[Traders.PRAPOR];
+ ///
+ /// You can use safely use this:
+ /// const traderId = this.traderHelper.getValidTraderIdByEnumValue(Traders.PRAPOR);
+ ///
+ ///
+ /// The trader enum value to validate
+ /// The validated trader enum value as a string, or an empty string if invalid
+ public string GetValidTraderIdByEnumValue(object traderEnumValue) // TODO: param was Traders
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Does the 'Traders' enum has a value that matches the passed in parameter
+ ///
+ /// Value to check for
+ /// True, values exists in Traders enum as a value
+ public bool TraderEnumHasKey(string key)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Accepts a trader id
+ ///
+ /// Trader id
+ /// True if Traders enum has the param as a value
+ public bool TraderEnumHasValue(string traderId)
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/Core/Helpers/UtilityHelper.cs b/Core/Helpers/UtilityHelper.cs
new file mode 100644
index 00000000..ae7c0c4c
--- /dev/null
+++ b/Core/Helpers/UtilityHelper.cs
@@ -0,0 +1,9 @@
+namespace Core.Helpers;
+
+public class UtilityHelper
+{
+ public List ArrayIntersect(List a, List b)
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/Core/Helpers/WeatherHelper.cs b/Core/Helpers/WeatherHelper.cs
new file mode 100644
index 00000000..ef67a945
--- /dev/null
+++ b/Core/Helpers/WeatherHelper.cs
@@ -0,0 +1,34 @@
+namespace Core.Helpers;
+
+public class WeatherHelper
+{
+ public WeatherHelper()
+ {
+
+ }
+
+ ///
+ /// Get the current in-raid time - does not include an accurate date, only time
+ ///
+ /// (new Date())
+ /// Date object of current in-raid time
+ public DateTime GetInRaidTime(double? timestamp = null)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Is the current raid at nighttime
+ ///
+ /// PASS OR CURR (from raid settings)
+ /// True when nighttime
+ public bool IsNightTime(DateTime timeVariant)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool IsHourAtNightTime(int currentHour)
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/Core/Helpers/WeightedRandomHelper.cs b/Core/Helpers/WeightedRandomHelper.cs
new file mode 100644
index 00000000..01f9b145
--- /dev/null
+++ b/Core/Helpers/WeightedRandomHelper.cs
@@ -0,0 +1,56 @@
+namespace Core.Helpers;
+
+public class WeightedRandomHelper
+{
+ public WeightedRandomHelper()
+ {
+ }
+
+ ///
+ /// Choos an item from the passed in array based on the weightings of each
+ ///
+ /// Items and weights to use
+ /// Chosen item from array
+ public T GetWeightedValue(Dictionary itemArray)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Picks the random item based on its weight.
+ /// The items with higher weight will be picked more often (with a higher probability).
+ ///
+ /// For example:
+ /// - items = ['banana', 'orange', 'apple']
+ /// - weights = [0, 0.2, 0.8]
+ /// - weightedRandom(items, weights) in 80% of cases will return 'apple', in 20% of cases will return
+ /// 'orange' and it will never return 'banana' (because probability of picking the banana is 0%)
+ ///
+ ///
+ /// List of items
+ /// List of weights
+ /// Dictionary with item and index
+ public Dictionary WeightedRandom(List