using System.Reflection; using System.Text.Json.Serialization; using Core.Models.Eft.Ragfair; using Core.Models.Enums; using Core.Utils.Json.Converters; namespace Core.Models.Eft.Common.Tables; public class BotBase { [JsonPropertyName("_id")] public string? Id { get; set; } [JsonPropertyName("aid")] public double? Aid { get; set; } /** SPT property - use to store player id - TODO - move to AID ( account id as guid of choice) */ [JsonPropertyName("sessionId")] public string? SessionId { get; set; } [JsonPropertyName("savage")] public string? Savage { get; set; } [JsonPropertyName("karmaValue")] public double? KarmaValue { get; set; } [JsonPropertyName("Info")] public Info? Info { get; set; } [JsonPropertyName("Customization")] public Customization? Customization { get; set; } [JsonPropertyName("Health")] public BotBaseHealth? Health { get; set; } [JsonPropertyName("Inventory")] public BotBaseInventory? Inventory { get; set; } [JsonPropertyName("Skills")] public Skills? Skills { get; set; } [JsonPropertyName("Stats")] public Stats? Stats { get; set; } [JsonPropertyName("Encyclopedia")] public Dictionary? Encyclopedia { get; set; } [JsonPropertyName("TaskConditionCounters")] public Dictionary? TaskConditionCounters { get; set; } [JsonPropertyName("InsuredItems")] public List? InsuredItems { get; set; } [JsonPropertyName("Hideout")] public Hideout? Hideout { get; set; } [JsonPropertyName("Quests")] public List? Quests { get; set; } [JsonPropertyName("TradersInfo")] public Dictionary? TradersInfo { get; set; } [JsonPropertyName("UnlockedInfo")] public UnlockedInfo? UnlockedInfo { get; set; } [JsonPropertyName("RagfairInfo")] public RagfairInfo? RagfairInfo { get; set; } /** Achievement id and timestamp */ [JsonPropertyName("Achievements")] public Dictionary? Achievements { get; set; } [JsonPropertyName("RepeatableQuests")] public List? RepeatableQuests { get; set; } [JsonPropertyName("Bonuses")] public List? Bonuses { get; set; } [JsonPropertyName("Notes")] public Notes? Notes { get; set; } [JsonPropertyName("CarExtractCounts")] public Dictionary? CarExtractCounts { get; set; } [JsonPropertyName("CoopExtractCounts")] public Dictionary? CoopExtractCounts { get; set; } [JsonPropertyName("SurvivorClass")] public SurvivorClass? SurvivorClass { get; set; } [JsonPropertyName("WishList")] [JsonConverter(typeof(ArrayToObjectFactoryConverter))] public Dictionary? WishList { get; set; } [JsonPropertyName("moneyTransferLimitData")] public MoneyTransferLimits? MoneyTransferLimitData { get; set; } /** SPT specific property used during bot generation in raid */ [JsonPropertyName("sptIsPmc")] public bool? IsPmc { get; set; } } public class MoneyTransferLimits { // Resets every 24 hours in live /** TODO: Implement */ [JsonPropertyName("nextResetTime")] public double? NextResetTime { get; set; } [JsonPropertyName("remainingLimit")] public double? RemainingLimit { get; set; } [JsonPropertyName("totalLimit")] public double? TotalLimit { get; set; } [JsonPropertyName("resetInterval")] public double? ResetInterval { get; set; } } public class TaskConditionCounter { [JsonPropertyName("id")] public string? Id { get; set; } [JsonPropertyName("type")] public string? Type { get; set; } [JsonPropertyName("value")] public double? Value { get; set; } /** Quest id */ [JsonPropertyName("sourceId")] public string? SourceId { get; set; } } public class UnlockedInfo { [JsonPropertyName("unlockedProductionRecipe")] public List? UnlockedProductionRecipe { get; set; } } public class Info { public string? EntryPoint { get; set; } public string? Nickname { get; set; } public string? MainProfileNickname { get; set; } public string? LowerNickname { get; set; } public string? Side { get; set; } public bool? SquadInviteRestriction { get; set; } public bool? HasCoopExtension { get; set; } public bool? HasPveGame { get; set; } public string? Voice { get; set; } public double? Level { get; set; } public double? Experience { get; set; } public long? RegistrationDate { get; set; } public string? GameVersion { get; set; } public double? AccountType { get; set; } public MemberCategory? MemberCategory { get; set; } public MemberCategory? SelectedMemberCategory { get; set; } [JsonPropertyName("lockedMoveCommands")] public bool? LockedMoveCommands { get; set; } public long? SavageLockTime { get; set; } public long? LastTimePlayedAsSavage { get; set; } public BotInfoSettings? Settings { get; set; } public long? NicknameChangeDate { get; set; } public List? NeedWipeOptions { get; set; } [JsonPropertyName("lastCompletedWipe")] public LastCompleted? LastCompletedWipe { get; set; } public List? Bans { get; set; } public bool? BannedState { get; set; } public long? BannedUntil { get; set; } public bool? IsStreamerModeAvailable { get; set; } [JsonPropertyName("lastCompletedEvent")] public LastCompleted? LastCompletedEvent { get; set; } [JsonPropertyName("isMigratedSkills")] public bool? IsMigratedSkills { get; set; } } public class BotInfoSettings { public string? Role { get; set; } public string? BotDifficulty { get; set; } public double? Experience { get; set; } public double? StandingForKill { get; set; } public double? AggressorBonus { get; set; } public bool? UseSimpleAnimator { get; set; } } public class Ban { [JsonPropertyName("banType")] public BanType? BanType { get; set; } [JsonPropertyName("dateTime")] public long? DateTime { get; set; } } public enum BanType { CHAT = 0, RAGFAIR = 1, VOIP = 2, TRADING = 3, ONLINE = 4, FRIENDS = 5, CHANGE_NICKNAME = 6 } public class Customization { public string? Head { get; set; } public string? Body { get; set; } public string? Feet { get; set; } public string? Hands { get; set; } } public class BotBaseHealth { public CurrentMax? Hydration { get; set; } public CurrentMax? Energy { get; set; } public CurrentMax? Temperature { get; set; } public BodyPartsHealth? BodyParts { get; set; } public double? UpdateTime { get; set; } public bool? Immortal { get; set; } } public class BodyPartsHealth { public BodyPartHealth? Head { get; set; } public BodyPartHealth? Chest { get; set; } public BodyPartHealth? Stomach { get; set; } public BodyPartHealth? LeftArm { get; set; } public BodyPartHealth? RightArm { get; set; } public BodyPartHealth? LeftLeg { get; set; } public BodyPartHealth? RightLeg { get; set; } } public class BodyPartHealth { public CurrentMax? Health { get; set; } public Dictionary? Effects { get; set; } } public class BodyPartEffectProperties { // TODO: this was any, what actual type is it? public object? ExtraData { get; set; } public double? Time { get; set; } } public class CurrentMax { public double? Current { get; set; } public double? Maximum { get; set; } } public class BotBaseInventory { [JsonPropertyName("items")] public List? Items { get; set; } [JsonPropertyName("equipment")] public string? Equipment { get; set; } [JsonPropertyName("stash")] public string? Stash { get; set; } [JsonPropertyName("sortingTable")] public string? SortingTable { get; set; } [JsonPropertyName("questRaidItems")] public string? QuestRaidItems { get; set; } [JsonPropertyName("questStashItems")] public string? QuestStashItems { get; set; } /** Key is hideout area enum numeric as string e.g. "24", value is area _id */ [JsonPropertyName("hideoutAreaStashes")] public Dictionary? HideoutAreaStashes { get; set; } [JsonPropertyName("fastPanel")] public Dictionary? FastPanel { get; set; } [JsonPropertyName("favoriteItems")] public List? FavoriteItems { get; set; } } public class BaseJsonSkills { public Dictionary? Common { get; set; } public Dictionary? Mastering { get; set; } public double? Points { get; set; } } public class Skills { [JsonConverter(typeof(ArrayToObjectFactoryConverter))] public Dictionary? Common { get; set; } [JsonConverter(typeof(ArrayToObjectFactoryConverter))] public Dictionary? Mastering { get; set; } public double? Points { get; set; } } public class BaseSkill { public string? Id { get; set; } public double? Progress { get; set; } [JsonPropertyName("max")] public int? Max { get; set; } [JsonPropertyName("min")] public int? Min { get; set; } } public class Common : BaseSkill { public int? PointsEarnedDuringSession { get; set; } public int? LastAccess { get; set; } } public class Mastering : BaseSkill { } public class Stats { public EftStats? Eft { get; set; } } public class EftStats { public List? CarriedQuestItems { get; set; } public List? Victims { get; set; } public double? TotalSessionExperience { get; set; } public long? LastSessionDate { get; set; } public SessionCounters? SessionCounters { get; set; } public OverallCounters? OverallCounters { get; set; } public float? SessionExperienceMult { get; set; } public float? ExperienceBonusMult { get; set; } public Aggressor? Aggressor { get; set; } public List? DroppedItems { get; set; } public List? FoundInRaidItems { get; set; } public DamageHistory? DamageHistory { get; set; } public DeathCause? DeathCause { get; set; } public LastPlayerState? LastPlayerState { get; set; } public double? TotalInGameTime { get; set; } public string? SurvivorClass { get; set; } [JsonPropertyName("sptLastRaidFenceRepChange")] public float? SptLastRaidFenceRepChange { get; set; } } public class DroppedItem { public string? QuestId { get; set; } public string? ItemId { get; set; } public string? ZoneId { get; set; } } public class FoundInRaidItem { public string? QuestId { get; set; } public string? ItemId { get; set; } } // TODO: Same as Aggressor? public class Victim { public string? AccountId { get; set; } public string? ProfileId { get; set; } public string? Name { get; set; } public string? Side { get; set; } public string? BodyPart { get; set; } public string? Time { get; set; } public float? Distance { get; set; } public double? Level { get; set; } public string? Weapon { get; set; } public string? Role { get; set; } public string? Location { get; set; } } public class SessionCounters { public List? Items { get; set; } } public class OverallCounters { public List? Items { get; set; } } public class CounterKeyValue { public List? Key { get; set; } public double? Value { get; set; } } public class Aggressor { public string? AccountId { get; set; } public string? ProfileId { get; set; } public string? MainProfileNickname { get; set; } public string? Name { get; set; } public string? Side { get; set; } public string? BodyPart { get; set; } public string? HeadSegment { get; set; } public string? WeaponName { get; set; } public string? Category { get; set; } } public class DamageHistory { public string? LethalDamagePart { get; set; } public LethalDamage? LethalDamage { get; set; } [JsonConverter(typeof(ArrayToObjectFactoryConverter))] public BodyPartsDamageHistory? BodyParts { get; set; } } // TODO: this class seems exactly the same as DamageStats, why have it? public class LethalDamage { public double? Amount { get; set; } public string? Type { get; set; } public string? SourceId { get; set; } public string? OverDamageFrom { get; set; } public bool? Blunt { get; set; } public double? ImpactsCount { get; set; } } public class BodyPartsDamageHistory { public List? Head { get; set; } public List? Chest { get; set; } public List? Stomach { get; set; } public List? LeftArm { get; set; } public List? RightArm { get; set; } public List? LeftLeg { get; set; } public List? RightLeg { get; set; } public List? Common { get; set; } } public class DamageStats { public double? Amount { get; set; } public string? Type { get; set; } public string? SourceId { get; set; } public string? OverDamageFrom { get; set; } public bool? Blunt { get; set; } public double? ImpactsCount { get; set; } } public class DeathCause { public string? DamageType { get; set; } public string? Side { get; set; } public string? Role { get; set; } public string? WeaponId { get; set; } } public class LastPlayerState { public LastPlayerStateInfo? Info { get; set; } public Dictionary? Customization { get; set; } // TODO: there is no definition on TS just any public object? Equipment { get; set; } } public class LastPlayerStateInfo { public string? Nickname { get; set; } public string? Side { get; set; } public double? Level { get; set; } public MemberCategory? MemberCategory { get; set; } } public class BackendCounter { [JsonPropertyName("id")] public string? Id { get; set; } [JsonPropertyName("qid")] public string? QId { get; set; } [JsonPropertyName("value")] public double? Value { get; set; } } public class InsuredItem { /** Trader Id item was insured by */ [JsonPropertyName("tid")] public string? TId { get; set; } [JsonPropertyName("itemId")] public string? ItemId { get; set; } } public class Hideout { public Dictionary? Production { get; set; } public List? Areas { get; set; } public Dictionary? Improvements { get; set; } public HideoutCounters? HideoutCounters { get; set; } public double? Seed { get; set; } public List? MannequinPoses { get; set; } [JsonPropertyName("sptUpdateLastRunTimestamp")] public long? SptUpdateLastRunTimestamp { get; set; } } public class HideoutCounters { [JsonPropertyName("fuelCounter")] public double? FuelCounter { get; set; } [JsonPropertyName("airFilterCounter")] public double? AirFilterCounter { get; set; } [JsonPropertyName("waterFilterCounter")] public double? WaterFilterCounter { get; set; } [JsonPropertyName("craftingTimeCounter")] public double? CraftingTimeCounter { get; set; } } public class HideoutImprovement { [JsonPropertyName("completed")] public bool? Completed { get; set; } [JsonPropertyName("improveCompleteTimestamp")] public long? ImproveCompleteTimestamp { get; set; } } public class Productive { public List? Products { get; set; } /** Seconds passed of production */ public int? Progress { get; set; } /** Is craft in some state of being worked on by client (crafting/ready to pick up) */ [JsonPropertyName("inProgress")] public bool? InProgress { get; set; } public string? StartTimestamp { get; set; } public int? SkipTime { get; set; } /** Seconds needed to fully craft */ public int? ProductionTime { get; set; } public List? GivenItemsInStart { get; set; } public bool? Interrupted { get; set; } public string? Code { get; set; } public bool? Decoded { get; set; } public bool? AvailableForFinish { get; set; } /** Used in hideout production.json */ public bool? needFuelForAllProductionTime { get; set; } /** Used when sending data to client */ public bool? NeedFuelForAllProductionTime { get; set; } [JsonPropertyName("sptIsScavCase")] public bool? SptIsScavCase { get; set; } /** Some crafts are always inProgress, but need to be reset, e.g. water collector */ [JsonPropertyName("sptIsComplete")] public bool? SptIsComplete { get; set; } /** Is the craft a Continuous, e.g bitcoins/water collector */ [JsonPropertyName("sptIsContinuous")] public bool? SptIsContinuous { get; set; } /** Stores a list of tools used in this craft and whether they're FiR, to give back once the craft is done */ [JsonPropertyName("sptRequiredTools")] public List? SptRequiredTools { get; set; } // Craft is cultist circle sacrifice [JsonPropertyName("sptIsCultistCircle")] public bool? SptIsCultistCircle { get; set; } } public class Production : Productive { public string? RecipeId { get; set; } public int? SkipTime { get; set; } public int? ProductionTime { get; set; } } public class ScavCase : Productive { public string? RecipeId { get; set; } } public class Product { [JsonPropertyName("_id")] public string? Id { get; set; } [JsonPropertyName("_tpl")] public string? Template { get; set; } [JsonPropertyName("upd")] public Upd? Upd { get; set; } } public class BotHideoutArea { [JsonPropertyName("type")] public HideoutAreas? Type { get; set; } [JsonPropertyName("level")] public double? Level { get; set; } [JsonPropertyName("active")] public bool? Active { get; set; } [JsonPropertyName("passiveBonusesEnabled")] public bool? PassiveBonusesEnabled { get; set; } /** Must be integer */ [JsonPropertyName("completeTime")] public double? CompleteTime { get; set; } [JsonPropertyName("constructing")] public bool? Constructing { get; set; } [JsonPropertyName("slots")] public List? Slots { get; set; } [JsonPropertyName("lastRecipe")] public string? LastRecipe { get; set; } } public class HideoutSlot { /// /// SPT specific value to keep track of what index this slot is (0,1,2,3 etc) /// [JsonPropertyName("locationIndex")] public double? LocationIndex { get; set; } [JsonPropertyName("item")] public List? Items { get; set; } } public class HideoutItem { [JsonPropertyName("_id")] public string? Id { get; set; } [JsonPropertyName("_tpl")] public string? Template { get; set; } [JsonPropertyName("upd")] public Upd? Upd { get; set; } } public class LastCompleted { [JsonPropertyName("$oid")] public string? OId { get; set; } } public class Notes { [JsonPropertyName("notes")] public List? DataNotes { get; set; } } public enum SurvivorClass { UNKNOWN = 0, NEUTRALIZER = 1, MARAUDER = 2, PARAMEDIC = 3, SURVIVOR = 4 } public class Quests { [JsonPropertyName("qid")] public string? QId { get; set; } [JsonPropertyName("startTime")] public long? StartTime { get; set; } [JsonPropertyName("status")] public QuestStatus? Status { get; set; } [JsonPropertyName("statusTimers")] public Dictionary? StatusTimers { get; set; } /** Property does not exist in live profile data, but is used by ProfileChanges.questsStatus when sent to client */ [JsonPropertyName("completedConditions")] public List? CompletedConditions { get; set; } [JsonPropertyName("availableAfter")] public long? AvailableAfter { get; set; } } public class TraderInfo { [JsonPropertyName("loyaltyLevel")] public int? LoyaltyLevel { get; set; } [JsonPropertyName("salesSum")] public double? SalesSum { get; set; } [JsonPropertyName("standing")] public double? Standing { get; set; } [JsonPropertyName("nextResupply")] public double? NextResupply { get; set; } [JsonPropertyName("unlocked")] public bool? Unlocked { get; set; } [JsonPropertyName("disabled")] public bool? Disabled { get; set; } } public class RagfairInfo { [JsonPropertyName("rating")] public double? Rating { get; set; } [JsonPropertyName("isRatingGrowing")] public bool? IsRatingGrowing { get; set; } [JsonPropertyName("offers")] public List? Offers { get; set; } } public class Bonus { [JsonPropertyName("id")] public string? Id { get; set; } [JsonPropertyName("type")] public BonusType? Type { get; set; } [JsonPropertyName("templateId")] public string? TemplateId { get; set; } [JsonPropertyName("passive")] public bool? IsPassive { get; set; } [JsonPropertyName("production")] public bool? IsProduction { get; set; } [JsonPropertyName("visible")] public bool? IsVisible { get; set; } [JsonPropertyName("value")] public double? Value { get; set; } [JsonPropertyName("icon")] public string? Icon { get; set; } [JsonPropertyName("filter")] public List? Filter { get; set; } [JsonPropertyName("skillType")] public BonusSkillType? SkillType { get; set; } } public class Note { public double? Time { get; set; } public string? Text { get; set; } }