diff --git a/Cargo.toml b/Cargo.toml index 427f6edd2..476383d1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,5 +49,6 @@ crossbeam = "0.8.4" uuid = { version = "1.11.0", features = ["serde", "v3", "v4"] } derive_more = { version = "1.0.0", features = ["full"] } serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" itertools = "0.13.0" diff --git a/assets/synced_registries.json b/assets/synced_registries.json new file mode 100644 index 000000000..5d94f3fd1 --- /dev/null +++ b/assets/synced_registries.json @@ -0,0 +1,5227 @@ +{ + "minecraft:worldgen/biome": { + "minecraft:badlands": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.badlands", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7254527, + "foliage_color": 10387789, + "grass_color": 9470285, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:bamboo_jungle": { + "has_precipitation": 1, + "temperature": 0.95, + "downfall": 0.9, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.bamboo_jungle", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7842047, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:basalt_deltas": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.basalt_deltas.mood", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "additions_sound": { + "sound": "minecraft:ambient.basalt_deltas.additions", + "tick_chance": 0.0111 + }, + "music": { + "sound": "minecraft:music.nether.basalt_deltas", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "particle": { + "options": { + "type": "minecraft:white_ash" + }, + "probability": 0.118093334 + }, + "ambient_sound": "minecraft:ambient.basalt_deltas.loop", + "sky_color": 7254527, + "fog_color": 6840176, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:beach": { + "has_precipitation": 1, + "temperature": 0.8, + "downfall": 0.4, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 7907327, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:birch_forest": { + "has_precipitation": 1, + "temperature": 0.6, + "downfall": 0.6, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.forest", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8037887, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:cherry_grove": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.cherry_grove", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8103167, + "foliage_color": 11983713, + "grass_color": 11983713, + "fog_color": 12638463, + "water_color": 6141935, + "water_fog_color": 6141935 + } + }, + "minecraft:cold_ocean": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4020182, + "water_fog_color": 329011 + } + }, + "minecraft:crimson_forest": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.crimson_forest.mood", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "additions_sound": { + "sound": "minecraft:ambient.crimson_forest.additions", + "tick_chance": 0.0111 + }, + "music": { + "sound": "minecraft:music.nether.crimson_forest", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "particle": { + "options": { + "type": "minecraft:crimson_spore" + }, + "probability": 0.025 + }, + "ambient_sound": "minecraft:ambient.crimson_forest.loop", + "sky_color": 7254527, + "fog_color": 3343107, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:dark_forest": { + "has_precipitation": 1, + "temperature": 0.7, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.forest", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "grass_color_modifier": "dark_forest", + "sky_color": 7972607, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:deep_cold_ocean": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4020182, + "water_fog_color": 329011 + } + }, + "minecraft:deep_dark": { + "has_precipitation": 1, + "temperature": 0.8, + "downfall": 0.4, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.deep_dark", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7907327, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:deep_frozen_ocean": { + "has_precipitation": 1, + "temperature": 0.5, + "temperature_modifier": "frozen", + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 3750089, + "water_fog_color": 329011 + } + }, + "minecraft:deep_lukewarm_ocean": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4566514, + "water_fog_color": 267827 + } + }, + "minecraft:deep_ocean": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:desert": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.desert", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7254527, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:dripstone_caves": { + "has_precipitation": 1, + "temperature": 0.8, + "downfall": 0.4, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.dripstone_caves", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7907327, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:end_barrens": { + "has_precipitation": 0, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 0, + "fog_color": 10518688, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:end_highlands": { + "has_precipitation": 0, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 0, + "fog_color": 10518688, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:end_midlands": { + "has_precipitation": 0, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 0, + "fog_color": 10518688, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:eroded_badlands": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.badlands", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7254527, + "foliage_color": 10387789, + "grass_color": 9470285, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:flower_forest": { + "has_precipitation": 1, + "temperature": 0.7, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.flower_forest", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7972607, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:forest": { + "has_precipitation": 1, + "temperature": 0.7, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.forest", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7972607, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:frozen_ocean": { + "has_precipitation": 1, + "temperature": 0.0, + "temperature_modifier": "frozen", + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8364543, + "fog_color": 12638463, + "water_color": 3750089, + "water_fog_color": 329011 + } + }, + "minecraft:frozen_peaks": { + "has_precipitation": 1, + "temperature": -0.7, + "downfall": 0.9, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.frozen_peaks", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8756735, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:frozen_river": { + "has_precipitation": 1, + "temperature": 0.0, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8364543, + "fog_color": 12638463, + "water_color": 3750089, + "water_fog_color": 329011 + } + }, + "minecraft:grove": { + "has_precipitation": 1, + "temperature": -0.2, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.grove", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8495359, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:ice_spikes": { + "has_precipitation": 1, + "temperature": 0.0, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8364543, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:jagged_peaks": { + "has_precipitation": 1, + "temperature": -0.7, + "downfall": 0.9, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.jagged_peaks", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8756735, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:jungle": { + "has_precipitation": 1, + "temperature": 0.95, + "downfall": 0.9, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.jungle", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7842047, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:lukewarm_ocean": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4566514, + "water_fog_color": 267827 + } + }, + "minecraft:lush_caves": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.lush_caves", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:mangrove_swamp": { + "has_precipitation": 1, + "temperature": 0.8, + "downfall": 0.9, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.swamp", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "grass_color_modifier": "swamp", + "sky_color": 7907327, + "foliage_color": 9285927, + "fog_color": 12638463, + "water_color": 3832426, + "water_fog_color": 5077600 + } + }, + "minecraft:meadow": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.meadow", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 937679, + "water_fog_color": 329011 + } + }, + "minecraft:mushroom_fields": { + "has_precipitation": 1, + "temperature": 0.9, + "downfall": 1.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 7842047, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:nether_wastes": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.nether_wastes.mood", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "additions_sound": { + "sound": "minecraft:ambient.nether_wastes.additions", + "tick_chance": 0.0111 + }, + "music": { + "sound": "minecraft:music.nether.nether_wastes", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "ambient_sound": "minecraft:ambient.nether_wastes.loop", + "sky_color": 7254527, + "fog_color": 3344392, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:ocean": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:old_growth_birch_forest": { + "has_precipitation": 1, + "temperature": 0.6, + "downfall": 0.6, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.forest", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8037887, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:old_growth_pine_taiga": { + "has_precipitation": 1, + "temperature": 0.3, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.old_growth_taiga", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8168447, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:old_growth_spruce_taiga": { + "has_precipitation": 1, + "temperature": 0.25, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.old_growth_taiga", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8233983, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:plains": { + "has_precipitation": 1, + "temperature": 0.8, + "downfall": 0.4, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 7907327, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:river": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:savanna": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 7254527, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:savanna_plateau": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 7254527, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:small_end_islands": { + "has_precipitation": 0, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 0, + "fog_color": 10518688, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:snowy_beach": { + "has_precipitation": 1, + "temperature": 0.05, + "downfall": 0.3, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8364543, + "fog_color": 12638463, + "water_color": 4020182, + "water_fog_color": 329011 + } + }, + "minecraft:snowy_plains": { + "has_precipitation": 1, + "temperature": 0.0, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8364543, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:snowy_slopes": { + "has_precipitation": 1, + "temperature": -0.3, + "downfall": 0.9, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.snowy_slopes", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 8560639, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:snowy_taiga": { + "has_precipitation": 1, + "temperature": -0.5, + "downfall": 0.4, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8625919, + "fog_color": 12638463, + "water_color": 4020182, + "water_fog_color": 329011 + } + }, + "minecraft:soul_sand_valley": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.soul_sand_valley.mood", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "additions_sound": { + "sound": "minecraft:ambient.soul_sand_valley.additions", + "tick_chance": 0.0111 + }, + "music": { + "sound": "minecraft:music.nether.soul_sand_valley", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "particle": { + "options": { + "type": "minecraft:ash" + }, + "probability": 0.00625 + }, + "ambient_sound": "minecraft:ambient.soul_sand_valley.loop", + "sky_color": 7254527, + "fog_color": 1787717, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:sparse_jungle": { + "has_precipitation": 1, + "temperature": 0.95, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.sparse_jungle", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7842047, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:stony_peaks": { + "has_precipitation": 1, + "temperature": 1.0, + "downfall": 0.3, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.stony_peaks", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7776511, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:stony_shore": { + "has_precipitation": 1, + "temperature": 0.2, + "downfall": 0.3, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8233727, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:sunflower_plains": { + "has_precipitation": 1, + "temperature": 0.8, + "downfall": 0.4, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 7907327, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:swamp": { + "has_precipitation": 1, + "temperature": 0.8, + "downfall": 0.9, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.swamp", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "grass_color_modifier": "swamp", + "sky_color": 7907327, + "foliage_color": 6975545, + "fog_color": 12638463, + "water_color": 6388580, + "water_fog_color": 2302743 + } + }, + "minecraft:taiga": { + "has_precipitation": 1, + "temperature": 0.25, + "downfall": 0.8, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8233983, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:the_end": { + "has_precipitation": 0, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 0, + "fog_color": 10518688, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:the_void": { + "has_precipitation": 0, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:warm_ocean": { + "has_precipitation": 1, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8103167, + "fog_color": 12638463, + "water_color": 4445678, + "water_fog_color": 270131 + } + }, + "minecraft:warped_forest": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.warped_forest.mood", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "additions_sound": { + "sound": "minecraft:ambient.warped_forest.additions", + "tick_chance": 0.0111 + }, + "music": { + "sound": "minecraft:music.nether.warped_forest", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "particle": { + "options": { + "type": "minecraft:warped_spore" + }, + "probability": 0.01428 + }, + "ambient_sound": "minecraft:ambient.warped_forest.loop", + "sky_color": 7254527, + "fog_color": 1705242, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:windswept_forest": { + "has_precipitation": 1, + "temperature": 0.2, + "downfall": 0.3, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8233727, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:windswept_gravelly_hills": { + "has_precipitation": 1, + "temperature": 0.2, + "downfall": 0.3, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8233727, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:windswept_hills": { + "has_precipitation": 1, + "temperature": 0.2, + "downfall": 0.3, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 8233727, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:windswept_savanna": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "sky_color": 7254527, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + }, + "minecraft:wooded_badlands": { + "has_precipitation": 0, + "temperature": 2.0, + "downfall": 0.0, + "effects": { + "mood_sound": { + "sound": "minecraft:ambient.cave", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + }, + "music": { + "sound": "minecraft:music.overworld.badlands", + "min_delay": 12000, + "max_delay": 24000, + "replace_current_music": 0 + }, + "sky_color": 7254527, + "foliage_color": 10387789, + "grass_color": 9470285, + "fog_color": 12638463, + "water_color": 4159204, + "water_fog_color": 329011 + } + } + }, + "minecraft:chat_type": { + "minecraft:chat": { + "chat": { + "translation_key": "chat.type.text", + "parameters": [ + "sender", + "content" + ] + }, + "narration": { + "translation_key": "chat.type.text.narrate", + "parameters": [ + "sender", + "content" + ] + } + }, + "minecraft:emote_command": { + "chat": { + "translation_key": "chat.type.emote", + "parameters": [ + "sender", + "content" + ] + }, + "narration": { + "translation_key": "chat.type.emote", + "parameters": [ + "sender", + "content" + ] + } + }, + "minecraft:msg_command_incoming": { + "chat": { + "translation_key": "commands.message.display.incoming", + "parameters": [ + "sender", + "content" + ], + "style": { + "italic": 1, + "color": "gray" + } + }, + "narration": { + "translation_key": "chat.type.text.narrate", + "parameters": [ + "sender", + "content" + ] + } + }, + "minecraft:msg_command_outgoing": { + "chat": { + "translation_key": "commands.message.display.outgoing", + "parameters": [ + "target", + "content" + ], + "style": { + "italic": 1, + "color": "gray" + } + }, + "narration": { + "translation_key": "chat.type.text.narrate", + "parameters": [ + "sender", + "content" + ] + } + }, + "minecraft:say_command": { + "chat": { + "translation_key": "chat.type.announcement", + "parameters": [ + "sender", + "content" + ] + }, + "narration": { + "translation_key": "chat.type.text.narrate", + "parameters": [ + "sender", + "content" + ] + } + }, + "minecraft:team_msg_command_incoming": { + "chat": { + "translation_key": "chat.type.team.text", + "parameters": [ + "target", + "sender", + "content" + ] + }, + "narration": { + "translation_key": "chat.type.text.narrate", + "parameters": [ + "sender", + "content" + ] + } + }, + "minecraft:team_msg_command_outgoing": { + "chat": { + "translation_key": "chat.type.team.sent", + "parameters": [ + "target", + "sender", + "content" + ] + }, + "narration": { + "translation_key": "chat.type.text.narrate", + "parameters": [ + "sender", + "content" + ] + } + } + }, + "minecraft:trim_pattern": { + "minecraft:bolt": { + "asset_id": "minecraft:bolt", + "template_item": "minecraft:bolt_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.bolt" + }, + "decal": 0 + }, + "minecraft:coast": { + "asset_id": "minecraft:coast", + "template_item": "minecraft:coast_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.coast" + }, + "decal": 0 + }, + "minecraft:dune": { + "asset_id": "minecraft:dune", + "template_item": "minecraft:dune_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.dune" + }, + "decal": 0 + }, + "minecraft:eye": { + "asset_id": "minecraft:eye", + "template_item": "minecraft:eye_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.eye" + }, + "decal": 0 + }, + "minecraft:flow": { + "asset_id": "minecraft:flow", + "template_item": "minecraft:flow_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.flow" + }, + "decal": 0 + }, + "minecraft:host": { + "asset_id": "minecraft:host", + "template_item": "minecraft:host_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.host" + }, + "decal": 0 + }, + "minecraft:raiser": { + "asset_id": "minecraft:raiser", + "template_item": "minecraft:raiser_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.raiser" + }, + "decal": 0 + }, + "minecraft:rib": { + "asset_id": "minecraft:rib", + "template_item": "minecraft:rib_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.rib" + }, + "decal": 0 + }, + "minecraft:sentry": { + "asset_id": "minecraft:sentry", + "template_item": "minecraft:sentry_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.sentry" + }, + "decal": 0 + }, + "minecraft:shaper": { + "asset_id": "minecraft:shaper", + "template_item": "minecraft:shaper_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.shaper" + }, + "decal": 0 + }, + "minecraft:silence": { + "asset_id": "minecraft:silence", + "template_item": "minecraft:silence_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.silence" + }, + "decal": 0 + }, + "minecraft:snout": { + "asset_id": "minecraft:snout", + "template_item": "minecraft:snout_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.snout" + }, + "decal": 0 + }, + "minecraft:spire": { + "asset_id": "minecraft:spire", + "template_item": "minecraft:spire_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.spire" + }, + "decal": 0 + }, + "minecraft:tide": { + "asset_id": "minecraft:tide", + "template_item": "minecraft:tide_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.tide" + }, + "decal": 0 + }, + "minecraft:vex": { + "asset_id": "minecraft:vex", + "template_item": "minecraft:vex_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.vex" + }, + "decal": 0 + }, + "minecraft:ward": { + "asset_id": "minecraft:ward", + "template_item": "minecraft:ward_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.ward" + }, + "decal": 0 + }, + "minecraft:wayfinder": { + "asset_id": "minecraft:wayfinder", + "template_item": "minecraft:wayfinder_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.wayfinder" + }, + "decal": 0 + }, + "minecraft:wild": { + "asset_id": "minecraft:wild", + "template_item": "minecraft:wild_armor_trim_smithing_template", + "description": { + "translate": "trim_pattern.minecraft.wild" + }, + "decal": 0 + } + }, + "minecraft:trim_material": { + "minecraft:amethyst": { + "item_model_index": 1.0, + "description": { + "translate": "trim_material.minecraft.amethyst", + "color": "#9A5CC6" + }, + "asset_name": "amethyst", + "ingredient": "minecraft:amethyst_shard" + }, + "minecraft:copper": { + "item_model_index": 0.5, + "description": { + "translate": "trim_material.minecraft.copper", + "color": "#B4684D" + }, + "asset_name": "copper", + "ingredient": "minecraft:copper_ingot" + }, + "minecraft:diamond": { + "item_model_index": 0.8, + "override_armor_materials": { + "minecraft:diamond": "diamond_darker" + }, + "description": { + "translate": "trim_material.minecraft.diamond", + "color": "#6EECD2" + }, + "asset_name": "diamond", + "ingredient": "minecraft:diamond" + }, + "minecraft:emerald": { + "item_model_index": 0.7, + "description": { + "translate": "trim_material.minecraft.emerald", + "color": "#11A036" + }, + "asset_name": "emerald", + "ingredient": "minecraft:emerald" + }, + "minecraft:gold": { + "item_model_index": 0.6, + "override_armor_materials": { + "minecraft:gold": "gold_darker" + }, + "description": { + "translate": "trim_material.minecraft.gold", + "color": "#DEB12D" + }, + "asset_name": "gold", + "ingredient": "minecraft:gold_ingot" + }, + "minecraft:iron": { + "item_model_index": 0.2, + "override_armor_materials": { + "minecraft:iron": "iron_darker" + }, + "description": { + "translate": "trim_material.minecraft.iron", + "color": "#ECECEC" + }, + "asset_name": "iron", + "ingredient": "minecraft:iron_ingot" + }, + "minecraft:lapis": { + "item_model_index": 0.9, + "description": { + "translate": "trim_material.minecraft.lapis", + "color": "#416E97" + }, + "asset_name": "lapis", + "ingredient": "minecraft:lapis_lazuli" + }, + "minecraft:netherite": { + "item_model_index": 0.3, + "override_armor_materials": { + "minecraft:netherite": "netherite_darker" + }, + "description": { + "translate": "trim_material.minecraft.netherite", + "color": "#625859" + }, + "asset_name": "netherite", + "ingredient": "minecraft:netherite_ingot" + }, + "minecraft:quartz": { + "item_model_index": 0.1, + "description": { + "translate": "trim_material.minecraft.quartz", + "color": "#E3D4C4" + }, + "asset_name": "quartz", + "ingredient": "minecraft:quartz" + }, + "minecraft:redstone": { + "item_model_index": 0.4, + "description": { + "translate": "trim_material.minecraft.redstone", + "color": "#971607" + }, + "asset_name": "redstone", + "ingredient": "minecraft:redstone" + } + }, + "minecraft:wolf_variant": { + "minecraft:ashen": { + "wild_texture": "minecraft:entity/wolf/wolf_ashen", + "tame_texture": "minecraft:entity/wolf/wolf_ashen_tame", + "angry_texture": "minecraft:entity/wolf/wolf_ashen_angry", + "biomes": "minecraft:snowy_taiga" + }, + "minecraft:black": { + "wild_texture": "minecraft:entity/wolf/wolf_black", + "tame_texture": "minecraft:entity/wolf/wolf_black_tame", + "angry_texture": "minecraft:entity/wolf/wolf_black_angry", + "biomes": "minecraft:old_growth_pine_taiga" + }, + "minecraft:chestnut": { + "wild_texture": "minecraft:entity/wolf/wolf_chestnut", + "tame_texture": "minecraft:entity/wolf/wolf_chestnut_tame", + "angry_texture": "minecraft:entity/wolf/wolf_chestnut_angry", + "biomes": "minecraft:old_growth_spruce_taiga" + }, + "minecraft:pale": { + "wild_texture": "minecraft:entity/wolf/wolf", + "tame_texture": "minecraft:entity/wolf/wolf_tame", + "angry_texture": "minecraft:entity/wolf/wolf_angry", + "biomes": "minecraft:taiga" + }, + "minecraft:snowy": { + "wild_texture": "minecraft:entity/wolf/wolf_snowy", + "tame_texture": "minecraft:entity/wolf/wolf_snowy_tame", + "angry_texture": "minecraft:entity/wolf/wolf_snowy_angry", + "biomes": "minecraft:grove" + }, + "minecraft:woods": { + "wild_texture": "minecraft:entity/wolf/wolf_woods", + "tame_texture": "minecraft:entity/wolf/wolf_woods_tame", + "angry_texture": "minecraft:entity/wolf/wolf_woods_angry", + "biomes": "minecraft:forest" + } + }, + "minecraft:painting_variant": { + "minecraft:alban": { + "asset_id": "minecraft:alban", + "title": { + "translate": "painting.minecraft.alban.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.alban.author", + "color": "gray" + }, + "width": 1, + "height": 1 + }, + "minecraft:aztec": { + "asset_id": "minecraft:aztec", + "title": { + "translate": "painting.minecraft.aztec.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.aztec.author", + "color": "gray" + }, + "width": 1, + "height": 1 + }, + "minecraft:aztec2": { + "asset_id": "minecraft:aztec2", + "title": { + "translate": "painting.minecraft.aztec2.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.aztec2.author", + "color": "gray" + }, + "width": 1, + "height": 1 + }, + "minecraft:backyard": { + "asset_id": "minecraft:backyard", + "title": { + "translate": "painting.minecraft.backyard.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.backyard.author", + "color": "gray" + }, + "width": 3, + "height": 4 + }, + "minecraft:baroque": { + "asset_id": "minecraft:baroque", + "title": { + "translate": "painting.minecraft.baroque.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.baroque.author", + "color": "gray" + }, + "width": 2, + "height": 2 + }, + "minecraft:bomb": { + "asset_id": "minecraft:bomb", + "title": { + "translate": "painting.minecraft.bomb.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.bomb.author", + "color": "gray" + }, + "width": 1, + "height": 1 + }, + "minecraft:bouquet": { + "asset_id": "minecraft:bouquet", + "title": { + "translate": "painting.minecraft.bouquet.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.bouquet.author", + "color": "gray" + }, + "width": 3, + "height": 3 + }, + "minecraft:burning_skull": { + "asset_id": "minecraft:burning_skull", + "title": { + "translate": "painting.minecraft.burning_skull.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.burning_skull.author", + "color": "gray" + }, + "width": 4, + "height": 4 + }, + "minecraft:bust": { + "asset_id": "minecraft:bust", + "title": { + "translate": "painting.minecraft.bust.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.bust.author", + "color": "gray" + }, + "width": 2, + "height": 2 + }, + "minecraft:cavebird": { + "asset_id": "minecraft:cavebird", + "title": { + "translate": "painting.minecraft.cavebird.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.cavebird.author", + "color": "gray" + }, + "width": 3, + "height": 3 + }, + "minecraft:changing": { + "asset_id": "minecraft:changing", + "title": { + "translate": "painting.minecraft.changing.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.changing.author", + "color": "gray" + }, + "width": 4, + "height": 2 + }, + "minecraft:cotan": { + "asset_id": "minecraft:cotan", + "title": { + "translate": "painting.minecraft.cotan.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.cotan.author", + "color": "gray" + }, + "width": 3, + "height": 3 + }, + "minecraft:courbet": { + "asset_id": "minecraft:courbet", + "title": { + "translate": "painting.minecraft.courbet.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.courbet.author", + "color": "gray" + }, + "width": 2, + "height": 1 + }, + "minecraft:creebet": { + "asset_id": "minecraft:creebet", + "title": { + "translate": "painting.minecraft.creebet.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.creebet.author", + "color": "gray" + }, + "width": 2, + "height": 1 + }, + "minecraft:donkey_kong": { + "asset_id": "minecraft:donkey_kong", + "title": { + "translate": "painting.minecraft.donkey_kong.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.donkey_kong.author", + "color": "gray" + }, + "width": 4, + "height": 3 + }, + "minecraft:earth": { + "asset_id": "minecraft:earth", + "title": { + "translate": "painting.minecraft.earth.title", + "color": "yellow" + }, + "width": 2, + "height": 2 + }, + "minecraft:endboss": { + "asset_id": "minecraft:endboss", + "title": { + "translate": "painting.minecraft.endboss.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.endboss.author", + "color": "gray" + }, + "width": 3, + "height": 3 + }, + "minecraft:fern": { + "asset_id": "minecraft:fern", + "title": { + "translate": "painting.minecraft.fern.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.fern.author", + "color": "gray" + }, + "width": 3, + "height": 3 + }, + "minecraft:fighters": { + "asset_id": "minecraft:fighters", + "title": { + "translate": "painting.minecraft.fighters.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.fighters.author", + "color": "gray" + }, + "width": 4, + "height": 2 + }, + "minecraft:finding": { + "asset_id": "minecraft:finding", + "title": { + "translate": "painting.minecraft.finding.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.finding.author", + "color": "gray" + }, + "width": 4, + "height": 2 + }, + "minecraft:fire": { + "asset_id": "minecraft:fire", + "title": { + "translate": "painting.minecraft.fire.title", + "color": "yellow" + }, + "width": 2, + "height": 2 + }, + "minecraft:graham": { + "asset_id": "minecraft:graham", + "title": { + "translate": "painting.minecraft.graham.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.graham.author", + "color": "gray" + }, + "width": 1, + "height": 2 + }, + "minecraft:humble": { + "asset_id": "minecraft:humble", + "title": { + "translate": "painting.minecraft.humble.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.humble.author", + "color": "gray" + }, + "width": 2, + "height": 2 + }, + "minecraft:kebab": { + "asset_id": "minecraft:kebab", + "title": { + "translate": "painting.minecraft.kebab.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.kebab.author", + "color": "gray" + }, + "width": 1, + "height": 1 + }, + "minecraft:lowmist": { + "asset_id": "minecraft:lowmist", + "title": { + "translate": "painting.minecraft.lowmist.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.lowmist.author", + "color": "gray" + }, + "width": 4, + "height": 2 + }, + "minecraft:match": { + "asset_id": "minecraft:match", + "title": { + "translate": "painting.minecraft.match.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.match.author", + "color": "gray" + }, + "width": 2, + "height": 2 + }, + "minecraft:meditative": { + "asset_id": "minecraft:meditative", + "title": { + "translate": "painting.minecraft.meditative.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.meditative.author", + "color": "gray" + }, + "width": 1, + "height": 1 + }, + "minecraft:orb": { + "asset_id": "minecraft:orb", + "title": { + "translate": "painting.minecraft.orb.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.orb.author", + "color": "gray" + }, + "width": 4, + "height": 4 + }, + "minecraft:owlemons": { + "asset_id": "minecraft:owlemons", + "title": { + "translate": "painting.minecraft.owlemons.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.owlemons.author", + "color": "gray" + }, + "width": 3, + "height": 3 + }, + "minecraft:passage": { + "asset_id": "minecraft:passage", + "title": { + "translate": "painting.minecraft.passage.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.passage.author", + "color": "gray" + }, + "width": 4, + "height": 2 + }, + "minecraft:pigscene": { + "asset_id": "minecraft:pigscene", + "title": { + "translate": "painting.minecraft.pigscene.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.pigscene.author", + "color": "gray" + }, + "width": 4, + "height": 4 + }, + "minecraft:plant": { + "asset_id": "minecraft:plant", + "title": { + "translate": "painting.minecraft.plant.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.plant.author", + "color": "gray" + }, + "width": 1, + "height": 1 + }, + "minecraft:pointer": { + "asset_id": "minecraft:pointer", + "title": { + "translate": "painting.minecraft.pointer.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.pointer.author", + "color": "gray" + }, + "width": 4, + "height": 4 + }, + "minecraft:pond": { + "asset_id": "minecraft:pond", + "title": { + "translate": "painting.minecraft.pond.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.pond.author", + "color": "gray" + }, + "width": 3, + "height": 4 + }, + "minecraft:pool": { + "asset_id": "minecraft:pool", + "title": { + "translate": "painting.minecraft.pool.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.pool.author", + "color": "gray" + }, + "width": 2, + "height": 1 + }, + "minecraft:prairie_ride": { + "asset_id": "minecraft:prairie_ride", + "title": { + "translate": "painting.minecraft.prairie_ride.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.prairie_ride.author", + "color": "gray" + }, + "width": 1, + "height": 2 + }, + "minecraft:sea": { + "asset_id": "minecraft:sea", + "title": { + "translate": "painting.minecraft.sea.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.sea.author", + "color": "gray" + }, + "width": 2, + "height": 1 + }, + "minecraft:skeleton": { + "asset_id": "minecraft:skeleton", + "title": { + "translate": "painting.minecraft.skeleton.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.skeleton.author", + "color": "gray" + }, + "width": 4, + "height": 3 + }, + "minecraft:skull_and_roses": { + "asset_id": "minecraft:skull_and_roses", + "title": { + "translate": "painting.minecraft.skull_and_roses.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.skull_and_roses.author", + "color": "gray" + }, + "width": 2, + "height": 2 + }, + "minecraft:stage": { + "asset_id": "minecraft:stage", + "title": { + "translate": "painting.minecraft.stage.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.stage.author", + "color": "gray" + }, + "width": 2, + "height": 2 + }, + "minecraft:sunflowers": { + "asset_id": "minecraft:sunflowers", + "title": { + "translate": "painting.minecraft.sunflowers.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.sunflowers.author", + "color": "gray" + }, + "width": 3, + "height": 3 + }, + "minecraft:sunset": { + "asset_id": "minecraft:sunset", + "title": { + "translate": "painting.minecraft.sunset.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.sunset.author", + "color": "gray" + }, + "width": 2, + "height": 1 + }, + "minecraft:tides": { + "asset_id": "minecraft:tides", + "title": { + "translate": "painting.minecraft.tides.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.tides.author", + "color": "gray" + }, + "width": 3, + "height": 3 + }, + "minecraft:unpacked": { + "asset_id": "minecraft:unpacked", + "title": { + "translate": "painting.minecraft.unpacked.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.unpacked.author", + "color": "gray" + }, + "width": 4, + "height": 4 + }, + "minecraft:void": { + "asset_id": "minecraft:void", + "title": { + "translate": "painting.minecraft.void.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.void.author", + "color": "gray" + }, + "width": 2, + "height": 2 + }, + "minecraft:wanderer": { + "asset_id": "minecraft:wanderer", + "title": { + "translate": "painting.minecraft.wanderer.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.wanderer.author", + "color": "gray" + }, + "width": 1, + "height": 2 + }, + "minecraft:wasteland": { + "asset_id": "minecraft:wasteland", + "title": { + "translate": "painting.minecraft.wasteland.title", + "color": "yellow" + }, + "author": { + "translate": "painting.minecraft.wasteland.author", + "color": "gray" + }, + "width": 1, + "height": 1 + }, + "minecraft:water": { + "asset_id": "minecraft:water", + "title": { + "translate": "painting.minecraft.water.title", + "color": "yellow" + }, + "width": 2, + "height": 2 + }, + "minecraft:wind": { + "asset_id": "minecraft:wind", + "title": { + "translate": "painting.minecraft.wind.title", + "color": "yellow" + }, + "width": 2, + "height": 2 + }, + "minecraft:wither": { + "asset_id": "minecraft:wither", + "title": { + "translate": "painting.minecraft.wither.title", + "color": "yellow" + }, + "width": 2, + "height": 2 + } + }, + "minecraft:dimension_type": { + "minecraft:overworld": { + "infiniburn": "#minecraft:infiniburn_overworld", + "effects": "minecraft:overworld", + "ambient_light": 0.0, + "piglin_safe": 0, + "has_raids": 1, + "monster_spawn_light_level": { + "min_inclusive": 0, + "max_inclusive": 7, + "type": "minecraft:uniform" + }, + "monster_spawn_block_light_limit": 0, + "respawn_anchor_works": 0, + "min_y": -64, + "height": 384, + "logical_height": 384, + "ultrawarm": 0, + "natural": 1, + "coordinate_scale": 1.0, + "bed_works": 1, + "has_skylight": 1, + "has_ceiling": 0 + }, + "minecraft:overworld_caves": { + "infiniburn": "#minecraft:infiniburn_overworld", + "effects": "minecraft:overworld", + "ambient_light": 0.0, + "piglin_safe": 0, + "has_raids": 1, + "monster_spawn_light_level": { + "min_inclusive": 0, + "max_inclusive": 7, + "type": "minecraft:uniform" + }, + "monster_spawn_block_light_limit": 0, + "respawn_anchor_works": 0, + "min_y": -64, + "height": 384, + "logical_height": 384, + "ultrawarm": 0, + "natural": 1, + "coordinate_scale": 1.0, + "bed_works": 1, + "has_skylight": 1, + "has_ceiling": 1 + }, + "minecraft:the_end": { + "infiniburn": "#minecraft:infiniburn_end", + "effects": "minecraft:the_end", + "ambient_light": 0.0, + "piglin_safe": 0, + "has_raids": 1, + "monster_spawn_light_level": { + "min_inclusive": 0, + "max_inclusive": 7, + "type": "minecraft:uniform" + }, + "monster_spawn_block_light_limit": 0, + "respawn_anchor_works": 0, + "min_y": 0, + "height": 256, + "logical_height": 256, + "ultrawarm": 0, + "natural": 0, + "coordinate_scale": 1.0, + "bed_works": 0, + "fixed_time": 6000, + "has_skylight": 0, + "has_ceiling": 0 + }, + "minecraft:the_nether": { + "infiniburn": "#minecraft:infiniburn_nether", + "effects": "minecraft:the_nether", + "ambient_light": 0.1, + "piglin_safe": 1, + "has_raids": 0, + "monster_spawn_light_level": 7, + "monster_spawn_block_light_limit": 15, + "respawn_anchor_works": 1, + "min_y": 0, + "height": 256, + "logical_height": 128, + "ultrawarm": 1, + "natural": 0, + "coordinate_scale": 8.0, + "bed_works": 0, + "fixed_time": 18000, + "has_skylight": 0, + "has_ceiling": 1 + } + }, + "minecraft:damage_type": { + "minecraft:arrow": { + "exhaustion": 0.1, + "message_id": "arrow", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:bad_respawn_point": { + "exhaustion": 0.1, + "death_message_type": "intentional_game_design", + "message_id": "badRespawnPoint", + "scaling": "always" + }, + "minecraft:cactus": { + "exhaustion": 0.1, + "message_id": "cactus", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:campfire": { + "exhaustion": 0.1, + "effects": "burning", + "message_id": "inFire", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:cramming": { + "exhaustion": 0.0, + "message_id": "cramming", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:dragon_breath": { + "exhaustion": 0.0, + "message_id": "dragonBreath", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:drown": { + "exhaustion": 0.0, + "effects": "drowning", + "message_id": "drown", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:dry_out": { + "exhaustion": 0.1, + "message_id": "dryout", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:ender_pearl": { + "exhaustion": 0.0, + "death_message_type": "fall_variants", + "message_id": "fall", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:explosion": { + "exhaustion": 0.1, + "message_id": "explosion", + "scaling": "always" + }, + "minecraft:fall": { + "exhaustion": 0.0, + "death_message_type": "fall_variants", + "message_id": "fall", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:falling_anvil": { + "exhaustion": 0.1, + "message_id": "anvil", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:falling_block": { + "exhaustion": 0.1, + "message_id": "fallingBlock", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:falling_stalactite": { + "exhaustion": 0.1, + "message_id": "fallingStalactite", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:fireball": { + "exhaustion": 0.1, + "effects": "burning", + "message_id": "fireball", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:fireworks": { + "exhaustion": 0.1, + "message_id": "fireworks", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:fly_into_wall": { + "exhaustion": 0.0, + "message_id": "flyIntoWall", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:freeze": { + "exhaustion": 0.0, + "effects": "freezing", + "message_id": "freeze", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:generic": { + "exhaustion": 0.0, + "message_id": "generic", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:generic_kill": { + "exhaustion": 0.0, + "message_id": "genericKill", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:hot_floor": { + "exhaustion": 0.1, + "effects": "burning", + "message_id": "hotFloor", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:in_fire": { + "exhaustion": 0.1, + "effects": "burning", + "message_id": "inFire", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:in_wall": { + "exhaustion": 0.0, + "message_id": "inWall", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:indirect_magic": { + "exhaustion": 0.0, + "message_id": "indirectMagic", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:lava": { + "exhaustion": 0.1, + "effects": "burning", + "message_id": "lava", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:lightning_bolt": { + "exhaustion": 0.1, + "message_id": "lightningBolt", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:mace_smash": { + "exhaustion": 0.1, + "message_id": "mace_smash", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:magic": { + "exhaustion": 0.0, + "message_id": "magic", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:mob_attack": { + "exhaustion": 0.1, + "message_id": "mob", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:mob_attack_no_aggro": { + "exhaustion": 0.1, + "message_id": "mob", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:mob_projectile": { + "exhaustion": 0.1, + "message_id": "mob", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:on_fire": { + "exhaustion": 0.0, + "effects": "burning", + "message_id": "onFire", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:out_of_world": { + "exhaustion": 0.0, + "message_id": "outOfWorld", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:outside_border": { + "exhaustion": 0.0, + "message_id": "outsideBorder", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:player_attack": { + "exhaustion": 0.1, + "message_id": "player", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:player_explosion": { + "exhaustion": 0.1, + "message_id": "explosion.player", + "scaling": "always" + }, + "minecraft:sonic_boom": { + "exhaustion": 0.0, + "message_id": "sonic_boom", + "scaling": "always" + }, + "minecraft:spit": { + "exhaustion": 0.1, + "message_id": "mob", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:stalagmite": { + "exhaustion": 0.0, + "message_id": "stalagmite", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:starve": { + "exhaustion": 0.0, + "message_id": "starve", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:sting": { + "exhaustion": 0.1, + "message_id": "sting", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:sweet_berry_bush": { + "exhaustion": 0.1, + "effects": "poking", + "message_id": "sweetBerryBush", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:thorns": { + "exhaustion": 0.1, + "effects": "thorns", + "message_id": "thorns", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:thrown": { + "exhaustion": 0.1, + "message_id": "thrown", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:trident": { + "exhaustion": 0.1, + "message_id": "trident", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:unattributed_fireball": { + "exhaustion": 0.1, + "effects": "burning", + "message_id": "onFire", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:wind_charge": { + "exhaustion": 0.1, + "message_id": "mob", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:wither": { + "exhaustion": 0.0, + "message_id": "wither", + "scaling": "when_caused_by_living_non_player" + }, + "minecraft:wither_skull": { + "exhaustion": 0.1, + "message_id": "witherSkull", + "scaling": "when_caused_by_living_non_player" + } + }, + "minecraft:banner_pattern": { + "minecraft:base": { + "asset_id": "minecraft:base", + "translation_key": "block.minecraft.banner.base" + }, + "minecraft:border": { + "asset_id": "minecraft:border", + "translation_key": "block.minecraft.banner.border" + }, + "minecraft:bricks": { + "asset_id": "minecraft:bricks", + "translation_key": "block.minecraft.banner.bricks" + }, + "minecraft:circle": { + "asset_id": "minecraft:circle", + "translation_key": "block.minecraft.banner.circle" + }, + "minecraft:creeper": { + "asset_id": "minecraft:creeper", + "translation_key": "block.minecraft.banner.creeper" + }, + "minecraft:cross": { + "asset_id": "minecraft:cross", + "translation_key": "block.minecraft.banner.cross" + }, + "minecraft:curly_border": { + "asset_id": "minecraft:curly_border", + "translation_key": "block.minecraft.banner.curly_border" + }, + "minecraft:diagonal_left": { + "asset_id": "minecraft:diagonal_left", + "translation_key": "block.minecraft.banner.diagonal_left" + }, + "minecraft:diagonal_right": { + "asset_id": "minecraft:diagonal_right", + "translation_key": "block.minecraft.banner.diagonal_right" + }, + "minecraft:diagonal_up_left": { + "asset_id": "minecraft:diagonal_up_left", + "translation_key": "block.minecraft.banner.diagonal_up_left" + }, + "minecraft:diagonal_up_right": { + "asset_id": "minecraft:diagonal_up_right", + "translation_key": "block.minecraft.banner.diagonal_up_right" + }, + "minecraft:flow": { + "asset_id": "minecraft:flow", + "translation_key": "block.minecraft.banner.flow" + }, + "minecraft:flower": { + "asset_id": "minecraft:flower", + "translation_key": "block.minecraft.banner.flower" + }, + "minecraft:globe": { + "asset_id": "minecraft:globe", + "translation_key": "block.minecraft.banner.globe" + }, + "minecraft:gradient": { + "asset_id": "minecraft:gradient", + "translation_key": "block.minecraft.banner.gradient" + }, + "minecraft:gradient_up": { + "asset_id": "minecraft:gradient_up", + "translation_key": "block.minecraft.banner.gradient_up" + }, + "minecraft:guster": { + "asset_id": "minecraft:guster", + "translation_key": "block.minecraft.banner.guster" + }, + "minecraft:half_horizontal": { + "asset_id": "minecraft:half_horizontal", + "translation_key": "block.minecraft.banner.half_horizontal" + }, + "minecraft:half_horizontal_bottom": { + "asset_id": "minecraft:half_horizontal_bottom", + "translation_key": "block.minecraft.banner.half_horizontal_bottom" + }, + "minecraft:half_vertical": { + "asset_id": "minecraft:half_vertical", + "translation_key": "block.minecraft.banner.half_vertical" + }, + "minecraft:half_vertical_right": { + "asset_id": "minecraft:half_vertical_right", + "translation_key": "block.minecraft.banner.half_vertical_right" + }, + "minecraft:mojang": { + "asset_id": "minecraft:mojang", + "translation_key": "block.minecraft.banner.mojang" + }, + "minecraft:piglin": { + "asset_id": "minecraft:piglin", + "translation_key": "block.minecraft.banner.piglin" + }, + "minecraft:rhombus": { + "asset_id": "minecraft:rhombus", + "translation_key": "block.minecraft.banner.rhombus" + }, + "minecraft:skull": { + "asset_id": "minecraft:skull", + "translation_key": "block.minecraft.banner.skull" + }, + "minecraft:small_stripes": { + "asset_id": "minecraft:small_stripes", + "translation_key": "block.minecraft.banner.small_stripes" + }, + "minecraft:square_bottom_left": { + "asset_id": "minecraft:square_bottom_left", + "translation_key": "block.minecraft.banner.square_bottom_left" + }, + "minecraft:square_bottom_right": { + "asset_id": "minecraft:square_bottom_right", + "translation_key": "block.minecraft.banner.square_bottom_right" + }, + "minecraft:square_top_left": { + "asset_id": "minecraft:square_top_left", + "translation_key": "block.minecraft.banner.square_top_left" + }, + "minecraft:square_top_right": { + "asset_id": "minecraft:square_top_right", + "translation_key": "block.minecraft.banner.square_top_right" + }, + "minecraft:straight_cross": { + "asset_id": "minecraft:straight_cross", + "translation_key": "block.minecraft.banner.straight_cross" + }, + "minecraft:stripe_bottom": { + "asset_id": "minecraft:stripe_bottom", + "translation_key": "block.minecraft.banner.stripe_bottom" + }, + "minecraft:stripe_center": { + "asset_id": "minecraft:stripe_center", + "translation_key": "block.minecraft.banner.stripe_center" + }, + "minecraft:stripe_downleft": { + "asset_id": "minecraft:stripe_downleft", + "translation_key": "block.minecraft.banner.stripe_downleft" + }, + "minecraft:stripe_downright": { + "asset_id": "minecraft:stripe_downright", + "translation_key": "block.minecraft.banner.stripe_downright" + }, + "minecraft:stripe_left": { + "asset_id": "minecraft:stripe_left", + "translation_key": "block.minecraft.banner.stripe_left" + }, + "minecraft:stripe_middle": { + "asset_id": "minecraft:stripe_middle", + "translation_key": "block.minecraft.banner.stripe_middle" + }, + "minecraft:stripe_right": { + "asset_id": "minecraft:stripe_right", + "translation_key": "block.minecraft.banner.stripe_right" + }, + "minecraft:stripe_top": { + "asset_id": "minecraft:stripe_top", + "translation_key": "block.minecraft.banner.stripe_top" + }, + "minecraft:triangle_bottom": { + "asset_id": "minecraft:triangle_bottom", + "translation_key": "block.minecraft.banner.triangle_bottom" + }, + "minecraft:triangle_top": { + "asset_id": "minecraft:triangle_top", + "translation_key": "block.minecraft.banner.triangle_top" + }, + "minecraft:triangles_bottom": { + "asset_id": "minecraft:triangles_bottom", + "translation_key": "block.minecraft.banner.triangles_bottom" + }, + "minecraft:triangles_top": { + "asset_id": "minecraft:triangles_top", + "translation_key": "block.minecraft.banner.triangles_top" + } + }, + "minecraft:enchantment": { + "minecraft:aqua_affinity": { + "description": { + "translate": "enchantment.minecraft.aqua_affinity" + }, + "min_cost": { + "base": 1, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 41, + "per_level_above_first": 0 + }, + "anvil_cost": 4, + "slots": [ + "head" + ], + "supported_items": "#minecraft:enchantable/head_armor", + "weight": 2, + "max_level": 1, + "effects": { + "minecraft:attributes": [ + { + "id": "minecraft:enchantment.aqua_affinity", + "attribute": "minecraft:submerged_mining_speed", + "amount": { + "base": 4.0, + "per_level_above_first": 4.0, + "type": "minecraft:linear" + }, + "operation": "add_multiplied_total" + } + ] + } + }, + "minecraft:bane_of_arthropods": { + "description": { + "translate": "enchantment.minecraft.bane_of_arthropods" + }, + "min_cost": { + "base": 5, + "per_level_above_first": 8 + }, + "max_cost": { + "base": 25, + "per_level_above_first": 8 + }, + "anvil_cost": 2, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/weapon", + "primary_items": "#minecraft:enchantable/sword", + "weight": 5, + "max_level": 5, + "exclusive_set": "#minecraft:exclusive_set/damage", + "effects": { + "minecraft:damage": [ + { + "effect": { + "value": { + "base": 2.5, + "per_level_above_first": 2.5, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "type": "#minecraft:sensitive_to_bane_of_arthropods" + }, + "entity": "this", + "condition": "minecraft:entity_properties" + } + } + ], + "minecraft:post_attack": [ + { + "enchanted": "attacker", + "affected": "victim", + "effect": { + "max_duration": { + "base": 1.5, + "per_level_above_first": 0.5, + "type": "minecraft:linear" + }, + "min_amplifier": 3.0, + "max_amplifier": 3.0, + "to_apply": "minecraft:slowness", + "min_duration": 1.5, + "type": "minecraft:apply_mob_effect" + }, + "requirements": { + "terms": [ + { + "predicate": { + "type": "#minecraft:sensitive_to_bane_of_arthropods" + }, + "entity": "this", + "condition": "minecraft:entity_properties" + }, + { + "predicate": { + "is_direct": 1 + }, + "condition": "minecraft:damage_source_properties" + } + ], + "condition": "minecraft:all_of" + } + } + ] + } + }, + "minecraft:binding_curse": { + "description": { + "translate": "enchantment.minecraft.binding_curse" + }, + "min_cost": { + "base": 25, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 8, + "slots": [ + "armor" + ], + "supported_items": "#minecraft:enchantable/equippable", + "weight": 1, + "max_level": 1, + "effects": { + "minecraft:prevent_armor_change": {} + } + }, + "minecraft:blast_protection": { + "description": { + "translate": "enchantment.minecraft.blast_protection" + }, + "min_cost": { + "base": 5, + "per_level_above_first": 8 + }, + "max_cost": { + "base": 13, + "per_level_above_first": 8 + }, + "anvil_cost": 4, + "slots": [ + "armor" + ], + "supported_items": "#minecraft:enchantable/armor", + "weight": 2, + "max_level": 4, + "exclusive_set": "#minecraft:exclusive_set/armor", + "effects": { + "minecraft:attributes": [ + { + "id": "minecraft:enchantment.blast_protection", + "attribute": "minecraft:explosion_knockback_resistance", + "amount": { + "base": 0.15, + "per_level_above_first": 0.15, + "type": "minecraft:linear" + }, + "operation": "add_value" + } + ], + "minecraft:damage_protection": [ + { + "effect": { + "value": { + "base": 2.0, + "per_level_above_first": 2.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "tags": [ + { + "id": "minecraft:is_explosion", + "expected": 1 + }, + { + "id": "minecraft:bypasses_invulnerability", + "expected": 0 + } + ] + }, + "condition": "minecraft:damage_source_properties" + } + } + ] + } + }, + "minecraft:breach": { + "description": { + "translate": "enchantment.minecraft.breach" + }, + "min_cost": { + "base": 15, + "per_level_above_first": 9 + }, + "max_cost": { + "base": 65, + "per_level_above_first": 9 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/mace", + "weight": 2, + "max_level": 4, + "exclusive_set": "#minecraft:exclusive_set/damage", + "effects": { + "minecraft:armor_effectiveness": [ + { + "effect": { + "value": { + "base": -0.15, + "per_level_above_first": -0.15, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ] + } + }, + "minecraft:channeling": { + "description": { + "translate": "enchantment.minecraft.channeling" + }, + "min_cost": { + "base": 25, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 8, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/trident", + "weight": 1, + "max_level": 1, + "effects": { + "minecraft:hit_block": [ + { + "effect": { + "effects": [ + { + "entity": "minecraft:lightning_bolt", + "type": "minecraft:summon_entity" + }, + { + "sound": "minecraft:item.trident.thunder", + "volume": 5.0, + "pitch": 1.0, + "type": "minecraft:play_sound" + } + ], + "type": "minecraft:all_of" + }, + "requirements": { + "terms": [ + { + "thundering": 1, + "condition": "minecraft:weather_check" + }, + { + "predicate": { + "type": "minecraft:trident" + }, + "entity": "this", + "condition": "minecraft:entity_properties" + }, + { + "predicate": { + "can_see_sky": 1 + }, + "condition": "minecraft:location_check" + }, + { + "block": "minecraft:lightning_rod", + "condition": "minecraft:block_state_property" + } + ], + "condition": "minecraft:all_of" + } + } + ], + "minecraft:post_attack": [ + { + "enchanted": "attacker", + "affected": "victim", + "effect": { + "effects": [ + { + "entity": "minecraft:lightning_bolt", + "type": "minecraft:summon_entity" + }, + { + "sound": "minecraft:item.trident.thunder", + "volume": 5.0, + "pitch": 1.0, + "type": "minecraft:play_sound" + } + ], + "type": "minecraft:all_of" + }, + "requirements": { + "terms": [ + { + "thundering": 1, + "condition": "minecraft:weather_check" + }, + { + "predicate": { + "location": { + "can_see_sky": 1 + } + }, + "entity": "this", + "condition": "minecraft:entity_properties" + }, + { + "predicate": { + "type": "minecraft:trident" + }, + "entity": "direct_attacker", + "condition": "minecraft:entity_properties" + } + ], + "condition": "minecraft:all_of" + } + } + ] + } + }, + "minecraft:density": { + "description": { + "translate": "enchantment.minecraft.density" + }, + "min_cost": { + "base": 5, + "per_level_above_first": 8 + }, + "max_cost": { + "base": 25, + "per_level_above_first": 8 + }, + "anvil_cost": 2, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/mace", + "weight": 5, + "max_level": 5, + "exclusive_set": "#minecraft:exclusive_set/damage", + "effects": { + "minecraft:smash_damage_per_fallen_block": [ + { + "effect": { + "value": { + "base": 0.5, + "per_level_above_first": 0.5, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ] + } + }, + "minecraft:depth_strider": { + "description": { + "translate": "enchantment.minecraft.depth_strider" + }, + "min_cost": { + "base": 10, + "per_level_above_first": 10 + }, + "max_cost": { + "base": 25, + "per_level_above_first": 10 + }, + "anvil_cost": 4, + "slots": [ + "feet" + ], + "supported_items": "#minecraft:enchantable/foot_armor", + "weight": 2, + "max_level": 3, + "exclusive_set": "#minecraft:exclusive_set/boots", + "effects": { + "minecraft:attributes": [ + { + "id": "minecraft:enchantment.depth_strider", + "attribute": "minecraft:water_movement_efficiency", + "amount": { + "base": 0.33333334, + "per_level_above_first": 0.33333334, + "type": "minecraft:linear" + }, + "operation": "add_value" + } + ] + } + }, + "minecraft:efficiency": { + "description": { + "translate": "enchantment.minecraft.efficiency" + }, + "min_cost": { + "base": 1, + "per_level_above_first": 10 + }, + "max_cost": { + "base": 51, + "per_level_above_first": 10 + }, + "anvil_cost": 1, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/mining", + "weight": 10, + "max_level": 5, + "effects": { + "minecraft:attributes": [ + { + "id": "minecraft:enchantment.efficiency", + "attribute": "minecraft:mining_efficiency", + "amount": { + "added": 1.0, + "type": "minecraft:levels_squared" + }, + "operation": "add_value" + } + ] + } + }, + "minecraft:feather_falling": { + "description": { + "translate": "enchantment.minecraft.feather_falling" + }, + "min_cost": { + "base": 5, + "per_level_above_first": 6 + }, + "max_cost": { + "base": 11, + "per_level_above_first": 6 + }, + "anvil_cost": 2, + "slots": [ + "armor" + ], + "supported_items": "#minecraft:enchantable/foot_armor", + "weight": 5, + "max_level": 4, + "effects": { + "minecraft:damage_protection": [ + { + "effect": { + "value": { + "base": 3.0, + "per_level_above_first": 3.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "tags": [ + { + "id": "minecraft:is_fall", + "expected": 1 + }, + { + "id": "minecraft:bypasses_invulnerability", + "expected": 0 + } + ] + }, + "condition": "minecraft:damage_source_properties" + } + } + ] + } + }, + "minecraft:fire_aspect": { + "description": { + "translate": "enchantment.minecraft.fire_aspect" + }, + "min_cost": { + "base": 10, + "per_level_above_first": 20 + }, + "max_cost": { + "base": 60, + "per_level_above_first": 20 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/fire_aspect", + "primary_items": "#minecraft:enchantable/sword", + "weight": 2, + "max_level": 2, + "effects": { + "minecraft:post_attack": [ + { + "enchanted": "attacker", + "affected": "victim", + "effect": { + "duration": { + "base": 4.0, + "per_level_above_first": 4.0, + "type": "minecraft:linear" + }, + "type": "minecraft:ignite" + }, + "requirements": { + "predicate": { + "is_direct": 1 + }, + "condition": "minecraft:damage_source_properties" + } + } + ] + } + }, + "minecraft:fire_protection": { + "description": { + "translate": "enchantment.minecraft.fire_protection" + }, + "min_cost": { + "base": 10, + "per_level_above_first": 8 + }, + "max_cost": { + "base": 18, + "per_level_above_first": 8 + }, + "anvil_cost": 2, + "slots": [ + "armor" + ], + "supported_items": "#minecraft:enchantable/armor", + "weight": 5, + "max_level": 4, + "exclusive_set": "#minecraft:exclusive_set/armor", + "effects": { + "minecraft:attributes": [ + { + "id": "minecraft:enchantment.fire_protection", + "attribute": "minecraft:burning_time", + "amount": { + "base": -0.15, + "per_level_above_first": -0.15, + "type": "minecraft:linear" + }, + "operation": "add_multiplied_base" + } + ], + "minecraft:damage_protection": [ + { + "effect": { + "value": { + "base": 2.0, + "per_level_above_first": 2.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "terms": [ + { + "predicate": { + "tags": [ + { + "id": "minecraft:is_fire", + "expected": 1 + }, + { + "id": "minecraft:bypasses_invulnerability", + "expected": 0 + } + ] + }, + "condition": "minecraft:damage_source_properties" + } + ], + "condition": "minecraft:all_of" + } + } + ] + } + }, + "minecraft:flame": { + "description": { + "translate": "enchantment.minecraft.flame" + }, + "min_cost": { + "base": 20, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/bow", + "weight": 2, + "max_level": 1, + "effects": { + "minecraft:projectile_spawned": [ + { + "effect": { + "duration": 100.0, + "type": "minecraft:ignite" + } + } + ] + } + }, + "minecraft:fortune": { + "description": { + "translate": "enchantment.minecraft.fortune" + }, + "min_cost": { + "base": 15, + "per_level_above_first": 9 + }, + "max_cost": { + "base": 65, + "per_level_above_first": 9 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/mining_loot", + "weight": 2, + "max_level": 3, + "exclusive_set": "#minecraft:exclusive_set/mining" + }, + "minecraft:frost_walker": { + "description": { + "translate": "enchantment.minecraft.frost_walker" + }, + "min_cost": { + "base": 10, + "per_level_above_first": 10 + }, + "max_cost": { + "base": 25, + "per_level_above_first": 10 + }, + "anvil_cost": 4, + "slots": [ + "feet" + ], + "supported_items": "#minecraft:enchantable/foot_armor", + "weight": 2, + "max_level": 2, + "exclusive_set": "#minecraft:exclusive_set/boots", + "effects": { + "minecraft:damage_immunity": [ + { + "effect": {}, + "requirements": { + "predicate": { + "tags": [ + { + "id": "minecraft:burn_from_stepping", + "expected": 1 + }, + { + "id": "minecraft:bypasses_invulnerability", + "expected": 0 + } + ] + }, + "condition": "minecraft:damage_source_properties" + } + } + ], + "minecraft:location_changed": [ + { + "effect": { + "predicate": { + "predicates": [ + { + "offset": [ + 0, + 1, + 0 + ], + "tag": "minecraft:air", + "type": "minecraft:matching_block_tag" + }, + { + "blocks": "minecraft:water", + "type": "minecraft:matching_blocks" + }, + { + "fluids": "minecraft:water", + "type": "minecraft:matching_fluids" + }, + { + "type": "minecraft:unobstructed" + } + ], + "type": "minecraft:all_of" + }, + "block_state": { + "state": { + "Properties": { + "age": "0" + }, + "Name": "minecraft:frosted_ice" + }, + "type": "minecraft:simple_state_provider" + }, + "trigger_game_event": "minecraft:block_place", + "radius": { + "value": { + "base": 3.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "min": 0.0, + "max": 16.0, + "type": "minecraft:clamped" + }, + "height": 1.0, + "offset": [ + 0, + -1, + 0 + ], + "type": "minecraft:replace_disk" + }, + "requirements": { + "predicate": { + "flags": { + "is_on_ground": 1 + } + }, + "entity": "this", + "condition": "minecraft:entity_properties" + } + } + ] + } + }, + "minecraft:impaling": { + "description": { + "translate": "enchantment.minecraft.impaling" + }, + "min_cost": { + "base": 1, + "per_level_above_first": 8 + }, + "max_cost": { + "base": 21, + "per_level_above_first": 8 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/trident", + "weight": 2, + "max_level": 5, + "exclusive_set": "#minecraft:exclusive_set/damage", + "effects": { + "minecraft:damage": [ + { + "effect": { + "value": { + "base": 2.5, + "per_level_above_first": 2.5, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "type": "#minecraft:sensitive_to_impaling" + }, + "entity": "this", + "condition": "minecraft:entity_properties" + } + } + ] + } + }, + "minecraft:infinity": { + "description": { + "translate": "enchantment.minecraft.infinity" + }, + "min_cost": { + "base": 20, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 8, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/bow", + "weight": 1, + "max_level": 1, + "exclusive_set": "#minecraft:exclusive_set/bow", + "effects": { + "minecraft:ammo_use": [ + { + "effect": { + "value": 0.0, + "type": "minecraft:set" + }, + "requirements": { + "predicate": { + "items": "minecraft:arrow" + }, + "condition": "minecraft:match_tool" + } + } + ] + } + }, + "minecraft:knockback": { + "description": { + "translate": "enchantment.minecraft.knockback" + }, + "min_cost": { + "base": 5, + "per_level_above_first": 20 + }, + "max_cost": { + "base": 55, + "per_level_above_first": 20 + }, + "anvil_cost": 2, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/sword", + "weight": 5, + "max_level": 2, + "effects": { + "minecraft:knockback": [ + { + "effect": { + "value": { + "base": 1.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ] + } + }, + "minecraft:looting": { + "description": { + "translate": "enchantment.minecraft.looting" + }, + "min_cost": { + "base": 15, + "per_level_above_first": 9 + }, + "max_cost": { + "base": 65, + "per_level_above_first": 9 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/sword", + "weight": 2, + "max_level": 3, + "effects": { + "minecraft:equipment_drops": [ + { + "enchanted": "attacker", + "effect": { + "value": { + "base": 0.01, + "per_level_above_first": 0.01, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "type": "minecraft:player" + }, + "entity": "attacker", + "condition": "minecraft:entity_properties" + } + } + ] + } + }, + "minecraft:loyalty": { + "description": { + "translate": "enchantment.minecraft.loyalty" + }, + "min_cost": { + "base": 12, + "per_level_above_first": 7 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 2, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/trident", + "weight": 5, + "max_level": 3, + "effects": { + "minecraft:trident_return_acceleration": [ + { + "effect": { + "value": { + "base": 1.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ] + } + }, + "minecraft:luck_of_the_sea": { + "description": { + "translate": "enchantment.minecraft.luck_of_the_sea" + }, + "min_cost": { + "base": 15, + "per_level_above_first": 9 + }, + "max_cost": { + "base": 65, + "per_level_above_first": 9 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/fishing", + "weight": 2, + "max_level": 3, + "effects": { + "minecraft:fishing_luck_bonus": [ + { + "effect": { + "value": { + "base": 1.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ] + } + }, + "minecraft:lure": { + "description": { + "translate": "enchantment.minecraft.lure" + }, + "min_cost": { + "base": 15, + "per_level_above_first": 9 + }, + "max_cost": { + "base": 65, + "per_level_above_first": 9 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/fishing", + "weight": 2, + "max_level": 3, + "effects": { + "minecraft:fishing_time_reduction": [ + { + "effect": { + "value": { + "base": 5.0, + "per_level_above_first": 5.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ] + } + }, + "minecraft:mending": { + "description": { + "translate": "enchantment.minecraft.mending" + }, + "min_cost": { + "base": 25, + "per_level_above_first": 25 + }, + "max_cost": { + "base": 75, + "per_level_above_first": 25 + }, + "anvil_cost": 4, + "slots": [ + "any" + ], + "supported_items": "#minecraft:enchantable/durability", + "weight": 2, + "max_level": 1, + "effects": { + "minecraft:repair_with_xp": [ + { + "effect": { + "factor": 2.0, + "type": "minecraft:multiply" + } + } + ] + } + }, + "minecraft:multishot": { + "description": { + "translate": "enchantment.minecraft.multishot" + }, + "min_cost": { + "base": 20, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/crossbow", + "weight": 2, + "max_level": 1, + "exclusive_set": "#minecraft:exclusive_set/crossbow", + "effects": { + "minecraft:projectile_count": [ + { + "effect": { + "value": { + "base": 2.0, + "per_level_above_first": 2.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ], + "minecraft:projectile_spread": [ + { + "effect": { + "value": { + "base": 10.0, + "per_level_above_first": 10.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ] + } + }, + "minecraft:piercing": { + "description": { + "translate": "enchantment.minecraft.piercing" + }, + "min_cost": { + "base": 1, + "per_level_above_first": 10 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 1, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/crossbow", + "weight": 10, + "max_level": 4, + "exclusive_set": "#minecraft:exclusive_set/crossbow", + "effects": { + "minecraft:projectile_piercing": [ + { + "effect": { + "value": { + "base": 1.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ] + } + }, + "minecraft:power": { + "description": { + "translate": "enchantment.minecraft.power" + }, + "min_cost": { + "base": 1, + "per_level_above_first": 10 + }, + "max_cost": { + "base": 16, + "per_level_above_first": 10 + }, + "anvil_cost": 1, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/bow", + "weight": 10, + "max_level": 5, + "effects": { + "minecraft:damage": [ + { + "effect": { + "value": { + "base": 0.5, + "per_level_above_first": 0.5, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "type": "#minecraft:arrows" + }, + "entity": "direct_attacker", + "condition": "minecraft:entity_properties" + } + } + ] + } + }, + "minecraft:projectile_protection": { + "description": { + "translate": "enchantment.minecraft.projectile_protection" + }, + "min_cost": { + "base": 3, + "per_level_above_first": 6 + }, + "max_cost": { + "base": 9, + "per_level_above_first": 6 + }, + "anvil_cost": 2, + "slots": [ + "armor" + ], + "supported_items": "#minecraft:enchantable/armor", + "weight": 5, + "max_level": 4, + "exclusive_set": "#minecraft:exclusive_set/armor", + "effects": { + "minecraft:damage_protection": [ + { + "effect": { + "value": { + "base": 2.0, + "per_level_above_first": 2.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "tags": [ + { + "id": "minecraft:is_projectile", + "expected": 1 + }, + { + "id": "minecraft:bypasses_invulnerability", + "expected": 0 + } + ] + }, + "condition": "minecraft:damage_source_properties" + } + } + ] + } + }, + "minecraft:protection": { + "description": { + "translate": "enchantment.minecraft.protection" + }, + "min_cost": { + "base": 1, + "per_level_above_first": 11 + }, + "max_cost": { + "base": 12, + "per_level_above_first": 11 + }, + "anvil_cost": 1, + "slots": [ + "armor" + ], + "supported_items": "#minecraft:enchantable/armor", + "weight": 10, + "max_level": 4, + "exclusive_set": "#minecraft:exclusive_set/armor", + "effects": { + "minecraft:damage_protection": [ + { + "effect": { + "value": { + "base": 1.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "tags": [ + { + "id": "minecraft:bypasses_invulnerability", + "expected": 0 + } + ] + }, + "condition": "minecraft:damage_source_properties" + } + } + ] + } + }, + "minecraft:punch": { + "description": { + "translate": "enchantment.minecraft.punch" + }, + "min_cost": { + "base": 12, + "per_level_above_first": 20 + }, + "max_cost": { + "base": 37, + "per_level_above_first": 20 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/bow", + "weight": 2, + "max_level": 2, + "effects": { + "minecraft:knockback": [ + { + "effect": { + "value": { + "base": 1.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "type": "#minecraft:arrows" + }, + "entity": "direct_attacker", + "condition": "minecraft:entity_properties" + } + } + ] + } + }, + "minecraft:quick_charge": { + "description": { + "translate": "enchantment.minecraft.quick_charge" + }, + "min_cost": { + "base": 12, + "per_level_above_first": 20 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 2, + "slots": [ + "mainhand", + "offhand" + ], + "supported_items": "#minecraft:enchantable/crossbow", + "weight": 5, + "max_level": 3, + "effects": { + "minecraft:crossbow_charge_time": { + "value": { + "base": -0.25, + "per_level_above_first": -0.25, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "minecraft:crossbow_charging_sounds": [ + { + "start": "minecraft:item.crossbow.quick_charge_1", + "end": "minecraft:item.crossbow.loading_end" + }, + { + "start": "minecraft:item.crossbow.quick_charge_2", + "end": "minecraft:item.crossbow.loading_end" + }, + { + "start": "minecraft:item.crossbow.quick_charge_3", + "end": "minecraft:item.crossbow.loading_end" + } + ] + } + }, + "minecraft:respiration": { + "description": { + "translate": "enchantment.minecraft.respiration" + }, + "min_cost": { + "base": 10, + "per_level_above_first": 10 + }, + "max_cost": { + "base": 40, + "per_level_above_first": 10 + }, + "anvil_cost": 4, + "slots": [ + "head" + ], + "supported_items": "#minecraft:enchantable/head_armor", + "weight": 2, + "max_level": 3, + "effects": { + "minecraft:attributes": [ + { + "id": "minecraft:enchantment.respiration", + "attribute": "minecraft:oxygen_bonus", + "amount": { + "base": 1.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "operation": "add_value" + } + ] + } + }, + "minecraft:riptide": { + "description": { + "translate": "enchantment.minecraft.riptide" + }, + "min_cost": { + "base": 17, + "per_level_above_first": 7 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 4, + "slots": [ + "hand" + ], + "supported_items": "#minecraft:enchantable/trident", + "weight": 2, + "max_level": 3, + "exclusive_set": "#minecraft:exclusive_set/riptide", + "effects": { + "minecraft:trident_sound": [ + "minecraft:item.trident.riptide_1", + "minecraft:item.trident.riptide_2", + "minecraft:item.trident.riptide_3" + ], + "minecraft:trident_spin_attack_strength": { + "value": { + "base": 1.5, + "per_level_above_first": 0.75, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + }, + "minecraft:sharpness": { + "description": { + "translate": "enchantment.minecraft.sharpness" + }, + "min_cost": { + "base": 1, + "per_level_above_first": 11 + }, + "max_cost": { + "base": 21, + "per_level_above_first": 11 + }, + "anvil_cost": 1, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/sharp_weapon", + "primary_items": "#minecraft:enchantable/sword", + "weight": 10, + "max_level": 5, + "exclusive_set": "#minecraft:exclusive_set/damage", + "effects": { + "minecraft:damage": [ + { + "effect": { + "value": { + "base": 1.0, + "per_level_above_first": 0.5, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + } + } + ] + } + }, + "minecraft:silk_touch": { + "description": { + "translate": "enchantment.minecraft.silk_touch" + }, + "min_cost": { + "base": 15, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 65, + "per_level_above_first": 0 + }, + "anvil_cost": 8, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/mining_loot", + "weight": 1, + "max_level": 1, + "exclusive_set": "#minecraft:exclusive_set/mining", + "effects": { + "minecraft:block_experience": [ + { + "effect": { + "value": 0.0, + "type": "minecraft:set" + } + } + ] + } + }, + "minecraft:smite": { + "description": { + "translate": "enchantment.minecraft.smite" + }, + "min_cost": { + "base": 5, + "per_level_above_first": 8 + }, + "max_cost": { + "base": 25, + "per_level_above_first": 8 + }, + "anvil_cost": 2, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/weapon", + "primary_items": "#minecraft:enchantable/sword", + "weight": 5, + "max_level": 5, + "exclusive_set": "#minecraft:exclusive_set/damage", + "effects": { + "minecraft:damage": [ + { + "effect": { + "value": { + "base": 2.5, + "per_level_above_first": 2.5, + "type": "minecraft:linear" + }, + "type": "minecraft:add" + }, + "requirements": { + "predicate": { + "type": "#minecraft:sensitive_to_smite" + }, + "entity": "this", + "condition": "minecraft:entity_properties" + } + } + ] + } + }, + "minecraft:soul_speed": { + "description": { + "translate": "enchantment.minecraft.soul_speed" + }, + "min_cost": { + "base": 10, + "per_level_above_first": 10 + }, + "max_cost": { + "base": 25, + "per_level_above_first": 10 + }, + "anvil_cost": 8, + "slots": [ + "feet" + ], + "supported_items": "#minecraft:enchantable/foot_armor", + "weight": 1, + "max_level": 3, + "effects": { + "minecraft:location_changed": [ + { + "effect": { + "effects": [ + { + "id": "minecraft:enchantment.soul_speed", + "attribute": "minecraft:movement_speed", + "amount": { + "base": 0.0405, + "per_level_above_first": 0.0105, + "type": "minecraft:linear" + }, + "operation": "add_value", + "type": "minecraft:attribute" + }, + { + "id": "minecraft:enchantment.soul_speed", + "attribute": "minecraft:movement_efficiency", + "amount": 1.0, + "operation": "add_value", + "type": "minecraft:attribute" + } + ], + "type": "minecraft:all_of" + }, + "requirements": { + "terms": [ + { + "term": { + "predicate": { + "vehicle": {} + }, + "entity": "this", + "condition": "minecraft:entity_properties" + }, + "condition": "minecraft:inverted" + }, + { + "terms": [ + { + "terms": [ + { + "active": 1, + "condition": "minecraft:enchantment_active_check" + }, + { + "predicate": { + "flags": { + "is_flying": 0 + } + }, + "entity": "this", + "condition": "minecraft:entity_properties" + }, + { + "terms": [ + { + "predicate": { + "movement_affected_by": { + "block": { + "blocks": "#minecraft:soul_speed_blocks" + } + } + }, + "entity": "this", + "condition": "minecraft:entity_properties" + }, + { + "predicate": { + "flags": { + "is_on_ground": 0 + } + }, + "entity": "this", + "condition": "minecraft:entity_properties" + } + ], + "condition": "minecraft:any_of" + } + ], + "condition": "minecraft:all_of" + }, + { + "terms": [ + { + "active": 0, + "condition": "minecraft:enchantment_active_check" + }, + { + "predicate": { + "movement_affected_by": { + "block": { + "blocks": "#minecraft:soul_speed_blocks" + } + }, + "flags": { + "is_flying": 0 + } + }, + "entity": "this", + "condition": "minecraft:entity_properties" + } + ], + "condition": "minecraft:all_of" + } + ], + "condition": "minecraft:any_of" + } + ], + "condition": "minecraft:all_of" + } + }, + { + "effect": { + "amount": 1.0, + "type": "minecraft:change_item_damage" + }, + "requirements": { + "terms": [ + { + "chance": { + "amount": 0.04, + "type": "minecraft:enchantment_level" + }, + "condition": "minecraft:random_chance" + }, + { + "predicate": { + "movement_affected_by": { + "block": { + "blocks": "#minecraft:soul_speed_blocks" + } + }, + "flags": { + "is_on_ground": 1 + } + }, + "entity": "this", + "condition": "minecraft:entity_properties" + } + ], + "condition": "minecraft:all_of" + } + } + ], + "minecraft:tick": [ + { + "effect": { + "horizontal_velocity": { + "movement_scale": -0.2 + }, + "vertical_velocity": { + "base": 0.1 + }, + "speed": 1.0, + "particle": { + "type": "minecraft:soul" + }, + "horizontal_position": { + "type": "in_bounding_box" + }, + "vertical_position": { + "type": "entity_position", + "offset": 0.1 + }, + "type": "minecraft:spawn_particles" + }, + "requirements": { + "predicate": { + "periodic_tick": 5, + "movement_affected_by": { + "block": { + "blocks": "#minecraft:soul_speed_blocks" + } + }, + "flags": { + "is_flying": 0, + "is_on_ground": 1 + }, + "movement": { + "horizontal_speed": { + "min": 9.999999747378752E-6 + } + } + }, + "entity": "this", + "condition": "minecraft:entity_properties" + } + }, + { + "effect": { + "sound": "minecraft:particle.soul_escape", + "volume": 0.6, + "pitch": { + "min_inclusive": 0.6, + "max_exclusive": 1.0, + "type": "minecraft:uniform" + }, + "type": "minecraft:play_sound" + }, + "requirements": { + "terms": [ + { + "chance": 0.35, + "condition": "minecraft:random_chance" + }, + { + "predicate": { + "periodic_tick": 5, + "movement_affected_by": { + "block": { + "blocks": "#minecraft:soul_speed_blocks" + } + }, + "flags": { + "is_flying": 0, + "is_on_ground": 1 + }, + "movement": { + "horizontal_speed": { + "min": 9.999999747378752E-6 + } + } + }, + "entity": "this", + "condition": "minecraft:entity_properties" + } + ], + "condition": "minecraft:all_of" + } + } + ] + } + }, + "minecraft:sweeping_edge": { + "description": { + "translate": "enchantment.minecraft.sweeping_edge" + }, + "min_cost": { + "base": 5, + "per_level_above_first": 9 + }, + "max_cost": { + "base": 20, + "per_level_above_first": 9 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/sword", + "weight": 2, + "max_level": 3, + "effects": { + "minecraft:attributes": [ + { + "id": "minecraft:enchantment.sweeping_edge", + "attribute": "minecraft:sweeping_damage_ratio", + "amount": { + "numerator": { + "base": 1.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "denominator": { + "base": 2.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "type": "minecraft:fraction" + }, + "operation": "add_value" + } + ] + } + }, + "minecraft:swift_sneak": { + "description": { + "translate": "enchantment.minecraft.swift_sneak" + }, + "min_cost": { + "base": 25, + "per_level_above_first": 25 + }, + "max_cost": { + "base": 75, + "per_level_above_first": 25 + }, + "anvil_cost": 8, + "slots": [ + "legs" + ], + "supported_items": "#minecraft:enchantable/leg_armor", + "weight": 1, + "max_level": 3, + "effects": { + "minecraft:attributes": [ + { + "id": "minecraft:enchantment.swift_sneak", + "attribute": "minecraft:sneaking_speed", + "amount": { + "base": 0.15, + "per_level_above_first": 0.15, + "type": "minecraft:linear" + }, + "operation": "add_value" + } + ] + } + }, + "minecraft:thorns": { + "description": { + "translate": "enchantment.minecraft.thorns" + }, + "min_cost": { + "base": 10, + "per_level_above_first": 20 + }, + "max_cost": { + "base": 60, + "per_level_above_first": 20 + }, + "anvil_cost": 8, + "slots": [ + "any" + ], + "supported_items": "#minecraft:enchantable/armor", + "primary_items": "#minecraft:enchantable/chest_armor", + "weight": 1, + "max_level": 3, + "effects": { + "minecraft:post_attack": [ + { + "enchanted": "victim", + "affected": "attacker", + "effect": { + "effects": [ + { + "min_damage": 1.0, + "max_damage": 5.0, + "damage_type": "minecraft:thorns", + "type": "minecraft:damage_entity" + }, + { + "amount": 2.0, + "type": "minecraft:change_item_damage" + } + ], + "type": "minecraft:all_of" + }, + "requirements": { + "chance": { + "amount": { + "base": 0.15, + "per_level_above_first": 0.15, + "type": "minecraft:linear" + }, + "type": "minecraft:enchantment_level" + }, + "condition": "minecraft:random_chance" + } + } + ] + } + }, + "minecraft:unbreaking": { + "description": { + "translate": "enchantment.minecraft.unbreaking" + }, + "min_cost": { + "base": 5, + "per_level_above_first": 8 + }, + "max_cost": { + "base": 55, + "per_level_above_first": 8 + }, + "anvil_cost": 2, + "slots": [ + "any" + ], + "supported_items": "#minecraft:enchantable/durability", + "weight": 5, + "max_level": 3, + "effects": { + "minecraft:item_damage": [ + { + "effect": { + "chance": { + "numerator": { + "base": 2.0, + "per_level_above_first": 2.0, + "type": "minecraft:linear" + }, + "denominator": { + "base": 10.0, + "per_level_above_first": 5.0, + "type": "minecraft:linear" + }, + "type": "minecraft:fraction" + }, + "type": "minecraft:remove_binomial" + }, + "requirements": { + "predicate": { + "items": "#minecraft:enchantable/armor" + }, + "condition": "minecraft:match_tool" + } + }, + { + "effect": { + "chance": { + "numerator": { + "base": 1.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "denominator": { + "base": 2.0, + "per_level_above_first": 1.0, + "type": "minecraft:linear" + }, + "type": "minecraft:fraction" + }, + "type": "minecraft:remove_binomial" + }, + "requirements": { + "term": { + "predicate": { + "items": "#minecraft:enchantable/armor" + }, + "condition": "minecraft:match_tool" + }, + "condition": "minecraft:inverted" + } + } + ] + } + }, + "minecraft:vanishing_curse": { + "description": { + "translate": "enchantment.minecraft.vanishing_curse" + }, + "min_cost": { + "base": 25, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 50, + "per_level_above_first": 0 + }, + "anvil_cost": 8, + "slots": [ + "any" + ], + "supported_items": "#minecraft:enchantable/vanishing", + "weight": 1, + "max_level": 1, + "effects": { + "minecraft:prevent_equipment_drop": {} + } + }, + "minecraft:wind_burst": { + "description": { + "translate": "enchantment.minecraft.wind_burst" + }, + "min_cost": { + "base": 15, + "per_level_above_first": 9 + }, + "max_cost": { + "base": 65, + "per_level_above_first": 9 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "supported_items": "#minecraft:enchantable/mace", + "weight": 2, + "max_level": 3, + "effects": { + "minecraft:post_attack": [ + { + "enchanted": "attacker", + "affected": "attacker", + "effect": { + "small_particle": { + "type": "minecraft:gust_emitter_small" + }, + "large_particle": { + "type": "minecraft:gust_emitter_large" + }, + "sound": "minecraft:entity.wind_charge.wind_burst", + "radius": 3.5, + "block_interaction": "trigger", + "knockback_multiplier": { + "values": [ + 1.2, + 1.75, + 2.2 + ], + "fallback": { + "base": 1.5, + "per_level_above_first": 0.35, + "type": "minecraft:linear" + }, + "type": "minecraft:lookup" + }, + "immune_blocks": "#minecraft:blocks_wind_charge_explosions", + "type": "minecraft:explode" + }, + "requirements": { + "predicate": { + "flags": { + "is_flying": 0 + }, + "movement": { + "fall_distance": { + "min": 1.5 + } + } + }, + "entity": "direct_attacker", + "condition": "minecraft:entity_properties" + } + } + ] + } + } + }, + "minecraft:jukebox_song": { + "minecraft:11": { + "sound_event": "minecraft:music_disc.11", + "description": { + "translate": "jukebox_song.minecraft.11" + }, + "length_in_seconds": 71.0, + "comparator_output": 11 + }, + "minecraft:13": { + "sound_event": "minecraft:music_disc.13", + "description": { + "translate": "jukebox_song.minecraft.13" + }, + "length_in_seconds": 178.0, + "comparator_output": 1 + }, + "minecraft:5": { + "sound_event": "minecraft:music_disc.5", + "description": { + "translate": "jukebox_song.minecraft.5" + }, + "length_in_seconds": 178.0, + "comparator_output": 15 + }, + "minecraft:blocks": { + "sound_event": "minecraft:music_disc.blocks", + "description": { + "translate": "jukebox_song.minecraft.blocks" + }, + "length_in_seconds": 345.0, + "comparator_output": 3 + }, + "minecraft:cat": { + "sound_event": "minecraft:music_disc.cat", + "description": { + "translate": "jukebox_song.minecraft.cat" + }, + "length_in_seconds": 185.0, + "comparator_output": 2 + }, + "minecraft:chirp": { + "sound_event": "minecraft:music_disc.chirp", + "description": { + "translate": "jukebox_song.minecraft.chirp" + }, + "length_in_seconds": 185.0, + "comparator_output": 4 + }, + "minecraft:creator": { + "sound_event": "minecraft:music_disc.creator", + "description": { + "translate": "jukebox_song.minecraft.creator" + }, + "length_in_seconds": 176.0, + "comparator_output": 12 + }, + "minecraft:creator_music_box": { + "sound_event": "minecraft:music_disc.creator_music_box", + "description": { + "translate": "jukebox_song.minecraft.creator_music_box" + }, + "length_in_seconds": 73.0, + "comparator_output": 11 + }, + "minecraft:far": { + "sound_event": "minecraft:music_disc.far", + "description": { + "translate": "jukebox_song.minecraft.far" + }, + "length_in_seconds": 174.0, + "comparator_output": 5 + }, + "minecraft:mall": { + "sound_event": "minecraft:music_disc.mall", + "description": { + "translate": "jukebox_song.minecraft.mall" + }, + "length_in_seconds": 197.0, + "comparator_output": 6 + }, + "minecraft:mellohi": { + "sound_event": "minecraft:music_disc.mellohi", + "description": { + "translate": "jukebox_song.minecraft.mellohi" + }, + "length_in_seconds": 96.0, + "comparator_output": 7 + }, + "minecraft:otherside": { + "sound_event": "minecraft:music_disc.otherside", + "description": { + "translate": "jukebox_song.minecraft.otherside" + }, + "length_in_seconds": 195.0, + "comparator_output": 14 + }, + "minecraft:pigstep": { + "sound_event": "minecraft:music_disc.pigstep", + "description": { + "translate": "jukebox_song.minecraft.pigstep" + }, + "length_in_seconds": 149.0, + "comparator_output": 13 + }, + "minecraft:precipice": { + "sound_event": "minecraft:music_disc.precipice", + "description": { + "translate": "jukebox_song.minecraft.precipice" + }, + "length_in_seconds": 299.0, + "comparator_output": 13 + }, + "minecraft:relic": { + "sound_event": "minecraft:music_disc.relic", + "description": { + "translate": "jukebox_song.minecraft.relic" + }, + "length_in_seconds": 218.0, + "comparator_output": 14 + }, + "minecraft:stal": { + "sound_event": "minecraft:music_disc.stal", + "description": { + "translate": "jukebox_song.minecraft.stal" + }, + "length_in_seconds": 150.0, + "comparator_output": 8 + }, + "minecraft:strad": { + "sound_event": "minecraft:music_disc.strad", + "description": { + "translate": "jukebox_song.minecraft.strad" + }, + "length_in_seconds": 188.0, + "comparator_output": 9 + }, + "minecraft:wait": { + "sound_event": "minecraft:music_disc.wait", + "description": { + "translate": "jukebox_song.minecraft.wait" + }, + "length_in_seconds": 238.0, + "comparator_output": 12 + }, + "minecraft:ward": { + "sound_event": "minecraft:music_disc.ward", + "description": { + "translate": "jukebox_song.minecraft.ward" + }, + "length_in_seconds": 251.0, + "comparator_output": 10 + } + }, + "minecraft:instrument": { + "minecraft:admire_goat_horn": { + "sound_event": "minecraft:item.goat_horn.sound.4", + "use_duration": 7.0, + "range": 256.0, + "description": { + "translate": "instrument.minecraft.admire_goat_horn" + } + }, + "minecraft:call_goat_horn": { + "sound_event": "minecraft:item.goat_horn.sound.5", + "use_duration": 7.0, + "range": 256.0, + "description": { + "translate": "instrument.minecraft.call_goat_horn" + } + }, + "minecraft:dream_goat_horn": { + "sound_event": "minecraft:item.goat_horn.sound.7", + "use_duration": 7.0, + "range": 256.0, + "description": { + "translate": "instrument.minecraft.dream_goat_horn" + } + }, + "minecraft:feel_goat_horn": { + "sound_event": "minecraft:item.goat_horn.sound.3", + "use_duration": 7.0, + "range": 256.0, + "description": { + "translate": "instrument.minecraft.feel_goat_horn" + } + }, + "minecraft:ponder_goat_horn": { + "sound_event": "minecraft:item.goat_horn.sound.0", + "use_duration": 7.0, + "range": 256.0, + "description": { + "translate": "instrument.minecraft.ponder_goat_horn" + } + }, + "minecraft:seek_goat_horn": { + "sound_event": "minecraft:item.goat_horn.sound.2", + "use_duration": 7.0, + "range": 256.0, + "description": { + "translate": "instrument.minecraft.seek_goat_horn" + } + }, + "minecraft:sing_goat_horn": { + "sound_event": "minecraft:item.goat_horn.sound.1", + "use_duration": 7.0, + "range": 256.0, + "description": { + "translate": "instrument.minecraft.sing_goat_horn" + } + }, + "minecraft:yearn_goat_horn": { + "sound_event": "minecraft:item.goat_horn.sound.6", + "use_duration": 7.0, + "range": 256.0, + "description": { + "translate": "instrument.minecraft.yearn_goat_horn" + } + } + } +} \ No newline at end of file diff --git a/extractor/src/main/kotlin/de/snowii/extractor/Extractor.kt b/extractor/src/main/kotlin/de/snowii/extractor/Extractor.kt index 1d294dad3..5a053c250 100644 --- a/extractor/src/main/kotlin/de/snowii/extractor/Extractor.kt +++ b/extractor/src/main/kotlin/de/snowii/extractor/Extractor.kt @@ -5,7 +5,6 @@ import com.google.gson.JsonElement import de.snowii.extractor.extractors.* import net.fabricmc.api.ModInitializer import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents -import net.minecraft.registry.DynamicRegistryManager import net.minecraft.server.MinecraftServer import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -27,6 +26,7 @@ class Extractor : ModInitializer { Sounds(), Recipes(), Particles(), + SyncedRegistries(), Packet(), Items(), Blocks(), diff --git a/extractor/src/main/kotlin/de/snowii/extractor/extractors/Packet.kt b/extractor/src/main/kotlin/de/snowii/extractor/extractors/Packet.kt index 3794c98b5..b358827de 100644 --- a/extractor/src/main/kotlin/de/snowii/extractor/extractors/Packet.kt +++ b/extractor/src/main/kotlin/de/snowii/extractor/extractors/Packet.kt @@ -9,7 +9,6 @@ import net.minecraft.network.NetworkState import net.minecraft.network.listener.PacketListener import net.minecraft.network.packet.PacketType import net.minecraft.network.state.* -import net.minecraft.registry.DynamicRegistryManager import net.minecraft.server.MinecraftServer diff --git a/extractor/src/main/kotlin/de/snowii/extractor/extractors/Particles.kt b/extractor/src/main/kotlin/de/snowii/extractor/extractors/Particles.kt index 7941f5d34..d07fb1e9d 100644 --- a/extractor/src/main/kotlin/de/snowii/extractor/extractors/Particles.kt +++ b/extractor/src/main/kotlin/de/snowii/extractor/extractors/Particles.kt @@ -4,9 +4,8 @@ import com.google.gson.JsonArray import com.google.gson.JsonElement import com.google.gson.JsonObject import de.snowii.extractor.Extractor -import net.minecraft.registry.DynamicRegistryManager +import net.minecraft.network.packet.s2c.play.InventoryS2CPacket import net.minecraft.registry.Registries -import net.minecraft.registry.RegistryKeys import net.minecraft.server.MinecraftServer @@ -17,7 +16,6 @@ class Particles : Extractor.Extractor { override fun extract(server: MinecraftServer): JsonElement { val particlesJson = JsonArray() - for (particle in Registries.PARTICLE_TYPE) { val particleJson = JsonObject() particleJson.addProperty("id", Registries.PARTICLE_TYPE.getRawId(particle)) diff --git a/extractor/src/main/kotlin/de/snowii/extractor/extractors/Recipes.kt b/extractor/src/main/kotlin/de/snowii/extractor/extractors/Recipes.kt index c7e40b43d..bc58511ae 100644 --- a/extractor/src/main/kotlin/de/snowii/extractor/extractors/Recipes.kt +++ b/extractor/src/main/kotlin/de/snowii/extractor/extractors/Recipes.kt @@ -6,8 +6,6 @@ import com.google.gson.JsonElement import com.google.gson.JsonObject import de.snowii.extractor.Extractor import net.minecraft.recipe.Recipe -import net.minecraft.registry.DynamicRegistryManager -import net.minecraft.registry.RegistryKeys import net.minecraft.server.MinecraftServer class Recipes : Extractor.Extractor { @@ -32,22 +30,22 @@ class Recipes : Extractor.Extractor { if (slot.isPresent) { placementJson.addProperty("position", slot.orElseThrow().placerOutputPosition) } - placementArray.add(placementJson); + placementArray.add(placementJson) } - recipeJson.add("placementSlots", placementArray); + recipeJson.add("placementSlots", placementArray) val ingredientArray = JsonArray() for (ingredient in recipe.ingredientPlacement.ingredients) { if (ingredient != null) { - val items = ingredient.matchingItems; + val items = ingredient.matchingItems val ingredientJson = JsonObject() for (item in items) { ingredientJson.addProperty("id", item.idAsString) } - ingredientArray.add(ingredientJson); + ingredientArray.add(ingredientJson) } } - recipeJson.add("ingredients", ingredientArray); + recipeJson.add("ingredients", ingredientArray) // recipeJson.addProperty("placementSlots", gson.toJson(recipe.ingredientPlacement.placementSlots)) recipesJson.add(recipeJson) diff --git a/extractor/src/main/kotlin/de/snowii/extractor/extractors/Sounds.kt b/extractor/src/main/kotlin/de/snowii/extractor/extractors/Sounds.kt index 15f55bb5c..ac745fb76 100644 --- a/extractor/src/main/kotlin/de/snowii/extractor/extractors/Sounds.kt +++ b/extractor/src/main/kotlin/de/snowii/extractor/extractors/Sounds.kt @@ -4,7 +4,6 @@ import com.google.gson.JsonArray import com.google.gson.JsonElement import com.google.gson.JsonObject import de.snowii.extractor.Extractor -import net.minecraft.registry.DynamicRegistryManager import net.minecraft.registry.Registries import net.minecraft.server.MinecraftServer diff --git a/extractor/src/main/kotlin/de/snowii/extractor/extractors/SyncedRegistries.kt b/extractor/src/main/kotlin/de/snowii/extractor/extractors/SyncedRegistries.kt new file mode 100644 index 000000000..7d34df3a2 --- /dev/null +++ b/extractor/src/main/kotlin/de/snowii/extractor/extractors/SyncedRegistries.kt @@ -0,0 +1,50 @@ +package de.snowii.extractor.extractors + +import com.google.gson.JsonElement +import com.google.gson.JsonObject +import com.mojang.serialization.Codec +import com.mojang.serialization.JsonOps +import de.snowii.extractor.Extractor +import net.minecraft.registry.* +import net.minecraft.server.MinecraftServer +import java.util.stream.Stream + + +class SyncedRegistries : Extractor.Extractor { + override fun fileName(): String { + return "synced_registries.json" + } + + override fun extract(server: MinecraftServer): JsonElement { + val registries: Stream> = RegistryLoader.SYNCED_REGISTRIES.stream() + val json = JsonObject() + registries.forEach { entry -> + json.add( + entry.key().value.toString(), + mapJson(entry, server.registryManager, server.combinedDynamicRegistries) + ) + } + return json + } + + private fun mapJson( + registryEntry: RegistryLoader.Entry, + registryManager: DynamicRegistryManager.Immutable, + combinedRegistries: CombinedDynamicRegistries + ): JsonObject { + val codec: Codec = registryEntry.elementCodec() + val registry: Registry = registryManager.getOrThrow(registryEntry.key()) + val json = JsonObject() + registry.streamEntries().forEach { entry -> + json.add( + entry.key.orElseThrow().value.toString(), + codec.encodeStart( + combinedRegistries.combinedRegistryManager.getOps(JsonOps.INSTANCE), + entry.value() + ).getOrThrow() + ) + } + return json + } + +} diff --git a/extractor/src/main/resources/fabric.mod.json b/extractor/src/main/resources/fabric.mod.json index d7f55167b..695e56e8a 100644 --- a/extractor/src/main/resources/fabric.mod.json +++ b/extractor/src/main/resources/fabric.mod.json @@ -1,22 +1,22 @@ { - "schemaVersion": 1, - "id": "extractor", - "version": "${version}", - "name": "pumpkin-extractor", - "description": "", - "authors": [], - "contact": {}, - "license": "MIT", - "environment": "*", - "entrypoints": { - "main": [ - "de.snowii.extractor.Extractor" - ] - }, - "depends": { - "fabricloader": ">=${loader_version}", - "fabric-language-kotlin": ">=${kotlin_loader_version}", - "fabric": "*", - "minecraft": "${minecraft_version}" - } + "schemaVersion": 1, + "id": "extractor", + "version": "${version}", + "name": "pumpkin-extractor", + "description": "", + "authors": [], + "contact": {}, + "license": "MIT", + "environment": "*", + "entrypoints": { + "main": [ + "de.snowii.extractor.Extractor" + ] + }, + "depends": { + "fabricloader": ">=${loader_version}", + "fabric-language-kotlin": ">=${kotlin_loader_version}", + "fabric": "*", + "minecraft": "${minecraft_version}" + } } diff --git a/pumpkin-core/src/text/color.rs b/pumpkin-core/src/text/color.rs index 94d83f5bf..5803bae57 100644 --- a/pumpkin-core/src/text/color.rs +++ b/pumpkin-core/src/text/color.rs @@ -1,8 +1,8 @@ use colored::{ColoredString, Colorize}; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Deserializer, Serialize}; /// Text color -#[derive(Default, Debug, Clone, Copy, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Copy, Serialize)] #[serde(untagged)] pub enum Color { /// The default color for the text will be used, which varies by context @@ -10,10 +10,33 @@ pub enum Color { /// is a shade of gray that isn't normally used on text). #[default] Reset, + /// RGB Color + Rgb(u32), /// One of the 16 named Minecraft colors Named(NamedColor), } +impl<'de> Deserialize<'de> for Color { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + + if s == "reset" { + Ok(Color::Reset) + } else if s.starts_with('#') { + let rgb = u32::from_str_radix(&s.replace("#", ""), 16) + .map_err(|_| serde::de::Error::custom("Invalid hex color"))?; + Ok(Color::Rgb(rgb)) + } else { + Ok(Color::Named(NamedColor::try_from(s.as_str()).map_err( + |_| serde::de::Error::custom("Invalid named color"), + )?)) + } + } +} + impl Color { pub fn console_color(&self, text: &str) -> ColoredString { match self { @@ -36,6 +59,7 @@ impl Color { NamedColor::Yellow => text.bright_yellow(), NamedColor::White => text.white(), }, + Color::Rgb(_) => todo!(), } } } @@ -61,3 +85,29 @@ pub enum NamedColor { Yellow, White, } + +impl TryFrom<&str> for NamedColor { + type Error = (); + + fn try_from(value: &str) -> Result { + match value { + "black" => Ok(NamedColor::Black), + "dark_blue" => Ok(NamedColor::DarkBlue), + "dark_green" => Ok(NamedColor::DarkGreen), + "dark_aqua" => Ok(NamedColor::DarkAqua), + "dark_red" => Ok(NamedColor::DarkRed), + "dark_purple" => Ok(NamedColor::DarkPurple), + "gold" => Ok(NamedColor::Gold), + "gray" => Ok(NamedColor::Gray), + "dark_gray" => Ok(NamedColor::DarkGray), + "blue" => Ok(NamedColor::Blue), + "green" => Ok(NamedColor::Green), + "aqua" => Ok(NamedColor::Aqua), + "red" => Ok(NamedColor::Red), + "light_purple" => Ok(NamedColor::LightPurple), + "yellow" => Ok(NamedColor::Yellow), + "white" => Ok(NamedColor::White), + _ => Err(()), + } + } +} diff --git a/pumpkin-core/src/text/style.rs b/pumpkin-core/src/text/style.rs index f24bc8bea..34eaac0e3 100644 --- a/pumpkin-core/src/text/style.rs +++ b/pumpkin-core/src/text/style.rs @@ -9,6 +9,7 @@ use super::{ #[derive(Clone, Debug, Serialize, Deserialize, Default)] pub struct Style<'a> { /// Changes the color to render the content + #[serde(default, skip_serializing_if = "Option::is_none")] pub color: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub bold: Option, diff --git a/pumpkin-macros/Cargo.toml b/pumpkin-macros/Cargo.toml index 92802437b..233af3bdd 100644 --- a/pumpkin-macros/Cargo.toml +++ b/pumpkin-macros/Cargo.toml @@ -8,9 +8,9 @@ proc-macro = true [dependencies] serde.workspace = true +serde_json.workspace = true itertools.workspace = true proc-macro2 = "1.0" quote = "1.0" syn = "2.0" -serde_json = "1.0.132" diff --git a/pumpkin-protocol/src/client/play/c_chunk_data.rs b/pumpkin-protocol/src/client/play/c_chunk_data.rs index 2d3633c05..96cc14d7a 100644 --- a/pumpkin-protocol/src/client/play/c_chunk_data.rs +++ b/pumpkin-protocol/src/client/play/c_chunk_data.rs @@ -98,7 +98,8 @@ impl<'a> ClientPacket for CChunkData<'a> { //// Biomes // TODO: make biomes work data_buf.put_u8(0); - data_buf.put_var_int(&VarInt(0)); + // This seems to be the biome + data_buf.put_var_int(&VarInt(10)); data_buf.put_var_int(&VarInt(0)); }); diff --git a/pumpkin-registry/Cargo.toml b/pumpkin-registry/Cargo.toml index 745eb4ffd..fe03ffb25 100644 --- a/pumpkin-registry/Cargo.toml +++ b/pumpkin-registry/Cargo.toml @@ -8,6 +8,7 @@ pumpkin-protocol = { path = "../pumpkin-protocol" } pumpkin-core = { path = "../pumpkin-core" } serde.workspace = true +serde_json.workspace = true # nbt fastnbt = { git = "https://github.com/owengage/fastnbt.git" } diff --git a/pumpkin-registry/src/banner_pattern.rs b/pumpkin-registry/src/banner_pattern.rs new file mode 100644 index 000000000..bac63fda2 --- /dev/null +++ b/pumpkin-registry/src/banner_pattern.rs @@ -0,0 +1,7 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BannerPattern { + asset_id: String, + translation_key: String, +} diff --git a/pumpkin-registry/src/biome.rs b/pumpkin-registry/src/biome.rs new file mode 100644 index 000000000..36066829e --- /dev/null +++ b/pumpkin-registry/src/biome.rs @@ -0,0 +1,71 @@ +use pumpkin_protocol::VarInt; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Biome { + has_precipitation: i8, + temperature: f32, + #[serde(skip_serializing_if = "Option::is_none")] + temperature_modifier: Option, + downfall: f32, + effects: BiomeEffects, +} +#[derive(Debug, Clone, Serialize, Deserialize)] +struct BiomeEffects { + fog_color: i32, + water_color: i32, + water_fog_color: i32, + sky_color: i32, + #[serde(skip_serializing_if = "Option::is_none")] + foliage_color: Option, + #[serde(skip_serializing_if = "Option::is_none")] + grass_color: Option, + #[serde(skip_serializing_if = "Option::is_none")] + grass_color_modifier: Option, + #[serde(skip_serializing_if = "Option::is_none")] + particle: Option, + #[serde(skip_serializing_if = "Option::is_none")] + ambient_sound: Option, + #[serde(skip_serializing_if = "Option::is_none")] + mood_sound: Option, + #[serde(skip_serializing_if = "Option::is_none")] + additions_sound: Option, + #[serde(skip_serializing_if = "Option::is_none")] + music: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct Particle { + options: ParticleOptions, + probability: f32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ParticleOptions { + #[serde(rename = "type")] + typee: String, + #[serde(skip_serializing_if = "Option::is_none")] + value: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct MoodSound { + block_search_extent: i32, + offset: f64, + sound: String, + tick_delay: i32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct AdditionsSound { + sound: String, + tick_chance: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct Music { + sound: String, + min_delay: i32, + max_delay: i32, + replace_current_music: i8, +} diff --git a/pumpkin-registry/src/biomes.rs b/pumpkin-registry/src/biomes.rs deleted file mode 100644 index fae78a9a6..000000000 --- a/pumpkin-registry/src/biomes.rs +++ /dev/null @@ -1,118 +0,0 @@ -use pumpkin_protocol::VarInt; -use serde::Serialize; - -#[derive(Debug, Clone, Serialize)] -pub struct BiomeCodec { - name: String, - id: i32, - element: Biome, -} - -impl Default for BiomeCodec { - fn default() -> Self { - Self { - name: "minecraft:plains".to_string(), - id: 0, - element: Biome::default(), - } - } -} - -#[derive(Debug, Clone, Serialize)] -pub struct Biome { - has_precipitation: i8, - temperature: f32, - #[serde(skip_serializing_if = "Option::is_none")] - temperature_modifier: Option, - downfall: f32, - effects: BiomeEffects, -} -#[derive(Debug, Clone, Serialize)] -struct BiomeEffects { - fog_color: i32, - water_color: i32, - water_fog_color: i32, - sky_color: i32, - #[serde(skip_serializing_if = "Option::is_none")] - foliage_color: Option, - #[serde(skip_serializing_if = "Option::is_none")] - grass_color: Option, - #[serde(skip_serializing_if = "Option::is_none")] - grass_color_modifier: Option, - #[serde(skip_serializing_if = "Option::is_none")] - particle: Option, - #[serde(skip_serializing_if = "Option::is_none")] - ambient_sound: Option, - #[serde(skip_serializing_if = "Option::is_none")] - mood_sound: Option, - #[serde(skip_serializing_if = "Option::is_none")] - additions_sound: Option, - #[serde(skip_serializing_if = "Option::is_none")] - music: Option, -} - -#[derive(Debug, Clone, Serialize)] -struct Particle { - options: ParticleOptions, - probability: f32, -} - -#[derive(Debug, Clone, Serialize)] -struct ParticleOptions { - typee: String, - #[serde(skip_serializing_if = "Option::is_none")] - value: Option, -} - -#[derive(Debug, Clone, Serialize)] -struct MoodSound { - block_search_extent: i32, - offset: f64, - sound: String, - tick_delay: i32, -} - -#[derive(Debug, Clone, Serialize)] -struct AdditionsSound { - sound: String, - tick_chance: f64, -} - -#[derive(Debug, Clone, Serialize)] -struct Music { - sound: String, - min_delay: i32, - max_delay: i32, - replace_current_music: i8, -} - -// 1.20.6 default https://gist.github.com/WinX64/ab8c7a8df797c273b32d3a3b66522906 -impl Default for Biome { - fn default() -> Self { - Self { - has_precipitation: 0, - temperature: 1.0, - temperature_modifier: None, - downfall: 0.0, - effects: BiomeEffects { - fog_color: 12638463, - water_color: 4159204, - water_fog_color: 329011, - sky_color: 7907327, - foliage_color: None, - grass_color: None, - grass_color_modifier: None, - particle: None, - ambient_sound: None, - mood_sound: Some(MoodSound { - block_search_extent: 8, - offset: 2.0, - sound: "minecraft:ambient.cave".into(), - tick_delay: 6000, - }), - additions_sound: None, - music: None, - }, - } - } -} diff --git a/pumpkin-registry/src/chat_type.rs b/pumpkin-registry/src/chat_type.rs index 647c89dd1..f72d8ef79 100644 --- a/pumpkin-registry/src/chat_type.rs +++ b/pumpkin-registry/src/chat_type.rs @@ -1,33 +1,16 @@ use pumpkin_core::text::style::Style; -use serde::Serialize; +use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct ChatType { chat: Decoration, narration: Decoration, } -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Decoration { translation_key: String, #[serde(default, skip_serializing_if = "Option::is_none")] style: Option>, parameters: Vec, } - -impl Default for ChatType { - fn default() -> Self { - Self { - chat: Decoration { - style: None, - parameters: vec!["sender".into(), "content".into()], - translation_key: "chat.type.text".into(), - }, - narration: Decoration { - style: None, - parameters: vec!["sender".into(), "content".into()], - translation_key: "chat.type.text.narrate".into(), - }, - } - } -} diff --git a/pumpkin-registry/src/damage_type.rs b/pumpkin-registry/src/damage_type.rs index 40fd0b17c..63138c337 100644 --- a/pumpkin-registry/src/damage_type.rs +++ b/pumpkin-registry/src/damage_type.rs @@ -1,88 +1,12 @@ -use fastnbt::SerOpts; -use pumpkin_protocol::client::config::RegistryEntry; -use serde::Serialize; +use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct DamageType { + exhaustion: f32, #[serde(skip_serializing_if = "Option::is_none")] death_message_type: Option, #[serde(skip_serializing_if = "Option::is_none")] effects: Option, - exhaustion: f32, message_id: String, scaling: String, } - -const NAMES: &[&str] = &[ - "arrow", - "bad_respawn_point", - "cactus", - "campfire", - "cramming", - "dragon_breath", - "drown", - "dry_out", - "ender_pearl", - "explosion", - "fall", - "falling_anvil", - "falling_block", - "falling_stalactite", - "fireball", - "fireworks", - "fly_into_wall", - "freeze", - "generic", - "generic_kill", - "hot_floor", - "in_fire", - "in_wall", - "indirect_magic", - "lava", - "lightning_bolt", - "mace_smash", - "magic", - "mob_attack", - "mob_attack_no_aggro", - "mob_projectile", - "on_fire", - "out_of_world", - "outside_border", - "player_attack", - "player_explosion", - "sonic_boom", - "spit", - "stalagmite", - "starve", - "sting", - "sweet_berry_bush", - "thorns", - "thrown", - "trident", - "unattributed_fireball", - "wind_charge", - "wither", - "wither_skull", -]; - -pub(super) fn entries() -> Vec> { - let items: Vec<_> = NAMES - .iter() - .map(|name| RegistryEntry { - entry_id: name, - data: fastnbt::to_bytes_with_opts( - &DamageType { - exhaustion: 0.1, - message_id: "inFire".into(), - scaling: "when_caused_by_living_non_player".into(), - death_message_type: None, - effects: None, - }, - SerOpts::network_nbt(), - ) - .unwrap(), - }) - .collect(); - - items -} diff --git a/pumpkin-registry/src/dimension.rs b/pumpkin-registry/src/dimension.rs new file mode 100644 index 000000000..a4a4326f1 --- /dev/null +++ b/pumpkin-registry/src/dimension.rs @@ -0,0 +1,56 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Dimension { + ambient_light: f32, + bed_works: u8, + coordinate_scale: f64, + effects: DimensionEffects, + #[serde(skip_serializing_if = "Option::is_none")] + fixed_time: Option, + has_ceiling: u8, + has_raids: u8, + has_skylight: u8, + height: i32, + infiniburn: String, + logical_height: i32, + min_y: i32, + monster_spawn_block_light_limit: i32, + monster_spawn_light_level: MonsterSpawnLightLevel, + natural: u8, + piglin_safe: u8, + respawn_anchor_works: u8, + ultrawarm: u8, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Default, Debug)] +pub enum DimensionEffects { + #[serde(rename = "minecraft:overworld")] + #[default] + Overworld, + #[serde(rename = "minecraft:the_nether")] + TheNether, + #[serde(rename = "minecraft:the_end")] + TheEnd, +} + +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +#[serde(untagged)] +pub enum MonsterSpawnLightLevel { + Int(i32), + Tagged(MonsterSpawnLightLevelTagged), +} + +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +pub struct MonsterSpawnLightLevelTagged { + min_inclusive: i32, + max_inclusive: i32, + #[serde(rename = "type")] + typee: String, +} + +impl From for MonsterSpawnLightLevel { + fn from(value: i32) -> Self { + Self::Int(value) + } +} diff --git a/pumpkin-registry/src/dimensions.rs b/pumpkin-registry/src/dimensions.rs deleted file mode 100644 index bfb4b648e..000000000 --- a/pumpkin-registry/src/dimensions.rs +++ /dev/null @@ -1,83 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Dimension { - ambient_light: f32, - bed_works: u8, - coordinate_scale: f64, - effects: DimensionEffects, - #[serde(skip_serializing_if = "Option::is_none")] - fixed_time: Option, - has_ceiling: u8, - has_raids: u8, - has_skylight: u8, - height: i32, - infiniburn: String, - logical_height: i32, - min_y: i32, - monster_spawn_block_light_limit: i32, - monster_spawn_light_level: MonsterSpawnLightLevel, - natural: u8, - piglin_safe: u8, - respawn_anchor_works: u8, - ultrawarm: u8, -} - -#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default, Debug)] -pub enum DimensionEffects { - #[serde(rename = "minecraft:overworld")] - #[default] - Overworld, - #[serde(rename = "minecraft:the_nether")] - TheNether, - #[serde(rename = "minecraft:the_end")] - TheEnd, -} - -impl Default for Dimension { - fn default() -> Self { - Self { - ambient_light: 0.0, - bed_works: 1, - coordinate_scale: 1.0, - effects: DimensionEffects::default(), - fixed_time: None, - has_ceiling: 0, - has_raids: 1, - has_skylight: 1, - height: 384, - infiniburn: "#minecraft:infiniburn_overworld".into(), - logical_height: 384, - min_y: -64, - monster_spawn_block_light_limit: 15, - monster_spawn_light_level: MonsterSpawnLightLevel::Int(7), - natural: 1, - piglin_safe: 0, - respawn_anchor_works: 0, - ultrawarm: 0, - } - } -} - -#[derive(Copy, Clone, PartialEq, Debug, Serialize, Deserialize)] -#[serde(untagged)] -pub enum MonsterSpawnLightLevel { - Int(i32), - Tagged(MonsterSpawnLightLevelTagged), -} - -#[derive(Copy, Clone, PartialEq, Debug, Serialize, Deserialize)] -#[serde(tag = "type", content = "value")] -pub enum MonsterSpawnLightLevelTagged { - #[serde(rename = "minecraft:uniform")] - Uniform { - min_inclusive: i32, - max_inclusive: i32, - }, -} - -impl From for MonsterSpawnLightLevel { - fn from(value: i32) -> Self { - Self::Int(value) - } -} diff --git a/pumpkin-registry/src/enchantment.rs b/pumpkin-registry/src/enchantment.rs new file mode 100644 index 000000000..459f7d81b --- /dev/null +++ b/pumpkin-registry/src/enchantment.rs @@ -0,0 +1,7 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Enchantment { + // TODO: Add things :D + // description: Text<'static>, +} diff --git a/pumpkin-registry/src/instrument.rs b/pumpkin-registry/src/instrument.rs new file mode 100644 index 000000000..55564bd90 --- /dev/null +++ b/pumpkin-registry/src/instrument.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Instrument { + sound_event: String, + use_duration: f32, + range: f32, + // description: TextComponent<'static>, +} diff --git a/pumpkin-registry/src/jukebox_song.rs b/pumpkin-registry/src/jukebox_song.rs new file mode 100644 index 000000000..44b01bc88 --- /dev/null +++ b/pumpkin-registry/src/jukebox_song.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct JukeboxSong { + sound_event: String, + // description: TextComponent<'static>, + length_in_seconds: f32, + comparator_output: u32, +} diff --git a/pumpkin-registry/src/lib.rs b/pumpkin-registry/src/lib.rs index ee9a3eeca..d2576bc13 100644 --- a/pumpkin-registry/src/lib.rs +++ b/pumpkin-registry/src/lib.rs @@ -1,86 +1,248 @@ -use biomes::Biome; +use std::{collections::HashMap, sync::LazyLock}; + +use banner_pattern::BannerPattern; +use biome::Biome; use chat_type::ChatType; -use dimensions::Dimension; +use damage_type::DamageType; +use dimension::Dimension; +use enchantment::Enchantment; use fastnbt::SerOpts; +use instrument::Instrument; +use jukebox_song::JukeboxSong; use paint::Painting; use pumpkin_protocol::client::config::RegistryEntry; +use serde::{Deserialize, Serialize}; +use trim_material::TrimMaterial; +use trim_pattern::TrimPattern; use wolf::WolfVariant; -mod biomes; +mod banner_pattern; +mod biome; mod chat_type; mod damage_type; -mod dimensions; +mod dimension; +mod enchantment; +mod instrument; +mod jukebox_song; mod paint; +mod trim_material; +mod trim_pattern; mod wolf; +pub static SYNCED_REGISTRIES: LazyLock = LazyLock::new(|| { + serde_json::from_str(include_str!("../../assets/synced_registries.json")) + .expect("Could not parse synced_registries.json registry.") +}); + pub struct Registry { pub registry_id: String, pub registry_entries: Vec>, } +#[derive(Serialize, Deserialize)] +pub struct SyncedRegistry { + #[serde(rename = "minecraft:worldgen/biome")] + biome: HashMap, + #[serde(rename = "minecraft:chat_type")] + chat_type: HashMap, + #[serde(rename = "minecraft:trim_pattern")] + trim_pattern: HashMap, + #[serde(rename = "minecraft:trim_material")] + trim_material: HashMap, + #[serde(rename = "minecraft:wolf_variant")] + wolf_variant: HashMap, + #[serde(rename = "minecraft:painting_variant")] + painting_variant: HashMap, + #[serde(rename = "minecraft:dimension_type")] + dimension_type: HashMap, + #[serde(rename = "minecraft:damage_type")] + damage_type: HashMap, + #[serde(rename = "minecraft:banner_pattern")] + banner_pattern: HashMap, + #[serde(rename = "minecraft:enchantment")] + enchantment: HashMap, + #[serde(rename = "minecraft:jukebox_song")] + jukebox_song: HashMap, + #[serde(rename = "minecraft:instrument")] + instrument: HashMap, +} + impl Registry { - /// We should parse this from a JSON in the future - pub fn get_static() -> Vec { - let dimensions = Registry { - registry_id: "minecraft:dimension_type".to_string(), - registry_entries: vec![RegistryEntry { - entry_id: "minecraft:overworld", - data: fastnbt::to_bytes_with_opts(&Dimension::default(), SerOpts::network_nbt()) - .unwrap(), - }], - }; - let biomes = Registry { + pub fn get_synced() -> Vec { + let registry_entries = SYNCED_REGISTRIES + .biome + .iter() + .map(|s| RegistryEntry { + entry_id: s.0, + data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + }) + .collect(); + let biome = Registry { registry_id: "minecraft:worldgen/biome".to_string(), - registry_entries: vec![ - RegistryEntry { - entry_id: "minecraft:plains", - data: fastnbt::to_bytes_with_opts(&Biome::default(), SerOpts::network_nbt()) - .unwrap(), - }, - RegistryEntry { - entry_id: "minecraft:snowy_taiga", - data: fastnbt::to_bytes_with_opts(&Biome::default(), SerOpts::network_nbt()) - .unwrap(), - }, - ], - }; - let wolf_variants = Registry { - registry_id: "minecraft:wolf_variant".to_string(), - registry_entries: vec![RegistryEntry { - entry_id: "minecraft:wolf_variant", - data: fastnbt::to_bytes_with_opts(&WolfVariant::default(), SerOpts::network_nbt()) - .unwrap(), - }], + registry_entries, }; - let chat_types = Registry { + let registry_entries = SYNCED_REGISTRIES + .chat_type + .iter() + .map(|s| RegistryEntry { + entry_id: s.0, + data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + }) + .collect(); + let chat_type = Registry { registry_id: "minecraft:chat_type".to_string(), - registry_entries: vec![RegistryEntry { - entry_id: "minecraft:chat", - data: fastnbt::to_bytes_with_opts(&ChatType::default(), SerOpts::network_nbt()) - .unwrap(), - }], + registry_entries, }; - let damage_types = Registry { - registry_id: "minecraft:damage_type".to_string(), - registry_entries: damage_type::entries(), + // let registry_entries = SYNCED_REGISTRIES + // .trim_pattern + // .iter() + // .map(|s| RegistryEntry { + // entry_id: s.0, + // data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + // }) + // .collect(); + // let trim_pattern = Registry { + // registry_id: "minecraft:trim_pattern".to_string(), + // registry_entries, + // }; + + // let registry_entries = SYNCED_REGISTRIES + // .trim_material + // .iter() + // .map(|s| RegistryEntry { + // entry_id: s.0, + // data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + // }) + // .collect(); + // let trim_material = Registry { + // registry_id: "minecraft:trim_material".to_string(), + // registry_entries, + // }; + + let registry_entries = SYNCED_REGISTRIES + .wolf_variant + .iter() + .map(|s| { + // I present to you, A ugly hack which is done because Mojang developers decited to put is_ instead of just on 3 wolf varients while all others have just the biome, this causes the client to not find the biome and disconnect + let varient = s.1.clone(); + RegistryEntry { + entry_id: s.0, + data: fastnbt::to_bytes_with_opts(&varient, SerOpts::network_nbt()).unwrap(), + } + }) + .collect(); + let wolf_variant = Registry { + registry_id: "minecraft:wolf_variant".to_string(), + registry_entries, }; - let paintings = Registry { + + let registry_entries = SYNCED_REGISTRIES + .painting_variant + .iter() + .map(|s| RegistryEntry { + entry_id: s.0, + data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + }) + .collect(); + let painting_variant = Registry { registry_id: "minecraft:painting_variant".to_string(), - registry_entries: vec![RegistryEntry { - entry_id: "minecraft:painting_variant", - data: fastnbt::to_bytes_with_opts(&Painting::default(), SerOpts::network_nbt()) - .unwrap(), - }], + registry_entries, }; + + let registry_entries = SYNCED_REGISTRIES + .dimension_type + .iter() + .map(|s| RegistryEntry { + entry_id: s.0, + data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + }) + .collect(); + let dimension_type = Registry { + registry_id: "minecraft:dimension_type".to_string(), + registry_entries, + }; + + let registry_entries = SYNCED_REGISTRIES + .damage_type + .iter() + .map(|s| RegistryEntry { + entry_id: s.0, + data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + }) + .collect(); + let damage_type = Registry { + registry_id: "minecraft:damage_type".to_string(), + registry_entries, + }; + + let registry_entries = SYNCED_REGISTRIES + .banner_pattern + .iter() + .map(|s| RegistryEntry { + entry_id: s.0, + data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + }) + .collect(); + let banner_pattern = Registry { + registry_id: "minecraft:banner_pattern".to_string(), + registry_entries, + }; + + // TODO + // let registry_entries = SYNCED_REGISTRIES + // .enchantment + // .iter() + // .map(|s| RegistryEntry { + // entry_id: s.0, + // data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + // }) + // .collect(); + // let enchantment = Registry { + // registry_id: "minecraft:enchantment".to_string(), + // registry_entries, + // }; + + // let registry_entries = SYNCED_REGISTRIES + // .jukebox_song + // .iter() + // .map(|s| RegistryEntry { + // entry_id: s.0, + // data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + // }) + // .collect(); + // let jukebox_song = Registry { + // registry_id: "minecraft:jukebox_song".to_string(), + // registry_entries, + // }; + + // let registry_entries = SYNCED_REGISTRIES + // .instrument + // .iter() + // .map(|s| RegistryEntry { + // entry_id: s.0, + // data: fastnbt::to_bytes_with_opts(&s.1, SerOpts::network_nbt()).unwrap(), + // }) + // .collect(); + // let instrument = Registry { + // registry_id: "minecraft:instrument".to_string(), + // registry_entries, + // }; + vec![ - dimensions, - damage_types, - biomes, - wolf_variants, - paintings, - chat_types, + biome, + chat_type, + // trim_pattern, + // trim_material, + wolf_variant, + painting_variant, + dimension_type, + damage_type, + banner_pattern, + // enchantment, + // jukebox_song, + // instrument, ] } } diff --git a/pumpkin-registry/src/paint.rs b/pumpkin-registry/src/paint.rs index 9b1bd7e48..9c383f6fe 100644 --- a/pumpkin-registry/src/paint.rs +++ b/pumpkin-registry/src/paint.rs @@ -3,16 +3,10 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Painting { asset_id: String, + // #[serde(skip_serializing_if = "Option::is_none")] + // title: Option>, + // #[serde(skip_serializing_if = "Option::is_none")] + // author: Option>, height: i32, width: i32, } - -impl Default for Painting { - fn default() -> Self { - Self { - asset_id: "minecraft:backyard".into(), - height: 2, - width: 2, - } - } -} diff --git a/pumpkin-registry/src/trim_material.rs b/pumpkin-registry/src/trim_material.rs new file mode 100644 index 000000000..0cbbe6fcf --- /dev/null +++ b/pumpkin-registry/src/trim_material.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TrimMaterial { + asset_name: String, + ingredient: String, + item_model_index: f32, + // description: TextComponent<'static>, +} diff --git a/pumpkin-registry/src/trim_pattern.rs b/pumpkin-registry/src/trim_pattern.rs new file mode 100644 index 000000000..4682476c5 --- /dev/null +++ b/pumpkin-registry/src/trim_pattern.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TrimPattern { + asset_id: String, + template_item: String, + // description: TextComponent<'static>, + decal: u8, +} diff --git a/pumpkin-registry/src/wolf.rs b/pumpkin-registry/src/wolf.rs index 85b0e9e3a..dfa43d6e4 100644 --- a/pumpkin-registry/src/wolf.rs +++ b/pumpkin-registry/src/wolf.rs @@ -5,16 +5,5 @@ pub struct WolfVariant { wild_texture: String, tame_texture: String, angry_texture: String, - biomes: String, -} - -impl Default for WolfVariant { - fn default() -> Self { - Self { - wild_texture: "minecraft:entity/wolf/wolf_ashen".to_string(), - tame_texture: "minecraft:entity/wolf/wolf_ashen_tame".to_string(), - angry_texture: "minecraft:entity/wolf/wolf_ashen_angry".to_string(), - biomes: "minecraft:snowy_taiga".to_string(), - } - } + pub biomes: String, } diff --git a/pumpkin-world/Cargo.toml b/pumpkin-world/Cargo.toml index db8beb01f..d3590bb74 100644 --- a/pumpkin-world/Cargo.toml +++ b/pumpkin-world/Cargo.toml @@ -13,6 +13,7 @@ derive_more.workspace = true itertools.workspace = true thiserror.workspace = true serde.workspace = true +serde_json.workspace = true log.workspace = true parking_lot.workspace = true @@ -25,7 +26,6 @@ dashmap = "6.1.0" flate2 = "1.0" lz4 = "1.28.0" -serde_json = "1.0" enum_dispatch = "0.3.13" derive-getters = "0.5.0" diff --git a/pumpkin/Cargo.toml b/pumpkin/Cargo.toml index 6eb689ef0..132574f60 100644 --- a/pumpkin/Cargo.toml +++ b/pumpkin/Cargo.toml @@ -29,7 +29,7 @@ parking_lot.workspace = true # config serde.workspace = true -serde_json = "1.0" +serde_json.workspace = true bytes = "1.8" diff --git a/pumpkin/src/server/mod.rs b/pumpkin/src/server/mod.rs index d2669066e..745502831 100644 --- a/pumpkin/src/server/mod.rs +++ b/pumpkin/src/server/mod.rs @@ -82,7 +82,7 @@ impl Server { "./world".parse().unwrap(), )); Self { - cached_registry: Registry::get_static(), + cached_registry: Registry::get_synced(), open_containers: RwLock::new(HashMap::new()), drag_handler: DragHandler::new(), // 0 is invalid