using Core.Models.Eft.Common;
using Core.Models.Eft.Common.Tables;
using Core.Models.Enums;
using Core.Models.Spt.Bots;
using Core.Models.Spt.Config;
namespace Core.Generators;
public class BotEquipmentModGenerator
{
private BotConfig _botConfig;
public BotEquipmentModGenerator()
{
}
///
/// Check mods are compatible and add to array
///
/// Equipment item to add mods to
/// Mod list to choose from
/// parentid of item to add mod to
/// Template object of item to add mods to
/// The relevant blacklist from bot.json equipment dictionary
/// should this mod be forced to spawn
/// Item + compatible mods as an array
public Item GenerateModsForEquipment(List- equipment, string parentId, TemplateItem parentTemplate, GenerateEquipmentProperties settings,
EquipmentFilterDetails specificBlacklist, bool shouldForceSpawn = false)
{
throw new NotImplementedException();
}
///
/// Filter a bots plate pool based on its current level
///
/// Bot equipment generation settings
/// Armor slot being filtered
/// Plates tpls to choose from
/// The armor items db template
/// Array of plate tpls to choose from
public FilterPlateModsForSlotByLevelResult FilterPlateModsForSlotByLevel(GenerateEquipmentProperties settings, string modSlot,
List existingPlateTplPool, TemplateItem armorItem)
{
throw new NotImplementedException();
}
///
/// Add mods to a weapon using the provided mod pool
///
/// Session id
/// Data used to generate the weapon
/// Weapon + mods array
public List
- GenerateModsForWeapon(string sessionId, GenerateWeaponRequest request)
{
throw new NotImplementedException();
}
///
/// Should the provided bot have its stock chance values altered to 100%
///
/// Slot to check
/// Bots equipment config/chance values
/// Mod being added to bots weapon
/// True if it should
public bool ShouldForceSubStockSlots(string modSlot, EquipmentFilters botEquipConfig, TemplateItem modToAddTemplate)
{
throw new NotImplementedException();
}
///
/// Is this modslot a front or rear sight
///
/// Slot to check
///
/// true if it's a front/rear sight
public bool ModIsFrontOrRearSight(string modSlot, string tpl)
{
throw new NotImplementedException();
}
///
/// Does the provided mod details show the mod can hold a scope
///
/// e.g. mod_scope, mod_mount
/// Parent id of mod item
/// true if it can hold a scope
public bool ModSlotCanHoldScope(string modSlot, string ModsParentId)
{
throw new NotImplementedException();
}
///
/// Set mod spawn chances to defined amount
///
/// Chance dictionary to update
///
///
public void AdjustSlotSpawnChances(ModsChances modSpawnChances, List modSlotsToAdjust, double newChancePercent)
{
throw new NotImplementedException();
}
///
/// Does the provided modSlot allow muzzle-related items
///
/// Slot id to check
/// OPTIONAL: parent id of modslot being checked
/// True if modSlot can have muzzle-related items
public bool AodSlotCanHoldMuzzleDevices(string modSlot, string? modsParentId)
{
throw new NotImplementedException();
}
///
/// Sort mod slots into an ordering that maximises chance of a successful weapon generation
///
/// Array of mod slot strings to sort
/// The Tpl of the item with mod keys being sorted
/// Sorted array
public List SortModKeys(List unsortedSlotKeys, string itemTplWithKeysToSort)
{
throw new NotImplementedException();
}
///
/// Get a Slot property for an item (chamber/cartridge/slot)
///
/// e.g patron_in_weapon
/// item template
/// Slot item
public Slot GetModItemSlotFromDb(string modSlot, TemplateItem parentTemplate)
{
throw new NotImplementedException();
}
///
/// Randomly choose if a mod should be spawned, 100% for required mods OR mod is ammo slot
///
/// slot the item sits in from db
/// Name of slot the mod sits in
/// Chances for various mod spawns
/// Various config settings for generating this type of bot
/// ModSpawn.SPAWN when mod should be spawned, ModSpawn.DEFAULT_MOD when default mod should spawn, ModSpawn.SKIP when mod is skipped
public ModSpawn ShouldModBeSpawned(Slot itemSlot, string modSlotName, ModsChances modSpawnChances, EquipmentFilters botEquipConfig)
{
throw new NotImplementedException();
}
///
/// Choose a mod to fit into the desired slot
///
/// Data used to choose an appropriate mod with
/// itemHelper.getItem() result
public object? ChooseModToPutIntoSlot(ModToSpawnRequest request) // TODO: type fuckery: [boolean, ITemplateItem] | undefined
{
throw new NotImplementedException();
}
///
/// Given the passed in array of magaizne tpls, look up the min size set in config and return only those that have that size or larger
///
/// Request data
/// Pool of magazine tpls to filter
/// Filtered pool of magazine tpls
///
public List GetFilterdMagazinePoolByCapacity(ModToSpawnRequest modSpawnRequest, List modPool)
{
throw new NotImplementedException();
}
///
/// Choose a weapon mod tpl for a given slot from a pool of choices
/// Checks chosen tpl is compatible with all existing weapon items
///
///
/// Pool of mods that can be picked from
/// Slot the picked mod will have as a parent
/// How should chosen tpl be treated: DEFAULT_MOD/SPAWN/SKIP
/// Array of weapon items chosen item will be added to
/// Name of slot picked mod will be placed into
/// Chosen weapon details
public ChooseRandomCompatibleModResult GetCompatibleWeaponModTplForSlotFromPool(ModToSpawnRequest request, List modPool, Slot parentSlot,
ModSpawn choiceTypeEnum, List
- weapon, string modSlotName)
{
throw new NotImplementedException();
}
///
///
///
/// Pool of item Tpls to choose from
/// How should the slot choice be handled - forced/normal etc
/// Weapon mods at current time
/// IChooseRandomCompatibleModResult
public ChooseRandomCompatibleModResult GetCompatibleModFromPool(List modPool, ModSpawn modSpawnType, List
- weapon)
{
throw new NotImplementedException();
}
public object CreateExhaustableArray(T itemsToAddToArray) // TODO: this wont likely be needed, reimplement for C#
{
throw new NotImplementedException();
}
///
/// Get a list of mod tpls that are compatible with the current weapon
///
///
/// Tpls that are incompatible and should not be used
/// string array of compatible mod tpls with weapon
public List GetFilteredModPool(List modPool, List tplBlacklist) // TODO: tplBlacklist was Set
{
throw new NotImplementedException();
}
///
/// Filter mod pool down based on various criteria:
/// Is slot flagged as randomisable
/// Is slot required
/// Is slot flagged as default mod only
///
///
/// Mods root parent (weapon/equipment)
/// Array of mod tpls
public List GetModPoolForSlot(ModToSpawnRequest request, TemplateItem weaponTemplate)
{
throw new NotImplementedException();
}
public List GetModPoolForDefaultSlot(ModToSpawnRequest request, TemplateItem weaponTemplate)
{
throw new NotImplementedException();
}
public object GetMatchingModFromPreset(ModToSpawnRequest request, TemplateItem weaponTemplate) // TODO: no return type given in node server
{
throw new NotImplementedException();
}
///
/// Get default preset for weapon OR get specific weapon presets for edge cases (mp5/silenced dvl)
///
/// Weapons db template
/// Tpl of the parent item
/// Default preset found
public Preset? GetMatchingPreset(TemplateItem weaponTemplate, string parentItemTpl)
{
throw new NotImplementedException();
}
///
/// Temp fix to prevent certain combinations of weapons with mods that are known to be incompatible
///
/// Array of items that make up a weapon
/// Mod to check compatibility with weapon
/// True if incompatible
public bool WeaponModComboIsIncompatible(List
- weapon, string modTpl)
{
throw new NotImplementedException();
}
///
/// Create a mod item with provided parameters as properties + add upd property
///
/// _id
/// _tpl
/// parentId
/// slotId
/// Used to add additional properties in the upd object
/// The bots role mod is being created for
/// Item object
public Item CreateModItem(string modId, string modTpl, string parentId, string modSlot, TemplateItem modTemplate, string botRole)
{
throw new NotImplementedException();
}
///
/// Get a list of containers that hold ammo
/// e.g. mod_magazine / patron_in_weapon_000
///
/// string array
public List GetAmmoContainers()
{
throw new NotImplementedException();
}
///
/// Get a random mod from an items compatible mods Filter array
///
/// Default value to return if parentSlot Filter is empty
/// Item mod will go into, used to get compatible items
/// Slot to get mod to fill
/// Items to ensure picked mod is compatible with
/// Item tpl
public string? GetRandomModTplFromItemDb(string fallbackModTpl, Slot parentSlot, string modSlot, List
- items)
{
throw new NotImplementedException();
}
///
/// Check if mod exists in db + is for a required slot
/// TODO: modToAdd type was [boolean, ITemplateItem] in node
///
/// Db template of mod to check
/// Slot object the item will be placed as child into
/// Slot the mod will fill
/// Db template of the mods being added
/// Bots wildspawntype (assault/pmcBot/exUsec etc)
/// True if valid for slot
public bool IsModValidForSlot(object modToAdd, Slot slotAddedToTemplate, string modSlot, TemplateItem parentTemplate, string botRole)
{
throw new NotImplementedException();
}
///
/// Find mod tpls of a provided type and add to modPool
///
/// Slot to look up and add we are adding tpls for (e.g mod_scope)
/// db object for modItem we get compatible mods from
/// Pool of mods we are adding to
/// A blacklist of items that cannot be picked
public void AddCompatibleModsForProvidedMod(string desiredSlotName, TemplateItem modTemplate, Dictionary>> modPool,
EquipmentFilterDetails botEquipBlacklist)
{
throw new NotImplementedException();
}
///
/// Get the possible items that fit a slot
///
/// item tpl to get compatible items for
/// Slot item should fit in
/// Equipment that should not be picked
/// Array of compatible items for that slot
public List GetDynamicModPool(string parentItemId, string modSlot, EquipmentFilterDetails botEquipBlacklist)
{
throw new NotImplementedException();
}
///
/// Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist
///
/// Base mods to filter
/// Equipment blacklist
/// Slot mods belong to
/// Filtered array of mod tpls
public List FilterModsByBlacklist(List allowedMods, EquipmentFilterDetails botEquipBlacklist, string modSlot)
{
throw new NotImplementedException();
}
///
/// With the shotgun revolver (60db29ce99594040e04c4a27) 12.12 introduced CylinderMagazines.
/// Those magazines (e.g. 60dc519adf4c47305f6d410d) have a "Cartridges" entry with a _max_count=0.
/// Ammo is not put into the magazine directly but assigned to the magazine's slots: The "camora_xxx" slots.
/// This function is a helper called by generateModsForItem for mods with parent type "CylinderMagazine"
///
/// The items where the CylinderMagazine's camora are appended to
/// ModPool which should include available cartridges
/// The CylinderMagazine's UID
/// The CylinderMagazine's template
public void FillCamora(List
- items, Dictionary>> modPool, string cylinderMagParentId,
TemplateItem cylinderMagTemplate)
{
throw new NotImplementedException();
}
///
/// Take a record of camoras and merge the compatible shells into one array
///
/// Dictionary of camoras we want to merge into one array
/// String array of shells for multiple camora sources
public List MergeCamoraPools(Dictionary> camorasWithShells)
{
throw new NotImplementedException();
}
///
/// Filter out non-whitelisted weapon scopes
/// Controlled by bot.json weaponSightWhitelist
/// e.g. filter out rifle scopes from SMGs
///
/// Weapon scopes will be added to
/// Full scope pool
/// Whitelist of scope types by weapon base type
/// Array of scope tpls that have been filtered to just ones allowed for that weapon type
public List FilterSightsByWeaponType(Item weapon, List scopes, Dictionary> botWeaponSightWhitelist)
{
throw new NotImplementedException();
}
}