From 7ffccfed26fdd78e6d829090da0836a7c87c61c2 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Sun, 4 May 2025 03:15:22 +0300 Subject: [PATCH] created sniff-packets program sniffed update_tags and registry_data packets to .bin files --- .envrc | 17 + rust-toolchain.toml | 2 + shell.nix | 1 + sniff-packets/.gitignore | 1 + sniff-packets/Cargo.lock | 192 ++ sniff-packets/Cargo.toml | 11 + sniff-packets/src/main.rs | 179 ++ src/server/protocol/handler.rs | 5 + src/server/protocol/play.rs | 88 +- src/server/protocol/registry-data.bin | Bin 0 -> 8133 bytes src/server/protocol/registry_data.json | 2489 ------------------------ src/server/protocol/update-tags.bin | Bin 0 -> 27198 bytes 12 files changed, 457 insertions(+), 2528 deletions(-) create mode 100644 .envrc create mode 100644 rust-toolchain.toml create mode 100644 sniff-packets/.gitignore create mode 100644 sniff-packets/Cargo.lock create mode 100644 sniff-packets/Cargo.toml create mode 100644 sniff-packets/src/main.rs create mode 100644 src/server/protocol/registry-data.bin delete mode 100644 src/server/protocol/registry_data.json create mode 100644 src/server/protocol/update-tags.bin diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..412cbef --- /dev/null +++ b/.envrc @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# ^ make editor happy + +# +# Use https://direnv.net/ to automatically load the dev shell. +# + +if ! has nix_direnv_version || ! nix_direnv_version 3.0.4; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.4/direnvrc" "sha256-DzlYZ33mWF/Gs8DDeyjr8mnVmQGx7ASYqA5WlxwvBG4=" +fi + +watch_file nix/** +watch_file -- **/*.nix +# Adding files to git includes them in a flake +# But it is also a bit much reloading. +# watch_file .git/index .git/HEAD +use flake . --show-trace diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..292fe49 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "stable" diff --git a/shell.nix b/shell.nix index d4ddaeb..85640ef 100644 --- a/shell.nix +++ b/shell.nix @@ -6,6 +6,7 @@ mkShell { direnv rustc cargo + rustfmt python3 python3Packages.beautifulsoup4 python3Packages.requests diff --git a/sniff-packets/.gitignore b/sniff-packets/.gitignore new file mode 100644 index 0000000..9f97022 --- /dev/null +++ b/sniff-packets/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/sniff-packets/Cargo.lock b/sniff-packets/Cargo.lock new file mode 100644 index 0000000..17f1a38 --- /dev/null +++ b/sniff-packets/Cargo.lock @@ -0,0 +1,192 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "craftflow-nbt" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a2d5312462b00f8420ace884a696f243be136ada9f50bf5f3d9858ff0c8e8e" +dependencies = [ + "cesu8", + "serde", + "thiserror", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rust_mc_proto" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734168f5b9aef1991db4b11c0bcd71c0336b0a5ba98269f0df39b41b8463ac8c" +dependencies = [ + "flate2", + "uuid", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sniff-packets" +version = "0.1.0" +dependencies = [ + "craftflow-nbt", + "rust_mc_proto", + "serde", + "serde_json", + "uuid", +] + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" diff --git a/sniff-packets/Cargo.toml b/sniff-packets/Cargo.toml new file mode 100644 index 0000000..742bbbb --- /dev/null +++ b/sniff-packets/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "sniff-packets" +version = "0.1.0" +edition = "2024" + +[dependencies] +rust_mc_proto = "0.1.19" +serde = "1.0.219" +serde_json = "1.0.140" +craftflow-nbt = "2.1.0" +uuid = "1.16.0" \ No newline at end of file diff --git a/sniff-packets/src/main.rs b/sniff-packets/src/main.rs new file mode 100644 index 0000000..67f3194 --- /dev/null +++ b/sniff-packets/src/main.rs @@ -0,0 +1,179 @@ +use std::{fs, io::Read}; + +use craftflow_nbt::DynNBT; +use rust_mc_proto::{prelude::*, write_packet, MCConnTcp, Packet, ProtocolError}; +use uuid::Uuid; + + +pub trait ReadWriteNBT: DataReader + DataWriter { + fn read_nbt(&mut self) -> Result; + fn write_nbt(&mut self, val: &T) -> Result<(), ProtocolError>; +} + +impl ReadWriteNBT for Packet { + fn read_nbt(&mut self) -> Result { + let mut data = Vec::new(); + let pos = self.get_ref().position(); + self.get_mut() + .read_to_end(&mut data) + .map_err(|_| ProtocolError::StringParseError)?; + let (remaining, value) = + craftflow_nbt::from_slice(&data).map_err(|_| ProtocolError::StringParseError)?; + self.get_mut() + .set_position(pos + (data.len() - remaining.len()) as u64); + Ok(value) + } + + fn write_nbt(&mut self, val: &DynNBT) -> Result<(), ProtocolError> { + craftflow_nbt::to_writer(self.get_mut(), val).map_err(|_| ProtocolError::StringParseError)?; + Ok(()) + } +} + + +fn main() -> Result<(), ProtocolError> { + let mut conn = MCConnTcp::connect("localhost:25565").unwrap(); + + conn.write_packet(&Packet::build(0x00, |packet| { + packet.write_varint(770)?; + packet.write_string("localhost")?; + packet.write_unsigned_short(25565)?; + packet.write_varint(2) + })?)?; + + conn.write_packet(&Packet::build(0x00, |packet| { + packet.write_string("TheMixRay")?; + packet.write_uuid(&Uuid::default()) + })?)?; + + loop { + let mut packet = conn.read_packet()?; + + if packet.id() == 0x03 { + let threshold = packet.read_varint()?; + + if threshold >= 0 { + conn.set_compression(Some(threshold as usize)); + } + } else if packet.id() == 0x02 { + break; + } + } + + conn.write_packet(&Packet::empty(0x03))?; + + conn.write_packet(&Packet::build(0x02, |packet| { + packet.write_string("minecraft:brand")?; + packet.write_string("vanilla") + })?)?; + + conn.write_packet(&Packet::build(0x00, |packet| { + packet.write_string("en_us")?; + packet.write_signed_byte(12)?; + packet.write_varint(0)?; + packet.write_boolean(true)?; + packet.write_byte(127)?; + packet.write_varint(1)?; + packet.write_boolean(true)?; + packet.write_boolean(true)?; + packet.write_varint(0) + })?)?; + + let mut packet = conn.read_packet()?; // server brand + + let id = packet.read_string()?; + println!("message id: {}", id); + println!("message data: {}", String::from_utf8_lossy(&packet.get_bytes()[id.len()+1..])); + + let mut packet = conn.read_packet()?; // feature flags + + let flags_len = packet.read_varint()?; + + println!("got {} feature flags:", flags_len); + + for _ in 0..flags_len { + let flag = packet.read_string()?; + + println!("flag: {}", flag); + } + + let mut packet = conn.read_packet()?; // wait for known packs packet + + if packet.id() != 0x0E { + println!("got unexpected packet while looking for 0x0E: 0x{:02X}", packet.id()); + return Ok(()); + } + + let packs_len = packet.read_varint()?; + + println!("got {} known packs:", packs_len); + + for _ in 0..packs_len { + println!("{}:{} v{}", packet.read_string()?, packet.read_string()?, packet.read_string()?); + } + + packet.set_id(0x07); // make it serverbound + + conn.write_packet(&packet)?; + + let mut data = Vec::new(); + + loop { + let mut packet = conn.read_packet()?; + + if packet.id() != 0x07 { // update tags + let registries_len = packet.read_varint()?; + + println!("got update tags: {}", registries_len); + + for _ in 0..registries_len { + let registry = packet.read_string()?; + + println!("registry: {}", registry); + + let tags_len = packet.read_varint()?; + + for _ in 0..tags_len { + let tag_name = packet.read_string()?; + + println!("tag: {}", tag_name); + + let entries_len = packet.read_varint()?; + + for _ in 0..entries_len { + let entry = packet.read_varint()?; + + println!("entry: {}", entry); + } + } + } + + fs::write("update-tags.bin", packet.get_bytes()).unwrap(); + + break; + } + + println!("got registry: {}", packet.read_string()?); + + let entries_len = packet.read_varint()?; + + for _ in 0..entries_len { + let entry_id = packet.read_string()?; + let has_data = packet.read_boolean()?; + + if has_data { + let entry_data = packet.read_nbt()?; + + println!("entry: {}, data: {:?}", entry_id, entry_data); + } else { + println!("entry: {}, no data", entry_id); + } + } + + write_packet(&mut data, None, 0, &packet)?; + } + + fs::write("registry-data.bin", &data).unwrap(); + + Ok(()) +} diff --git a/src/server/protocol/handler.rs b/src/server/protocol/handler.rs index 84bf5e4..a724bb3 100644 --- a/src/server/protocol/handler.rs +++ b/src/server/protocol/handler.rs @@ -157,6 +157,11 @@ pub fn handle_connection( particle_status, }); + client.write_packet(&Packet::build(clientbound::configuration::PLUGIN_MESSAGE, |p| { + p.write_string("minecraft:brand")?; + p.write_string("rust_minecraft_server") + })?)?; + handle_configuration_state(client.clone())?; client.write_packet(&Packet::empty(clientbound::configuration::FINISH))?; diff --git a/src/server/protocol/play.rs b/src/server/protocol/play.rs index 4783434..e125d6b 100644 --- a/src/server/protocol/play.rs +++ b/src/server/protocol/play.rs @@ -1,64 +1,67 @@ -use std::{collections::HashMap, sync::Arc}; +use std::{io::Cursor, sync::Arc}; -use craftflow_nbt::DynNBT; -use log::debug; -use rust_mc_proto::{DataWriter, Packet}; -use serde_json::{json, Value}; +use rust_mc_proto::{read_packet, DataWriter, Packet}; use crate::server::{ - data::ReadWriteNBT, player::context::ClientContext, ServerError + player::context::ClientContext, ServerError }; -use super::id::{clientbound::{self, configuration::REGISTRY_DATA}, serverbound}; +use super::id::*; + +pub fn send_update_tags( + client: Arc, +) -> Result<(), ServerError> { + + // rewrite this hardcode bullshit + + client.write_packet(&Packet::from_bytes(clientbound::configuration::UPDATE_TAGS, include_bytes!("update-tags.bin")))?; + + Ok(()) +} pub fn send_registry_data( client: Arc, ) -> Result<(), ServerError> { - let registry_data = include_str!("registry_data.json"); - let registry_data: Value = serde_json::from_str(registry_data).unwrap(); - let registry_data = registry_data.as_object().unwrap(); - for (registry_name, registry_data) in registry_data { - let registry_data = registry_data.as_object().unwrap(); + // rewrite this hardcode bullshit - let mut packet = Packet::empty(clientbound::configuration::REGISTRY_DATA); - packet.write_string(registry_name)?; - - packet.write_usize_varint(registry_data.len())?; - - debug!("sending registry: {registry_name}"); - - for (key, value) in registry_data { - packet.write_string(key)?; - packet.write_boolean(true)?; - - let mut data = Vec::new(); - craftflow_nbt::to_writer(&mut data, value).unwrap(); - - debug!("- {key}"); - - packet.write_bytes(&data)?; - } - + let mut registry_data = Cursor::new(include_bytes!("registry-data.bin")); + + while let Ok(mut packet) = read_packet(&mut registry_data, None) { + packet.set_id(clientbound::configuration::REGISTRY_DATA); client.write_packet(&packet)?; } Ok(()) } +pub fn process_known_packs( + client: Arc +) -> Result<(), ServerError> { + let mut packet = Packet::empty(clientbound::configuration::KNOWN_PACKS); + packet.write_varint(1)?; + packet.write_string("minecraft")?; + packet.write_string("core")?; + packet.write_string("1.21.5")?; + client.write_packet(&packet)?; + + client.read_packet(serverbound::configuration::KNOWN_PACKS)?; + + Ok(()) +} + pub fn handle_configuration_state( client: Arc, // Контекст клиента ) -> Result<(), ServerError> { - let mut p = Packet::empty(clientbound::configuration::KNOWN_PACKS); - p.write_varint(1)?; - p.write_string("minecraft")?; - p.write_string("core")?; - p.write_string("1.21.5")?; - client.write_packet(&p)?; - client.read_packet(serverbound::configuration::KNOWN_PACKS)?; + let mut packet = Packet::empty(clientbound::configuration::FEATURE_FLAGS); + packet.write_varint(1)?; + packet.write_string("minecraft:vanilla")?; + client.write_packet(&packet)?; + process_known_packs(client.clone())?; send_registry_data(client.clone())?; + send_update_tags(client.clone())?; Ok(()) } @@ -100,7 +103,14 @@ pub fn handle_play_state( packet.write_boolean(false)?; // Enforces Secure Chat client.write_packet(&packet)?; - loop {} + loop {} + + // TODO: отдельный поток для чтения пакетов + + // TODO: переработка функции read_packet так чтобы когда + // делаешь read_any_packet, пакет отправлялся сначала всем другим + // функциям read_packet которые настроены на этот айди пакета, + // а потом если таковых не осталось пакет возвращался Ok(()) } diff --git a/src/server/protocol/registry-data.bin b/src/server/protocol/registry-data.bin new file mode 100644 index 0000000000000000000000000000000000000000..e466400f9d31d34a7e1f5b0a55ed32719194337b GIT binary patch literal 8133 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 literal 0 HcmV?d00001 diff --git a/src/server/protocol/registry_data.json b/src/server/protocol/registry_data.json deleted file mode 100644 index a4fc1cd..0000000 --- a/src/server/protocol/registry_data.json +++ /dev/null @@ -1,2489 +0,0 @@ -{ - "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:chat_type": { - "minecraft:chat": { - "chat": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.text" - }, - "narration": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.text.narrate" - } - }, - "minecraft:emote_command": { - "chat": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.emote" - }, - "narration": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.emote" - } - }, - "minecraft:msg_command_incoming": { - "chat": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "commands.message.display.incoming" - }, - "narration": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.text.narrate" - } - }, - "minecraft:msg_command_outgoing": { - "chat": { - "parameters": [ - "target", - "content" - ], - "translation_key": "commands.message.display.outgoing" - }, - "narration": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.text.narrate" - } - }, - "minecraft:say_command": { - "chat": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.announcement" - }, - "narration": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.text.narrate" - } - }, - "minecraft:team_msg_command_incoming": { - "chat": { - "parameters": [ - "target", - "sender", - "content" - ], - "translation_key": "chat.type.team.text" - }, - "narration": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.text.narrate" - } - }, - "minecraft:team_msg_command_outgoing": { - "chat": { - "parameters": [ - "target", - "sender", - "content" - ], - "translation_key": "chat.type.team.sent" - }, - "narration": { - "parameters": [ - "sender", - "content" - ], - "translation_key": "chat.type.text.narrate" - } - } - }, - "minecraft:damage_type": { - "minecraft:arrow": { - "exhaustion": 0.10000000149011612, - "message_id": "arrow", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:bad_respawn_point": { - "exhaustion": 0.10000000149011612, - "message_id": "badRespawnPoint", - "scaling": "always" - }, - "minecraft:cactus": { - "exhaustion": 0.10000000149011612, - "message_id": "cactus", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:campfire": { - "exhaustion": 0.10000000149011612, - "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, - "message_id": "drown", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:dry_out": { - "exhaustion": 0.10000000149011612, - "message_id": "dryout", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:explosion": { - "exhaustion": 0.10000000149011612, - "message_id": "explosion", - "scaling": "always" - }, - "minecraft:fall": { - "exhaustion": 0.0, - "message_id": "fall", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:falling_anvil": { - "exhaustion": 0.10000000149011612, - "message_id": "anvil", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:falling_block": { - "exhaustion": 0.10000000149011612, - "message_id": "fallingBlock", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:falling_stalactite": { - "exhaustion": 0.10000000149011612, - "message_id": "fallingStalactite", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:fireball": { - "exhaustion": 0.10000000149011612, - "message_id": "fireball", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:fireworks": { - "exhaustion": 0.10000000149011612, - "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, - "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.10000000149011612, - "message_id": "hotFloor", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:in_fire": { - "exhaustion": 0.10000000149011612, - "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.10000000149011612, - "message_id": "lava", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:lightning_bolt": { - "exhaustion": 0.10000000149011612, - "message_id": "lightningBolt", - "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.10000000149011612, - "message_id": "mob", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:mob_attack_no_aggro": { - "exhaustion": 0.10000000149011612, - "message_id": "mob", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:mob_projectile": { - "exhaustion": 0.10000000149011612, - "message_id": "mob", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:on_fire": { - "exhaustion": 0.0, - "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.10000000149011612, - "message_id": "player", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:player_explosion": { - "exhaustion": 0.10000000149011612, - "message_id": "explosion.player", - "scaling": "always" - }, - "minecraft:sonic_boom": { - "exhaustion": 0.0, - "message_id": "sonic_boom", - "scaling": "always" - }, - "minecraft:spit": { - "exhaustion": 0.10000000149011612, - "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.10000000149011612, - "message_id": "sting", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:sweet_berry_bush": { - "exhaustion": 0.10000000149011612, - "message_id": "sweetBerryBush", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:thorns": { - "exhaustion": 0.10000000149011612, - "message_id": "thorns", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:thrown": { - "exhaustion": 0.10000000149011612, - "message_id": "thrown", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:trident": { - "exhaustion": 0.10000000149011612, - "message_id": "trident", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:unattributed_fireball": { - "exhaustion": 0.10000000149011612, - "message_id": "onFire", - "scaling": "when_caused_by_living_non_player" - }, - "minecraft:wind_charge": { - "exhaustion": 0.10000000149011612, - "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.10000000149011612, - "message_id": "witherSkull", - "scaling": "when_caused_by_living_non_player" - } - }, - "minecraft:dimension_type": { - "minecraft:overworld": { - "ambient_light": 0.0, - "bed_works": 1, - "coordinate_scale": 1.0, - "effects": "minecraft:overworld", - "has_ceiling": 0, - "has_raids": 1, - "has_skylight": 1, - "height": 384, - "infiniburn": "#minecraft:infiniburn_overworld", - "logical_height": 384, - "min_y": -64, - "monster_spawn_block_light_limit": 0, - "monster_spawn_light_level": { - "max_inclusive": 7, - "min_inclusive": 0, - "type": "minecraft:uniform" - }, - "natural": 1, - "piglin_safe": 0, - "respawn_anchor_works": 0, - "ultrawarm": 0 - }, - "minecraft:overworld_caves": { - "ambient_light": 0.0, - "bed_works": 1, - "coordinate_scale": 1.0, - "effects": "minecraft:overworld", - "has_ceiling": 1, - "has_raids": 1, - "has_skylight": 1, - "height": 384, - "infiniburn": "#minecraft:infiniburn_overworld", - "logical_height": 384, - "min_y": -64, - "monster_spawn_block_light_limit": 0, - "monster_spawn_light_level": { - "max_inclusive": 7, - "min_inclusive": 0, - "type": "minecraft:uniform" - }, - "natural": 1, - "piglin_safe": 0, - "respawn_anchor_works": 0, - "ultrawarm": 0 - }, - "minecraft:the_end": { - "ambient_light": 0.0, - "bed_works": 0, - "coordinate_scale": 1.0, - "effects": "minecraft:the_end", - "has_ceiling": 0, - "has_raids": 1, - "has_skylight": 0, - "height": 256, - "infiniburn": "#minecraft:infiniburn_end", - "logical_height": 256, - "min_y": 0, - "monster_spawn_block_light_limit": 0, - "monster_spawn_light_level": { - "max_inclusive": 7, - "min_inclusive": 0, - "type": "minecraft:uniform" - }, - "natural": 0, - "piglin_safe": 0, - "respawn_anchor_works": 0, - "ultrawarm": 0 - }, - "minecraft:the_nether": { - "ambient_light": 0.10000000149011612, - "bed_works": 0, - "coordinate_scale": 8.0, - "effects": "minecraft:the_nether", - "has_ceiling": 1, - "has_raids": 0, - "has_skylight": 0, - "height": 256, - "infiniburn": "#minecraft:infiniburn_nether", - "logical_height": 128, - "min_y": 0, - "monster_spawn_block_light_limit": 15, - "monster_spawn_light_level": { - "max_inclusive": 7, - "min_inclusive": 7, - "type": "minecraft:uniform" - }, - "natural": 0, - "piglin_safe": 1, - "respawn_anchor_works": 1, - "ultrawarm": 1 - } - }, - "minecraft:painting_variant": { - "minecraft:alban": { - "asset_id": "minecraft:alban", - "height": 1, - "width": 1 - }, - "minecraft:aztec": { - "asset_id": "minecraft:aztec", - "height": 1, - "width": 1 - }, - "minecraft:aztec2": { - "asset_id": "minecraft:aztec2", - "height": 1, - "width": 1 - }, - "minecraft:backyard": { - "asset_id": "minecraft:backyard", - "height": 4, - "width": 3 - }, - "minecraft:baroque": { - "asset_id": "minecraft:baroque", - "height": 2, - "width": 2 - }, - "minecraft:bomb": { - "asset_id": "minecraft:bomb", - "height": 1, - "width": 1 - }, - "minecraft:bouquet": { - "asset_id": "minecraft:bouquet", - "height": 3, - "width": 3 - }, - "minecraft:burning_skull": { - "asset_id": "minecraft:burning_skull", - "height": 4, - "width": 4 - }, - "minecraft:bust": { - "asset_id": "minecraft:bust", - "height": 2, - "width": 2 - }, - "minecraft:cavebird": { - "asset_id": "minecraft:cavebird", - "height": 3, - "width": 3 - }, - "minecraft:changing": { - "asset_id": "minecraft:changing", - "height": 2, - "width": 4 - }, - "minecraft:cotan": { - "asset_id": "minecraft:cotan", - "height": 3, - "width": 3 - }, - "minecraft:courbet": { - "asset_id": "minecraft:courbet", - "height": 1, - "width": 2 - }, - "minecraft:creebet": { - "asset_id": "minecraft:creebet", - "height": 1, - "width": 2 - }, - "minecraft:donkey_kong": { - "asset_id": "minecraft:donkey_kong", - "height": 3, - "width": 4 - }, - "minecraft:earth": { - "asset_id": "minecraft:earth", - "height": 2, - "width": 2 - }, - "minecraft:endboss": { - "asset_id": "minecraft:endboss", - "height": 3, - "width": 3 - }, - "minecraft:fern": { - "asset_id": "minecraft:fern", - "height": 3, - "width": 3 - }, - "minecraft:fighters": { - "asset_id": "minecraft:fighters", - "height": 2, - "width": 4 - }, - "minecraft:finding": { - "asset_id": "minecraft:finding", - "height": 2, - "width": 4 - }, - "minecraft:fire": { - "asset_id": "minecraft:fire", - "height": 2, - "width": 2 - }, - "minecraft:graham": { - "asset_id": "minecraft:graham", - "height": 2, - "width": 1 - }, - "minecraft:humble": { - "asset_id": "minecraft:humble", - "height": 2, - "width": 2 - }, - "minecraft:kebab": { - "asset_id": "minecraft:kebab", - "height": 1, - "width": 1 - }, - "minecraft:lowmist": { - "asset_id": "minecraft:lowmist", - "height": 2, - "width": 4 - }, - "minecraft:match": { - "asset_id": "minecraft:match", - "height": 2, - "width": 2 - }, - "minecraft:meditative": { - "asset_id": "minecraft:meditative", - "height": 1, - "width": 1 - }, - "minecraft:orb": { - "asset_id": "minecraft:orb", - "height": 4, - "width": 4 - }, - "minecraft:owlemons": { - "asset_id": "minecraft:owlemons", - "height": 3, - "width": 3 - }, - "minecraft:passage": { - "asset_id": "minecraft:passage", - "height": 2, - "width": 4 - }, - "minecraft:pigscene": { - "asset_id": "minecraft:pigscene", - "height": 4, - "width": 4 - }, - "minecraft:plant": { - "asset_id": "minecraft:plant", - "height": 1, - "width": 1 - }, - "minecraft:pointer": { - "asset_id": "minecraft:pointer", - "height": 4, - "width": 4 - }, - "minecraft:pond": { - "asset_id": "minecraft:pond", - "height": 4, - "width": 3 - }, - "minecraft:pool": { - "asset_id": "minecraft:pool", - "height": 1, - "width": 2 - }, - "minecraft:prairie_ride": { - "asset_id": "minecraft:prairie_ride", - "height": 2, - "width": 1 - }, - "minecraft:sea": { - "asset_id": "minecraft:sea", - "height": 1, - "width": 2 - }, - "minecraft:skeleton": { - "asset_id": "minecraft:skeleton", - "height": 3, - "width": 4 - }, - "minecraft:skull_and_roses": { - "asset_id": "minecraft:skull_and_roses", - "height": 2, - "width": 2 - }, - "minecraft:stage": { - "asset_id": "minecraft:stage", - "height": 2, - "width": 2 - }, - "minecraft:sunflowers": { - "asset_id": "minecraft:sunflowers", - "height": 3, - "width": 3 - }, - "minecraft:sunset": { - "asset_id": "minecraft:sunset", - "height": 1, - "width": 2 - }, - "minecraft:tides": { - "asset_id": "minecraft:tides", - "height": 3, - "width": 3 - }, - "minecraft:unpacked": { - "asset_id": "minecraft:unpacked", - "height": 4, - "width": 4 - }, - "minecraft:void": { - "asset_id": "minecraft:void", - "height": 2, - "width": 2 - }, - "minecraft:wanderer": { - "asset_id": "minecraft:wanderer", - "height": 2, - "width": 1 - }, - "minecraft:wasteland": { - "asset_id": "minecraft:wasteland", - "height": 1, - "width": 1 - }, - "minecraft:water": { - "asset_id": "minecraft:water", - "height": 2, - "width": 2 - }, - "minecraft:wind": { - "asset_id": "minecraft:wind", - "height": 2, - "width": 2 - }, - "minecraft:wither": { - "asset_id": "minecraft:wither", - "height": 2, - "width": 2 - } - }, - "minecraft:trim_material": { - "minecraft:amethyst": { - "asset_name": "amethyst", - "description": { - "color": "#9A5CC6", - "translate": "trim_material.minecraft.amethyst" - }, - "ingredient": "minecraft:amethyst_shard", - "item_model_index": 1.0 - }, - "minecraft:copper": { - "asset_name": "copper", - "description": { - "color": "#B4684D", - "translate": "trim_material.minecraft.copper" - }, - "ingredient": "minecraft:copper_ingot", - "item_model_index": 0.5 - }, - "minecraft:diamond": { - "asset_name": "diamond", - "description": { - "color": "#6EECD2", - "translate": "trim_material.minecraft.diamond" - }, - "ingredient": "minecraft:diamond", - "item_model_index": 0.800000011920929 - }, - "minecraft:emerald": { - "asset_name": "emerald", - "description": { - "color": "#11A036", - "translate": "trim_material.minecraft.emerald" - }, - "ingredient": "minecraft:emerald", - "item_model_index": 0.699999988079071 - }, - "minecraft:gold": { - "asset_name": "gold", - "description": { - "color": "#DEB12D", - "translate": "trim_material.minecraft.gold" - }, - "ingredient": "minecraft:gold_ingot", - "item_model_index": 0.6000000238418579 - }, - "minecraft:iron": { - "asset_name": "iron", - "description": { - "color": "#ECECEC", - "translate": "trim_material.minecraft.iron" - }, - "ingredient": "minecraft:iron_ingot", - "item_model_index": 0.20000000298023224 - }, - "minecraft:lapis": { - "asset_name": "lapis", - "description": { - "color": "#416E97", - "translate": "trim_material.minecraft.lapis" - }, - "ingredient": "minecraft:lapis_lazuli", - "item_model_index": 0.8999999761581421 - }, - "minecraft:netherite": { - "asset_name": "netherite", - "description": { - "color": "#625859", - "translate": "trim_material.minecraft.netherite" - }, - "ingredient": "minecraft:netherite_ingot", - "item_model_index": 0.30000001192092896 - }, - "minecraft:quartz": { - "asset_name": "quartz", - "description": { - "color": "#E3D4C4", - "translate": "trim_material.minecraft.quartz" - }, - "ingredient": "minecraft:quartz", - "item_model_index": 0.10000000149011612 - }, - "minecraft:redstone": { - "asset_name": "redstone", - "description": { - "color": "#971607", - "translate": "trim_material.minecraft.redstone" - }, - "ingredient": "minecraft:redstone", - "item_model_index": 0.4000000059604645 - } - }, - "minecraft:trim_pattern": { - "minecraft:bolt": { - "asset_id": "minecraft:bolt", - "description": { - "translate": "trim_pattern.minecraft.bolt" - }, - "template_item": "minecraft:bolt_armor_trim_smithing_template" - }, - "minecraft:coast": { - "asset_id": "minecraft:coast", - "description": { - "translate": "trim_pattern.minecraft.coast" - }, - "template_item": "minecraft:coast_armor_trim_smithing_template" - }, - "minecraft:dune": { - "asset_id": "minecraft:dune", - "description": { - "translate": "trim_pattern.minecraft.dune" - }, - "template_item": "minecraft:dune_armor_trim_smithing_template" - }, - "minecraft:eye": { - "asset_id": "minecraft:eye", - "description": { - "translate": "trim_pattern.minecraft.eye" - }, - "template_item": "minecraft:eye_armor_trim_smithing_template" - }, - "minecraft:flow": { - "asset_id": "minecraft:flow", - "description": { - "translate": "trim_pattern.minecraft.flow" - }, - "template_item": "minecraft:flow_armor_trim_smithing_template" - }, - "minecraft:host": { - "asset_id": "minecraft:host", - "description": { - "translate": "trim_pattern.minecraft.host" - }, - "template_item": "minecraft:host_armor_trim_smithing_template" - }, - "minecraft:raiser": { - "asset_id": "minecraft:raiser", - "description": { - "translate": "trim_pattern.minecraft.raiser" - }, - "template_item": "minecraft:raiser_armor_trim_smithing_template" - }, - "minecraft:rib": { - "asset_id": "minecraft:rib", - "description": { - "translate": "trim_pattern.minecraft.rib" - }, - "template_item": "minecraft:rib_armor_trim_smithing_template" - }, - "minecraft:sentry": { - "asset_id": "minecraft:sentry", - "description": { - "translate": "trim_pattern.minecraft.sentry" - }, - "template_item": "minecraft:sentry_armor_trim_smithing_template" - }, - "minecraft:shaper": { - "asset_id": "minecraft:shaper", - "description": { - "translate": "trim_pattern.minecraft.shaper" - }, - "template_item": "minecraft:shaper_armor_trim_smithing_template" - }, - "minecraft:silence": { - "asset_id": "minecraft:silence", - "description": { - "translate": "trim_pattern.minecraft.silence" - }, - "template_item": "minecraft:silence_armor_trim_smithing_template" - }, - "minecraft:snout": { - "asset_id": "minecraft:snout", - "description": { - "translate": "trim_pattern.minecraft.snout" - }, - "template_item": "minecraft:snout_armor_trim_smithing_template" - }, - "minecraft:spire": { - "asset_id": "minecraft:spire", - "description": { - "translate": "trim_pattern.minecraft.spire" - }, - "template_item": "minecraft:spire_armor_trim_smithing_template" - }, - "minecraft:tide": { - "asset_id": "minecraft:tide", - "description": { - "translate": "trim_pattern.minecraft.tide" - }, - "template_item": "minecraft:tide_armor_trim_smithing_template" - }, - "minecraft:vex": { - "asset_id": "minecraft:vex", - "description": { - "translate": "trim_pattern.minecraft.vex" - }, - "template_item": "minecraft:vex_armor_trim_smithing_template" - }, - "minecraft:ward": { - "asset_id": "minecraft:ward", - "description": { - "translate": "trim_pattern.minecraft.ward" - }, - "template_item": "minecraft:ward_armor_trim_smithing_template" - }, - "minecraft:wayfinder": { - "asset_id": "minecraft:wayfinder", - "description": { - "translate": "trim_pattern.minecraft.wayfinder" - }, - "template_item": "minecraft:wayfinder_armor_trim_smithing_template" - }, - "minecraft:wild": { - "asset_id": "minecraft:wild", - "description": { - "translate": "trim_pattern.minecraft.wild" - }, - "template_item": "minecraft:wild_armor_trim_smithing_template" - } - }, - "minecraft:wolf_variant": { - "minecraft:ashen": { - "angry_texture": "minecraft:entity/wolf/wolf_ashen_angry", - "biomes": "minecraft:snowy_taiga", - "tame_texture": "minecraft:entity/wolf/wolf_ashen_tame", - "wild_texture": "minecraft:entity/wolf/wolf_ashen" - }, - "minecraft:black": { - "angry_texture": "minecraft:entity/wolf/wolf_black_angry", - "biomes": "minecraft:old_growth_pine_taiga", - "tame_texture": "minecraft:entity/wolf/wolf_black_tame", - "wild_texture": "minecraft:entity/wolf/wolf_black" - }, - "minecraft:chestnut": { - "angry_texture": "minecraft:entity/wolf/wolf_chestnut_angry", - "biomes": "minecraft:old_growth_spruce_taiga", - "tame_texture": "minecraft:entity/wolf/wolf_chestnut_tame", - "wild_texture": "minecraft:entity/wolf/wolf_chestnut" - }, - "minecraft:pale": { - "angry_texture": "minecraft:entity/wolf/wolf_angry", - "biomes": "minecraft:taiga", - "tame_texture": "minecraft:entity/wolf/wolf_tame", - "wild_texture": "minecraft:entity/wolf/wolf" - }, - "minecraft:rusty": { - "angry_texture": "minecraft:entity/wolf/wolf_rusty_angry", - "biomes": "#minecraft:is_jungle", - "tame_texture": "minecraft:entity/wolf/wolf_rusty_tame", - "wild_texture": "minecraft:entity/wolf/wolf_rusty" - }, - "minecraft:snowy": { - "angry_texture": "minecraft:entity/wolf/wolf_snowy_angry", - "biomes": "minecraft:grove", - "tame_texture": "minecraft:entity/wolf/wolf_snowy_tame", - "wild_texture": "minecraft:entity/wolf/wolf_snowy" - }, - "minecraft:spotted": { - "angry_texture": "minecraft:entity/wolf/wolf_spotted_angry", - "biomes": "#minecraft:is_savanna", - "tame_texture": "minecraft:entity/wolf/wolf_spotted_tame", - "wild_texture": "minecraft:entity/wolf/wolf_spotted" - }, - "minecraft:striped": { - "angry_texture": "minecraft:entity/wolf/wolf_striped_angry", - "biomes": "#minecraft:is_badlands", - "tame_texture": "minecraft:entity/wolf/wolf_striped_tame", - "wild_texture": "minecraft:entity/wolf/wolf_striped" - }, - "minecraft:woods": { - "angry_texture": "minecraft:entity/wolf/wolf_woods_angry", - "biomes": "minecraft:forest", - "tame_texture": "minecraft:entity/wolf/wolf_woods_tame", - "wild_texture": "minecraft:entity/wolf/wolf_woods" - } - }, - "minecraft:worldgen/biome": { - "minecraft:badlands": { - "downfall": 0.0, - "effects": { - "fog_color": 12638463, - "foliage_color": 10387789, - "grass_color": 9470285, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.badlands" - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:bamboo_jungle": { - "downfall": 0.8999999761581421, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.bamboo_jungle" - }, - "sky_color": 7842047, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.949999988079071 - }, - "minecraft:basalt_deltas": { - "downfall": 0.0, - "effects": { - "additions_sound": { - "sound": "minecraft:ambient.basalt_deltas.additions", - "tick_chance": 0.0111 - }, - "ambient_sound": "minecraft:ambient.basalt_deltas.loop", - "fog_color": 6840176, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.basalt_deltas.mood", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.nether.basalt_deltas" - }, - "particle": { - "options": { - "type": "minecraft:white_ash" - }, - "probability": 0.118093334 - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:beach": { - "downfall": 0.4000000059604645, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 7907327, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.800000011920929 - }, - "minecraft:birch_forest": { - "downfall": 0.6000000238418579, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.forest" - }, - "sky_color": 8037887, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.6000000238418579 - }, - "minecraft:cherry_grove": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "foliage_color": 11983713, - "grass_color": 11983713, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.cherry_grove" - }, - "sky_color": 8103167, - "water_color": 6141935, - "water_fog_color": 6141935 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:cold_ocean": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 4020182, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:crimson_forest": { - "downfall": 0.0, - "effects": { - "additions_sound": { - "sound": "minecraft:ambient.crimson_forest.additions", - "tick_chance": 0.0111 - }, - "ambient_sound": "minecraft:ambient.crimson_forest.loop", - "fog_color": 3343107, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.crimson_forest.mood", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.nether.crimson_forest" - }, - "particle": { - "options": { - "type": "minecraft:crimson_spore" - }, - "probability": 0.025 - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:dark_forest": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "grass_color_modifier": "dark_forest", - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.forest" - }, - "sky_color": 7972607, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.699999988079071 - }, - "minecraft:deep_cold_ocean": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 4020182, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:deep_dark": { - "downfall": 0.4000000059604645, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.deep_dark" - }, - "sky_color": 7907327, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.800000011920929 - }, - "minecraft:deep_frozen_ocean": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 3750089, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:deep_lukewarm_ocean": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 4566514, - "water_fog_color": 267827 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:deep_ocean": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:desert": { - "downfall": 0.0, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.desert" - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:dripstone_caves": { - "downfall": 0.4000000059604645, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.dripstone_caves" - }, - "sky_color": 7907327, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.800000011920929 - }, - "minecraft:end_barrens": { - "downfall": 0.5, - "effects": { - "fog_color": 10518688, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 0, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 0.5 - }, - "minecraft:end_highlands": { - "downfall": 0.5, - "effects": { - "fog_color": 10518688, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 0, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 0.5 - }, - "minecraft:end_midlands": { - "downfall": 0.5, - "effects": { - "fog_color": 10518688, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 0, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 0.5 - }, - "minecraft:eroded_badlands": { - "downfall": 0.0, - "effects": { - "fog_color": 12638463, - "foliage_color": 10387789, - "grass_color": 9470285, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.badlands" - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:flower_forest": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.flower_forest" - }, - "sky_color": 7972607, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.699999988079071 - }, - "minecraft:forest": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.forest" - }, - "sky_color": 7972607, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.699999988079071 - }, - "minecraft:frozen_ocean": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8364543, - "water_color": 3750089, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.0 - }, - "minecraft:frozen_peaks": { - "downfall": 0.8999999761581421, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.frozen_peaks" - }, - "sky_color": 8756735, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": -0.699999988079071 - }, - "minecraft:frozen_river": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8364543, - "water_color": 3750089, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.0 - }, - "minecraft:grove": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.grove" - }, - "sky_color": 8495359, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": -0.20000000298023224 - }, - "minecraft:ice_spikes": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8364543, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.0 - }, - "minecraft:jagged_peaks": { - "downfall": 0.8999999761581421, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.jagged_peaks" - }, - "sky_color": 8756735, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": -0.699999988079071 - }, - "minecraft:jungle": { - "downfall": 0.8999999761581421, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.jungle" - }, - "sky_color": 7842047, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.949999988079071 - }, - "minecraft:lukewarm_ocean": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 4566514, - "water_fog_color": 267827 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:lush_caves": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.lush_caves" - }, - "sky_color": 8103167, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:mangrove_swamp": { - "downfall": 0.8999999761581421, - "effects": { - "fog_color": 12638463, - "foliage_color": 9285927, - "grass_color_modifier": "swamp", - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.swamp" - }, - "sky_color": 7907327, - "water_color": 3832426, - "water_fog_color": 5077600 - }, - "has_precipitation": true, - "temperature": 0.800000011920929 - }, - "minecraft:meadow": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.meadow" - }, - "sky_color": 8103167, - "water_color": 937679, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:mushroom_fields": { - "downfall": 1.0, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 7842047, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.8999999761581421 - }, - "minecraft:nether_wastes": { - "downfall": 0.0, - "effects": { - "additions_sound": { - "sound": "minecraft:ambient.nether_wastes.additions", - "tick_chance": 0.0111 - }, - "ambient_sound": "minecraft:ambient.nether_wastes.loop", - "fog_color": 3344392, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.nether_wastes.mood", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.nether.nether_wastes" - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:ocean": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:old_growth_birch_forest": { - "downfall": 0.6000000238418579, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.forest" - }, - "sky_color": 8037887, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.6000000238418579 - }, - "minecraft:old_growth_pine_taiga": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.old_growth_taiga" - }, - "sky_color": 8168447, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.30000001192092896 - }, - "minecraft:old_growth_spruce_taiga": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.old_growth_taiga" - }, - "sky_color": 8233983, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.25 - }, - "minecraft:plains": { - "downfall": 0.4000000059604645, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 7907327, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.800000011920929 - }, - "minecraft:river": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:savanna": { - "downfall": 0.0, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:savanna_plateau": { - "downfall": 0.0, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:small_end_islands": { - "downfall": 0.5, - "effects": { - "fog_color": 10518688, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 0, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 0.5 - }, - "minecraft:snowy_beach": { - "downfall": 0.30000001192092896, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8364543, - "water_color": 4020182, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.05000000074505806 - }, - "minecraft:snowy_plains": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8364543, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.0 - }, - "minecraft:snowy_slopes": { - "downfall": 0.8999999761581421, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.snowy_slopes" - }, - "sky_color": 8560639, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": -0.30000001192092896 - }, - "minecraft:snowy_taiga": { - "downfall": 0.4000000059604645, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8625919, - "water_color": 4020182, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": -0.5 - }, - "minecraft:soul_sand_valley": { - "downfall": 0.0, - "effects": { - "additions_sound": { - "sound": "minecraft:ambient.soul_sand_valley.additions", - "tick_chance": 0.0111 - }, - "ambient_sound": "minecraft:ambient.soul_sand_valley.loop", - "fog_color": 1787717, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.soul_sand_valley.mood", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.nether.soul_sand_valley" - }, - "particle": { - "options": { - "type": "minecraft:ash" - }, - "probability": 0.00625 - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:sparse_jungle": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.sparse_jungle" - }, - "sky_color": 7842047, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.949999988079071 - }, - "minecraft:stony_peaks": { - "downfall": 0.30000001192092896, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.stony_peaks" - }, - "sky_color": 7776511, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 1.0 - }, - "minecraft:stony_shore": { - "downfall": 0.30000001192092896, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8233727, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.20000000298023224 - }, - "minecraft:sunflower_plains": { - "downfall": 0.4000000059604645, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 7907327, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.800000011920929 - }, - "minecraft:swamp": { - "downfall": 0.8999999761581421, - "effects": { - "fog_color": 12638463, - "foliage_color": 6975545, - "grass_color_modifier": "swamp", - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.swamp" - }, - "sky_color": 7907327, - "water_color": 6388580, - "water_fog_color": 2302743 - }, - "has_precipitation": true, - "temperature": 0.800000011920929 - }, - "minecraft:taiga": { - "downfall": 0.800000011920929, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8233983, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.25 - }, - "minecraft:the_end": { - "downfall": 0.5, - "effects": { - "fog_color": 10518688, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 0, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 0.5 - }, - "minecraft:the_void": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 0.5 - }, - "minecraft:warm_ocean": { - "downfall": 0.5, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8103167, - "water_color": 4445678, - "water_fog_color": 270131 - }, - "has_precipitation": true, - "temperature": 0.5 - }, - "minecraft:warped_forest": { - "downfall": 0.0, - "effects": { - "additions_sound": { - "sound": "minecraft:ambient.warped_forest.additions", - "tick_chance": 0.0111 - }, - "ambient_sound": "minecraft:ambient.warped_forest.loop", - "fog_color": 1705242, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.warped_forest.mood", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.nether.warped_forest" - }, - "particle": { - "options": { - "type": "minecraft:warped_spore" - }, - "probability": 0.01428 - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:windswept_forest": { - "downfall": 0.30000001192092896, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8233727, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.20000000298023224 - }, - "minecraft:windswept_gravelly_hills": { - "downfall": 0.30000001192092896, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8233727, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.20000000298023224 - }, - "minecraft:windswept_hills": { - "downfall": 0.30000001192092896, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 8233727, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": true, - "temperature": 0.20000000298023224 - }, - "minecraft:windswept_savanna": { - "downfall": 0.0, - "effects": { - "fog_color": 12638463, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - }, - "minecraft:wooded_badlands": { - "downfall": 0.0, - "effects": { - "fog_color": 12638463, - "foliage_color": 10387789, - "grass_color": 9470285, - "mood_sound": { - "block_search_extent": 8, - "offset": 2.0, - "sound": "minecraft:ambient.cave", - "tick_delay": 6000 - }, - "music": { - "max_delay": 24000, - "min_delay": 12000, - "replace_current_music": false, - "sound": "minecraft:music.overworld.badlands" - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "has_precipitation": false, - "temperature": 2.0 - } - } -} \ No newline at end of file diff --git a/src/server/protocol/update-tags.bin b/src/server/protocol/update-tags.bin new file mode 100644 index 0000000000000000000000000000000000000000..1674b67b7099e401a64c525acff3ecf8dc782508 GIT binary patch literal 27198 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 literal 0 HcmV?d00001