using System; using System.Collections.Generic; namespace MinecraftClient.Mapping { /// /// The dimension type, available after 1.16.2 /// public class Dimension { /// /// The name of the dimension type (for example, "minecraft:overworld"). /// public readonly string Name; /// /// Whether piglins shake and transform to zombified piglins. /// public readonly bool piglinSafe = false; /// /// Possibly the light level(s) at which monsters can spawn. /// public readonly int monsterSpawnMinLightLevel = 0; public readonly int monsterSpawnMaxLightLevel = 7; public readonly int monsterSpawnBlockLightLimit = 0; /// /// When false, compasses spin randomly. When true, nether portals can spawn zombified piglins. /// public readonly bool natural = true; /// /// How much light the dimension has. /// public readonly float ambientLight = 0.0f; /// /// If set, the time of the day is the specified value. /// Value: -1: not set /// Value: [0, 24000]: time of the day /// public readonly long fixedTime = -1; /// /// A resource location defining what block tag to use for infiniburn. /// Value above 1.18.2: "#" or minecraft resource "#minecraft:...". /// Value below 1.18.1: "" or minecraft resource "minecraft:...". /// public readonly string infiniburn = "#minecraft:infiniburn_overworld"; /// /// Whether players can charge and use respawn anchors. /// public readonly bool respawnAnchorWorks = false; /// /// Whether the dimension has skylight access or not. /// public readonly bool hasSkylight = true; /// /// Whether players can use a bed to sleep. /// public readonly bool bedWorks = true; /// /// unknown /// Values: "minecraft:overworld", "minecraft:the_nether", "minecraft:the_end" or something else. /// public readonly string effects = "minecraft:overworld"; /// /// Whether players with the Bad Omen effect can cause a raid. /// public readonly bool hasRaids = true; /// /// The minimum Y level. /// public readonly int minY = 0; /// /// The maximum Y level. /// public readonly int maxY = 256; /// /// The maximum height. /// public readonly int height = 256; /// /// The maximum height to which chorus fruits and nether portals can bring players within this dimension. /// public readonly int logicalHeight = 256; /// /// The multiplier applied to coordinates when traveling to the dimension. /// public readonly double coordinateScale = 1.0; /// /// Whether the dimensions behaves like the nether (water evaporates and sponges dry) or not. Also causes lava to spread thinner. /// public readonly bool ultrawarm = false; /// /// Whether the dimension has a bedrock ceiling or not. When true, causes lava to spread faster. /// public readonly bool hasCeiling = false; /// /// Default value used in version below 1.17 /// public Dimension() { Name = "minecraft:overworld"; } /// /// Create from the "Dimension Codec" NBT Tag Compound /// /// Dimension name /// The dimension type (NBT Tag Compound) public Dimension(string name, Dictionary nbt) { Name = name ?? throw new ArgumentNullException(nameof(name)); if (nbt == null) throw new ArgumentNullException(nameof(nbt)); if (nbt.ContainsKey("piglin_safe")) piglinSafe = Convert.ToBoolean(nbt["piglin_safe"]); if (nbt.ContainsKey("monster_spawn_light_level")) { try { var monsterSpawnLightLevelObj = nbt["monster_spawn_light_level"]; try { monsterSpawnMinLightLevel = monsterSpawnMaxLightLevel = Convert.ToInt32(monsterSpawnLightLevelObj); } catch (Exception) { var inclusive = (Dictionary)(((Dictionary)monsterSpawnLightLevelObj)["value"]); monsterSpawnMinLightLevel = Convert.ToInt32(inclusive["min_inclusive"]); monsterSpawnMaxLightLevel = Convert.ToInt32(inclusive["max_inclusive"]); } } catch (KeyNotFoundException) { } } if (nbt.ContainsKey("monster_spawn_block_light_limit")) monsterSpawnBlockLightLimit = Convert.ToInt32(nbt["monster_spawn_block_light_limit"]); if (nbt.ContainsKey("natural")) natural = Convert.ToBoolean(nbt["natural"]); if (nbt.ContainsKey("ambient_light")) ambientLight = (float)Convert.ToDouble(nbt["ambient_light"]); if (nbt.ContainsKey("fixed_time")) fixedTime = Convert.ToInt64(nbt["fixed_time"]); if (nbt.ContainsKey("infiniburn")) infiniburn = Convert.ToString(nbt["infiniburn"]) ?? string.Empty; if (nbt.ContainsKey("respawn_anchor_works")) respawnAnchorWorks = Convert.ToBoolean(nbt["respawn_anchor_works"]); if (nbt.ContainsKey("has_skylight")) hasSkylight = Convert.ToBoolean(nbt["has_skylight"]); if (nbt.ContainsKey("bed_works")) bedWorks = Convert.ToBoolean(nbt["bed_works"]); if (nbt.ContainsKey("effects")) effects = Convert.ToString(nbt["effects"]) ?? string.Empty; if (nbt.ContainsKey("has_raids")) hasRaids = Convert.ToBoolean(nbt["has_raids"]); if (nbt.ContainsKey("min_y")) minY = Convert.ToInt32(nbt["min_y"]); if (nbt.ContainsKey("height")) height = Convert.ToInt32(nbt["height"]); if (nbt.ContainsKey("min_y") && nbt.ContainsKey("height")) maxY = minY + height; if (nbt.ContainsKey("logical_height") && nbt["logical_height"].GetType() != typeof(byte)) logicalHeight = Convert.ToInt32(nbt["logical_height"]); if (nbt.ContainsKey("coordinate_scale")) coordinateScale = Convert.ToDouble(nbt["coordinate_scale"]); if (nbt.ContainsKey("ultrawarm")) ultrawarm = Convert.ToBoolean(nbt["ultrawarm"]); if (nbt.ContainsKey("has_ceiling")) hasCeiling = Convert.ToBoolean(nbt["has_ceiling"]); } } }