using System.Collections.Generic; using System.Text.Json.Serialization; namespace Better_NCP_Editor { public class BetterNPCEntity { // In BetterNPCEntity class public BetterNPCEntity() { Enabled = false; MonumentSize = ""; RemoveOtherNPCs = false; Presets = new List(); } [JsonPropertyName("Enabled? [true/false]")] public bool Enabled { get; set; } // Marked as nullable since some JSON files may not include this key. [JsonPropertyName("The size of the monument")] public string? MonumentSize { get; set; } // Marked as nullable so a missing key won’t cause issues. [JsonPropertyName("Remove other NPCs? [true/false]")] public bool? RemoveOtherNPCs { get; set; } [JsonPropertyName("Presets")] public List Presets { get; set; } } public class Preset { // In Preset class public Preset() { Enabled = true; MinimumNumbersDay = 1; MaximumNumbersDay = 1; MinimumNumbersNight = 1; MaximumNumbersNight = 1; NPCSetting = new NPCSetting(); Economics = new EconomicsInfo(); AppearanceType = 0; OwnLocations = new List(); ReturnToAppearance = false; NavigationGridType = 0; CratePath = ""; LootTableType = 0; PrefabLootTable = new PrefabLootTable(); OwnLootTable = new OwnLootTable(); } [JsonPropertyName("Enabled? [true/false]")] public bool Enabled { get; set; } [JsonPropertyName("Minimum numbers - Day")] public int MinimumNumbersDay { get; set; } [JsonPropertyName("Maximum numbers - Day")] public int MaximumNumbersDay { get; set; } [JsonPropertyName("Minimum numbers - Night")] public int MinimumNumbersNight { get; set; } [JsonPropertyName("Maximum numbers - Night")] public int MaximumNumbersNight { get; set; } [JsonPropertyName("NPCs setting")] public NPCSetting NPCSetting { get; set; } [JsonPropertyName("The amount of economics that is given for killing the NPC")] public EconomicsInfo Economics { get; set; } [JsonPropertyName("Type of appearance (0 - random; 1 - own list) (not used for Road and Biome)")] public int AppearanceType { get; set; } [JsonPropertyName("Own list of locations (not used for Road and Biome)")] public List OwnLocations { get; set; } [JsonPropertyName("If the NPC ends up below ocean sea level, should the NPC return to it's place of appearance? [true/false]")] public bool ReturnToAppearance { get; set; } [JsonPropertyName("Type of navigation grid (0 - used mainly on the island, 1 - used mainly under water or under land, as well as outside the map, can be used on some monuments)")] public int NavigationGridType { get; set; } [JsonPropertyName("The path to the crate that appears at the place of death (empty - not used)")] public string CratePath { get; set; } [JsonPropertyName("Which loot table should the plugin use? (0 - default; 1 - own; 2 - AlphaLoot; 3 - CustomLoot; 4 - loot table of the Rust objects; 5 - combine the 1 and 4 methods)")] public int LootTableType { get; set; } [JsonPropertyName("Loot table from prefabs (if the loot table type is 4 or 5)")] public PrefabLootTable PrefabLootTable { get; set; } [JsonPropertyName("Own loot table (if the loot table type is 1 or 5)")] public OwnLootTable OwnLootTable { get; set; } } public class NPCSetting { // In NPCSetting class public NPCSetting() { Names = new List(); Health = 100.0; RoamRange = 0.0; ChaseRange = 0.0; AttackRangeMultiplier = 1.0; SenseRange = 0.0; TargetMemoryDuration = 0.0; ScaleDamage = 1.0; AimConeScale = 1.0; DetectInVisionCone = false; VisionCone = 0.0; Speed = 0.0; MinAppearanceTime = 0.0; MaxAppearanceTime = 0.0; DisableRadioEffects = false; IsStationary = false; RemoveCorpse = false; WearItems = new List(); BeltItems = new List(); Kits = new List(); } [JsonPropertyName("Names")] public List Names { get; set; } [JsonPropertyName("Health")] public double Health { get; set; } [JsonPropertyName("Roam Range")] public double RoamRange { get; set; } [JsonPropertyName("Chase Range")] public double ChaseRange { get; set; } [JsonPropertyName("Attack Range Multiplier")] public double AttackRangeMultiplier { get; set; } [JsonPropertyName("Sense Range")] public double SenseRange { get; set; } [JsonPropertyName("Target Memory Duration [sec.]")] public double TargetMemoryDuration { get; set; } [JsonPropertyName("Scale damage")] public double ScaleDamage { get; set; } [JsonPropertyName("Aim Cone Scale")] public double AimConeScale { get; set; } [JsonPropertyName("Detect the target only in the NPC's viewing vision cone? [true/false]")] public bool DetectInVisionCone { get; set; } [JsonPropertyName("Vision Cone")] public double VisionCone { get; set; } [JsonPropertyName("Speed")] public double Speed { get; set; } [JsonPropertyName("Minimum time of appearance after death (not used for Events) [sec.]")] public double MinAppearanceTime { get; set; } [JsonPropertyName("Maximum time of appearance after death (not used for Events) [sec.]")] public double MaxAppearanceTime { get; set; } [JsonPropertyName("Disable radio effects? [true/false]")] public bool DisableRadioEffects { get; set; } [JsonPropertyName("Is this a stationary NPC? [true/false]")] public bool IsStationary { get; set; } [JsonPropertyName("Remove a corpse after death? (it is recommended to use the true value to improve performance) [true/false]")] public bool RemoveCorpse { get; set; } [JsonPropertyName("Wear items")] public List WearItems { get; set; } [JsonPropertyName("Belt items")] public List BeltItems { get; set; } [JsonPropertyName("Kits (it is recommended to use the previous 2 settings to improve performance)")] public List Kits { get; set; } } public class WearItem { // In WearItem class public WearItem() { ShortName = ""; SkinID = 0; } [JsonPropertyName("ShortName")] public string ShortName { get; set; } [JsonPropertyName("SkinID (0 - default)")] public long SkinID { get; set; } // Changed from int to long } public class BeltItem { // In BeltItem class public BeltItem() { ShortName = ""; Amount = 0; SkinID = 0; Mods = new List(); Ammo = ""; } [JsonPropertyName("ShortName")] public string ShortName { get; set; } [JsonPropertyName("Amount")] public int Amount { get; set; } [JsonPropertyName("SkinID (0 - default)")] public long SkinID { get; set; } // Changed from int to long [JsonPropertyName("Mods")] public List Mods { get; set; } [JsonPropertyName("Ammo")] public string Ammo { get; set; } } public class LootItem { // In LootItem class public LootItem() { ShortName = ""; Minimum = 0; Maximum = 0; Chance = 0.0; IsBlueprint = false; SkinID = 0; Name = ""; } [JsonPropertyName("ShortName")] public string ShortName { get; set; } [JsonPropertyName("Minimum")] public int Minimum { get; set; } [JsonPropertyName("Maximum")] public int Maximum { get; set; } [JsonPropertyName("Chance [0.0-100.0]")] public double Chance { get; set; } [JsonPropertyName("Is this a blueprint? [true/false]")] public bool IsBlueprint { get; set; } [JsonPropertyName("SkinID (0 - default)")] public long SkinID { get; set; } // Changed from int to long [JsonPropertyName("Name (empty - default)")] public string Name { get; set; } } public class EconomicsInfo { // In EconomicsInfo class public EconomicsInfo() { Economics = 0.0; ServerRewards = 0; IQEconomic = 0; } [JsonPropertyName("Economics")] public double Economics { get; set; } [JsonPropertyName("Server Rewards (minimum 1)")] public int ServerRewards { get; set; } [JsonPropertyName("IQEconomic (minimum 1)")] public int IQEconomic { get; set; } } public class PrefabLootTable { // In PrefabLootTable class public PrefabLootTable() { MinPrefabs = 0; MaxPrefabs = 0; UseMinMax = false; Prefabs = new List(); } [JsonPropertyName("Minimum numbers of prefabs")] public int MinPrefabs { get; set; } [JsonPropertyName("Maximum numbers of prefabs")] public int MaxPrefabs { get; set; } [JsonPropertyName("Use minimum and maximum values? [true/false]")] public bool UseMinMax { get; set; } [JsonPropertyName("List of prefabs")] public List Prefabs { get; set; } } public class Prefab { // In Prefab class public Prefab() { Chance = 0.0; Path = ""; } [JsonPropertyName("Chance [0.0-100.0]")] public double Chance { get; set; } [JsonPropertyName("The path to the prefab")] public string Path { get; set; } } public class OwnLootTable { // In OwnLootTable class public OwnLootTable() { MinItems = 0; MaxItems = 0; UseMinMax = false; Items = new List(); } [JsonPropertyName("Minimum numbers of items")] public int MinItems { get; set; } [JsonPropertyName("Maximum numbers of items")] public int MaxItems { get; set; } [JsonPropertyName("Use minimum and maximum values? [true/false]")] public bool UseMinMax { get; set; } [JsonPropertyName("List of items")] public List Items { get; set; } } }