using System.Text.Json.Serialization; using Core.Models.Enums; using Core.Utils.Json.Converters; namespace Core.Models.Eft.Common.Tables; public class Quest { /// /// SPT addition - human readable quest name /// [JsonPropertyName("QuestName")] public string? QuestName { get; set; } /// /// _id /// [JsonPropertyName("_id")] public string? Id { get; set; } [JsonPropertyName("canShowNotificationsInGame")] public bool? CanShowNotificationsInGame { get; set; } [JsonPropertyName("conditions")] public QuestConditionTypes? Conditions { get; set; } [JsonPropertyName("description")] public string? Description { get; set; } [JsonPropertyName("failMessageText")] public string? FailMessageText { get; set; } [JsonPropertyName("name")] public string? Name { get; set; } [JsonPropertyName("note")] public string? Note { get; set; } [JsonPropertyName("traderId")] public string? TraderId { get; set; } [JsonPropertyName("location")] public string? Location { get; set; } [JsonPropertyName("image")] public string? Image { get; set; } [JsonPropertyName("type")] public string? Type { get; set; } [JsonPropertyName("isKey")] public bool? IsKey { get; set; } [JsonPropertyName("restartable")] public bool? Restartable { get; set; } [JsonPropertyName("instantComplete")] public bool? InstantComplete { get; set; } [JsonPropertyName("secretQuest")] public bool? SecretQuest { get; set; } [JsonPropertyName("startedMessageText")] public string? StartedMessageText { get; set; } [JsonPropertyName("successMessageText")] public string? SuccessMessageText { get; set; } [JsonPropertyName("acceptPlayerMessage")] public string? AcceptPlayerMessage { get; set; } [JsonPropertyName("declinePlayerMessage")] public string? DeclinePlayerMessage { get; set; } [JsonPropertyName("completePlayerMessage")] public string? CompletePlayerMessage { get; set; } [JsonPropertyName("templateId")] public string? TemplateId { get; set; } [JsonPropertyName("rewards")] public QuestRewards? Rewards { get; set; } /// /// Becomes 'AppearStatus' inside client /// [JsonPropertyName("status")] public object? Status { get; set; } // TODO: string | number [JsonPropertyName("KeyQuest")] public bool? KeyQuest { get; set; } [JsonPropertyName("changeQuestMessageText")] public string? ChangeQuestMessageText { get; set; } /// /// "Pmc" or "Scav" /// [JsonPropertyName("side")] public string? Side { get; set; } [JsonPropertyName("acceptanceAndFinishingSource")] public string? AcceptanceAndFinishingSource { get; set; } [JsonPropertyName("progressSource")] public string? ProgressSource { get; set; } [JsonPropertyName("rankingModes")] public List? RankingModes { get; set; } [JsonPropertyName("gameModes")] public List? GameModes { get; set; } [JsonPropertyName("arenaLocations")] public List? ArenaLocations { get; set; } /// /// Status of quest to player /// [JsonPropertyName("sptStatus")] public QuestStatusEnum? SptStatus { get; set; } [JsonPropertyName("questStatus")] public QuestStatus? QuestStatus { get; set; } [JsonPropertyName("changeCost")] public List ChangeCost { get; set; } [JsonPropertyName("changeStandingCost")] public double ChangeStandingCost { get; set; } } /// /// Same as BotBase.Quests /// public class QuestStatus { [JsonPropertyName("id")] public string? Id { get; set; } [JsonPropertyName("uid")] public string? Uid { get; set; } [JsonPropertyName("qid")] public string? QId { get; set; } [JsonPropertyName("startTime")] public double? StartTime { get; set; } [JsonPropertyName("status")] public QuestStatusEnum? Status { get; set; } [JsonPropertyName("statusTimers")] public Dictionary? StatusTimers { get; set; } [JsonPropertyName("completedConditions")] public List? CompletedConditions { get; set; } [JsonPropertyName("availableAfter")] public double? AvailableAfter { get; set; } } public class QuestConditionTypes { [JsonPropertyName("Started")] public List? Started { get; set; } [JsonPropertyName("AvailableForFinish")] public List? AvailableForFinish { get; set; } [JsonPropertyName("AvailableForStart")] public List? AvailableForStart { get; set; } [JsonPropertyName("Success")] public List? Success { get; set; } [JsonPropertyName("Fail")] public List? Fail { get; set; } } public class QuestCondition { [JsonPropertyName("id")] public string? Id { get; set; } [JsonPropertyName("index")] public int? Index { get; set; } [JsonPropertyName("compareMethod")] public string? CompareMethod { get; set; } [JsonPropertyName("dynamicLocale")] public bool? DynamicLocale { get; set; } [JsonPropertyName("visibilityConditions")] public List? VisibilityConditions { get; set; } [JsonPropertyName("globalQuestCounterId")] public string? GlobalQuestCounterId { get; set; } [JsonPropertyName("parentId")] public string? ParentId { get; set; } /// /// Can be: string[] or string /// [JsonPropertyName("target")] public object? Target { get; set; } // TODO: string[] | string [JsonPropertyName("value")] public object? Value { get; set; } // TODO: string | number [JsonPropertyName("type")] public object? Type { get; set; } // TODO: boolean | string [JsonPropertyName("status")] public List? Status { get; set; } [JsonPropertyName("availableAfter")] public int? AvailableAfter { get; set; } [JsonPropertyName("dispersion")] public double? Dispersion { get; set; } [JsonPropertyName("onlyFoundInRaid")] public bool? OnlyFoundInRaid { get; set; } [JsonPropertyName("oneSessionOnly")] public bool? OneSessionOnly { get; set; } [JsonPropertyName("isResetOnConditionFailed")] public bool? IsResetOnConditionFailed { get; set; } [JsonPropertyName("isNecessary")] public bool? IsNecessary { get; set; } [JsonPropertyName("doNotResetIfCounterCompleted")] public bool? DoNotResetIfCounterCompleted { get; set; } [JsonPropertyName("dogtagLevel")] public object? DogtagLevel { get; set; } // TODO: number | string [JsonPropertyName("traderId")] public string? TraderId { get; set; } [JsonPropertyName("maxDurability")] public object? MaxDurability { get; set; } // TODO: number | string [JsonPropertyName("minDurability")] public object? MinDurability { get; set; } // TODO: number | string [JsonPropertyName("counter")] public QuestConditionCounter? Counter { get; set; } [JsonPropertyName("plantTime")] public int? PlantTime { get; set; } [JsonPropertyName("zoneId")] public string? ZoneId { get; set; } [JsonPropertyName("countInRaid")] public bool? CountInRaid { get; set; } [JsonPropertyName("completeInSeconds")] public int? CompleteInSeconds { get; set; } [JsonPropertyName("isEncoded")] public bool? IsEncoded { get; set; } [JsonPropertyName("conditionType")] public string? ConditionType { get; set; } [JsonPropertyName("areaType")] public HideoutAreas? AreaType { get; set; } [JsonPropertyName("baseAccuracy")] public ValueCompare? BaseAccuracy { get; set; } [JsonPropertyName("containsItems")] public List? ContainsItems { get; set; } [JsonPropertyName("durability")] public ValueCompare? Durability { get; set; } [JsonPropertyName("effectiveDistance")] public ValueCompare? EffectiveDistance { get; set; } [JsonPropertyName("emptyTacticalSlot")] public ValueCompare? EmptyTacticalSlot { get; set; } [JsonPropertyName("ergonomics")] public ValueCompare? Ergonomics { get; set; } [JsonPropertyName("height")] public ValueCompare? Height { get; set; } [JsonPropertyName("hasItemFromCategory")] public List? HasItemFromCategory { get; set; } [JsonPropertyName("magazineCapacity")] public ValueCompare? MagazineCapacity { get; set; } [JsonPropertyName("muzzleVelocity")] public ValueCompare? MuzzleVelocity { get; set; } [JsonPropertyName("recoil")] public ValueCompare? Recoil { get; set; } [JsonPropertyName("weight")] public ValueCompare? Weight { get; set; } [JsonPropertyName("width")] public ValueCompare? Width { get; set; } } public class QuestConditionCounter { [JsonPropertyName("id")] public string? Id { get; set; } [JsonPropertyName("conditions")] public List? Conditions { get; set; } } public class QuestConditionCounterCondition { [JsonPropertyName("id")] public string? Id { get; set; } [JsonPropertyName("dynamicLocale")] public bool? DynamicLocale { get; set; } [JsonPropertyName("target")] public object? Target { get; set; } // TODO: string[] | string [JsonPropertyName("completeInSeconds")] public int? CompleteInSeconds { get; set; } [JsonPropertyName("energy")] public ValueCompare? Energy { get; set; } [JsonPropertyName("exitName")] public string? ExitName { get; set; } [JsonPropertyName("hydration")] public ValueCompare? Hydration { get; set; } [JsonPropertyName("time")] public ValueCompare? Time { get; set; } [JsonPropertyName("compareMethod")] public string? CompareMethod { get; set; } [JsonPropertyName("value")] public object? Value { get; set; } // TODO: number | string [JsonPropertyName("weapon")] public List? Weapon { get; set; } [JsonPropertyName("distance")] public CounterConditionDistance? Distance { get; set; } [JsonPropertyName("equipmentInclusive")] public List>? EquipmentInclusive { get; set; } [JsonPropertyName("weaponModsInclusive")] public List>? WeaponModsInclusive { get; set; } [JsonPropertyName("weaponModsExclusive")] public List>? WeaponModsExclusive { get; set; } [JsonPropertyName("enemyEquipmentInclusive")] public List>? EnemyEquipmentInclusive { get; set; } [JsonPropertyName("enemyEquipmentExclusive")] public List>? EnemyEquipmentExclusive { get; set; } [JsonPropertyName("weaponCaliber")] public List? WeaponCaliber { get; set; } [JsonPropertyName("savageRole")] public List? SavageRole { get; set; } [JsonPropertyName("status")] public List? Status { get; set; } [JsonPropertyName("bodyPart")] public List? BodyPart { get; set; } [JsonPropertyName("daytime")] public DaytimeCounter? Daytime { get; set; } [JsonPropertyName("conditionType")] public string? ConditionType { get; set; } [JsonPropertyName("enemyHealthEffects")] public List? EnemyHealthEffects { get; set; } [JsonPropertyName("resetOnSessionEnd")] public bool? ResetOnSessionEnd { get; set; } [JsonPropertyName("bodyPartsWithEffects")] public List? BodyPartsWithEffects { get; set; } [JsonPropertyName("IncludeNotEquippedItems")] public bool? IncludeNotEquippedItems { get; set; } [JsonPropertyName("equipmentExclusive")] public List>? EquipmentExclusive { get; set; } [JsonPropertyName("zoneIds")] public List? Zones { get; set; } } public class EnemyHealthEffect { [JsonPropertyName("bodyParts")] public List? BodyParts { get; set; } [JsonPropertyName("effects")] public List? Effects { get; set; } } public class ValueCompare { [JsonPropertyName("compareMethod")] public string? CompareMethod { get; set; } [JsonPropertyName("value")] public double? Value { get; set; } } public class CounterConditionDistance { [JsonPropertyName("value")] public int? Value { get; set; } [JsonPropertyName("compareMethod")] public string? CompareMethod { get; set; } } public class DaytimeCounter { [JsonPropertyName("from")] public int? From { get; set; } [JsonPropertyName("to")] public int? To { get; set; } } public class VisibilityCondition { [JsonPropertyName("id")] public string? Id { get; set; } [JsonPropertyName("target")] public string? Target { get; set; } [JsonPropertyName("value")] public int? Value { get; set; } [JsonPropertyName("dynamicLocale")] public bool? DynamicLocale { get; set; } [JsonPropertyName("oneSessionOnly")] public bool? OneSessionOnly { get; set; } [JsonPropertyName("conditionType")] public string? ConditionType { get; set; } } public class QuestRewards { [JsonPropertyName("AvailableForStart")] public List? AvailableForStart { get; set; } [JsonPropertyName("AvailableForFinish")] public List? AvailableForFinish { get; set; } [JsonPropertyName("Started")] public List? Started { get; set; } [JsonPropertyName("Success")] public List? Success { get; set; } [JsonPropertyName("Fail")] public List? Fail { get; set; } [JsonPropertyName("FailRestartable")] public List? FailRestartable { get; set; } [JsonPropertyName("Expired")] public List? Expired { get; set; } } public class QuestReward { [JsonPropertyName("value")] public object? Value { get; set; } // TODO: Can be either string or number [JsonPropertyName("id")] public string? Id { get; set; } [JsonPropertyName("type")] public QuestRewardType? Type { get; set; } // QuestRewardType [JsonPropertyName("index")] public int? Index { get; set; } [JsonPropertyName("target")] public string? Target { get; set; } [JsonPropertyName("items")] public List? Items { get; set; } [JsonPropertyName("loyaltyLevel")] public int? LoyaltyLevel { get; set; } /** Hideout area id */ [JsonPropertyName("traderId")] public object? TraderId { get; set; } // TODO: string | int [JsonPropertyName("isEncoded")] public bool? IsEncoded { get; set; } [JsonPropertyName("unknown")] public bool? Unknown { get; set; } [JsonPropertyName("findInRaid")] public bool? FindInRaid { get; set; } [JsonPropertyName("gameMode")] public List? GameMode { get; set; } /** Game editions whitelisted to get reward */ [JsonPropertyName("availableInGameEditions")] public List? AvailableInGameEditions { get; set; } /** Game editions blacklisted from getting reward */ [JsonPropertyName("notAvailableInGameEditions")] public List? NotAvailableInGameEditions { get; set; } // This is always Null atm in the achievements.json [JsonPropertyName("illustrationConfig")] public object? IllustrationConfig { get; set; } [JsonPropertyName("isHidden")] public bool? IsHidden { get; set; } }