using System.Text.Json.Serialization; public class TitleDataContractInfo { [JsonPropertyName("Name")] public string Name { get; set; } [JsonPropertyName("Faction")] public string Faction { get; set; } [JsonPropertyName("ReputationIncrease")] public int ReputationIncrease { get; set; } [JsonPropertyName("Rewards")] public TitleDataContractInfoReward[] Rewards { get; set; } [JsonPropertyName("Objectives")] public TitleDataContractInfoObjective[] Objectives { get; set; } [JsonPropertyName("UnlockData")] public TitleDataContractInfoUnlockData UnlockData { get; set; } [JsonPropertyName("IsMainContract")] public bool IsMainContract { get; set; } [JsonPropertyName("ContractDifficulty")] public EYContractDifficulty ContractDifficulty { get; set; } } public class TitleDataContractInfoReward { [JsonPropertyName("ItemID")] public string ItemID { get; set; } [JsonPropertyName("Amount")] public int Amount { get; set; } } public class TitleDataContractInfoObjective { [JsonPropertyName("Type")] public EYContractObjectiveType Type { get; set; } [JsonPropertyName("MaxProgress")] public int MaxProgress { get; set; } [JsonPropertyName("ItemToOwn")] public string ItemToOwn { get; set; } [JsonPropertyName("KillConditions")] public TitleDataContractInfoObjectiveKillConditions? KillConditions { get; set; } } public class TitleDataContractInfoObjectiveKillConditions { [JsonPropertyName("KillTarget")] public EYKillTypeAction KillTarget { get; set; } [JsonPropertyName("AllowedWeaponCategories")] public EYDeviceCategory[] AllowedWeaponCategories { get; set; } [JsonPropertyName("AllowedSpecificWeapons")] public string[] AllowedSpecificWeapons { get; set; } [JsonPropertyName("SpecificAIEnemyTypeToKill")] public EYEnemyType SpecificAIEnemyTypeToKill { get; set; } [JsonPropertyName("MapName")] public string MapName { get; set; } [JsonPropertyName("OnlyDuringStorm")] public bool OnlyDuringStorm { get; set; } } public class TitleDataContractInfoUnlockData { [JsonPropertyName("Level")] public int Level { get; set; } [JsonPropertyName("Contracts")] public HashSet Contracts { get; set; } } public enum EYContractObjectiveType { Invalid = 0, Kills = 1, OwnNumOfItem = 2, DeadDrop = 3, VisitArea = 4, LootContainer = 5, FactionLevel = 6, CompletedMission = 7, MAX = 8 } public static class ContractObjectiveTypeExtensions { // Objectives that can only be observed while a raid is running (kills, dead-drops, // visiting an area, looting a container). The raid is hosted by the player's own // client and there is no dedicated game server, so their progress is never reported // to the backend (UpdatePlayerActiveContracts is never called). They are therefore // auto-credited server-side, otherwise these contracts can never be completed. // OwnNumOfItem is excluded (validated against the real stash) and so are the meta // objectives FactionLevel / CompletedMission (validated from persisted player data). public static bool IsRaidRuntime(this EYContractObjectiveType type) => type is EYContractObjectiveType.Kills or EYContractObjectiveType.DeadDrop or EYContractObjectiveType.VisitArea or EYContractObjectiveType.LootContainer; } public enum EYContractDifficulty { Invalid = 0, Easy = 1, Medium = 2, Hard = 3, MAX = 4 }; public enum EYDeviceCategory { AssaultRifle = 0, Pistol = 1, SMG = 2, SniperRifle = 3, HeavyWeapon = 4, Shotgun = 5, BurstRifle = 6, Exotic = 7, MissileLauncher = 8, Scanner = 9, All = 10, INVALID = 11, MAX = 12 }; public enum EYKillTypeAction { Invalid = 0, Players = 1, Creatures = 2, All = 3, MAX = 4 }; public enum EYEnemyType { None = 0, DebugAutomationTest = 1, DirtBeast_Melee = 2, DirtBeast_RangedShort = 3, DirtBeast_RangedMedium = 4, DirtBeast_RangedLong = 5, DirtBeast_MeleeHeavy = 6, DirtBeast_RangedHeavy = 7, DirtBeast_FlyingHeavy = 8, DirtBeast_Boss = 9, Orobot_Melee = 10, Orobot_RangedShort = 11, Orobot_RangedMedium = 12, Orobot_Walker = 13, Orobot_Platform = 14, Plunderbot_RangedShort = 15, Plunderbot_RangedMedium = 16, Plunderbot_RangedLong = 17, GlowBeetle_Blast = 18, GlowBeetle_Acid = 19, GlowBeetle_Summon = 20, Strider = 21, Rattler = 22, Weremole = 23, Crusher = 24, Howler = 25, MAX = 26 };