diff --git a/Core/Models/Eft/Common/PmcData.cs b/Core/Models/Eft/Common/PmcData.cs new file mode 100644 index 00000000..a298617b --- /dev/null +++ b/Core/Models/Eft/Common/PmcData.cs @@ -0,0 +1,25 @@ +using System.Text.Json.Serialization; +using Core.Models.Eft.Common.Tables; + +namespace Core.Models.Eft.Common; + +public class PmcData : BotBase +{ + +} + +public class PostRaidPmcData : BotBase +{ + [JsonPropertyName("Stats")] + public PostRaidStats Stats { get; set; } +} + +public class PostRaidStats +{ + [JsonPropertyName("Eft")] + public EftStats Eft { get; set; } + + /** Only found in profile we get from client post raid */ + [JsonPropertyName("Arena")] + public EftStats Arena { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Common/Tables/Achievement.cs b/Core/Models/Eft/Common/Tables/Achievement.cs new file mode 100644 index 00000000..167898c3 --- /dev/null +++ b/Core/Models/Eft/Common/Tables/Achievement.cs @@ -0,0 +1,51 @@ +using System.Text.Json.Serialization; + +namespace Core.Models.Eft.Common.Tables; + +public class Achievement +{ + [JsonPropertyName("id")] + public string Id { get; set; } + + [JsonPropertyName("imageUrl")] + public string ImageUrl { get; set; } + + [JsonPropertyName("assetPath")] + public string AssetPath { get; set; } + + [JsonPropertyName("rewards")] + public QuestRewards Rewards { get; set; } + + [JsonPropertyName("conditions")] + public QuestConditionTypes Conditions { get; set; } + + [JsonPropertyName("instantComplete")] + public bool InstantComplete { get; set; } + + [JsonPropertyName("showNotificationsInGame")] + public bool ShowNotificationsInGame { get; set; } + + [JsonPropertyName("showProgress")] + public bool ShowProgress { get; set; } + + [JsonPropertyName("prefab")] + public string Prefab { get; set; } + + [JsonPropertyName("rarity")] + public string Rarity { get; set; } + + [JsonPropertyName("hidden")] + public bool Hidden { get; set; } + + [JsonPropertyName("showConditions")] + public bool ShowConditions { get; set; } + + [JsonPropertyName("progressBarEnabled")] + public bool ProgressBarEnabled { get; set; } + + [JsonPropertyName("side")] + public string Side { get; set; } + + [JsonPropertyName("index")] + public int Index { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Common/Tables/CustomisationStorage.cs b/Core/Models/Eft/Common/Tables/CustomisationStorage.cs new file mode 100644 index 00000000..fa25245d --- /dev/null +++ b/Core/Models/Eft/Common/Tables/CustomisationStorage.cs @@ -0,0 +1,15 @@ +using System.Text.Json.Serialization; + +namespace Core.Models.Eft.Common.Tables; + +public class CustomisationStorage +{ + [JsonPropertyName("id")] + public string Id { get; set; } + + [JsonPropertyName("source")] + public string Source { get; set; } + + [JsonPropertyName("type")] + public string Type { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Common/Tables/CustomizationItem.cs b/Core/Models/Eft/Common/Tables/CustomizationItem.cs new file mode 100644 index 00000000..fedb8efd --- /dev/null +++ b/Core/Models/Eft/Common/Tables/CustomizationItem.cs @@ -0,0 +1,24 @@ +namespace Core.Models.Eft.Common.Tables; + +using System.Text.Json.Serialization; + +public class CustomizationItem +{ + [JsonPropertyName("_id")] + public string Id { get; set; } + + [JsonPropertyName("_name")] + public string Name { get; set; } + + [JsonPropertyName("_parent")] + public string Parent { get; set; } + + [JsonPropertyName("_type")] + public string Type { get; set; } + + [JsonPropertyName("_props")] + public Props Properties { get; set; } + + [JsonPropertyName("_proto")] + public string Proto { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Common/Tables/HandbookBase.cs b/Core/Models/Eft/Common/Tables/HandbookBase.cs new file mode 100644 index 00000000..6d5d22f9 --- /dev/null +++ b/Core/Models/Eft/Common/Tables/HandbookBase.cs @@ -0,0 +1,42 @@ +using System.Text.Json.Serialization; + +namespace Core.Models.Eft.Common.Tables; + +public class HandbookBase +{ + [JsonPropertyName("Categories")] + public List Categories { get; set; } + + [JsonPropertyName("Items")] + public List Items { get; set; } +} + +public class HandbookCategory +{ + [JsonPropertyName("Id")] + public string Id { get; set; } + + [JsonPropertyName("ParentId")] + public string? ParentId { get; set; } + + [JsonPropertyName("Icon")] + public string Icon { get; set; } + + [JsonPropertyName("Color")] + public string Color { get; set; } + + [JsonPropertyName("Order")] + public string Order { get; set; } +} + +public class HandbookItem +{ + [JsonPropertyName("Id")] + public string Id { get; set; } + + [JsonPropertyName("ParentId")] + public string ParentId { get; set; } + + [JsonPropertyName("Price")] + public decimal Price { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Common/Tables/LocationServices.cs b/Core/Models/Eft/Common/Tables/LocationServices.cs new file mode 100644 index 00000000..2680bf42 --- /dev/null +++ b/Core/Models/Eft/Common/Tables/LocationServices.cs @@ -0,0 +1,183 @@ +using System.Text.Json.Serialization; + +namespace Core.Models.Eft.Common.Tables; + +public class LocationServices +{ + [JsonPropertyName("TraderServerSettings")] + public TraderServerSettings TraderServerSettings { get; set; } + + [JsonPropertyName("BTRServerSettings")] + public BtrServerSettings BtrServerSettings { get; set; } +} + +public class TraderServerSettings +{ + [JsonPropertyName("TraderServices")] + public TraderServices TraderServices { get; set; } +} + +public class TraderServices +{ + [JsonPropertyName("ExUsecLoyalty")] + public TraderService ExUsecLoyalty { get; set; } + + [JsonPropertyName("ZryachiyAid")] + public TraderService ZryachiyAid { get; set; } + + [JsonPropertyName("CultistsAid")] + public TraderService CultistsAid { get; set; } + + [JsonPropertyName("PlayerTaxi")] + public TraderService PlayerTaxi { get; set; } + + [JsonPropertyName("BtrItemsDelivery")] + public TraderService BtrItemsDelivery { get; set; } + + [JsonPropertyName("BtrBotCover")] + public TraderService BtrBotCover { get; set; } + + [JsonPropertyName("TransitItemsDelivery")] + public TraderService TransitItemsDelivery { get; set; } +} + +public class TraderService +{ + [JsonPropertyName("TraderId")] + public string TraderId { get; set; } + + [JsonPropertyName("TraderServiceType")] + public string TraderServiceType { get; set; } + + [JsonPropertyName("Requirements")] + public ServiceRequirements Requirements { get; set; } + + [JsonPropertyName("ServiceItemCost")] + public Dictionary ServiceItemCost { get; set; } + + [JsonPropertyName("UniqueItems")] + public List UniqueItems { get; set; } +} + +public class ServiceRequirements +{ + [JsonPropertyName("CompletedQuests")] + public List CompletedQuests { get; set; } + + [JsonPropertyName("Standings")] + public Dictionary Standings { get; set; } +} + +public class CompletedQuest +{ + [JsonPropertyName("QuestId")] + public string QuestId { get; set; } +} + +public class StandingRequirement +{ + [JsonPropertyName("Value")] + public int Value { get; set; } +} + +public class ServiceItemCostDetails +{ + [JsonPropertyName("Count")] + public int Count { get; set; } +} + +public class BtrServerSettings +{ + [JsonPropertyName("ChanceSpawn")] + public int ChanceSpawn { get; set; } + + [JsonPropertyName("SpawnPeriod")] + public XYZ SpawnPeriod { get; set; } + + [JsonPropertyName("MoveSpeed")] + public float MoveSpeed { get; set; } + + [JsonPropertyName("ReadyToDepartureTime")] + public float ReadyToDepartureTime { get; set; } + + [JsonPropertyName("CheckTurnDistanceTime")] + public float CheckTurnDistanceTime { get; set; } + + [JsonPropertyName("TurnCheckSensitivity")] + public float TurnCheckSensitivity { get; set; } + + [JsonPropertyName("DecreaseSpeedOnTurnLimit")] + public float DecreaseSpeedOnTurnLimit { get; set; } + + [JsonPropertyName("EndSplineDecelerationDistance")] + public float EndSplineDecelerationDistance { get; set; } + + [JsonPropertyName("AccelerationSpeed")] + public float AccelerationSpeed { get; set; } + + [JsonPropertyName("DecelerationSpeed")] + public float DecelerationSpeed { get; set; } + + [JsonPropertyName("PauseDurationRange")] + public XYZ PauseDurationRange { get; set; } + + [JsonPropertyName("BodySwingReturnSpeed")] + public float BodySwingReturnSpeed { get; set; } + + [JsonPropertyName("BodySwingDamping")] + public float BodySwingDamping { get; set; } + + [JsonPropertyName("BodySwingIntensity")] + public float BodySwingIntensity { get; set; } + + [JsonPropertyName("ServerMapBTRSettings")] + public Dictionary ServerMapBTRSettings { get; set; } +} + +public class ServerMapBtrsettings +{ + [JsonPropertyName("MapID")] + public string MapID { get; set; } + + [JsonPropertyName("ChanceSpawn")] + public int ChanceSpawn { get; set; } + + [JsonPropertyName("SpawnPeriod")] + public XYZ SpawnPeriod { get; set; } + + [JsonPropertyName("MoveSpeed")] + public float MoveSpeed { get; set; } + + [JsonPropertyName("ReadyToDepartureTime")] + public float ReadyToDepartureTime { get; set; } + + [JsonPropertyName("CheckTurnDistanceTime")] + public float CheckTurnDistanceTime { get; set; } + + [JsonPropertyName("TurnCheckSensitivity")] + public float TurnCheckSensitivity { get; set; } + + [JsonPropertyName("DecreaseSpeedOnTurnLimit")] + public float DecreaseSpeedOnTurnLimit { get; set; } + + [JsonPropertyName("EndSplineDecelerationDistance")] + public float EndSplineDecelerationDistance { get; set; } + + [JsonPropertyName("AccelerationSpeed")] + public float AccelerationSpeed { get; set; } + + [JsonPropertyName("DecelerationSpeed")] + public float DecelerationSpeed { get; set; } + + [JsonPropertyName("PauseDurationRange")] + public XYZ PauseDurationRange { get; set; } + + [JsonPropertyName("BodySwingReturnSpeed")] + public float BodySwingReturnSpeed { get; set; } + + [JsonPropertyName("BodySwingDamping")] + public float BodySwingDamping { get; set; } + + [JsonPropertyName("BodySwingIntensity")] + public float BodySwingIntensity { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Common/Tables/Prestige.cs b/Core/Models/Eft/Common/Tables/Prestige.cs new file mode 100644 index 00000000..411134d6 --- /dev/null +++ b/Core/Models/Eft/Common/Tables/Prestige.cs @@ -0,0 +1,75 @@ +namespace Core.Models.Eft.Common.Tables; + +using System.Text.Json.Serialization; + +public class Prestige +{ + [JsonPropertyName("elements")] + public PretigeElement Elements { get; set; } +} + +public class PretigeElement +{ + [JsonPropertyName("id")] + public string Id { get; set; } + + [JsonPropertyName("conditions")] + public List Conditions { get; set; } + + [JsonPropertyName("rewards")] + public List Rewards { get; set; } + + [JsonPropertyName("transferConfigs")] + public TransferConfigs TransferConfigs { get; set; } + + [JsonPropertyName("image")] + public string Image { get; set; } + + [JsonPropertyName("bigImage")] + public string BigImage { get; set; } +} + +public class TransferConfigs +{ + [JsonPropertyName("stashConfig")] + public StashPrestigeConfig StashConfig { get; set; } + + [JsonPropertyName("skillConfig")] + public PrestigeSkillConfig SkillConfig { get; set; } + + [JsonPropertyName("masteringConfig")] + public PrestigeMasteringConfig MasteringConfig { get; set; } +} + +public class StashPrestigeConfig +{ + [JsonPropertyName("xCellCount")] + public int XCellCount { get; set; } + + [JsonPropertyName("yCellCount")] + public int YCellCount { get; set; } + + [JsonPropertyName("filters")] + public StashPrestigeFilters Filters { get; set; } +} + +public class StashPrestigeFilters +{ + [JsonPropertyName("includedItems")] + public List IncludedItems { get; set; } + + [JsonPropertyName("excludedItems")] + public List ExcludedItems { get; set; } +} + +public class PrestigeSkillConfig +{ + [JsonPropertyName("transferMultiplier")] + public int TransferMultiplier { get; set; } +} + +public class PrestigeMasteringConfig +{ + [JsonPropertyName("transferMultiplier")] + public int TransferMultiplier { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Common/Tables/ProfileTemplate.cs b/Core/Models/Eft/Common/Tables/ProfileTemplate.cs new file mode 100644 index 00000000..7aaecffc --- /dev/null +++ b/Core/Models/Eft/Common/Tables/ProfileTemplate.cs @@ -0,0 +1,97 @@ +using System.Text.Json.Serialization; +using Core.Models.Eft.Profile; + +namespace Core.Models.Eft.Common.Tables; + +public class ProfileTemplates +{ + [JsonPropertyName("Standard")] + public ProfileSides Standard { get; set; } + + [JsonPropertyName("Left Behind")] + public ProfileSides LeftBehind { get; set; } + + [JsonPropertyName("Prepare To Escape")] + public ProfileSides PrepareToEscape { get; set; } + + [JsonPropertyName("Edge Of Darkness")] + public ProfileSides EdgeOfDarkness { get; set; } + + [JsonPropertyName("Unheard")] + public ProfileSides Unheard { get; set; } + + [JsonPropertyName("Tournament")] + public ProfileSides Tournament { get; set; } + + [JsonPropertyName("SPT Developer")] + public ProfileSides SPTDeveloper { get; set; } + + [JsonPropertyName("SPT Easy start")] + public ProfileSides SPTEasyStart { get; set; } + + [JsonPropertyName("SPT Zero to hero")] + public ProfileSides SPTZeroToHero { get; set; } +} + +public class ProfileSides +{ + [JsonPropertyName("descriptionLocaleKey")] + public string DescriptionLocaleKey { get; set; } + + [JsonPropertyName("usec")] + public TemplateSide Usec { get; set; } + + [JsonPropertyName("bear")] + public TemplateSide Bear { get; set; } +} + +public class TemplateSide +{ + [JsonPropertyName("character")] + public PmcData Character { get; set; } + + [JsonPropertyName("suits")] + public List Suits { get; set; } + + [JsonPropertyName("dialogues")] + public Dictionary Dialogues { get; set; } + + [JsonPropertyName("userbuilds")] + public UserBuilds UserBuilds { get; set; } + + [JsonPropertyName("trader")] + public ProfileTraderTemplate Trader { get; set; } +} + +public class ProfileTraderTemplate +{ + [JsonPropertyName("initialLoyaltyLevel")] + public Dictionary InitialLoyaltyLevel { get; set; } + + [JsonPropertyName("initialStanding")] + public Dictionary InitialStanding { get; set; } + + [JsonPropertyName("setQuestsAvailableForStart")] + public bool? SetQuestsAvailableForStart { get; set; } + + [JsonPropertyName("setQuestsAvailableForFinish")] + public bool? SetQuestsAvailableForFinish { get; set; } + + [JsonPropertyName("initialSalesSum")] + public int InitialSalesSum { get; set; } + + [JsonPropertyName("jaegerUnlocked")] + public bool JaegerUnlocked { get; set; } + + /** How many days is usage of the flea blocked for upon profile creation */ + [JsonPropertyName("fleaBlockedDays")] + public int? FleaBlockedDays { get; set; } + + /** What traders default to being locked on profile creation */ + [JsonPropertyName("lockedByDefaultOverride")] + public List LockedByDefaultOverride { get; set; } + + /** What traders should have their clothing unlocked/purchased on creation */ + [JsonPropertyName("purchaseAllClothingByDefaultForTrader")] + public List PurchaseAllClothingByDefaultForTrader { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Common/Tables/TemplateItem.cs b/Core/Models/Eft/Common/Tables/TemplateItem.cs new file mode 100644 index 00000000..892c249b --- /dev/null +++ b/Core/Models/Eft/Common/Tables/TemplateItem.cs @@ -0,0 +1,1668 @@ +using System.Text.Json.Serialization; + +namespace Core.Models.Eft.Common.Tables; + +public class TemplateItem +{ + [JsonPropertyName("_id")] + public string Id { get; set; } + + [JsonPropertyName("_name")] + public string Name { get; set; } + + [JsonPropertyName("_parent")] + public string Parent { get; set; } + + [JsonPropertyName("_type")] + public ItemType Type { get; set; } + + [JsonPropertyName("_props")] + public Props Properties { get; set; } + + [JsonPropertyName("_proto")] + public string? Prototype { get; set; } +} + +public class Props +{ + [JsonPropertyName("AllowSpawnOnLocations")] + public string[] AllowSpawnOnLocations { get; set; } + + [JsonPropertyName("BeltMagazineRefreshCount")] + public int? BeltMagazineRefreshCount { get; set; } + + [JsonPropertyName("ChangePriceCoef")] + public int? ChangePriceCoef { get; set; } + + [JsonPropertyName("FixedPrice")] + public bool? FixedPrice { get; set; } + + [JsonPropertyName("SendToClient")] + public bool? SendToClient { get; set; } + + [JsonPropertyName("Name")] + public string? Name { get; set; } + + [JsonPropertyName("ShortName")] + public string? ShortName { get; set; } + + [JsonPropertyName("Description")] + public string? Description { get; set; } + + [JsonPropertyName("Weight")] + public int? Weight { get; set; } + + [JsonPropertyName("BackgroundColor")] + public string? BackgroundColor { get; set; } + + [JsonPropertyName("Width")] + public int? Width { get; set; } + + [JsonPropertyName("Height")] + public int? Height { get; set; } + + [JsonPropertyName("StackMaxSize")] + public int? StackMaxSize { get; set; } + + [JsonPropertyName("Rarity")] + public string? Rarity { get; set; } + + [JsonPropertyName("SpawnChance")] + public int? SpawnChance { get; set; } + + [JsonPropertyName("CreditsPrice")] + public int? CreditsPrice { get; set; } + + [JsonPropertyName("ItemSound")] + public string? ItemSound { get; set; } + + [JsonPropertyName("Prefab")] + public Prefab Prefab { get; set; } + + [JsonPropertyName("UsePrefab")] + public Prefab UsePrefab { get; set; } + + [JsonPropertyName("airDropTemplateId")] + public string? AirDropTemplateId { get; set; } + + [JsonPropertyName("StackObjectsCount")] + public int? StackObjectsCount { get; set; } + + [JsonPropertyName("NotShownInSlot")] + public bool? NotShownInSlot { get; set; } + + [JsonPropertyName("ExaminedByDefault")] + public bool? ExaminedByDefault { get; set; } + + [JsonPropertyName("ExamineTime")] + public int? ExamineTime { get; set; } + + [JsonPropertyName("IsUndiscardable")] + public bool? IsUndiscardable { get; set; } + + [JsonPropertyName("IsUnsaleable")] + public bool? IsUnsaleable { get; set; } + + [JsonPropertyName("IsUnbuyable")] + public bool? IsUnbuyable { get; set; } + + [JsonPropertyName("IsUngivable")] + public bool? IsUngivable { get; set; } + + [JsonPropertyName("IsUnremovable")] + public bool? IsUnremovable { get; set; } + + [JsonPropertyName("IsLockedafterEquip")] + public bool? IsLockedafterEquip { get; set; } + + [JsonPropertyName("IsSecretExitRequirement")] + public bool? IsSecretExitRequirement { get; set; } + + [JsonPropertyName("IsRagfairCurrency")] + public bool? IsRagfairCurrency { get; set; } + + [JsonPropertyName("IsSpecialSlotOnly")] + public bool? IsSpecialSlotOnly { get; set; } + + [JsonPropertyName("IsStationaryWeapon")] + public bool? IsStationaryWeapon { get; set; } + + [JsonPropertyName("QuestItem")] + public bool? QuestItem { get; set; } + + [JsonPropertyName("QuestStashMaxCount")] + public int? QuestStashMaxCount { get; set; } + + [JsonPropertyName("LootExperience")] + public int? LootExperience { get; set; } + + [JsonPropertyName("ExamineExperience")] + public int? ExamineExperience { get; set; } + + [JsonPropertyName("HideEntrails")] + public bool? HideEntrails { get; set; } + + [JsonPropertyName("InsuranceDisabled")] + public bool? InsuranceDisabled { get; set; } + + [JsonPropertyName("RepairCost")] + public int? RepairCost { get; set; } + + [JsonPropertyName("RepairSpeed")] + public int? RepairSpeed { get; set; } + + [JsonPropertyName("ExtraSizeLeft")] + public int? ExtraSizeLeft { get; set; } + + [JsonPropertyName("ExtraSizeRight")] + public int? ExtraSizeRight { get; set; } + + [JsonPropertyName("ExtraSizeUp")] + public int? ExtraSizeUp { get; set; } + + [JsonPropertyName("FlareTypes")] + public List FlareTypes { get; set; } + + [JsonPropertyName("ExtraSizeDown")] + public int? ExtraSizeDown { get; set; } + + [JsonPropertyName("ExtraSizeForceAdd")] + public bool? ExtraSizeForceAdd { get; set; } + + [JsonPropertyName("MergesWithChildren")] + public bool? MergesWithChildren { get; set; } + + [JsonPropertyName("MetascoreGroup")] + public string? MetascoreGroup { get; set; } + + [JsonPropertyName("CanSellOnRagfair")] + public bool? CanSellOnRagfair { get; set; } + + [JsonPropertyName("CanRequireOnRagfair")] + public bool? CanRequireOnRagfair { get; set; } + + [JsonPropertyName("ConflictingItems")] + public List ConflictingItems { get; set; } + + [JsonPropertyName("Unlootable")] + public bool? Unlootable { get; set; } + + [JsonPropertyName("UnlootableFromSlot")] + public string? UnlootableFromSlot { get; set; } + + [JsonPropertyName("UnlootableFromSide")] + public List UnlootableFromSide { get; set; } + + [JsonPropertyName("AnimationVariantsNumber")] + public int? AnimationVariantsNumber { get; set; } + + [JsonPropertyName("DiscardingBlock")] + public bool? DiscardingBlock { get; set; } + + [JsonPropertyName("DropSoundType")] + public string? DropSoundType { get; set; } + + [JsonPropertyName("RagFairCommissionModifier")] + public int? RagFairCommissionModifier { get; set; } + + [JsonPropertyName("RarityPvE")] + public string? RarityPvE { get; set; } + + [JsonPropertyName("IsAlwaysAvailableForInsurance")] + public bool? IsAlwaysAvailableForInsurance { get; set; } + + [JsonPropertyName("DiscardLimit")] + public int? DiscardLimit { get; set; } + + [JsonPropertyName("MaxResource")] + public int? MaxResource { get; set; } + + [JsonPropertyName("Resource")] + public int? Resource { get; set; } + + [JsonPropertyName("DogTagQualities")] + public bool? DogTagQualities { get; set; } + + [JsonPropertyName("Grids")] + public List Grids { get; set; } + + [JsonPropertyName("Slots")] + public List Slots { get; set; } + + [JsonPropertyName("CanPutIntoDuringTheRaid")] + public bool? CanPutIntoDuringTheRaid { get; set; } + + [JsonPropertyName("CantRemoveFromSlotsDuringRaid")] + public List CantRemoveFromSlotsDuringRaid { get; set; } + + [JsonPropertyName("KeyIds")] + public List KeyIds { get; set; } + + [JsonPropertyName("TagColor")] + public int? TagColor { get; set; } + + [JsonPropertyName("TagName")] + public string? TagName { get; set; } + + [JsonPropertyName("Durability")] + public int? Durability { get; set; } + + [JsonPropertyName("Accuracy")] + public int? Accuracy { get; set; } + + [JsonPropertyName("Recoil")] + public int? Recoil { get; set; } + + [JsonPropertyName("Loudness")] + public int? Loudness { get; set; } + + [JsonPropertyName("EffectiveDistance")] + public int? EffectiveDistance { get; set; } + + [JsonPropertyName("Ergonomics")] + public int? Ergonomics { get; set; } + + [JsonPropertyName("Velocity")] + public int? Velocity { get; set; } + + [JsonPropertyName("WeaponRecoilSettings")] + public WeaponRecoilSettings WeaponRecoilSettings { get; set; } + + [JsonPropertyName("WithAnimatorAiming")] + public bool? WithAnimatorAiming { get; set; } + + [JsonPropertyName("RaidModdable")] + public bool? RaidModdable { get; set; } + + [JsonPropertyName("ToolModdable")] + public bool? ToolModdable { get; set; } + + [JsonPropertyName("UniqueAnimationModID")] + public int? UniqueAnimationModID { get; set; } + + [JsonPropertyName("BlocksFolding")] + public bool? BlocksFolding { get; set; } + + [JsonPropertyName("BlocksCollapsible")] + public bool? BlocksCollapsible { get; set; } + + [JsonPropertyName("IsAnimated")] + public bool? IsAnimated { get; set; } + + [JsonPropertyName("HasShoulderContact")] + public bool? HasShoulderContact { get; set; } + + [JsonPropertyName("SightingRange")] + public int? SightingRange { get; set; } + + [JsonPropertyName("ZoomSensitivity")] + public int? ZoomSensitivity { get; set; } + + [JsonPropertyName("DoubleActionAccuracyPenaltyMult")] + public int? DoubleActionAccuracyPenaltyMult { get; set; } + + [JsonPropertyName("ModesCount")] + public object? ModesCount { get; set; } // TODO: object here + + [JsonPropertyName("DurabilityBurnModificator")] + public int? DurabilityBurnModificator { get; set; } + + [JsonPropertyName("HeatFactor")] + public int? HeatFactor { get; set; } + + [JsonPropertyName("CoolFactor")] + public int? CoolFactor { get; set; } + + [JsonPropertyName("muzzleModType")] + public string? MuzzleModType { get; set; } + + [JsonPropertyName("CustomAimPlane")] + public string? CustomAimPlane { get; set; } + + [JsonPropertyName("IsAdjustableOptic")] + public bool? IsAdjustableOptic { get; set; } + + [JsonPropertyName("MinMaxFov")] + public XYZ MinMaxFov { get; set; } + + [JsonPropertyName("sightModType")] + public string? SightModType { get; set; } + + [JsonPropertyName("aimingSensitivity")] + public int? AimingSensitivity { get; set; } + + [JsonPropertyName("SightModesCount")] + public int? SightModesCount { get; set; } + + [JsonPropertyName("OpticCalibrationDistances")] + public List OpticCalibrationDistances { get; set; } + + [JsonPropertyName("ScopesCount")] + public int? ScopesCount { get; set; } + + [JsonPropertyName("AimSensitivity")] + public object? AimSensitivity { get; set; } // TODO: object here + + [JsonPropertyName("Zooms")] + public List> Zooms { get; set; } + + [JsonPropertyName("CalibrationDistances")] + public List> CalibrationDistances { get; set; } + + [JsonPropertyName("Intensity")] + public int? Intensity { get; set; } + + [JsonPropertyName("Mask")] + public string? Mask { get; set; } + + [JsonPropertyName("MaskSize")] + public int? MaskSize { get; set; } + + [JsonPropertyName("IsMagazineForStationaryWeapon")] + public bool? IsMagazineForStationaryWeapon { get; set; } + + [JsonPropertyName("NoiseIntensity")] + public int? NoiseIntensity { get; set; } + + [JsonPropertyName("NoiseScale")] + public int? NoiseScale { get; set; } + + [JsonPropertyName("Color")] + public Color Color { get; set; } + + [JsonPropertyName("DiffuseIntensity")] + public int? DiffuseIntensity { get; set; } + + [JsonPropertyName("MagazineWithBelt")] + public bool? MagazineWithBelt { get; set; } + + [JsonPropertyName("HasHinge")] + public bool? HasHinge { get; set; } + + [JsonPropertyName("RampPalette")] + public string? RampPalette { get; set; } + + [JsonPropertyName("DepthFade")] + public int? DepthFade { get; set; } + + [JsonPropertyName("RoughnessCoef")] + public int? RoughnessCoef { get; set; } + + [JsonPropertyName("SpecularCoef")] + public int? SpecularCoef { get; set; } + + [JsonPropertyName("MainTexColorCoef")] + public int? MainTexColorCoef { get; set; } + + [JsonPropertyName("MinimumTemperatureValue")] + public int? MinimumTemperatureValue { get; set; } + + [JsonPropertyName("RampShift")] + public int? RampShift { get; set; } + + [JsonPropertyName("HeatMin")] + public int? HeatMin { get; set; } + + [JsonPropertyName("ColdMax")] + public int? ColdMax { get; set; } + + [JsonPropertyName("IsNoisy")] + public bool? IsNoisy { get; set; } + + [JsonPropertyName("IsFpsStuck")] + public bool? IsFpsStuck { get; set; } + + [JsonPropertyName("IsGlitch")] + public bool? IsGlitch { get; set; } + + [JsonPropertyName("IsMotionBlurred")] + public bool? IsMotionBlurred { get; set; } + + [JsonPropertyName("IsPixelated")] + public bool? IsPixelated { get; set; } + + [JsonPropertyName("PixelationBlockCount")] + public int? PixelationBlockCount { get; set; } + + [JsonPropertyName("ShiftsAimCamera")] + public int? ShiftsAimCamera { get; set; } + + [JsonPropertyName("magAnimationIndex")] + public int? MagAnimationIndex { get; set; } + + [JsonPropertyName("Cartridges")] + public List Cartridges { get; set; } + + [JsonPropertyName("CanFast")] + public bool? CanFast { get; set; } + + [JsonPropertyName("CanHit")] + public bool? CanHit { get; set; } + + [JsonPropertyName("canAdmin")] + public bool? CanAdmin { get; set; } + + [JsonPropertyName("loadUnloadModifier")] + public int? LoadUnloadModifier { get; set; } + + [JsonPropertyName("checkTimeModifier")] + public int? CheckTimeModifier { get; set; } + + [JsonPropertyName("checkOverride")] + public int? CheckOverride { get; set; } + + [JsonPropertyName("reloadMagType")] + public string ReloadMagType { get; set; } + + [JsonPropertyName("visibleAmmoRangesString")] + public string VisibleAmmoRangesString { get; set; } + + [JsonPropertyName("malfunctionChance")] + public int? MalfunctionChance { get; set; } + + [JsonPropertyName("isShoulderContact")] + public bool? IsShoulderContact { get; set; } + + [JsonPropertyName("foldable")] + public bool? Foldable { get; set; } + + [JsonPropertyName("retractable")] + public bool? Retractable { get; set; } + + [JsonPropertyName("sizeReduceRight")] + public int? SizeReduceRight { get; set; } + + [JsonPropertyName("centerOfImpact")] + public int? CenterOfImpact { get; set; } + + [JsonPropertyName("isSilencer")] + public bool? IsSilencer { get; set; } + + [JsonPropertyName("deviationCurve")] + public int? DeviationCurve { get; set; } + + [JsonPropertyName("deviationMax")] + public int? DeviationMax { get; set; } + + [JsonPropertyName("searchSound")] + public string SearchSound { get; set; } + + [JsonPropertyName("blocksArmorVest")] + public bool? BlocksArmorVest { get; set; } + + [JsonPropertyName("speedPenaltyPercent")] + public int? SpeedPenaltyPercent { get; set; } + + [JsonPropertyName("gridLayoutName")] + public string GridLayoutName { get; set; } + + [JsonPropertyName("containerSpawnChanceModifier")] + public int? ContainerSpawnChanceModifier { get; set; } + + [JsonPropertyName("spawnExcludedFilter")] + public List SpawnExcludedFilter { get; set; } + + [JsonPropertyName("spawnFilter")] + public List SpawnFilter { get; set; } // TODO: object here + + [JsonPropertyName("containType")] + public List ContainType { get; set; } // TODO: object here + + [JsonPropertyName("sizeWidth")] + public int? SizeWidth { get; set; } + + [JsonPropertyName("sizeHeight")] + public int? SizeHeight { get; set; } + + [JsonPropertyName("isSecured")] + public bool? IsSecured { get; set; } + + [JsonPropertyName("spawnTypes")] + public string SpawnTypes { get; set; } + + [JsonPropertyName("lootFilter")] + public List LootFilter { get; set; } // TODO: object here + + [JsonPropertyName("spawnRarity")] + public string SpawnRarity { get; set; } + + [JsonPropertyName("minCountSpawn")] + public int? MinCountSpawn { get; set; } + + [JsonPropertyName("maxCountSpawn")] + public int? MaxCountSpawn { get; set; } + + [JsonPropertyName("openedByKeyID")] + public List OpenedByKeyID { get; set; } + + [JsonPropertyName("rigLayoutName")] + public string RigLayoutName { get; set; } + + [JsonPropertyName("maxDurability")] + public int? MaxDurability { get; set; } + + [JsonPropertyName("armorZone")] + public List ArmorZone { get; set; } + + [JsonPropertyName("armorClass")] + public object ArmorClass { get; set; } // TODO: object here + + [JsonPropertyName("armorColliders")] + public List ArmorColliders { get; set; } + + [JsonPropertyName("armorPlateColliders")] + public List ArmorPlateColliders { get; set; } + + [JsonPropertyName("bluntDamageReduceFromSoftArmor")] + public bool? BluntDamageReduceFromSoftArmor { get; set; } + + [JsonPropertyName("mousePenalty")] + public int? MousePenalty { get; set; } + + [JsonPropertyName("weaponErgonomicPenalty")] + public int? WeaponErgonomicPenalty { get; set; } + + [JsonPropertyName("bluntThroughput")] + public int? BluntThroughput { get; set; } + + [JsonPropertyName("armorMaterial")] + public string ArmorMaterial { get; set; } + + [JsonPropertyName("armorType")] + public string ArmorType { get; set; } + + [JsonPropertyName("weapClass")] + public string WeapClass { get; set; } + + [JsonPropertyName("weapUseType")] + public string WeapUseType { get; set; } + + [JsonPropertyName("ammoCaliber")] + public string AmmoCaliber { get; set; } + + [JsonPropertyName("operatingResource")] + public int? OperatingResource { get; set; } + + [JsonPropertyName("postRecoilHorizontalRangeHandRotation")] + public XYZ PostRecoilHorizontalRangeHandRotation { get; set; } + + [JsonPropertyName("postRecoilVerticalRangeHandRotation")] + public XYZ PostRecoilVerticalRangeHandRotation { get; set; } + + [JsonPropertyName("progressRecoilAngleOnStable")] + public XYZ ProgressRecoilAngleOnStable { get; set; } + + [JsonPropertyName("repairComplexity")] + public int? RepairComplexity { get; set; } + + [JsonPropertyName("durabSpawnMin")] + public int? DurabSpawnMin { get; set; } + + [JsonPropertyName("durabSpawnMax")] + public int? DurabSpawnMax { get; set; } + + [JsonPropertyName("isFastReload")] + public bool? IsFastReload { get; set; } + + [JsonPropertyName("recoilForceUp")] + public int? RecoilForceUp { get; set; } + + [JsonPropertyName("recoilForceBack")] + public int? RecoilForceBack { get; set; } + + [JsonPropertyName("recoilAngle")] + public int? RecoilAngle { get; set; } + + [JsonPropertyName("recoilCamera")] + public int? RecoilCamera { get; set; } + + [JsonPropertyName("recoilCategoryMultiplierHandRotation")] + public int? RecoilCategoryMultiplierHandRotation { get; set; } + + [JsonPropertyName("weapFireType")] + public List WeapFireType { get; set; } + + [JsonPropertyName("recolDispersion")] + public int? RecolDispersion { get; set; } + + [JsonPropertyName("singleFireRate")] + public int? SingleFireRate { get; set; } + + [JsonPropertyName("canQueueSecondShot")] + public bool? CanQueueSecondShot { get; set; } + + [JsonPropertyName("bFirerate")] + public int? BFirerate { get; set; } + + [JsonPropertyName("bEffDist")] + public int? BEffDist { get; set; } + + [JsonPropertyName("bHearDist")] + public int? BHearDist { get; set; } + + [JsonPropertyName("blockLeftStance")] + public bool? BlockLeftStance { get; set; } + + [JsonPropertyName("isChamberLoad")] + public bool? IsChamberLoad { get; set; } + + [JsonPropertyName("chamberAmmoCount")] + public int? ChamberAmmoCount { get; set; } + + [JsonPropertyName("isBoltCatch")] + public bool? IsBoltCatch { get; set; } + + [JsonPropertyName("defMagType")] + public string DefMagType { get; set; } + + [JsonPropertyName("defAmmo")] + public string DefAmmo { get; set; } + + [JsonPropertyName("adjustCollimatorsToTrajectory")] + public bool? AdjustCollimatorsToTrajectory { get; set; } + + [JsonPropertyName("shotgunDispersion")] + public int? ShotgunDispersion { get; set; } + + [JsonPropertyName("chambers")] + public List Chambers { get; set; } + + [JsonPropertyName("cameraSnap")] + public int? CameraSnap { get; set; } + + [JsonPropertyName("cameraToWeaponAngleSpeedRange")] + public XYZ CameraToWeaponAngleSpeedRange { get; set; } + + [JsonPropertyName("cameraToWeaponAngleStep")] + public int? CameraToWeaponAngleStep { get; set; } + + [JsonPropertyName("reloadMode")] + public string ReloadMode { get; set; } + + [JsonPropertyName("aimPlane")] + public int? AimPlane { get; set; } + + [JsonPropertyName("tacticalReloadStiffnes")] + public XYZ TacticalReloadStiffnes { get; set; } + + [JsonPropertyName("tacticalReloadFixation")] + public int? TacticalReloadFixation { get; set; } + + [JsonPropertyName("recoilCenter")] + public XYZ RecoilCenter { get; set; } + + [JsonPropertyName("rotationCenter")] + public XYZ RotationCenter { get; set; } + + [JsonPropertyName("rotationCenterNoStock")] + public XYZ RotationCenterNoStock { get; set; } + + [JsonPropertyName("shotsGroupSettings")] + public List ShotsGroupSettings { get; set; } + + [JsonPropertyName("foldedSlot")] + public string FoldedSlot { get; set; } + + [JsonPropertyName("forbidMissingVitalParts")] + public bool? ForbidMissingVitalParts { get; set; } + + [JsonPropertyName("forbidNonEmptyContainers")] + public bool? ForbidNonEmptyContainers { get; set; } + + [JsonPropertyName("compactHandling")] + public bool? CompactHandling { get; set; } + + [JsonPropertyName("minRepairDegradation")] + public int? MinRepairDegradation { get; set; } + + [JsonPropertyName("maxRepairDegradation")] + public int? MaxRepairDegradation { get; set; } + + [JsonPropertyName("ironSightRange")] + public int? IronSightRange { get; set; } + + [JsonPropertyName("isBeltMachineGun")] + public bool? IsBeltMachineGun { get; set; } + + [JsonPropertyName("isFlareGun")] + public bool? IsFlareGun { get; set; } + + [JsonPropertyName("isGrenadeLauncher")] + public bool? IsGrenadeLauncher { get; set; } + + [JsonPropertyName("isOneoff")] + public bool? IsOneoff { get; set; } + + [JsonPropertyName("mustBoltBeOpennedForExternalReload")] + public bool? MustBoltBeOpennedForExternalReload { get; set; } + + [JsonPropertyName("mustBoltBeOpennedForInternalReload")] + public bool? MustBoltBeOpennedForInternalReload { get; set; } + + [JsonPropertyName("noFiremodeOnBoltcatch")] + public bool? NoFiremodeOnBoltcatch { get; set; } + + [JsonPropertyName("boltAction")] + public bool? BoltAction { get; set; } + + [JsonPropertyName("hipAccuracyRestorationDelay")] + public int? HipAccuracyRestorationDelay { get; set; } + + [JsonPropertyName("hipAccuracyRestorationSpeed")] + public int? HipAccuracyRestorationSpeed { get; set; } + + [JsonPropertyName("hipInnaccuracyGain")] + public int? HipInnaccuracyGain { get; set; } + + [JsonPropertyName("manualBoltCatch")] + public bool? ManualBoltCatch { get; set; } + + [JsonPropertyName("burstShotsCount")] + public int? BurstShotsCount { get; set; } + + [JsonPropertyName("baseMalfunctionChance")] + public int? BaseMalfunctionChance { get; set; } + + [JsonPropertyName("allowJam")] + public bool? AllowJam { get; set; } + + [JsonPropertyName("allowFeed")] + public bool? AllowFeed { get; set; } + + [JsonPropertyName("allowMisfire")] + public bool? AllowMisfire { get; set; } + + [JsonPropertyName("allowSlide")] + public bool? AllowSlide { get; set; } + + [JsonPropertyName("durabilityBurnRatio")] + public int? DurabilityBurnRatio { get; set; } + + [JsonPropertyName("heatFactorGun")] + public int? HeatFactorGun { get; set; } + + [JsonPropertyName("coolFactorGun")] + public int? CoolFactorGun { get; set; } + + [JsonPropertyName("coolFactorGunMods")] + public int? CoolFactorGunMods { get; set; } + + [JsonPropertyName("heatFactorByShot")] + public int? HeatFactorByShot { get; set; } + + [JsonPropertyName("allowOverheat")] + public bool? AllowOverheat { get; set; } + + [JsonPropertyName("doubleActionAccuracyPenalty")] + public int? DoubleActionAccuracyPenalty { get; set; } + + [JsonPropertyName("recoilPosZMult")] + public int? RecoilPosZMult { get; set; } + + [JsonPropertyName("recoilReturnPathDampingHandRotation")] + public int? RecoilReturnPathDampingHandRotation { get; set; } + + [JsonPropertyName("recoilReturnPathOffsetHandRotation")] + public int? RecoilReturnPathOffsetHandRotation { get; set; } + + [JsonPropertyName("recoilReturnSpeedHandRotation")] + public int? RecoilReturnSpeedHandRotation { get; set; } + + [JsonPropertyName("recoilStableAngleIncreaseStep")] + public int? RecoilStableAngleIncreaseStep { get; set; } + + [JsonPropertyName("recoilStableIndexShot")] + public int? RecoilStableIndexShot { get; set; } + + [JsonPropertyName("minRepairKitDegradation")] + public int? MinRepairKitDegradation { get; set; } + + [JsonPropertyName("maxRepairKitDegradation")] + public int? MaxRepairKitDegradation { get; set; } + + [JsonPropertyName("mountCameraSnapMultiplier")] + public int? MountCameraSnapMultiplier { get; set; } + + [JsonPropertyName("mountHorizontalRecoilMultiplier")] + public int? MountHorizontalRecoilMultiplier { get; set; } + + [JsonPropertyName("mountReturnSpeedHandMultiplier")] + public int? MountReturnSpeedHandMultiplier { get; set; } + + [JsonPropertyName("mountVerticalRecoilMultiplier")] + public int? MountVerticalRecoilMultiplier { get; set; } + + [JsonPropertyName("mountingHorizontalOutOfBreathMultiplier")] + public int? MountingHorizontalOutOfBreathMultiplier { get; set; } + + [JsonPropertyName("mountingPosition")] + public XYZ MountingPosition { get; set; } + + [JsonPropertyName("mountingVerticalOutOfBreathMultiplier")] + public XYZ MountingVerticalOutOfBreathMultiplier { get; set; } + + [JsonPropertyName("blocksEarpiece")] + public bool? BlocksEarpiece { get; set; } + + [JsonPropertyName("blocksEyewear")] + public bool? BlocksEyewear { get; set; } + + [JsonPropertyName("blocksHeadwear")] + public bool? BlocksHeadwear { get; set; } + + [JsonPropertyName("blocksFaceCover")] + public bool? BlocksFaceCover { get; set; } + + [JsonPropertyName("indestructibility")] + public int? Indestructibility { get; set; } + + [JsonPropertyName("headSegments")] + public List HeadSegments { get; set; } + + [JsonPropertyName("faceShieldComponent")] + public bool? FaceShieldComponent { get; set; } + + [JsonPropertyName("faceShieldMask")] + public string FaceShieldMask { get; set; } + + [JsonPropertyName("materialType")] + public string MaterialType { get; set; } + + [JsonPropertyName("ricochetParams")] + public XYZ RicochetParams { get; set; } + + [JsonPropertyName("deafStrength")] + public string DeafStrength { get; set; } + + [JsonPropertyName("blindnessProtection")] + public int? BlindnessProtection { get; set; } + + [JsonPropertyName("distortion")] + public int? Distortion { get; set; } + + [JsonPropertyName("compressorTreshold")] + public int? CompressorTreshold { get; set; } + + [JsonPropertyName("compressorAttack")] + public int? CompressorAttack { get; set; } + + [JsonPropertyName("compressorRelease")] + public int? CompressorRelease { get; set; } + + [JsonPropertyName("compressorGain")] + public int? CompressorGain { get; set; } + + [JsonPropertyName("cutoffFreq")] + public int? CutoffFreq { get; set; } + + [JsonPropertyName("resonance")] + public int? Resonance { get; set; } + + [JsonPropertyName("rolloffMultiplier")] + public int? RolloffMultiplier { get; set; } + + [JsonPropertyName("reverbVolume")] + public int? ReverbVolume { get; set; } + + [JsonPropertyName("compressorVolume")] + public int? CompressorVolume { get; set; } + + [JsonPropertyName("ambientVolume")] + public int? AmbientVolume { get; set; } + + [JsonPropertyName("dryVolume")] + public int? DryVolume { get; set; } + + [JsonPropertyName("highFrequenciesGain")] + public int? HighFrequenciesGain { get; set; } + + [JsonPropertyName("foodUseTime")] + public int? FoodUseTime { get; set; } + + [JsonPropertyName("foodEffectType")] + public string FoodEffectType { get; set; } + + [JsonPropertyName("stimulatorBuffs")] + public string StimulatorBuffs { get; set; } + + [JsonPropertyName("effects_health")] + public object EffectsHealth { get; set; } // TODO: object here + + [JsonPropertyName("effects_damage")] + public Dictionary EffectsDamage { get; set; } + + [JsonPropertyName("maximumNumberOfUsage")] + public int? MaximumNumberOfUsage { get; set; } + + [JsonPropertyName("knifeHitDelay")] + public int? KnifeHitDelay { get; set; } + + [JsonPropertyName("knifeHitSlashRate")] + public int? KnifeHitSlashRate { get; set; } + + [JsonPropertyName("knifeHitStabRate")] + public int? KnifeHitStabRate { get; set; } + + [JsonPropertyName("knifeHitRadius")] + public int? KnifeHitRadius { get; set; } + + [JsonPropertyName("knifeHitSlashDam")] + public int? KnifeHitSlashDam { get; set; } + + [JsonPropertyName("knifeHitStabDam")] + public int? KnifeHitStabDam { get; set; } + + [JsonPropertyName("knifeDurab")] + public int? KnifeDurab { get; set; } + + [JsonPropertyName("primaryDistance")] + public int? PrimaryDistance { get; set; } + + [JsonPropertyName("secondryDistance")] + public int? SecondryDistance { get; set; } + + [JsonPropertyName("slashPenetration")] + public int? SlashPenetration { get; set; } + + [JsonPropertyName("stabPenetration")] + public int? StabPenetration { get; set; } + + [JsonPropertyName("primaryConsumption")] + public int? PrimaryConsumption { get; set; } + + [JsonPropertyName("secondryConsumption")] + public int? SecondryConsumption { get; set; } + + [JsonPropertyName("deflectionConsumption")] + public int? DeflectionConsumption { get; set; } + + [JsonPropertyName("appliedTrunkRotation")] + public XYZ AppliedTrunkRotation { get; set; } + + [JsonPropertyName("appliedHeadRotation")] + public XYZ AppliedHeadRotation { get; set; } + + [JsonPropertyName("displayOnModel")] + public bool? DisplayOnModel { get; set; } + + [JsonPropertyName("additionalAnimationLayer")] + public int? AdditionalAnimationLayer { get; set; } + + [JsonPropertyName("staminaBurnRate")] + public int? StaminaBurnRate { get; set; } + + [JsonPropertyName("colliderScaleMultiplier")] + public XYZ ColliderScaleMultiplier { get; set; } + + [JsonPropertyName("configPathStr")] + public string ConfigPathStr { get; set; } + + [JsonPropertyName("maxMarkersCount")] + public int? MaxMarkersCount { get; set; } + + [JsonPropertyName("scaleMin")] + public int? ScaleMin { get; set; } + + [JsonPropertyName("scaleMax")] + public int? ScaleMax { get; set; } + + [JsonPropertyName("medUseTime")] + public int? MedUseTime { get; set; } + + [JsonPropertyName("medEffectType")] + public string MedEffectType { get; set; } + + [JsonPropertyName("maxHpResource")] + public int? MaxHpResource { get; set; } + + [JsonPropertyName("hpResourceRate")] + public int? HpResourceRate { get; set; } + + [JsonPropertyName("apResource")] + public int? ApResource { get; set; } + + [JsonPropertyName("krResource")] + public int? KrResource { get; set; } + + [JsonPropertyName("maxOpticZoom")] + public int? MaxOpticZoom { get; set; } + + [JsonPropertyName("maxRepairResource")] + public int? MaxRepairResource { get; set; } + + [JsonPropertyName("targetItemFilter")] + public string[] TargetItemFilter { get; set; } + + [JsonPropertyName("repairQuality")] + public int? RepairQuality { get; set; } + + [JsonPropertyName("repairType")] + public string RepairType { get; set; } + + [JsonPropertyName("stackMinRandom")] + public int? StackMinRandom { get; set; } + + [JsonPropertyName("stackMaxRandom")] + public int? StackMaxRandom { get; set; } + + [JsonPropertyName("ammoType")] + public string AmmoType { get; set; } + + [JsonPropertyName("initialSpeed")] + public int? InitialSpeed { get; set; } + + [JsonPropertyName("ballisticCoefficient")] + public int? BallisticCoefficient { get; set; } + + [JsonPropertyName("bulletMassGram")] + public int? BulletMassGram { get; set; } + + [JsonPropertyName("bulletDiameterMillimeters")] + public int? BulletDiameterMillimeters { get; set; } + + [JsonPropertyName("damage")] + public int? Damage { get; set; } + + [JsonPropertyName("ammoAccr")] + public int? AmmoAccr { get; set; } + + [JsonPropertyName("ammoRec")] + public int? AmmoRec { get; set; } + + [JsonPropertyName("ammoDist")] + public int? AmmoDist { get; set; } + + [JsonPropertyName("buckshotBullets")] + public int? BuckshotBullets { get; set; } + + [JsonPropertyName("penetrationPower")] + public int? PenetrationPower { get; set; } + + [JsonPropertyName("penetrationPowerDeviation")] + public int? PenetrationPowerDeviation { get; set; } + + [JsonPropertyName("ammoHear")] + public int? AmmoHear { get; set; } + + [JsonPropertyName("ammoSfx")] + public string AmmoSfx { get; set; } + + [JsonPropertyName("misfireChance")] + public int? MisfireChance { get; set; } + + [JsonPropertyName("minFragmentsCount")] + public int? MinFragmentsCount { get; set; } + + [JsonPropertyName("maxFragmentsCount")] + public int? MaxFragmentsCount { get; set; } + + [JsonPropertyName("ammoShiftChance")] + public int? AmmoShiftChance { get; set; } + + [JsonPropertyName("casingName")] + public string CasingName { get; set; } + + [JsonPropertyName("casingEjectPower")] + public int? CasingEjectPower { get; set; } + + [JsonPropertyName("casingMass")] + public int? CasingMass { get; set; } + + [JsonPropertyName("casingSounds")] + public string CasingSounds { get; set; } + + [JsonPropertyName("projectileCount")] + public int? ProjectileCount { get; set; } + + [JsonPropertyName("penetrationChanceObstacle")] + public int? PenetrationChanceObstacle { get; set; } + + [JsonPropertyName("penetrationDamageMod")] + public int? PenetrationDamageMod { get; set; } + + [JsonPropertyName("ricochetChance")] + public int? RicochetChance { get; set; } + + [JsonPropertyName("fragmentationChance")] + public int? FragmentationChance { get; set; } + + [JsonPropertyName("deterioration")] + public int? Deterioration { get; set; } + + [JsonPropertyName("speedRetardation")] + public int? SpeedRetardation { get; set; } + + [JsonPropertyName("tracer")] + public bool? Tracer { get; set; } + + [JsonPropertyName("tracerColor")] + public string TracerColor { get; set; } + + [JsonPropertyName("tracerDistance")] + public int? TracerDistance { get; set; } + + [JsonPropertyName("armorDamage")] + public int? ArmorDamage { get; set; } + + [JsonPropertyName("caliber")] + public string Caliber { get; set; } + + [JsonPropertyName("staminaBurnPerDamage")] + public int? StaminaBurnPerDamage { get; set; } + + [JsonPropertyName("heavyBleedingDelta")] + public int? HeavyBleedingDelta { get; set; } + + [JsonPropertyName("lightBleedingDelta")] + public int? LightBleedingDelta { get; set; } + + [JsonPropertyName("showBullet")] + public bool? ShowBullet { get; set; } + + [JsonPropertyName("hasGrenaderComponent")] + public bool? HasGrenaderComponent { get; set; } + + [JsonPropertyName("fuzeArmTimeSec")] + public int? FuzeArmTimeSec { get; set; } + + [JsonPropertyName("explosionStrength")] + public int? ExplosionStrength { get; set; } + + [JsonPropertyName("minExplosionDistance")] + public int? MinExplosionDistance { get; set; } + + [JsonPropertyName("maxExplosionDistance")] + public int? MaxExplosionDistance { get; set; } + + [JsonPropertyName("fragmentsCount")] + public int? FragmentsCount { get; set; } + + [JsonPropertyName("fragmentType")] + public string FragmentType { get; set; } + + [JsonPropertyName("showHitEffectOnExplode")] + public bool? ShowHitEffectOnExplode { get; set; } + + [JsonPropertyName("explosionType")] + public string ExplosionType { get; set; } + + [JsonPropertyName("ammoLifeTimeSec")] + public int? AmmoLifeTimeSec { get; set; } + + [JsonPropertyName("ammoTooltipClass")] + public string AmmoTooltipClass { get; set; } + + [JsonPropertyName("contusion")] + public XYZ Contusion { get; set; } + + [JsonPropertyName("armorDistanceDistanceDamage")] + public XYZ ArmorDistanceDistanceDamage { get; set; } + + [JsonPropertyName("blindness")] + public XYZ Blindness { get; set; } + + [JsonPropertyName("isLightAndSoundShot")] + public bool? IsLightAndSoundShot { get; set; } + + [JsonPropertyName("lightAndSoundShotAngle")] + public int? LightAndSoundShotAngle { get; set; } + + [JsonPropertyName("lightAndSoundShotSelfContusionTime")] + public int? LightAndSoundShotSelfContusionTime { get; set; } + + [JsonPropertyName("lightAndSoundShotSelfContusionStrength")] + public int? LightAndSoundShotSelfContusionStrength { get; set; } + + [JsonPropertyName("malfMisfireChance")] + public int? MalfMisfireChance { get; set; } + + [JsonPropertyName("malfFeedChance")] + public int? MalfFeedChance { get; set; } + + [JsonPropertyName("stackSlots")] + public StackSlot[] StackSlots { get; set; } + + [JsonPropertyName("type")] + public string Type { get; set; } + + [JsonPropertyName("eqMin")] + public int? EqMin { get; set; } + + [JsonPropertyName("eqMax")] + public int? EqMax { get; set; } + + [JsonPropertyName("rate")] + public int? Rate { get; set; } + + [JsonPropertyName("throwType")] + public string ThrowType { get; set; } + + [JsonPropertyName("explDelay")] + public int? ExplDelay { get; set; } + + [JsonPropertyName("strength")] + public int? Strength { get; set; } + + [JsonPropertyName("contusionDistance")] + public int? ContusionDistance { get; set; } + + [JsonPropertyName("throwDamMax")] + public int? ThrowDamMax { get; set; } + + [JsonPropertyName("emitTime")] + public int? EmitTime { get; set; } + + [JsonPropertyName("canBeHiddenDuringThrow")] + public bool? CanBeHiddenDuringThrow { get; set; } + + [JsonPropertyName("canPlantOnGround")] + public bool? CanPlantOnGround { get; set; } + + [JsonPropertyName("minTimeToContactExplode")] + public int? MinTimeToContactExplode { get; set; } + + [JsonPropertyName("explosionEffectType")] + public string ExplosionEffectType { get; set; } + + [JsonPropertyName("linkedWeapon")] + public string LinkedWeapon { get; set; } + + [JsonPropertyName("useAmmoWithoutShell")] + public bool? UseAmmoWithoutShell { get; set; } + + [JsonPropertyName("randomLootSettings")] + public RandomLootSettings RandomLootSettings { get; set; } + + [JsonPropertyName("recoilDampingHandRotation")] + public int? RecoilDampingHandRotation { get; set; } + + [JsonPropertyName("leanWeaponAgainstBody")] + public bool? LeanWeaponAgainstBody { get; set; } + + [JsonPropertyName("removeShellAfterFire")] + public bool? RemoveShellAfterFire { get; set; } + + [JsonPropertyName("repairStrategyTypes")] + public List RepairStrategyTypes { get; set; } + + [JsonPropertyName("isEncoded")] + public bool? IsEncoded { get; set; } + + [JsonPropertyName("layoutName")] + public string LayoutName { get; set; } + + [JsonPropertyName("lower75Prefab")] + public Prefab Lower75Prefab { get; set; } + + [JsonPropertyName("maxUsages")] + public int? MaxUsages { get; set; } + + [JsonPropertyName("scavKillExpPenalty")] + public int? ScavKillExpPenalty { get; set; } + + [JsonPropertyName("scavKillExpPenaltyPVE")] + public int? ScavKillExpPenaltyPVE { get; set; } + + [JsonPropertyName("scavKillStandingPenalty")] + public int? ScavKillStandingPenalty { get; set; } + + [JsonPropertyName("scavKillStandingPenaltyPVE")] + public int? ScavKillStandingPenaltyPVE { get; set; } + + [JsonPropertyName("tradersDiscount")] + public int? TradersDiscount { get; set; } + + [JsonPropertyName("tradersDiscountPVE")] + public int? TradersDiscountPVE { get; set; } +} + +public class WeaponRecoilSettings +{ + [JsonPropertyName("Enable")] + public bool Enable { get; set; } + + [JsonPropertyName("values")] + public List Values { get; set; } +} + +public class WeaponRecoilSettingValues +{ + [JsonPropertyName("Enable")] + public bool Enable { get; set; } + + [JsonPropertyName("Process")] + public WeaponRecoilProcess Process { get; set; } + + [JsonPropertyName("Target")] + public string Target { get; set; } +} + +public class WeaponRecoilProcess +{ + [JsonPropertyName("ComponentType")] + public string ComponentType { get; set; } + + [JsonPropertyName("CurveAimingValueMultiply")] + public double CurveAimingValueMultiply { get; set; } + + [JsonPropertyName("CurveTimeMultiply")] + public double CurveTimeMultiply { get; set; } + + [JsonPropertyName("CurveValueMultiply")] + public double CurveValueMultiply { get; set; } + + [JsonPropertyName("TransformationCurve")] + public WeaponRecoilTransformationCurve TransformationCurve { get; set; } +} + +public class WeaponRecoilTransformationCurve +{ + [JsonPropertyName("Keys")] + public List Keys { get; set; } +} + +public class WeaponRecoilTransformationCurveKey +{ + [JsonPropertyName("inTangent")] + public double InTangent { get; set; } + + [JsonPropertyName("outTangent")] + public double OutTangent { get; set; } + + [JsonPropertyName("time")] + public double Time { get; set; } + + [JsonPropertyName("value")] + public double Value { get; set; } +} + +public class HealthEffect +{ + [JsonPropertyName("type")] + public string Type { get; set; } + + [JsonPropertyName("value")] + public double Value { get; set; } +} + +public class Prefab +{ + [JsonPropertyName("path")] + public string Path { get; set; } + + [JsonPropertyName("rcid")] + public string Rcid { get; set; } +} + +public class Grid +{ + [JsonPropertyName("_name")] + public string Name { get; set; } + + [JsonPropertyName("_id")] + public string Id { get; set; } + + [JsonPropertyName("_parent")] + public string Parent { get; set; } + + [JsonPropertyName("_props")] + public GridProps Props { get; set; } + + [JsonPropertyName("_proto")] + public string Proto { get; set; } +} + +public class GridProps +{ + [JsonPropertyName("filters")] + public List Filters { get; set; } + + [JsonPropertyName("cellsH")] + public int CellsH { get; set; } + + [JsonPropertyName("cellsV")] + public int CellsV { get; set; } + + [JsonPropertyName("minCount")] + public int MinCount { get; set; } + + [JsonPropertyName("maxCount")] + public int MaxCount { get; set; } + + [JsonPropertyName("maxWeight")] + public int MaxWeight { get; set; } + + [JsonPropertyName("isSortingTable")] + public bool IsSortingTable { get; set; } +} + +public class GridFilter +{ + [JsonPropertyName("Filter")] + public List Filter { get; set; } + + [JsonPropertyName("ExcludedFilter")] + public List ExcludedFilter { get; set; } + + [JsonPropertyName("locked")] + public bool? Locked { get; set; } +} + +public class Slot +{ + [JsonPropertyName("_name")] + public string Name { get; set; } + + [JsonPropertyName("_id")] + public string Id { get; set; } + + [JsonPropertyName("_parent")] + public string Parent { get; set; } + + [JsonPropertyName("_props")] + public SlotProps Props { get; set; } + + [JsonPropertyName("_max_count")] + public int? MaxCount { get; set; } + + [JsonPropertyName("_required")] + public bool? Required { get; set; } + + [JsonPropertyName("_mergeSlotWithChildren")] + public bool? MergeSlotWithChildren { get; set; } + + [JsonPropertyName("_proto")] + public string Proto { get; set; } +} + +public class SlotProps +{ + [JsonPropertyName("filters")] + public List Filters { get; set; } + + [JsonPropertyName("MaxStackCount")] + public int? MaxStackCount { get; set; } +} + +public class SlotFilter +{ + [JsonPropertyName("Shift")] + public int? Shift { get; set; } + + [JsonPropertyName("locked")] + public bool? Locked { get; set; } + + [JsonPropertyName("Plate")] + public string Plate { get; set; } + + [JsonPropertyName("armorColliders")] + public List ArmorColliders { get; set; } + + [JsonPropertyName("armorPlateColliders")] + public List ArmorPlateColliders { get; set; } + + [JsonPropertyName("Filter")] + public List Filter { get; set; } + + [JsonPropertyName("AnimationIndex")] + public int? AnimationIndex { get; set; } +} + +public class StackSlot +{ + [JsonPropertyName("_name")] + public string? Name { get; set; } + + [JsonPropertyName("_id")] + public string Id { get; set; } + + [JsonPropertyName("_parent")] + public string Parent { get; set; } + + [JsonPropertyName("_max_count")] + public int MaxCount { get; set; } + + [JsonPropertyName("_props")] + public StackSlotProps Props { get; set; } + + [JsonPropertyName("_proto")] + public string Proto { get; set; } + + [JsonPropertyName("upd")] + public object? Upd { get; set; } // TODO: object here +} + +public class StackSlotProps +{ + [JsonPropertyName("filters")] + public List Filters { get; set; } +} + +public class RandomLootSettings { + [JsonPropertyName("allowToSpawnIdenticalItems")] + public bool AllowToSpawnIdenticalItems { get; set; } + + [JsonPropertyName("allowToSpawnQuestItems")] + public bool AllowToSpawnQuestItems { get; set; } + + [JsonPropertyName("countByRarity")] + public List CountByRarity { get; set; } // TODO: object here + + [JsonPropertyName("excluded")] + public RandomLootExcluded Excluded { get; set; } + + [JsonPropertyName("filters")] + public List Filters { get; set; } // TODO: object here + + [JsonPropertyName("findInRaid")] + public bool FindInRaid { get; set; } + + [JsonPropertyName("maxCount")] + public int MaxCount { get; set; } + + [JsonPropertyName("minCount")] + public int MinCount { get; set; } +} + +public class RandomLootExcluded { + [JsonPropertyName("categoryTemplates")] + public List CategoryTemplates { get; set; } // TODO: object here + + [JsonPropertyName("rarity")] + public List Rarity { get; set; } + + [JsonPropertyName("templates")] + public List Templates { get; set; } // TODO: object here +} + +public class EffectsHealth { + [JsonPropertyName("Energy")] + public EffectsHealthProps Energy { get; set; } + + [JsonPropertyName("Hydration")] + public EffectsHealthProps Hydration { get; set; } +} + +public class EffectsHealthProps { + [JsonPropertyName("value")] + public int Value { get; set; } +} + +public class EffectsDamage { + [JsonPropertyName("Pain")] + public EffectDamageProps Pain { get; set; } + + [JsonPropertyName("LightBleeding")] + public EffectDamageProps LightBleeding { get; set; } + + [JsonPropertyName("HeavyBleeding")] + public EffectDamageProps HeavyBleeding { get; set; } + + [JsonPropertyName("Contusion")] + public EffectDamageProps Contusion { get; set; } + + [JsonPropertyName("RadExposure")] + public EffectDamageProps RadExposure { get; set; } + + [JsonPropertyName("Fracture")] + public EffectDamageProps Fracture { get; set; } + + [JsonPropertyName("DestroyedPart")] + public EffectDamageProps DestroyedPart { get; set; } +} + +public class EffectDamageProps { + [JsonPropertyName("delay")] + public int Delay { get; set; } + + [JsonPropertyName("duration")] + public int Duration { get; set; } + + [JsonPropertyName("fadeOut")] + public int FadeOut { get; set; } + + [JsonPropertyName("cost")] + public int? Cost { get; set; } + + [JsonPropertyName("healthPenaltyMin")] + public int? HealthPenaltyMin { get; set; } + + [JsonPropertyName("healthPenaltyMax")] + public int? HealthPenaltyMax { get; set; } +} + +public class Color { + [JsonPropertyName("r")] + public int R { get; set; } + + [JsonPropertyName("g")] + public int G { get; set; } + + [JsonPropertyName("b")] + public int B { get; set; } + + [JsonPropertyName("a")] + public int A { get; set; } +} + +public class ShotsGroupSettings { + [JsonPropertyName("EndShotIndex")] + public int EndShotIndex { get; set; } + + [JsonPropertyName("ShotRecoilPositionStrength")] + public XYZ ShotRecoilPositionStrength { get; set; } + + [JsonPropertyName("ShotRecoilRadianRange")] + public XYZ ShotRecoilRadianRange { get; set; } + + [JsonPropertyName("ShotRecoilRotationStrength")] + public XYZ ShotRecoilRotationStrength { get; set; } + + [JsonPropertyName("StartShotIndex")] + public int StartShotIndex { get; set; } +} + +public enum ItemType { + NODE = 1, + ITEM = 2, +} \ No newline at end of file diff --git a/Core/Models/Eft/Profile/SptProfile.cs b/Core/Models/Eft/Profile/SptProfile.cs new file mode 100644 index 00000000..82898b81 --- /dev/null +++ b/Core/Models/Eft/Profile/SptProfile.cs @@ -0,0 +1,550 @@ +using Core.Models.Eft.Common; +using System.Text.Json.Serialization; +using Core.Models.Eft.Common.Tables; +using Core.Models.Enums; +using Core.Models.Spt.Dialog; + +namespace Core.Models.Eft.Profile; + +public class SptProfile +{ + [JsonPropertyName("info")] + public Info ProfileInfo { get; set; } + + [JsonPropertyName("characters")] + public Characters CharacterData { get; set; } + + /** Clothing purchases */ + [JsonPropertyName("suits")] + public List ClothingPurchases { get; set; } + + [JsonPropertyName("userbuilds")] + public UserBuilds UserBuildData { get; set; } + + [JsonPropertyName("dialogues")] + public Dictionary DialogueRecords { get; set; } + + [JsonPropertyName("spt")] + public Spt SptData { get; set; } + + [JsonPropertyName("vitality")] + public Vitality VitalityData { get; set; } + + [JsonPropertyName("inraid")] + public Inraid InraidData { get; set; } + + [JsonPropertyName("insurance")] + public List InsuranceList { get; set; } + + /** Assort purchases made by player since last trader refresh */ + [JsonPropertyName("traderPurchases")] + public Dictionary> TraderPurchases { get; set; } + + /** Achievements earned by player */ + [JsonPropertyName("achievements")] + public Dictionary PlayerAchievements { get; set; } + + /** List of friend profile IDs */ + [JsonPropertyName("friends")] + public List FriendProfileIds { get; set; } +} + +public class TraderPurchaseData +{ + [JsonPropertyName("count")] + public int PurchaseCount { get; set; } + + [JsonPropertyName("purchaseTimestamp")] + public long PurchaseTimestamp { get; set; } +} + +public class Info +{ + /** main profile id */ + [JsonPropertyName("id")] + public string ProfileId { get; set; } + + [JsonPropertyName("scavId")] + public string ScavengerId { get; set; } + + [JsonPropertyName("aid")] + public int Aid { get; set; } + + [JsonPropertyName("username")] + public string UserName { get; set; } + + [JsonPropertyName("password")] + public string Password { get; set; } + + [JsonPropertyName("wipe")] + public bool IsWiped { get; set; } + + [JsonPropertyName("edition")] + public string Edition { get; set; } +} + +public class Characters +{ + [JsonPropertyName("pmc")] + public PmcData PmcData { get; set; } + + [JsonPropertyName("scav")] + public PmcData ScavData { get; set; } +} + +/** used by profile.userbuilds */ +public class UserBuilds +{ + [JsonPropertyName("weaponBuilds")] + public List WeaponBuilds { get; set; } + + [JsonPropertyName("equipmentBuilds")] + public List EquipmentBuilds { get; set; } + + [JsonPropertyName("magazineBuilds")] + public List MagazineBuilds { get; set; } +} + +public class UserBuild +{ + [JsonPropertyName("Id")] + public string Id { get; set; } + + [JsonPropertyName("Name")] + public string Name { get; set; } +} + +public class WeaponBuild : UserBuild +{ + [JsonPropertyName("Root")] + public string Root { get; set; } + + [JsonPropertyName("Items")] + public List Items { get; set; } // Same as PMC inventory items +} + +public class EquipmentBuild : UserBuild +{ + [JsonPropertyName("Root")] + public string Root { get; set; } + + [JsonPropertyName("Items")] + public List Items { get; set; } // Same as PMC inventory items + + [JsonPropertyName("BuildType")] + public EquipmentBuildType BuildType { get; set; } +} + +public class MagazineBuild : UserBuild +{ + [JsonPropertyName("Caliber")] + public string Caliber { get; set; } + + [JsonPropertyName("TopCount")] + public int TopCount { get; set; } + + [JsonPropertyName("BottomCount")] + public int BottomCount { get; set; } + + [JsonPropertyName("Items")] + public List Items { get; set; } +} + +public class MagazineTemplateAmmoItem +{ + [JsonPropertyName("TemplateId")] + public string TemplateId { get; set; } + + [JsonPropertyName("Count")] + public int Count { get; set; } +} + +/** Used by defaultEquipmentPresets.json */ +public class DefaultEquipmentPreset : UserBuild +{ + [JsonPropertyName("Items")] + public List Items { get; set; } + + [JsonPropertyName("Root")] + public string Root { get; set; } + + [JsonPropertyName("BuildType")] + public EquipmentBuildType BuildType { get; set; } + + [JsonPropertyName("type")] + public string Type { get; set; } +} + +public class Dialogue +{ + [JsonPropertyName("attachmentsNew")] + public int AttachmentsNew { get; set; } + + [JsonPropertyName("new")] + public int New { get; set; } + + [JsonPropertyName("type")] + public MessageType Type { get; set; } + + [JsonPropertyName("Users")] + public List Users { get; set; } + + [JsonPropertyName("pinned")] + public bool Pinned { get; set; } + + [JsonPropertyName("messages")] + public List Messages { get; set; } + + [JsonPropertyName("_id")] + public string Id { get; set; } +} + +// @Cleanup: Maybe the same as Dialogue? +public class DialogueInfo +{ + [JsonPropertyName("attachmentsNew")] + public int AttachmentsNew { get; set; } + + [JsonPropertyName("new")] + public int New { get; set; } + + [JsonPropertyName("_id")] + public string Id { get; set; } + + [JsonPropertyName("type")] + public MessageType Type { get; set; } + + [JsonPropertyName("pinned")] + public bool Pinned { get; set; } + + [JsonPropertyName("Users")] + public List Users { get; set; } + + [JsonPropertyName("message")] + public MessagePreview Message { get; set; } +} + +public class Message +{ + [JsonPropertyName("_id")] + public string Id { get; set; } + + [JsonPropertyName("uid")] + public string UserId { get; set; } + + [JsonPropertyName("type")] + public MessageType MessageType { get; set; } + + [JsonPropertyName("dt")] + public long DateTime { get; set; } + + [JsonPropertyName("UtcDateTime")] + public long? UtcDateTime { get; set; } + + [JsonPropertyName("Member")] + public UpdatableChatMember? Member { get; set; } + + [JsonPropertyName("templateId")] + public string? TemplateId { get; set; } + + [JsonPropertyName("text")] + public string? Text { get; set; } + + [JsonPropertyName("replyTo")] + public ReplyTo? ReplyTo { get; set; } + + [JsonPropertyName("hasRewards")] + public bool? HasRewards { get; set; } + + [JsonPropertyName("rewardCollected")] + public bool RewardCollected { get; set; } + + [JsonPropertyName("items")] + public MessageItems? Items { get; set; } + + [JsonPropertyName("maxStorageTime")] + public long? MaxStorageTime { get; set; } + + [JsonPropertyName("systemData")] + public SystemData? SystemData { get; set; } + + [JsonPropertyName("profileChangeEvents")] + public List? ProfileChangeEvents { get; set; } +} + +public class ReplyTo +{ + [JsonPropertyName("_id")] + public string Id { get; set; } + + [JsonPropertyName("uid")] + public string UserId { get; set; } + + [JsonPropertyName("type")] + public MessageType MessageType { get; set; } + + [JsonPropertyName("dt")] + public long DateTime { get; set; } + + [JsonPropertyName("text")] + public string? Text { get; set; } +} + +public class MessagePreview +{ + [JsonPropertyName("uid")] + public string UserId { get; set; } + + [JsonPropertyName("type")] + public MessageType MessageType { get; set; } + + [JsonPropertyName("dt")] + public long DateTime { get; set; } + + [JsonPropertyName("templateId")] + public string TemplateId { get; set; } + + [JsonPropertyName("text")] + public string? Text { get; set; } + + [JsonPropertyName("systemData")] + public SystemData? SystemData { get; set; } +} + +public class MessageItems +{ + [JsonPropertyName("stash")] + public string? Stash { get; set; } + + [JsonPropertyName("data")] + public List? Data { get; set; } +} + +public class UpdatableChatMember +{ + [JsonPropertyName("Nickname")] + public string Nickname { get; set; } + + [JsonPropertyName("Side")] + public string Side { get; set; } + + [JsonPropertyName("Level")] + public int Level { get; set; } + + [JsonPropertyName("MemberCategory")] + public MemberCategory MemberCategory { get; set; } + + [JsonPropertyName("Ignored")] + public bool IsIgnored { get; set; } + + [JsonPropertyName("Banned")] + public bool IsBanned { get; set; } +} + +public class Spt +{ + /** What version of SPT was this profile made with */ + [JsonPropertyName("version")] + public string Version { get; set; } + + /** What mods has this profile loaded at any point in time */ + [JsonPropertyName("mods")] + public List? Mods { get; set; } + + /** What gifts has this profile received and how many */ + [JsonPropertyName("receivedGifts")] + public List? ReceivedGifts { get; set; } + + /** item TPLs blacklisted from being sold on flea for this profile */ + [JsonPropertyName("blacklistedItemTpls")] + public List? BlacklistedItemTemplates { get; set; } + + /** key: daily type */ + [JsonPropertyName("freeRepeatableRefreshUsedCount")] + public Dictionary? FreeRepeatableRefreshUsedCount { get; set; } + + /** When was a profile migrated, value is timestamp */ + [JsonPropertyName("migrations")] + public Dictionary? Migrations { get; set; } + + /** Cultist circle rewards received that are one time use, key (md5) is a combination of sacrificed + reward items */ + [JsonPropertyName("cultistRewards")] + public Dictionary? CultistRewards { get; set; } +} + +public class AcceptedCultistReward +{ + [JsonPropertyName("timestamp")] + public long Timestamp { get; set; } + + [JsonPropertyName("sacrificeItems")] + public List SacrificeItems { get; set; } + + [JsonPropertyName("rewardItems")] + public List RewardItems { get; set; } +} + +public class ModDetails +{ + [JsonPropertyName("name")] + public string Name { get; set; } + + [JsonPropertyName("version")] + public string Version { get; set; } + + [JsonPropertyName("author")] + public string Author { get; set; } + + [JsonPropertyName("dateAdded")] + public long DateAdded { get; set; } + + [JsonPropertyName("url")] + public string Url { get; set; } +} + +public class ReceivedGift +{ + [JsonPropertyName("giftId")] + public string GiftId { get; set; } + + [JsonPropertyName("timestampLastAccepted")] + public long TimestampLastAccepted { get; set; } + + [JsonPropertyName("current")] + public int Current { get; set; } +} + +public class Vitality +{ + [JsonPropertyName("health")] + public Health Health { get; set; } + + [JsonPropertyName("effects")] + public Effects Effects { get; set; } +} + +public class Health +{ + [JsonPropertyName("Hydration")] + public double Hydration { get; set; } + + [JsonPropertyName("Energy")] + public double Energy { get; set; } + + [JsonPropertyName("Temperature")] + public double Temperature { get; set; } + + [JsonPropertyName("Head")] + public double Head { get; set; } + + [JsonPropertyName("Chest")] + public double Chest { get; set; } + + [JsonPropertyName("Stomach")] + public double Stomach { get; set; } + + [JsonPropertyName("LeftArm")] + public double LeftArm { get; set; } + + [JsonPropertyName("RightArm")] + public double RightArm { get; set; } + + [JsonPropertyName("LeftLeg")] + public double LeftLeg { get; set; } + + [JsonPropertyName("RightLeg")] + public double RightLeg { get; set; } +} + +public class Effects +{ + [JsonPropertyName("Head")] + public Head Head { get; set; } + + [JsonPropertyName("Chest")] + public Chest Chest { get; set; } + + [JsonPropertyName("Stomach")] + public Stomach Stomach { get; set; } + + [JsonPropertyName("LeftArm")] + public LeftArm LeftArm { get; set; } + + [JsonPropertyName("RightArm")] + public RightArm RightArm { get; set; } + + [JsonPropertyName("LeftLeg")] + public LeftLeg LeftLeg { get; set; } + + [JsonPropertyName("RightLeg")] + public RightLeg RightLeg { get; set; } +} + +public class Head +{ +} + +public class Chest +{ +} + +public class Stomach +{ +} + +public class LeftArm +{ + [JsonPropertyName("Fracture")] + public double? Fracture { get; set; } +} + +public class RightArm +{ + [JsonPropertyName("Fracture")] + public double? Fracture { get; set; } +} + +public class LeftLeg +{ + [JsonPropertyName("Fracture")] + public double? Fracture { get; set; } +} + +public class RightLeg +{ + [JsonPropertyName("Fracture")] + public double? Fracture { get; set; } +} + +public class Inraid +{ + [JsonPropertyName("location")] + public string Location { get; set; } + + [JsonPropertyName("character")] + public string Character { get; set; } +} + +public class Insurance +{ + [JsonPropertyName("scheduledTime")] + public int ScheduledTime { get; set; } + + [JsonPropertyName("traderId")] + public string TraderId { get; set; } + + [JsonPropertyName("maxStorageTime")] + public int MaxStorageTime { get; set; } + + [JsonPropertyName("systemData")] + public SystemData SystemData { get; set; } + + [JsonPropertyName("messageType")] + public MessageType MessageType { get; set; } + + [JsonPropertyName("messageTemplateId")] + public string MessageTemplateId { get; set; } + + [JsonPropertyName("items")] + public List Items { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Profile/SystemData.cs b/Core/Models/Eft/Profile/SystemData.cs new file mode 100644 index 00000000..ec26d9ae --- /dev/null +++ b/Core/Models/Eft/Profile/SystemData.cs @@ -0,0 +1,24 @@ +using System.Text.Json.Serialization; + +namespace Core.Models.Eft.Profile; + +public class SystemData +{ + [JsonPropertyName("date")] + public string? Date { get; set; } + + [JsonPropertyName("time")] + public string? Time { get; set; } + + [JsonPropertyName("location")] + public string? Location { get; set; } + + [JsonPropertyName("buyerNickname")] + public string? BuyerNickname { get; set; } + + [JsonPropertyName("soldItem")] + public string? SoldItem { get; set; } + + [JsonPropertyName("itemCount")] + public int? ItemCount { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Eft/Profile/UserDialogInfo.cs b/Core/Models/Eft/Profile/UserDialogInfo.cs new file mode 100644 index 00000000..26731e58 --- /dev/null +++ b/Core/Models/Eft/Profile/UserDialogInfo.cs @@ -0,0 +1,34 @@ +using System.Text.Json.Serialization; +using Core.Models.Enums; + +namespace Core.Models.Eft.Profile; + +public class UserDialogInfo +{ + [JsonPropertyName("_id")] + public string Id { get; set; } + + [JsonPropertyName("aid")] + public int Aid { get; set; } + + [JsonPropertyName("Info")] + public UserDialogDetails Info { get; set; } +} + +public class UserDialogDetails +{ + [JsonPropertyName("Nickname")] + public string Nickname { get; set; } + + [JsonPropertyName("Side")] + public string Side { get; set; } + + [JsonPropertyName("Level")] + public int Level { get; set; } + + [JsonPropertyName("MemberCategory")] + public MemberCategory MemberCategory { get; set; } + + [JsonPropertyName("SelectedMemberCategory")] + public MemberCategory SelectedMemberCategory { get; set; } +} \ No newline at end of file diff --git a/Core/Models/Enums/EquipmentBuildType.cs b/Core/Models/Enums/EquipmentBuildType.cs new file mode 100644 index 00000000..bf7f8406 --- /dev/null +++ b/Core/Models/Enums/EquipmentBuildType.cs @@ -0,0 +1,7 @@ +namespace Core.Models.Enums; + +public enum EquipmentBuildType +{ + CUSTOM = 0, + STANDARD = 1, +} \ No newline at end of file diff --git a/Core/Models/Enums/MessageType.cs b/Core/Models/Enums/MessageType.cs new file mode 100644 index 00000000..891e58e5 --- /dev/null +++ b/Core/Models/Enums/MessageType.cs @@ -0,0 +1,20 @@ +namespace Core.Models.Enums; + +public enum MessageType +{ + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14, + BTR_ITEMS_DELIVERY = 15 +} \ No newline at end of file diff --git a/Core/Models/Spt/Server/DatabaseTables.cs b/Core/Models/Spt/Server/DatabaseTables.cs index 8e133c34..fecc6bde 100644 --- a/Core/Models/Spt/Server/DatabaseTables.cs +++ b/Core/Models/Spt/Server/DatabaseTables.cs @@ -1,4 +1,6 @@ -namespace Core.Models.Spt.Server; +using Core.Models.Eft.Common; + +namespace Core.Models.Spt.Server; public class DatabaseTables { @@ -7,7 +9,7 @@ public class DatabaseTables public LocaleBase? locales { get; } public Locations? locations { get; } public Match? match { get; } - public Templates? templates { get; } + public Templates.Templates? templates { get; } public Dictionary? traders { get; } public Globals? globals { get; } public ServerBase? server { get; } diff --git a/Core/Models/Spt/Templates/Templates.cs b/Core/Models/Spt/Templates/Templates.cs new file mode 100644 index 00000000..10b15429 --- /dev/null +++ b/Core/Models/Spt/Templates/Templates.cs @@ -0,0 +1,53 @@ +using Core.Models.Eft.Common.Tables; +using System.Text.Json.Serialization; +using Core.Models.Eft.Profile; + +namespace Core.Models.Spt.Templates; + + +public class Templates +{ + [JsonPropertyName("character")] + public List Character { get; set; } + + [JsonPropertyName("customisationStorage")] + public List CustomisationStorage { get; set; } + + [JsonPropertyName("items")] + public Dictionary Items { get; set; } + + [JsonPropertyName("prestige")] + public Prestige Prestige { get; set; } + + [JsonPropertyName("quests")] + public Dictionary Quests { get; set; } + + [JsonPropertyName("repeatableQuests")] + public RepeatableQuestDatabase RepeatableQuests { get; set; } + + [JsonPropertyName("handbook")] + public HandbookBase Handbook { get; set; } + + [JsonPropertyName("customization")] + public Dictionary Customization { get; set; } + + /** The profile templates listed in the launcher on profile creation, split by account type (e.g. Standard) then side (e.g. bear/usec) */ + [JsonPropertyName("profiles")] + public ProfileTemplates Profiles { get; set; } + + /** Flea prices of items - gathered from online flea market dump */ + [JsonPropertyName("prices")] + public Dictionary Prices { get; set; } + + /** Default equipment loadouts that show on main inventory screen */ + [JsonPropertyName("defaultEquipmentPresets")] + public List DefaultEquipmentPresets { get; set; } + + /** Achievements */ + [JsonPropertyName("achievements")] + public List Achievements { get; set; } + + /** Location services data */ + [JsonPropertyName("locationServices")] + public LocationServices LocationServices { get; set; } +} \ No newline at end of file