From 1d80f531b74bc3b31023753acb81b35efcdadd73 Mon Sep 17 00:00:00 2001 From: mat <27899617+mat-1@users.noreply.github.com> Date: Tue, 23 Apr 2024 10:34:50 -0500 Subject: [PATCH] 1.20.5 (#127) * 23w51b * make recalculate_near_end_of_path public so other plugins can do .after(recalculate_near_end_of_path) * update to 24w03a i think * start implementing 24w13a * registries work (but a lot of packets are still broken) * fix recipes and commands packets * i love codecs :D i am not going insane :D mojang's java is very readable :D * item components are "implemented" meowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeow * update to 1.20.5-pre3 * fix all the broken packets and clippy (mojang please don't do an update like this again or i will murder someone) * 1.20.5-rc1 * fix failing tests * 1.20.5 --- Cargo.lock | 6 +- README.md | 2 +- azalea-block/src/generated.rs | 20 +- azalea-buf/azalea-buf-macros/src/read.rs | 38 +- azalea-buf/azalea-buf-macros/src/write.rs | 36 +- azalea-buf/src/read.rs | 20 +- azalea-buf/src/write.rs | 9 + azalea-client/Cargo.toml | 5 +- azalea-client/src/client.rs | 17 +- azalea-client/src/interact.rs | 13 +- azalea-client/src/inventory.rs | 18 +- .../src/packet_handling/configuration.rs | 55 +- azalea-client/src/packet_handling/game.rs | 43 +- azalea-core/Cargo.toml | 1 - azalea-core/src/lib.rs | 2 +- azalea-core/src/position.rs | 4 +- azalea-core/src/registry_holder.rs | 89 +- azalea-core/src/resource_location.rs | 9 +- azalea-crypto/src/lib.rs | 10 +- azalea-entity/src/data.rs | 16 +- azalea-entity/src/lib.rs | 1 + azalea-entity/src/metadata.rs | 1898 ++++--- .../src/particle.rs | 72 +- azalea-inventory/Cargo.toml | 3 + azalea-inventory/README.md | 2 - .../src/parse_macro.rs | 2 +- azalea-inventory/src/components.rs | 656 +++ azalea-inventory/src/item/mod.rs | 4 +- azalea-inventory/src/lib.rs | 4 +- azalea-inventory/src/operations.rs | 10 +- azalea-inventory/src/slot.rs | 172 +- azalea-language/src/en_us.json | 280 +- azalea-physics/Cargo.toml | 4 +- azalea-protocol/Cargo.toml | 5 +- .../azalea-protocol-macros/src/lib.rs | 3 +- azalea-protocol/src/connect.rs | 9 +- azalea-protocol/src/packets/common.rs | 2 +- .../clientbound_cookie_request_packet.rs | 8 + .../clientbound_registry_data_packet.rs | 8 +- .../clientbound_reset_chat_packet.rs | 5 + .../clientbound_select_known_packs_packet.rs | 9 + .../clientbound_store_cookie_packet.rs | 9 + .../clientbound_transfer_packet.rs | 9 + .../src/packets/configuration/mod.rs | 45 +- .../serverbound_cookie_response_packet.rs | 9 + .../serverbound_select_known_packs_packet.rs | 14 + .../game/clientbound_add_entity_packet.rs | 15 - .../game/clientbound_commands_packet.rs | 4 + .../game/clientbound_cookie_request_packet.rs | 8 + .../game/clientbound_debug_sample_packet.rs | 10 + .../clientbound_level_particles_packet.rs | 60 +- .../packets/game/clientbound_login_packet.rs | 1 + .../game/clientbound_server_data_packet.rs | 1 - .../game/clientbound_set_equipment_packet.rs | 2 +- .../game/clientbound_sound_entity_packet.rs | 18 +- .../packets/game/clientbound_sound_packet.rs | 10 +- .../game/clientbound_store_cookie_packet.rs | 9 + .../game/clientbound_transfer_packet.rs | 9 + .../clientbound_update_attributes_packet.rs | 6 +- .../clientbound_update_mob_effect_packet.rs | 8 +- .../game/clientbound_update_recipes_packet.rs | 169 +- azalea-protocol/src/packets/game/mod.rs | 310 +- ...rverbound_block_entity_tag_query_packet.rs | 10 + .../serverbound_chat_command_signed_packet.rs | 19 + .../serverbound_cookie_response_packet.rs | 9 + .../serverbound_debug_sample_subscription.rs | 12 + .../serverbound_entity_tag_query_packet.rs | 10 + .../clientbound_cookie_request_packet.rs | 8 + .../login/clientbound_game_profile_packet.rs | 1 + .../packets/login/clientbound_hello_packet.rs | 3 +- azalea-protocol/src/packets/login/mod.rs | 4 + .../serverbound_cookie_response_packet.rs | 9 + azalea-protocol/src/packets/mod.rs | 2 +- azalea-registry/src/extra.rs | 74 + azalea-registry/src/lib.rs | 385 +- azalea-registry/src/tags/blocks.rs | 4434 +++++++++-------- azalea-registry/src/tags/fluids.rs | 4 +- azalea-registry/src/tags/items.rs | 2716 ++++++---- azalea-world/Cargo.toml | 1 - azalea/Cargo.toml | 4 +- azalea/src/auto_tool.rs | 8 +- codegen/README.md | 2 +- codegen/genblocks.py | 5 +- codegen/lib/code/blocks.py | 8 +- codegen/lib/code/entity.py | 28 +- codegen/lib/download.py | 2 +- codegen/lib/extract.py | 17 + codegen/migrate.py | 138 +- 88 files changed, 7401 insertions(+), 4808 deletions(-) rename {azalea-core => azalea-entity}/src/particle.rs (89%) delete mode 100644 azalea-inventory/README.md create mode 100644 azalea-inventory/src/components.rs create mode 100644 azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs create mode 100644 azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs create mode 100644 azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs create mode 100644 azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs create mode 100644 azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs create mode 100644 azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs create mode 100644 azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs create mode 100755 azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs create mode 100755 azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs create mode 100644 azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs create mode 100644 azalea-protocol/src/packets/game/clientbound_transfer_packet.rs create mode 100644 azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs create mode 100755 azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs create mode 100644 azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs create mode 100755 azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs create mode 100644 azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs create mode 100755 azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs create mode 100755 azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs create mode 100644 azalea-registry/src/extra.rs diff --git a/Cargo.lock b/Cargo.lock index 8c184a6a..a4946ce4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -347,7 +347,6 @@ dependencies = [ "serde", "serde_json", "simdnbt", - "socks5-impl", "thiserror", "tokio", "tracing", @@ -359,7 +358,6 @@ name = "azalea-core" version = "0.9.1" dependencies = [ "azalea-buf", - "azalea-inventory", "azalea-registry", "bevy_ecs", "nohash-hasher", @@ -416,9 +414,12 @@ name = "azalea-inventory" version = "0.9.1" dependencies = [ "azalea-buf", + "azalea-chat", + "azalea-core", "azalea-inventory-macros", "azalea-registry", "simdnbt", + "uuid", ] [[package]] @@ -536,7 +537,6 @@ dependencies = [ "azalea-buf", "azalea-client", "azalea-core", - "azalea-inventory", "azalea-registry", "bevy_ecs", "criterion", diff --git a/README.md b/README.md index 70fa2b18..3e539a93 100755 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ A collection of Rust crates for making Minecraft bots, clients, and tools. -_Currently supported Minecraft version: `1.20.4`._ +_Currently supported Minecraft version: `1.20.5`._ > [!WARNING] > Azalea is still very unfinished, though most crates are in a somewhat useable state diff --git a/azalea-block/src/generated.rs b/azalea-block/src/generated.rs index 5267c9a1..0ce5ad62 100755 --- a/azalea-block/src/generated.rs +++ b/azalea-block/src/generated.rs @@ -1917,7 +1917,8 @@ make_block_states! { }, "cracked" => Cracked(bool), "crafting" => Crafting(bool), - "trial_spawner_state" => State { + "ominous" => Ominous(bool), + "trial_spawner_state" => TrialSpawnerState { Inactive, WaitingForPlayers, Active, @@ -1925,6 +1926,12 @@ make_block_states! { EjectingReward, Cooldown, }, + "vault_state" => VaultState { + Inactive, + Active, + Unlocking, + Ejecting, + }, }, Blocks => { air => BlockBehavior::new(), {}, @@ -5376,7 +5383,16 @@ make_block_states! { triggered: Triggered(false), }, trial_spawner => BlockBehavior::new().requires_correct_tool_for_drops().strength(50.0, 50.0), { - trial_spawner_state: State::Inactive, + ominous: Ominous(false), + trial_spawner_state: TrialSpawnerState::Inactive, + }, + vault => BlockBehavior::new(), { + facing: FacingCardinal::North, + ominous: Ominous(false), + vault_state: VaultState::Inactive, + }, + heavy_core => BlockBehavior::new(), { + waterlogged: Waterlogged(false), }, } } diff --git a/azalea-buf/azalea-buf-macros/src/read.rs b/azalea-buf/azalea-buf-macros/src/read.rs index c3e9595c..c5c484e7 100644 --- a/azalea-buf/azalea-buf-macros/src/read.rs +++ b/azalea-buf/azalea-buf-macros/src/read.rs @@ -38,24 +38,34 @@ fn read_named_fields( pub fn create_impl_mcbufreadable(ident: &Ident, data: &Data) -> proc_macro2::TokenStream { match data { - syn::Data::Struct(syn::DataStruct { fields, .. }) => { - let syn::Fields::Named(FieldsNamed { named, .. }) = fields else { - panic!("#[derive(McBuf)] can only be used on structs with named fields") - }; + syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields { + syn::Fields::Named(FieldsNamed { named, .. }) => { + let (read_fields, read_field_names) = read_named_fields(named); - let (read_fields, read_field_names) = read_named_fields(named); - - quote! { - impl azalea_buf::McBufReadable for #ident { - fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result { - #(#read_fields)* - Ok(#ident { - #(#read_field_names: #read_field_names),* - }) + quote! { + impl azalea_buf::McBufReadable for #ident { + fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result { + #(#read_fields)* + Ok(Self { + #(#read_field_names: #read_field_names),* + }) + } + } } } + syn::Fields::Unit => { + quote! { + impl azalea_buf::McBufReadable for #ident { + fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result { + Ok(Self) + } + } + } } - } + _ => { + panic!("#[derive(McBuf)] can only be used on structs with named fields") + } + }, syn::Data::Enum(syn::DataEnum { variants, .. }) => { let mut match_contents = quote!(); let mut variant_discrim: u32 = 0; diff --git a/azalea-buf/azalea-buf-macros/src/write.rs b/azalea-buf/azalea-buf-macros/src/write.rs index 35c2d49a..4d31f39e 100644 --- a/azalea-buf/azalea-buf-macros/src/write.rs +++ b/azalea-buf/azalea-buf-macros/src/write.rs @@ -39,23 +39,33 @@ fn write_named_fields( pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::TokenStream { match data { - syn::Data::Struct(syn::DataStruct { fields, .. }) => { - let syn::Fields::Named(FieldsNamed { named, .. }) = fields else { - panic!("#[derive(McBuf)] can only be used on structs with named fields") - }; + syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields { + syn::Fields::Named(FieldsNamed { named, .. }) => { + let write_fields = + write_named_fields(named, Some(&Ident::new("self", Span::call_site()))); - let write_fields = - write_named_fields(named, Some(&Ident::new("self", Span::call_site()))); - - quote! { - impl azalea_buf::McBufWritable for #ident { - fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { - #write_fields - Ok(()) + quote! { + impl azalea_buf::McBufWritable for #ident { + fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { + #write_fields + Ok(()) + } } } } - } + syn::Fields::Unit => { + quote! { + impl azalea_buf::McBufWritable for #ident { + fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { + Ok(()) + } + } + } + } + _ => { + panic!("#[derive(McBuf)] can only be used on structs with named fields") + } + }, syn::Data::Enum(syn::DataEnum { variants, .. }) => { // remember whether it's a data variant so we can do an optimization later let mut is_data_enum = false; diff --git a/azalea-buf/src/read.rs b/azalea-buf/src/read.rs index d5c4d0a8..b3352a80 100755 --- a/azalea-buf/src/read.rs +++ b/azalea-buf/src/read.rs @@ -103,17 +103,6 @@ fn read_utf_with_len(buf: &mut Cursor<&[u8]>, max_length: u32) -> Result Result { let mut buffer = [0]; let mut ans = 0; for i -// in 0..5 { reader.read_exact(&mut buffer).await?; ans |= ((buffer[0] & -// 0b0111_1111) as i32) << (7 * i); if buffer[0] & 0b1000_0000 == 0 { break; } -// } Ok(ans) -// } - pub trait McBufReadable where Self: Sized, @@ -373,3 +362,12 @@ impl McBufReadable for simdnbt::owned::Nbt { Ok(simdnbt::owned::Nbt::read_unnamed(buf)?) } } + +impl McBufReadable for Box +where + T: McBufReadable, +{ + fn read_from(buf: &mut Cursor<&[u8]>) -> Result { + Ok(Box::new(T::read_from(buf)?)) + } +} diff --git a/azalea-buf/src/write.rs b/azalea-buf/src/write.rs index 7b1fb331..61dedfd8 100755 --- a/azalea-buf/src/write.rs +++ b/azalea-buf/src/write.rs @@ -281,3 +281,12 @@ impl McBufWritable for simdnbt::owned::Nbt { buf.write_all(&data) } } + +impl McBufWritable for Box +where + T: McBufWritable, +{ + fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { + T::write_into(&**self, buf) + } +} diff --git a/azalea-client/Cargo.toml b/azalea-client/Cargo.toml index 09d7b598..2b6d62c5 100644 --- a/azalea-client/Cargo.toml +++ b/azalea-client/Cargo.toml @@ -28,7 +28,6 @@ bevy_ecs = "0.13.2" bevy_log = { version = "0.13.2", optional = true } bevy_tasks = "0.13.2" bevy_time = "0.13.2" -azalea-inventory = { path = "../azalea-inventory", version = "0.9.0" } derive_more = { version = "0.99.17", features = ["deref", "deref_mut"] } futures = "0.3.30" tracing = "0.1.40" @@ -39,11 +38,11 @@ regex = "1.10.4" thiserror = "^1.0.58" tokio = { version = "^1.37.0", features = ["sync"] } uuid = "^1.8.0" -azalea-entity = { version = "0.9.0", path = "../azalea-entity" } serde_json = "1.0.116" serde = "1.0.198" minecraft_folder_path = "0.1.2" -socks5-impl = "0.5.12" +azalea-entity = { version = "0.9.0", path = "../azalea-entity" } +azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } [features] default = ["log"] diff --git a/azalea-client/src/client.rs b/azalea-client/src/client.rs index 93852c75..39cc504c 100644 --- a/azalea-client/src/client.rs +++ b/azalea-client/src/client.rs @@ -306,6 +306,14 @@ impl Client { run_schedule_sender.clone(), ); + let instance = Instance::default(); + let instance_holder = crate::local_player::InstanceHolder::new( + entity, + // default to an empty world, it'll be set correctly later when we + // get the login packet + Arc::new(RwLock::new(instance)), + ); + ecs.entity_mut(entity).insert(( // these stay when we switch to the game state LocalPlayerBundle { @@ -318,6 +326,7 @@ impl Client { local_player_events: LocalPlayerEvents(tx), game_profile: GameProfileComponent(game_profile), client_information: crate::ClientInformation::default(), + instance_holder, }, InConfigurationState, )); @@ -394,7 +403,7 @@ impl Client { match packet { ClientboundLoginPacket::Hello(p) => { debug!("Got encryption request"); - let e = azalea_crypto::encrypt(&p.public_key, &p.nonce).unwrap(); + let e = azalea_crypto::encrypt(&p.public_key, &p.challenge).unwrap(); if let Some(access_token) = &account.access_token { // keep track of the number of times we tried @@ -436,7 +445,7 @@ impl Client { conn.write( ServerboundKeyPacket { key_bytes: e.encrypted_public_key, - encrypted_challenge: e.encrypted_nonce, + encrypted_challenge: e.encrypted_challenge, } .get(), ) @@ -466,6 +475,9 @@ impl Client { // replying to custom query is done in // packet_handling::login::process_packet_events } + ClientboundLoginPacket::CookieRequest(p) => { + debug!("Got cookie request {:?}", p); + } } }; @@ -666,6 +678,7 @@ pub struct LocalPlayerBundle { pub local_player_events: LocalPlayerEvents, pub game_profile: GameProfileComponent, pub client_information: ClientInformation, + pub instance_holder: InstanceHolder, } /// A bundle for the components that are present on a local player that is diff --git a/azalea-client/src/interact.rs b/azalea-client/src/interact.rs index 8a3aa49b..14fea407 100644 --- a/azalea-client/src/interact.rs +++ b/azalea-client/src/interact.rs @@ -17,6 +17,7 @@ use azalea_protocol::packets::game::{ serverbound_swing_packet::ServerboundSwingPacket, serverbound_use_item_on_packet::{BlockHit, ServerboundUseItemOnPacket}, }; +use azalea_registry::DataComponentKind; use azalea_world::{Instance, InstanceContainer, InstanceName}; use bevy_app::{App, Plugin, Update}; use bevy_ecs::{ @@ -28,7 +29,6 @@ use bevy_ecs::{ system::{Commands, Query, Res}, }; use derive_more::{Deref, DerefMut}; -use simdnbt::owned::NbtList; use tracing::warn; use crate::{ @@ -269,20 +269,11 @@ pub fn check_block_can_be_broken_by_item_in_adventure_mode( // minecraft caches the last checked block but that's kind of an unnecessary // optimization and makes the code too complicated - let Some(can_destroy) = item - .nbt - .compound("tag") - .and_then(|nbt| nbt.list("CanDestroy")) - else { + let Some(_can_destroy) = item.components.get(DataComponentKind::CanBreak) else { // no CanDestroy tag return false; }; - let NbtList::String(_can_destroy) = can_destroy else { - // CanDestroy tag must be a list of strings - return false; - }; - false // for block_predicate in can_destroy { diff --git a/azalea-client/src/inventory.rs b/azalea-client/src/inventory.rs index 4bfed69f..97eb98ea 100644 --- a/azalea-client/src/inventory.rs +++ b/azalea-client/src/inventory.rs @@ -252,7 +252,7 @@ impl InventoryComponent { // && slot.may_place(item_stack) && ( self.quick_craft_kind == QuickCraftKind::Middle - || item_stack.count() as i32 >= self.quick_craft_slots.len() as i32 + || item_stack.count() >= self.quick_craft_slots.len() as i32 ) { break; @@ -273,9 +273,9 @@ impl InventoryComponent { &mut new_carried, slot_item_count, ); - let max_stack_size = i8::min( + let max_stack_size = i32::min( new_carried.kind.max_stack_size(), - i8::min( + i32::min( new_carried.kind.max_stack_size(), slot.kind.max_stack_size(), ), @@ -391,7 +391,7 @@ impl InventoryComponent { }; if self.menu().may_place(source_slot_index, target_item) { let source_max_stack = self.menu().max_stack_size(source_slot_index); - if target_slot.count() > source_max_stack as i8 { + if target_slot.count() > source_max_stack as i32 { // if there's more than the max stack size in the target slot let target_slot = self.menu_mut().slot_mut(target_slot_index).unwrap(); @@ -449,7 +449,7 @@ impl InventoryComponent { ThrowClick::All { .. } => slot_item.count, }; - let _dropping = slot_item.split(dropping_count as u8); + let _dropping = slot_item.split(dropping_count as u32); // player.drop(dropping, true); } ClickOperation::PickupAll(PickupAllClick { @@ -492,7 +492,7 @@ impl InventoryComponent { let checking_slot = self.menu_mut().slot_mut(i).unwrap(); let taken_item = - checking_slot.split(checking_slot.count() as u8); + checking_slot.split(checking_slot.count() as u32); // now extend the carried item let target_slot = &mut self.carried; @@ -537,7 +537,7 @@ fn can_item_quick_replace( return false; }; - if !item.is_same_item_and_nbt(target_slot) { + if !item.is_same_item_and_components(target_slot) { return false; } let count = target_slot.count as u16 @@ -553,10 +553,10 @@ fn get_quick_craft_slot_count( quick_craft_slots: &HashSet, quick_craft_kind: &QuickCraftKind, item: &mut ItemSlotData, - slot_item_count: i8, + slot_item_count: i32, ) { item.count = match quick_craft_kind { - QuickCraftKind::Left => item.count / quick_craft_slots.len() as i8, + QuickCraftKind::Left => item.count / quick_craft_slots.len() as i32, QuickCraftKind::Right => 1, QuickCraftKind::Middle => item.kind.max_stack_size(), }; diff --git a/azalea-client/src/packet_handling/configuration.rs b/azalea-client/src/packet_handling/configuration.rs index da5ce57f..add36c6e 100644 --- a/azalea-client/src/packet_handling/configuration.rs +++ b/azalea-client/src/packet_handling/configuration.rs @@ -1,20 +1,18 @@ use std::io::Cursor; -use std::sync::Arc; use azalea_entity::indexing::EntityIdIndex; use azalea_protocol::packets::configuration::serverbound_finish_configuration_packet::ServerboundFinishConfigurationPacket; use azalea_protocol::packets::configuration::serverbound_keep_alive_packet::ServerboundKeepAlivePacket; use azalea_protocol::packets::configuration::serverbound_pong_packet::ServerboundPongPacket; use azalea_protocol::packets::configuration::serverbound_resource_pack_packet::ServerboundResourcePackPacket; +use azalea_protocol::packets::configuration::serverbound_select_known_packs_packet::ServerboundSelectKnownPacksPacket; use azalea_protocol::packets::configuration::{ ClientboundConfigurationPacket, ServerboundConfigurationPacket, }; use azalea_protocol::packets::ConnectionProtocol; use azalea_protocol::read::deserialize_packet; -use azalea_world::Instance; use bevy_ecs::prelude::*; use bevy_ecs::system::SystemState; -use parking_lot::RwLock; use tracing::{debug, error, warn}; use crate::client::InConfigurationState; @@ -22,6 +20,7 @@ use crate::disconnect::DisconnectEvent; use crate::local_player::Hunger; use crate::packet_handling::game::KeepAliveEvent; use crate::raw_connection::RawConnection; +use crate::InstanceHolder; #[derive(Event, Debug, Clone)] pub struct ConfigurationPacketEvent { @@ -80,21 +79,14 @@ pub fn process_packet_events(ecs: &mut World) { for (player_entity, packet) in events_owned { match packet { ClientboundConfigurationPacket::RegistryData(p) => { - let mut instance = Instance::default(); + let mut system_state: SystemState> = + SystemState::new(ecs); + let mut query = system_state.get_mut(ecs); + let instance_holder = query.get_mut(player_entity).unwrap(); + let mut instance = instance_holder.instance.write(); - // override the old registries with the new ones - // but if a registry wasn't sent, keep the old one - for (registry_name, registry) in p.registry_holder.map { - instance.registries.map.insert(registry_name, registry); - } - - let instance_holder = crate::local_player::InstanceHolder::new( - player_entity, - // default to an empty world, it'll be set correctly later when we - // get the login packet - Arc::new(RwLock::new(instance)), - ); - ecs.entity_mut(player_entity).insert(instance_holder); + // add the new registry data + instance.registries.append(p.registry_id, p.entries); } ClientboundConfigurationPacket::CustomPayload(p) => { @@ -200,6 +192,35 @@ pub fn process_packet_events(ecs: &mut World) { ClientboundConfigurationPacket::UpdateTags(_p) => { debug!("Got update tags packet"); } + ClientboundConfigurationPacket::CookieRequest(p) => { + debug!("Got cookie request packet {p:?}"); + } + ClientboundConfigurationPacket::ResetChat(p) => { + debug!("Got reset chat packet {p:?}"); + } + ClientboundConfigurationPacket::StoreCookie(p) => { + debug!("Got store cookie packet {p:?}"); + } + ClientboundConfigurationPacket::Transfer(p) => { + debug!("Got transfer packet {p:?}"); + } + ClientboundConfigurationPacket::SelectKnownPacks(p) => { + debug!("Got select known packs packet {p:?}"); + + let mut system_state: SystemState> = SystemState::new(ecs); + let mut query = system_state.get_mut(ecs); + let raw_connection = query.get_mut(player_entity).unwrap(); + + // resource pack management isn't implemented + raw_connection + .write_packet( + ServerboundSelectKnownPacksPacket { + known_packs: vec![], + } + .get(), + ) + .unwrap(); + } } } } diff --git a/azalea-client/src/packet_handling/game.rs b/azalea-client/src/packet_handling/game.rs index 1c913ba5..dd2695dc 100644 --- a/azalea-client/src/packet_handling/game.rs +++ b/azalea-client/src/packet_handling/game.rs @@ -243,20 +243,20 @@ pub fn process_packet_events(ecs: &mut World) { .insert(InstanceName(new_instance_name.clone())); } - let Some(dimension_type) = + let Some(dimension_type_element) = instance_holder.instance.read().registries.dimension_type() else { error!("Server didn't send dimension type registry, can't log in"); continue; }; - let dimension = &dimension_type - .value - .iter() - .find(|t| t.name == p.common.dimension_type) - .unwrap_or_else(|| { - panic!("No dimension_type with name {}", p.common.dimension_type) - }) - .element; + + let dimension_type = + ResourceLocation::new(&p.common.dimension_type.to_string()); + + let dimension = dimension_type_element + .map + .get(&dimension_type) + .unwrap_or_else(|| panic!("No dimension_type with name {dimension_type}")); // add this world to the instance_container (or don't if it's already // there) @@ -1288,9 +1288,6 @@ pub fn process_packet_events(ecs: &mut World) { packet: ServerboundPongPacket { id: p.id }.get(), }); } - ClientboundGamePacket::PongResponse(p) => { - debug!("Got pong response packet {p:?}"); - } ClientboundGamePacket::PlaceGhostRecipe(_) => {} ClientboundGamePacket::PlayerCombatEnd(_) => {} ClientboundGamePacket::PlayerCombatEnter(_) => {} @@ -1359,21 +1356,20 @@ pub fn process_packet_events(ecs: &mut World) { { let new_instance_name = p.common.dimension.clone(); - let Some(dimension_type) = + let Some(dimension_type_element) = instance_holder.instance.read().registries.dimension_type() else { error!("Server didn't send dimension type registry, can't log in"); continue; }; - let dimension = &dimension_type - .value - .iter() - .find(|t| t.name == p.common.dimension_type) - .unwrap_or_else(|| { - panic!("No dimension_type with name {}", p.common.dimension_type) - }) - .element; + let dimension_type = + ResourceLocation::new(&p.common.dimension_type.to_string()); + + let dimension = dimension_type_element + .map + .get(&dimension_type) + .unwrap_or_else(|| panic!("No dimension_type with name {dimension_type}")); // add this world to the instance_container (or don't if it's already // there) @@ -1475,6 +1471,11 @@ pub fn process_packet_events(ecs: &mut World) { ClientboundGamePacket::TickingStep(_) => {} ClientboundGamePacket::ResetScore(_) => {} + ClientboundGamePacket::CookieRequest(_) => {} + ClientboundGamePacket::DebugSample(_) => {} + ClientboundGamePacket::PongResponse(_) => {} + ClientboundGamePacket::StoreCookie(_) => {} + ClientboundGamePacket::Transfer(_) => {} } } } diff --git a/azalea-core/Cargo.toml b/azalea-core/Cargo.toml index a8acde6b..643fc4a6 100644 --- a/azalea-core/Cargo.toml +++ b/azalea-core/Cargo.toml @@ -11,7 +11,6 @@ version = "0.9.1" [dependencies] simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } azalea-buf = { path = "../azalea-buf", version = "0.9.0" } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } azalea-registry = { path = "../azalea-registry", version = "0.9.0" } bevy_ecs = { version = "0.13.2", default-features = false, optional = true } nohash-hasher = "0.2.0" diff --git a/azalea-core/src/lib.rs b/azalea-core/src/lib.rs index 5471120b..83dd6245 100755 --- a/azalea-core/src/lib.rs +++ b/azalea-core/src/lib.rs @@ -1,5 +1,6 @@ #![doc = include_str!("../README.md")] #![feature(lazy_cell)] +#![feature(trait_upcasting)] #![allow(incomplete_features)] #![feature(generic_const_exprs)] @@ -13,7 +14,6 @@ pub mod direction; pub mod game_type; pub mod math; pub mod objectives; -pub mod particle; pub mod position; pub mod registry_holder; pub mod resource_location; diff --git a/azalea-core/src/position.rs b/azalea-core/src/position.rs index e2a9c4cc..31b2d008 100755 --- a/azalea-core/src/position.rs +++ b/azalea-core/src/position.rs @@ -424,11 +424,11 @@ impl From for u16 { impl nohash_hasher::IsEnabled for ChunkSectionBlockPos {} /// A block pos with an attached world -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct GlobalPos { - pub pos: BlockPos, // this is actually a ResourceKey in Minecraft, but i don't think it matters? pub world: ResourceLocation, + pub pos: BlockPos, } impl From<&BlockPos> for ChunkPos { diff --git a/azalea-core/src/registry_holder.rs b/azalea-core/src/registry_holder.rs index 1c21c890..c75e3919 100644 --- a/azalea-core/src/registry_holder.rs +++ b/azalea-core/src/registry_holder.rs @@ -5,7 +5,6 @@ //! the game, including the types of chat messages, dimensions, and //! biomes. -use azalea_buf::{BufReadError, McBufReadable, McBufWritable}; use simdnbt::{ owned::{NbtCompound, NbtTag}, Deserialize, FromNbtTag, Serialize, ToNbtTag, @@ -20,23 +19,51 @@ use crate::resource_location::ResourceLocation; /// This is the registry that is sent to the client upon login. #[derive(Default, Debug, Clone)] pub struct RegistryHolder { - pub map: HashMap, + pub map: HashMap>, } impl RegistryHolder { + pub fn append( + &mut self, + id: ResourceLocation, + entries: HashMap>, + ) { + let map = self.map.entry(id).or_default(); + for (key, value) in entries { + if let Some(value) = value { + map.insert(key, value); + } else { + map.remove(&key); + } + } + } + fn get( &self, name: &ResourceLocation, - ) -> Option> { + ) -> Option, simdnbt::DeserializeError>> { // this is suboptimal, ideally simdnbt should just have a way to get the // owned::NbtCompound as a borrow::NbtCompound - let nbt_owned_compound = self.map.get(name)?; - let mut nbt_bytes = Vec::new(); - nbt_owned_compound.write(&mut nbt_bytes); - let nbt_borrow_compound = - simdnbt::borrow::NbtCompound::read(&mut Cursor::new(&nbt_bytes)).ok()?; - Some(T::from_compound(&nbt_borrow_compound)) + let mut map = HashMap::new(); + + for (key, value) in self.map.get(name)? { + // convert the value to T + let mut nbt_bytes = Vec::new(); + value.write(&mut nbt_bytes); + let nbt_borrow_compound = + simdnbt::borrow::NbtCompound::read(&mut Cursor::new(&nbt_bytes)).ok()?; + let value = match T::from_compound(&nbt_borrow_compound) { + Ok(value) => value, + Err(err) => { + return Some(Err(err)); + } + }; + + map.insert(key.clone(), value); + } + + Some(Ok(RegistryType { map })) } /// Get the dimension type registry, or `None` if it doesn't exist. You @@ -57,48 +84,10 @@ impl RegistryHolder { } } -impl McBufReadable for RegistryHolder { - fn read_from(buf: &mut Cursor<&[u8]>) -> Result { - let nbt_tag = simdnbt::borrow::NbtTag::read(buf)?; - let nbt_compound = nbt_tag - .compound() - .ok_or_else(|| BufReadError::Custom("RegistryHolder must be a compound".to_string()))?; - Ok(RegistryHolder { - map: simdnbt::Deserialize::from_compound(nbt_compound)?, - }) - } -} - -impl McBufWritable for RegistryHolder { - fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { - let mut written = Vec::new(); - self.map.clone().to_compound().write_into(&mut written)?; - buf.write_all(&written) - } -} - /// A collection of values for a certain type of registry data. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[cfg_attr(feature = "strict_registry", simdnbt(deny_unknown_fields))] -pub struct RegistryType -where - T: Serialize + Deserialize, -{ - #[simdnbt(rename = "type")] - pub kind: ResourceLocation, - pub value: Vec>, -} - -/// A value for a certain type of registry data. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[cfg_attr(feature = "strict_registry", simdnbt(deny_unknown_fields))] -pub struct TypeValue -where - T: Serialize + Deserialize, -{ - pub id: u32, - pub name: ResourceLocation, - pub element: T, +#[derive(Debug, Clone)] +pub struct RegistryType { + pub map: HashMap, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/azalea-core/src/resource_location.rs b/azalea-core/src/resource_location.rs index f9f95004..a6dcc0be 100755 --- a/azalea-core/src/resource_location.rs +++ b/azalea-core/src/resource_location.rs @@ -3,6 +3,7 @@ use azalea_buf::{BufReadError, McBufReadable, McBufWritable}; use simdnbt::{owned::NbtTag, FromNbtTag, ToNbtTag}; use std::{ + fmt, io::{Cursor, Write}, str::FromStr, }; @@ -41,13 +42,13 @@ impl ResourceLocation { } } -impl std::fmt::Display for ResourceLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl fmt::Display for ResourceLocation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}:{}", self.namespace, self.path) } } -impl std::fmt::Debug for ResourceLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl fmt::Debug for ResourceLocation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}:{}", self.namespace, self.path) } } diff --git a/azalea-crypto/src/lib.rs b/azalea-crypto/src/lib.rs index cefc9adc..90e248a2 100755 --- a/azalea-crypto/src/lib.rs +++ b/azalea-crypto/src/lib.rs @@ -39,10 +39,10 @@ pub fn hex_digest(digest: &[u8]) -> String { pub struct EncryptResult { pub secret_key: [u8; 16], pub encrypted_public_key: Vec, - pub encrypted_nonce: Vec, + pub encrypted_challenge: Vec, } -pub fn encrypt(public_key: &[u8], nonce: &[u8]) -> Result { +pub fn encrypt(public_key: &[u8], challenge: &[u8]) -> Result { // On receipt of a Encryption Request from the server, the client will // generate a random 16-byte shared secret, to be used with the AES/CFB8 // stream cipher. @@ -51,14 +51,14 @@ pub fn encrypt(public_key: &[u8], nonce: &[u8]) -> Result // &secret_key)); // this.keybytes = Crypt.encryptUsingKey(publicKey, secretKey.getEncoded()); - // this.nonce = Crypt.encryptUsingKey(publicKey, arrby); + // this.challenge = Crypt.encryptUsingKey(publicKey, arrby); let encrypted_public_key: Vec = rsa_public_encrypt_pkcs1::encrypt(public_key, &secret_key)?; - let encrypted_nonce: Vec = rsa_public_encrypt_pkcs1::encrypt(public_key, nonce)?; + let encrypted_challenge: Vec = rsa_public_encrypt_pkcs1::encrypt(public_key, challenge)?; Ok(EncryptResult { secret_key, encrypted_public_key, - encrypted_nonce, + encrypted_challenge, }) } diff --git a/azalea-entity/src/data.rs b/azalea-entity/src/data.rs index b0a05e74..45c761e7 100755 --- a/azalea-entity/src/data.rs +++ b/azalea-entity/src/data.rs @@ -6,7 +6,6 @@ use azalea_buf::{ use azalea_chat::FormattedText; use azalea_core::{ direction::Direction, - particle::Particle, position::{BlockPos, GlobalPos, Vec3}, }; use azalea_inventory::ItemSlot; @@ -17,6 +16,8 @@ use nohash_hasher::IntSet; use std::io::{Cursor, Write}; use uuid::Uuid; +use crate::particle::Particle; + #[derive(Clone, Debug, Deref)] pub struct EntityMetadataItems(Vec); @@ -83,15 +84,18 @@ pub enum EntityDataValue { OptionalBlockState(azalea_block::BlockState), CompoundTag(simdnbt::owned::NbtCompound), Particle(Particle), + Particles(Vec), VillagerData(VillagerData), // 0 for absent; 1 + actual value otherwise. Used for entity IDs. OptionalUnsignedInt(OptionalUnsignedInt), Pose(Pose), CatVariant(azalea_registry::CatVariant), + WolfVariant(azalea_registry::WolfVariant), FrogVariant(azalea_registry::FrogVariant), OptionalGlobalPos(Option), PaintingVariant(azalea_registry::PaintingVariant), SnifferState(SnifferState), + ArmadilloState(ArmadilloStateKind), Vector3(Vec3), Quaternion(Quaternion), } @@ -107,6 +111,16 @@ pub struct Quaternion { pub w: f32, } +// mojang just calls this ArmadilloState but i added "Kind" since otherwise it +// collides with a name in metadata.rs +#[derive(Clone, Debug, Copy, Default, McBuf)] +pub enum ArmadilloStateKind { + #[default] + Idle, + Rolling, + Scared, +} + impl McBufReadable for OptionalUnsignedInt { fn read_from(buf: &mut Cursor<&[u8]>) -> Result { let val = u32::var_read_from(buf)?; diff --git a/azalea-entity/src/lib.rs b/azalea-entity/src/lib.rs index dd818c6d..8761fa24 100644 --- a/azalea-entity/src/lib.rs +++ b/azalea-entity/src/lib.rs @@ -7,6 +7,7 @@ mod effects; mod enchantments; pub mod metadata; pub mod mining; +pub mod particle; mod plugin; use self::attributes::AttributeInstance; diff --git a/azalea-entity/src/metadata.rs b/azalea-entity/src/metadata.rs index c73136b3..f2a88670 100644 --- a/azalea-entity/src/metadata.rs +++ b/azalea-entity/src/metadata.rs @@ -3,14 +3,15 @@ // This file is generated from codegen/lib/code/entity.py. // Don't change it manually! +use crate::particle::Particle; + use super::{ - EntityDataItem, EntityDataValue, OptionalUnsignedInt, Pose, Quaternion, Rotations, - SnifferState, VillagerData, + ArmadilloStateKind, EntityDataItem, EntityDataValue, OptionalUnsignedInt, Pose, Quaternion, + Rotations, SnifferState, VillagerData, }; use azalea_chat::FormattedText; use azalea_core::{ direction::Direction, - particle::Particle, position::{BlockPos, Vec3}, }; use azalea_inventory::ItemSlot; @@ -63,7 +64,7 @@ pub struct AbstractLivingUsingItem(pub bool); #[derive(Component, Deref, DerefMut, Clone)] pub struct Health(pub f32); #[derive(Component, Deref, DerefMut, Clone)] -pub struct AbstractLivingEffectColor(pub i32); +pub struct EffectParticles(pub Vec); #[derive(Component, Deref, DerefMut, Clone)] pub struct EffectAmbience(pub bool); #[derive(Component, Deref, DerefMut, Clone)] @@ -130,17 +131,17 @@ impl Default for AllayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -160,8 +161,6 @@ impl Default for AllayMetadataBundle { #[derive(Component, Deref, DerefMut, Clone)] pub struct Radius(pub f32); #[derive(Component, Deref, DerefMut, Clone)] -pub struct AreaEffectCloudColor(pub i32); -#[derive(Component, Deref, DerefMut, Clone)] pub struct Waiting(pub bool); #[derive(Component)] pub struct AreaEffectCloud; @@ -176,12 +175,9 @@ impl AreaEffectCloud { entity.insert(Radius(d.value.into_float()?)); } 9 => { - entity.insert(AreaEffectCloudColor(d.value.into_int()?)); - } - 10 => { entity.insert(Waiting(d.value.into_boolean()?)); } - 11 => { + 10 => { entity.insert(d.value.into_particle()?); } _ => {} @@ -195,7 +191,6 @@ pub struct AreaEffectCloudMetadataBundle { _marker: AreaEffectCloud, parent: AbstractEntityMetadataBundle, radius: Radius, - area_effect_cloud_color: AreaEffectCloudColor, waiting: Waiting, particle: Particle, } @@ -213,21 +208,101 @@ impl Default for AreaEffectCloudMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, radius: Radius(3.0), - area_effect_cloud_color: AreaEffectCloudColor(0), waiting: Waiting(false), particle: Particle::default(), } } } +#[derive(Component, Deref, DerefMut, Clone)] +pub struct AbstractAgeableBaby(pub bool); +#[derive(Component, Deref, DerefMut, Clone)] +pub struct ArmadilloState(pub ArmadilloStateKind); +#[derive(Component)] +pub struct Armadillo; +impl Armadillo { + pub fn apply_metadata( + entity: &mut bevy_ecs::system::EntityCommands, + d: EntityDataItem, + ) -> Result<(), UpdateMetadataError> { + match d.index { + 0..=16 => AbstractAnimal::apply_metadata(entity, d)?, + 17 => { + entity.insert(ArmadilloState(d.value.into_armadillo_state()?)); + } + _ => {} + } + Ok(()) + } +} + +#[derive(Bundle)] +pub struct ArmadilloMetadataBundle { + _marker: Armadillo, + parent: AbstractAnimalMetadataBundle, + armadillo_state: ArmadilloState, +} +impl Default for ArmadilloMetadataBundle { + fn default() -> Self { + Self { + _marker: Armadillo, + parent: AbstractAnimalMetadataBundle { + _marker: AbstractAnimal, + parent: AbstractAgeableMetadataBundle { + _marker: AbstractAgeable, + parent: AbstractCreatureMetadataBundle { + _marker: AbstractCreature, + parent: AbstractInsentientMetadataBundle { + _marker: AbstractInsentient, + parent: AbstractLivingMetadataBundle { + _marker: AbstractLiving, + parent: AbstractEntityMetadataBundle { + _marker: AbstractEntity, + on_fire: OnFire(false), + shift_key_down: ShiftKeyDown(false), + sprinting: Sprinting(false), + swimming: Swimming(false), + currently_glowing: CurrentlyGlowing(false), + invisible: Invisible(false), + fall_flying: FallFlying(false), + air_supply: AirSupply(Default::default()), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), + pose: Pose::default(), + ticks_frozen: TicksFrozen(Default::default()), + }, + auto_spin_attack: AutoSpinAttack(false), + abstract_living_using_item: AbstractLivingUsingItem(false), + health: Health(1.0), + effect_particles: EffectParticles(Default::default()), + effect_ambience: EffectAmbience(false), + arrow_count: ArrowCount(0), + stinger_count: StingerCount(0), + sleeping_pos: SleepingPos(None), + }, + no_ai: NoAi(false), + left_handed: LeftHanded(false), + aggressive: Aggressive(false), + }, + }, + abstract_ageable_baby: AbstractAgeableBaby(false), + }, + }, + armadillo_state: ArmadilloState(Default::default()), + } + } +} + #[derive(Component, Deref, DerefMut, Clone, Copy)] pub struct Small(pub bool); #[derive(Component, Deref, DerefMut, Clone, Copy)] @@ -319,17 +394,17 @@ impl Default for ArmorStandMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -358,7 +433,7 @@ pub struct ArrowNoPhysics(pub bool); #[derive(Component, Deref, DerefMut, Clone)] pub struct ArrowPierceLevel(pub u8); #[derive(Component, Deref, DerefMut, Clone)] -pub struct ArrowEffectColor(pub i32); +pub struct EffectColor(pub i32); #[derive(Component)] pub struct Arrow; impl Arrow { @@ -378,7 +453,7 @@ impl Arrow { entity.insert(ArrowPierceLevel(d.value.into_byte()?)); } 10 => { - entity.insert(ArrowEffectColor(d.value.into_int()?)); + entity.insert(EffectColor(d.value.into_int()?)); } _ => {} } @@ -394,7 +469,7 @@ pub struct ArrowMetadataBundle { arrow_shot_from_crossbow: ArrowShotFromCrossbow, arrow_no_physics: ArrowNoPhysics, arrow_pierce_level: ArrowPierceLevel, - arrow_effect_color: ArrowEffectColor, + effect_color: EffectColor, } impl Default for ArrowMetadataBundle { fn default() -> Self { @@ -410,24 +485,22 @@ impl Default for ArrowMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, arrow_crit_arrow: ArrowCritArrow(false), arrow_shot_from_crossbow: ArrowShotFromCrossbow(false), arrow_no_physics: ArrowNoPhysics(false), arrow_pierce_level: ArrowPierceLevel(0), - arrow_effect_color: ArrowEffectColor(-1), + effect_color: EffectColor(-1), } } } -#[derive(Component, Deref, DerefMut, Clone)] -pub struct AbstractAgeableBaby(pub bool); #[derive(Component, Deref, DerefMut, Clone)] pub struct AxolotlVariant(pub i32); #[derive(Component, Deref, DerefMut, Clone)] @@ -490,17 +563,17 @@ impl Default for AxolotlMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -566,17 +639,17 @@ impl Default for BatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -656,17 +729,17 @@ impl Default for BeeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -737,17 +810,17 @@ impl Default for BlazeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -900,12 +973,12 @@ impl Default for BlockDisplayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, block_display_transformation_interpolation_start_delta_ticks: BlockDisplayTransformationInterpolationStartDeltaTicks(0), @@ -1027,12 +1100,12 @@ impl Default for BoatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, boat_hurt: BoatHurt(0), boat_hurtdir: BoatHurtdir(1), @@ -1045,6 +1118,81 @@ impl Default for BoatMetadataBundle { } } +#[derive(Component, Deref, DerefMut, Clone)] +pub struct BoggedSheared(pub bool); +#[derive(Component)] +pub struct Bogged; +impl Bogged { + pub fn apply_metadata( + entity: &mut bevy_ecs::system::EntityCommands, + d: EntityDataItem, + ) -> Result<(), UpdateMetadataError> { + match d.index { + 0..=15 => AbstractMonster::apply_metadata(entity, d)?, + 16 => { + entity.insert(BoggedSheared(d.value.into_boolean()?)); + } + _ => {} + } + Ok(()) + } +} + +#[derive(Bundle)] +pub struct BoggedMetadataBundle { + _marker: Bogged, + parent: AbstractMonsterMetadataBundle, + bogged_sheared: BoggedSheared, +} +impl Default for BoggedMetadataBundle { + fn default() -> Self { + Self { + _marker: Bogged, + parent: AbstractMonsterMetadataBundle { + _marker: AbstractMonster, + parent: AbstractCreatureMetadataBundle { + _marker: AbstractCreature, + parent: AbstractInsentientMetadataBundle { + _marker: AbstractInsentient, + parent: AbstractLivingMetadataBundle { + _marker: AbstractLiving, + parent: AbstractEntityMetadataBundle { + _marker: AbstractEntity, + on_fire: OnFire(false), + shift_key_down: ShiftKeyDown(false), + sprinting: Sprinting(false), + swimming: Swimming(false), + currently_glowing: CurrentlyGlowing(false), + invisible: Invisible(false), + fall_flying: FallFlying(false), + air_supply: AirSupply(Default::default()), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), + pose: Pose::default(), + ticks_frozen: TicksFrozen(Default::default()), + }, + auto_spin_attack: AutoSpinAttack(false), + abstract_living_using_item: AbstractLivingUsingItem(false), + health: Health(1.0), + effect_particles: EffectParticles(Default::default()), + effect_ambience: EffectAmbience(false), + arrow_count: ArrowCount(0), + stinger_count: StingerCount(0), + sleeping_pos: SleepingPos(None), + }, + no_ai: NoAi(false), + left_handed: LeftHanded(false), + aggressive: Aggressive(false), + }, + }, + }, + bogged_sheared: BoggedSheared(false), + } + } +} + #[derive(Component)] pub struct Breeze; impl Breeze { @@ -1087,17 +1235,17 @@ impl Default for BreezeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1113,6 +1261,51 @@ impl Default for BreezeMetadataBundle { } } +#[derive(Component)] +pub struct BreezeWindCharge; +impl BreezeWindCharge { + pub fn apply_metadata( + entity: &mut bevy_ecs::system::EntityCommands, + d: EntityDataItem, + ) -> Result<(), UpdateMetadataError> { + match d.index { + 0..=7 => AbstractEntity::apply_metadata(entity, d)?, + _ => {} + } + Ok(()) + } +} + +#[derive(Bundle)] +pub struct BreezeWindChargeMetadataBundle { + _marker: BreezeWindCharge, + parent: AbstractEntityMetadataBundle, +} +impl Default for BreezeWindChargeMetadataBundle { + fn default() -> Self { + Self { + _marker: BreezeWindCharge, + parent: AbstractEntityMetadataBundle { + _marker: AbstractEntity, + on_fire: OnFire(false), + shift_key_down: ShiftKeyDown(false), + sprinting: Sprinting(false), + swimming: Swimming(false), + currently_glowing: CurrentlyGlowing(false), + invisible: Invisible(false), + fall_flying: FallFlying(false), + air_supply: AirSupply(Default::default()), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), + pose: Pose::default(), + ticks_frozen: TicksFrozen(Default::default()), + }, + } + } +} + #[derive(Component, Deref, DerefMut, Clone, Copy)] pub struct CamelTamed(pub bool); #[derive(Component, Deref, DerefMut, Clone, Copy)] @@ -1192,17 +1385,17 @@ impl Default for CamelMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1303,17 +1496,17 @@ impl Default for CatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1385,17 +1578,17 @@ impl Default for CaveSpiderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1449,12 +1642,12 @@ impl Default for ChestBoatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, boat_hurt: BoatHurt(0), boat_hurtdir: BoatHurtdir(1), @@ -1516,12 +1709,12 @@ impl Default for ChestMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -1578,17 +1771,17 @@ impl Default for ChickenMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1652,17 +1845,17 @@ impl Default for CodMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1726,12 +1919,12 @@ impl Default for CommandBlockMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -1790,17 +1983,17 @@ impl Default for CowMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1878,17 +2071,17 @@ impl Default for CreeperMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1965,17 +2158,17 @@ impl Default for DolphinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2066,17 +2259,17 @@ impl Default for DonkeyMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2134,12 +2327,12 @@ impl Default for DragonFireballMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -2195,17 +2388,17 @@ impl Default for DrownedMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2265,14 +2458,14 @@ impl Default for EggMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - egg_item_stack: EggItemStack(ItemSlot::Empty), + egg_item_stack: EggItemStack(Default::default()), } } } @@ -2325,17 +2518,17 @@ impl Default for ElderGuardianMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2400,12 +2593,12 @@ impl Default for EndCrystalMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, beam_target: BeamTarget(None), show_bottom: ShowBottom(true), @@ -2457,17 +2650,17 @@ impl Default for EnderDragonMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2522,14 +2715,14 @@ impl Default for EnderPearlMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - ender_pearl_item_stack: EnderPearlItemStack(ItemSlot::Empty), + ender_pearl_item_stack: EnderPearlItemStack(Default::default()), } } } @@ -2594,17 +2787,17 @@ impl Default for EndermanMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2665,17 +2858,17 @@ impl Default for EndermiteMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2745,17 +2938,17 @@ impl Default for EvokerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2807,12 +3000,12 @@ impl Default for EvokerFangsMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -2858,14 +3051,14 @@ impl Default for ExperienceBottleMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - experience_bottle_item_stack: ExperienceBottleItemStack(ItemSlot::Empty), + experience_bottle_item_stack: ExperienceBottleItemStack(Default::default()), } } } @@ -2904,12 +3097,12 @@ impl Default for ExperienceOrbMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -2955,14 +3148,14 @@ impl Default for EyeOfEnderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - eye_of_ender_item_stack: EyeOfEnderItemStack(ItemSlot::Empty), + eye_of_ender_item_stack: EyeOfEnderItemStack(Default::default()), } } } @@ -3007,12 +3200,12 @@ impl Default for FallingBlockMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, start_pos: StartPos(Default::default()), } @@ -3059,14 +3252,14 @@ impl Default for FireballMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - fireball_item_stack: FireballItemStack(ItemSlot::Empty), + fireball_item_stack: FireballItemStack(Default::default()), } } } @@ -3123,14 +3316,14 @@ impl Default for FireworkRocketMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - fireworks_item: FireworksItem(ItemSlot::Empty), + fireworks_item: FireworksItem(Default::default()), attached_to_target: AttachedToTarget(OptionalUnsignedInt(None)), shot_at_angle: ShotAtAngle(false), } @@ -3183,12 +3376,12 @@ impl Default for FishingBobberMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, hooked_entity: HookedEntity(0), biting: Biting(false), @@ -3285,17 +3478,17 @@ impl Default for FoxMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3378,17 +3571,17 @@ impl Default for FrogMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3450,12 +3643,12 @@ impl Default for FurnaceMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -3513,17 +3706,17 @@ impl Default for GhastMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3580,17 +3773,17 @@ impl Default for GiantMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3646,12 +3839,12 @@ impl Default for GlowItemFrameMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, item_frame_item: ItemFrameItem(ItemSlot::Empty), rotation: Rotation(0), @@ -3708,17 +3901,17 @@ impl Default for GlowSquidMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3797,17 +3990,17 @@ impl Default for GoatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3878,17 +4071,17 @@ impl Default for GuardianMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3956,17 +4149,17 @@ impl Default for HoglinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4021,12 +4214,12 @@ impl Default for HopperMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -4112,17 +4305,17 @@ impl Default for HorseMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4190,17 +4383,17 @@ impl Default for HuskMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4274,17 +4467,17 @@ impl Default for IllusionerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4354,12 +4547,12 @@ impl Default for InteractionMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, interaction_width: InteractionWidth(1.0), interaction_height: InteractionHeight(1.0), @@ -4415,17 +4608,17 @@ impl Default for IronGolemMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4481,12 +4674,12 @@ impl Default for ItemMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, item_item: ItemItem(ItemSlot::Empty), } @@ -4635,12 +4828,12 @@ impl Default for ItemDisplayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, item_display_transformation_interpolation_start_delta_ticks: ItemDisplayTransformationInterpolationStartDeltaTicks(0), @@ -4727,12 +4920,12 @@ impl Default for ItemFrameMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, item_frame_item: ItemFrameItem(ItemSlot::Empty), rotation: Rotation(0), @@ -4774,12 +4967,12 @@ impl Default for LeashKnotMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -4819,12 +5012,12 @@ impl Default for LightningBoltMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -4845,8 +5038,6 @@ pub struct LlamaChest(pub bool); #[derive(Component, Deref, DerefMut, Clone)] pub struct Strength(pub i32); #[derive(Component, Deref, DerefMut, Clone)] -pub struct Swag(pub i32); -#[derive(Component, Deref, DerefMut, Clone)] pub struct LlamaVariant(pub i32); #[derive(Component)] pub struct Llama; @@ -4872,9 +5063,6 @@ impl Llama { entity.insert(Strength(d.value.into_int()?)); } 20 => { - entity.insert(Swag(d.value.into_int()?)); - } - 21 => { entity.insert(LlamaVariant(d.value.into_int()?)); } _ => {} @@ -4894,7 +5082,6 @@ pub struct LlamaMetadataBundle { llama_saddled: LlamaSaddled, llama_chest: LlamaChest, strength: Strength, - swag: Swag, llama_variant: LlamaVariant, } impl Default for LlamaMetadataBundle { @@ -4921,17 +5108,17 @@ impl Default for LlamaMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4952,7 +5139,6 @@ impl Default for LlamaMetadataBundle { llama_saddled: LlamaSaddled(false), llama_chest: LlamaChest(false), strength: Strength(0), - swag: Swag(-1), llama_variant: LlamaVariant(0), } } @@ -4992,12 +5178,12 @@ impl Default for LlamaSpitMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -5045,17 +5231,17 @@ impl Default for MagmaCubeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5105,12 +5291,12 @@ impl Default for MarkerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -5152,12 +5338,12 @@ impl Default for MinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -5222,17 +5408,17 @@ impl Default for MooshroomMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5325,17 +5511,17 @@ impl Default for MuleMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5409,17 +5595,17 @@ impl Default for OcelotMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5438,6 +5624,58 @@ impl Default for OcelotMetadataBundle { } } +#[derive(Component, Deref, DerefMut, Clone)] +pub struct OminousItemSpawnerItem(pub ItemSlot); +#[derive(Component)] +pub struct OminousItemSpawner; +impl OminousItemSpawner { + pub fn apply_metadata( + entity: &mut bevy_ecs::system::EntityCommands, + d: EntityDataItem, + ) -> Result<(), UpdateMetadataError> { + match d.index { + 0..=7 => AbstractEntity::apply_metadata(entity, d)?, + 8 => { + entity.insert(OminousItemSpawnerItem(d.value.into_item_stack()?)); + } + _ => {} + } + Ok(()) + } +} + +#[derive(Bundle)] +pub struct OminousItemSpawnerMetadataBundle { + _marker: OminousItemSpawner, + parent: AbstractEntityMetadataBundle, + ominous_item_spawner_item: OminousItemSpawnerItem, +} +impl Default for OminousItemSpawnerMetadataBundle { + fn default() -> Self { + Self { + _marker: OminousItemSpawner, + parent: AbstractEntityMetadataBundle { + _marker: AbstractEntity, + on_fire: OnFire(false), + shift_key_down: ShiftKeyDown(false), + sprinting: Sprinting(false), + swimming: Swimming(false), + currently_glowing: CurrentlyGlowing(false), + invisible: Invisible(false), + fall_flying: FallFlying(false), + air_supply: AirSupply(Default::default()), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), + pose: Pose::default(), + ticks_frozen: TicksFrozen(Default::default()), + }, + ominous_item_spawner_item: OminousItemSpawnerItem(ItemSlot::Empty), + } + } +} + #[derive(Component, Deref, DerefMut, Clone)] pub struct PaintingVariant(pub azalea_registry::PaintingVariant); #[derive(Component)] @@ -5478,12 +5716,12 @@ impl Default for PaintingMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, painting_variant: PaintingVariant(azalea_registry::PaintingVariant::Kebab), } @@ -5583,17 +5821,17 @@ impl Default for PandaMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5672,17 +5910,17 @@ impl Default for ParrotMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5749,17 +5987,17 @@ impl Default for PhantomMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5830,17 +6068,17 @@ impl Default for PigMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5926,17 +6164,17 @@ impl Default for PiglinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6004,17 +6242,17 @@ impl Default for PiglinBruteMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6085,17 +6323,17 @@ impl Default for PillagerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6185,17 +6423,17 @@ impl Default for PlayerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6261,17 +6499,17 @@ impl Default for PolarBearMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6330,14 +6568,14 @@ impl Default for PotionMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - potion_item_stack: PotionItemStack(ItemSlot::Empty), + potion_item_stack: PotionItemStack(Default::default()), } } } @@ -6394,17 +6632,17 @@ impl Default for PufferfishMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6471,17 +6709,17 @@ impl Default for RabbitMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6548,17 +6786,17 @@ impl Default for RavagerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6621,17 +6859,17 @@ impl Default for SalmonMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6648,7 +6886,7 @@ impl Default for SalmonMetadataBundle { } #[derive(Component, Deref, DerefMut, Clone, Copy)] -pub struct Sheared(pub bool); +pub struct SheepSheared(pub bool); #[derive(Component)] pub struct Sheep; impl Sheep { @@ -6660,7 +6898,7 @@ impl Sheep { 0..=16 => AbstractAnimal::apply_metadata(entity, d)?, 17 => { let bitfield = d.value.into_byte()?; - entity.insert(Sheared(bitfield & 0x10 != 0)); + entity.insert(SheepSheared(bitfield & 0x10 != 0)); } _ => {} } @@ -6672,7 +6910,7 @@ impl Sheep { pub struct SheepMetadataBundle { _marker: Sheep, parent: AbstractAnimalMetadataBundle, - sheared: Sheared, + sheep_sheared: SheepSheared, } impl Default for SheepMetadataBundle { fn default() -> Self { @@ -6698,17 +6936,17 @@ impl Default for SheepMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6722,7 +6960,7 @@ impl Default for SheepMetadataBundle { abstract_ageable_baby: AbstractAgeableBaby(false), }, }, - sheared: Sheared(false), + sheep_sheared: SheepSheared(false), } } } @@ -6732,7 +6970,7 @@ pub struct AttachFace(pub Direction); #[derive(Component, Deref, DerefMut, Clone)] pub struct Peek(pub u8); #[derive(Component, Deref, DerefMut, Clone)] -pub struct ShulkerColor(pub u8); +pub struct Color(pub u8); #[derive(Component)] pub struct Shulker; impl Shulker { @@ -6749,7 +6987,7 @@ impl Shulker { entity.insert(Peek(d.value.into_byte()?)); } 18 => { - entity.insert(ShulkerColor(d.value.into_byte()?)); + entity.insert(Color(d.value.into_byte()?)); } _ => {} } @@ -6763,7 +7001,7 @@ pub struct ShulkerMetadataBundle { parent: AbstractCreatureMetadataBundle, attach_face: AttachFace, peek: Peek, - shulker_color: ShulkerColor, + color: Color, } impl Default for ShulkerMetadataBundle { fn default() -> Self { @@ -6785,17 +7023,17 @@ impl Default for ShulkerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6808,7 +7046,7 @@ impl Default for ShulkerMetadataBundle { }, attach_face: AttachFace(Default::default()), peek: Peek(0), - shulker_color: ShulkerColor(16), + color: Color(16), } } } @@ -6847,12 +7085,12 @@ impl Default for ShulkerBulletMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -6900,17 +7138,17 @@ impl Default for SilverfishMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6974,17 +7212,17 @@ impl Default for SkeletonMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7068,17 +7306,17 @@ impl Default for SkeletonHorseMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7143,17 +7381,17 @@ impl Default for SlimeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7208,14 +7446,14 @@ impl Default for SmallFireballMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - small_fireball_item_stack: SmallFireballItemStack(ItemSlot::Empty), + small_fireball_item_stack: SmallFireballItemStack(Default::default()), } } } @@ -7276,17 +7514,17 @@ impl Default for SnifferMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7301,7 +7539,7 @@ impl Default for SnifferMetadataBundle { }, }, state: State(Default::default()), - drop_seed_at_tick: DropSeedAtTick(Default::default()), + drop_seed_at_tick: DropSeedAtTick(0), } } } @@ -7353,17 +7591,17 @@ impl Default for SnowGolemMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7419,14 +7657,14 @@ impl Default for SnowballMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - snowball_item_stack: SnowballItemStack(ItemSlot::Empty), + snowball_item_stack: SnowballItemStack(Default::default()), } } } @@ -7467,12 +7705,12 @@ impl Default for SpawnerMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -7540,12 +7778,12 @@ impl Default for SpectralArrowMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, spectral_arrow_crit_arrow: SpectralArrowCritArrow(false), spectral_arrow_shot_from_crossbow: SpectralArrowShotFromCrossbow(false), @@ -7602,17 +7840,17 @@ impl Default for SpiderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7669,17 +7907,17 @@ impl Default for SquidMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7736,17 +7974,17 @@ impl Default for StrayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7824,17 +8062,17 @@ impl Default for StriderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7901,17 +8139,17 @@ impl Default for TadpoleMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8087,12 +8325,12 @@ impl Default for TextDisplayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, text_display_transformation_interpolation_start_delta_ticks: TextDisplayTransformationInterpolationStartDeltaTicks(0), @@ -8186,12 +8424,12 @@ impl Default for TntMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, fuse: Fuse(80), tnt_block_state: TntBlockState(Default::default()), @@ -8235,12 +8473,12 @@ impl Default for TntMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -8261,7 +8499,7 @@ impl TraderLlama { d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { - 0..=21 => Llama::apply_metadata(entity, d)?, + 0..=20 => Llama::apply_metadata(entity, d)?, _ => {} } Ok(()) @@ -8299,17 +8537,17 @@ impl Default for TraderLlamaMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8330,7 +8568,6 @@ impl Default for TraderLlamaMetadataBundle { llama_saddled: LlamaSaddled(false), llama_chest: LlamaChest(false), strength: Strength(0), - swag: Swag(-1), llama_variant: LlamaVariant(0), }, } @@ -8404,12 +8641,12 @@ impl Default for TridentMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, trident_crit_arrow: TridentCritArrow(false), trident_shot_from_crossbow: TridentShotFromCrossbow(false), @@ -8473,17 +8710,17 @@ impl Default for TropicalFishMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8580,17 +8817,17 @@ impl Default for TurtleMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8662,17 +8899,17 @@ impl Default for VexMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8743,17 +8980,17 @@ impl Default for VillagerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8824,17 +9061,17 @@ impl Default for VindicatorMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8899,17 +9136,17 @@ impl Default for WanderingTraderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8975,17 +9212,17 @@ impl Default for WardenMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9036,12 +9273,12 @@ impl Default for WindChargeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -9101,17 +9338,17 @@ impl Default for WitchMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9195,17 +9432,17 @@ impl Default for WitherMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9267,17 +9504,17 @@ impl Default for WitherSkeletonMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9333,12 +9570,12 @@ impl Default for WitherSkullMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, dangerous: Dangerous(false), } @@ -9351,6 +9588,8 @@ pub struct WolfInterested(pub bool); pub struct WolfCollarColor(pub i32); #[derive(Component, Deref, DerefMut, Clone)] pub struct WolfRemainingAngerTime(pub i32); +#[derive(Component, Deref, DerefMut, Clone)] +pub struct WolfVariant(pub azalea_registry::WolfVariant); #[derive(Component)] pub struct Wolf; impl Wolf { @@ -9369,6 +9608,9 @@ impl Wolf { 21 => { entity.insert(WolfRemainingAngerTime(d.value.into_int()?)); } + 22 => { + entity.insert(WolfVariant(d.value.into_wolf_variant()?)); + } _ => {} } Ok(()) @@ -9382,6 +9624,7 @@ pub struct WolfMetadataBundle { wolf_interested: WolfInterested, wolf_collar_color: WolfCollarColor, wolf_remaining_anger_time: WolfRemainingAngerTime, + wolf_variant: WolfVariant, } impl Default for WolfMetadataBundle { fn default() -> Self { @@ -9409,17 +9652,17 @@ impl Default for WolfMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9440,6 +9683,7 @@ impl Default for WolfMetadataBundle { wolf_interested: WolfInterested(false), wolf_collar_color: WolfCollarColor(Default::default()), wolf_remaining_anger_time: WolfRemainingAngerTime(0), + wolf_variant: WolfVariant(Default::default()), } } } @@ -9492,17 +9736,17 @@ impl Default for ZoglinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9573,17 +9817,17 @@ impl Default for ZombieMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9669,17 +9913,17 @@ impl Default for ZombieHorseMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9758,17 +10002,17 @@ impl Default for ZombieVillagerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9838,17 +10082,17 @@ impl Default for ZombifiedPiglinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9912,17 +10156,17 @@ impl Default for AbstractAgeableMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9980,17 +10224,17 @@ impl Default for AbstractAnimalMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10045,17 +10289,17 @@ impl Default for AbstractCreatureMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10144,12 +10388,12 @@ impl Default for AbstractEntityMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), } } } @@ -10199,17 +10443,17 @@ impl Default for AbstractInsentientMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10240,7 +10484,7 @@ impl AbstractLiving { entity.insert(Health(d.value.into_float()?)); } 10 => { - entity.insert(AbstractLivingEffectColor(d.value.into_int()?)); + entity.insert(EffectParticles(d.value.into_particles()?)); } 11 => { entity.insert(EffectAmbience(d.value.into_boolean()?)); @@ -10267,7 +10511,7 @@ pub struct AbstractLivingMetadataBundle { auto_spin_attack: AutoSpinAttack, abstract_living_using_item: AbstractLivingUsingItem, health: Health, - abstract_living_effect_color: AbstractLivingEffectColor, + effect_particles: EffectParticles, effect_ambience: EffectAmbience, arrow_count: ArrowCount, stinger_count: StingerCount, @@ -10287,17 +10531,17 @@ impl Default for AbstractLivingMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10364,12 +10608,12 @@ impl Default for AbstractMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -10421,17 +10665,17 @@ impl Default for AbstractMonsterMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10501,17 +10745,17 @@ impl Default for AbstractTameableMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10548,6 +10792,11 @@ pub fn apply_metadata( AreaEffectCloud::apply_metadata(entity, d)?; } } + azalea_registry::EntityKind::Armadillo => { + for d in items { + Armadillo::apply_metadata(entity, d)?; + } + } azalea_registry::EntityKind::ArmorStand => { for d in items { ArmorStand::apply_metadata(entity, d)?; @@ -10588,11 +10837,21 @@ pub fn apply_metadata( Boat::apply_metadata(entity, d)?; } } + azalea_registry::EntityKind::Bogged => { + for d in items { + Bogged::apply_metadata(entity, d)?; + } + } azalea_registry::EntityKind::Breeze => { for d in items { Breeze::apply_metadata(entity, d)?; } } + azalea_registry::EntityKind::BreezeWindCharge => { + for d in items { + BreezeWindCharge::apply_metadata(entity, d)?; + } + } azalea_registry::EntityKind::Camel => { for d in items { Camel::apply_metadata(entity, d)?; @@ -10888,6 +11147,11 @@ pub fn apply_metadata( Ocelot::apply_metadata(entity, d)?; } } + azalea_registry::EntityKind::OminousItemSpawner => { + for d in items { + OminousItemSpawner::apply_metadata(entity, d)?; + } + } azalea_registry::EntityKind::Painting => { for d in items { Painting::apply_metadata(entity, d)?; @@ -11183,6 +11447,9 @@ pub fn apply_default_metadata( azalea_registry::EntityKind::AreaEffectCloud => { entity.insert(AreaEffectCloudMetadataBundle::default()); } + azalea_registry::EntityKind::Armadillo => { + entity.insert(ArmadilloMetadataBundle::default()); + } azalea_registry::EntityKind::ArmorStand => { entity.insert(ArmorStandMetadataBundle::default()); } @@ -11207,9 +11474,15 @@ pub fn apply_default_metadata( azalea_registry::EntityKind::Boat => { entity.insert(BoatMetadataBundle::default()); } + azalea_registry::EntityKind::Bogged => { + entity.insert(BoggedMetadataBundle::default()); + } azalea_registry::EntityKind::Breeze => { entity.insert(BreezeMetadataBundle::default()); } + azalea_registry::EntityKind::BreezeWindCharge => { + entity.insert(BreezeWindChargeMetadataBundle::default()); + } azalea_registry::EntityKind::Camel => { entity.insert(CamelMetadataBundle::default()); } @@ -11387,6 +11660,9 @@ pub fn apply_default_metadata( azalea_registry::EntityKind::Ocelot => { entity.insert(OcelotMetadataBundle::default()); } + azalea_registry::EntityKind::OminousItemSpawner => { + entity.insert(OminousItemSpawnerMetadataBundle::default()); + } azalea_registry::EntityKind::Painting => { entity.insert(PaintingMetadataBundle::default()); } diff --git a/azalea-core/src/particle.rs b/azalea-entity/src/particle.rs similarity index 89% rename from azalea-core/src/particle.rs rename to azalea-entity/src/particle.rs index 4137d867..6d8c9fd9 100755 --- a/azalea-core/src/particle.rs +++ b/azalea-entity/src/particle.rs @@ -1,10 +1,10 @@ -use crate::position::BlockPos; use azalea_buf::McBuf; +use azalea_core::position::BlockPos; use azalea_inventory::ItemSlot; use azalea_registry::ParticleKind; +use bevy_ecs::component::Component; -#[cfg_attr(feature = "bevy_ecs", derive(bevy_ecs::component::Component))] -#[derive(Debug, Clone, McBuf, Default)] +#[derive(Component, Debug, Clone, McBuf, Default)] pub struct Particle { #[var] pub id: i32, @@ -13,15 +13,21 @@ pub struct Particle { #[derive(Clone, Debug, McBuf, Default)] pub enum ParticleData { - AmbientEntityEffect, AngryVillager, - Block(BlockParticle), BlockMarker(BlockParticle), + Block(BlockParticle), Bubble, + BubbleColumnUp, + BubblePop, + CampfireCosySmoke, + CampfireSignalSmoke, Cloud, + Composter, Crit, + CurrentDown, DamageIndicator, DragonBreath, + Dolphin, DrippingLava, FallingLava, LandingLava, @@ -38,31 +44,33 @@ pub enum ParticleData { EntityEffect, ExplosionEmitter, Explosion, - Gust, - GustEmitter, SonicBoom, FallingDust(BlockParticle), + Gust, + SmallGust, + GustEmitterLarge, + GustEmitterSmall, Firework, Fishing, Flame, - CherryLeaves, + Infested, SculkSoul, SculkCharge(SculkChargeParticle), SculkChargePop, - SoulFireFlame, Soul, + SoulFireFlame, Flash, HappyVillager, - Composter, Heart, InstantEffect, Item(ItemParticle), - Vibration(VibrationParticle), ItemSlime, + ItemCobweb, ItemSnowball, LargeSmoke, Lava, Mycelium, + Nautilus, Note, Poof, Portal, @@ -70,40 +78,35 @@ pub enum ParticleData { Smoke, WhiteSmoke, Sneeze, + Snowflake, Spit, - SquidInk, SweepAttack, TotemOfUndying, + SquidInk, Underwater, Splash, Witch, - BubblePop, - CurrentDown, - BubbleColumnUp, - Nautilus, - Dolphin, - CampfireCozySmoke, - CampfireSignalSmoke, DrippingHoney, FallingHoney, LandingHoney, FallingNectar, FallingSporeBlossom, + SporeBlossomAir, Ash, CrimsonSpore, WarpedSpore, - SporeBlossomAir, DrippingObsidianTear, FallingObsidianTear, LandingObsidianTear, ReversePortal, WhiteAsh, SmallFlame, - Snowflake, - DrippingDripstoneLava, - FallingDripstoneLava, DrippingDripstoneWater, FallingDripstoneWater, + CherryLeaves, + DrippingDripstoneLava, + FallingDripstoneLava, + Vibration(VibrationParticle), GlowSquidInk, Glow, WaxOn, @@ -113,8 +116,13 @@ pub enum ParticleData { Shriek(ShriekParticle), EggCrack, DustPlume, - GustDust, TrialSpawnerDetection, + TrialSpawnerDetectionOminous, + VaultConnection, + DustPillar, + RaidOmen, + TrialOmen, + OminousSpawning, } impl From for ParticleData { @@ -124,7 +132,6 @@ impl From for ParticleData { // this is mostly just here so it fails to compile when a new particle is added // to ParticleKind, since ParticleData has to be updated manually match kind { - ParticleKind::AmbientEntityEffect => Self::AmbientEntityEffect, ParticleKind::AngryVillager => Self::AngryVillager, ParticleKind::Block => Self::Block(BlockParticle::default()), ParticleKind::BlockMarker => Self::BlockMarker(BlockParticle::default()), @@ -151,7 +158,6 @@ impl From for ParticleData { ParticleKind::ExplosionEmitter => Self::ExplosionEmitter, ParticleKind::Explosion => Self::Explosion, ParticleKind::Gust => Self::Gust, - ParticleKind::GustEmitter => Self::GustEmitter, ParticleKind::SonicBoom => Self::SonicBoom, ParticleKind::FallingDust => Self::FallingDust(BlockParticle::default()), ParticleKind::Firework => Self::Firework, @@ -194,7 +200,7 @@ impl From for ParticleData { ParticleKind::BubbleColumnUp => Self::BubbleColumnUp, ParticleKind::Nautilus => Self::Nautilus, ParticleKind::Dolphin => Self::Dolphin, - ParticleKind::CampfireCosySmoke => Self::CampfireCozySmoke, + ParticleKind::CampfireCosySmoke => Self::CampfireCosySmoke, ParticleKind::CampfireSignalSmoke => Self::CampfireSignalSmoke, ParticleKind::DrippingHoney => Self::DrippingHoney, ParticleKind::FallingHoney => Self::FallingHoney, @@ -225,8 +231,18 @@ impl From for ParticleData { ParticleKind::Shriek => Self::Shriek(ShriekParticle::default()), ParticleKind::EggCrack => Self::EggCrack, ParticleKind::DustPlume => Self::DustPlume, - ParticleKind::GustDust => Self::GustDust, + ParticleKind::SmallGust => Self::SmallGust, + ParticleKind::GustEmitterLarge => Self::GustEmitterLarge, + ParticleKind::GustEmitterSmall => Self::GustEmitterSmall, + ParticleKind::Infested => Self::Infested, + ParticleKind::ItemCobweb => Self::ItemCobweb, ParticleKind::TrialSpawnerDetection => Self::TrialSpawnerDetection, + ParticleKind::TrialSpawnerDetectionOminous => Self::TrialSpawnerDetectionOminous, + ParticleKind::VaultConnection => Self::VaultConnection, + ParticleKind::DustPillar => Self::DustPillar, + ParticleKind::OminousSpawning => Self::OminousSpawning, + ParticleKind::RaidOmen => Self::RaidOmen, + ParticleKind::TrialOmen => Self::TrialOmen, } } } diff --git a/azalea-inventory/Cargo.toml b/azalea-inventory/Cargo.toml index 3f768a11..84f3cec1 100644 --- a/azalea-inventory/Cargo.toml +++ b/azalea-inventory/Cargo.toml @@ -13,3 +13,6 @@ simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } azalea-buf = { version = "0.9.0", path = "../azalea-buf" } azalea-inventory-macros = { version = "0.9.0", path = "./azalea-inventory-macros" } azalea-registry = { version = "0.9.0", path = "../azalea-registry" } +azalea-chat = { version = "0.9.0", path = "../azalea-chat" } +azalea-core = { version = "0.9.0", path = "../azalea-core" } +uuid = "1.8.0" diff --git a/azalea-inventory/README.md b/azalea-inventory/README.md deleted file mode 100644 index 67030f6a..00000000 --- a/azalea-inventory/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Representations of various inventory data structures in Minecraft. - diff --git a/azalea-inventory/azalea-inventory-macros/src/parse_macro.rs b/azalea-inventory/azalea-inventory-macros/src/parse_macro.rs index 20c2ddc3..de1ec972 100644 --- a/azalea-inventory/azalea-inventory-macros/src/parse_macro.rs +++ b/azalea-inventory/azalea-inventory-macros/src/parse_macro.rs @@ -1,5 +1,5 @@ use syn::{ - braced, + braced, parse::{Parse, ParseStream, Result}, Ident, LitInt, Token, }; diff --git a/azalea-inventory/src/components.rs b/azalea-inventory/src/components.rs new file mode 100644 index 00000000..6f9ea527 --- /dev/null +++ b/azalea-inventory/src/components.rs @@ -0,0 +1,656 @@ +use core::f64; +use std::{any::Any, collections::HashMap, io::Cursor}; + +use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable}; +use azalea_chat::FormattedText; +use azalea_core::{position::GlobalPos, resource_location::ResourceLocation}; +use azalea_registry::{ + Attribute, Block, DataComponentKind, Enchantment, HolderSet, Item, MobEffect, Potion, + TrimMaterial, TrimPattern, +}; +use simdnbt::owned::{Nbt, NbtCompound}; +use uuid::Uuid; + +use crate::ItemSlot; + +pub trait DataComponent: Send + Sync + Any {} + +pub trait EncodableDataComponent: Send + Sync + Any { + fn encode(&self, buf: &mut Vec) -> Result<(), std::io::Error>; + // using the Clone trait makes it not be object-safe, so we have our own clone + // function instead + fn clone(&self) -> Box; + // same deal here + fn eq(&self, other: Box) -> bool; +} + +impl EncodableDataComponent for T +where + T: DataComponent + Clone + McBufWritable + McBufReadable + PartialEq, +{ + fn encode(&self, buf: &mut Vec) -> Result<(), std::io::Error> { + self.write_into(buf) + } + fn clone(&self) -> Box { + let cloned = self.clone(); + Box::new(cloned) + } + fn eq(&self, other: Box) -> bool { + let other_any: Box = other; + if let Some(other) = other_any.downcast_ref::() { + self == other + } else { + false + } + } +} + +pub fn from_kind( + kind: azalea_registry::DataComponentKind, + buf: &mut Cursor<&[u8]>, +) -> Result, BufReadError> { + Ok(match kind { + DataComponentKind::CustomData => Box::new(CustomData::read_from(buf)?), + DataComponentKind::MaxStackSize => Box::new(MaxStackSize::read_from(buf)?), + DataComponentKind::MaxDamage => Box::new(MaxDamage::read_from(buf)?), + DataComponentKind::Damage => Box::new(Damage::read_from(buf)?), + DataComponentKind::Unbreakable => Box::new(Unbreakable::read_from(buf)?), + DataComponentKind::CustomName => Box::new(CustomName::read_from(buf)?), + DataComponentKind::ItemName => Box::new(ItemName::read_from(buf)?), + DataComponentKind::Lore => Box::new(Lore::read_from(buf)?), + DataComponentKind::Rarity => Box::new(Rarity::read_from(buf)?), + DataComponentKind::Enchantments => Box::new(Enchantments::read_from(buf)?), + DataComponentKind::CanPlaceOn => Box::new(CanPlaceOn::read_from(buf)?), + DataComponentKind::CanBreak => Box::new(CanBreak::read_from(buf)?), + DataComponentKind::AttributeModifiers => Box::new(AttributeModifiers::read_from(buf)?), + DataComponentKind::CustomModelData => Box::new(CustomModelData::read_from(buf)?), + DataComponentKind::HideAdditionalTooltip => { + Box::new(HideAdditionalTooltip::read_from(buf)?) + } + DataComponentKind::HideTooltip => Box::new(HideTooltip::read_from(buf)?), + DataComponentKind::RepairCost => Box::new(RepairCost::read_from(buf)?), + DataComponentKind::CreativeSlotLock => Box::new(CreativeSlotLock::read_from(buf)?), + DataComponentKind::EnchantmentGlintOverride => { + Box::new(EnchantmentGlintOverride::read_from(buf)?) + } + DataComponentKind::IntangibleProjectile => Box::new(IntangibleProjectile::read_from(buf)?), + DataComponentKind::Food => Box::new(Food::read_from(buf)?), + DataComponentKind::FireResistant => Box::new(FireResistant::read_from(buf)?), + DataComponentKind::Tool => Box::new(Tool::read_from(buf)?), + DataComponentKind::StoredEnchantments => Box::new(StoredEnchantments::read_from(buf)?), + DataComponentKind::DyedColor => Box::new(DyedColor::read_from(buf)?), + DataComponentKind::MapColor => Box::new(MapColor::read_from(buf)?), + DataComponentKind::MapId => Box::new(MapId::read_from(buf)?), + DataComponentKind::MapDecorations => Box::new(MapDecorations::read_from(buf)?), + DataComponentKind::MapPostProcessing => Box::new(MapPostProcessing::read_from(buf)?), + DataComponentKind::ChargedProjectiles => Box::new(ChargedProjectiles::read_from(buf)?), + DataComponentKind::BundleContents => Box::new(BundleContents::read_from(buf)?), + DataComponentKind::PotionContents => Box::new(PotionContents::read_from(buf)?), + DataComponentKind::SuspiciousStewEffects => { + Box::new(SuspiciousStewEffects::read_from(buf)?) + } + DataComponentKind::WritableBookContent => Box::new(WritableBookContent::read_from(buf)?), + DataComponentKind::WrittenBookContent => Box::new(WrittenBookContent::read_from(buf)?), + DataComponentKind::Trim => Box::new(Trim::read_from(buf)?), + DataComponentKind::DebugStickState => Box::new(DebugStickState::read_from(buf)?), + DataComponentKind::EntityData => Box::new(EntityData::read_from(buf)?), + DataComponentKind::BucketEntityData => Box::new(BucketEntityData::read_from(buf)?), + DataComponentKind::BlockEntityData => Box::new(BlockEntityData::read_from(buf)?), + DataComponentKind::Instrument => Box::new(Instrument::read_from(buf)?), + DataComponentKind::OminousBottleAmplifier => { + Box::new(OminousBottleAmplifier::read_from(buf)?) + } + DataComponentKind::Recipes => Box::new(Recipes::read_from(buf)?), + DataComponentKind::LodestoneTracker => Box::new(LodestoneTracker::read_from(buf)?), + DataComponentKind::FireworkExplosion => Box::new(FireworkExplosion::read_from(buf)?), + DataComponentKind::Fireworks => Box::new(Fireworks::read_from(buf)?), + DataComponentKind::Profile => Box::new(Profile::read_from(buf)?), + DataComponentKind::NoteBlockSound => Box::new(NoteBlockSound::read_from(buf)?), + DataComponentKind::BannerPatterns => Box::new(BannerPatterns::read_from(buf)?), + DataComponentKind::BaseColor => Box::new(BaseColor::read_from(buf)?), + DataComponentKind::PotDecorations => Box::new(PotDecorations::read_from(buf)?), + DataComponentKind::Container => Box::new(Container::read_from(buf)?), + DataComponentKind::BlockState => Box::new(BlockState::read_from(buf)?), + DataComponentKind::Bees => Box::new(Bees::read_from(buf)?), + DataComponentKind::Lock => Box::new(Lock::read_from(buf)?), + DataComponentKind::ContainerLoot => Box::new(ContainerLoot::read_from(buf)?), + }) +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CustomData { + pub nbt: Nbt, +} +impl DataComponent for CustomData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MaxStackSize { + #[var] + pub count: i32, +} +impl DataComponent for MaxStackSize {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MaxDamage { + #[var] + pub amount: i32, +} +impl DataComponent for MaxDamage {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Damage { + #[var] + pub amount: i32, +} + +impl DataComponent for Damage {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Unbreakable { + pub show_in_tooltip: bool, +} +impl DataComponent for Unbreakable {} +impl Default for Unbreakable { + fn default() -> Self { + Self { + show_in_tooltip: true, + } + } +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CustomName { + pub name: FormattedText, +} +impl DataComponent for CustomName {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct ItemName { + pub name: FormattedText, +} +impl DataComponent for ItemName {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Lore { + pub lines: Vec, + // vanilla also has styled_lines here but it doesn't appear to be used for the protocol +} +impl DataComponent for Lore {} + +#[derive(Clone, PartialEq, Copy, McBuf)] +pub enum Rarity { + Common, + Uncommon, + Rare, + Epic, +} +impl DataComponent for Rarity {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Enchantments { + #[var] + pub levels: HashMap, + pub show_in_tooltip: bool, +} +impl DataComponent for Enchantments {} + +#[derive(Clone, PartialEq, McBuf)] +pub enum BlockStateValueMatcher { + Exact { + value: String, + }, + Range { + min: Option, + max: Option, + }, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BlockStatePropertyMatcher { + pub name: String, + pub value_matcher: BlockStateValueMatcher, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BlockPredicate { + pub blocks: Option>, + pub properties: Option>, + pub nbt: Option, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct AdventureModePredicate { + pub predicates: Vec, + pub show_in_tooltip: bool, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CanPlaceOn { + pub predicate: AdventureModePredicate, +} +impl DataComponent for CanPlaceOn {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CanBreak { + pub predicate: AdventureModePredicate, +} +impl DataComponent for CanBreak {} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum EquipmentSlotGroup { + Any, + Mainhand, + Offhand, + Hand, + Feet, + Legs, + Chest, + Head, + Armor, + Body, +} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum AttributeModifierOperation { + Addition, + MultiplyBase, + MultiplyTotal, +} + +// this is duplicated in azalea-entity, BUT the one there has a different +// protocol format (and we can't use it anyways because it would cause a +// circular dependency) +#[derive(Clone, PartialEq, McBuf)] +pub struct AttributeModifier { + pub uuid: Uuid, + pub name: String, + pub amount: f64, + pub operation: AttributeModifierOperation, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct AttributeModifiersEntry { + pub attribute: Attribute, + pub modifier: AttributeModifier, + pub slot: EquipmentSlotGroup, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct AttributeModifiers { + pub modifiers: Vec, + pub show_in_tooltip: bool, +} +impl DataComponent for AttributeModifiers {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CustomModelData { + #[var] + pub value: i32, +} +impl DataComponent for CustomModelData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct HideAdditionalTooltip; +impl DataComponent for HideAdditionalTooltip {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct HideTooltip; +impl DataComponent for HideTooltip {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct RepairCost { + #[var] + pub cost: u32, +} +impl DataComponent for RepairCost {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CreativeSlotLock; +impl DataComponent for CreativeSlotLock {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct EnchantmentGlintOverride { + pub show_glint: bool, +} +impl DataComponent for EnchantmentGlintOverride {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct IntangibleProjectile; +impl DataComponent for IntangibleProjectile {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MobEffectDetails { + #[var] + pub amplifier: i32, + #[var] + pub duration: i32, + pub ambient: bool, + pub show_particles: bool, + pub show_icon: bool, + pub hidden_effect: Option>, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MobEffectInstance { + pub effect: MobEffect, + pub details: MobEffectDetails, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct PossibleEffect { + pub effect: MobEffectInstance, + pub probability: f32, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Food { + #[var] + pub nutrition: i32, + pub saturation: f32, + pub can_always_eat: bool, + pub eat_seconds: f32, + pub effects: Vec, +} +impl DataComponent for Food {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct FireResistant; +impl DataComponent for FireResistant {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct ToolRule { + pub blocks: Vec, + pub speed: Option, + pub correct_for_drops: Option, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Tool { + pub rules: Vec, + pub default_mining_speed: f32, + #[var] + pub damage_per_block: i32, +} +impl DataComponent for Tool {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct StoredEnchantments { + #[var] + pub enchantments: HashMap, + pub show_in_tooltip: bool, +} +impl DataComponent for StoredEnchantments {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct DyedColor { + pub rgb: i32, + pub show_in_tooltip: bool, +} +impl DataComponent for DyedColor {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MapColor { + pub color: i32, +} +impl DataComponent for MapColor {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MapId { + #[var] + pub id: i32, +} +impl DataComponent for MapId {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MapDecorations { + pub decorations: NbtCompound, +} +impl DataComponent for MapDecorations {} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum MapPostProcessing { + Lock, + Scale, +} +impl DataComponent for MapPostProcessing {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct ChargedProjectiles { + pub items: Vec, +} +impl DataComponent for ChargedProjectiles {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BundleContents { + pub items: Vec, +} +impl DataComponent for BundleContents {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct PotionContents { + pub potion: Option, + pub custom_color: Option, + pub custom_effects: Vec, +} +impl DataComponent for PotionContents {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct SuspiciousStewEffect { + pub effect: MobEffect, + #[var] + pub duration: i32, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct SuspiciousStewEffects { + pub effects: Vec, +} +impl DataComponent for SuspiciousStewEffects {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct WritableBookContent { + pub pages: Vec, +} +impl DataComponent for WritableBookContent {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct WrittenBookContent { + pub title: String, + pub author: String, + #[var] + pub generation: i32, + pub pages: Vec, + pub resolved: bool, +} +impl DataComponent for WrittenBookContent {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Trim { + pub material: TrimMaterial, + pub pattern: TrimPattern, + pub show_in_tooltip: bool, +} +impl DataComponent for Trim {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct DebugStickState { + pub properties: NbtCompound, +} +impl DataComponent for DebugStickState {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct EntityData { + pub entity: NbtCompound, +} +impl DataComponent for EntityData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BucketEntityData { + pub entity: NbtCompound, +} +impl DataComponent for BucketEntityData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BlockEntityData { + pub entity: NbtCompound, +} +impl DataComponent for BlockEntityData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Instrument { + pub instrument: azalea_registry::Instrument, +} +impl DataComponent for Instrument {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct OminousBottleAmplifier { + #[var] + pub amplifier: i32, +} +impl DataComponent for OminousBottleAmplifier {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Recipes { + pub recipes: Vec, +} +impl DataComponent for Recipes {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct LodestoneTracker { + pub target: Option, + pub tracked: bool, +} +impl DataComponent for LodestoneTracker {} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum FireworkExplosionShape { + SmallBall, + LargeBall, + Star, + Creeper, + Burst, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct FireworkExplosion { + pub shape: FireworkExplosionShape, + pub colors: Vec, + pub fade_colors: Vec, + pub has_trail: bool, + pub has_twinkle: bool, +} +impl DataComponent for FireworkExplosion {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Fireworks { + #[var] + pub flight_duration: i32, + pub explosions: Vec, +} +impl DataComponent for Fireworks {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct GameProfileProperty { + pub name: String, + pub value: String, + pub signature: Option, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Profile { + pub name: String, + pub id: Option, + pub properties: Vec, +} +impl DataComponent for Profile {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct NoteBlockSound { + pub sound: ResourceLocation, +} +impl DataComponent for NoteBlockSound {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BannerPattern { + #[var] + pub pattern: i32, + #[var] + pub color: i32, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BannerPatterns { + pub patterns: Vec, +} +impl DataComponent for BannerPatterns {} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum DyeColor { + White, + Orange, + Magenta, + LightBlue, + Yellow, + Lime, + Pink, + Gray, + LightGray, + Cyan, + Purple, + Blue, + Brown, + Green, + Red, + Black, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BaseColor { + pub color: DyeColor, +} +impl DataComponent for BaseColor {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct PotDecorations { + pub items: Vec, +} +impl DataComponent for PotDecorations {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Container { + pub items: Vec, +} +impl DataComponent for Container {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BlockState { + pub properties: HashMap, +} +impl DataComponent for BlockState {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BeehiveOccupant { + pub entity_data: NbtCompound, + #[var] + pub ticks_in_hive: i32, + #[var] + pub min_ticks_in_hive: i32, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Bees { + pub occupants: Vec, +} +impl DataComponent for Bees {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Lock { + pub key: String, +} +impl DataComponent for Lock {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct ContainerLoot { + pub loot: NbtCompound, +} +impl DataComponent for ContainerLoot {} diff --git a/azalea-inventory/src/item/mod.rs b/azalea-inventory/src/item/mod.rs index 0ad7b2c0..862cd20e 100644 --- a/azalea-inventory/src/item/mod.rs +++ b/azalea-inventory/src/item/mod.rs @@ -5,7 +5,7 @@ pub trait MaxStackSizeExt { /// [`ItemSlotData`]. /// /// [`ItemSlotData`]: crate::ItemSlotData - fn max_stack_size(&self) -> i8; + fn max_stack_size(&self) -> i32; /// Whether this item can be stacked with other items. /// @@ -16,7 +16,7 @@ pub trait MaxStackSizeExt { } impl MaxStackSizeExt for azalea_registry::Item { - fn max_stack_size(&self) -> i8 { + fn max_stack_size(&self) -> i32 { // TODO: have the properties for every item defined somewhere 64 } diff --git a/azalea-inventory/src/lib.rs b/azalea-inventory/src/lib.rs index b2ea215a..ba14eff8 100644 --- a/azalea-inventory/src/lib.rs +++ b/azalea-inventory/src/lib.rs @@ -1,5 +1,7 @@ -#![doc = include_str!("../README.md")] +#![feature(trait_upcasting)] +/// Representations of various inventory data structures in Minecraft. +pub mod components; pub mod item; pub mod operations; mod slot; diff --git a/azalea-inventory/src/operations.rs b/azalea-inventory/src/operations.rs index ca21a3e7..652d1900 100644 --- a/azalea-inventory/src/operations.rs +++ b/azalea-inventory/src/operations.rs @@ -621,7 +621,7 @@ impl Menu { } /// Get the maximum number of items that can be placed in this slot. - pub fn max_stack_size(&self, _target_slot_index: usize) -> u8 { + pub fn max_stack_size(&self, _target_slot_index: usize) -> u32 { 64 } @@ -671,9 +671,11 @@ impl Menu { let target_slot = self.slot(target_slot_index).unwrap(); if let ItemSlot::Present(target_item) = target_slot { // the target slot is empty, so we can just move the item there - if self.may_place(target_slot_index, item) && target_item.is_same_item_and_nbt(item) { + if self.may_place(target_slot_index, item) + && target_item.is_same_item_and_components(item) + { let slot_item_limit = self.max_stack_size(target_slot_index); - let new_target_slot_data = item.split(u8::min(slot_item_limit, item.count as u8)); + let new_target_slot_data = item.split(u32::min(slot_item_limit, item.count as u32)); // get the target slot again but mut this time so we can update it let target_slot = self.slot_mut(target_slot_index).unwrap(); @@ -691,7 +693,7 @@ impl Menu { let target_slot = self.slot(target_slot_index).unwrap(); if target_slot.is_empty() && self.may_place(target_slot_index, item) { let slot_item_limit = self.max_stack_size(target_slot_index); - let new_target_slot_data = item.split(u8::min(slot_item_limit, item.count as u8)); + let new_target_slot_data = item.split(u32::min(slot_item_limit, item.count as u32)); let target_slot = self.slot_mut(target_slot_index).unwrap(); *target_slot = ItemSlot::Present(new_target_slot_data); diff --git a/azalea-inventory/src/slot.rs b/azalea-inventory/src/slot.rs index c4f8da05..9aa33263 100644 --- a/azalea-inventory/src/slot.rs +++ b/azalea-inventory/src/slot.rs @@ -1,6 +1,12 @@ -use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable}; -use simdnbt::owned::Nbt; -use std::io::{Cursor, Write}; +use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable}; +use azalea_registry::DataComponentKind; +use std::{ + collections::HashMap, + fmt, + io::{Cursor, Write}, +}; + +use crate::components::{self}; /// Either an item in an inventory or nothing. #[derive(Debug, Clone, Default, PartialEq)] @@ -33,7 +39,7 @@ impl ItemSlot { /// /// Note that it's possible for the count to be zero or negative when the /// slot is present. - pub fn count(&self) -> i8 { + pub fn count(&self) -> i32 { match self { ItemSlot::Empty => 0, ItemSlot::Present(i) => i.count, @@ -41,7 +47,7 @@ impl ItemSlot { } /// Remove `count` items from this slot, returning the removed items. - pub fn split(&mut self, count: u8) -> ItemSlot { + pub fn split(&mut self, count: u32) -> ItemSlot { match self { ItemSlot::Empty => ItemSlot::Empty, ItemSlot::Present(i) => { @@ -83,20 +89,20 @@ impl ItemSlot { /// An item in an inventory, with a count and NBT. Usually you want [`ItemSlot`] /// or [`azalea_registry::Item`] instead. -#[derive(Debug, Clone, McBuf, PartialEq)] +#[derive(Debug, Clone, PartialEq)] pub struct ItemSlotData { - pub kind: azalea_registry::Item, /// The amount of the item in this slot. /// /// The count can be zero or negative, but this is rare. - pub count: i8, - pub nbt: Nbt, + pub count: i32, + pub kind: azalea_registry::Item, + pub components: DataComponentPatch, } impl ItemSlotData { /// Remove `count` items from this slot, returning the removed items. - pub fn split(&mut self, count: u8) -> ItemSlotData { - let returning_count = i8::min(count as i8, self.count); + pub fn split(&mut self, count: u32) -> ItemSlotData { + let returning_count = i32::min(count as i32, self.count); let mut returning = self.clone(); returning.count = returning_count; self.count -= returning_count; @@ -116,39 +122,161 @@ impl ItemSlotData { /// let mut a = ItemSlotData { /// kind: Item::Stone, /// count: 1, - /// nbt: Default::default(), + /// components: Default::default(), /// }; /// let mut b = ItemSlotData { /// kind: Item::Stone, /// count: 2, - /// nbt: Default::default(), + /// components: Default::default(), /// }; - /// assert!(a.is_same_item_and_nbt(&b)); + /// assert!(a.is_same_item_and_components(&b)); /// /// b.kind = Item::Dirt; - /// assert!(!a.is_same_item_and_nbt(&b)); + /// assert!(!a.is_same_item_and_components(&b)); /// ``` - pub fn is_same_item_and_nbt(&self, other: &ItemSlotData) -> bool { - self.kind == other.kind && self.nbt == other.nbt + pub fn is_same_item_and_components(&self, other: &ItemSlotData) -> bool { + self.kind == other.kind && self.components == other.components } } impl McBufReadable for ItemSlot { fn read_from(buf: &mut Cursor<&[u8]>) -> Result { - let slot = Option::::read_from(buf)?; - Ok(slot.map_or(ItemSlot::Empty, ItemSlot::Present)) + let count = i32::var_read_from(buf)?; + if count <= 0 { + Ok(ItemSlot::Empty) + } else { + let kind = azalea_registry::Item::read_from(buf)?; + let components = DataComponentPatch::read_from(buf)?; + Ok(ItemSlot::Present(ItemSlotData { + count, + kind, + components, + })) + } } } impl McBufWritable for ItemSlot { fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { match self { - ItemSlot::Empty => false.write_into(buf)?, + ItemSlot::Empty => 0.var_write_into(buf)?, ItemSlot::Present(i) => { - true.write_into(buf)?; - i.write_into(buf)?; + i.count.var_write_into(buf)?; + i.kind.write_into(buf)?; + i.components.write_into(buf)?; } }; Ok(()) } } + +#[derive(Default)] +pub struct DataComponentPatch { + components: HashMap>>, +} + +impl DataComponentPatch { + pub fn get(&self, kind: DataComponentKind) -> Option<&dyn components::EncodableDataComponent> { + self.components.get(&kind).and_then(|c| c.as_deref()) + } +} + +impl McBufReadable for DataComponentPatch { + fn read_from(buf: &mut Cursor<&[u8]>) -> Result { + let components_with_data_count = u32::var_read_from(buf)?; + let components_without_data_count = u32::var_read_from(buf)?; + + if components_without_data_count == 0 && components_with_data_count == 0 { + return Ok(DataComponentPatch::default()); + } + + let mut components = HashMap::new(); + for _ in 0..components_with_data_count { + let component_kind = DataComponentKind::read_from(buf)?; + let component_data = components::from_kind(component_kind, buf)?; + components.insert(component_kind, Some(component_data)); + } + + for _ in 0..components_without_data_count { + let component_kind = DataComponentKind::read_from(buf)?; + components.insert(component_kind, None); + } + + Ok(DataComponentPatch { components }) + } +} + +impl McBufWritable for DataComponentPatch { + fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { + let mut components_with_data_count = 0; + let mut components_without_data_count = 0; + for component in self.components.values() { + if component.is_some() { + components_with_data_count += 1; + } else { + components_without_data_count += 1; + } + } + + components_with_data_count.write_into(buf)?; + components_without_data_count.write_into(buf)?; + + for (kind, component) in &self.components { + if let Some(component) = component { + kind.write_into(buf)?; + let mut component_buf = Vec::new(); + component.encode(&mut component_buf).unwrap(); + component_buf.write_into(buf)?; + } + } + + for (kind, component) in &self.components { + if component.is_none() { + kind.write_into(buf)?; + } + } + + Ok(()) + } +} + +impl Clone for DataComponentPatch { + fn clone(&self) -> Self { + let mut components = HashMap::with_capacity(self.components.len()); + for (kind, component) in &self.components { + components.insert(*kind, component.as_ref().map(|c| (*c).clone())); + } + DataComponentPatch { components } + } +} +impl fmt::Debug for DataComponentPatch { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_set().entries(self.components.keys()).finish() + } +} +impl PartialEq for DataComponentPatch { + fn eq(&self, other: &Self) -> bool { + if self.components.len() != other.components.len() { + return false; + } + for (kind, component) in &self.components { + if let Some(other_component) = other.components.get(kind) { + // we can't use PartialEq, but we can use our own eq method + if let Some(component) = component { + if let Some(other_component) = other_component { + if !component.eq((*other_component).clone()) { + return false; + } + } else { + return false; + } + } else if other_component.is_some() { + return false; + } + } else { + return false; + } + } + true + } +} diff --git a/azalea-language/src/en_us.json b/azalea-language/src/en_us.json index 85ae1990..95f56701 100755 --- a/azalea-language/src/en_us.json +++ b/azalea-language/src/en_us.json @@ -18,10 +18,16 @@ "advancements.adventure.arbalistic.title": "Arbalistic", "advancements.adventure.avoid_vibration.description": "Sneak near a Sculk Sensor or Warden to prevent it from detecting you", "advancements.adventure.avoid_vibration.title": "Sneak 100", + "advancements.adventure.blowback.description": "Kill a Breeze with a deflected Breeze-shot Wind Charge", + "advancements.adventure.blowback.title": "Blowback", + "advancements.adventure.brush_armadillo.description": "Get Armadillo Scutes from an Armadillo using a Brush", + "advancements.adventure.brush_armadillo.title": "Isn't It Scute?", "advancements.adventure.bullseye.description": "Hit the bullseye of a Target block from at least 30 meters away", "advancements.adventure.bullseye.title": "Bullseye", "advancements.adventure.craft_decorated_pot_using_only_sherds.description": "Make a Decorated Pot out of 4 Pottery Sherds", "advancements.adventure.craft_decorated_pot_using_only_sherds.title": "Careful Restoration", + "advancements.adventure.crafters_crafting_crafters.description": "Be near a Crafter when it crafts a Crafter", + "advancements.adventure.crafters_crafting_crafters.title": "Crafters Crafting Crafters", "advancements.adventure.fall_from_world_height.description": "Free fall from the top of the world (build limit) to the bottom of the world and survive", "advancements.adventure.fall_from_world_height.title": "Caves & Cliffs", "advancements.adventure.hero_of_the_village.description": "Successfully defend a village from a raid", @@ -34,14 +40,22 @@ "advancements.adventure.kill_all_mobs.title": "Monsters Hunted", "advancements.adventure.kill_mob_near_sculk_catalyst.description": "Kill a mob near a Sculk Catalyst", "advancements.adventure.kill_mob_near_sculk_catalyst.title": "It Spreads", + "advancements.adventure.lighten_up.description": "Scrape a Copper Bulb with an Axe to make it brighter", + "advancements.adventure.lighten_up.title": "Lighten Up", "advancements.adventure.lightning_rod_with_villager_no_fire.description": "Protect a Villager from an undesired shock without starting a fire", "advancements.adventure.lightning_rod_with_villager_no_fire.title": "Surge Protector", + "advancements.adventure.minecraft_trials_edition.description": "Step foot in a Trial Chamber", + "advancements.adventure.minecraft_trials_edition.title": "Minecraft: Trial(s) Edition", "advancements.adventure.ol_betsy.description": "Shoot a Crossbow", "advancements.adventure.ol_betsy.title": "Ol' Betsy", + "advancements.adventure.overoverkill.description": "Deal 50 hearts of damage in a single hit using the Mace", + "advancements.adventure.overoverkill.title": "Over-Overkill", "advancements.adventure.play_jukebox_in_meadows.description": "Make the Meadows come alive with the sound of music from a Jukebox", "advancements.adventure.play_jukebox_in_meadows.title": "Sound of Music", "advancements.adventure.read_power_from_chiseled_bookshelf.description": "Read the power signal of a Chiseled Bookshelf using a Comparator", "advancements.adventure.read_power_from_chiseled_bookshelf.title": "The Power of Books", + "advancements.adventure.revaulting.description": "Unlock an Ominous Vault with an Ominous Trial Key", + "advancements.adventure.revaulting.title": "Revaulting", "advancements.adventure.root.description": "Adventure, exploration and combat", "advancements.adventure.root.title": "Adventure", "advancements.adventure.salvage_sherd.description": "Brush a Suspicious block to obtain a Pottery Sherd", @@ -74,12 +88,16 @@ "advancements.adventure.trim_with_any_armor_pattern.title": "Crafting a New Look", "advancements.adventure.two_birds_one_arrow.description": "Kill two Phantoms with a piercing Arrow", "advancements.adventure.two_birds_one_arrow.title": "Two Birds, One Arrow", + "advancements.adventure.under_lock_and_key.description": "Unlock a Vault with a Trial Key", + "advancements.adventure.under_lock_and_key.title": "Under Lock and Key", "advancements.adventure.very_very_frightening.description": "Strike a Villager with lightning", "advancements.adventure.very_very_frightening.title": "Very Very Frightening", "advancements.adventure.voluntary_exile.description": "Kill a raid captain.\nMaybe consider staying away from villages for the time being...", "advancements.adventure.voluntary_exile.title": "Voluntary Exile", "advancements.adventure.walk_on_powder_snow_with_leather_boots.description": "Walk on Powder Snow... without sinking in it", "advancements.adventure.walk_on_powder_snow_with_leather_boots.title": "Light as a Rabbit", + "advancements.adventure.who_needs_rockets.description": "Use a Wind Charge to launch yourself upward 8 blocks", + "advancements.adventure.who_needs_rockets.title": "Who Needs Rockets?", "advancements.adventure.whos_the_pillager_now.description": "Give a Pillager a taste of their own medicine", "advancements.adventure.whos_the_pillager_now.title": "Who's the Pillager Now?", "advancements.empty": "There doesn't seem to be anything here...", @@ -135,6 +153,10 @@ "advancements.husbandry.plant_any_sniffer_seed.title": "Planting the Past", "advancements.husbandry.plant_seed.description": "Plant a seed and watch it grow", "advancements.husbandry.plant_seed.title": "A Seedy Place", + "advancements.husbandry.remove_wolf_armor.description": "Remove Wolf Armor from a Wolf using Shears", + "advancements.husbandry.remove_wolf_armor.title": "Shear Brilliance", + "advancements.husbandry.repair_wolf_armor.description": "Repair a damaged Wolf Armor using Armadillo Scutes", + "advancements.husbandry.repair_wolf_armor.title": "Good as New", "advancements.husbandry.ride_a_boat_with_a_goat.description": "Get in a Boat and float with a Goat", "advancements.husbandry.ride_a_boat_with_a_goat.title": "Whatever Floats Your Goat!", "advancements.husbandry.root.description": "The world is full of friends and food", @@ -153,6 +175,8 @@ "advancements.husbandry.wax_off.title": "Wax Off", "advancements.husbandry.wax_on.description": "Apply Honeycomb to a Copper block!", "advancements.husbandry.wax_on.title": "Wax On", + "advancements.husbandry.whole_pack.description": "Tame one of each Wolf variant", + "advancements.husbandry.whole_pack.title": "The Whole Pack", "advancements.nether.all_effects.description": "Have every effect applied at the same time", "advancements.nether.all_effects.title": "How Did We Get Here?", "advancements.nether.all_potions.description": "Have every potion effect applied at the same time", @@ -332,6 +356,7 @@ "argument.literal.incorrect": "Expected literal %s", "argument.long.big": "Long must not be more than %s, found %s", "argument.long.low": "Long must not be less than %s, found %s", + "argument.message.too_long": "Chat message was too long (%s > maximum %s characters)", "argument.nbt.array.invalid": "Invalid array type '%s'", "argument.nbt.array.mixed": "Can't insert %s into %s", "argument.nbt.expected.key": "Expected key", @@ -352,6 +377,8 @@ "argument.range.empty": "Expected value or range of values", "argument.range.ints": "Only whole numbers allowed, not decimals", "argument.range.swapped": "Min cannot be bigger than max", + "argument.resource_or_id.failed_to_parse": "Failed to parse structure: %s", + "argument.resource_or_id.invalid": "Invalid id or tag", "argument.resource_tag.invalid_type": "Tag '%s' has wrong type '%s' (expected '%s')", "argument.resource_tag.not_found": "Can't find tag '%s' of type '%s'", "argument.resource.invalid_type": "Element '%s' has wrong type '%s' (expected '%s')", @@ -360,14 +387,21 @@ "argument.scoreboardDisplaySlot.invalid": "Unknown display slot '%s'", "argument.scoreHolder.empty": "No relevant score holders could be found", "argument.style.invalid": "Invalid style: %s", - "argument.time.invalid_tick_count": "Tick count must be non-negative", + "argument.time.invalid_tick_count": "The tick count must be non-negative", "argument.time.invalid_unit": "Invalid unit", - "argument.time.tick_count_too_low": "Tick count must not be less than %s, found %s", + "argument.time.tick_count_too_low": "The tick count must not be less than %s, found %s", "argument.uuid.invalid": "Invalid UUID", "arguments.block.tag.unknown": "Unknown block tag '%s'", "arguments.function.tag.unknown": "Unknown function tag '%s'", "arguments.function.unknown": "Unknown function %s", + "arguments.item.component.expected": "Expected item component", + "arguments.item.component.malformed": "Malformed '%s' component: '%s'", + "arguments.item.component.repeated": "Item component '%s' was repeated, but only one value can be specified", + "arguments.item.component.unknown": "Unknown item component '%s'", + "arguments.item.malformed": "Malformed item: '%s'", "arguments.item.overstacked": "%s can only stack up to %s", + "arguments.item.predicate.malformed": "Malformed '%s' predicate: '%s'", + "arguments.item.predicate.unknown": "Unknown item predicate '%s'", "arguments.item.tag.unknown": "Unknown item tag '%s'", "arguments.nbtpath.node.invalid": "Invalid NBT path element", "arguments.nbtpath.nothing_found": "Found no elements matching %s", @@ -392,14 +426,25 @@ "attribute.name.generic.attack_damage": "Attack Damage", "attribute.name.generic.attack_knockback": "Attack Knockback", "attribute.name.generic.attack_speed": "Attack Speed", + "attribute.name.generic.block_interaction_range": "Block Interaction Range", + "attribute.name.generic.entity_interaction_range": "Entity Interaction Range", + "attribute.name.generic.fall_damage_multiplier": "Fall Damage Multiplier", "attribute.name.generic.flying_speed": "Flying Speed", "attribute.name.generic.follow_range": "Mob Follow Range", + "attribute.name.generic.gravity": "Gravity", + "attribute.name.generic.jump_strength": "Jump Strength", "attribute.name.generic.knockback_resistance": "Knockback Resistance", "attribute.name.generic.luck": "Luck", "attribute.name.generic.max_absorption": "Max Absorption", "attribute.name.generic.max_health": "Max Health", "attribute.name.generic.movement_speed": "Speed", + "attribute.name.generic.safe_fall_distance": "Safe Fall Distance", + "attribute.name.generic.scale": "Scale", + "attribute.name.generic.step_height": "Step Height", "attribute.name.horse.jump_strength": "Horse Jump Strength", + "attribute.name.player.block_break_speed": "Block Break Speed", + "attribute.name.player.block_interaction_range": "Block Interaction Range", + "attribute.name.player.entity_interaction_range": "Entity Interaction Range", "attribute.name.zombie.spawn_reinforcements": "Zombie Reinforcements", "biome.minecraft.badlands": "Badlands", "biome.minecraft.bamboo_jungle": "Bamboo Jungle", @@ -693,6 +738,22 @@ "block.minecraft.banner.diagonal_up_right.red": "Red Per Bend Sinister Inverted", "block.minecraft.banner.diagonal_up_right.white": "White Per Bend Sinister Inverted", "block.minecraft.banner.diagonal_up_right.yellow": "Yellow Per Bend Sinister Inverted", + "block.minecraft.banner.flow.black": "Black Flow", + "block.minecraft.banner.flow.blue": "Blue Flow", + "block.minecraft.banner.flow.brown": "Brown Flow", + "block.minecraft.banner.flow.cyan": "Cyan Flow", + "block.minecraft.banner.flow.gray": "Gray Flow", + "block.minecraft.banner.flow.green": "Green Flow", + "block.minecraft.banner.flow.light_blue": "Light Blue Flow", + "block.minecraft.banner.flow.light_gray": "Light Gray Flow", + "block.minecraft.banner.flow.lime": "Lime Flow", + "block.minecraft.banner.flow.magenta": "Magenta Flow", + "block.minecraft.banner.flow.orange": "Orange Flow", + "block.minecraft.banner.flow.pink": "Pink Flow", + "block.minecraft.banner.flow.purple": "Purple Flow", + "block.minecraft.banner.flow.red": "Red Flow", + "block.minecraft.banner.flow.white": "White Flow", + "block.minecraft.banner.flow.yellow": "Yellow Flow", "block.minecraft.banner.flower.black": "Black Flower Charge", "block.minecraft.banner.flower.blue": "Blue Flower Charge", "block.minecraft.banner.flower.brown": "Brown Flower Charge", @@ -757,6 +818,22 @@ "block.minecraft.banner.gradient.red": "Red Gradient", "block.minecraft.banner.gradient.white": "White Gradient", "block.minecraft.banner.gradient.yellow": "Yellow Gradient", + "block.minecraft.banner.guster.black": "Black Guster", + "block.minecraft.banner.guster.blue": "Blue Guster", + "block.minecraft.banner.guster.brown": "Brown Guster", + "block.minecraft.banner.guster.cyan": "Cyan Guster", + "block.minecraft.banner.guster.gray": "Gray Guster", + "block.minecraft.banner.guster.green": "Green Guster", + "block.minecraft.banner.guster.light_blue": "Light Blue Guster", + "block.minecraft.banner.guster.light_gray": "Light Gray Guster", + "block.minecraft.banner.guster.lime": "Lime Guster", + "block.minecraft.banner.guster.magenta": "Magenta Guster", + "block.minecraft.banner.guster.orange": "Orange Guster", + "block.minecraft.banner.guster.pink": "Pink Guster", + "block.minecraft.banner.guster.purple": "Purple Guster", + "block.minecraft.banner.guster.red": "Red Guster", + "block.minecraft.banner.guster.white": "White Guster", + "block.minecraft.banner.guster.yellow": "Yellow Guster", "block.minecraft.banner.half_horizontal_bottom.black": "Black Per Fess Inverted", "block.minecraft.banner.half_horizontal_bottom.blue": "Blue Per Fess Inverted", "block.minecraft.banner.half_horizontal_bottom.brown": "Brown Per Fess Inverted", @@ -1551,6 +1628,7 @@ "block.minecraft.grindstone": "Grindstone", "block.minecraft.hanging_roots": "Hanging Roots", "block.minecraft.hay_block": "Hay Bale", + "block.minecraft.heavy_core": "Heavy Core", "block.minecraft.heavy_weighted_pressure_plate": "Heavy Weighted Pressure Plate", "block.minecraft.honey_block": "Honey Block", "block.minecraft.honeycomb_block": "Honeycomb Block", @@ -2071,6 +2149,7 @@ "block.minecraft.turtle_egg": "Turtle Egg", "block.minecraft.twisting_vines": "Twisting Vines", "block.minecraft.twisting_vines_plant": "Twisting Vines Plant", + "block.minecraft.vault": "Vault", "block.minecraft.verdant_froglight": "Verdant Froglight", "block.minecraft.vine": "Vines", "block.minecraft.void_air": "Void Air", @@ -2200,9 +2279,12 @@ "chat.deleted_marker": "This chat message has been deleted by the server.", "chat.disabled.chain_broken": "Chat disabled due to broken chain. Please try reconnecting.", "chat.disabled.expiredProfileKey": "Chat disabled due to expired profile public key. Please try reconnecting.", + "chat.disabled.invalid_command_signature": "Command had unexpected or missing command argument signatures.", + "chat.disabled.invalid_signature": "Chat had an invalid signature. Please try reconnecting.", "chat.disabled.launcher": "Chat disabled by launcher option. Cannot send message.", "chat.disabled.missingProfileKey": "Chat disabled due to missing profile public key. Please try reconnecting.", "chat.disabled.options": "Chat disabled in client options.", + "chat.disabled.out_of_order_chat": "Chat received out-of-order. Did your system time change?", "chat.disabled.profile": "Chat not allowed by account settings. Press '%s' again for more information.", "chat.disabled.profile.moreInfo": "Chat not allowed by account settings. Cannot send or view messages.", "chat.editBox": "chat", @@ -2231,6 +2313,11 @@ "chat.type.text": "<%s> %s", "chat.type.text.narrate": "%s says %s", "chat.validation_error": "Chat validation error", + "chunk.toast.checkLog": "See log for more details", + "chunk.toast.loadFailure": "Failed to load chunk at %s", + "chunk.toast.lowDiskSpace": "Low disk space!", + "chunk.toast.lowDiskSpace.description": "Might not be able to save the world.", + "chunk.toast.saveFailure": "Failed to save chunk at %s", "clear.failed.multiple": "No items were found on %s players", "clear.failed.single": "No items were found on player %s", "color.minecraft.black": "Black", @@ -2363,6 +2450,7 @@ "commands.data.storage.modified": "Modified storage %s", "commands.data.storage.query": "Storage %s has the following contents: %s", "commands.datapack.disable.failed": "Pack '%s' is not enabled!", + "commands.datapack.disable.failed.feature": "Pack '%s' cannot be disabled, since it is part of an enabled flag!", "commands.datapack.enable.failed": "Pack '%s' is already enabled!", "commands.datapack.enable.failed.no_flags": "Pack '%s' cannot be enabled, since required flags are not enabled in this world: %s!", "commands.datapack.list.available.none": "There are no more data packs available", @@ -2613,6 +2701,7 @@ "commands.setblock.failed": "Could not set the block", "commands.setblock.success": "Changed the block at %s, %s, %s", "commands.setidletimeout.success": "The player idle timeout is now %s minute(s)", + "commands.setworldspawn.failure.not_overworld": "Can only set the world spawn for overworld", "commands.setworldspawn.success": "Set the world spawn point to %s, %s, %s [%s]", "commands.spawnpoint.success.multiple": "Set spawn point to %s, %s, %s [%s] in %s for %s players", "commands.spawnpoint.success.single": "Set spawn point to %s, %s, %s [%s] in %s for %s", @@ -2689,14 +2778,14 @@ "commands.tick.rate.success": "Set the target tick rate to %s per second", "commands.tick.sprint.report": "Sprint completed with %s ticks per second, or %s ms per tick", "commands.tick.sprint.stop.fail": "No tick sprint in progress", - "commands.tick.sprint.stop.success": "A tick sprint interrupted", + "commands.tick.sprint.stop.success": "Interrupted the current tick sprint", "commands.tick.status.frozen": "The game is frozen", "commands.tick.status.lagging": "The game is running, but can't keep up with the target tick rate", - "commands.tick.status.running": "The game runs normally", + "commands.tick.status.running": "The game is running normally", "commands.tick.status.sprinting": "The game is sprinting", "commands.tick.step.fail": "Unable to step the game - the game must be frozen first", "commands.tick.step.stop.fail": "No tick step in progress", - "commands.tick.step.stop.success": "A tick step interrupted", + "commands.tick.step.stop.success": "Interrupted the current tick step", "commands.tick.step.success": "Stepping %s tick(s)", "commands.time.query": "The time is %s", "commands.time.set": "Set the time to %s", @@ -2712,6 +2801,9 @@ "commands.title.show.title.single": "Showing new title for %s", "commands.title.times.multiple": "Changed title display times for %s players", "commands.title.times.single": "Changed title display times for %s", + "commands.transfer.error.no_players": "Must specify at least one player to transfer", + "commands.transfer.success.multiple": "Transferring %s players to %s:%s", + "commands.transfer.success.single": "Transferring %s to %s:%s", "commands.trigger.add.success": "Triggered %s (added %s to value)", "commands.trigger.failed.invalid": "You can only trigger objectives that are 'trigger' type", "commands.trigger.failed.unprimed": "You cannot trigger this objective yet", @@ -2757,10 +2849,12 @@ "connect.connecting": "Connecting to the server...", "connect.encrypting": "Encrypting...", "connect.failed": "Failed to connect to the server", + "connect.failed.transfer": "Connection failed while transferring to the server", "connect.joining": "Joining world...", "connect.negotiating": "Negotiating...", "connect.reconfiging": "Reconfiguring...", "connect.reconfiguring": "Reconfiguring...", + "connect.transferring": "Transferring to new server...", "container.barrel": "Barrel", "container.beacon": "Beacon", "container.blast_furnace": "Blast Furnace", @@ -3094,9 +3188,11 @@ "disconnect.loginFailedInfo.userBanned": "You are banned from playing online", "disconnect.lost": "Connection Lost", "disconnect.overflow": "Buffer overflow", + "disconnect.packetError": "Network Protocol Error", "disconnect.quitting": "Quitting", "disconnect.spam": "Kicked for spamming", "disconnect.timeout": "Timed out", + "disconnect.transfer": "Transferred to another server", "disconnect.unknownHost": "Unknown host", "download.pack.failed": "%s out of %s packs failed to download", "download.pack.progress.bytes": "Progress: %s (total size unknown)", @@ -3117,6 +3213,7 @@ "effect.minecraft.health_boost": "Health Boost", "effect.minecraft.hero_of_the_village": "Hero of the Village", "effect.minecraft.hunger": "Hunger", + "effect.minecraft.infested": "Infested", "effect.minecraft.instant_damage": "Instant Damage", "effect.minecraft.instant_health": "Instant Health", "effect.minecraft.invisibility": "Invisibility", @@ -3126,7 +3223,9 @@ "effect.minecraft.mining_fatigue": "Mining Fatigue", "effect.minecraft.nausea": "Nausea", "effect.minecraft.night_vision": "Night Vision", + "effect.minecraft.oozing": "Oozing", "effect.minecraft.poison": "Poison", + "effect.minecraft.raid_omen": "Raid Omen", "effect.minecraft.regeneration": "Regeneration", "effect.minecraft.resistance": "Resistance", "effect.minecraft.saturation": "Saturation", @@ -3134,9 +3233,12 @@ "effect.minecraft.slowness": "Slowness", "effect.minecraft.speed": "Speed", "effect.minecraft.strength": "Strength", + "effect.minecraft.trial_omen": "Trial Omen", "effect.minecraft.unluck": "Bad Luck", "effect.minecraft.water_breathing": "Water Breathing", "effect.minecraft.weakness": "Weakness", + "effect.minecraft.weaving": "Weaving", + "effect.minecraft.wind_charged": "Wind Charged", "effect.minecraft.wither": "Wither", "effect.none": "No Effects", "enchantment.level.1": "I", @@ -3153,7 +3255,9 @@ "enchantment.minecraft.bane_of_arthropods": "Bane of Arthropods", "enchantment.minecraft.binding_curse": "Curse of Binding", "enchantment.minecraft.blast_protection": "Blast Protection", + "enchantment.minecraft.breach": "Breach", "enchantment.minecraft.channeling": "Channeling", + "enchantment.minecraft.density": "Density", "enchantment.minecraft.depth_strider": "Depth Strider", "enchantment.minecraft.efficiency": "Efficiency", "enchantment.minecraft.feather_falling": "Feather Falling", @@ -3184,12 +3288,15 @@ "enchantment.minecraft.smite": "Smite", "enchantment.minecraft.soul_speed": "Soul Speed", "enchantment.minecraft.sweeping": "Sweeping Edge", + "enchantment.minecraft.sweeping_edge": "Sweeping Edge", "enchantment.minecraft.swift_sneak": "Swift Sneak", "enchantment.minecraft.thorns": "Thorns", "enchantment.minecraft.unbreaking": "Unbreaking", "enchantment.minecraft.vanishing_curse": "Curse of Vanishing", + "enchantment.minecraft.wind_burst": "Wind Burst", "entity.minecraft.allay": "Allay", "entity.minecraft.area_effect_cloud": "Area Effect Cloud", + "entity.minecraft.armadillo": "Armadillo", "entity.minecraft.armor_stand": "Armor Stand", "entity.minecraft.arrow": "Arrow", "entity.minecraft.axolotl": "Axolotl", @@ -3198,7 +3305,9 @@ "entity.minecraft.blaze": "Blaze", "entity.minecraft.block_display": "Block Display", "entity.minecraft.boat": "Boat", + "entity.minecraft.bogged": "Bogged", "entity.minecraft.breeze": "Breeze", + "entity.minecraft.breeze_wind_charge": "Wind Charge", "entity.minecraft.camel": "Camel", "entity.minecraft.cat": "Cat", "entity.minecraft.cave_spider": "Cave Spider", @@ -3260,6 +3369,7 @@ "entity.minecraft.mooshroom": "Mooshroom", "entity.minecraft.mule": "Mule", "entity.minecraft.ocelot": "Ocelot", + "entity.minecraft.ominous_item_spawner": "Ominous Item Spawner", "entity.minecraft.painting": "Painting", "entity.minecraft.panda": "Panda", "entity.minecraft.parrot": "Parrot", @@ -3381,6 +3491,7 @@ "filled_map.mansion": "Woodland Explorer Map", "filled_map.monument": "Ocean Explorer Map", "filled_map.scale": "Scaling at 1:%s", + "filled_map.trial_chambers": "Trial Chambers Map", "filled_map.unknown": "Unknown Map", "filled_map.village_desert": "Desert Village Map", "filled_map.village_plains": "Plains Village Map", @@ -3476,7 +3587,10 @@ "gamerule.showDeathMessages": "Show death messages", "gamerule.snowAccumulationHeight": "Snow accumulation height", "gamerule.snowAccumulationHeight.description": "When it snows, layers of snow form on the ground up to at most this number of layers.", + "gamerule.spawnChunkRadius": "Spawn chunk radius", + "gamerule.spawnChunkRadius.description": "Amount of chunks that stay loaded around the overworld spawn position.", "gamerule.spawnRadius": "Respawn location radius", + "gamerule.spawnRadius.description": "Controls the size of the area around the spawn point that players can spawn in.", "gamerule.spectatorsGenerateChunks": "Allow spectators to generate terrain", "gamerule.tntExplosionDropDecay": "In TNT explosions, some blocks won't drop their loot", "gamerule.tntExplosionDropDecay.description": "Some of the drops from blocks destroyed by explosions caused by TNT are lost in the explosion.", @@ -3700,7 +3814,9 @@ "item_modifier.unknown": "Unknown item modifier: %s", "item.canBreak": "Can break:", "item.canPlace": "Can be placed on:", + "item.canUse.unknown": "Unknown", "item.color": "Color: %s", + "item.components": "%s component(s)", "item.disabled": "Disabled item", "item.durability": "Durability: %s / %s", "item.dyed": "Dyed", @@ -3713,6 +3829,8 @@ "item.minecraft.apple": "Apple", "item.minecraft.archer_pottery_shard": "Archer Pottery Shard", "item.minecraft.archer_pottery_sherd": "Archer Pottery Sherd", + "item.minecraft.armadillo_scute": "Armadillo Scute", + "item.minecraft.armadillo_spawn_egg": "Armadillo Spawn Egg", "item.minecraft.armor_stand": "Armor Stand", "item.minecraft.arms_up_pottery_shard": "Arms Up Pottery Shard", "item.minecraft.arms_up_pottery_sherd": "Arms Up Pottery Sherd", @@ -3737,12 +3855,15 @@ "item.minecraft.blaze_rod": "Blaze Rod", "item.minecraft.blaze_spawn_egg": "Blaze Spawn Egg", "item.minecraft.blue_dye": "Blue Dye", + "item.minecraft.bogged_spawn_egg": "Bogged Spawn Egg", + "item.minecraft.bolt_armor_trim_smithing_template": "Smithing Template", "item.minecraft.bone": "Bone", "item.minecraft.bone_meal": "Bone Meal", "item.minecraft.book": "Book", "item.minecraft.bow": "Bow", "item.minecraft.bowl": "Bowl", "item.minecraft.bread": "Bread", + "item.minecraft.breeze_rod": "Breeze Rod", "item.minecraft.breeze_spawn_egg": "Breeze Spawn Egg", "item.minecraft.brewer_pottery_shard": "Brewer Pottery Shard", "item.minecraft.brewer_pottery_sherd": "Brewer Pottery Sherd", @@ -3879,6 +4000,10 @@ "item.minecraft.fishing_rod": "Fishing Rod", "item.minecraft.flint": "Flint", "item.minecraft.flint_and_steel": "Flint and Steel", + "item.minecraft.flow_armor_trim_smithing_template": "Smithing Template", + "item.minecraft.flow_banner_pattern": "Banner Pattern", + "item.minecraft.flow_banner_pattern.desc": "Flow", + "item.minecraft.flow_pottery_sherd": "Flow Pottery Sherd", "item.minecraft.flower_banner_pattern": "Banner Pattern", "item.minecraft.flower_banner_pattern.desc": "Flower Charge", "item.minecraft.flower_pot": "Flower Pot", @@ -3918,6 +4043,9 @@ "item.minecraft.green_dye": "Green Dye", "item.minecraft.guardian_spawn_egg": "Guardian Spawn Egg", "item.minecraft.gunpowder": "Gunpowder", + "item.minecraft.guster_banner_pattern": "Banner Pattern", + "item.minecraft.guster_banner_pattern.desc": "Guster", + "item.minecraft.guster_pottery_sherd": "Guster Pottery Sherd", "item.minecraft.heart_of_the_sea": "Heart of the Sea", "item.minecraft.heart_pottery_shard": "Heart Pottery Shard", "item.minecraft.heart_pottery_sherd": "Heart Pottery Sherd", @@ -3968,12 +4096,14 @@ "item.minecraft.lingering_potion.effect.fire_resistance": "Lingering Potion of Fire Resistance", "item.minecraft.lingering_potion.effect.harming": "Lingering Potion of Harming", "item.minecraft.lingering_potion.effect.healing": "Lingering Potion of Healing", + "item.minecraft.lingering_potion.effect.infested": "Lingering Potion of Infestation", "item.minecraft.lingering_potion.effect.invisibility": "Lingering Potion of Invisibility", "item.minecraft.lingering_potion.effect.leaping": "Lingering Potion of Leaping", "item.minecraft.lingering_potion.effect.levitation": "Lingering Potion of Levitation", "item.minecraft.lingering_potion.effect.luck": "Lingering Potion of Luck", "item.minecraft.lingering_potion.effect.mundane": "Mundane Lingering Potion", "item.minecraft.lingering_potion.effect.night_vision": "Lingering Potion of Night Vision", + "item.minecraft.lingering_potion.effect.oozing": "Lingering Potion of Oozing", "item.minecraft.lingering_potion.effect.poison": "Lingering Potion of Poison", "item.minecraft.lingering_potion.effect.regeneration": "Lingering Potion of Regeneration", "item.minecraft.lingering_potion.effect.slow_falling": "Lingering Potion of Slow Falling", @@ -3985,8 +4115,11 @@ "item.minecraft.lingering_potion.effect.water": "Lingering Water Bottle", "item.minecraft.lingering_potion.effect.water_breathing": "Lingering Potion of Water Breathing", "item.minecraft.lingering_potion.effect.weakness": "Lingering Potion of Weakness", + "item.minecraft.lingering_potion.effect.weaving": "Lingering Potion of Weaving", + "item.minecraft.lingering_potion.effect.wind_charged": "Lingering Potion of Wind Charging", "item.minecraft.llama_spawn_egg": "Llama Spawn Egg", "item.minecraft.lodestone_compass": "Lodestone Compass", + "item.minecraft.mace": "Mace", "item.minecraft.magenta_dye": "Magenta Dye", "item.minecraft.magma_cream": "Magma Cream", "item.minecraft.magma_cube_spawn_egg": "Magma Cube Spawn Egg", @@ -4059,6 +4192,8 @@ "item.minecraft.oak_boat": "Oak Boat", "item.minecraft.oak_chest_boat": "Oak Boat with Chest", "item.minecraft.ocelot_spawn_egg": "Ocelot Spawn Egg", + "item.minecraft.ominous_bottle": "Ominous Bottle", + "item.minecraft.ominous_trial_key": "Ominous Trial Key", "item.minecraft.orange_dye": "Orange Dye", "item.minecraft.painting": "Painting", "item.minecraft.panda_spawn_egg": "Panda Spawn Egg", @@ -4088,12 +4223,14 @@ "item.minecraft.potion.effect.fire_resistance": "Potion of Fire Resistance", "item.minecraft.potion.effect.harming": "Potion of Harming", "item.minecraft.potion.effect.healing": "Potion of Healing", + "item.minecraft.potion.effect.infested": "Potion of Infestation", "item.minecraft.potion.effect.invisibility": "Potion of Invisibility", "item.minecraft.potion.effect.leaping": "Potion of Leaping", "item.minecraft.potion.effect.levitation": "Potion of Levitation", "item.minecraft.potion.effect.luck": "Potion of Luck", "item.minecraft.potion.effect.mundane": "Mundane Potion", "item.minecraft.potion.effect.night_vision": "Potion of Night Vision", + "item.minecraft.potion.effect.oozing": "Potion of Oozing", "item.minecraft.potion.effect.poison": "Potion of Poison", "item.minecraft.potion.effect.regeneration": "Potion of Regeneration", "item.minecraft.potion.effect.slow_falling": "Potion of Slow Falling", @@ -4105,6 +4242,8 @@ "item.minecraft.potion.effect.water": "Water Bottle", "item.minecraft.potion.effect.water_breathing": "Potion of Water Breathing", "item.minecraft.potion.effect.weakness": "Potion of Weakness", + "item.minecraft.potion.effect.weaving": "Potion of Weaving", + "item.minecraft.potion.effect.wind_charged": "Potion of Wind Charging", "item.minecraft.pottery_shard_archer": "Archer Pottery Shard", "item.minecraft.pottery_shard_arms_up": "Arms Up Pottery Shard", "item.minecraft.pottery_shard_prize": "Prize Pottery Shard", @@ -4140,6 +4279,7 @@ "item.minecraft.salmon": "Raw Salmon", "item.minecraft.salmon_bucket": "Bucket of Salmon", "item.minecraft.salmon_spawn_egg": "Salmon Spawn Egg", + "item.minecraft.scrape_pottery_sherd": "Scrape Pottery Sherd", "item.minecraft.scute": "Scute", "item.minecraft.sentry_armor_trim_smithing_template": "Smithing Template", "item.minecraft.shaper_armor_trim_smithing_template": "Smithing Template", @@ -4207,12 +4347,14 @@ "item.minecraft.splash_potion.effect.fire_resistance": "Splash Potion of Fire Resistance", "item.minecraft.splash_potion.effect.harming": "Splash Potion of Harming", "item.minecraft.splash_potion.effect.healing": "Splash Potion of Healing", + "item.minecraft.splash_potion.effect.infested": "Splash Potion of Infestation", "item.minecraft.splash_potion.effect.invisibility": "Splash Potion of Invisibility", "item.minecraft.splash_potion.effect.leaping": "Splash Potion of Leaping", "item.minecraft.splash_potion.effect.levitation": "Splash Potion of Levitation", "item.minecraft.splash_potion.effect.luck": "Splash Potion of Luck", "item.minecraft.splash_potion.effect.mundane": "Mundane Splash Potion", "item.minecraft.splash_potion.effect.night_vision": "Splash Potion of Night Vision", + "item.minecraft.splash_potion.effect.oozing": "Splash Potion of Oozing", "item.minecraft.splash_potion.effect.poison": "Splash Potion of Poison", "item.minecraft.splash_potion.effect.regeneration": "Splash Potion of Regeneration", "item.minecraft.splash_potion.effect.slow_falling": "Splash Potion of Slow Falling", @@ -4224,6 +4366,8 @@ "item.minecraft.splash_potion.effect.water": "Splash Water Bottle", "item.minecraft.splash_potion.effect.water_breathing": "Splash Potion of Water Breathing", "item.minecraft.splash_potion.effect.weakness": "Splash Potion of Weakness", + "item.minecraft.splash_potion.effect.weaving": "Splash Potion of Weaving", + "item.minecraft.splash_potion.effect.wind_charged": "Splash Potion of Wind Charging", "item.minecraft.spruce_boat": "Spruce Boat", "item.minecraft.spruce_chest_boat": "Spruce Boat with Chest", "item.minecraft.spyglass": "Spyglass", @@ -4249,12 +4393,14 @@ "item.minecraft.tipped_arrow.effect.fire_resistance": "Arrow of Fire Resistance", "item.minecraft.tipped_arrow.effect.harming": "Arrow of Harming", "item.minecraft.tipped_arrow.effect.healing": "Arrow of Healing", + "item.minecraft.tipped_arrow.effect.infested": "Arrow of Infestation", "item.minecraft.tipped_arrow.effect.invisibility": "Arrow of Invisibility", "item.minecraft.tipped_arrow.effect.leaping": "Arrow of Leaping", "item.minecraft.tipped_arrow.effect.levitation": "Arrow of Levitation", "item.minecraft.tipped_arrow.effect.luck": "Arrow of Luck", "item.minecraft.tipped_arrow.effect.mundane": "Tipped Arrow", "item.minecraft.tipped_arrow.effect.night_vision": "Arrow of Night Vision", + "item.minecraft.tipped_arrow.effect.oozing": "Arrow of Oozing", "item.minecraft.tipped_arrow.effect.poison": "Arrow of Poison", "item.minecraft.tipped_arrow.effect.regeneration": "Arrow of Regeneration", "item.minecraft.tipped_arrow.effect.slow_falling": "Arrow of Slow Falling", @@ -4266,6 +4412,8 @@ "item.minecraft.tipped_arrow.effect.water": "Arrow of Splashing", "item.minecraft.tipped_arrow.effect.water_breathing": "Arrow of Water Breathing", "item.minecraft.tipped_arrow.effect.weakness": "Arrow of Weakness", + "item.minecraft.tipped_arrow.effect.weaving": "Arrow of Weaving", + "item.minecraft.tipped_arrow.effect.wind_charged": "Arrow of Wind Charging", "item.minecraft.tnt_minecart": "Minecart with TNT", "item.minecraft.torchflower_seeds": "Torchflower Seeds", "item.minecraft.totem_of_undying": "Totem of Undying", @@ -4276,6 +4424,7 @@ "item.minecraft.tropical_fish_bucket": "Bucket of Tropical Fish", "item.minecraft.tropical_fish_spawn_egg": "Tropical Fish Spawn Egg", "item.minecraft.turtle_helmet": "Turtle Shell", + "item.minecraft.turtle_scute": "Turtle Scute", "item.minecraft.turtle_spawn_egg": "Turtle Spawn Egg", "item.minecraft.vex_armor_trim_smithing_template": "Smithing Template", "item.minecraft.vex_spawn_egg": "Vex Spawn Egg", @@ -4291,9 +4440,11 @@ "item.minecraft.wheat_seeds": "Wheat Seeds", "item.minecraft.white_dye": "White Dye", "item.minecraft.wild_armor_trim_smithing_template": "Smithing Template", + "item.minecraft.wind_charge": "Wind Charge", "item.minecraft.witch_spawn_egg": "Witch Spawn Egg", "item.minecraft.wither_skeleton_spawn_egg": "Wither Skeleton Spawn Egg", "item.minecraft.wither_spawn_egg": "Wither Spawn Egg", + "item.minecraft.wolf_armor": "Wolf Armor", "item.minecraft.wolf_spawn_egg": "Wolf Spawn Egg", "item.minecraft.wooden_axe": "Wooden Axe", "item.minecraft.wooden_hoe": "Wooden Hoe", @@ -4308,6 +4459,7 @@ "item.minecraft.zombie_spawn_egg": "Zombie Spawn Egg", "item.minecraft.zombie_villager_spawn_egg": "Zombie Villager Spawn Egg", "item.minecraft.zombified_piglin_spawn_egg": "Zombified Piglin Spawn Egg", + "item.modifiers.body": "When equipped:", "item.modifiers.chest": "When on Body:", "item.modifiers.feet": "When on Feet:", "item.modifiers.head": "When on Head:", @@ -4516,6 +4668,7 @@ "mco.backup.entry.worldType": "World Type", "mco.backup.generate.world": "Generate world", "mco.backup.info.title": "Changes From Last Backup", + "mco.backup.narration": "Backup from %s", "mco.backup.nobackups": "This realm doesn't have any backups currently.", "mco.backup.restoring": "Restoring your realm", "mco.backup.unknown": "UNKNOWN", @@ -4533,6 +4686,8 @@ "mco.client.incompatible.msg.line2": "Please use the most recent version of Minecraft.", "mco.client.incompatible.msg.line3": "Realms is not compatible with snapshot versions.", "mco.client.incompatible.title": "Client incompatible!", + "mco.client.outdated.stable.version": "Your client version (%s) is not compatible with Realms.\n\nPlease use the most recent version of Minecraft.", + "mco.client.unsupported.snapshot.version": "Your client version (%s) is not compatible with Realms.\n\nRealms is not available for this snapshot version.", "mco.compatibility.downgrade": "Downgrade", "mco.compatibility.downgrade.description": "This world was last played in version %s; you are on version %s. Downgrading a world could cause corruption - we cannot guarantee that it will load or work.\n\nA backup of your world will be saved under \"World backups\". Please restore your world if needed.", "mco.compatibility.unverifiable.message": "The version this world was last played in could not be verified. If the world gets upgraded or downgraded, a backup will be automatically created and saved under \"World backups\".", @@ -4556,7 +4711,7 @@ "mco.configure.world.buttons.resetworld": "Reset World", "mco.configure.world.buttons.settings": "Settings", "mco.configure.world.buttons.subscription": "Subscription", - "mco.configure.world.buttons.switchminigame": "Switch minigame", + "mco.configure.world.buttons.switchminigame": "Switch Minigame", "mco.configure.world.close.question.line1": "Your realm will become unavailable.", "mco.configure.world.close.question.line2": "Are you sure you want to continue?", "mco.configure.world.closing": "Closing the realm...", @@ -4574,7 +4729,7 @@ "mco.configure.world.invite.profile.name": "Name", "mco.configure.world.invited": "Invited", "mco.configure.world.invited.number": "Invited (%s)", - "mco.configure.world.invites.normal.tooltip": "Normal user", + "mco.configure.world.invites.normal.tooltip": "Normal User", "mco.configure.world.invites.ops.tooltip": "Operator", "mco.configure.world.invites.remove.tooltip": "Remove", "mco.configure.world.leave.question.line1": "If you leave this realm you won't see it unless you are invited again", @@ -4679,26 +4834,27 @@ "mco.gui.button": "Button", "mco.gui.ok": "Ok", "mco.info": "Info!", + "mco.invited.player.narration": "Invited player %s", "mco.invites.button.accept": "Accept", "mco.invites.button.reject": "Reject", "mco.invites.nopending": "No pending invites!", "mco.invites.pending": "New invite(s)!", "mco.invites.title": "Pending Invites", - "mco.minigame.world.changeButton": "Select another minigame", + "mco.minigame.world.changeButton": "Select Another Minigame", "mco.minigame.world.info.line1": "This will temporarily replace your world with a minigame!", "mco.minigame.world.info.line2": "You can later return to your original world without losing anything.", "mco.minigame.world.noSelection": "Please make a selection", - "mco.minigame.world.restore": "Ending minigame...", + "mco.minigame.world.restore": "Ending Minigame...", "mco.minigame.world.restore.question.line1": "The minigame will end and your realm will be restored.", "mco.minigame.world.restore.question.line2": "Are you sure you want to continue?", - "mco.minigame.world.selected": "Selected minigame:", - "mco.minigame.world.slot.screen.title": "Switching world...", + "mco.minigame.world.selected": "Selected Minigame:", + "mco.minigame.world.slot.screen.title": "Switching World...", "mco.minigame.world.startButton": "Switch", - "mco.minigame.world.starting.screen.title": "Starting minigame...", - "mco.minigame.world.stopButton": "End minigame", + "mco.minigame.world.starting.screen.title": "Starting Minigame...", + "mco.minigame.world.stopButton": "End Minigame", "mco.minigame.world.switch.new": "Select another minigame?", - "mco.minigame.world.switch.title": "Switch minigame", - "mco.minigame.world.title": "Switch realm to minigame", + "mco.minigame.world.switch.title": "Switch Minigame", + "mco.minigame.world.title": "Switch Realm to Minigame", "mco.news": "Realms news", "mco.notification.dismiss": "Dismiss", "mco.notification.transferSubscription.buttonText": "Transfer Now", @@ -4792,6 +4948,7 @@ "mco.upload.close.failure": "Could not close your realm, please try again later", "mco.upload.done": "Upload done", "mco.upload.entry.cheats": "%1$s, %2$s", + "mco.upload.entry.commands": "%1$s, %2$s", "mco.upload.entry.id": "%1$s (%2$s)", "mco.upload.failed": "Upload failed! (%s)", "mco.upload.hardcore": "Hardcore worlds can't be uploaded!", @@ -4882,6 +5039,7 @@ "multiplayer.disconnect.server_shutdown": "Server closed", "multiplayer.disconnect.slow_login": "Took too long to log in", "multiplayer.disconnect.too_many_pending_chats": "Too many unacknowledged chat messages", + "multiplayer.disconnect.transfers_disabled": "Server does not accept transfers", "multiplayer.disconnect.unexpected_query_response": "Unexpected custom data from client", "multiplayer.disconnect.unsigned_chat": "Received chat packet with missing or invalid signature.", "multiplayer.disconnect.unverified_username": "Failed to verify username!", @@ -4986,13 +5144,21 @@ "optimizeWorld.stage.counting": "Counting chunks...", "optimizeWorld.stage.failed": "Failed! :(", "optimizeWorld.stage.finished": "Finishing up...", + "optimizeWorld.stage.finished.chunks": "Finishing up upgrading chunks...", + "optimizeWorld.stage.finished.entities": "Finishing up upgrading entities...", + "optimizeWorld.stage.finished.poi": "Finishing up upgrading points of interest...", "optimizeWorld.stage.upgrading": "Upgrading all chunks...", + "optimizeWorld.stage.upgrading.chunks": "Upgrading all chunks...", + "optimizeWorld.stage.upgrading.entities": "Upgrading all entities...", + "optimizeWorld.stage.upgrading.poi": "Upgrading all points of interest...", "optimizeWorld.title": "Optimizing World '%s'", "options.accessibility": "Accessibility Settings...", "options.accessibility.high_contrast": "High Contrast", "options.accessibility.high_contrast.error.tooltip": "High Contrast resource pack is not available", "options.accessibility.high_contrast.tooltip": "Enhances the contrast of UI elements", "options.accessibility.link": "Accessibility Guide", + "options.accessibility.menu_background_blurriness": "Menu Background Blur", + "options.accessibility.menu_background_blurriness.tooltip": "Changes the blurriness of menu backgrounds", "options.accessibility.narrator_hotkey": "Narrator Hotkey", "options.accessibility.narrator_hotkey.mac.tooltip": "Allows the Narrator to be toggled on and off with 'Cmd+B'", "options.accessibility.narrator_hotkey.tooltip": "Allows the Narrator to be toggled on and off with 'Ctrl+B'", @@ -5071,6 +5237,8 @@ "options.discrete_mouse_scroll": "Discrete Scrolling", "options.entityDistanceScaling": "Entity Distance", "options.entityShadows": "Entity Shadows", + "options.font": "Font Settings...", + "options.font.title": "Font Settings", "options.forceUnicodeFont": "Force Unicode Font", "options.fov": "FOV", "options.fov.max": "Quake Pro", @@ -5118,6 +5286,8 @@ "options.hideSplashTexts": "Hide Splash Texts", "options.hideSplashTexts.tooltip": "Hides the yellow splash text in the main menu.", "options.invertMouse": "Invert Mouse", + "options.japaneseGlyphVariants": "Japanese Glyph Variants", + "options.japaneseGlyphVariants.tooltip": "Uses Japanese variants of CJK characters in the default font", "options.key.hold": "Hold", "options.key.toggle": "Toggle", "options.language": "Language...", @@ -5191,6 +5361,7 @@ "options.telemetry": "Telemetry Data...", "options.telemetry.button": "Data Collection", "options.telemetry.button.tooltip": "\"%s\" includes only the required data.\n\"%s\" includes optional, as well as the required data.", + "options.telemetry.disabled": "Telemetry is disabled.", "options.telemetry.state.all": "All", "options.telemetry.state.minimal": "Minimal", "options.telemetry.state.none": "None", @@ -5300,6 +5471,7 @@ "parsing.quote.escape": "Invalid escape sequence '\\%s' in quoted string", "parsing.quote.expected.end": "Unclosed quoted string", "parsing.quote.expected.start": "Expected quote to start a string", + "particle.invalidOptions": "Can't parse particle options: %s", "particle.notFound": "Unknown particle: %s", "permissions.requires.entity": "An entity is required to run this command here", "permissions.requires.player": "A player is required to run this command here", @@ -5366,6 +5538,7 @@ "selectWorld.access_failure": "Failed to access world", "selectWorld.allowCommands": "Allow Cheats", "selectWorld.allowCommands.info": "Commands like /gamemode, /experience", + "selectWorld.allowCommands.new": "Allow Commands", "selectWorld.backupEraseCache": "Erase Cached Data", "selectWorld.backupJoinConfirmButton": "Create Backup and Load", "selectWorld.backupJoinSkipButton": "I know what I'm doing!", @@ -5379,6 +5552,7 @@ "selectWorld.backupWarning.snapshot": "This world was last played in version %s; you are on version %s. Please make a backup in case you experience world corruptions.", "selectWorld.bonusItems": "Bonus Chest", "selectWorld.cheats": "Cheats", + "selectWorld.commands": "Commands", "selectWorld.conversion": "Must be converted!", "selectWorld.conversion.tooltip": "This world must be opened in an older version (like 1.6.4) to be safely converted", "selectWorld.create": "Create New World", @@ -5482,11 +5656,14 @@ "selectWorld.warning.deprecated.title": "Warning! These settings are using deprecated features", "selectWorld.warning.experimental.question": "These settings are experimental and could one day stop working. Do you wish to proceed?", "selectWorld.warning.experimental.title": "Warning! These settings are using experimental features", + "selectWorld.warning.lowDiskSpace.description": "There is not much space left on your device.\nRunning out of disk space while in game can lead to your world being damaged.", + "selectWorld.warning.lowDiskSpace.title": "Warning! Low disk space!", "selectWorld.world": "World", "sign.edit": "Edit Sign Message", "sleep.not_possible": "No amount of rest can pass this night", "sleep.players_sleeping": "%s/%s players sleeping", "sleep.skipping_night": "Sleeping through this night", + "slot.only_single_allowed": "Only single slots allowed, got '%s'", "slot.unknown": "Unknown slot '%s'", "soundCategory.ambient": "Ambient/Environment", "soundCategory.block": "Blocks", @@ -5671,6 +5848,7 @@ "subtitles.block.cake.add_candle": "Cake squishes", "subtitles.block.campfire.crackle": "Campfire crackles", "subtitles.block.candle.crackle": "Candle crackles", + "subtitles.block.candle.extinguish": "Candle extinguishes", "subtitles.block.chest.close": "Chest closes", "subtitles.block.chest.locked": "Chest locked", "subtitles.block.chest.open": "Chest opens", @@ -5730,7 +5908,7 @@ "subtitles.block.pressure_plate.click": "Pressure Plate clicks", "subtitles.block.pumpkin.carve": "Shears carve", "subtitles.block.redstone_torch.burnout": "Torch fizzes", - "subtitles.block.respawn_anchor.ambient": "Portal whooshes", + "subtitles.block.respawn_anchor.ambient": "Respawn Anchor whooshes", "subtitles.block.respawn_anchor.charge": "Respawn Anchor is charged", "subtitles.block.respawn_anchor.deplete": "Respawn Anchor depletes", "subtitles.block.respawn_anchor.set_spawn": "Respawn Anchor sets spawn", @@ -5751,16 +5929,30 @@ "subtitles.block.sponge.absorb": "Sponge sucks", "subtitles.block.sweet_berry_bush.pick_berries": "Berries pop", "subtitles.block.trapdoor.toggle": "Trapdoor creaks", + "subtitles.block.trial_spawner.about_to_spawn_item": "Ominous item prepares", "subtitles.block.trial_spawner.ambient": "Trial Spawner crackles", + "subtitles.block.trial_spawner.ambient_charged": "Ominous Trial Spawner crackles", + "subtitles.block.trial_spawner.charge_activate": "Omen engulfs Trial Spawner", "subtitles.block.trial_spawner.close_shutter": "Trial Spawner closes", "subtitles.block.trial_spawner.detect_player": "Trial Spawner charges up", "subtitles.block.trial_spawner.eject_item": "Trial Spawner ejects items", "subtitles.block.trial_spawner.open_shutter": "Trial Spawner opens", - "subtitles.block.trial_spawner.spawn_mob": "Mob spawns", + "subtitles.block.trial_spawner.spawn_item": "Ominous item drops", + "subtitles.block.trial_spawner.spawn_item_begin": "Ominous item appears", + "subtitles.block.trial_spawner.spawn_mob": "Trial Spawner spawns a mob", "subtitles.block.tripwire.attach": "Tripwire attaches", "subtitles.block.tripwire.click": "Tripwire clicks", "subtitles.block.tripwire.detach": "Tripwire detaches", + "subtitles.block.vault.activate": "Vault ignites", + "subtitles.block.vault.ambient": "Vault crackles", + "subtitles.block.vault.close_shutter": "Vault closes", + "subtitles.block.vault.deactivate": "Vault extinguishes", + "subtitles.block.vault.eject_item": "Vault ejects item", + "subtitles.block.vault.insert_item": "Vault unlocks", + "subtitles.block.vault.insert_item_fail": "Vault fails unlocking", + "subtitles.block.vault.open_shutter": "Vault opens", "subtitles.block.water.ambient": "Water flows", + "subtitles.block.wet_sponge.dries": "Sponge dries", "subtitles.chiseled_bookshelf.insert": "Book placed", "subtitles.chiseled_bookshelf.insert_enchanted": "Enchanted Book placed", "subtitles.chiseled_bookshelf.take": "Book taken", @@ -5773,6 +5965,18 @@ "subtitles.entity.allay.item_given": "Allay chortles", "subtitles.entity.allay.item_taken": "Allay allays", "subtitles.entity.allay.item_thrown": "Allay tosses", + "subtitles.entity.armadillo.ambient": "Armadillo grunts", + "subtitles.entity.armadillo.brush": "Scute is brushed off", + "subtitles.entity.armadillo.death": "Armadillo dies", + "subtitles.entity.armadillo.eat": "Armadillo eats", + "subtitles.entity.armadillo.hurt": "Armadillo hurts", + "subtitles.entity.armadillo.hurt_reduced": "Armadillo shields itself", + "subtitles.entity.armadillo.land": "Armadillo lands", + "subtitles.entity.armadillo.peek": "Armadillo peeks", + "subtitles.entity.armadillo.roll": "Armadillo rolls up", + "subtitles.entity.armadillo.scute_drop": "Armadillo sheds scute", + "subtitles.entity.armadillo.unroll_finish": "Armadillo unrolls", + "subtitles.entity.armadillo.unroll_start": "Armadillo peeks", "subtitles.entity.armor_stand.fall": "Something fell", "subtitles.entity.arrow.hit": "Arrow hits", "subtitles.entity.arrow.hit_player": "Player hit", @@ -5802,7 +6006,12 @@ "subtitles.entity.blaze.shoot": "Blaze shoots", "subtitles.entity.boat.paddle_land": "Rowing", "subtitles.entity.boat.paddle_water": "Rowing", + "subtitles.entity.bogged.ambient": "Bogged rattles", + "subtitles.entity.bogged.death": "Bogged dies", + "subtitles.entity.bogged.hurt": "Bogged hurts", + "subtitles.entity.breeze.charge": "Breeze charges", "subtitles.entity.breeze.death": "Breeze dies", + "subtitles.entity.breeze.deflect": "Breeze deflects", "subtitles.entity.breeze.hurt": "Breeze hurts", "subtitles.entity.breeze.idle_air": "Breeze flies", "subtitles.entity.breeze.idle_ground": "Breeze whirs", @@ -5811,6 +6020,8 @@ "subtitles.entity.breeze.land": "Breeze lands", "subtitles.entity.breeze.shoot": "Breeze shoots", "subtitles.entity.breeze.slide": "Breeze slides", + "subtitles.entity.breeze.whirl": "Breeze whirls", + "subtitles.entity.breeze.wind_burst": "Wind Charge bursts", "subtitles.entity.camel.ambient": "Camel grunts", "subtitles.entity.camel.dash": "Camel yeets", "subtitles.entity.camel.dash_ready": "Camel recovers", @@ -5859,6 +6070,7 @@ "subtitles.entity.donkey.death": "Donkey dies", "subtitles.entity.donkey.eat": "Donkey eats", "subtitles.entity.donkey.hurt": "Donkey hurts", + "subtitles.entity.donkey.jump": "Donkey jumps", "subtitles.entity.drowned.ambient": "Drowned gurgles", "subtitles.entity.drowned.ambient_water": "Drowned gurgles", "subtitles.entity.drowned.death": "Drowned dies", @@ -5941,7 +6153,7 @@ "subtitles.entity.ghast.hurt": "Ghast hurts", "subtitles.entity.ghast.shoot": "Ghast shoots", "subtitles.entity.glow_item_frame.add_item": "Glow Item Frame fills", - "subtitles.entity.glow_item_frame.break": "Glow Item Frame breaks", + "subtitles.entity.glow_item_frame.break": "Glow Item Frame broken", "subtitles.entity.glow_item_frame.place": "Glow Item Frame placed", "subtitles.entity.glow_item_frame.remove_item": "Glow Item Frame empties", "subtitles.entity.glow_item_frame.rotate_item": "Glow Item Frame clicks", @@ -6001,13 +6213,13 @@ "subtitles.entity.iron_golem.hurt": "Iron Golem hurts", "subtitles.entity.iron_golem.repair": "Iron Golem repaired", "subtitles.entity.item_frame.add_item": "Item Frame fills", - "subtitles.entity.item_frame.break": "Item Frame breaks", + "subtitles.entity.item_frame.break": "Item Frame broken", "subtitles.entity.item_frame.place": "Item Frame placed", "subtitles.entity.item_frame.remove_item": "Item Frame empties", "subtitles.entity.item_frame.rotate_item": "Item Frame clicks", "subtitles.entity.item.break": "Item breaks", "subtitles.entity.item.pickup": "Item plops", - "subtitles.entity.leash_knot.break": "Leash Knot breaks", + "subtitles.entity.leash_knot.break": "Leash Knot broken", "subtitles.entity.leash_knot.place": "Leash Knot tied", "subtitles.entity.lightning_bolt.impact": "Lightning strikes", "subtitles.entity.lightning_bolt.thunder": "Thunder roars", @@ -6034,7 +6246,8 @@ "subtitles.entity.mule.death": "Mule dies", "subtitles.entity.mule.eat": "Mule eats", "subtitles.entity.mule.hurt": "Mule hurts", - "subtitles.entity.painting.break": "Painting breaks", + "subtitles.entity.mule.jump": "Mule jumps", + "subtitles.entity.painting.break": "Painting broken", "subtitles.entity.painting.place": "Painting placed", "subtitles.entity.panda.aggressive_ambient": "Panda huffs", "subtitles.entity.panda.ambient": "Panda pants", @@ -6053,6 +6266,7 @@ "subtitles.entity.parrot.fly": "Parrot flutters", "subtitles.entity.parrot.hurts": "Parrot hurts", "subtitles.entity.parrot.imitate.blaze": "Parrot breathes", + "subtitles.entity.parrot.imitate.bogged": "Parrot rattles", "subtitles.entity.parrot.imitate.breeze": "Parrot whirs", "subtitles.entity.parrot.imitate.creeper": "Parrot hisses", "subtitles.entity.parrot.imitate.drowned": "Parrot gurgles", @@ -6130,7 +6344,7 @@ "subtitles.entity.player.levelup": "Player dings", "subtitles.entity.player.teleport": "Player teleports", "subtitles.entity.polar_bear.ambient": "Polar Bear groans", - "subtitles.entity.polar_bear.ambient_baby": "Polar Bear hums", + "subtitles.entity.polar_bear.ambient_baby": "Baby Polar Bear hums", "subtitles.entity.polar_bear.death": "Polar Bear dies", "subtitles.entity.polar_bear.hurt": "Polar Bear hurts", "subtitles.entity.polar_bear.warning": "Polar Bear roars", @@ -6229,15 +6443,15 @@ "subtitles.entity.tropical_fish.hurt": "Tropical Fish hurts", "subtitles.entity.turtle.ambient_land": "Turtle chirps", "subtitles.entity.turtle.death": "Turtle dies", - "subtitles.entity.turtle.death_baby": "Turtle baby dies", + "subtitles.entity.turtle.death_baby": "Baby Turtle dies", "subtitles.entity.turtle.egg_break": "Turtle Egg breaks", "subtitles.entity.turtle.egg_crack": "Turtle Egg cracks", "subtitles.entity.turtle.egg_hatch": "Turtle Egg hatches", "subtitles.entity.turtle.hurt": "Turtle hurts", - "subtitles.entity.turtle.hurt_baby": "Turtle baby hurts", + "subtitles.entity.turtle.hurt_baby": "Baby Turtle hurts", "subtitles.entity.turtle.lay_egg": "Turtle lays egg", "subtitles.entity.turtle.shamble": "Turtle shambles", - "subtitles.entity.turtle.shamble_baby": "Turtle baby shambles", + "subtitles.entity.turtle.shamble_baby": "Baby Turtle shambles", "subtitles.entity.turtle.swim": "Turtle swims", "subtitles.entity.vex.ambient": "Vex vexes", "subtitles.entity.vex.charge": "Vex shrieks", @@ -6297,6 +6511,8 @@ "subtitles.entity.warden.sonic_charge": "Warden charges", "subtitles.entity.warden.step": "Warden steps", "subtitles.entity.warden.tendril_clicks": "Warden's tendrils click", + "subtitles.entity.wind_charge.throw": "Wind Charge flies", + "subtitles.entity.wind_charge.wind_burst": "Wind Charge bursts", "subtitles.entity.witch.ambient": "Witch giggles", "subtitles.entity.witch.celebrate": "Witch cheers", "subtitles.entity.witch.death": "Witch dies", @@ -6342,6 +6558,9 @@ "subtitles.entity.zombified_piglin.angry": "Zombified Piglin grunts angrily", "subtitles.entity.zombified_piglin.death": "Zombified Piglin dies", "subtitles.entity.zombified_piglin.hurt": "Zombified Piglin hurts", + "subtitles.event.mob_effect.bad_omen": "Omen takes hold", + "subtitles.event.mob_effect.raid_omen": "Raid looms nearby", + "subtitles.event.mob_effect.trial_omen": "Ominous trial looms nearby", "subtitles.event.raid.horn": "Ominous horn blares", "subtitles.item.armor.equip": "Gear equips", "subtitles.item.armor.equip_chain": "Chain armor jingles", @@ -6352,6 +6571,8 @@ "subtitles.item.armor.equip_leather": "Leather armor rustles", "subtitles.item.armor.equip_netherite": "Netherite armor clanks", "subtitles.item.armor.equip_turtle": "Turtle Shell thunks", + "subtitles.item.armor.equip_wolf": "Wolf Armor is fastened", + "subtitles.item.armor.unequip_wolf": "Wolf Armor snips away", "subtitles.item.axe.scrape": "Axe scrapes", "subtitles.item.axe.strip": "Axe strips", "subtitles.item.axe.wax_off": "Wax off", @@ -6389,7 +6610,10 @@ "subtitles.item.honeycomb.wax_on": "Wax on", "subtitles.item.ink_sac.use": "Ink Sac splotches", "subtitles.item.lodestone_compass.lock": "Lodestone Compass locks onto Lodestone", + "subtitles.item.mace.smash_air": "Mace smashes", + "subtitles.item.mace.smash_ground": "Mace smashes", "subtitles.item.nether_wart.plant": "Crop planted", + "subtitles.item.ominous_bottle.dispose": "Bottle breaks", "subtitles.item.shears.shear": "Shears click", "subtitles.item.shield.block": "Shield blocks", "subtitles.item.shovel.flatten": "Shovel flattens", @@ -6402,6 +6626,10 @@ "subtitles.item.trident.riptide": "Trident zooms", "subtitles.item.trident.throw": "Trident clangs", "subtitles.item.trident.thunder": "Trident thunder cracks", + "subtitles.item.wolf_armor.break": "Wolf Armor breaks", + "subtitles.item.wolf_armor.crack": "Wolf Armor cracks", + "subtitles.item.wolf_armor.damage": "Wolf Armor takes damage", + "subtitles.item.wolf_armor.repair": "Wolf Armor is repaired", "subtitles.particle.soul_escape": "Soul escapes", "subtitles.ui.cartography_table.take_result": "Map drawn", "subtitles.ui.loom.take_result": "Loom used", @@ -6506,9 +6734,11 @@ "trim_material.minecraft.netherite": "Netherite Material", "trim_material.minecraft.quartz": "Quartz Material", "trim_material.minecraft.redstone": "Redstone Material", + "trim_pattern.minecraft.bolt": "Bolt Armor Trim", "trim_pattern.minecraft.coast": "Coast Armor Trim", "trim_pattern.minecraft.dune": "Dune Armor Trim", "trim_pattern.minecraft.eye": "Eye Armor Trim", + "trim_pattern.minecraft.flow": "Flow Armor Trim", "trim_pattern.minecraft.host": "Host Armor Trim", "trim_pattern.minecraft.raiser": "Raiser Armor Trim", "trim_pattern.minecraft.rib": "Rib Armor Trim", diff --git a/azalea-physics/Cargo.toml b/azalea-physics/Cargo.toml index ecf3bc3b..8523db82 100644 --- a/azalea-physics/Cargo.toml +++ b/azalea-physics/Cargo.toml @@ -11,8 +11,6 @@ version = "0.9.1" [dependencies] azalea-block = { path = "../azalea-block", version = "0.9.0" } azalea-core = { path = "../azalea-core", version = "0.9.0" } -azalea-entity = { version = "0.9.0", path = "../azalea-entity" } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } azalea-registry = { path = "../azalea-registry", version = "0.9.0" } azalea-world = { path = "../azalea-world", version = "0.9.0" } bevy_app = "0.13.2" @@ -22,6 +20,8 @@ once_cell = "1.19.0" parking_lot = "^0.12.1" nohash-hasher = "0.2.0" smallvec = "1.13.2" +azalea-entity = { version = "0.9.0", path = "../azalea-entity" } +azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } [dev-dependencies] bevy_time = "0.13.2" diff --git a/azalea-protocol/Cargo.toml b/azalea-protocol/Cargo.toml index 0cc5968b..a1459286 100644 --- a/azalea-protocol/Cargo.toml +++ b/azalea-protocol/Cargo.toml @@ -24,8 +24,6 @@ azalea-core = { path = "../azalea-core", optional = true, version = "0.9.0", fea "serde", ] } azalea-crypto = { path = "../azalea-crypto", version = "0.9.0" } -azalea-entity = { version = "0.9.0", path = "../azalea-entity" } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } azalea-protocol-macros = { path = "./azalea-protocol-macros", version = "0.9.0" } azalea-registry = { path = "../azalea-registry", version = "0.9.0" } azalea-world = { path = "../azalea-world", version = "0.9.0" } @@ -47,7 +45,8 @@ trust-dns-resolver = { version = "^0.23.2", default-features = false, features = ] } uuid = "1.8.0" log = "0.4.21" - +azalea-entity = { version = "0.9.0", path = "../azalea-entity" } +azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } socks5-impl = "0.5.12" [features] diff --git a/azalea-protocol/azalea-protocol-macros/src/lib.rs b/azalea-protocol/azalea-protocol-macros/src/lib.rs index 0c072b84..756d0d82 100755 --- a/azalea-protocol/azalea-protocol-macros/src/lib.rs +++ b/azalea-protocol/azalea-protocol-macros/src/lib.rs @@ -12,7 +12,8 @@ fn as_packet_derive(input: TokenStream, state: proc_macro2::TokenStream) -> Toke let syn::Data::Struct(syn::DataStruct { fields, .. }) = &data else { panic!("#[derive(*Packet)] can only be used on structs") }; - let syn::Fields::Named(_) = fields else { + + let (syn::Fields::Named(_) | syn::Fields::Unit) = fields else { panic!("#[derive(*Packet)] can only be used on structs with named fields") }; let variant_name = variant_name_from(&ident); diff --git a/azalea-protocol/src/connect.rs b/azalea-protocol/src/connect.rs index cc1b71c1..cf98e419 100755 --- a/azalea-protocol/src/connect.rs +++ b/azalea-protocol/src/connect.rs @@ -104,12 +104,12 @@ pub struct WriteConnection { /// let packet = conn.read().await?; /// match packet { /// ClientboundLoginPacket::Hello(p) => { -/// let e = azalea_crypto::encrypt(&p.public_key, &p.nonce).unwrap(); +/// let e = azalea_crypto::encrypt(&p.public_key, &p.challenge).unwrap(); /// /// conn.write( /// ServerboundKeyPacket { /// key_bytes: e.encrypted_public_key, -/// encrypted_challenge: e.encrypted_nonce, +/// encrypted_challenge: e.encrypted_challenge, /// } /// .get(), /// ) @@ -127,6 +127,7 @@ pub struct WriteConnection { /// return Err("login disconnect".into()); /// } /// ClientboundLoginPacket::CustomQuery(p) => {} +/// ClientboundLoginPacket::CookieRequest(_) => {} /// } /// }; /// @@ -404,7 +405,7 @@ impl Connection { /// match conn.read().await? { /// ClientboundLoginPacket::Hello(p) => { /// // tell Mojang we're joining the server & enable encryption - /// let e = azalea_crypto::encrypt(&p.public_key, &p.nonce).unwrap(); + /// let e = azalea_crypto::encrypt(&p.public_key, &p.challenge).unwrap(); /// conn.authenticate( /// &access_token, /// &profile.id, @@ -414,7 +415,7 @@ impl Connection { /// conn.write( /// ServerboundKeyPacket { /// key_bytes: e.encrypted_public_key, - /// encrypted_challenge: e.encrypted_nonce, + /// encrypted_challenge: e.encrypted_challenge, /// }.get() /// ).await?; /// conn.set_encryption_key(e.secret_key); diff --git a/azalea-protocol/src/packets/common.rs b/azalea-protocol/src/packets/common.rs index 8ad0b753..82f6be70 100644 --- a/azalea-protocol/src/packets/common.rs +++ b/azalea-protocol/src/packets/common.rs @@ -7,7 +7,7 @@ use azalea_core::{ #[derive(Clone, Debug, McBuf)] pub struct CommonPlayerSpawnInfo { - pub dimension_type: ResourceLocation, + pub dimension_type: azalea_registry::DimensionType, pub dimension: ResourceLocation, pub seed: i64, pub game_type: GameMode, diff --git a/azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs new file mode 100644 index 00000000..38566564 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs @@ -0,0 +1,8 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundCookieRequestPacket { + pub key: ResourceLocation, +} diff --git a/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs index 0e782092..8bada6ca 100644 --- a/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs +++ b/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs @@ -1,8 +1,12 @@ +use std::collections::HashMap; + use azalea_buf::McBuf; -use azalea_core::registry_holder::RegistryHolder; +use azalea_core::resource_location::ResourceLocation; use azalea_protocol_macros::ClientboundConfigurationPacket; +use simdnbt::owned::NbtCompound; #[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] pub struct ClientboundRegistryDataPacket { - pub registry_holder: RegistryHolder, + pub registry_id: ResourceLocation, + pub entries: HashMap>, } diff --git a/azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs new file mode 100644 index 00000000..75afa8c1 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs @@ -0,0 +1,5 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundResetChatPacket; diff --git a/azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs new file mode 100644 index 00000000..0f22b054 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +use super::serverbound_select_known_packs_packet::KnownPack; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundSelectKnownPacksPacket { + pub known_packs: Vec, +} diff --git a/azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs new file mode 100644 index 00000000..fda16689 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundStoreCookiePacket { + pub key: ResourceLocation, + pub payload: Vec, +} diff --git a/azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs new file mode 100644 index 00000000..88f0054a --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundTransferPacket { + pub host: String, + #[var] + pub port: u32, +} diff --git a/azalea-protocol/src/packets/configuration/mod.rs b/azalea-protocol/src/packets/configuration/mod.rs index 9516935f..757c496c 100755 --- a/azalea-protocol/src/packets/configuration/mod.rs +++ b/azalea-protocol/src/packets/configuration/mod.rs @@ -1,41 +1,56 @@ +pub mod clientbound_cookie_request_packet; pub mod clientbound_custom_payload_packet; pub mod clientbound_disconnect_packet; pub mod clientbound_finish_configuration_packet; pub mod clientbound_keep_alive_packet; pub mod clientbound_ping_packet; pub mod clientbound_registry_data_packet; +pub mod clientbound_reset_chat_packet; pub mod clientbound_resource_pack_pop_packet; pub mod clientbound_resource_pack_push_packet; +pub mod clientbound_select_known_packs_packet; +pub mod clientbound_store_cookie_packet; +pub mod clientbound_transfer_packet; pub mod clientbound_update_enabled_features_packet; pub mod clientbound_update_tags_packet; pub mod serverbound_client_information_packet; +pub mod serverbound_cookie_response_packet; pub mod serverbound_custom_payload_packet; pub mod serverbound_finish_configuration_packet; pub mod serverbound_keep_alive_packet; pub mod serverbound_pong_packet; pub mod serverbound_resource_pack_packet; +pub mod serverbound_select_known_packs_packet; + use azalea_protocol_macros::declare_state_packets; declare_state_packets!( ConfigurationPacket, Serverbound => { 0x00: serverbound_client_information_packet::ServerboundClientInformationPacket, - 0x01: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket, - 0x02: serverbound_finish_configuration_packet::ServerboundFinishConfigurationPacket, - 0x03: serverbound_keep_alive_packet::ServerboundKeepAlivePacket, - 0x04: serverbound_pong_packet::ServerboundPongPacket, - 0x05: serverbound_resource_pack_packet::ServerboundResourcePackPacket, + 0x01: serverbound_cookie_response_packet::ServerboundCookieResponsePacket, + 0x02: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket, + 0x03: serverbound_finish_configuration_packet::ServerboundFinishConfigurationPacket, + 0x04: serverbound_keep_alive_packet::ServerboundKeepAlivePacket, + 0x05: serverbound_pong_packet::ServerboundPongPacket, + 0x06: serverbound_resource_pack_packet::ServerboundResourcePackPacket, + 0x07: serverbound_select_known_packs_packet::ServerboundSelectKnownPacksPacket, }, Clientbound => { - 0x00: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket, - 0x01: clientbound_disconnect_packet::ClientboundDisconnectPacket, - 0x02: clientbound_finish_configuration_packet::ClientboundFinishConfigurationPacket, - 0x03: clientbound_keep_alive_packet::ClientboundKeepAlivePacket, - 0x04: clientbound_ping_packet::ClientboundPingPacket, - 0x05: clientbound_registry_data_packet::ClientboundRegistryDataPacket, - 0x06: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket, - 0x07: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket, - 0x08: clientbound_update_enabled_features_packet::ClientboundUpdateEnabledFeaturesPacket, - 0x09: clientbound_update_tags_packet::ClientboundUpdateTagsPacket, + 0x00: clientbound_cookie_request_packet::ClientboundCookieRequestPacket, + 0x01: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket, + 0x02: clientbound_disconnect_packet::ClientboundDisconnectPacket, + 0x03: clientbound_finish_configuration_packet::ClientboundFinishConfigurationPacket, + 0x04: clientbound_keep_alive_packet::ClientboundKeepAlivePacket, + 0x05: clientbound_ping_packet::ClientboundPingPacket, + 0x06: clientbound_reset_chat_packet::ClientboundResetChatPacket, + 0x07: clientbound_registry_data_packet::ClientboundRegistryDataPacket, + 0x08: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket, + 0x09: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket, + 0x0a: clientbound_store_cookie_packet::ClientboundStoreCookiePacket, + 0x0b: clientbound_transfer_packet::ClientboundTransferPacket, + 0x0c: clientbound_update_enabled_features_packet::ClientboundUpdateEnabledFeaturesPacket, + 0x0d: clientbound_update_tags_packet::ClientboundUpdateTagsPacket, + 0x0e: clientbound_select_known_packs_packet::ClientboundSelectKnownPacksPacket, } ); diff --git a/azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs new file mode 100644 index 00000000..6c62c1c8 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ServerboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)] +pub struct ServerboundCookieResponsePacket { + pub key: ResourceLocation, + pub payload: Option>, +} diff --git a/azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs new file mode 100644 index 00000000..fe379a17 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs @@ -0,0 +1,14 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ServerboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)] +pub struct ServerboundSelectKnownPacksPacket { + pub known_packs: Vec, +} + +#[derive(Clone, Debug, McBuf)] +pub struct KnownPack { + pub namespace: String, + pub id: String, + pub version: String, +} diff --git a/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs b/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs index 59676fe5..9c8782d0 100755 --- a/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs @@ -22,21 +22,6 @@ pub struct ClientboundAddEntityPacket { pub z_vel: i16, } -// impl From<&ClientboundAddEntityPacket> for EntityData { -// fn from(p: &ClientboundAddEntityPacket) -> Self { -// Self::new( -// p.uuid, -// Vec3 { -// x: p.x, -// y: p.y, -// z: p.z, -// }, -// // default metadata for the entity type -// EntityMetadata::from(p.entity_type), -// ) -// } -// } - impl ClientboundAddEntityPacket { /// Make the entity into a bundle that can be inserted into the ECS. You /// must apply the metadata after inserting the bundle with diff --git a/azalea-protocol/src/packets/game/clientbound_commands_packet.rs b/azalea-protocol/src/packets/game/clientbound_commands_packet.rs index d55ed50f..822f62df 100755 --- a/azalea-protocol/src/packets/game/clientbound_commands_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_commands_packet.rs @@ -128,6 +128,7 @@ pub enum BrigadierParser { Swizzle, Team, ItemSlot, + ItemSlots, ResourceLocation, Function, EntityAnchor, @@ -143,6 +144,9 @@ pub enum BrigadierParser { TemplateMirror, TemplateRotation, Heightmap, + LootTable, + LootPredicate, + LootModifier, Uuid, } diff --git a/azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs b/azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs new file mode 100755 index 00000000..9f1c1d43 --- /dev/null +++ b/azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs @@ -0,0 +1,8 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ClientboundGamePacket; + +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] +pub struct ClientboundCookieRequestPacket { + pub key: ResourceLocation, +} diff --git a/azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs b/azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs new file mode 100755 index 00000000..641fd05e --- /dev/null +++ b/azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs @@ -0,0 +1,10 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundGamePacket; + +use super::serverbound_debug_sample_subscription::RemoteDebugSampleType; + +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] +pub struct ClientboundDebugSamplePacket { + pub sample: Vec, + pub debug_sample_type: RemoteDebugSampleType, +} diff --git a/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs b/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs index 7cae607e..437eb68e 100755 --- a/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs @@ -1,12 +1,9 @@ -use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable}; -use azalea_core::particle::ParticleData; +use azalea_buf::McBuf; use azalea_protocol_macros::ClientboundGamePacket; -use std::io::{Cursor, Write}; +use azalea_registry::ParticleKind; -#[derive(Clone, Debug, ClientboundGamePacket)] +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundLevelParticlesPacket { - #[var] - pub particle_id: u32, pub override_limiter: bool, pub x: f64, pub y: f64, @@ -15,54 +12,7 @@ pub struct ClientboundLevelParticlesPacket { pub y_dist: f32, pub z_dist: f32, pub max_speed: f32, + #[var] pub count: u32, - pub data: ParticleData, -} - -impl McBufReadable for ClientboundLevelParticlesPacket { - fn read_from(buf: &mut Cursor<&[u8]>) -> Result { - let particle_id = u32::var_read_from(buf)?; - let override_limiter = bool::read_from(buf)?; - let x = f64::read_from(buf)?; - let y = f64::read_from(buf)?; - let z = f64::read_from(buf)?; - let x_dist = f32::read_from(buf)?; - let y_dist = f32::read_from(buf)?; - let z_dist = f32::read_from(buf)?; - let max_speed = f32::read_from(buf)?; - let count = u32::read_from(buf)?; - - let data = ParticleData::read_from_id(buf, particle_id)?; - - Ok(Self { - particle_id, - override_limiter, - x, - y, - z, - x_dist, - y_dist, - z_dist, - max_speed, - count, - data, - }) - } -} - -impl McBufWritable for ClientboundLevelParticlesPacket { - fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - self.particle_id.var_write_into(buf)?; - self.override_limiter.write_into(buf)?; - self.x.write_into(buf)?; - self.y.write_into(buf)?; - self.z.write_into(buf)?; - self.x_dist.write_into(buf)?; - self.y_dist.write_into(buf)?; - self.z_dist.write_into(buf)?; - self.max_speed.write_into(buf)?; - self.count.write_into(buf)?; - self.data.write_without_id(buf)?; - Ok(()) - } + pub particle: ParticleKind, } diff --git a/azalea-protocol/src/packets/game/clientbound_login_packet.rs b/azalea-protocol/src/packets/game/clientbound_login_packet.rs index 1b70cbb9..20ed30f0 100755 --- a/azalea-protocol/src/packets/game/clientbound_login_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_login_packet.rs @@ -23,4 +23,5 @@ pub struct ClientboundLoginPacket { pub show_death_screen: bool, pub do_limited_crafting: bool, pub common: CommonPlayerSpawnInfo, + pub enforces_secure_chat: bool, } diff --git a/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs b/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs index 1a9d9ffc..a70a0aec 100755 --- a/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs @@ -6,5 +6,4 @@ use azalea_protocol_macros::ClientboundGamePacket; pub struct ClientboundServerDataPacket { pub motd: FormattedText, pub icon_bytes: Option>, - pub enforces_secure_chat: bool, } diff --git a/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs index 0acdc687..00f3980a 100755 --- a/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs @@ -7,7 +7,7 @@ use std::io::Cursor; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundSetEquipmentPacket { #[var] - pub entity: i32, + pub entity_id: u32, pub slots: EquipmentSlots, } diff --git a/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs b/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs index c7448800..2e9252ae 100755 --- a/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs @@ -1,15 +1,27 @@ -use super::clientbound_sound_packet::SoundSource; use azalea_buf::McBuf; use azalea_protocol_macros::ClientboundGamePacket; -use azalea_registry::OptionalRegistry; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundSoundEntityPacket { - pub sound: OptionalRegistry, pub source: SoundSource, #[var] pub id: u32, pub volume: f32, pub pitch: f32, + #[var] pub seed: u64, } + +#[derive(McBuf, Clone, Copy, Debug)] +pub enum SoundSource { + Master = 0, + Music = 1, + Records = 2, + Weather = 3, + Blocks = 4, + Hostile = 5, + Neutral = 6, + Players = 7, + Ambient = 8, + Voice = 9, +} diff --git a/azalea-protocol/src/packets/game/clientbound_sound_packet.rs b/azalea-protocol/src/packets/game/clientbound_sound_packet.rs index e60485a1..4d2493ed 100755 --- a/azalea-protocol/src/packets/game/clientbound_sound_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_sound_packet.rs @@ -1,10 +1,10 @@ use azalea_buf::McBuf; -use azalea_core::resource_location::ResourceLocation; use azalea_protocol_macros::ClientboundGamePacket; +use azalea_registry::SoundEvent; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundSoundPacket { - pub sound: azalea_registry::CustomRegistry, + pub sound: SoundEvent, pub source: SoundSource, pub x: i32, pub y: i32, @@ -14,12 +14,6 @@ pub struct ClientboundSoundPacket { pub seed: u64, } -#[derive(McBuf, Clone, Debug)] -pub struct CustomSoundEvent { - pub location: ResourceLocation, - pub range: Option, -} - #[derive(McBuf, Clone, Copy, Debug)] pub enum SoundSource { Master = 0, diff --git a/azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs b/azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs new file mode 100644 index 00000000..1c8ada28 --- /dev/null +++ b/azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ClientboundGamePacket; + +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] +pub struct ClientboundStoreCookiePacket { + pub key: ResourceLocation, + pub payload: Vec, +} diff --git a/azalea-protocol/src/packets/game/clientbound_transfer_packet.rs b/azalea-protocol/src/packets/game/clientbound_transfer_packet.rs new file mode 100644 index 00000000..dbce36e0 --- /dev/null +++ b/azalea-protocol/src/packets/game/clientbound_transfer_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundGamePacket; + +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] +pub struct ClientboundTransferPacket { + pub host: String, + #[var] + pub port: u32, +} diff --git a/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs b/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs index 147d3618..19d4a715 100755 --- a/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs @@ -1,18 +1,18 @@ use azalea_buf::McBuf; -use azalea_core::resource_location::ResourceLocation; use azalea_entity::attributes::AttributeModifier; use azalea_protocol_macros::ClientboundGamePacket; +use azalea_registry::Attribute; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundUpdateAttributesPacket { #[var] pub entity_id: u32, - pub attributes: Vec, + pub values: Vec, } #[derive(Clone, Debug, McBuf)] pub struct AttributeSnapshot { - pub attribute: ResourceLocation, + pub attribute: Attribute, pub base: f64, pub modifiers: Vec, } diff --git a/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs b/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs index 37ffd9ce..5c7abf3a 100755 --- a/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs @@ -1,15 +1,15 @@ use azalea_buf::McBuf; use azalea_protocol_macros::ClientboundGamePacket; -use simdnbt::owned::NbtTag; +use azalea_registry::MobEffect; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundUpdateMobEffectPacket { #[var] pub entity_id: u32, - pub effect: azalea_registry::MobEffect, - pub effect_amplifier: u8, + pub mob_effect: MobEffect, + #[var] + pub effect_amplifier: u32, #[var] pub effect_duration_ticks: u32, pub flags: u8, - pub factor_data: Option, } diff --git a/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs b/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs index 291cb580..99f4ab05 100755 --- a/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs @@ -4,19 +4,17 @@ use azalea_buf::{ use azalea_core::resource_location::ResourceLocation; use azalea_inventory::ItemSlot; use azalea_protocol_macros::ClientboundGamePacket; -use azalea_registry::RecipeSerializer; use std::io::{Cursor, Write}; -use std::str::FromStr; #[derive(Clone, Debug, McBuf, PartialEq, ClientboundGamePacket)] pub struct ClientboundUpdateRecipesPacket { - pub recipes: Vec, + pub recipes: Vec, } -#[derive(Clone, Debug, PartialEq)] -pub struct Recipe { - pub identifier: ResourceLocation, +#[derive(Clone, Debug, PartialEq, McBuf)] +pub struct RecipeHolder { + pub id: ResourceLocation, pub data: RecipeData, } @@ -156,147 +154,6 @@ pub struct Ingredient { pub allowed: Vec, } -impl McBufWritable for Recipe { - fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let recipe_serializer = match &self.data { - RecipeData::CraftingShapeless(_) => RecipeSerializer::CraftingShapeless, - RecipeData::CraftingShaped(_) => RecipeSerializer::CraftingShaped, - RecipeData::CraftingSpecialArmorDye(_) => RecipeSerializer::CraftingSpecialArmordye, - RecipeData::CraftingSpecialBookCloning(_) => { - RecipeSerializer::CraftingSpecialBookcloning - } - RecipeData::CraftingSpecialMapCloning(_) => RecipeSerializer::CraftingSpecialMapcloning, - RecipeData::CraftingSpecialMapExtending(_) => { - RecipeSerializer::CraftingSpecialMapextending - } - RecipeData::CraftingSpecialFireworkRocket(_) => { - RecipeSerializer::CraftingSpecialFireworkRocket - } - RecipeData::CraftingSpecialFireworkStar(_) => { - RecipeSerializer::CraftingSpecialFireworkStar - } - - RecipeData::CraftingSpecialFireworkStarFade(_) => { - RecipeSerializer::CraftingSpecialFireworkStarFade - } - RecipeData::CraftingSpecialRepairItem(_) => RecipeSerializer::CraftingSpecialRepairitem, - RecipeData::CraftingSpecialTippedArrow(_) => { - RecipeSerializer::CraftingSpecialTippedarrow - } - RecipeData::CraftingSpecialBannerDuplicate(_) => { - RecipeSerializer::CraftingSpecialBannerduplicate - } - RecipeData::CraftingSpecialShieldDecoration(_) => { - RecipeSerializer::CraftingSpecialShielddecoration - } - RecipeData::CraftingSpecialShulkerBoxColoring(_) => { - RecipeSerializer::CraftingSpecialShulkerboxcoloring - } - RecipeData::CraftingSpecialSuspiciousStew(_) => { - RecipeSerializer::CraftingSpecialSuspiciousstew - } - RecipeData::Smelting(_) => RecipeSerializer::Smelting, - RecipeData::Blasting(_) => RecipeSerializer::Blasting, - RecipeData::Smoking(_) => RecipeSerializer::Smoking, - RecipeData::CampfireCooking(_) => RecipeSerializer::CampfireCooking, - RecipeData::Stonecutting(_) => RecipeSerializer::Stonecutting, - RecipeData::SmithingTransform(_) => RecipeSerializer::SmithingTransform, - RecipeData::SmithingTrim(_) => RecipeSerializer::SmithingTrim, - RecipeData::CraftingDecoratedPot(_) => RecipeSerializer::CraftingDecoratedPot, - }; - let resource_location = ResourceLocation::new(&recipe_serializer.to_string()); - resource_location.write_into(buf)?; - self.identifier.write_into(buf)?; - self.data.write_without_id(buf)?; - Ok(()) - } -} - -impl McBufReadable for Recipe { - fn read_from(buf: &mut Cursor<&[u8]>) -> Result { - let recipe_serializer_name = ResourceLocation::read_from(buf)?; - let Ok(recipe_serializer) = RecipeSerializer::from_str(&recipe_serializer_name.to_string()) - else { - return Err(BufReadError::UnexpectedStringEnumVariant { - id: recipe_serializer_name.to_string(), - }); - }; - let identifier = ResourceLocation::read_from(buf)?; - - // rust doesn't let us match ResourceLocation so we have to do a big - // if-else chain :( - let data = match recipe_serializer { - RecipeSerializer::CraftingShaped => { - RecipeData::CraftingShaped(ShapedRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingShapeless => { - RecipeData::CraftingShapeless(ShapelessRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialArmordye => { - RecipeData::CraftingSpecialArmorDye(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialBookcloning => { - RecipeData::CraftingSpecialBookCloning(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialMapcloning => { - RecipeData::CraftingSpecialMapCloning(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialMapextending => { - RecipeData::CraftingSpecialMapExtending(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialFireworkRocket => { - RecipeData::CraftingSpecialFireworkRocket(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialFireworkStar => { - RecipeData::CraftingSpecialFireworkStar(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialFireworkStarFade => { - RecipeData::CraftingSpecialFireworkStarFade(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialRepairitem => { - RecipeData::CraftingSpecialRepairItem(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialTippedarrow => { - RecipeData::CraftingSpecialTippedArrow(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialBannerduplicate => { - RecipeData::CraftingSpecialBannerDuplicate(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialShielddecoration => { - RecipeData::CraftingSpecialShieldDecoration(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialShulkerboxcoloring => { - RecipeData::CraftingSpecialShulkerBoxColoring(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialSuspiciousstew => { - RecipeData::CraftingSpecialSuspiciousStew(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::Smelting => RecipeData::Smelting(CookingRecipe::read_from(buf)?), - RecipeSerializer::Blasting => RecipeData::Blasting(CookingRecipe::read_from(buf)?), - RecipeSerializer::Smoking => RecipeData::Smoking(CookingRecipe::read_from(buf)?), - RecipeSerializer::CampfireCooking => { - RecipeData::CampfireCooking(CookingRecipe::read_from(buf)?) - } - RecipeSerializer::Stonecutting => { - RecipeData::Stonecutting(StoneCutterRecipe::read_from(buf)?) - } - RecipeSerializer::SmithingTransform => { - RecipeData::SmithingTransform(SmithingTransformRecipe::read_from(buf)?) - } - RecipeSerializer::SmithingTrim => { - RecipeData::SmithingTrim(SmithingTrimRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingDecoratedPot => { - RecipeData::CraftingDecoratedPot(SimpleRecipe::read_from(buf)?) - } - }; - - let recipe = Recipe { identifier, data }; - - Ok(recipe) - } -} - #[cfg(test)] mod tests { use super::*; @@ -304,8 +161,8 @@ mod tests { #[test] fn test_crafting_shaped() { let mut buf = Vec::new(); - let recipe = Recipe { - identifier: ResourceLocation::new("minecraft:crafting_shaped"), + let recipe = RecipeHolder { + id: ResourceLocation::new("minecraft:crafting_shaped"), data: RecipeData::CraftingShaped(ShapedRecipe { group: String::new(), category: CraftingBookCategory::Building, @@ -332,15 +189,15 @@ mod tests { }), }; recipe.write_into(&mut buf).unwrap(); - let decoded_recipe = Recipe::read_from(&mut Cursor::new(&buf[..])).unwrap(); + let decoded_recipe = RecipeHolder::read_from(&mut Cursor::new(&buf[..])).unwrap(); assert_eq!(recipe, decoded_recipe); } #[test] fn test_crafting_shapeless() { let mut buf = Vec::new(); - let recipe = Recipe { - identifier: ResourceLocation::new("minecraft:crafting_shapeless"), + let recipe = RecipeHolder { + id: ResourceLocation::new("minecraft:crafting_shapeless"), data: RecipeData::CraftingShapeless(ShapelessRecipe { group: String::new(), category: CraftingBookCategory::Building, @@ -362,21 +219,21 @@ mod tests { }), }; recipe.write_into(&mut buf).unwrap(); - let decoded_recipe = Recipe::read_from(&mut Cursor::new(&buf[..])).unwrap(); + let decoded_recipe = RecipeHolder::read_from(&mut Cursor::new(&buf[..])).unwrap(); assert_eq!(recipe, decoded_recipe); } #[test] fn test_crafting_special_armordye() { let mut buf = Vec::new(); - let recipe = Recipe { - identifier: ResourceLocation::new("minecraft:crafting_special_armordye"), + let recipe = RecipeHolder { + id: ResourceLocation::new("minecraft:crafting_special_armordye"), data: RecipeData::CraftingSpecialArmorDye(SimpleRecipe { category: CraftingBookCategory::Building, }), }; recipe.write_into(&mut buf).unwrap(); - let decoded_recipe = Recipe::read_from(&mut Cursor::new(&buf[..])).unwrap(); + let decoded_recipe = RecipeHolder::read_from(&mut Cursor::new(&buf[..])).unwrap(); assert_eq!(recipe, decoded_recipe); } } diff --git a/azalea-protocol/src/packets/game/mod.rs b/azalea-protocol/src/packets/game/mod.rs index d45ea7b1..533dec8b 100755 --- a/azalea-protocol/src/packets/game/mod.rs +++ b/azalea-protocol/src/packets/game/mod.rs @@ -20,10 +20,12 @@ pub mod clientbound_container_close_packet; pub mod clientbound_container_set_content_packet; pub mod clientbound_container_set_data_packet; pub mod clientbound_container_set_slot_packet; +pub mod clientbound_cookie_request_packet; pub mod clientbound_cooldown_packet; pub mod clientbound_custom_chat_completions_packet; pub mod clientbound_custom_payload_packet; pub mod clientbound_damage_event_packet; +pub mod clientbound_debug_sample_packet; pub mod clientbound_delete_chat_packet; pub mod clientbound_disconnect_packet; pub mod clientbound_disguised_chat_packet; @@ -103,6 +105,7 @@ pub mod clientbound_sound_entity_packet; pub mod clientbound_sound_packet; pub mod clientbound_start_configuration_packet; pub mod clientbound_stop_sound_packet; +pub mod clientbound_store_cookie_packet; pub mod clientbound_system_chat_packet; pub mod clientbound_tab_list_packet; pub mod clientbound_tag_query_packet; @@ -110,16 +113,18 @@ pub mod clientbound_take_item_entity_packet; pub mod clientbound_teleport_entity_packet; pub mod clientbound_ticking_state_packet; pub mod clientbound_ticking_step_packet; +pub mod clientbound_transfer_packet; pub mod clientbound_update_advancements_packet; pub mod clientbound_update_attributes_packet; pub mod clientbound_update_mob_effect_packet; pub mod clientbound_update_recipes_packet; pub mod clientbound_update_tags_packet; pub mod serverbound_accept_teleportation_packet; -pub mod serverbound_block_entity_tag_query; +pub mod serverbound_block_entity_tag_query_packet; pub mod serverbound_change_difficulty_packet; pub mod serverbound_chat_ack_packet; pub mod serverbound_chat_command_packet; +pub mod serverbound_chat_command_signed_packet; pub mod serverbound_chat_packet; pub mod serverbound_chat_session_update_packet; pub mod serverbound_chunk_batch_received_packet; @@ -131,9 +136,11 @@ pub mod serverbound_container_button_click_packet; pub mod serverbound_container_click_packet; pub mod serverbound_container_close_packet; pub mod serverbound_container_slot_state_changed_packet; +pub mod serverbound_cookie_response_packet; pub mod serverbound_custom_payload_packet; +pub mod serverbound_debug_sample_subscription; pub mod serverbound_edit_book_packet; -pub mod serverbound_entity_tag_query; +pub mod serverbound_entity_tag_query_packet; pub mod serverbound_interact_packet; pub mod serverbound_jigsaw_generate_packet; pub mod serverbound_keep_alive_packet; @@ -177,60 +184,63 @@ declare_state_packets!( GamePacket, Serverbound => { 0x00: serverbound_accept_teleportation_packet::ServerboundAcceptTeleportationPacket, - 0x01: serverbound_block_entity_tag_query::ServerboundBlockEntityTagQuery, + 0x01: serverbound_block_entity_tag_query_packet::ServerboundBlockEntityTagQueryPacket, 0x02: serverbound_change_difficulty_packet::ServerboundChangeDifficultyPacket, 0x03: serverbound_chat_ack_packet::ServerboundChatAckPacket, 0x04: serverbound_chat_command_packet::ServerboundChatCommandPacket, - 0x05: serverbound_chat_packet::ServerboundChatPacket, - 0x06: serverbound_chat_session_update_packet::ServerboundChatSessionUpdatePacket, - 0x07: serverbound_chunk_batch_received_packet::ServerboundChunkBatchReceivedPacket, - 0x08: serverbound_client_command_packet::ServerboundClientCommandPacket, - 0x09: serverbound_client_information_packet::ServerboundClientInformationPacket, - 0x0a: serverbound_command_suggestion_packet::ServerboundCommandSuggestionPacket, - 0x0b: serverbound_configuration_acknowledged_packet::ServerboundConfigurationAcknowledgedPacket, - 0x0c: serverbound_container_button_click_packet::ServerboundContainerButtonClickPacket, - 0x0d: serverbound_container_click_packet::ServerboundContainerClickPacket, - 0x0e: serverbound_container_close_packet::ServerboundContainerClosePacket, - 0x0f: serverbound_container_slot_state_changed_packet::ServerboundContainerSlotStateChangedPacket, - 0x10: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket, - 0x11: serverbound_edit_book_packet::ServerboundEditBookPacket, - 0x12: serverbound_entity_tag_query::ServerboundEntityTagQuery, - 0x13: serverbound_interact_packet::ServerboundInteractPacket, - 0x14: serverbound_jigsaw_generate_packet::ServerboundJigsawGeneratePacket, - 0x15: serverbound_keep_alive_packet::ServerboundKeepAlivePacket, - 0x16: serverbound_lock_difficulty_packet::ServerboundLockDifficultyPacket, - 0x17: serverbound_move_player_pos_packet::ServerboundMovePlayerPosPacket, - 0x18: serverbound_move_player_pos_rot_packet::ServerboundMovePlayerPosRotPacket, - 0x19: serverbound_move_player_rot_packet::ServerboundMovePlayerRotPacket, - 0x1a: serverbound_move_player_status_only_packet::ServerboundMovePlayerStatusOnlyPacket, - 0x1b: serverbound_move_vehicle_packet::ServerboundMoveVehiclePacket, - 0x1c: serverbound_paddle_boat_packet::ServerboundPaddleBoatPacket, - 0x1d: serverbound_pick_item_packet::ServerboundPickItemPacket, - 0x1e: serverbound_ping_request_packet::ServerboundPingRequestPacket, - 0x1f: serverbound_place_recipe_packet::ServerboundPlaceRecipePacket, - 0x20: serverbound_player_abilities_packet::ServerboundPlayerAbilitiesPacket, - 0x21: serverbound_player_action_packet::ServerboundPlayerActionPacket, - 0x22: serverbound_player_command_packet::ServerboundPlayerCommandPacket, - 0x23: serverbound_player_input_packet::ServerboundPlayerInputPacket, - 0x24: serverbound_pong_packet::ServerboundPongPacket, - 0x25: serverbound_recipe_book_change_settings_packet::ServerboundRecipeBookChangeSettingsPacket, - 0x26: serverbound_recipe_book_seen_recipe_packet::ServerboundRecipeBookSeenRecipePacket, - 0x27: serverbound_rename_item_packet::ServerboundRenameItemPacket, - 0x28: serverbound_resource_pack_packet::ServerboundResourcePackPacket, - 0x29: serverbound_seen_advancements_packet::ServerboundSeenAdvancementsPacket, - 0x2a: serverbound_select_trade_packet::ServerboundSelectTradePacket, - 0x2b: serverbound_set_beacon_packet::ServerboundSetBeaconPacket, - 0x2c: serverbound_set_carried_item_packet::ServerboundSetCarriedItemPacket, - 0x2d: serverbound_set_command_block_packet::ServerboundSetCommandBlockPacket, - 0x2e: serverbound_set_command_minecart_packet::ServerboundSetCommandMinecartPacket, - 0x2f: serverbound_set_creative_mode_slot_packet::ServerboundSetCreativeModeSlotPacket, - 0x30: serverbound_set_jigsaw_block_packet::ServerboundSetJigsawBlockPacket, - 0x31: serverbound_set_structure_block_packet::ServerboundSetStructureBlockPacket, - 0x32: serverbound_sign_update_packet::ServerboundSignUpdatePacket, - 0x33: serverbound_swing_packet::ServerboundSwingPacket, - 0x34: serverbound_teleport_to_entity_packet::ServerboundTeleportToEntityPacket, - 0x35: serverbound_use_item_on_packet::ServerboundUseItemOnPacket, - 0x36: serverbound_use_item_packet::ServerboundUseItemPacket, + 0x05: serverbound_chat_command_signed_packet::ServerboundChatCommandSignedPacket, + 0x06: serverbound_chat_packet::ServerboundChatPacket, + 0x07: serverbound_chat_session_update_packet::ServerboundChatSessionUpdatePacket, + 0x08: serverbound_chunk_batch_received_packet::ServerboundChunkBatchReceivedPacket, + 0x09: serverbound_client_command_packet::ServerboundClientCommandPacket, + 0x0a: serverbound_client_information_packet::ServerboundClientInformationPacket, + 0x0b: serverbound_command_suggestion_packet::ServerboundCommandSuggestionPacket, + 0x0c: serverbound_configuration_acknowledged_packet::ServerboundConfigurationAcknowledgedPacket, + 0x0d: serverbound_container_button_click_packet::ServerboundContainerButtonClickPacket, + 0x0e: serverbound_container_click_packet::ServerboundContainerClickPacket, + 0x0f: serverbound_container_close_packet::ServerboundContainerClosePacket, + 0x10: serverbound_container_slot_state_changed_packet::ServerboundContainerSlotStateChangedPacket, + 0x11: serverbound_cookie_response_packet::ServerboundCookieResponsePacket, + 0x12: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket, + 0x13: serverbound_debug_sample_subscription::ServerboundDebugSampleSubscription, + 0x14: serverbound_edit_book_packet::ServerboundEditBookPacket, + 0x15: serverbound_entity_tag_query_packet::ServerboundEntityTagQueryPacket, + 0x16: serverbound_interact_packet::ServerboundInteractPacket, + 0x17: serverbound_jigsaw_generate_packet::ServerboundJigsawGeneratePacket, + 0x18: serverbound_keep_alive_packet::ServerboundKeepAlivePacket, + 0x19: serverbound_lock_difficulty_packet::ServerboundLockDifficultyPacket, + 0x1a: serverbound_move_player_pos_packet::ServerboundMovePlayerPosPacket, + 0x1b: serverbound_move_player_pos_rot_packet::ServerboundMovePlayerPosRotPacket, + 0x1c: serverbound_move_player_rot_packet::ServerboundMovePlayerRotPacket, + 0x1d: serverbound_move_player_status_only_packet::ServerboundMovePlayerStatusOnlyPacket, + 0x1e: serverbound_move_vehicle_packet::ServerboundMoveVehiclePacket, + 0x1f: serverbound_paddle_boat_packet::ServerboundPaddleBoatPacket, + 0x20: serverbound_pick_item_packet::ServerboundPickItemPacket, + 0x21: serverbound_ping_request_packet::ServerboundPingRequestPacket, + 0x22: serverbound_place_recipe_packet::ServerboundPlaceRecipePacket, + 0x23: serverbound_player_abilities_packet::ServerboundPlayerAbilitiesPacket, + 0x24: serverbound_player_action_packet::ServerboundPlayerActionPacket, + 0x25: serverbound_player_command_packet::ServerboundPlayerCommandPacket, + 0x26: serverbound_player_input_packet::ServerboundPlayerInputPacket, + 0x27: serverbound_pong_packet::ServerboundPongPacket, + 0x28: serverbound_recipe_book_change_settings_packet::ServerboundRecipeBookChangeSettingsPacket, + 0x29: serverbound_recipe_book_seen_recipe_packet::ServerboundRecipeBookSeenRecipePacket, + 0x2a: serverbound_rename_item_packet::ServerboundRenameItemPacket, + 0x2b: serverbound_resource_pack_packet::ServerboundResourcePackPacket, + 0x2c: serverbound_seen_advancements_packet::ServerboundSeenAdvancementsPacket, + 0x2d: serverbound_select_trade_packet::ServerboundSelectTradePacket, + 0x2e: serverbound_set_beacon_packet::ServerboundSetBeaconPacket, + 0x2f: serverbound_set_carried_item_packet::ServerboundSetCarriedItemPacket, + 0x30: serverbound_set_command_block_packet::ServerboundSetCommandBlockPacket, + 0x31: serverbound_set_command_minecart_packet::ServerboundSetCommandMinecartPacket, + 0x32: serverbound_set_creative_mode_slot_packet::ServerboundSetCreativeModeSlotPacket, + 0x33: serverbound_set_jigsaw_block_packet::ServerboundSetJigsawBlockPacket, + 0x34: serverbound_set_structure_block_packet::ServerboundSetStructureBlockPacket, + 0x35: serverbound_sign_update_packet::ServerboundSignUpdatePacket, + 0x36: serverbound_swing_packet::ServerboundSwingPacket, + 0x37: serverbound_teleport_to_entity_packet::ServerboundTeleportToEntityPacket, + 0x38: serverbound_use_item_on_packet::ServerboundUseItemOnPacket, + 0x39: serverbound_use_item_packet::ServerboundUseItemPacket, }, Clientbound => { 0x00: clientbound_bundle_packet::ClientboundBundlePacket, @@ -255,100 +265,104 @@ declare_state_packets!( 0x13: clientbound_container_set_content_packet::ClientboundContainerSetContentPacket, 0x14: clientbound_container_set_data_packet::ClientboundContainerSetDataPacket, 0x15: clientbound_container_set_slot_packet::ClientboundContainerSetSlotPacket, - 0x16: clientbound_cooldown_packet::ClientboundCooldownPacket, - 0x17: clientbound_custom_chat_completions_packet::ClientboundCustomChatCompletionsPacket, - 0x18: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket, - 0x19: clientbound_damage_event_packet::ClientboundDamageEventPacket, - 0x1a: clientbound_delete_chat_packet::ClientboundDeleteChatPacket, - 0x1b: clientbound_disconnect_packet::ClientboundDisconnectPacket, - 0x1c: clientbound_disguised_chat_packet::ClientboundDisguisedChatPacket, - 0x1d: clientbound_entity_event_packet::ClientboundEntityEventPacket, - 0x1e: clientbound_explode_packet::ClientboundExplodePacket, - 0x1f: clientbound_forget_level_chunk_packet::ClientboundForgetLevelChunkPacket, - 0x20: clientbound_game_event_packet::ClientboundGameEventPacket, - 0x21: clientbound_horse_screen_open_packet::ClientboundHorseScreenOpenPacket, - 0x22: clientbound_hurt_animation_packet::ClientboundHurtAnimationPacket, - 0x23: clientbound_initialize_border_packet::ClientboundInitializeBorderPacket, - 0x24: clientbound_keep_alive_packet::ClientboundKeepAlivePacket, - 0x25: clientbound_level_chunk_with_light_packet::ClientboundLevelChunkWithLightPacket, - 0x26: clientbound_level_event_packet::ClientboundLevelEventPacket, - 0x27: clientbound_level_particles_packet::ClientboundLevelParticlesPacket, - 0x28: clientbound_light_update_packet::ClientboundLightUpdatePacket, - 0x29: clientbound_login_packet::ClientboundLoginPacket, - 0x2a: clientbound_map_item_data_packet::ClientboundMapItemDataPacket, - 0x2b: clientbound_merchant_offers_packet::ClientboundMerchantOffersPacket, - 0x2c: clientbound_move_entity_pos_packet::ClientboundMoveEntityPosPacket, - 0x2d: clientbound_move_entity_pos_rot_packet::ClientboundMoveEntityPosRotPacket, - 0x2e: clientbound_move_entity_rot_packet::ClientboundMoveEntityRotPacket, - 0x2f: clientbound_move_vehicle_packet::ClientboundMoveVehiclePacket, - 0x30: clientbound_open_book_packet::ClientboundOpenBookPacket, - 0x31: clientbound_open_screen_packet::ClientboundOpenScreenPacket, - 0x32: clientbound_open_sign_editor_packet::ClientboundOpenSignEditorPacket, - 0x33: clientbound_ping_packet::ClientboundPingPacket, - 0x34: clientbound_pong_response_packet::ClientboundPongResponsePacket, - 0x35: clientbound_place_ghost_recipe_packet::ClientboundPlaceGhostRecipePacket, - 0x36: clientbound_player_abilities_packet::ClientboundPlayerAbilitiesPacket, - 0x37: clientbound_player_chat_packet::ClientboundPlayerChatPacket, - 0x38: clientbound_player_combat_end_packet::ClientboundPlayerCombatEndPacket, - 0x39: clientbound_player_combat_enter_packet::ClientboundPlayerCombatEnterPacket, - 0x3a: clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket, - 0x3b: clientbound_player_info_remove_packet::ClientboundPlayerInfoRemovePacket, - 0x3c: clientbound_player_info_update_packet::ClientboundPlayerInfoUpdatePacket, - 0x3d: clientbound_player_look_at_packet::ClientboundPlayerLookAtPacket, - 0x3e: clientbound_player_position_packet::ClientboundPlayerPositionPacket, - 0x3f: clientbound_recipe_packet::ClientboundRecipePacket, - 0x40: clientbound_remove_entities_packet::ClientboundRemoveEntitiesPacket, - 0x41: clientbound_remove_mob_effect_packet::ClientboundRemoveMobEffectPacket, - 0x42: clientbound_reset_score_packet::ClientboundResetScorePacket, - 0x43: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket, - 0x44: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket, - 0x45: clientbound_respawn_packet::ClientboundRespawnPacket, - 0x46: clientbound_rotate_head_packet::ClientboundRotateHeadPacket, - 0x47: clientbound_section_blocks_update_packet::ClientboundSectionBlocksUpdatePacket, - 0x48: clientbound_select_advancements_tab_packet::ClientboundSelectAdvancementsTabPacket, - 0x49: clientbound_server_data_packet::ClientboundServerDataPacket, - 0x4a: clientbound_set_action_bar_text_packet::ClientboundSetActionBarTextPacket, - 0x4b: clientbound_set_border_center_packet::ClientboundSetBorderCenterPacket, - 0x4c: clientbound_set_border_lerp_size_packet::ClientboundSetBorderLerpSizePacket, - 0x4d: clientbound_set_border_size_packet::ClientboundSetBorderSizePacket, - 0x4e: clientbound_set_border_warning_delay_packet::ClientboundSetBorderWarningDelayPacket, - 0x4f: clientbound_set_border_warning_distance_packet::ClientboundSetBorderWarningDistancePacket, - 0x50: clientbound_set_camera_packet::ClientboundSetCameraPacket, - 0x51: clientbound_set_carried_item_packet::ClientboundSetCarriedItemPacket, - 0x52: clientbound_set_chunk_cache_center_packet::ClientboundSetChunkCacheCenterPacket, - 0x53: clientbound_set_chunk_cache_radius_packet::ClientboundSetChunkCacheRadiusPacket, - 0x54: clientbound_set_default_spawn_position_packet::ClientboundSetDefaultSpawnPositionPacket, - 0x55: clientbound_set_display_objective_packet::ClientboundSetDisplayObjectivePacket, - 0x56: clientbound_set_entity_data_packet::ClientboundSetEntityDataPacket, - 0x57: clientbound_set_entity_link_packet::ClientboundSetEntityLinkPacket, - 0x58: clientbound_set_entity_motion_packet::ClientboundSetEntityMotionPacket, - 0x59: clientbound_set_equipment_packet::ClientboundSetEquipmentPacket, - 0x5a: clientbound_set_experience_packet::ClientboundSetExperiencePacket, - 0x5b: clientbound_set_health_packet::ClientboundSetHealthPacket, - 0x5c: clientbound_set_objective_packet::ClientboundSetObjectivePacket, - 0x5d: clientbound_set_passengers_packet::ClientboundSetPassengersPacket, - 0x5e: clientbound_set_player_team_packet::ClientboundSetPlayerTeamPacket, - 0x5f: clientbound_set_score_packet::ClientboundSetScorePacket, - 0x60: clientbound_set_simulation_distance_packet::ClientboundSetSimulationDistancePacket, - 0x61: clientbound_set_subtitle_text_packet::ClientboundSetSubtitleTextPacket, - 0x62: clientbound_set_time_packet::ClientboundSetTimePacket, - 0x63: clientbound_set_title_text_packet::ClientboundSetTitleTextPacket, - 0x64: clientbound_set_titles_animation_packet::ClientboundSetTitlesAnimationPacket, - 0x65: clientbound_sound_entity_packet::ClientboundSoundEntityPacket, - 0x66: clientbound_sound_packet::ClientboundSoundPacket, - 0x67: clientbound_start_configuration_packet::ClientboundStartConfigurationPacket, - 0x68: clientbound_stop_sound_packet::ClientboundStopSoundPacket, - 0x69: clientbound_system_chat_packet::ClientboundSystemChatPacket, - 0x6a: clientbound_tab_list_packet::ClientboundTabListPacket, - 0x6b: clientbound_tag_query_packet::ClientboundTagQueryPacket, - 0x6c: clientbound_take_item_entity_packet::ClientboundTakeItemEntityPacket, - 0x6d: clientbound_teleport_entity_packet::ClientboundTeleportEntityPacket, - 0x6e: clientbound_ticking_state_packet::ClientboundTickingStatePacket, - 0x6f: clientbound_ticking_step_packet::ClientboundTickingStepPacket, - 0x70: clientbound_update_advancements_packet::ClientboundUpdateAdvancementsPacket, - 0x71: clientbound_update_attributes_packet::ClientboundUpdateAttributesPacket, - 0x72: clientbound_update_mob_effect_packet::ClientboundUpdateMobEffectPacket, - 0x73: clientbound_update_recipes_packet::ClientboundUpdateRecipesPacket, - 0x74: clientbound_update_tags_packet::ClientboundUpdateTagsPacket, + 0x16: clientbound_cookie_request_packet::ClientboundCookieRequestPacket, + 0x17: clientbound_cooldown_packet::ClientboundCooldownPacket, + 0x18: clientbound_custom_chat_completions_packet::ClientboundCustomChatCompletionsPacket, + 0x19: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket, + 0x1a: clientbound_damage_event_packet::ClientboundDamageEventPacket, + 0x1b: clientbound_debug_sample_packet::ClientboundDebugSamplePacket, + 0x1c: clientbound_delete_chat_packet::ClientboundDeleteChatPacket, + 0x1d: clientbound_disconnect_packet::ClientboundDisconnectPacket, + 0x1e: clientbound_disguised_chat_packet::ClientboundDisguisedChatPacket, + 0x1f: clientbound_entity_event_packet::ClientboundEntityEventPacket, + 0x20: clientbound_explode_packet::ClientboundExplodePacket, + 0x21: clientbound_forget_level_chunk_packet::ClientboundForgetLevelChunkPacket, + 0x22: clientbound_game_event_packet::ClientboundGameEventPacket, + 0x23: clientbound_horse_screen_open_packet::ClientboundHorseScreenOpenPacket, + 0x24: clientbound_hurt_animation_packet::ClientboundHurtAnimationPacket, + 0x25: clientbound_initialize_border_packet::ClientboundInitializeBorderPacket, + 0x26: clientbound_keep_alive_packet::ClientboundKeepAlivePacket, + 0x27: clientbound_level_chunk_with_light_packet::ClientboundLevelChunkWithLightPacket, + 0x28: clientbound_level_event_packet::ClientboundLevelEventPacket, + 0x29: clientbound_level_particles_packet::ClientboundLevelParticlesPacket, + 0x2a: clientbound_light_update_packet::ClientboundLightUpdatePacket, + 0x2b: clientbound_login_packet::ClientboundLoginPacket, + 0x2c: clientbound_map_item_data_packet::ClientboundMapItemDataPacket, + 0x2d: clientbound_merchant_offers_packet::ClientboundMerchantOffersPacket, + 0x2e: clientbound_move_entity_pos_packet::ClientboundMoveEntityPosPacket, + 0x2f: clientbound_move_entity_pos_rot_packet::ClientboundMoveEntityPosRotPacket, + 0x30: clientbound_move_entity_rot_packet::ClientboundMoveEntityRotPacket, + 0x31: clientbound_move_vehicle_packet::ClientboundMoveVehiclePacket, + 0x32: clientbound_open_book_packet::ClientboundOpenBookPacket, + 0x33: clientbound_open_screen_packet::ClientboundOpenScreenPacket, + 0x34: clientbound_open_sign_editor_packet::ClientboundOpenSignEditorPacket, + 0x35: clientbound_ping_packet::ClientboundPingPacket, + 0x36: clientbound_pong_response_packet::ClientboundPongResponsePacket, + 0x37: clientbound_place_ghost_recipe_packet::ClientboundPlaceGhostRecipePacket, + 0x38: clientbound_player_abilities_packet::ClientboundPlayerAbilitiesPacket, + 0x39: clientbound_player_chat_packet::ClientboundPlayerChatPacket, + 0x3a: clientbound_player_combat_end_packet::ClientboundPlayerCombatEndPacket, + 0x3b: clientbound_player_combat_enter_packet::ClientboundPlayerCombatEnterPacket, + 0x3c: clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket, + 0x3d: clientbound_player_info_remove_packet::ClientboundPlayerInfoRemovePacket, + 0x3e: clientbound_player_info_update_packet::ClientboundPlayerInfoUpdatePacket, + 0x3f: clientbound_player_look_at_packet::ClientboundPlayerLookAtPacket, + 0x40: clientbound_player_position_packet::ClientboundPlayerPositionPacket, + 0x41: clientbound_recipe_packet::ClientboundRecipePacket, + 0x42: clientbound_remove_entities_packet::ClientboundRemoveEntitiesPacket, + 0x43: clientbound_remove_mob_effect_packet::ClientboundRemoveMobEffectPacket, + 0x44: clientbound_reset_score_packet::ClientboundResetScorePacket, + 0x45: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket, + 0x46: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket, + 0x47: clientbound_respawn_packet::ClientboundRespawnPacket, + 0x48: clientbound_rotate_head_packet::ClientboundRotateHeadPacket, + 0x49: clientbound_section_blocks_update_packet::ClientboundSectionBlocksUpdatePacket, + 0x4a: clientbound_select_advancements_tab_packet::ClientboundSelectAdvancementsTabPacket, + 0x4b: clientbound_server_data_packet::ClientboundServerDataPacket, + 0x4c: clientbound_set_action_bar_text_packet::ClientboundSetActionBarTextPacket, + 0x4d: clientbound_set_border_center_packet::ClientboundSetBorderCenterPacket, + 0x4e: clientbound_set_border_lerp_size_packet::ClientboundSetBorderLerpSizePacket, + 0x4f: clientbound_set_border_size_packet::ClientboundSetBorderSizePacket, + 0x50: clientbound_set_border_warning_delay_packet::ClientboundSetBorderWarningDelayPacket, + 0x51: clientbound_set_border_warning_distance_packet::ClientboundSetBorderWarningDistancePacket, + 0x52: clientbound_set_camera_packet::ClientboundSetCameraPacket, + 0x53: clientbound_set_carried_item_packet::ClientboundSetCarriedItemPacket, + 0x54: clientbound_set_chunk_cache_center_packet::ClientboundSetChunkCacheCenterPacket, + 0x55: clientbound_set_chunk_cache_radius_packet::ClientboundSetChunkCacheRadiusPacket, + 0x56: clientbound_set_default_spawn_position_packet::ClientboundSetDefaultSpawnPositionPacket, + 0x57: clientbound_set_display_objective_packet::ClientboundSetDisplayObjectivePacket, + 0x58: clientbound_set_entity_data_packet::ClientboundSetEntityDataPacket, + 0x59: clientbound_set_entity_link_packet::ClientboundSetEntityLinkPacket, + 0x5a: clientbound_set_entity_motion_packet::ClientboundSetEntityMotionPacket, + 0x5b: clientbound_set_equipment_packet::ClientboundSetEquipmentPacket, + 0x5c: clientbound_set_experience_packet::ClientboundSetExperiencePacket, + 0x5d: clientbound_set_health_packet::ClientboundSetHealthPacket, + 0x5e: clientbound_set_objective_packet::ClientboundSetObjectivePacket, + 0x5f: clientbound_set_passengers_packet::ClientboundSetPassengersPacket, + 0x60: clientbound_set_player_team_packet::ClientboundSetPlayerTeamPacket, + 0x61: clientbound_set_score_packet::ClientboundSetScorePacket, + 0x62: clientbound_set_simulation_distance_packet::ClientboundSetSimulationDistancePacket, + 0x63: clientbound_set_subtitle_text_packet::ClientboundSetSubtitleTextPacket, + 0x64: clientbound_set_time_packet::ClientboundSetTimePacket, + 0x65: clientbound_set_title_text_packet::ClientboundSetTitleTextPacket, + 0x66: clientbound_set_titles_animation_packet::ClientboundSetTitlesAnimationPacket, + 0x67: clientbound_sound_entity_packet::ClientboundSoundEntityPacket, + 0x68: clientbound_sound_packet::ClientboundSoundPacket, + 0x69: clientbound_start_configuration_packet::ClientboundStartConfigurationPacket, + 0x6a: clientbound_stop_sound_packet::ClientboundStopSoundPacket, + 0x6b: clientbound_store_cookie_packet::ClientboundStoreCookiePacket, + 0x6c: clientbound_system_chat_packet::ClientboundSystemChatPacket, + 0x6d: clientbound_tab_list_packet::ClientboundTabListPacket, + 0x6e: clientbound_tag_query_packet::ClientboundTagQueryPacket, + 0x6f: clientbound_take_item_entity_packet::ClientboundTakeItemEntityPacket, + 0x70: clientbound_teleport_entity_packet::ClientboundTeleportEntityPacket, + 0x71: clientbound_ticking_state_packet::ClientboundTickingStatePacket, + 0x72: clientbound_ticking_step_packet::ClientboundTickingStepPacket, + 0x73: clientbound_transfer_packet::ClientboundTransferPacket, + 0x74: clientbound_update_advancements_packet::ClientboundUpdateAdvancementsPacket, + 0x75: clientbound_update_attributes_packet::ClientboundUpdateAttributesPacket, + 0x76: clientbound_update_mob_effect_packet::ClientboundUpdateMobEffectPacket, + 0x77: clientbound_update_recipes_packet::ClientboundUpdateRecipesPacket, + 0x78: clientbound_update_tags_packet::ClientboundUpdateTagsPacket, } ); diff --git a/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs b/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs new file mode 100644 index 00000000..d8856647 --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs @@ -0,0 +1,10 @@ +use azalea_buf::McBuf; +use azalea_core::position::BlockPos; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundBlockEntityTagQueryPacket { + #[var] + pub transaction_id: u32, + pub pos: BlockPos, +} diff --git a/azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs b/azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs new file mode 100755 index 00000000..bb814d55 --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs @@ -0,0 +1,19 @@ +use super::serverbound_chat_packet::LastSeenMessagesUpdate; +use azalea_buf::McBuf; +use azalea_crypto::MessageSignature; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundChatCommandSignedPacket { + pub command: String, + pub timestamp: u64, + pub salt: u64, + pub argument_signatures: Vec, + pub last_seen_messages: LastSeenMessagesUpdate, +} + +#[derive(Clone, Debug, McBuf)] +pub struct ArgumentSignature { + pub name: String, + pub signature: MessageSignature, +} diff --git a/azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs b/azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs new file mode 100644 index 00000000..8ad0f07e --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundCookieResponsePacket { + pub key: ResourceLocation, + pub payload: Option>, +} diff --git a/azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs b/azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs new file mode 100755 index 00000000..236972e0 --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs @@ -0,0 +1,12 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundDebugSampleSubscription { + pub sample_type: RemoteDebugSampleType, +} + +#[derive(Clone, Copy, Debug, McBuf)] +pub enum RemoteDebugSampleType { + TickTime, +} diff --git a/azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs b/azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs new file mode 100644 index 00000000..d40a59a6 --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs @@ -0,0 +1,10 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundEntityTagQueryPacket { + #[var] + pub transaction_id: u32, + #[var] + pub entity_id: u32, +} diff --git a/azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs b/azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs new file mode 100755 index 00000000..27ea0c09 --- /dev/null +++ b/azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs @@ -0,0 +1,8 @@ +use azalea_buf::McBuf; +use azalea_chat::FormattedText; +use azalea_protocol_macros::ClientboundLoginPacket; + +#[derive(Clone, Debug, McBuf, ClientboundLoginPacket)] +pub struct ClientboundCookieRequestPacket { + pub key: FormattedText, +} diff --git a/azalea-protocol/src/packets/login/clientbound_game_profile_packet.rs b/azalea-protocol/src/packets/login/clientbound_game_profile_packet.rs index 2783159a..51f486d0 100755 --- a/azalea-protocol/src/packets/login/clientbound_game_profile_packet.rs +++ b/azalea-protocol/src/packets/login/clientbound_game_profile_packet.rs @@ -5,4 +5,5 @@ use azalea_protocol_macros::ClientboundLoginPacket; #[derive(Clone, Debug, McBuf, ClientboundLoginPacket)] pub struct ClientboundGameProfilePacket { pub game_profile: GameProfile, + pub strict_error_handling: bool, } diff --git a/azalea-protocol/src/packets/login/clientbound_hello_packet.rs b/azalea-protocol/src/packets/login/clientbound_hello_packet.rs index 0d5cce7d..9beb499c 100755 --- a/azalea-protocol/src/packets/login/clientbound_hello_packet.rs +++ b/azalea-protocol/src/packets/login/clientbound_hello_packet.rs @@ -7,5 +7,6 @@ pub struct ClientboundHelloPacket { // #[len(20)] pub server_id: String, pub public_key: Vec, - pub nonce: Vec, + pub challenge: Vec, + pub should_authenticate: bool, } diff --git a/azalea-protocol/src/packets/login/mod.rs b/azalea-protocol/src/packets/login/mod.rs index f9bf8dad..2037f2c1 100755 --- a/azalea-protocol/src/packets/login/mod.rs +++ b/azalea-protocol/src/packets/login/mod.rs @@ -1,8 +1,10 @@ +pub mod clientbound_cookie_request_packet; pub mod clientbound_custom_query_packet; pub mod clientbound_game_profile_packet; pub mod clientbound_hello_packet; pub mod clientbound_login_compression_packet; pub mod clientbound_login_disconnect_packet; +pub mod serverbound_cookie_response_packet; pub mod serverbound_custom_query_answer_packet; pub mod serverbound_hello_packet; pub mod serverbound_key_packet; @@ -17,6 +19,7 @@ declare_state_packets!( 0x01: serverbound_key_packet::ServerboundKeyPacket, 0x02: serverbound_custom_query_answer_packet::ServerboundCustomQueryAnswerPacket, 0x03: serverbound_login_acknowledged_packet::ServerboundLoginAcknowledgedPacket, + 0x04: serverbound_cookie_response_packet::ServerboundCookieResponsePacket, }, Clientbound => { 0x00: clientbound_login_disconnect_packet::ClientboundLoginDisconnectPacket, @@ -24,5 +27,6 @@ declare_state_packets!( 0x02: clientbound_game_profile_packet::ClientboundGameProfilePacket, 0x03: clientbound_login_compression_packet::ClientboundLoginCompressionPacket, 0x04: clientbound_custom_query_packet::ClientboundCustomQueryPacket, + 0x05: clientbound_cookie_request_packet::ClientboundCookieRequestPacket, } ); diff --git a/azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs b/azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs new file mode 100755 index 00000000..2074e2e7 --- /dev/null +++ b/azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ServerboundLoginPacket; + +#[derive(Clone, Debug, McBuf, ServerboundLoginPacket)] +pub struct ServerboundCookieResponsePacket { + pub key: ResourceLocation, + pub payload: Option>, +} diff --git a/azalea-protocol/src/packets/mod.rs b/azalea-protocol/src/packets/mod.rs index 4bb4b7de..63a0c1c9 100755 --- a/azalea-protocol/src/packets/mod.rs +++ b/azalea-protocol/src/packets/mod.rs @@ -12,7 +12,7 @@ use std::io::{Cursor, Write}; // TODO: rename the packet files to just like clientbound_add_entity instead of // clientbound_add_entity_packet -pub const PROTOCOL_VERSION: i32 = 765; +pub const PROTOCOL_VERSION: i32 = 766; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum ConnectionProtocol { diff --git a/azalea-registry/src/extra.rs b/azalea-registry/src/extra.rs new file mode 100644 index 00000000..6be981c1 --- /dev/null +++ b/azalea-registry/src/extra.rs @@ -0,0 +1,74 @@ +//! These registries are sent by the server during the configuration state so +//! you should be relying on those if possible, but these are provided for your +//! convenience anyways. + +use crate::Registry; +use azalea_registry_macros::registry; + +registry! { +enum WolfVariant { + Pale => "minecraft:wolf", + Spotted => "minecraft:wolf_spotted", + Snowy => "minecraft:wolf_snowy", + Black => "minecraft:wolf_black", + Ashen => "minecraft:wolf_ashen", + Rusty => "minecraft:wolf_rusty", + Woods => "minecraft:wolf_woods", + Chestnut => "minecraft:wolf_chestnut", + Striped => "minecraft:wolf_striped", +} +} + +#[allow(clippy::derivable_impls)] +impl Default for WolfVariant { + fn default() -> Self { + WolfVariant::Pale + } +} + +registry! { +enum DimensionType { + Overworld => "minecraft:overworld", + Nether => "minecraft:the_nether", + End => "minecraft:the_end", + OverworldCaves => "minecraft:overworld_caves", +} +} + +registry! { +enum TrimMaterial { + Quartz => "minecraft:quartz", + Iron => "minecraft:iron", + Netherite => "minecraft:netherite", + Redstone => "minecraft:redstone", + Copper => "minecraft:copper", + Gold => "minecraft:gold", + Emerald => "minecraft:emerald", + Diamond => "minecraft:diamond", + Lapis => "minecraft:lapis", + Amethyst => "minecraft:amethyst", +} +} + +registry! { +enum TrimPattern { + Sentry => "sentry", + Dune => "dune", + Coast => "coast", + Wild => "wild", + Ward => "ward", + Eye => "eye", + Vex => "vex", + Tide => "tide", + Snout => "snout", + Rib => "rib", + Spire => "spire", + Wayfinder => "wayfinder", + Shaper => "shaper", + Silence => "silence", + Raiser => "raiser", + Host => "host", + Flow => "flow", + Bolt => "bolt", +} +} diff --git a/azalea-registry/src/lib.rs b/azalea-registry/src/lib.rs index 448dd334..63ebdc61 100755 --- a/azalea-registry/src/lib.rs +++ b/azalea-registry/src/lib.rs @@ -5,6 +5,7 @@ // auto-generated (so you can add doc comments to the registry enums if you // want) +mod extra; pub mod tags; use std::io::{Cursor, Write}; @@ -12,7 +13,9 @@ use std::io::{Cursor, Write}; use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable}; use azalea_registry_macros::registry; -pub trait Registry +pub use extra::*; + +pub trait Registry: McBufReadable + McBufWritable where Self: Sized, { @@ -77,6 +80,58 @@ impl McBufWritable for CustomRegi } } +#[derive(Clone, PartialEq)] +pub enum HolderSet { + Direct { + contents: Vec, + }, + Named { + key: ResourceLocation, + contents: Vec, + }, +} + +impl McBufReadable + for HolderSet +{ + fn read_from(buf: &mut Cursor<&[u8]>) -> Result { + let size = i32::var_read_from(buf)? - 1; + if size == -1 { + let key = ResourceLocation::read_from(buf)?; + Ok(Self::Named { + key, + contents: Vec::new(), + }) + } else { + let mut contents = Vec::new(); + for _ in 0..size { + contents.push(D::read_from(buf)?); + } + Ok(Self::Direct { contents }) + } + } +} + +impl McBufWritable + for HolderSet +{ + fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { + match self { + Self::Direct { contents } => { + (contents.len() as i32 + 1).var_write_into(buf)?; + for item in contents { + item.write_into(buf)?; + } + } + Self::Named { key, .. } => { + 0i32.var_write_into(buf)?; + key.write_into(buf)?; + } + } + Ok(()) + } +} + registry! { /// The AI code that's currently being executed for the entity. enum Activity { @@ -116,15 +171,23 @@ enum Attribute { GenericAttackDamage => "minecraft:generic.attack_damage", GenericAttackKnockback => "minecraft:generic.attack_knockback", GenericAttackSpeed => "minecraft:generic.attack_speed", + PlayerBlockBreakSpeed => "minecraft:player.block_break_speed", + PlayerBlockInteractionRange => "minecraft:player.block_interaction_range", + PlayerEntityInteractionRange => "minecraft:player.entity_interaction_range", + GenericFallDamageMultiplier => "minecraft:generic.fall_damage_multiplier", GenericFlyingSpeed => "minecraft:generic.flying_speed", GenericFollowRange => "minecraft:generic.follow_range", - HorseJumpStrength => "minecraft:horse.jump_strength", + GenericGravity => "minecraft:generic.gravity", + GenericJumpStrength => "minecraft:generic.jump_strength", GenericKnockbackResistance => "minecraft:generic.knockback_resistance", GenericLuck => "minecraft:generic.luck", GenericMaxAbsorption => "minecraft:generic.max_absorption", GenericMaxHealth => "minecraft:generic.max_health", GenericMovementSpeed => "minecraft:generic.movement_speed", + GenericSafeFallDistance => "minecraft:generic.safe_fall_distance", + GenericScale => "minecraft:generic.scale", ZombieSpawnReinforcements => "minecraft:zombie.spawn_reinforcements", + GenericStepHeight => "minecraft:generic.step_height", } } @@ -1239,6 +1302,8 @@ enum Block { DecoratedPot => "minecraft:decorated_pot", Crafter => "minecraft:crafter", TrialSpawner => "minecraft:trial_spawner", + Vault => "minecraft:vault", + HeavyCore => "minecraft:heavy_core", } } @@ -1290,6 +1355,7 @@ enum BlockEntityKind { DecoratedPot => "minecraft:decorated_pot", Crafter => "minecraft:crafter", TrialSpawner => "minecraft:trial_spawner", + Vault => "minecraft:vault", } } @@ -1379,6 +1445,7 @@ enum CommandArgumentKind { Swizzle => "minecraft:swizzle", Team => "minecraft:team", ItemSlot => "minecraft:item_slot", + ItemSlots => "minecraft:item_slots", ResourceLocation => "minecraft:resource_location", Function => "minecraft:function", EntityAnchor => "minecraft:entity_anchor", @@ -1394,6 +1461,9 @@ enum CommandArgumentKind { TemplateMirror => "minecraft:template_mirror", TemplateRotation => "minecraft:template_rotation", Heightmap => "minecraft:heightmap", + LootTable => "minecraft:loot_table", + LootPredicate => "minecraft:loot_predicate", + LootModifier => "minecraft:loot_modifier", Uuid => "minecraft:uuid", } } @@ -1499,7 +1569,7 @@ enum Enchantment { Knockback => "minecraft:knockback", FireAspect => "minecraft:fire_aspect", Looting => "minecraft:looting", - Sweeping => "minecraft:sweeping", + SweepingEdge => "minecraft:sweeping_edge", Efficiency => "minecraft:efficiency", SilkTouch => "minecraft:silk_touch", Unbreaking => "minecraft:unbreaking", @@ -1517,6 +1587,9 @@ enum Enchantment { Multishot => "minecraft:multishot", QuickCharge => "minecraft:quick_charge", Piercing => "minecraft:piercing", + Density => "minecraft:density", + Breach => "minecraft:breach", + WindBurst => "minecraft:wind_burst", Mending => "minecraft:mending", VanishingCurse => "minecraft:vanishing_curse", } @@ -1527,6 +1600,7 @@ registry! { enum EntityKind { Allay => "minecraft:allay", AreaEffectCloud => "minecraft:area_effect_cloud", + Armadillo => "minecraft:armadillo", ArmorStand => "minecraft:armor_stand", Arrow => "minecraft:arrow", Axolotl => "minecraft:axolotl", @@ -1535,7 +1609,9 @@ enum EntityKind { Blaze => "minecraft:blaze", BlockDisplay => "minecraft:block_display", Boat => "minecraft:boat", + Bogged => "minecraft:bogged", Breeze => "minecraft:breeze", + BreezeWindCharge => "minecraft:breeze_wind_charge", Camel => "minecraft:camel", Cat => "minecraft:cat", CaveSpider => "minecraft:cave_spider", @@ -1583,6 +1659,7 @@ enum EntityKind { Item => "minecraft:item", ItemDisplay => "minecraft:item_display", ItemFrame => "minecraft:item_frame", + OminousItemSpawner => "minecraft:ominous_item_spawner", Fireball => "minecraft:fireball", LeashKnot => "minecraft:leash_knot", LightningBolt => "minecraft:lightning_bolt", @@ -1868,6 +1945,7 @@ enum Item { RawIronBlock => "minecraft:raw_iron_block", RawCopperBlock => "minecraft:raw_copper_block", RawGoldBlock => "minecraft:raw_gold_block", + HeavyCore => "minecraft:heavy_core", AmethystBlock => "minecraft:amethyst_block", BuddingAmethyst => "minecraft:budding_amethyst", IronBlock => "minecraft:iron_block", @@ -2577,7 +2655,9 @@ enum Item { StructureBlock => "minecraft:structure_block", Jigsaw => "minecraft:jigsaw", TurtleHelmet => "minecraft:turtle_helmet", - Scute => "minecraft:scute", + TurtleScute => "minecraft:turtle_scute", + ArmadilloScute => "minecraft:armadillo_scute", + WolfArmor => "minecraft:wolf_armor", FlintAndSteel => "minecraft:flint_and_steel", Apple => "minecraft:apple", Bow => "minecraft:bow", @@ -2788,11 +2868,13 @@ enum Item { Cauldron => "minecraft:cauldron", EnderEye => "minecraft:ender_eye", GlisteringMelonSlice => "minecraft:glistering_melon_slice", + ArmadilloSpawnEgg => "minecraft:armadillo_spawn_egg", AllaySpawnEgg => "minecraft:allay_spawn_egg", AxolotlSpawnEgg => "minecraft:axolotl_spawn_egg", BatSpawnEgg => "minecraft:bat_spawn_egg", BeeSpawnEgg => "minecraft:bee_spawn_egg", BlazeSpawnEgg => "minecraft:blaze_spawn_egg", + BoggedSpawnEgg => "minecraft:bogged_spawn_egg", BreezeSpawnEgg => "minecraft:breeze_spawn_egg", CatSpawnEgg => "minecraft:cat_spawn_egg", CamelSpawnEgg => "minecraft:camel_spawn_egg", @@ -2868,8 +2950,10 @@ enum Item { ZombifiedPiglinSpawnEgg => "minecraft:zombified_piglin_spawn_egg", ExperienceBottle => "minecraft:experience_bottle", FireCharge => "minecraft:fire_charge", + WindCharge => "minecraft:wind_charge", WritableBook => "minecraft:writable_book", WrittenBook => "minecraft:written_book", + Mace => "minecraft:mace", ItemFrame => "minecraft:item_frame", GlowItemFrame => "minecraft:glow_item_frame", FlowerPot => "minecraft:flower_pot", @@ -2974,6 +3058,8 @@ enum Item { MojangBannerPattern => "minecraft:mojang_banner_pattern", GlobeBannerPattern => "minecraft:globe_banner_pattern", PiglinBannerPattern => "minecraft:piglin_banner_pattern", + FlowBannerPattern => "minecraft:flow_banner_pattern", + GusterBannerPattern => "minecraft:guster_banner_pattern", GoatHorn => "minecraft:goat_horn", Composter => "minecraft:composter", Barrel => "minecraft:barrel", @@ -3057,6 +3143,8 @@ enum Item { SilenceArmorTrimSmithingTemplate => "minecraft:silence_armor_trim_smithing_template", RaiserArmorTrimSmithingTemplate => "minecraft:raiser_armor_trim_smithing_template", HostArmorTrimSmithingTemplate => "minecraft:host_armor_trim_smithing_template", + FlowArmorTrimSmithingTemplate => "minecraft:flow_armor_trim_smithing_template", + BoltArmorTrimSmithingTemplate => "minecraft:bolt_armor_trim_smithing_template", AnglerPotterySherd => "minecraft:angler_pottery_sherd", ArcherPotterySherd => "minecraft:archer_pottery_sherd", ArmsUpPotterySherd => "minecraft:arms_up_pottery_sherd", @@ -3065,7 +3153,9 @@ enum Item { BurnPotterySherd => "minecraft:burn_pottery_sherd", DangerPotterySherd => "minecraft:danger_pottery_sherd", ExplorerPotterySherd => "minecraft:explorer_pottery_sherd", + FlowPotterySherd => "minecraft:flow_pottery_sherd", FriendPotterySherd => "minecraft:friend_pottery_sherd", + GusterPotterySherd => "minecraft:guster_pottery_sherd", HeartPotterySherd => "minecraft:heart_pottery_sherd", HeartbreakPotterySherd => "minecraft:heartbreak_pottery_sherd", HowlPotterySherd => "minecraft:howl_pottery_sherd", @@ -3073,6 +3163,7 @@ enum Item { MournerPotterySherd => "minecraft:mourner_pottery_sherd", PlentyPotterySherd => "minecraft:plenty_pottery_sherd", PrizePotterySherd => "minecraft:prize_pottery_sherd", + ScrapePotterySherd => "minecraft:scrape_pottery_sherd", SheafPotterySherd => "minecraft:sheaf_pottery_sherd", ShelterPotterySherd => "minecraft:shelter_pottery_sherd", SkullPotterySherd => "minecraft:skull_pottery_sherd", @@ -3095,6 +3186,10 @@ enum Item { WaxedOxidizedCopperBulb => "minecraft:waxed_oxidized_copper_bulb", TrialSpawner => "minecraft:trial_spawner", TrialKey => "minecraft:trial_key", + OminousTrialKey => "minecraft:ominous_trial_key", + Vault => "minecraft:vault", + OminousBottle => "minecraft:ominous_bottle", + BreezeRod => "minecraft:breeze_rod", } } @@ -3124,10 +3219,12 @@ enum LootConditionKind { registry! { enum LootFunctionKind { SetCount => "minecraft:set_count", + SetItem => "minecraft:set_item", EnchantWithLevels => "minecraft:enchant_with_levels", EnchantRandomly => "minecraft:enchant_randomly", SetEnchantments => "minecraft:set_enchantments", - SetNbt => "minecraft:set_nbt", + SetCustomData => "minecraft:set_custom_data", + SetComponents => "minecraft:set_components", FurnaceSmelt => "minecraft:furnace_smelt", LootingEnchant => "minecraft:looting_enchant", SetDamage => "minecraft:set_damage", @@ -3137,19 +3234,30 @@ enum LootFunctionKind { SetStewEffect => "minecraft:set_stew_effect", CopyName => "minecraft:copy_name", SetContents => "minecraft:set_contents", + ModifyContents => "minecraft:modify_contents", + Filtered => "minecraft:filtered", LimitCount => "minecraft:limit_count", ApplyBonus => "minecraft:apply_bonus", SetLootTable => "minecraft:set_loot_table", ExplosionDecay => "minecraft:explosion_decay", SetLore => "minecraft:set_lore", FillPlayerHead => "minecraft:fill_player_head", - CopyNbt => "minecraft:copy_nbt", + CopyCustomData => "minecraft:copy_custom_data", CopyState => "minecraft:copy_state", SetBannerPattern => "minecraft:set_banner_pattern", SetPotion => "minecraft:set_potion", SetInstrument => "minecraft:set_instrument", Reference => "minecraft:reference", Sequence => "minecraft:sequence", + CopyComponents => "minecraft:copy_components", + SetFireworks => "minecraft:set_fireworks", + SetFireworkExplosion => "minecraft:set_firework_explosion", + SetBookCover => "minecraft:set_book_cover", + SetWrittenBookPages => "minecraft:set_written_book_pages", + SetWritableBookPages => "minecraft:set_writable_book_pages", + ToggleTooltips => "minecraft:toggle_tooltips", + SetOminousBottleAmplifier => "minecraft:set_ominous_bottle_amplifier", + SetCustomModelData => "minecraft:set_custom_model_data", } } @@ -3166,6 +3274,7 @@ enum LootNumberProviderKind { Uniform => "minecraft:uniform", Binomial => "minecraft:binomial", Score => "minecraft:score", + Storage => "minecraft:storage", } } @@ -3223,6 +3332,7 @@ enum MemoryModuleKind { HeardBellTime => "minecraft:heard_bell_time", CantReachWalkTargetSince => "minecraft:cant_reach_walk_target_since", GolemDetectedRecently => "minecraft:golem_detected_recently", + DangerDetectedRecently => "minecraft:danger_detected_recently", LastSlept => "minecraft:last_slept", LastWoken => "minecraft:last_woken", LastWorkedAtPoi => "minecraft:last_worked_at_poi", @@ -3295,6 +3405,7 @@ enum MemoryModuleKind { BreezeShootCooldown => "minecraft:breeze_shoot_cooldown", BreezeJumpInhaling => "minecraft:breeze_jump_inhaling", BreezeJumpTarget => "minecraft:breeze_jump_target", + BreezeLeavingWater => "minecraft:breeze_leaving_water", } } @@ -3362,6 +3473,12 @@ enum MobEffect { BadOmen => "minecraft:bad_omen", HeroOfTheVillage => "minecraft:hero_of_the_village", Darkness => "minecraft:darkness", + TrialOmen => "minecraft:trial_omen", + RaidOmen => "minecraft:raid_omen", + WindCharged => "minecraft:wind_charged", + Weaving => "minecraft:weaving", + Oozing => "minecraft:oozing", + Infested => "minecraft:infested", } } @@ -3402,7 +3519,6 @@ enum PaintingVariant { registry! { enum ParticleKind { - AmbientEntityEffect => "minecraft:ambient_entity_effect", AngryVillager => "minecraft:angry_villager", Block => "minecraft:block", BlockMarker => "minecraft:block_marker", @@ -3427,12 +3543,15 @@ enum ParticleKind { ExplosionEmitter => "minecraft:explosion_emitter", Explosion => "minecraft:explosion", Gust => "minecraft:gust", - GustEmitter => "minecraft:gust_emitter", + SmallGust => "minecraft:small_gust", + GustEmitterLarge => "minecraft:gust_emitter_large", + GustEmitterSmall => "minecraft:gust_emitter_small", SonicBoom => "minecraft:sonic_boom", FallingDust => "minecraft:falling_dust", Firework => "minecraft:firework", Fishing => "minecraft:fishing", Flame => "minecraft:flame", + Infested => "minecraft:infested", CherryLeaves => "minecraft:cherry_leaves", SculkSoul => "minecraft:sculk_soul", SculkCharge => "minecraft:sculk_charge", @@ -3447,6 +3566,7 @@ enum ParticleKind { Item => "minecraft:item", Vibration => "minecraft:vibration", ItemSlime => "minecraft:item_slime", + ItemCobweb => "minecraft:item_cobweb", ItemSnowball => "minecraft:item_snowball", LargeSmoke => "minecraft:large_smoke", Lava => "minecraft:lava", @@ -3501,8 +3621,13 @@ enum ParticleKind { Shriek => "minecraft:shriek", EggCrack => "minecraft:egg_crack", DustPlume => "minecraft:dust_plume", - GustDust => "minecraft:gust_dust", TrialSpawnerDetection => "minecraft:trial_spawner_detection", + TrialSpawnerDetectionOminous => "minecraft:trial_spawner_detection_ominous", + VaultConnection => "minecraft:vault_connection", + DustPillar => "minecraft:dust_pillar", + OminousSpawning => "minecraft:ominous_spawning", + RaidOmen => "minecraft:raid_omen", + TrialOmen => "minecraft:trial_omen", } } @@ -3548,7 +3673,6 @@ enum PositionSourceKind { registry! { enum Potion { - Empty => "minecraft:empty", Water => "minecraft:water", Mundane => "minecraft:mundane", Thick => "minecraft:thick", @@ -3591,6 +3715,10 @@ enum Potion { Luck => "minecraft:luck", SlowFalling => "minecraft:slow_falling", LongSlowFalling => "minecraft:long_slow_falling", + WindCharged => "minecraft:wind_charged", + Weaving => "minecraft:weaving", + Oozing => "minecraft:oozing", + Infested => "minecraft:infested", } } @@ -3666,6 +3794,7 @@ enum SensorKind { VillagerBabies => "minecraft:villager_babies", SecondaryPois => "minecraft:secondary_pois", GolemDetected => "minecraft:golem_detected", + ArmadilloScareDetected => "minecraft:armadillo_scare_detected", PiglinSpecificSensor => "minecraft:piglin_specific_sensor", PiglinBruteSpecificSensor => "minecraft:piglin_brute_specific_sensor", HoglinSpecificSensor => "minecraft:hoglin_specific_sensor", @@ -3675,6 +3804,7 @@ enum SensorKind { GoatTemptations => "minecraft:goat_temptations", FrogTemptations => "minecraft:frog_temptations", CamelTemptations => "minecraft:camel_temptations", + ArmadilloTemptations => "minecraft:armadillo_temptations", FrogAttackables => "minecraft:frog_attackables", IsInWater => "minecraft:is_in_water", WardenEntitySensor => "minecraft:warden_entity_sensor", @@ -3739,6 +3869,19 @@ enum SoundEvent { BlockAnvilPlace => "minecraft:block.anvil.place", BlockAnvilStep => "minecraft:block.anvil.step", BlockAnvilUse => "minecraft:block.anvil.use", + EntityArmadilloEat => "minecraft:entity.armadillo.eat", + EntityArmadilloHurt => "minecraft:entity.armadillo.hurt", + EntityArmadilloHurtReduced => "minecraft:entity.armadillo.hurt_reduced", + EntityArmadilloAmbient => "minecraft:entity.armadillo.ambient", + EntityArmadilloStep => "minecraft:entity.armadillo.step", + EntityArmadilloDeath => "minecraft:entity.armadillo.death", + EntityArmadilloRoll => "minecraft:entity.armadillo.roll", + EntityArmadilloLand => "minecraft:entity.armadillo.land", + EntityArmadilloScuteDrop => "minecraft:entity.armadillo.scute_drop", + EntityArmadilloUnrollFinish => "minecraft:entity.armadillo.unroll_finish", + EntityArmadilloPeek => "minecraft:entity.armadillo.peek", + EntityArmadilloUnrollStart => "minecraft:entity.armadillo.unroll_start", + EntityArmadilloBrush => "minecraft:entity.armadillo.brush", ItemArmorEquipChain => "minecraft:item.armor.equip_chain", ItemArmorEquipDiamond => "minecraft:item.armor.equip_diamond", ItemArmorEquipElytra => "minecraft:item.armor.equip_elytra", @@ -3748,6 +3891,8 @@ enum SoundEvent { ItemArmorEquipLeather => "minecraft:item.armor.equip_leather", ItemArmorEquipNetherite => "minecraft:item.armor.equip_netherite", ItemArmorEquipTurtle => "minecraft:item.armor.equip_turtle", + ItemArmorEquipWolf => "minecraft:item.armor.equip_wolf", + ItemArmorUnequipWolf => "minecraft:item.armor.unequip_wolf", EntityArmorStandBreak => "minecraft:entity.armor_stand.break", EntityArmorStandFall => "minecraft:entity.armor_stand.fall", EntityArmorStandHit => "minecraft:entity.armor_stand.hit", @@ -3839,6 +3984,11 @@ enum SoundEvent { EntityBlazeShoot => "minecraft:entity.blaze.shoot", EntityBoatPaddleLand => "minecraft:entity.boat.paddle_land", EntityBoatPaddleWater => "minecraft:entity.boat.paddle_water", + EntityBoggedAmbient => "minecraft:entity.bogged.ambient", + EntityBoggedDeath => "minecraft:entity.bogged.death", + EntityBoggedHurt => "minecraft:entity.bogged.hurt", + EntityBoggedShear => "minecraft:entity.bogged.shear", + EntityBoggedStep => "minecraft:entity.bogged.step", BlockBoneBlockBreak => "minecraft:block.bone_block.break", BlockBoneBlockFall => "minecraft:block.bone_block.fall", BlockBoneBlockHit => "minecraft:block.bone_block.hit", @@ -3851,6 +4001,8 @@ enum SoundEvent { ItemBottleEmpty => "minecraft:item.bottle.empty", ItemBottleFill => "minecraft:item.bottle.fill", ItemBottleFillDragonbreath => "minecraft:item.bottle.fill_dragonbreath", + EntityBreezeCharge => "minecraft:entity.breeze.charge", + EntityBreezeDeflect => "minecraft:entity.breeze.deflect", EntityBreezeInhale => "minecraft:entity.breeze.inhale", EntityBreezeIdleGround => "minecraft:entity.breeze.idle_ground", EntityBreezeIdleAir => "minecraft:entity.breeze.idle_air", @@ -3860,6 +4012,8 @@ enum SoundEvent { EntityBreezeSlide => "minecraft:entity.breeze.slide", EntityBreezeDeath => "minecraft:entity.breeze.death", EntityBreezeHurt => "minecraft:entity.breeze.hurt", + EntityBreezeWhirl => "minecraft:entity.breeze.whirl", + EntityBreezeWindBurst => "minecraft:entity.breeze.wind_burst", BlockBrewingStandBrew => "minecraft:block.brewing_stand.brew", ItemBrushBrushingGeneric => "minecraft:item.brush.brushing.generic", ItemBrushBrushingSand => "minecraft:item.brush.brushing.sand", @@ -3981,6 +4135,11 @@ enum SoundEvent { BlockChorusFlowerDeath => "minecraft:block.chorus_flower.death", BlockChorusFlowerGrow => "minecraft:block.chorus_flower.grow", ItemChorusFruitTeleport => "minecraft:item.chorus_fruit.teleport", + BlockCobwebBreak => "minecraft:block.cobweb.break", + BlockCobwebStep => "minecraft:block.cobweb.step", + BlockCobwebPlace => "minecraft:block.cobweb.place", + BlockCobwebHit => "minecraft:block.cobweb.hit", + BlockCobwebFall => "minecraft:block.cobweb.fall", EntityCodAmbient => "minecraft:entity.cod.ambient", EntityCodDeath => "minecraft:entity.cod.death", EntityCodFlop => "minecraft:entity.cod.flop", @@ -4083,6 +4242,7 @@ enum SoundEvent { EntityDonkeyDeath => "minecraft:entity.donkey.death", EntityDonkeyEat => "minecraft:entity.donkey.eat", EntityDonkeyHurt => "minecraft:entity.donkey.hurt", + EntityDonkeyJump => "minecraft:entity.donkey.jump", BlockDripstoneBlockBreak => "minecraft:block.dripstone_block.break", BlockDripstoneBlockStep => "minecraft:block.dripstone_block.step", BlockDripstoneBlockPlace => "minecraft:block.dripstone_block.place", @@ -4313,6 +4473,11 @@ enum SoundEvent { BlockHangingSignFall => "minecraft:block.hanging_sign.fall", BlockHangingSignHit => "minecraft:block.hanging_sign.hit", BlockHangingSignPlace => "minecraft:block.hanging_sign.place", + BlockHeavyCoreBreak => "minecraft:block.heavy_core.break", + BlockHeavyCoreFall => "minecraft:block.heavy_core.fall", + BlockHeavyCoreHit => "minecraft:block.heavy_core.hit", + BlockHeavyCorePlace => "minecraft:block.heavy_core.place", + BlockHeavyCoreStep => "minecraft:block.heavy_core.step", BlockNetherWoodHangingSignStep => "minecraft:block.nether_wood_hanging_sign.step", BlockNetherWoodHangingSignBreak => "minecraft:block.nether_wood_hanging_sign.break", BlockNetherWoodHangingSignFall => "minecraft:block.nether_wood_hanging_sign.fall", @@ -4329,8 +4494,13 @@ enum SoundEvent { BlockTrialSpawnerHit => "minecraft:block.trial_spawner.hit", BlockTrialSpawnerFall => "minecraft:block.trial_spawner.fall", BlockTrialSpawnerSpawnMob => "minecraft:block.trial_spawner.spawn_mob", + BlockTrialSpawnerAboutToSpawnItem => "minecraft:block.trial_spawner.about_to_spawn_item", + BlockTrialSpawnerSpawnItem => "minecraft:block.trial_spawner.spawn_item", + BlockTrialSpawnerSpawnItemBegin => "minecraft:block.trial_spawner.spawn_item_begin", BlockTrialSpawnerDetectPlayer => "minecraft:block.trial_spawner.detect_player", + BlockTrialSpawnerChargeActivate => "minecraft:block.trial_spawner.charge_activate", BlockTrialSpawnerAmbient => "minecraft:block.trial_spawner.ambient", + BlockTrialSpawnerAmbientCharged => "minecraft:block.trial_spawner.ambient_charged", BlockTrialSpawnerOpenShutter => "minecraft:block.trial_spawner.open_shutter", BlockTrialSpawnerCloseShutter => "minecraft:block.trial_spawner.close_shutter", BlockTrialSpawnerEjectItem => "minecraft:block.trial_spawner.eject_item", @@ -4445,6 +4615,9 @@ enum SoundEvent { BlockLodestoneHit => "minecraft:block.lodestone.hit", BlockLodestoneFall => "minecraft:block.lodestone.fall", ItemLodestoneCompassLock => "minecraft:item.lodestone_compass.lock", + ItemMaceSmashAir => "minecraft:item.mace.smash_air", + ItemMaceSmashGround => "minecraft:item.mace.smash_ground", + ItemMaceSmashGroundHeavy => "minecraft:item.mace.smash_ground_heavy", EntityMagmaCubeDeath => "minecraft:entity.magma_cube.death", EntityMagmaCubeHurt => "minecraft:entity.magma_cube.hurt", EntityMagmaCubeHurtSmall => "minecraft:entity.magma_cube.hurt_small", @@ -4509,6 +4682,7 @@ enum SoundEvent { EntityMuleDeath => "minecraft:entity.mule.death", EntityMuleEat => "minecraft:entity.mule.eat", EntityMuleHurt => "minecraft:entity.mule.hurt", + EntityMuleJump => "minecraft:entity.mule.jump", MusicCreative => "minecraft:music.creative", MusicCredits => "minecraft:music.credits", MusicDisc5 => "minecraft:music_disc.5", @@ -4649,6 +4823,7 @@ enum SoundEvent { EntityOcelotHurt => "minecraft:entity.ocelot.hurt", EntityOcelotAmbient => "minecraft:entity.ocelot.ambient", EntityOcelotDeath => "minecraft:entity.ocelot.death", + ItemOminousBottleDispose => "minecraft:item.ominous_bottle.dispose", EntityPaintingBreak => "minecraft:entity.painting.break", EntityPaintingPlace => "minecraft:entity.painting.place", EntityPandaPreSneeze => "minecraft:entity.panda.pre_sneeze", @@ -4668,6 +4843,7 @@ enum SoundEvent { EntityParrotFly => "minecraft:entity.parrot.fly", EntityParrotHurt => "minecraft:entity.parrot.hurt", EntityParrotImitateBlaze => "minecraft:entity.parrot.imitate.blaze", + EntityParrotImitateBogged => "minecraft:entity.parrot.imitate.bogged", EntityParrotImitateBreeze => "minecraft:entity.parrot.imitate.breeze", EntityParrotImitateCreeper => "minecraft:entity.parrot.imitate.creeper", EntityParrotImitateDrowned => "minecraft:entity.parrot.imitate.drowned", @@ -5072,6 +5248,19 @@ enum SoundEvent { UiToastChallengeComplete => "minecraft:ui.toast.challenge_complete", UiToastIn => "minecraft:ui.toast.in", UiToastOut => "minecraft:ui.toast.out", + BlockVaultActivate => "minecraft:block.vault.activate", + BlockVaultAmbient => "minecraft:block.vault.ambient", + BlockVaultBreak => "minecraft:block.vault.break", + BlockVaultCloseShutter => "minecraft:block.vault.close_shutter", + BlockVaultDeactivate => "minecraft:block.vault.deactivate", + BlockVaultEjectItem => "minecraft:block.vault.eject_item", + BlockVaultFall => "minecraft:block.vault.fall", + BlockVaultHit => "minecraft:block.vault.hit", + BlockVaultInsertItem => "minecraft:block.vault.insert_item", + BlockVaultInsertItemFail => "minecraft:block.vault.insert_item_fail", + BlockVaultOpenShutter => "minecraft:block.vault.open_shutter", + BlockVaultPlace => "minecraft:block.vault.place", + BlockVaultStep => "minecraft:block.vault.step", EntityVexAmbient => "minecraft:entity.vex.ambient", EntityVexCharge => "minecraft:entity.vex.charge", EntityVexDeath => "minecraft:entity.vex.death", @@ -5147,11 +5336,13 @@ enum SoundEvent { BlockWetGrassPlace => "minecraft:block.wet_grass.place", BlockWetGrassStep => "minecraft:block.wet_grass.step", BlockWetSpongeBreak => "minecraft:block.wet_sponge.break", + BlockWetSpongeDries => "minecraft:block.wet_sponge.dries", BlockWetSpongeFall => "minecraft:block.wet_sponge.fall", BlockWetSpongeHit => "minecraft:block.wet_sponge.hit", BlockWetSpongePlace => "minecraft:block.wet_sponge.place", BlockWetSpongeStep => "minecraft:block.wet_sponge.step", - EntityGenericWindBurst => "minecraft:entity.generic.wind_burst", + EntityWindChargeWindBurst => "minecraft:entity.wind_charge.wind_burst", + EntityWindChargeThrow => "minecraft:entity.wind_charge.throw", EntityWitchAmbient => "minecraft:entity.witch.ambient", EntityWitchCelebrate => "minecraft:entity.witch.celebrate", EntityWitchDeath => "minecraft:entity.witch.death", @@ -5168,6 +5359,10 @@ enum SoundEvent { EntityWitherSkeletonHurt => "minecraft:entity.wither_skeleton.hurt", EntityWitherSkeletonStep => "minecraft:entity.wither_skeleton.step", EntityWitherSpawn => "minecraft:entity.wither.spawn", + ItemWolfArmorBreak => "minecraft:item.wolf_armor.break", + ItemWolfArmorCrack => "minecraft:item.wolf_armor.crack", + ItemWolfArmorDamage => "minecraft:item.wolf_armor.damage", + ItemWolfArmorRepair => "minecraft:item.wolf_armor.repair", EntityWolfAmbient => "minecraft:entity.wolf.ambient", EntityWolfDeath => "minecraft:entity.wolf.death", EntityWolfGrowl => "minecraft:entity.wolf.growl", @@ -5224,6 +5419,9 @@ enum SoundEvent { EntityZombieVillagerDeath => "minecraft:entity.zombie_villager.death", EntityZombieVillagerHurt => "minecraft:entity.zombie_villager.hurt", EntityZombieVillagerStep => "minecraft:entity.zombie_villager.step", + EventMobEffectBadOmen => "minecraft:event.mob_effect.bad_omen", + EventMobEffectTrialOmen => "minecraft:event.mob_effect.trial_omen", + EventMobEffectRaidOmen => "minecraft:event.mob_effect.raid_omen", } } @@ -5638,7 +5836,9 @@ enum DecoratedPotPatterns { BurnPotteryPattern => "minecraft:burn_pottery_pattern", DangerPotteryPattern => "minecraft:danger_pottery_pattern", ExplorerPotteryPattern => "minecraft:explorer_pottery_pattern", + FlowPotteryPattern => "minecraft:flow_pottery_pattern", FriendPotteryPattern => "minecraft:friend_pottery_pattern", + GusterPotteryPattern => "minecraft:guster_pottery_pattern", HeartPotteryPattern => "minecraft:heart_pottery_pattern", HeartbreakPotteryPattern => "minecraft:heartbreak_pottery_pattern", HowlPotteryPattern => "minecraft:howl_pottery_pattern", @@ -5646,6 +5846,7 @@ enum DecoratedPotPatterns { MournerPotteryPattern => "minecraft:mourner_pottery_pattern", PlentyPotteryPattern => "minecraft:plenty_pottery_pattern", PrizePotteryPattern => "minecraft:prize_pottery_pattern", + ScrapePotteryPattern => "minecraft:scrape_pottery_pattern", SheafPotteryPattern => "minecraft:sheaf_pottery_pattern", ShelterPotteryPattern => "minecraft:shelter_pottery_pattern", SkullPotteryPattern => "minecraft:skull_pottery_pattern", @@ -5813,6 +6014,7 @@ enum BlockKind { HalfTransparent => "minecraft:half_transparent", HangingRoots => "minecraft:hanging_roots", Hay => "minecraft:hay", + HeavyCore => "minecraft:heavy_core", Honey => "minecraft:honey", Hopper => "minecraft:hopper", HugeMushroom => "minecraft:huge_mushroom", @@ -5928,6 +6130,7 @@ enum BlockKind { TurtleEgg => "minecraft:turtle_egg", TwistingVinesPlant => "minecraft:twisting_vines_plant", TwistingVines => "minecraft:twisting_vines", + Vault => "minecraft:vault", Vine => "minecraft:vine", WallBanner => "minecraft:wall_banner", WallHangingSign => "minecraft:wall_hanging_sign", @@ -6005,6 +6208,8 @@ enum TriggerKind { BeeNestDestroyed => "minecraft:bee_nest_destroyed", TargetHit => "minecraft:target_hit", ItemUsedOnBlock => "minecraft:item_used_on_block", + DefaultBlockUse => "minecraft:default_block_use", + AnyBlockUse => "minecraft:any_block_use", PlayerGeneratesContainerLoot => "minecraft:player_generates_container_loot", ThrownItemPickedUpByEntity => "minecraft:thrown_item_picked_up_by_entity", ThrownItemPickedUpByPlayer => "minecraft:thrown_item_picked_up_by_player", @@ -6018,6 +6223,8 @@ enum TriggerKind { AllayDropItemOnBlock => "minecraft:allay_drop_item_on_block", AvoidVibration => "minecraft:avoid_vibration", RecipeCrafted => "minecraft:recipe_crafted", + CrafterRecipeCrafted => "minecraft:crafter_recipe_crafted", + FallAfterExplosion => "minecraft:fall_after_explosion", } } @@ -6028,3 +6235,159 @@ enum NumberFormatKind { Fixed => "minecraft:fixed", } } + +registry! { +enum ArmorMaterial { + Leather => "minecraft:leather", + Chainmail => "minecraft:chainmail", + Iron => "minecraft:iron", + Gold => "minecraft:gold", + Diamond => "minecraft:diamond", + Turtle => "minecraft:turtle", + Netherite => "minecraft:netherite", + Armadillo => "minecraft:armadillo", +} +} + +registry! { +enum DataComponentKind { + CustomData => "minecraft:custom_data", + MaxStackSize => "minecraft:max_stack_size", + MaxDamage => "minecraft:max_damage", + Damage => "minecraft:damage", + Unbreakable => "minecraft:unbreakable", + CustomName => "minecraft:custom_name", + ItemName => "minecraft:item_name", + Lore => "minecraft:lore", + Rarity => "minecraft:rarity", + Enchantments => "minecraft:enchantments", + CanPlaceOn => "minecraft:can_place_on", + CanBreak => "minecraft:can_break", + AttributeModifiers => "minecraft:attribute_modifiers", + CustomModelData => "minecraft:custom_model_data", + HideAdditionalTooltip => "minecraft:hide_additional_tooltip", + HideTooltip => "minecraft:hide_tooltip", + RepairCost => "minecraft:repair_cost", + CreativeSlotLock => "minecraft:creative_slot_lock", + EnchantmentGlintOverride => "minecraft:enchantment_glint_override", + IntangibleProjectile => "minecraft:intangible_projectile", + Food => "minecraft:food", + FireResistant => "minecraft:fire_resistant", + Tool => "minecraft:tool", + StoredEnchantments => "minecraft:stored_enchantments", + DyedColor => "minecraft:dyed_color", + MapColor => "minecraft:map_color", + MapId => "minecraft:map_id", + MapDecorations => "minecraft:map_decorations", + MapPostProcessing => "minecraft:map_post_processing", + ChargedProjectiles => "minecraft:charged_projectiles", + BundleContents => "minecraft:bundle_contents", + PotionContents => "minecraft:potion_contents", + SuspiciousStewEffects => "minecraft:suspicious_stew_effects", + WritableBookContent => "minecraft:writable_book_content", + WrittenBookContent => "minecraft:written_book_content", + Trim => "minecraft:trim", + DebugStickState => "minecraft:debug_stick_state", + EntityData => "minecraft:entity_data", + BucketEntityData => "minecraft:bucket_entity_data", + BlockEntityData => "minecraft:block_entity_data", + Instrument => "minecraft:instrument", + OminousBottleAmplifier => "minecraft:ominous_bottle_amplifier", + Recipes => "minecraft:recipes", + LodestoneTracker => "minecraft:lodestone_tracker", + FireworkExplosion => "minecraft:firework_explosion", + Fireworks => "minecraft:fireworks", + Profile => "minecraft:profile", + NoteBlockSound => "minecraft:note_block_sound", + BannerPatterns => "minecraft:banner_patterns", + BaseColor => "minecraft:base_color", + PotDecorations => "minecraft:pot_decorations", + Container => "minecraft:container", + BlockState => "minecraft:block_state", + Bees => "minecraft:bees", + Lock => "minecraft:lock", + ContainerLoot => "minecraft:container_loot", +} +} + +registry! { +enum EntitySubPredicateKind { + Lightning => "minecraft:lightning", + FishingHook => "minecraft:fishing_hook", + Player => "minecraft:player", + Slime => "minecraft:slime", + Raider => "minecraft:raider", + Axolotl => "minecraft:axolotl", + Boat => "minecraft:boat", + Fox => "minecraft:fox", + Mooshroom => "minecraft:mooshroom", + Rabbit => "minecraft:rabbit", + Horse => "minecraft:horse", + Llama => "minecraft:llama", + Villager => "minecraft:villager", + Parrot => "minecraft:parrot", + TropicalFish => "minecraft:tropical_fish", + Painting => "minecraft:painting", + Cat => "minecraft:cat", + Frog => "minecraft:frog", + Wolf => "minecraft:wolf", +} +} + +registry! { +enum ItemSubPredicateKind { + Damage => "minecraft:damage", + Enchantments => "minecraft:enchantments", + StoredEnchantments => "minecraft:stored_enchantments", + PotionContents => "minecraft:potion_contents", + CustomData => "minecraft:custom_data", + Container => "minecraft:container", + BundleContents => "minecraft:bundle_contents", + FireworkExplosion => "minecraft:firework_explosion", + Fireworks => "minecraft:fireworks", + WritableBookContent => "minecraft:writable_book_content", + WrittenBookContent => "minecraft:written_book_content", + AttributeModifiers => "minecraft:attribute_modifiers", + Trim => "minecraft:trim", +} +} + +registry! { +enum MapDecorationKind { + Player => "minecraft:player", + Frame => "minecraft:frame", + RedMarker => "minecraft:red_marker", + BlueMarker => "minecraft:blue_marker", + TargetX => "minecraft:target_x", + TargetPoint => "minecraft:target_point", + PlayerOffMap => "minecraft:player_off_map", + PlayerOffLimits => "minecraft:player_off_limits", + Mansion => "minecraft:mansion", + Monument => "minecraft:monument", + BannerWhite => "minecraft:banner_white", + BannerOrange => "minecraft:banner_orange", + BannerMagenta => "minecraft:banner_magenta", + BannerLightBlue => "minecraft:banner_light_blue", + BannerYellow => "minecraft:banner_yellow", + BannerLime => "minecraft:banner_lime", + BannerPink => "minecraft:banner_pink", + BannerGray => "minecraft:banner_gray", + BannerLightGray => "minecraft:banner_light_gray", + BannerCyan => "minecraft:banner_cyan", + BannerPurple => "minecraft:banner_purple", + BannerBlue => "minecraft:banner_blue", + BannerBrown => "minecraft:banner_brown", + BannerGreen => "minecraft:banner_green", + BannerRed => "minecraft:banner_red", + BannerBlack => "minecraft:banner_black", + RedX => "minecraft:red_x", + VillageDesert => "minecraft:village_desert", + VillagePlains => "minecraft:village_plains", + VillageSavanna => "minecraft:village_savanna", + VillageSnowy => "minecraft:village_snowy", + VillageTaiga => "minecraft:village_taiga", + JungleTemple => "minecraft:jungle_temple", + SwampHut => "minecraft:swamp_hut", + TrialChambers => "minecraft:trial_chambers", +} +} diff --git a/azalea-registry/src/tags/blocks.rs b/azalea-registry/src/tags/blocks.rs index 0396eb87..65ddfd4a 100644 --- a/azalea-registry/src/tags/blocks.rs +++ b/azalea-registry/src/tags/blocks.rs @@ -6,6 +6,37 @@ use once_cell::sync::Lazy; use crate::Block; +pub static MINEABLE_HOE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::NetherWartBlock, + Block::WarpedWartBlock, + Block::HayBlock, + Block::DriedKelpBlock, + Block::Target, + Block::Shroomlight, + Block::Sponge, + Block::WetSponge, + Block::JungleLeaves, + Block::OakLeaves, + Block::SpruceLeaves, + Block::DarkOakLeaves, + Block::AcaciaLeaves, + Block::BirchLeaves, + Block::AzaleaLeaves, + Block::FloweringAzaleaLeaves, + Block::MangroveLeaves, + Block::SculkSensor, + Block::CalibratedSculkSensor, + Block::MossBlock, + Block::MossCarpet, + Block::Sculk, + Block::SculkCatalyst, + Block::SculkVein, + Block::SculkShrieker, + Block::PinkPetals, + Block::CherryLeaves, + ]) +}); pub static MINEABLE_SHOVEL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Clay, @@ -348,37 +379,6 @@ pub static MINEABLE_AXE: Lazy> = Lazy::new(|| { Block::StrippedCherryWood, ]) }); -pub static MINEABLE_HOE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::NetherWartBlock, - Block::WarpedWartBlock, - Block::HayBlock, - Block::DriedKelpBlock, - Block::Target, - Block::Shroomlight, - Block::Sponge, - Block::WetSponge, - Block::JungleLeaves, - Block::OakLeaves, - Block::SpruceLeaves, - Block::DarkOakLeaves, - Block::AcaciaLeaves, - Block::BirchLeaves, - Block::AzaleaLeaves, - Block::FloweringAzaleaLeaves, - Block::MangroveLeaves, - Block::SculkSensor, - Block::CalibratedSculkSensor, - Block::MossBlock, - Block::MossCarpet, - Block::Sculk, - Block::SculkCatalyst, - Block::SculkVein, - Block::SculkShrieker, - Block::PinkPetals, - Block::CherryLeaves, - ]) -}); pub static MINEABLE_PICKAXE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Stone, @@ -758,6 +758,148 @@ pub static MINEABLE_PICKAXE: Lazy> = Lazy::new(|| { Block::ActivatorRail, ]) }); +pub static STONE_BUTTONS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::StoneButton, Block::PolishedBlackstoneButton])); +pub static STONE_BRICKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::StoneBricks, + Block::MossyStoneBricks, + Block::CrackedStoneBricks, + Block::ChiseledStoneBricks, + ]) +}); +pub static WOOL: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WhiteWool, + Block::OrangeWool, + Block::MagentaWool, + Block::LightBlueWool, + Block::YellowWool, + Block::LimeWool, + Block::PinkWool, + Block::GrayWool, + Block::LightGrayWool, + Block::CyanWool, + Block::PurpleWool, + Block::BlueWool, + Block::BrownWool, + Block::GreenWool, + Block::RedWool, + Block::BlackWool, + ]) +}); +pub static PLANKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakPlanks, + Block::SprucePlanks, + Block::BirchPlanks, + Block::JunglePlanks, + Block::AcaciaPlanks, + Block::DarkOakPlanks, + Block::CrimsonPlanks, + Block::WarpedPlanks, + Block::MangrovePlanks, + Block::BambooPlanks, + Block::CherryPlanks, + ]) +}); +pub static WOODEN_BUTTONS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakButton, + Block::SpruceButton, + Block::BirchButton, + Block::JungleButton, + Block::AcaciaButton, + Block::DarkOakButton, + Block::CrimsonButton, + Block::WarpedButton, + Block::MangroveButton, + Block::BambooButton, + Block::CherryButton, + ]) +}); +pub static BUTTONS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakButton, + Block::SpruceButton, + Block::BirchButton, + Block::JungleButton, + Block::AcaciaButton, + Block::DarkOakButton, + Block::CrimsonButton, + Block::WarpedButton, + Block::MangroveButton, + Block::BambooButton, + Block::CherryButton, + Block::StoneButton, + Block::PolishedBlackstoneButton, + ]) +}); +pub static WOOL_CARPETS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WhiteCarpet, + Block::OrangeCarpet, + Block::MagentaCarpet, + Block::LightBlueCarpet, + Block::YellowCarpet, + Block::LimeCarpet, + Block::PinkCarpet, + Block::GrayCarpet, + Block::LightGrayCarpet, + Block::CyanCarpet, + Block::PurpleCarpet, + Block::BlueCarpet, + Block::BrownCarpet, + Block::GreenCarpet, + Block::RedCarpet, + Block::BlackCarpet, + ]) +}); +pub static WOODEN_DOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakDoor, + Block::SpruceDoor, + Block::BirchDoor, + Block::JungleDoor, + Block::AcaciaDoor, + Block::DarkOakDoor, + Block::CrimsonDoor, + Block::WarpedDoor, + Block::MangroveDoor, + Block::BambooDoor, + Block::CherryDoor, + ]) +}); +pub static WOODEN_STAIRS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakStairs, + Block::SpruceStairs, + Block::BirchStairs, + Block::JungleStairs, + Block::AcaciaStairs, + Block::DarkOakStairs, + Block::CrimsonStairs, + Block::WarpedStairs, + Block::MangroveStairs, + Block::BambooStairs, + Block::CherryStairs, + ]) +}); +pub static WOODEN_SLABS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakSlab, + Block::SpruceSlab, + Block::BirchSlab, + Block::JungleSlab, + Block::AcaciaSlab, + Block::DarkOakSlab, + Block::CrimsonSlab, + Block::WarpedSlab, + Block::MangroveSlab, + Block::BambooSlab, + Block::CherrySlab, + ]) +}); pub static WOODEN_FENCES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::OakFence, @@ -773,6 +915,706 @@ pub static WOODEN_FENCES: Lazy> = Lazy::new(|| { Block::CherryFence, ]) }); +pub static DOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::IronDoor, + Block::OakDoor, + Block::SpruceDoor, + Block::BirchDoor, + Block::JungleDoor, + Block::AcaciaDoor, + Block::DarkOakDoor, + Block::CrimsonDoor, + Block::WarpedDoor, + Block::MangroveDoor, + Block::BambooDoor, + Block::CherryDoor, + ]) +}); +pub static SAPLINGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakSapling, + Block::SpruceSapling, + Block::BirchSapling, + Block::JungleSapling, + Block::AcaciaSapling, + Block::DarkOakSapling, + Block::Azalea, + Block::FloweringAzalea, + Block::MangrovePropagule, + Block::CherrySapling, + ]) +}); +pub static BAMBOO_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::BambooBlock, Block::StrippedBambooBlock])); +pub static DARK_OAK_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::DarkOakLog, + Block::DarkOakWood, + Block::StrippedDarkOakLog, + Block::StrippedDarkOakWood, + ]) +}); +pub static OAK_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakLog, + Block::OakWood, + Block::StrippedOakLog, + Block::StrippedOakWood, + ]) +}); +pub static ACACIA_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::AcaciaLog, + Block::AcaciaWood, + Block::StrippedAcaciaLog, + Block::StrippedAcaciaWood, + ]) +}); +pub static JUNGLE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::JungleLog, + Block::JungleWood, + Block::StrippedJungleLog, + Block::StrippedJungleWood, + ]) +}); +pub static BIRCH_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::BirchLog, + Block::BirchWood, + Block::StrippedBirchLog, + Block::StrippedBirchWood, + ]) +}); +pub static SPRUCE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::SpruceLog, + Block::SpruceWood, + Block::StrippedSpruceLog, + Block::StrippedSpruceWood, + ]) +}); +pub static CRIMSON_STEMS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::CrimsonStem, + Block::StrippedCrimsonStem, + Block::CrimsonHyphae, + Block::StrippedCrimsonHyphae, + ]) +}); +pub static WARPED_STEMS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WarpedStem, + Block::StrippedWarpedStem, + Block::WarpedHyphae, + Block::StrippedWarpedHyphae, + ]) +}); +pub static MANGROVE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::MangroveLog, + Block::MangroveWood, + Block::StrippedMangroveLog, + Block::StrippedMangroveWood, + ]) +}); +pub static CHERRY_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::CherryLog, + Block::CherryWood, + Block::StrippedCherryLog, + Block::StrippedCherryWood, + ]) +}); +pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::DarkOakLog, + Block::DarkOakWood, + Block::StrippedDarkOakLog, + Block::StrippedDarkOakWood, + Block::OakLog, + Block::OakWood, + Block::StrippedOakLog, + Block::StrippedOakWood, + Block::AcaciaLog, + Block::AcaciaWood, + Block::StrippedAcaciaLog, + Block::StrippedAcaciaWood, + Block::BirchLog, + Block::BirchWood, + Block::StrippedBirchLog, + Block::StrippedBirchWood, + Block::JungleLog, + Block::JungleWood, + Block::StrippedJungleLog, + Block::StrippedJungleWood, + Block::SpruceLog, + Block::SpruceWood, + Block::StrippedSpruceLog, + Block::StrippedSpruceWood, + Block::MangroveLog, + Block::MangroveWood, + Block::StrippedMangroveLog, + Block::StrippedMangroveWood, + Block::CherryLog, + Block::CherryWood, + Block::StrippedCherryLog, + Block::StrippedCherryWood, + ]) +}); +pub static OVERWORLD_NATURAL_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::AcaciaLog, + Block::BirchLog, + Block::OakLog, + Block::JungleLog, + Block::SpruceLog, + Block::DarkOakLog, + Block::MangroveLog, + Block::CherryLog, + ]) +}); +pub static LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::CrimsonStem, + Block::StrippedCrimsonStem, + Block::CrimsonHyphae, + Block::StrippedCrimsonHyphae, + Block::WarpedStem, + Block::StrippedWarpedStem, + Block::WarpedHyphae, + Block::StrippedWarpedHyphae, + Block::DarkOakLog, + Block::DarkOakWood, + Block::StrippedDarkOakLog, + Block::StrippedDarkOakWood, + Block::OakLog, + Block::OakWood, + Block::StrippedOakLog, + Block::StrippedOakWood, + Block::AcaciaLog, + Block::AcaciaWood, + Block::StrippedAcaciaLog, + Block::StrippedAcaciaWood, + Block::BirchLog, + Block::BirchWood, + Block::StrippedBirchLog, + Block::StrippedBirchWood, + Block::JungleLog, + Block::JungleWood, + Block::StrippedJungleLog, + Block::StrippedJungleWood, + Block::SpruceLog, + Block::SpruceWood, + Block::StrippedSpruceLog, + Block::StrippedSpruceWood, + Block::MangroveLog, + Block::MangroveWood, + Block::StrippedMangroveLog, + Block::StrippedMangroveWood, + Block::CherryLog, + Block::CherryWood, + Block::StrippedCherryLog, + Block::StrippedCherryWood, + ]) +}); +pub static ANVIL: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Anvil, Block::ChippedAnvil, Block::DamagedAnvil])); +pub static SMALL_FLOWERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Dandelion, + Block::Poppy, + Block::BlueOrchid, + Block::Allium, + Block::AzureBluet, + Block::RedTulip, + Block::OrangeTulip, + Block::WhiteTulip, + Block::PinkTulip, + Block::OxeyeDaisy, + Block::Cornflower, + Block::LilyOfTheValley, + Block::WitherRose, + Block::Torchflower, + ]) +}); +pub static DIRT: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + ]) +}); +pub static ENDERMAN_HOLDABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Sand, + Block::RedSand, + Block::Gravel, + Block::BrownMushroom, + Block::RedMushroom, + Block::Tnt, + Block::Cactus, + Block::Clay, + Block::Pumpkin, + Block::CarvedPumpkin, + Block::Melon, + Block::CrimsonFungus, + Block::CrimsonNylium, + Block::CrimsonRoots, + Block::WarpedFungus, + Block::WarpedNylium, + Block::WarpedRoots, + Block::Dandelion, + Block::Poppy, + Block::BlueOrchid, + Block::Allium, + Block::AzureBluet, + Block::RedTulip, + Block::OrangeTulip, + Block::WhiteTulip, + Block::PinkTulip, + Block::OxeyeDaisy, + Block::Cornflower, + Block::LilyOfTheValley, + Block::WitherRose, + Block::Torchflower, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + ]) +}); +pub static FLOWER_POTS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::FlowerPot, + Block::PottedPoppy, + Block::PottedBlueOrchid, + Block::PottedAllium, + Block::PottedAzureBluet, + Block::PottedRedTulip, + Block::PottedOrangeTulip, + Block::PottedWhiteTulip, + Block::PottedPinkTulip, + Block::PottedOxeyeDaisy, + Block::PottedDandelion, + Block::PottedOakSapling, + Block::PottedSpruceSapling, + Block::PottedBirchSapling, + Block::PottedJungleSapling, + Block::PottedAcaciaSapling, + Block::PottedDarkOakSapling, + Block::PottedRedMushroom, + Block::PottedBrownMushroom, + Block::PottedDeadBush, + Block::PottedFern, + Block::PottedCactus, + Block::PottedCornflower, + Block::PottedLilyOfTheValley, + Block::PottedWitherRose, + Block::PottedBamboo, + Block::PottedCrimsonFungus, + Block::PottedWarpedFungus, + Block::PottedCrimsonRoots, + Block::PottedWarpedRoots, + Block::PottedAzaleaBush, + Block::PottedFloweringAzaleaBush, + Block::PottedMangrovePropagule, + Block::PottedCherrySapling, + Block::PottedTorchflower, + ]) +}); +pub static WOODEN_PRESSURE_PLATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakPressurePlate, + Block::SprucePressurePlate, + Block::BirchPressurePlate, + Block::JunglePressurePlate, + Block::AcaciaPressurePlate, + Block::DarkOakPressurePlate, + Block::CrimsonPressurePlate, + Block::WarpedPressurePlate, + Block::MangrovePressurePlate, + Block::BambooPressurePlate, + Block::CherryPressurePlate, + ]) +}); +pub static STONE_PRESSURE_PLATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::StonePressurePlate, + Block::PolishedBlackstonePressurePlate, + ]) +}); +pub static PRESSURE_PLATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::LightWeightedPressurePlate, + Block::HeavyWeightedPressurePlate, + Block::OakPressurePlate, + Block::SprucePressurePlate, + Block::BirchPressurePlate, + Block::JunglePressurePlate, + Block::AcaciaPressurePlate, + Block::DarkOakPressurePlate, + Block::CrimsonPressurePlate, + Block::WarpedPressurePlate, + Block::MangrovePressurePlate, + Block::BambooPressurePlate, + Block::CherryPressurePlate, + Block::StonePressurePlate, + Block::PolishedBlackstonePressurePlate, + ]) +}); +pub static BANNERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WhiteBanner, + Block::OrangeBanner, + Block::MagentaBanner, + Block::LightBlueBanner, + Block::YellowBanner, + Block::LimeBanner, + Block::PinkBanner, + Block::GrayBanner, + Block::LightGrayBanner, + Block::CyanBanner, + Block::PurpleBanner, + Block::BlueBanner, + Block::BrownBanner, + Block::GreenBanner, + Block::RedBanner, + Block::BlackBanner, + Block::WhiteWallBanner, + Block::OrangeWallBanner, + Block::MagentaWallBanner, + Block::LightBlueWallBanner, + Block::YellowWallBanner, + Block::LimeWallBanner, + Block::PinkWallBanner, + Block::GrayWallBanner, + Block::LightGrayWallBanner, + Block::CyanWallBanner, + Block::PurpleWallBanner, + Block::BlueWallBanner, + Block::BrownWallBanner, + Block::GreenWallBanner, + Block::RedWallBanner, + Block::BlackWallBanner, + ]) +}); +pub static STAIRS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::BambooMosaicStairs, + Block::CobblestoneStairs, + Block::SandstoneStairs, + Block::NetherBrickStairs, + Block::StoneBrickStairs, + Block::BrickStairs, + Block::PurpurStairs, + Block::QuartzStairs, + Block::RedSandstoneStairs, + Block::PrismarineBrickStairs, + Block::PrismarineStairs, + Block::DarkPrismarineStairs, + Block::PolishedGraniteStairs, + Block::SmoothRedSandstoneStairs, + Block::MossyStoneBrickStairs, + Block::PolishedDioriteStairs, + Block::MossyCobblestoneStairs, + Block::EndStoneBrickStairs, + Block::StoneStairs, + Block::SmoothSandstoneStairs, + Block::SmoothQuartzStairs, + Block::GraniteStairs, + Block::AndesiteStairs, + Block::RedNetherBrickStairs, + Block::PolishedAndesiteStairs, + Block::DioriteStairs, + Block::BlackstoneStairs, + Block::PolishedBlackstoneBrickStairs, + Block::PolishedBlackstoneStairs, + Block::CobbledDeepslateStairs, + Block::PolishedDeepslateStairs, + Block::DeepslateTileStairs, + Block::DeepslateBrickStairs, + Block::OxidizedCutCopperStairs, + Block::WeatheredCutCopperStairs, + Block::ExposedCutCopperStairs, + Block::CutCopperStairs, + Block::WaxedWeatheredCutCopperStairs, + Block::WaxedExposedCutCopperStairs, + Block::WaxedCutCopperStairs, + Block::WaxedOxidizedCutCopperStairs, + Block::MudBrickStairs, + Block::OakStairs, + Block::SpruceStairs, + Block::BirchStairs, + Block::JungleStairs, + Block::AcaciaStairs, + Block::DarkOakStairs, + Block::CrimsonStairs, + Block::WarpedStairs, + Block::MangroveStairs, + Block::BambooStairs, + Block::CherryStairs, + ]) +}); +pub static SLABS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::BambooMosaicSlab, + Block::StoneSlab, + Block::SmoothStoneSlab, + Block::StoneBrickSlab, + Block::SandstoneSlab, + Block::PurpurSlab, + Block::QuartzSlab, + Block::RedSandstoneSlab, + Block::BrickSlab, + Block::CobblestoneSlab, + Block::NetherBrickSlab, + Block::PetrifiedOakSlab, + Block::PrismarineSlab, + Block::PrismarineBrickSlab, + Block::DarkPrismarineSlab, + Block::PolishedGraniteSlab, + Block::SmoothRedSandstoneSlab, + Block::MossyStoneBrickSlab, + Block::PolishedDioriteSlab, + Block::MossyCobblestoneSlab, + Block::EndStoneBrickSlab, + Block::SmoothSandstoneSlab, + Block::SmoothQuartzSlab, + Block::GraniteSlab, + Block::AndesiteSlab, + Block::RedNetherBrickSlab, + Block::PolishedAndesiteSlab, + Block::DioriteSlab, + Block::CutSandstoneSlab, + Block::CutRedSandstoneSlab, + Block::BlackstoneSlab, + Block::PolishedBlackstoneBrickSlab, + Block::PolishedBlackstoneSlab, + Block::CobbledDeepslateSlab, + Block::PolishedDeepslateSlab, + Block::DeepslateTileSlab, + Block::DeepslateBrickSlab, + Block::WaxedWeatheredCutCopperSlab, + Block::WaxedExposedCutCopperSlab, + Block::WaxedCutCopperSlab, + Block::OxidizedCutCopperSlab, + Block::WeatheredCutCopperSlab, + Block::ExposedCutCopperSlab, + Block::CutCopperSlab, + Block::WaxedOxidizedCutCopperSlab, + Block::MudBrickSlab, + Block::OakSlab, + Block::SpruceSlab, + Block::BirchSlab, + Block::JungleSlab, + Block::AcaciaSlab, + Block::DarkOakSlab, + Block::CrimsonSlab, + Block::WarpedSlab, + Block::MangroveSlab, + Block::BambooSlab, + Block::CherrySlab, + ]) +}); +pub static WALLS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::CobblestoneWall, + Block::MossyCobblestoneWall, + Block::BrickWall, + Block::PrismarineWall, + Block::RedSandstoneWall, + Block::MossyStoneBrickWall, + Block::GraniteWall, + Block::StoneBrickWall, + Block::NetherBrickWall, + Block::AndesiteWall, + Block::RedNetherBrickWall, + Block::SandstoneWall, + Block::EndStoneBrickWall, + Block::DioriteWall, + Block::BlackstoneWall, + Block::PolishedBlackstoneBrickWall, + Block::PolishedBlackstoneWall, + Block::CobbledDeepslateWall, + Block::PolishedDeepslateWall, + Block::DeepslateTileWall, + Block::DeepslateBrickWall, + Block::MudBrickWall, + ]) +}); +pub static CORAL_PLANTS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::TubeCoral, + Block::BrainCoral, + Block::BubbleCoral, + Block::FireCoral, + Block::HornCoral, + ]) +}); +pub static CORALS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::TubeCoralFan, + Block::BrainCoralFan, + Block::BubbleCoralFan, + Block::FireCoralFan, + Block::HornCoralFan, + Block::TubeCoral, + Block::BrainCoral, + Block::BubbleCoral, + Block::FireCoral, + Block::HornCoral, + ]) +}); +pub static WALL_CORALS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::TubeCoralWallFan, + Block::BrainCoralWallFan, + Block::BubbleCoralWallFan, + Block::FireCoralWallFan, + Block::HornCoralWallFan, + ]) +}); +pub static SAND: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Sand, + Block::RedSand, + Block::SuspiciousSand, + Block::SuspiciousSand, + ]) +}); +pub static CORAL_BLOCKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::TubeCoralBlock, + Block::BrainCoralBlock, + Block::BubbleCoralBlock, + Block::FireCoralBlock, + Block::HornCoralBlock, + ]) +}); +pub static RAILS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Rail, + Block::PoweredRail, + Block::DetectorRail, + Block::ActivatorRail, + ]) +}); +pub static ICE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Ice, + Block::PackedIce, + Block::BlueIce, + Block::FrostedIce, + ]) +}); +pub static VALID_SPAWN: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock, Block::Podzol])); +pub static LEAVES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::JungleLeaves, + Block::OakLeaves, + Block::SpruceLeaves, + Block::DarkOakLeaves, + Block::AcaciaLeaves, + Block::BirchLeaves, + Block::AzaleaLeaves, + Block::FloweringAzaleaLeaves, + Block::MangroveLeaves, + Block::CherryLeaves, + ]) +}); +pub static IMPERMEABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Glass, + Block::WhiteStainedGlass, + Block::OrangeStainedGlass, + Block::MagentaStainedGlass, + Block::LightBlueStainedGlass, + Block::YellowStainedGlass, + Block::LimeStainedGlass, + Block::PinkStainedGlass, + Block::GrayStainedGlass, + Block::LightGrayStainedGlass, + Block::CyanStainedGlass, + Block::PurpleStainedGlass, + Block::BlueStainedGlass, + Block::BrownStainedGlass, + Block::GreenStainedGlass, + Block::RedStainedGlass, + Block::BlackStainedGlass, + Block::TintedGlass, + ]) +}); +pub static WOODEN_TRAPDOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::AcaciaTrapdoor, + Block::BirchTrapdoor, + Block::DarkOakTrapdoor, + Block::JungleTrapdoor, + Block::OakTrapdoor, + Block::SpruceTrapdoor, + Block::CrimsonTrapdoor, + Block::WarpedTrapdoor, + Block::MangroveTrapdoor, + Block::BambooTrapdoor, + Block::CherryTrapdoor, + ]) +}); +pub static TRAPDOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::IronTrapdoor, + Block::AcaciaTrapdoor, + Block::BirchTrapdoor, + Block::DarkOakTrapdoor, + Block::JungleTrapdoor, + Block::OakTrapdoor, + Block::SpruceTrapdoor, + Block::CrimsonTrapdoor, + Block::WarpedTrapdoor, + Block::MangroveTrapdoor, + Block::BambooTrapdoor, + Block::CherryTrapdoor, + ]) +}); +pub static SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakSign, + Block::SpruceSign, + Block::BirchSign, + Block::AcaciaSign, + Block::JungleSign, + Block::DarkOakSign, + Block::CrimsonSign, + Block::WarpedSign, + Block::MangroveSign, + Block::BambooSign, + Block::CherrySign, + Block::OakWallSign, + Block::SpruceWallSign, + Block::BirchWallSign, + Block::AcaciaWallSign, + Block::JungleWallSign, + Block::DarkOakWallSign, + Block::CrimsonWallSign, + Block::WarpedWallSign, + Block::MangroveWallSign, + Block::BambooWallSign, + Block::CherryWallSign, + ]) +}); pub static UNDERWATER_BONEMEALS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Seagrass, @@ -793,35 +1635,417 @@ pub static UNDERWATER_BONEMEALS: Lazy> = Lazy::new(|| { Block::HornCoral, ]) }); -pub static INSIDE_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { +pub static CEILING_HANGING_SIGNS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::PowderSnow, - Block::SculkVein, - Block::GlowLichen, - Block::LilyPad, - Block::SmallAmethystBud, + Block::OakHangingSign, + Block::SpruceHangingSign, + Block::BirchHangingSign, + Block::AcaciaHangingSign, + Block::CherryHangingSign, + Block::JungleHangingSign, + Block::DarkOakHangingSign, + Block::CrimsonHangingSign, + Block::WarpedHangingSign, + Block::MangroveHangingSign, + Block::BambooHangingSign, + ]) +}); +pub static ALL_HANGING_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakHangingSign, + Block::SpruceHangingSign, + Block::BirchHangingSign, + Block::AcaciaHangingSign, + Block::CherryHangingSign, + Block::JungleHangingSign, + Block::DarkOakHangingSign, + Block::CrimsonHangingSign, + Block::WarpedHangingSign, + Block::MangroveHangingSign, + Block::BambooHangingSign, + Block::OakWallHangingSign, + Block::SpruceWallHangingSign, + Block::BirchWallHangingSign, + Block::AcaciaWallHangingSign, + Block::CherryWallHangingSign, + Block::JungleWallHangingSign, + Block::DarkOakWallHangingSign, + Block::CrimsonWallHangingSign, + Block::WarpedWallHangingSign, + Block::MangroveWallHangingSign, + Block::BambooWallHangingSign, + ]) +}); +pub static ALL_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakSign, + Block::SpruceSign, + Block::BirchSign, + Block::AcaciaSign, + Block::JungleSign, + Block::DarkOakSign, + Block::CrimsonSign, + Block::WarpedSign, + Block::MangroveSign, + Block::BambooSign, + Block::CherrySign, + Block::OakWallSign, + Block::SpruceWallSign, + Block::BirchWallSign, + Block::AcaciaWallSign, + Block::JungleWallSign, + Block::DarkOakWallSign, + Block::CrimsonWallSign, + Block::WarpedWallSign, + Block::MangroveWallSign, + Block::BambooWallSign, + Block::CherryWallSign, + Block::OakHangingSign, + Block::SpruceHangingSign, + Block::BirchHangingSign, + Block::AcaciaHangingSign, + Block::CherryHangingSign, + Block::JungleHangingSign, + Block::DarkOakHangingSign, + Block::CrimsonHangingSign, + Block::WarpedHangingSign, + Block::MangroveHangingSign, + Block::BambooHangingSign, + Block::OakWallHangingSign, + Block::SpruceWallHangingSign, + Block::BirchWallHangingSign, + Block::AcaciaWallHangingSign, + Block::CherryWallHangingSign, + Block::JungleWallHangingSign, + Block::DarkOakWallHangingSign, + Block::CrimsonWallHangingSign, + Block::WarpedWallHangingSign, + Block::MangroveWallHangingSign, + Block::BambooWallHangingSign, + ]) +}); +pub static BEDS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::RedBed, + Block::BlackBed, + Block::BlueBed, + Block::BrownBed, + Block::CyanBed, + Block::GrayBed, + Block::GreenBed, + Block::LightBlueBed, + Block::LightGrayBed, + Block::LimeBed, + Block::MagentaBed, + Block::OrangeBed, + Block::PinkBed, + Block::PurpleBed, + Block::WhiteBed, + Block::YellowBed, + ]) +}); +pub static FENCES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::NetherBrickFence, + Block::OakFence, + Block::AcaciaFence, + Block::DarkOakFence, + Block::SpruceFence, + Block::BirchFence, + Block::JungleFence, + Block::CrimsonFence, + Block::WarpedFence, + Block::MangroveFence, + Block::BambooFence, + Block::CherryFence, + ]) +}); +pub static DRAGON_IMMUNE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Barrier, + Block::Bedrock, + Block::EndPortal, + Block::EndPortalFrame, + Block::EndGateway, + Block::CommandBlock, + Block::RepeatingCommandBlock, + Block::ChainCommandBlock, + Block::StructureBlock, + Block::Jigsaw, + Block::MovingPiston, + Block::Obsidian, + Block::CryingObsidian, + Block::EndStone, + Block::IronBars, + Block::RespawnAnchor, + Block::ReinforcedDeepslate, + ]) +}); +pub static DRAGON_TRANSPARENT: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Light, Block::Fire, Block::SoulFire])); +pub static WITHER_IMMUNE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Barrier, + Block::Bedrock, + Block::EndPortal, + Block::EndPortalFrame, + Block::EndGateway, + Block::CommandBlock, + Block::RepeatingCommandBlock, + Block::ChainCommandBlock, + Block::StructureBlock, + Block::Jigsaw, + Block::MovingPiston, + Block::Light, + Block::ReinforcedDeepslate, + ]) +}); +pub static WITHER_SUMMON_BASE_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); +pub static TALL_FLOWERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Sunflower, + Block::Lilac, + Block::Peony, + Block::RoseBush, + Block::PitcherPlant, + ]) +}); +pub static FLOWERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::FloweringAzaleaLeaves, + Block::FloweringAzalea, + Block::MangrovePropagule, + Block::CherryLeaves, Block::PinkPetals, + Block::ChorusFlower, + Block::SporeBlossom, + Block::Dandelion, + Block::Poppy, + Block::BlueOrchid, + Block::Allium, + Block::AzureBluet, + Block::RedTulip, + Block::OrangeTulip, + Block::WhiteTulip, + Block::PinkTulip, + Block::OxeyeDaisy, + Block::Cornflower, + Block::LilyOfTheValley, + Block::WitherRose, + Block::Torchflower, + Block::Sunflower, + Block::Lilac, + Block::Peony, + Block::RoseBush, + Block::PitcherPlant, ]) }); -pub static ACACIA_LOGS: Lazy> = Lazy::new(|| { +pub static BEEHIVES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::BeeNest, Block::Beehive])); +pub static BEE_GROWABLES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::AcaciaLog, - Block::AcaciaWood, - Block::StrippedAcaciaLog, - Block::StrippedAcaciaWood, + Block::SweetBerryBush, + Block::CaveVines, + Block::CaveVinesPlant, + Block::Beetroots, + Block::Carrots, + Block::Potatoes, + Block::Wheat, + Block::MelonStem, + Block::PumpkinStem, + Block::TorchflowerCrop, + Block::PitcherCrop, ]) }); -pub static SMALL_DRIPLEAF_PLACEABLE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Clay, Block::MossBlock])); -pub static WALL_CORALS: Lazy> = Lazy::new(|| { +pub static SHULKER_BOXES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::TubeCoralWallFan, - Block::BrainCoralWallFan, - Block::BubbleCoralWallFan, - Block::FireCoralWallFan, - Block::HornCoralWallFan, + Block::ShulkerBox, + Block::BlackShulkerBox, + Block::BlueShulkerBox, + Block::BrownShulkerBox, + Block::CyanShulkerBox, + Block::GrayShulkerBox, + Block::GreenShulkerBox, + Block::LightBlueShulkerBox, + Block::LightGrayShulkerBox, + Block::LimeShulkerBox, + Block::MagentaShulkerBox, + Block::OrangeShulkerBox, + Block::PinkShulkerBox, + Block::PurpleShulkerBox, + Block::RedShulkerBox, + Block::WhiteShulkerBox, + Block::YellowShulkerBox, ]) }); +pub static CROPS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Beetroots, + Block::Carrots, + Block::Potatoes, + Block::Wheat, + Block::MelonStem, + Block::PumpkinStem, + Block::TorchflowerCrop, + Block::PitcherCrop, + ]) +}); +pub static PORTALS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::NetherPortal, + Block::EndPortal, + Block::EndGateway, + ]) +}); +pub static FIRE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Fire, Block::SoulFire])); +pub static BEACON_BASE_BLOCKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::NetheriteBlock, + Block::EmeraldBlock, + Block::DiamondBlock, + Block::GoldBlock, + Block::IronBlock, + ]) +}); +pub static WART_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::NetherWartBlock, Block::WarpedWartBlock])); +pub static SOUL_SPEED_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); +pub static WALL_POST_OVERRIDE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Torch, + Block::SoulTorch, + Block::RedstoneTorch, + Block::Tripwire, + Block::WhiteBanner, + Block::OrangeBanner, + Block::MagentaBanner, + Block::LightBlueBanner, + Block::YellowBanner, + Block::LimeBanner, + Block::PinkBanner, + Block::GrayBanner, + Block::LightGrayBanner, + Block::CyanBanner, + Block::PurpleBanner, + Block::BlueBanner, + Block::BrownBanner, + Block::GreenBanner, + Block::RedBanner, + Block::BlackBanner, + Block::WhiteWallBanner, + Block::OrangeWallBanner, + Block::MagentaWallBanner, + Block::LightBlueWallBanner, + Block::YellowWallBanner, + Block::LimeWallBanner, + Block::PinkWallBanner, + Block::GrayWallBanner, + Block::LightGrayWallBanner, + Block::CyanWallBanner, + Block::PurpleWallBanner, + Block::BlueWallBanner, + Block::BrownWallBanner, + Block::GreenWallBanner, + Block::RedWallBanner, + Block::BlackWallBanner, + Block::LightWeightedPressurePlate, + Block::HeavyWeightedPressurePlate, + Block::OakSign, + Block::SpruceSign, + Block::BirchSign, + Block::AcaciaSign, + Block::JungleSign, + Block::DarkOakSign, + Block::CrimsonSign, + Block::WarpedSign, + Block::MangroveSign, + Block::BambooSign, + Block::CherrySign, + Block::OakWallSign, + Block::SpruceWallSign, + Block::BirchWallSign, + Block::AcaciaWallSign, + Block::JungleWallSign, + Block::DarkOakWallSign, + Block::CrimsonWallSign, + Block::WarpedWallSign, + Block::MangroveWallSign, + Block::BambooWallSign, + Block::CherryWallSign, + Block::OakPressurePlate, + Block::SprucePressurePlate, + Block::BirchPressurePlate, + Block::JunglePressurePlate, + Block::AcaciaPressurePlate, + Block::DarkOakPressurePlate, + Block::CrimsonPressurePlate, + Block::WarpedPressurePlate, + Block::MangrovePressurePlate, + Block::BambooPressurePlate, + Block::CherryPressurePlate, + Block::StonePressurePlate, + Block::PolishedBlackstonePressurePlate, + ]) +}); +pub static CLIMBABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Ladder, + Block::Vine, + Block::Scaffolding, + Block::WeepingVines, + Block::WeepingVinesPlant, + Block::TwistingVines, + Block::TwistingVinesPlant, + Block::CaveVines, + Block::CaveVinesPlant, + ]) +}); +pub static FALL_DAMAGE_RESETTING: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::SweetBerryBush, + Block::Cobweb, + Block::Ladder, + Block::Vine, + Block::Scaffolding, + Block::WeepingVines, + Block::WeepingVinesPlant, + Block::TwistingVines, + Block::TwistingVinesPlant, + Block::CaveVines, + Block::CaveVinesPlant, + ]) +}); +pub static HOGLIN_REPELLENTS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WarpedFungus, + Block::PottedWarpedFungus, + Block::NetherPortal, + Block::RespawnAnchor, + ]) +}); +pub static PIGLIN_REPELLENTS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::SoulFire, + Block::SoulTorch, + Block::SoulLantern, + Block::SoulWallTorch, + Block::SoulCampfire, + ]) +}); +pub static GOLD_ORES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::GoldOre, + Block::NetherGoldOre, + Block::DeepslateGoldOre, + ]) +}); +pub static IRON_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::IronOre, Block::DeepslateIronOre])); +pub static DIAMOND_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::DiamondOre, Block::DeepslateDiamondOre])); pub static BAMBOO_PLANTABLE_ON: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Bamboo, @@ -843,6 +2067,422 @@ pub static BAMBOO_PLANTABLE_ON: Lazy> = Lazy::new(|| { Block::MuddyMangroveRoots, ]) }); +pub static COAL_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::CoalOre, Block::DeepslateCoalOre])); +pub static REDSTONE_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::RedstoneOre, Block::DeepslateRedstoneOre])); +pub static EMERALD_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::EmeraldOre, Block::DeepslateEmeraldOre])); +pub static COPPER_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::CopperOre, Block::DeepslateCopperOre])); +pub static LAPIS_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::LapisOre, Block::DeepslateLapisOre])); +pub static SOUL_FIRE_BASE_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); +pub static STRIDER_WARM_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Lava])); +pub static CAMPFIRES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Campfire, Block::SoulCampfire])); +pub static GUARDED_BY_PIGLINS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::GoldBlock, + Block::Barrel, + Block::Chest, + Block::EnderChest, + Block::GildedBlackstone, + Block::TrappedChest, + Block::RawGoldBlock, + Block::ShulkerBox, + Block::BlackShulkerBox, + Block::BlueShulkerBox, + Block::BrownShulkerBox, + Block::CyanShulkerBox, + Block::GrayShulkerBox, + Block::GreenShulkerBox, + Block::LightBlueShulkerBox, + Block::LightGrayShulkerBox, + Block::LimeShulkerBox, + Block::MagentaShulkerBox, + Block::OrangeShulkerBox, + Block::PinkShulkerBox, + Block::PurpleShulkerBox, + Block::RedShulkerBox, + Block::WhiteShulkerBox, + Block::YellowShulkerBox, + Block::GoldOre, + Block::NetherGoldOre, + Block::DeepslateGoldOre, + ]) +}); +pub static PREVENT_MOB_SPAWNING_INSIDE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Rail, + Block::PoweredRail, + Block::DetectorRail, + Block::ActivatorRail, + ]) +}); +pub static FENCE_GATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::AcaciaFenceGate, + Block::BirchFenceGate, + Block::DarkOakFenceGate, + Block::JungleFenceGate, + Block::OakFenceGate, + Block::SpruceFenceGate, + Block::CrimsonFenceGate, + Block::WarpedFenceGate, + Block::MangroveFenceGate, + Block::BambooFenceGate, + Block::CherryFenceGate, + ]) +}); +pub static UNSTABLE_BOTTOM_CENTER: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::AcaciaFenceGate, + Block::BirchFenceGate, + Block::DarkOakFenceGate, + Block::JungleFenceGate, + Block::OakFenceGate, + Block::SpruceFenceGate, + Block::CrimsonFenceGate, + Block::WarpedFenceGate, + Block::MangroveFenceGate, + Block::BambooFenceGate, + Block::CherryFenceGate, + ]) +}); +pub static MUSHROOM_GROW_BLOCK: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Mycelium, + Block::Podzol, + Block::CrimsonNylium, + Block::WarpedNylium, + ]) +}); +pub static INFINIBURN_OVERWORLD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::MagmaBlock])); +pub static INFINIBURN_NETHER: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::MagmaBlock])); +pub static INFINIBURN_END: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Bedrock, Block::Netherrack, Block::MagmaBlock])); +pub static STONE_ORE_REPLACEABLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + ]) +}); +pub static DEEPSLATE_ORE_REPLACEABLES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Deepslate, Block::Tuff])); +pub static BASE_STONE_OVERWORLD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + ]) +}); +pub static CANDLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Candle, + Block::WhiteCandle, + Block::OrangeCandle, + Block::MagentaCandle, + Block::LightBlueCandle, + Block::YellowCandle, + Block::LimeCandle, + Block::PinkCandle, + Block::GrayCandle, + Block::LightGrayCandle, + Block::CyanCandle, + Block::PurpleCandle, + Block::BlueCandle, + Block::BrownCandle, + Block::GreenCandle, + Block::RedCandle, + Block::BlackCandle, + ]) +}); +pub static STANDING_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakSign, + Block::SpruceSign, + Block::BirchSign, + Block::AcaciaSign, + Block::JungleSign, + Block::DarkOakSign, + Block::CrimsonSign, + Block::WarpedSign, + Block::MangroveSign, + Block::BambooSign, + Block::CherrySign, + ]) +}); +pub static WALL_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakWallSign, + Block::SpruceWallSign, + Block::BirchWallSign, + Block::AcaciaWallSign, + Block::JungleWallSign, + Block::DarkOakWallSign, + Block::CrimsonWallSign, + Block::WarpedWallSign, + Block::MangroveWallSign, + Block::BambooWallSign, + Block::CherryWallSign, + ]) +}); +pub static CANDLE_CAKES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::CandleCake, + Block::WhiteCandleCake, + Block::OrangeCandleCake, + Block::MagentaCandleCake, + Block::LightBlueCandleCake, + Block::YellowCandleCake, + Block::LimeCandleCake, + Block::PinkCandleCake, + Block::GrayCandleCake, + Block::LightGrayCandleCake, + Block::CyanCandleCake, + Block::PurpleCandleCake, + Block::BlueCandleCake, + Block::BrownCandleCake, + Block::GreenCandleCake, + Block::RedCandleCake, + Block::BlackCandleCake, + ]) +}); +pub static CRYSTAL_SOUND_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::AmethystBlock, Block::BuddingAmethyst])); +pub static SMELTS_TO_GLASS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Sand, Block::RedSand])); +pub static INSIDE_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::PowderSnow, + Block::SculkVein, + Block::GlowLichen, + Block::LilyPad, + Block::SmallAmethystBud, + Block::PinkPetals, + ]) +}); +pub static COMBINATION_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::MossCarpet, + Block::Snow, + Block::NetherSprouts, + Block::WarpedRoots, + Block::CrimsonRoots, + Block::WhiteCarpet, + Block::OrangeCarpet, + Block::MagentaCarpet, + Block::LightBlueCarpet, + Block::YellowCarpet, + Block::LimeCarpet, + Block::PinkCarpet, + Block::GrayCarpet, + Block::LightGrayCarpet, + Block::CyanCarpet, + Block::PurpleCarpet, + Block::BlueCarpet, + Block::BrownCarpet, + Block::GreenCarpet, + Block::RedCarpet, + Block::BlackCarpet, + ]) +}); +pub static DRIPSTONE_REPLACEABLE_BLOCKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + ]) +}); +pub static BASE_STONE_NETHER: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::Basalt, Block::Blackstone])); +pub static MOSS_REPLACEABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + Block::CaveVinesPlant, + Block::CaveVines, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + ]) +}); +pub static CAVE_VINES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::CaveVinesPlant, Block::CaveVines])); +pub static LUSH_GROUND_REPLACEABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Clay, + Block::Gravel, + Block::Sand, + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + Block::CaveVinesPlant, + Block::CaveVines, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + ]) +}); +pub static SMALL_DRIPLEAF_PLACEABLE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Clay, Block::MossBlock])); +pub static AZALEA_ROOT_REPLACEABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::RedSand, + Block::Clay, + Block::Gravel, + Block::Sand, + Block::SnowBlock, + Block::PowderSnow, + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + Block::Terracotta, + Block::WhiteTerracotta, + Block::OrangeTerracotta, + Block::MagentaTerracotta, + Block::LightBlueTerracotta, + Block::YellowTerracotta, + Block::LimeTerracotta, + Block::PinkTerracotta, + Block::GrayTerracotta, + Block::LightGrayTerracotta, + Block::CyanTerracotta, + Block::PurpleTerracotta, + Block::BlueTerracotta, + Block::BrownTerracotta, + Block::GreenTerracotta, + Block::RedTerracotta, + Block::BlackTerracotta, + ]) +}); +pub static BIG_DRIPLEAF_PLACEABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Farmland, + Block::Clay, + Block::MossBlock, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + ]) +}); +pub static OCCLUDES_VIBRATION_SIGNALS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WhiteWool, + Block::OrangeWool, + Block::MagentaWool, + Block::LightBlueWool, + Block::YellowWool, + Block::LimeWool, + Block::PinkWool, + Block::GrayWool, + Block::LightGrayWool, + Block::CyanWool, + Block::PurpleWool, + Block::BlueWool, + Block::BrownWool, + Block::GreenWool, + Block::RedWool, + Block::BlackWool, + ]) +}); +pub static DAMPENS_VIBRATIONS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WhiteWool, + Block::OrangeWool, + Block::MagentaWool, + Block::LightBlueWool, + Block::YellowWool, + Block::LimeWool, + Block::PinkWool, + Block::GrayWool, + Block::LightGrayWool, + Block::CyanWool, + Block::PurpleWool, + Block::BlueWool, + Block::BrownWool, + Block::GreenWool, + Block::RedWool, + Block::BlackWool, + Block::WhiteCarpet, + Block::OrangeCarpet, + Block::MagentaCarpet, + Block::LightBlueCarpet, + Block::YellowCarpet, + Block::LimeCarpet, + Block::PinkCarpet, + Block::GrayCarpet, + Block::LightGrayCarpet, + Block::CyanCarpet, + Block::PurpleCarpet, + Block::BlueCarpet, + Block::BrownCarpet, + Block::GreenCarpet, + Block::RedCarpet, + Block::BlackCarpet, + ]) +}); +pub static SNOW: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Snow, Block::SnowBlock, Block::PowderSnow])); +pub static NEEDS_DIAMOND_TOOL: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, + ]) +}); pub static SWORD_EFFICIENT: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::ShortGrass, @@ -935,316 +2575,83 @@ pub static SWORD_EFFICIENT: Lazy> = Lazy::new(|| { Block::PitcherCrop, ]) }); -pub static SNOW_LAYER_CANNOT_SURVIVE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Ice, Block::PackedIce, Block::Barrier])); -pub static MUSHROOM_GROW_BLOCK: Lazy> = Lazy::new(|| { +pub static NEEDS_IRON_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Mycelium, - Block::Podzol, - Block::CrimsonNylium, - Block::WarpedNylium, + Block::DiamondBlock, + Block::DiamondOre, + Block::DeepslateDiamondOre, + Block::EmeraldOre, + Block::DeepslateEmeraldOre, + Block::EmeraldBlock, + Block::GoldBlock, + Block::RawGoldBlock, + Block::GoldOre, + Block::DeepslateGoldOre, + Block::RedstoneOre, + Block::DeepslateRedstoneOre, ]) }); -pub static DEAD_BUSH_MAY_PLACE_ON: Lazy> = Lazy::new(|| { +pub static INCORRECT_FOR_NETHERITE_TOOL: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![])); +pub static CAULDRONS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Sand, - Block::RedSand, - Block::SuspiciousSand, - Block::SuspiciousSand, - Block::Terracotta, - Block::WhiteTerracotta, - Block::OrangeTerracotta, - Block::MagentaTerracotta, - Block::LightBlueTerracotta, - Block::YellowTerracotta, - Block::LimeTerracotta, - Block::PinkTerracotta, - Block::GrayTerracotta, - Block::LightGrayTerracotta, - Block::CyanTerracotta, - Block::PurpleTerracotta, - Block::BlueTerracotta, - Block::BrownTerracotta, - Block::GreenTerracotta, - Block::RedTerracotta, - Block::BlackTerracotta, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, + Block::Cauldron, + Block::WaterCauldron, + Block::LavaCauldron, + Block::PowderSnowCauldron, ]) }); -pub static CONCRETE_POWDER: Lazy> = Lazy::new(|| { +pub static INCORRECT_FOR_DIAMOND_TOOL: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![])); +pub static INCORRECT_FOR_IRON_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::WhiteConcretePowder, - Block::OrangeConcretePowder, - Block::MagentaConcretePowder, - Block::LightBlueConcretePowder, - Block::YellowConcretePowder, - Block::LimeConcretePowder, - Block::PinkConcretePowder, - Block::GrayConcretePowder, - Block::LightGrayConcretePowder, - Block::CyanConcretePowder, - Block::PurpleConcretePowder, - Block::BlueConcretePowder, - Block::BrownConcretePowder, - Block::GreenConcretePowder, - Block::RedConcretePowder, - Block::BlackConcretePowder, + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, ]) }); -pub static WOLVES_SPAWNABLE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock, Block::Snow, Block::SnowBlock])); -pub static LUSH_GROUND_REPLACEABLE: Lazy> = Lazy::new(|| { +pub static INCORRECT_FOR_STONE_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Clay, - Block::Gravel, - Block::Sand, - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, - Block::CaveVinesPlant, - Block::CaveVines, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, + Block::DiamondBlock, + Block::DiamondOre, + Block::DeepslateDiamondOre, + Block::EmeraldOre, + Block::DeepslateEmeraldOre, + Block::EmeraldBlock, + Block::GoldBlock, + Block::RawGoldBlock, + Block::GoldOre, + Block::DeepslateGoldOre, + Block::RedstoneOre, + Block::DeepslateRedstoneOre, ]) }); -pub static PARROTS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::GrassBlock, - Block::Air, - Block::JungleLeaves, - Block::OakLeaves, - Block::SpruceLeaves, - Block::DarkOakLeaves, - Block::AcaciaLeaves, - Block::BirchLeaves, - Block::AzaleaLeaves, - Block::FloweringAzaleaLeaves, - Block::MangroveLeaves, - Block::CherryLeaves, - Block::CrimsonStem, - Block::StrippedCrimsonStem, - Block::CrimsonHyphae, - Block::StrippedCrimsonHyphae, - Block::WarpedStem, - Block::StrippedWarpedStem, - Block::WarpedHyphae, - Block::StrippedWarpedHyphae, - Block::DarkOakLog, - Block::DarkOakWood, - Block::StrippedDarkOakLog, - Block::StrippedDarkOakWood, - Block::OakLog, - Block::OakWood, - Block::StrippedOakLog, - Block::StrippedOakWood, - Block::AcaciaLog, - Block::AcaciaWood, - Block::StrippedAcaciaLog, - Block::StrippedAcaciaWood, - Block::BirchLog, - Block::BirchWood, - Block::StrippedBirchLog, - Block::StrippedBirchWood, - Block::JungleLog, - Block::JungleWood, - Block::StrippedJungleLog, - Block::StrippedJungleWood, - Block::SpruceLog, - Block::SpruceWood, - Block::StrippedSpruceLog, - Block::StrippedSpruceWood, - Block::MangroveLog, - Block::MangroveWood, - Block::StrippedMangroveLog, - Block::StrippedMangroveWood, - Block::CherryLog, - Block::CherryWood, - Block::StrippedCherryLog, - Block::StrippedCherryWood, - ]) -}); -pub static WOODEN_SLABS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakSlab, - Block::SpruceSlab, - Block::BirchSlab, - Block::JungleSlab, - Block::AcaciaSlab, - Block::DarkOakSlab, - Block::CrimsonSlab, - Block::WarpedSlab, - Block::MangroveSlab, - Block::BambooSlab, - Block::CherrySlab, - ]) -}); -pub static WOODEN_STAIRS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakStairs, - Block::SpruceStairs, - Block::BirchStairs, - Block::JungleStairs, - Block::AcaciaStairs, - Block::DarkOakStairs, - Block::CrimsonStairs, - Block::WarpedStairs, - Block::MangroveStairs, - Block::BambooStairs, - Block::CherryStairs, - ]) -}); -pub static WALL_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakWallSign, - Block::SpruceWallSign, - Block::BirchWallSign, - Block::AcaciaWallSign, - Block::JungleWallSign, - Block::DarkOakWallSign, - Block::CrimsonWallSign, - Block::WarpedWallSign, - Block::MangroveWallSign, - Block::BambooWallSign, - Block::CherryWallSign, - ]) -}); -pub static MANGROVE_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::MangroveLog, - Block::MangroveWood, - Block::StrippedMangroveLog, - Block::StrippedMangroveWood, - ]) -}); -pub static WITHER_IMMUNE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Barrier, - Block::Bedrock, - Block::EndPortal, - Block::EndPortalFrame, - Block::EndGateway, - Block::CommandBlock, - Block::RepeatingCommandBlock, - Block::ChainCommandBlock, - Block::StructureBlock, - Block::Jigsaw, - Block::MovingPiston, - Block::Light, - Block::ReinforcedDeepslate, - ]) -}); -pub static DARK_OAK_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::DarkOakLog, - Block::DarkOakWood, - Block::StrippedDarkOakLog, - Block::StrippedDarkOakWood, - ]) -}); -pub static STONE_ORE_REPLACEABLES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - ]) -}); -pub static EMERALD_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::EmeraldOre, Block::DeepslateEmeraldOre])); -pub static TALL_FLOWERS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Sunflower, - Block::Lilac, - Block::Peony, - Block::RoseBush, - Block::PitcherPlant, - ]) -}); -pub static BEE_GROWABLES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::SweetBerryBush, - Block::CaveVines, - Block::CaveVinesPlant, - Block::Beetroots, - Block::Carrots, - Block::Potatoes, - Block::Wheat, - Block::MelonStem, - Block::PumpkinStem, - Block::TorchflowerCrop, - Block::PitcherCrop, - ]) -}); -pub static DOORS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::IronDoor, - Block::OakDoor, - Block::SpruceDoor, - Block::BirchDoor, - Block::JungleDoor, - Block::AcaciaDoor, - Block::DarkOakDoor, - Block::CrimsonDoor, - Block::WarpedDoor, - Block::MangroveDoor, - Block::BambooDoor, - Block::CherryDoor, - ]) -}); -pub static BEDS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::RedBed, - Block::BlackBed, - Block::BlueBed, - Block::BrownBed, - Block::CyanBed, - Block::GrayBed, - Block::GreenBed, - Block::LightBlueBed, - Block::LightGrayBed, - Block::LimeBed, - Block::MagentaBed, - Block::OrangeBed, - Block::PinkBed, - Block::PurpleBed, - Block::WhiteBed, - Block::YellowBed, - ]) -}); -pub static BASE_STONE_OVERWORLD: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, - ]) -}); -pub static SNIFFER_EGG_HATCH_BOOST: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::MossBlock])); -pub static VALID_SPAWN: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock, Block::Podzol])); -pub static NEEDS_STONE_TOOL: Lazy> = Lazy::new(|| { +pub static INCORRECT_FOR_GOLD_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, + Block::DiamondBlock, + Block::DiamondOre, + Block::DeepslateDiamondOre, + Block::EmeraldOre, + Block::DeepslateEmeraldOre, + Block::EmeraldBlock, + Block::GoldBlock, + Block::RawGoldBlock, + Block::GoldOre, + Block::DeepslateGoldOre, + Block::RedstoneOre, + Block::DeepslateRedstoneOre, Block::IronBlock, Block::RawIronBlock, Block::IronOre, @@ -1290,53 +2697,70 @@ pub static NEEDS_STONE_TOOL: Lazy> = Lazy::new(|| { Block::LightningRod, ]) }); -pub static SNIFFER_DIGGABLE_BLOCK: Lazy> = Lazy::new(|| { +pub static INCORRECT_FOR_WOODEN_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, + Block::DiamondBlock, + Block::DiamondOre, + Block::DeepslateDiamondOre, + Block::EmeraldOre, + Block::DeepslateEmeraldOre, + Block::EmeraldBlock, + Block::GoldBlock, + Block::RawGoldBlock, + Block::GoldOre, + Block::DeepslateGoldOre, + Block::RedstoneOre, + Block::DeepslateRedstoneOre, + Block::IronBlock, + Block::RawIronBlock, + Block::IronOre, + Block::DeepslateIronOre, + Block::LapisBlock, + Block::LapisOre, + Block::DeepslateLapisOre, + Block::CopperBlock, + Block::RawCopperBlock, + Block::CopperOre, + Block::DeepslateCopperOre, + Block::CutCopperSlab, + Block::CutCopperStairs, + Block::CutCopper, + Block::WeatheredCopper, + Block::WeatheredCutCopperSlab, + Block::WeatheredCutCopperStairs, + Block::WeatheredCutCopper, + Block::OxidizedCopper, + Block::OxidizedCutCopperSlab, + Block::OxidizedCutCopperStairs, + Block::OxidizedCutCopper, + Block::ExposedCopper, + Block::ExposedCutCopperSlab, + Block::ExposedCutCopperStairs, + Block::ExposedCutCopper, + Block::WaxedCopperBlock, + Block::WaxedCutCopperSlab, + Block::WaxedCutCopperStairs, + Block::WaxedCutCopper, + Block::WaxedWeatheredCopper, + Block::WaxedWeatheredCutCopperSlab, + Block::WaxedWeatheredCutCopperStairs, + Block::WaxedWeatheredCutCopper, + Block::WaxedExposedCopper, + Block::WaxedExposedCutCopperSlab, + Block::WaxedExposedCutCopperStairs, + Block::WaxedExposedCutCopper, + Block::WaxedOxidizedCopper, + Block::WaxedOxidizedCutCopperSlab, + Block::WaxedOxidizedCutCopperStairs, + Block::WaxedOxidizedCutCopper, + Block::LightningRod, ]) }); -pub static ANCIENT_CITY_REPLACEABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Deepslate, - Block::DeepslateBricks, - Block::DeepslateTiles, - Block::DeepslateBrickSlab, - Block::DeepslateTileSlab, - Block::DeepslateBrickStairs, - Block::DeepslateTileWall, - Block::DeepslateBrickWall, - Block::CobbledDeepslate, - Block::CrackedDeepslateBricks, - Block::CrackedDeepslateTiles, - Block::GrayWool, - ]) -}); -pub static COPPER_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::CopperOre, Block::DeepslateCopperOre])); -pub static WOODEN_PRESSURE_PLATES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakPressurePlate, - Block::SprucePressurePlate, - Block::BirchPressurePlate, - Block::JunglePressurePlate, - Block::AcaciaPressurePlate, - Block::DarkOakPressurePlate, - Block::CrimsonPressurePlate, - Block::WarpedPressurePlate, - Block::MangrovePressurePlate, - Block::BambooPressurePlate, - Block::CherryPressurePlate, - ]) -}); -pub static NYLIUM: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::CrimsonNylium, Block::WarpedNylium])); pub static FEATURES_CANNOT_REPLACE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Bedrock, @@ -1346,373 +2770,6 @@ pub static FEATURES_CANNOT_REPLACE: Lazy> = Lazy::new(|| { Block::ReinforcedDeepslate, ]) }); -pub static SAND: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Sand, - Block::RedSand, - Block::SuspiciousSand, - Block::SuspiciousSand, - ]) -}); -pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::DarkOakLog, - Block::DarkOakWood, - Block::StrippedDarkOakLog, - Block::StrippedDarkOakWood, - Block::OakLog, - Block::OakWood, - Block::StrippedOakLog, - Block::StrippedOakWood, - Block::AcaciaLog, - Block::AcaciaWood, - Block::StrippedAcaciaLog, - Block::StrippedAcaciaWood, - Block::BirchLog, - Block::BirchWood, - Block::StrippedBirchLog, - Block::StrippedBirchWood, - Block::JungleLog, - Block::JungleWood, - Block::StrippedJungleLog, - Block::StrippedJungleWood, - Block::SpruceLog, - Block::SpruceWood, - Block::StrippedSpruceLog, - Block::StrippedSpruceWood, - Block::MangroveLog, - Block::MangroveWood, - Block::StrippedMangroveLog, - Block::StrippedMangroveWood, - Block::CherryLog, - Block::CherryWood, - Block::StrippedCherryLog, - Block::StrippedCherryWood, - ]) -}); -pub static CAMEL_SAND_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Sand, - Block::RedSand, - Block::SuspiciousSand, - Block::SuspiciousSand, - Block::WhiteConcretePowder, - Block::OrangeConcretePowder, - Block::MagentaConcretePowder, - Block::LightBlueConcretePowder, - Block::YellowConcretePowder, - Block::LimeConcretePowder, - Block::PinkConcretePowder, - Block::GrayConcretePowder, - Block::LightGrayConcretePowder, - Block::CyanConcretePowder, - Block::PurpleConcretePowder, - Block::BlueConcretePowder, - Block::BrownConcretePowder, - Block::GreenConcretePowder, - Block::RedConcretePowder, - Block::BlackConcretePowder, - ]) -}); -pub static CHERRY_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::CherryLog, - Block::CherryWood, - Block::StrippedCherryLog, - Block::StrippedCherryWood, - ]) -}); -pub static DAMPENS_VIBRATIONS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WhiteWool, - Block::OrangeWool, - Block::MagentaWool, - Block::LightBlueWool, - Block::YellowWool, - Block::LimeWool, - Block::PinkWool, - Block::GrayWool, - Block::LightGrayWool, - Block::CyanWool, - Block::PurpleWool, - Block::BlueWool, - Block::BrownWool, - Block::GreenWool, - Block::RedWool, - Block::BlackWool, - Block::WhiteCarpet, - Block::OrangeCarpet, - Block::MagentaCarpet, - Block::LightBlueCarpet, - Block::YellowCarpet, - Block::LimeCarpet, - Block::PinkCarpet, - Block::GrayCarpet, - Block::LightGrayCarpet, - Block::CyanCarpet, - Block::PurpleCarpet, - Block::BlueCarpet, - Block::BrownCarpet, - Block::GreenCarpet, - Block::RedCarpet, - Block::BlackCarpet, - ]) -}); -pub static DIAMOND_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::DiamondOre, Block::DeepslateDiamondOre])); -pub static WOOL: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WhiteWool, - Block::OrangeWool, - Block::MagentaWool, - Block::LightBlueWool, - Block::YellowWool, - Block::LimeWool, - Block::PinkWool, - Block::GrayWool, - Block::LightGrayWool, - Block::CyanWool, - Block::PurpleWool, - Block::BlueWool, - Block::BrownWool, - Block::GreenWool, - Block::RedWool, - Block::BlackWool, - ]) -}); -pub static FOXES_SPAWNABLE_ON: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::GrassBlock, - Block::Snow, - Block::SnowBlock, - Block::Podzol, - Block::CoarseDirt, - ]) -}); -pub static ALL_HANGING_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakHangingSign, - Block::SpruceHangingSign, - Block::BirchHangingSign, - Block::AcaciaHangingSign, - Block::CherryHangingSign, - Block::JungleHangingSign, - Block::DarkOakHangingSign, - Block::CrimsonHangingSign, - Block::WarpedHangingSign, - Block::MangroveHangingSign, - Block::BambooHangingSign, - Block::OakWallHangingSign, - Block::SpruceWallHangingSign, - Block::BirchWallHangingSign, - Block::AcaciaWallHangingSign, - Block::CherryWallHangingSign, - Block::JungleWallHangingSign, - Block::DarkOakWallHangingSign, - Block::CrimsonWallHangingSign, - Block::WarpedWallHangingSign, - Block::MangroveWallHangingSign, - Block::BambooWallHangingSign, - ]) -}); -pub static WOODEN_TRAPDOORS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::AcaciaTrapdoor, - Block::BirchTrapdoor, - Block::DarkOakTrapdoor, - Block::JungleTrapdoor, - Block::OakTrapdoor, - Block::SpruceTrapdoor, - Block::CrimsonTrapdoor, - Block::WarpedTrapdoor, - Block::MangroveTrapdoor, - Block::BambooTrapdoor, - Block::CherryTrapdoor, - ]) -}); -pub static DRAGON_TRANSPARENT: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Light, Block::Fire, Block::SoulFire])); -pub static REPLACEABLE_BY_TREES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::ShortGrass, - Block::Fern, - Block::DeadBush, - Block::Vine, - Block::GlowLichen, - Block::Sunflower, - Block::Lilac, - Block::RoseBush, - Block::Peony, - Block::TallGrass, - Block::LargeFern, - Block::HangingRoots, - Block::PitcherPlant, - Block::Water, - Block::Seagrass, - Block::TallSeagrass, - Block::WarpedRoots, - Block::NetherSprouts, - Block::CrimsonRoots, - Block::JungleLeaves, - Block::OakLeaves, - Block::SpruceLeaves, - Block::DarkOakLeaves, - Block::AcaciaLeaves, - Block::BirchLeaves, - Block::AzaleaLeaves, - Block::FloweringAzaleaLeaves, - Block::MangroveLeaves, - Block::CherryLeaves, - ]) -}); -pub static FLOWERS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::FloweringAzaleaLeaves, - Block::FloweringAzalea, - Block::MangrovePropagule, - Block::CherryLeaves, - Block::PinkPetals, - Block::ChorusFlower, - Block::SporeBlossom, - Block::Dandelion, - Block::Poppy, - Block::BlueOrchid, - Block::Allium, - Block::AzureBluet, - Block::RedTulip, - Block::OrangeTulip, - Block::WhiteTulip, - Block::PinkTulip, - Block::OxeyeDaisy, - Block::Cornflower, - Block::LilyOfTheValley, - Block::WitherRose, - Block::Torchflower, - Block::Sunflower, - Block::Lilac, - Block::Peony, - Block::RoseBush, - Block::PitcherPlant, - ]) -}); -pub static FIRE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Fire, Block::SoulFire])); -pub static CANDLE_CAKES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::CandleCake, - Block::WhiteCandleCake, - Block::OrangeCandleCake, - Block::MagentaCandleCake, - Block::LightBlueCandleCake, - Block::YellowCandleCake, - Block::LimeCandleCake, - Block::PinkCandleCake, - Block::GrayCandleCake, - Block::LightGrayCandleCake, - Block::CyanCandleCake, - Block::PurpleCandleCake, - Block::BlueCandleCake, - Block::BrownCandleCake, - Block::GreenCandleCake, - Block::RedCandleCake, - Block::BlackCandleCake, - ]) -}); -pub static BANNERS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WhiteBanner, - Block::OrangeBanner, - Block::MagentaBanner, - Block::LightBlueBanner, - Block::YellowBanner, - Block::LimeBanner, - Block::PinkBanner, - Block::GrayBanner, - Block::LightGrayBanner, - Block::CyanBanner, - Block::PurpleBanner, - Block::BlueBanner, - Block::BrownBanner, - Block::GreenBanner, - Block::RedBanner, - Block::BlackBanner, - Block::WhiteWallBanner, - Block::OrangeWallBanner, - Block::MagentaWallBanner, - Block::LightBlueWallBanner, - Block::YellowWallBanner, - Block::LimeWallBanner, - Block::PinkWallBanner, - Block::GrayWallBanner, - Block::LightGrayWallBanner, - Block::CyanWallBanner, - Block::PurpleWallBanner, - Block::BlueWallBanner, - Block::BrownWallBanner, - Block::GreenWallBanner, - Block::RedWallBanner, - Block::BlackWallBanner, - ]) -}); -pub static TERRACOTTA: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Terracotta, - Block::WhiteTerracotta, - Block::OrangeTerracotta, - Block::MagentaTerracotta, - Block::LightBlueTerracotta, - Block::YellowTerracotta, - Block::LimeTerracotta, - Block::PinkTerracotta, - Block::GrayTerracotta, - Block::LightGrayTerracotta, - Block::CyanTerracotta, - Block::PurpleTerracotta, - Block::BlueTerracotta, - Block::BrownTerracotta, - Block::GreenTerracotta, - Block::RedTerracotta, - Block::BlackTerracotta, - ]) -}); -pub static BIRCH_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::BirchLog, - Block::BirchWood, - Block::StrippedBirchLog, - Block::StrippedBirchWood, - ]) -}); -pub static PIGLIN_REPELLENTS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::SoulFire, - Block::SoulTorch, - Block::SoulLantern, - Block::SoulWallTorch, - Block::SoulCampfire, - ]) -}); -pub static MANGROVE_LOGS_CAN_GROW_THROUGH: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Mud, - Block::MuddyMangroveRoots, - Block::MangroveRoots, - Block::MangroveLeaves, - Block::MangroveLog, - Block::MangrovePropagule, - Block::MossCarpet, - Block::Vine, - ]) -}); -pub static BEACON_BASE_BLOCKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::NetheriteBlock, - Block::EmeraldBlock, - Block::DiamondBlock, - Block::GoldBlock, - Block::IronBlock, - ]) -}); pub static LAVA_POOL_STONE_CANNOT_REPLACE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Bedrock, @@ -1772,24 +2829,194 @@ pub static LAVA_POOL_STONE_CANNOT_REPLACE: Lazy> = Lazy::new(|| { Block::StrippedCherryWood, ]) }); -pub static OVERWORLD_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { +pub static GEODE_INVALID_BLOCKS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ + Block::Bedrock, Block::Water, - Block::Gravel, - Block::SuspiciousGravel, - Block::Sandstone, - Block::RedSandstone, - Block::Calcite, - Block::Snow, + Block::Lava, + Block::Ice, Block::PackedIce, - Block::RawIronBlock, - Block::RawCopperBlock, + Block::BlueIce, + ]) +}); +pub static ANIMALS_SPAWNABLE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock])); +pub static ARMADILLO_SPAWNABLE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::RedSand, + Block::CoarseDirt, + Block::GrassBlock, + Block::Terracotta, + Block::WhiteTerracotta, + Block::YellowTerracotta, + Block::OrangeTerracotta, + Block::RedTerracotta, + Block::BrownTerracotta, + Block::LightGrayTerracotta, + ]) +}); +pub static AXOLOTLS_SPAWNABLE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Clay])); +pub static GOATS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, + Block::Snow, + Block::SnowBlock, + Block::PackedIce, + Block::Gravel, + Block::GrassBlock, + ]) +}); +pub static MOOSHROOMS_SPAWNABLE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Mycelium])); +pub static PARROTS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::GrassBlock, + Block::Air, + Block::JungleLeaves, + Block::OakLeaves, + Block::SpruceLeaves, + Block::DarkOakLeaves, + Block::AcaciaLeaves, + Block::BirchLeaves, + Block::AzaleaLeaves, + Block::FloweringAzaleaLeaves, + Block::MangroveLeaves, + Block::CherryLeaves, + Block::CrimsonStem, + Block::StrippedCrimsonStem, + Block::CrimsonHyphae, + Block::StrippedCrimsonHyphae, + Block::WarpedStem, + Block::StrippedWarpedStem, + Block::WarpedHyphae, + Block::StrippedWarpedHyphae, + Block::DarkOakLog, + Block::DarkOakWood, + Block::StrippedDarkOakLog, + Block::StrippedDarkOakWood, + Block::OakLog, + Block::OakWood, + Block::StrippedOakLog, + Block::StrippedOakWood, + Block::AcaciaLog, + Block::AcaciaWood, + Block::StrippedAcaciaLog, + Block::StrippedAcaciaWood, + Block::BirchLog, + Block::BirchWood, + Block::StrippedBirchLog, + Block::StrippedBirchWood, + Block::JungleLog, + Block::JungleWood, + Block::StrippedJungleLog, + Block::StrippedJungleWood, + Block::SpruceLog, + Block::SpruceWood, + Block::StrippedSpruceLog, + Block::StrippedSpruceWood, + Block::MangroveLog, + Block::MangroveWood, + Block::StrippedMangroveLog, + Block::StrippedMangroveWood, + Block::CherryLog, + Block::CherryWood, + Block::StrippedCherryLog, + Block::StrippedCherryWood, + ]) +}); +pub static POLAR_BEARS_SPAWNABLE_ON_ALTERNATE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Ice])); +pub static RABBITS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::GrassBlock, + Block::Snow, + Block::SnowBlock, + Block::Sand, + ]) +}); +pub static FOXES_SPAWNABLE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::GrassBlock, + Block::Snow, + Block::SnowBlock, + Block::Podzol, + Block::CoarseDirt, + ]) +}); +pub static WOLVES_SPAWNABLE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::GrassBlock, + Block::Snow, + Block::SnowBlock, + Block::CoarseDirt, + Block::Podzol, + ]) +}); +pub static FROGS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::GrassBlock, + Block::Mud, + Block::MangroveRoots, + Block::MuddyMangroveRoots, + ]) +}); +pub static BADLANDS_TERRACOTTA: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Terracotta, + Block::WhiteTerracotta, + Block::YellowTerracotta, + Block::OrangeTerracotta, + Block::RedTerracotta, + Block::BrownTerracotta, + Block::LightGrayTerracotta, + ]) +}); +pub static TERRACOTTA: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Terracotta, + Block::WhiteTerracotta, + Block::OrangeTerracotta, + Block::MagentaTerracotta, + Block::LightBlueTerracotta, + Block::YellowTerracotta, + Block::LimeTerracotta, + Block::PinkTerracotta, + Block::GrayTerracotta, + Block::LightGrayTerracotta, + Block::CyanTerracotta, + Block::PurpleTerracotta, + Block::BlueTerracotta, + Block::BrownTerracotta, + Block::GreenTerracotta, + Block::RedTerracotta, + Block::BlackTerracotta, + ]) +}); +pub static CONCRETE_POWDER: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WhiteConcretePowder, + Block::OrangeConcretePowder, + Block::MagentaConcretePowder, + Block::LightBlueConcretePowder, + Block::YellowConcretePowder, + Block::LimeConcretePowder, + Block::PinkConcretePowder, + Block::GrayConcretePowder, + Block::LightGrayConcretePowder, + Block::CyanConcretePowder, + Block::PurpleConcretePowder, + Block::BlueConcretePowder, + Block::BrownConcretePowder, + Block::GreenConcretePowder, + Block::RedConcretePowder, + Block::BlackConcretePowder, + ]) +}); +pub static AZALEA_GROWS_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::SnowBlock, + Block::PowderSnow, Block::Dirt, Block::GrassBlock, Block::Podzol, @@ -1820,460 +3047,61 @@ pub static OVERWORLD_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { Block::GreenTerracotta, Block::RedTerracotta, Block::BlackTerracotta, - Block::IronOre, - Block::DeepslateIronOre, - Block::CopperOre, - Block::DeepslateCopperOre, ]) }); -pub static STANDING_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakSign, - Block::SpruceSign, - Block::BirchSign, - Block::AcaciaSign, - Block::JungleSign, - Block::DarkOakSign, - Block::CrimsonSign, - Block::WarpedSign, - Block::MangroveSign, - Block::BambooSign, - Block::CherrySign, - ]) -}); -pub static SLABS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::BambooMosaicSlab, - Block::StoneSlab, - Block::SmoothStoneSlab, - Block::StoneBrickSlab, - Block::SandstoneSlab, - Block::PurpurSlab, - Block::QuartzSlab, - Block::RedSandstoneSlab, - Block::BrickSlab, - Block::CobblestoneSlab, - Block::NetherBrickSlab, - Block::PetrifiedOakSlab, - Block::PrismarineSlab, - Block::PrismarineBrickSlab, - Block::DarkPrismarineSlab, - Block::PolishedGraniteSlab, - Block::SmoothRedSandstoneSlab, - Block::MossyStoneBrickSlab, - Block::PolishedDioriteSlab, - Block::MossyCobblestoneSlab, - Block::EndStoneBrickSlab, - Block::SmoothSandstoneSlab, - Block::SmoothQuartzSlab, - Block::GraniteSlab, - Block::AndesiteSlab, - Block::RedNetherBrickSlab, - Block::PolishedAndesiteSlab, - Block::DioriteSlab, - Block::CutSandstoneSlab, - Block::CutRedSandstoneSlab, - Block::BlackstoneSlab, - Block::PolishedBlackstoneBrickSlab, - Block::PolishedBlackstoneSlab, - Block::CobbledDeepslateSlab, - Block::PolishedDeepslateSlab, - Block::DeepslateTileSlab, - Block::DeepslateBrickSlab, - Block::WaxedWeatheredCutCopperSlab, - Block::WaxedExposedCutCopperSlab, - Block::WaxedCutCopperSlab, - Block::OxidizedCutCopperSlab, - Block::WeatheredCutCopperSlab, - Block::ExposedCutCopperSlab, - Block::CutCopperSlab, - Block::WaxedOxidizedCutCopperSlab, - Block::MudBrickSlab, - Block::OakSlab, - Block::SpruceSlab, - Block::BirchSlab, - Block::JungleSlab, - Block::AcaciaSlab, - Block::DarkOakSlab, - Block::CrimsonSlab, - Block::WarpedSlab, - Block::MangroveSlab, - Block::BambooSlab, - Block::CherrySlab, - ]) -}); -pub static ANVIL: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Anvil, Block::ChippedAnvil, Block::DamagedAnvil])); -pub static DRAGON_IMMUNE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Barrier, - Block::Bedrock, - Block::EndPortal, - Block::EndPortalFrame, - Block::EndGateway, - Block::CommandBlock, - Block::RepeatingCommandBlock, - Block::ChainCommandBlock, - Block::StructureBlock, - Block::Jigsaw, - Block::MovingPiston, - Block::Obsidian, - Block::CryingObsidian, - Block::EndStone, - Block::IronBars, - Block::RespawnAnchor, - Block::ReinforcedDeepslate, - ]) -}); -pub static STAIRS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::BambooMosaicStairs, - Block::CobblestoneStairs, - Block::SandstoneStairs, - Block::NetherBrickStairs, - Block::StoneBrickStairs, - Block::BrickStairs, - Block::PurpurStairs, - Block::QuartzStairs, - Block::RedSandstoneStairs, - Block::PrismarineBrickStairs, - Block::PrismarineStairs, - Block::DarkPrismarineStairs, - Block::PolishedGraniteStairs, - Block::SmoothRedSandstoneStairs, - Block::MossyStoneBrickStairs, - Block::PolishedDioriteStairs, - Block::MossyCobblestoneStairs, - Block::EndStoneBrickStairs, - Block::StoneStairs, - Block::SmoothSandstoneStairs, - Block::SmoothQuartzStairs, - Block::GraniteStairs, - Block::AndesiteStairs, - Block::RedNetherBrickStairs, - Block::PolishedAndesiteStairs, - Block::DioriteStairs, - Block::BlackstoneStairs, - Block::PolishedBlackstoneBrickStairs, - Block::PolishedBlackstoneStairs, - Block::CobbledDeepslateStairs, - Block::PolishedDeepslateStairs, - Block::DeepslateTileStairs, - Block::DeepslateBrickStairs, - Block::OxidizedCutCopperStairs, - Block::WeatheredCutCopperStairs, - Block::ExposedCutCopperStairs, - Block::CutCopperStairs, - Block::WaxedWeatheredCutCopperStairs, - Block::WaxedExposedCutCopperStairs, - Block::WaxedCutCopperStairs, - Block::WaxedOxidizedCutCopperStairs, - Block::MudBrickStairs, - Block::OakStairs, - Block::SpruceStairs, - Block::BirchStairs, - Block::JungleStairs, - Block::AcaciaStairs, - Block::DarkOakStairs, - Block::CrimsonStairs, - Block::WarpedStairs, - Block::MangroveStairs, - Block::BambooStairs, - Block::CherryStairs, - ]) -}); -pub static CAVE_VINES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::CaveVinesPlant, Block::CaveVines])); -pub static NEEDS_DIAMOND_TOOL: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Obsidian, - Block::CryingObsidian, - Block::NetheriteBlock, - Block::RespawnAnchor, - Block::AncientDebris, - ]) -}); -pub static ENDERMAN_HOLDABLE: Lazy> = Lazy::new(|| { +pub static FROG_PREFER_JUMP_TO: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::LilyPad, Block::BigDripleaf])); +pub static SCULK_REPLACEABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Sand, Block::RedSand, Block::Gravel, - Block::BrownMushroom, - Block::RedMushroom, - Block::Tnt, - Block::Cactus, + Block::SoulSand, + Block::SoulSoil, + Block::Calcite, + Block::SmoothBasalt, Block::Clay, - Block::Pumpkin, - Block::CarvedPumpkin, - Block::Melon, - Block::CrimsonFungus, + Block::DripstoneBlock, + Block::EndStone, + Block::RedSandstone, + Block::Sandstone, + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + Block::Terracotta, + Block::WhiteTerracotta, + Block::OrangeTerracotta, + Block::MagentaTerracotta, + Block::LightBlueTerracotta, + Block::YellowTerracotta, + Block::LimeTerracotta, + Block::PinkTerracotta, + Block::GrayTerracotta, + Block::LightGrayTerracotta, + Block::CyanTerracotta, + Block::PurpleTerracotta, + Block::BlueTerracotta, + Block::BrownTerracotta, + Block::GreenTerracotta, + Block::RedTerracotta, + Block::BlackTerracotta, Block::CrimsonNylium, - Block::CrimsonRoots, - Block::WarpedFungus, Block::WarpedNylium, - Block::WarpedRoots, - Block::Dandelion, - Block::Poppy, - Block::BlueOrchid, - Block::Allium, - Block::AzureBluet, - Block::RedTulip, - Block::OrangeTulip, - Block::WhiteTulip, - Block::PinkTulip, - Block::OxeyeDaisy, - Block::Cornflower, - Block::LilyOfTheValley, - Block::WitherRose, - Block::Torchflower, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, - ]) -}); -pub static ENCHANTMENT_POWER_TRANSMITTER: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Air, - Block::Water, - Block::Lava, - Block::ShortGrass, - Block::Fern, - Block::DeadBush, - Block::Seagrass, - Block::TallSeagrass, - Block::Fire, - Block::SoulFire, - Block::Snow, - Block::Vine, - Block::GlowLichen, - Block::Light, - Block::TallGrass, - Block::LargeFern, - Block::StructureVoid, - Block::VoidAir, - Block::CaveAir, - Block::BubbleColumn, - Block::WarpedRoots, - Block::NetherSprouts, - Block::CrimsonRoots, - Block::HangingRoots, - ]) -}); -pub static INFINIBURN_END: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Bedrock, Block::Netherrack, Block::MagmaBlock])); -pub static SOUL_FIRE_BASE_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); -pub static WOOL_CARPETS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WhiteCarpet, - Block::OrangeCarpet, - Block::MagentaCarpet, - Block::LightBlueCarpet, - Block::YellowCarpet, - Block::LimeCarpet, - Block::PinkCarpet, - Block::GrayCarpet, - Block::LightGrayCarpet, - Block::CyanCarpet, - Block::PurpleCarpet, - Block::BlueCarpet, - Block::BrownCarpet, - Block::GreenCarpet, - Block::RedCarpet, - Block::BlackCarpet, - ]) -}); -pub static GOATS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Stone, - Block::Snow, - Block::SnowBlock, - Block::PackedIce, - Block::Gravel, - Block::GrassBlock, - ]) -}); -pub static CORAL_BLOCKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::TubeCoralBlock, - Block::BrainCoralBlock, - Block::BubbleCoralBlock, - Block::FireCoralBlock, - Block::HornCoralBlock, - ]) -}); -pub static WOODEN_DOORS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakDoor, - Block::SpruceDoor, - Block::BirchDoor, - Block::JungleDoor, - Block::AcaciaDoor, - Block::DarkOakDoor, - Block::CrimsonDoor, - Block::WarpedDoor, - Block::MangroveDoor, - Block::BambooDoor, - Block::CherryDoor, - ]) -}); -pub static COAL_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::CoalOre, Block::DeepslateCoalOre])); -pub static BIG_DRIPLEAF_PLACEABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Farmland, - Block::Clay, - Block::MossBlock, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, - ]) -}); -pub static BUTTONS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakButton, - Block::SpruceButton, - Block::BirchButton, - Block::JungleButton, - Block::AcaciaButton, - Block::DarkOakButton, - Block::CrimsonButton, - Block::WarpedButton, - Block::MangroveButton, - Block::BambooButton, - Block::CherryButton, - Block::StoneButton, - Block::PolishedBlackstoneButton, - ]) -}); -pub static GOLD_ORES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::GoldOre, - Block::NetherGoldOre, - Block::DeepslateGoldOre, - ]) -}); -pub static NEEDS_IRON_TOOL: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::DiamondBlock, - Block::DiamondOre, - Block::DeepslateDiamondOre, - Block::EmeraldOre, - Block::DeepslateEmeraldOre, - Block::EmeraldBlock, - Block::GoldBlock, - Block::RawGoldBlock, - Block::GoldOre, - Block::DeepslateGoldOre, - Block::RedstoneOre, - Block::DeepslateRedstoneOre, - ]) -}); -pub static UNSTABLE_BOTTOM_CENTER: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::AcaciaFenceGate, - Block::BirchFenceGate, - Block::DarkOakFenceGate, - Block::JungleFenceGate, - Block::OakFenceGate, - Block::SpruceFenceGate, - Block::CrimsonFenceGate, - Block::WarpedFenceGate, - Block::MangroveFenceGate, - Block::BambooFenceGate, - Block::CherryFenceGate, - ]) -}); -pub static CORALS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::TubeCoralFan, - Block::BrainCoralFan, - Block::BubbleCoralFan, - Block::FireCoralFan, - Block::HornCoralFan, - Block::TubeCoral, - Block::BrainCoral, - Block::BubbleCoral, - Block::FireCoral, - Block::HornCoral, - ]) -}); -pub static WART_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::NetherWartBlock, Block::WarpedWartBlock])); -pub static BEEHIVES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::BeeNest, Block::Beehive])); -pub static POLAR_BEARS_SPAWNABLE_ON_ALTERNATE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Ice])); -pub static DEEPSLATE_ORE_REPLACEABLES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Deepslate, Block::Tuff])); -pub static SNAPS_GOAT_HORN: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Stone, - Block::PackedIce, - Block::IronOre, - Block::CoalOre, - Block::CopperOre, - Block::EmeraldOre, - Block::AcaciaLog, - Block::BirchLog, - Block::OakLog, - Block::JungleLog, - Block::SpruceLog, - Block::DarkOakLog, - Block::MangroveLog, - Block::CherryLog, - ]) -}); -pub static PREVENT_MOB_SPAWNING_INSIDE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Rail, - Block::PoweredRail, - Block::DetectorRail, - Block::ActivatorRail, - ]) -}); -pub static CONVERTABLE_TO_MUD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Dirt, Block::CoarseDirt, Block::RootedDirt])); -pub static SOUL_SPEED_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); -pub static OVERWORLD_NATURAL_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::AcaciaLog, - Block::BirchLog, - Block::OakLog, - Block::JungleLog, - Block::SpruceLog, - Block::DarkOakLog, - Block::MangroveLog, - Block::CherryLog, - ]) -}); -pub static CORAL_PLANTS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::TubeCoral, - Block::BrainCoral, - Block::BubbleCoral, - Block::FireCoral, - Block::HornCoral, - ]) -}); -pub static PORTALS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::NetherPortal, - Block::EndPortal, - Block::EndGateway, + Block::Netherrack, + Block::Basalt, + Block::Blackstone, ]) }); pub static SCULK_REPLACEABLE_WORLD_GEN: Lazy> = Lazy::new(|| { @@ -2335,51 +3163,118 @@ pub static SCULK_REPLACEABLE_WORLD_GEN: Lazy> = Lazy::new(|| { Block::Blackstone, ]) }); -pub static SHULKER_BOXES: Lazy> = Lazy::new(|| { +pub static CONVERTABLE_TO_MUD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Dirt, Block::CoarseDirt, Block::RootedDirt])); +pub static VIBRATION_RESONATORS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::AmethystBlock])); +pub static ANCIENT_CITY_REPLACEABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::ShulkerBox, - Block::BlackShulkerBox, - Block::BlueShulkerBox, - Block::BrownShulkerBox, - Block::CyanShulkerBox, - Block::GrayShulkerBox, - Block::GreenShulkerBox, - Block::LightBlueShulkerBox, - Block::LightGrayShulkerBox, - Block::LimeShulkerBox, - Block::MagentaShulkerBox, - Block::OrangeShulkerBox, - Block::PinkShulkerBox, - Block::PurpleShulkerBox, - Block::RedShulkerBox, - Block::WhiteShulkerBox, - Block::YellowShulkerBox, + Block::Deepslate, + Block::DeepslateBricks, + Block::DeepslateTiles, + Block::DeepslateBrickSlab, + Block::DeepslateTileSlab, + Block::DeepslateBrickStairs, + Block::DeepslateTileWall, + Block::DeepslateBrickWall, + Block::CobbledDeepslate, + Block::CrackedDeepslateBricks, + Block::CrackedDeepslateTiles, + Block::GrayWool, ]) }); -pub static FENCES: Lazy> = Lazy::new(|| { +pub static MANGROVE_LOGS_CAN_GROW_THROUGH: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::NetherBrickFence, - Block::OakFence, - Block::AcaciaFence, - Block::DarkOakFence, - Block::SpruceFence, - Block::BirchFence, - Block::JungleFence, - Block::CrimsonFence, - Block::WarpedFence, - Block::MangroveFence, - Block::BambooFence, - Block::CherryFence, + Block::Mud, + Block::MuddyMangroveRoots, + Block::MangroveRoots, + Block::MangroveLeaves, + Block::MangroveLog, + Block::MangrovePropagule, + Block::MossCarpet, + Block::Vine, ]) }); -pub static GEODE_INVALID_BLOCKS: Lazy> = Lazy::new(|| { +pub static MANGROVE_ROOTS_CAN_GROW_THROUGH: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Bedrock, + Block::Mud, + Block::MuddyMangroveRoots, + Block::MangroveRoots, + Block::MossCarpet, + Block::Vine, + Block::MangrovePropagule, + Block::Snow, + ]) +}); +pub static DEAD_BUSH_MAY_PLACE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Sand, + Block::RedSand, + Block::SuspiciousSand, + Block::SuspiciousSand, + Block::Terracotta, + Block::WhiteTerracotta, + Block::OrangeTerracotta, + Block::MagentaTerracotta, + Block::LightBlueTerracotta, + Block::YellowTerracotta, + Block::LimeTerracotta, + Block::PinkTerracotta, + Block::GrayTerracotta, + Block::LightGrayTerracotta, + Block::CyanTerracotta, + Block::PurpleTerracotta, + Block::BlueTerracotta, + Block::BrownTerracotta, + Block::GreenTerracotta, + Block::RedTerracotta, + Block::BlackTerracotta, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + ]) +}); +pub static SNOW_LAYER_CANNOT_SURVIVE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Ice, Block::PackedIce, Block::Barrier])); +pub static SNOW_LAYER_CAN_SURVIVE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::HoneyBlock, Block::SoulSand, Block::Mud])); +pub static REPLACEABLE_BY_TREES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::ShortGrass, + Block::Fern, + Block::DeadBush, + Block::Vine, + Block::GlowLichen, + Block::Sunflower, + Block::Lilac, + Block::RoseBush, + Block::Peony, + Block::TallGrass, + Block::LargeFern, + Block::HangingRoots, + Block::PitcherPlant, Block::Water, - Block::Lava, - Block::Ice, - Block::PackedIce, - Block::BlueIce, + Block::Seagrass, + Block::TallSeagrass, + Block::WarpedRoots, + Block::NetherSprouts, + Block::CrimsonRoots, + Block::JungleLeaves, + Block::OakLeaves, + Block::SpruceLeaves, + Block::DarkOakLeaves, + Block::AcaciaLeaves, + Block::BirchLeaves, + Block::AzaleaLeaves, + Block::FloweringAzaleaLeaves, + Block::MangroveLeaves, + Block::CherryLeaves, ]) }); pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { @@ -2438,60 +3333,42 @@ pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { Block::StrippedCherryWood, ]) }); -pub static FROG_PREFER_JUMP_TO: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::LilyPad, Block::BigDripleaf])); -pub static INFINIBURN_OVERWORLD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::MagmaBlock])); -pub static WITHER_SUMMON_BASE_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); -pub static FALL_DAMAGE_RESETTING: Lazy> = Lazy::new(|| { +pub static SNAPS_GOAT_HORN: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::SweetBerryBush, - Block::Cobweb, - Block::Ladder, - Block::Vine, - Block::Scaffolding, - Block::WeepingVines, - Block::WeepingVinesPlant, - Block::TwistingVines, - Block::TwistingVinesPlant, - Block::CaveVines, - Block::CaveVinesPlant, + Block::Stone, + Block::PackedIce, + Block::IronOre, + Block::CoalOre, + Block::CopperOre, + Block::EmeraldOre, + Block::AcaciaLog, + Block::BirchLog, + Block::OakLog, + Block::JungleLog, + Block::SpruceLog, + Block::DarkOakLog, + Block::MangroveLog, + Block::CherryLog, ]) }); -pub static SMALL_FLOWERS: Lazy> = Lazy::new(|| { +pub static TRAIL_RUINS_REPLACEABLE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Gravel])); +pub static INVALID_SPAWN_INSIDE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::EndPortal, Block::EndGateway])); +pub static SNIFFER_DIGGABLE_BLOCK: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Dandelion, - Block::Poppy, - Block::BlueOrchid, - Block::Allium, - Block::AzureBluet, - Block::RedTulip, - Block::OrangeTulip, - Block::WhiteTulip, - Block::PinkTulip, - Block::OxeyeDaisy, - Block::Cornflower, - Block::LilyOfTheValley, - Block::WitherRose, - Block::Torchflower, - ]) -}); -pub static CEILING_HANGING_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakHangingSign, - Block::SpruceHangingSign, - Block::BirchHangingSign, - Block::AcaciaHangingSign, - Block::CherryHangingSign, - Block::JungleHangingSign, - Block::DarkOakHangingSign, - Block::CrimsonHangingSign, - Block::WarpedHangingSign, - Block::MangroveHangingSign, - Block::BambooHangingSign, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, ]) }); +pub static SNIFFER_EGG_HATCH_BOOST: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::MossBlock])); pub static REPLACEABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Air, @@ -2520,62 +3397,142 @@ pub static REPLACEABLE: Lazy> = Lazy::new(|| { Block::HangingRoots, ]) }); -pub static STRIDER_WARM_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Lava])); -pub static ANIMALS_SPAWNABLE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock])); -pub static INVALID_SPAWN_INSIDE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::EndPortal, Block::EndGateway])); -pub static FENCE_GATES: Lazy> = Lazy::new(|| { +pub static ENCHANTMENT_POWER_PROVIDER: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Bookshelf])); +pub static ENCHANTMENT_POWER_TRANSMITTER: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::AcaciaFenceGate, - Block::BirchFenceGate, - Block::DarkOakFenceGate, - Block::JungleFenceGate, - Block::OakFenceGate, - Block::SpruceFenceGate, - Block::CrimsonFenceGate, - Block::WarpedFenceGate, - Block::MangroveFenceGate, - Block::BambooFenceGate, - Block::CherryFenceGate, + Block::Air, + Block::Water, + Block::Lava, + Block::ShortGrass, + Block::Fern, + Block::DeadBush, + Block::Seagrass, + Block::TallSeagrass, + Block::Fire, + Block::SoulFire, + Block::Snow, + Block::Vine, + Block::GlowLichen, + Block::Light, + Block::TallGrass, + Block::LargeFern, + Block::StructureVoid, + Block::VoidAir, + Block::CaveAir, + Block::BubbleColumn, + Block::WarpedRoots, + Block::NetherSprouts, + Block::CrimsonRoots, + Block::HangingRoots, ]) }); -pub static GUARDED_BY_PIGLINS: Lazy> = Lazy::new(|| { +pub static MAINTAINS_FARMLAND: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::GoldBlock, - Block::Barrel, - Block::Chest, - Block::EnderChest, - Block::GildedBlackstone, - Block::TrappedChest, - Block::RawGoldBlock, - Block::ShulkerBox, - Block::BlackShulkerBox, - Block::BlueShulkerBox, - Block::BrownShulkerBox, - Block::CyanShulkerBox, - Block::GrayShulkerBox, - Block::GreenShulkerBox, - Block::LightBlueShulkerBox, - Block::LightGrayShulkerBox, - Block::LimeShulkerBox, - Block::MagentaShulkerBox, - Block::OrangeShulkerBox, - Block::PinkShulkerBox, - Block::PurpleShulkerBox, - Block::RedShulkerBox, - Block::WhiteShulkerBox, - Block::YellowShulkerBox, - Block::GoldOre, - Block::NetherGoldOre, - Block::DeepslateGoldOre, + Block::PumpkinStem, + Block::AttachedPumpkinStem, + Block::MelonStem, + Block::AttachedMelonStem, + Block::Beetroots, + Block::Carrots, + Block::Potatoes, + Block::TorchflowerCrop, + Block::Torchflower, + Block::PitcherCrop, + Block::Wheat, ]) }); -pub static AZALEA_GROWS_ON: Lazy> = Lazy::new(|| { +pub static CAMEL_SAND_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::SnowBlock, - Block::PowderSnow, + Block::Sand, + Block::RedSand, + Block::SuspiciousSand, + Block::SuspiciousSand, + Block::WhiteConcretePowder, + Block::OrangeConcretePowder, + Block::MagentaConcretePowder, + Block::LightBlueConcretePowder, + Block::YellowConcretePowder, + Block::LimeConcretePowder, + Block::PinkConcretePowder, + Block::GrayConcretePowder, + Block::LightGrayConcretePowder, + Block::CyanConcretePowder, + Block::PurpleConcretePowder, + Block::BlueConcretePowder, + Block::BrownConcretePowder, + Block::GreenConcretePowder, + Block::RedConcretePowder, + Block::BlackConcretePowder, + ]) +}); +pub static DOES_NOT_BLOCK_HOPPERS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::BeeNest, Block::Beehive])); +pub static NEEDS_STONE_TOOL: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::IronBlock, + Block::RawIronBlock, + Block::IronOre, + Block::DeepslateIronOre, + Block::LapisBlock, + Block::LapisOre, + Block::DeepslateLapisOre, + Block::CopperBlock, + Block::RawCopperBlock, + Block::CopperOre, + Block::DeepslateCopperOre, + Block::CutCopperSlab, + Block::CutCopperStairs, + Block::CutCopper, + Block::WeatheredCopper, + Block::WeatheredCutCopperSlab, + Block::WeatheredCutCopperStairs, + Block::WeatheredCutCopper, + Block::OxidizedCopper, + Block::OxidizedCutCopperSlab, + Block::OxidizedCutCopperStairs, + Block::OxidizedCutCopper, + Block::ExposedCopper, + Block::ExposedCutCopperSlab, + Block::ExposedCutCopperStairs, + Block::ExposedCutCopper, + Block::WaxedCopperBlock, + Block::WaxedCutCopperSlab, + Block::WaxedCutCopperStairs, + Block::WaxedCutCopper, + Block::WaxedWeatheredCopper, + Block::WaxedWeatheredCutCopperSlab, + Block::WaxedWeatheredCutCopperStairs, + Block::WaxedWeatheredCutCopper, + Block::WaxedExposedCopper, + Block::WaxedExposedCutCopperSlab, + Block::WaxedExposedCutCopperStairs, + Block::WaxedExposedCutCopper, + Block::WaxedOxidizedCopper, + Block::WaxedOxidizedCutCopperSlab, + Block::WaxedOxidizedCutCopperStairs, + Block::WaxedOxidizedCutCopper, + Block::LightningRod, + ]) +}); +pub static OVERWORLD_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Water, + Block::Gravel, + Block::SuspiciousGravel, + Block::Sandstone, + Block::RedSandstone, + Block::Calcite, + Block::Snow, + Block::PackedIce, + Block::RawIronBlock, + Block::RawCopperBlock, + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, Block::Dirt, Block::GrassBlock, Block::Podzol, @@ -2606,91 +3563,16 @@ pub static AZALEA_GROWS_ON: Lazy> = Lazy::new(|| { Block::GreenTerracotta, Block::RedTerracotta, Block::BlackTerracotta, + Block::IronOre, + Block::DeepslateIronOre, + Block::CopperOre, + Block::DeepslateCopperOre, ]) }); -pub static OAK_LOGS: Lazy> = Lazy::new(|| { +pub static NYLIUM: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::CrimsonNylium, Block::WarpedNylium])); +pub static WALL_HANGING_SIGNS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakLog, - Block::OakWood, - Block::StrippedOakLog, - Block::StrippedOakWood, - ]) -}); -pub static STONE_BRICKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::StoneBricks, - Block::MossyStoneBricks, - Block::CrackedStoneBricks, - Block::ChiseledStoneBricks, - ]) -}); -pub static LAPIS_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::LapisOre, Block::DeepslateLapisOre])); -pub static IMPERMEABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Glass, - Block::WhiteStainedGlass, - Block::OrangeStainedGlass, - Block::MagentaStainedGlass, - Block::LightBlueStainedGlass, - Block::YellowStainedGlass, - Block::LimeStainedGlass, - Block::PinkStainedGlass, - Block::GrayStainedGlass, - Block::LightGrayStainedGlass, - Block::CyanStainedGlass, - Block::PurpleStainedGlass, - Block::BlueStainedGlass, - Block::BrownStainedGlass, - Block::GreenStainedGlass, - Block::RedStainedGlass, - Block::BlackStainedGlass, - Block::TintedGlass, - ]) -}); -pub static ICE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Ice, - Block::PackedIce, - Block::BlueIce, - Block::FrostedIce, - ]) -}); -pub static ALL_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakSign, - Block::SpruceSign, - Block::BirchSign, - Block::AcaciaSign, - Block::JungleSign, - Block::DarkOakSign, - Block::CrimsonSign, - Block::WarpedSign, - Block::MangroveSign, - Block::BambooSign, - Block::CherrySign, - Block::OakWallSign, - Block::SpruceWallSign, - Block::BirchWallSign, - Block::AcaciaWallSign, - Block::JungleWallSign, - Block::DarkOakWallSign, - Block::CrimsonWallSign, - Block::WarpedWallSign, - Block::MangroveWallSign, - Block::BambooWallSign, - Block::CherryWallSign, - Block::OakHangingSign, - Block::SpruceHangingSign, - Block::BirchHangingSign, - Block::AcaciaHangingSign, - Block::CherryHangingSign, - Block::JungleHangingSign, - Block::DarkOakHangingSign, - Block::CrimsonHangingSign, - Block::WarpedHangingSign, - Block::MangroveHangingSign, - Block::BambooHangingSign, Block::OakWallHangingSign, Block::SpruceWallHangingSign, Block::BirchWallHangingSign, @@ -2704,34 +3586,6 @@ pub static ALL_SIGNS: Lazy> = Lazy::new(|| { Block::BambooWallHangingSign, ]) }); -pub static SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakSign, - Block::SpruceSign, - Block::BirchSign, - Block::AcaciaSign, - Block::JungleSign, - Block::DarkOakSign, - Block::CrimsonSign, - Block::WarpedSign, - Block::MangroveSign, - Block::BambooSign, - Block::CherrySign, - Block::OakWallSign, - Block::SpruceWallSign, - Block::BirchWallSign, - Block::AcaciaWallSign, - Block::JungleWallSign, - Block::DarkOakWallSign, - Block::CrimsonWallSign, - Block::WarpedWallSign, - Block::MangroveWallSign, - Block::BambooWallSign, - Block::CherryWallSign, - ]) -}); -pub static INFINIBURN_NETHER: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::MagmaBlock])); pub static NETHER_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::SoulSand, @@ -2760,661 +3614,3 @@ pub static NETHER_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { Block::WarpedWartBlock, ]) }); -pub static CRYSTAL_SOUND_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::AmethystBlock, Block::BuddingAmethyst])); -pub static DIRT: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, - ]) -}); -pub static MOOSHROOMS_SPAWNABLE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Mycelium])); -pub static PRESSURE_PLATES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::LightWeightedPressurePlate, - Block::HeavyWeightedPressurePlate, - Block::OakPressurePlate, - Block::SprucePressurePlate, - Block::BirchPressurePlate, - Block::JunglePressurePlate, - Block::AcaciaPressurePlate, - Block::DarkOakPressurePlate, - Block::CrimsonPressurePlate, - Block::WarpedPressurePlate, - Block::MangrovePressurePlate, - Block::BambooPressurePlate, - Block::CherryPressurePlate, - Block::StonePressurePlate, - Block::PolishedBlackstonePressurePlate, - ]) -}); -pub static LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::CrimsonStem, - Block::StrippedCrimsonStem, - Block::CrimsonHyphae, - Block::StrippedCrimsonHyphae, - Block::WarpedStem, - Block::StrippedWarpedStem, - Block::WarpedHyphae, - Block::StrippedWarpedHyphae, - Block::DarkOakLog, - Block::DarkOakWood, - Block::StrippedDarkOakLog, - Block::StrippedDarkOakWood, - Block::OakLog, - Block::OakWood, - Block::StrippedOakLog, - Block::StrippedOakWood, - Block::AcaciaLog, - Block::AcaciaWood, - Block::StrippedAcaciaLog, - Block::StrippedAcaciaWood, - Block::BirchLog, - Block::BirchWood, - Block::StrippedBirchLog, - Block::StrippedBirchWood, - Block::JungleLog, - Block::JungleWood, - Block::StrippedJungleLog, - Block::StrippedJungleWood, - Block::SpruceLog, - Block::SpruceWood, - Block::StrippedSpruceLog, - Block::StrippedSpruceWood, - Block::MangroveLog, - Block::MangroveWood, - Block::StrippedMangroveLog, - Block::StrippedMangroveWood, - Block::CherryLog, - Block::CherryWood, - Block::StrippedCherryLog, - Block::StrippedCherryWood, - ]) -}); -pub static MANGROVE_ROOTS_CAN_GROW_THROUGH: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Mud, - Block::MuddyMangroveRoots, - Block::MangroveRoots, - Block::MossCarpet, - Block::Vine, - Block::MangrovePropagule, - Block::Snow, - ]) -}); -pub static CLIMBABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Ladder, - Block::Vine, - Block::Scaffolding, - Block::WeepingVines, - Block::WeepingVinesPlant, - Block::TwistingVines, - Block::TwistingVinesPlant, - Block::CaveVines, - Block::CaveVinesPlant, - ]) -}); -pub static WOODEN_BUTTONS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakButton, - Block::SpruceButton, - Block::BirchButton, - Block::JungleButton, - Block::AcaciaButton, - Block::DarkOakButton, - Block::CrimsonButton, - Block::WarpedButton, - Block::MangroveButton, - Block::BambooButton, - Block::CherryButton, - ]) -}); -pub static ENCHANTMENT_POWER_PROVIDER: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Bookshelf])); -pub static CAULDRONS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Cauldron, - Block::WaterCauldron, - Block::LavaCauldron, - Block::PowderSnowCauldron, - ]) -}); -pub static SMELTS_TO_GLASS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Sand, Block::RedSand])); -pub static WALL_HANGING_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakWallHangingSign, - Block::SpruceWallHangingSign, - Block::BirchWallHangingSign, - Block::AcaciaWallHangingSign, - Block::CherryWallHangingSign, - Block::JungleWallHangingSign, - Block::DarkOakWallHangingSign, - Block::CrimsonWallHangingSign, - Block::WarpedWallHangingSign, - Block::MangroveWallHangingSign, - Block::BambooWallHangingSign, - ]) -}); -pub static WALL_POST_OVERRIDE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Torch, - Block::SoulTorch, - Block::RedstoneTorch, - Block::Tripwire, - Block::WhiteBanner, - Block::OrangeBanner, - Block::MagentaBanner, - Block::LightBlueBanner, - Block::YellowBanner, - Block::LimeBanner, - Block::PinkBanner, - Block::GrayBanner, - Block::LightGrayBanner, - Block::CyanBanner, - Block::PurpleBanner, - Block::BlueBanner, - Block::BrownBanner, - Block::GreenBanner, - Block::RedBanner, - Block::BlackBanner, - Block::WhiteWallBanner, - Block::OrangeWallBanner, - Block::MagentaWallBanner, - Block::LightBlueWallBanner, - Block::YellowWallBanner, - Block::LimeWallBanner, - Block::PinkWallBanner, - Block::GrayWallBanner, - Block::LightGrayWallBanner, - Block::CyanWallBanner, - Block::PurpleWallBanner, - Block::BlueWallBanner, - Block::BrownWallBanner, - Block::GreenWallBanner, - Block::RedWallBanner, - Block::BlackWallBanner, - Block::LightWeightedPressurePlate, - Block::HeavyWeightedPressurePlate, - Block::OakSign, - Block::SpruceSign, - Block::BirchSign, - Block::AcaciaSign, - Block::JungleSign, - Block::DarkOakSign, - Block::CrimsonSign, - Block::WarpedSign, - Block::MangroveSign, - Block::BambooSign, - Block::CherrySign, - Block::OakWallSign, - Block::SpruceWallSign, - Block::BirchWallSign, - Block::AcaciaWallSign, - Block::JungleWallSign, - Block::DarkOakWallSign, - Block::CrimsonWallSign, - Block::WarpedWallSign, - Block::MangroveWallSign, - Block::BambooWallSign, - Block::CherryWallSign, - Block::OakPressurePlate, - Block::SprucePressurePlate, - Block::BirchPressurePlate, - Block::JunglePressurePlate, - Block::AcaciaPressurePlate, - Block::DarkOakPressurePlate, - Block::CrimsonPressurePlate, - Block::WarpedPressurePlate, - Block::MangrovePressurePlate, - Block::BambooPressurePlate, - Block::CherryPressurePlate, - Block::StonePressurePlate, - Block::PolishedBlackstonePressurePlate, - ]) -}); -pub static HOGLIN_REPELLENTS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WarpedFungus, - Block::PottedWarpedFungus, - Block::NetherPortal, - Block::RespawnAnchor, - ]) -}); -pub static FLOWER_POTS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::FlowerPot, - Block::PottedPoppy, - Block::PottedBlueOrchid, - Block::PottedAllium, - Block::PottedAzureBluet, - Block::PottedRedTulip, - Block::PottedOrangeTulip, - Block::PottedWhiteTulip, - Block::PottedPinkTulip, - Block::PottedOxeyeDaisy, - Block::PottedDandelion, - Block::PottedOakSapling, - Block::PottedSpruceSapling, - Block::PottedBirchSapling, - Block::PottedJungleSapling, - Block::PottedAcaciaSapling, - Block::PottedDarkOakSapling, - Block::PottedRedMushroom, - Block::PottedBrownMushroom, - Block::PottedDeadBush, - Block::PottedFern, - Block::PottedCactus, - Block::PottedCornflower, - Block::PottedLilyOfTheValley, - Block::PottedWitherRose, - Block::PottedBamboo, - Block::PottedCrimsonFungus, - Block::PottedWarpedFungus, - Block::PottedCrimsonRoots, - Block::PottedWarpedRoots, - Block::PottedAzaleaBush, - Block::PottedFloweringAzaleaBush, - Block::PottedMangrovePropagule, - Block::PottedCherrySapling, - Block::PottedTorchflower, - ]) -}); -pub static JUNGLE_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::JungleLog, - Block::JungleWood, - Block::StrippedJungleLog, - Block::StrippedJungleWood, - ]) -}); -pub static DRIPSTONE_REPLACEABLE_BLOCKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, - ]) -}); -pub static SNOW: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Snow, Block::SnowBlock, Block::PowderSnow])); -pub static TRAPDOORS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::IronTrapdoor, - Block::AcaciaTrapdoor, - Block::BirchTrapdoor, - Block::DarkOakTrapdoor, - Block::JungleTrapdoor, - Block::OakTrapdoor, - Block::SpruceTrapdoor, - Block::CrimsonTrapdoor, - Block::WarpedTrapdoor, - Block::MangroveTrapdoor, - Block::BambooTrapdoor, - Block::CherryTrapdoor, - ]) -}); -pub static AXOLOTLS_SPAWNABLE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Clay])); -pub static TRAIL_RUINS_REPLACEABLE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Gravel])); -pub static WARPED_STEMS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WarpedStem, - Block::StrippedWarpedStem, - Block::WarpedHyphae, - Block::StrippedWarpedHyphae, - ]) -}); -pub static SNOW_LAYER_CAN_SURVIVE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::HoneyBlock, Block::SoulSand, Block::Mud])); -pub static BASE_STONE_NETHER: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::Basalt, Block::Blackstone])); -pub static CAMPFIRES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Campfire, Block::SoulCampfire])); -pub static IRON_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::IronOre, Block::DeepslateIronOre])); -pub static RAILS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Rail, - Block::PoweredRail, - Block::DetectorRail, - Block::ActivatorRail, - ]) -}); -pub static PLANKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakPlanks, - Block::SprucePlanks, - Block::BirchPlanks, - Block::JunglePlanks, - Block::AcaciaPlanks, - Block::DarkOakPlanks, - Block::CrimsonPlanks, - Block::WarpedPlanks, - Block::MangrovePlanks, - Block::BambooPlanks, - Block::CherryPlanks, - ]) -}); -pub static COMBINATION_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::MossCarpet, - Block::Snow, - Block::NetherSprouts, - Block::WarpedRoots, - Block::CrimsonRoots, - Block::WhiteCarpet, - Block::OrangeCarpet, - Block::MagentaCarpet, - Block::LightBlueCarpet, - Block::YellowCarpet, - Block::LimeCarpet, - Block::PinkCarpet, - Block::GrayCarpet, - Block::LightGrayCarpet, - Block::CyanCarpet, - Block::PurpleCarpet, - Block::BlueCarpet, - Block::BrownCarpet, - Block::GreenCarpet, - Block::RedCarpet, - Block::BlackCarpet, - ]) -}); -pub static SCULK_REPLACEABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Sand, - Block::RedSand, - Block::Gravel, - Block::SoulSand, - Block::SoulSoil, - Block::Calcite, - Block::SmoothBasalt, - Block::Clay, - Block::DripstoneBlock, - Block::EndStone, - Block::RedSandstone, - Block::Sandstone, - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, - Block::Terracotta, - Block::WhiteTerracotta, - Block::OrangeTerracotta, - Block::MagentaTerracotta, - Block::LightBlueTerracotta, - Block::YellowTerracotta, - Block::LimeTerracotta, - Block::PinkTerracotta, - Block::GrayTerracotta, - Block::LightGrayTerracotta, - Block::CyanTerracotta, - Block::PurpleTerracotta, - Block::BlueTerracotta, - Block::BrownTerracotta, - Block::GreenTerracotta, - Block::RedTerracotta, - Block::BlackTerracotta, - Block::CrimsonNylium, - Block::WarpedNylium, - Block::Netherrack, - Block::Basalt, - Block::Blackstone, - ]) -}); -pub static BAMBOO_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::BambooBlock, Block::StrippedBambooBlock])); -pub static MOSS_REPLACEABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, - Block::CaveVinesPlant, - Block::CaveVines, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, - ]) -}); -pub static CANDLES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Candle, - Block::WhiteCandle, - Block::OrangeCandle, - Block::MagentaCandle, - Block::LightBlueCandle, - Block::YellowCandle, - Block::LimeCandle, - Block::PinkCandle, - Block::GrayCandle, - Block::LightGrayCandle, - Block::CyanCandle, - Block::PurpleCandle, - Block::BlueCandle, - Block::BrownCandle, - Block::GreenCandle, - Block::RedCandle, - Block::BlackCandle, - ]) -}); -pub static SPRUCE_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::SpruceLog, - Block::SpruceWood, - Block::StrippedSpruceLog, - Block::StrippedSpruceWood, - ]) -}); -pub static OCCLUDES_VIBRATION_SIGNALS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WhiteWool, - Block::OrangeWool, - Block::MagentaWool, - Block::LightBlueWool, - Block::YellowWool, - Block::LimeWool, - Block::PinkWool, - Block::GrayWool, - Block::LightGrayWool, - Block::CyanWool, - Block::PurpleWool, - Block::BlueWool, - Block::BrownWool, - Block::GreenWool, - Block::RedWool, - Block::BlackWool, - ]) -}); -pub static AZALEA_ROOT_REPLACEABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::RedSand, - Block::Clay, - Block::Gravel, - Block::Sand, - Block::SnowBlock, - Block::PowderSnow, - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, - Block::Terracotta, - Block::WhiteTerracotta, - Block::OrangeTerracotta, - Block::MagentaTerracotta, - Block::LightBlueTerracotta, - Block::YellowTerracotta, - Block::LimeTerracotta, - Block::PinkTerracotta, - Block::GrayTerracotta, - Block::LightGrayTerracotta, - Block::CyanTerracotta, - Block::PurpleTerracotta, - Block::BlueTerracotta, - Block::BrownTerracotta, - Block::GreenTerracotta, - Block::RedTerracotta, - Block::BlackTerracotta, - ]) -}); -pub static RABBITS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::GrassBlock, - Block::Snow, - Block::SnowBlock, - Block::Sand, - ]) -}); -pub static SAPLINGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakSapling, - Block::SpruceSapling, - Block::BirchSapling, - Block::JungleSapling, - Block::AcaciaSapling, - Block::DarkOakSapling, - Block::Azalea, - Block::FloweringAzalea, - Block::MangrovePropagule, - Block::CherrySapling, - ]) -}); -pub static LEAVES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::JungleLeaves, - Block::OakLeaves, - Block::SpruceLeaves, - Block::DarkOakLeaves, - Block::AcaciaLeaves, - Block::BirchLeaves, - Block::AzaleaLeaves, - Block::FloweringAzaleaLeaves, - Block::MangroveLeaves, - Block::CherryLeaves, - ]) -}); -pub static STONE_BUTTONS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::StoneButton, Block::PolishedBlackstoneButton])); -pub static REDSTONE_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::RedstoneOre, Block::DeepslateRedstoneOre])); -pub static CRIMSON_STEMS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::CrimsonStem, - Block::StrippedCrimsonStem, - Block::CrimsonHyphae, - Block::StrippedCrimsonHyphae, - ]) -}); -pub static FROGS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::GrassBlock, - Block::Mud, - Block::MangroveRoots, - Block::MuddyMangroveRoots, - ]) -}); -pub static MAINTAINS_FARMLAND: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::PumpkinStem, - Block::AttachedPumpkinStem, - Block::MelonStem, - Block::AttachedMelonStem, - Block::Beetroots, - Block::Carrots, - Block::Potatoes, - Block::TorchflowerCrop, - Block::Torchflower, - Block::PitcherCrop, - Block::Wheat, - ]) -}); -pub static CROPS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Beetroots, - Block::Carrots, - Block::Potatoes, - Block::Wheat, - Block::MelonStem, - Block::PumpkinStem, - Block::TorchflowerCrop, - Block::PitcherCrop, - ]) -}); -pub static WALLS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::CobblestoneWall, - Block::MossyCobblestoneWall, - Block::BrickWall, - Block::PrismarineWall, - Block::RedSandstoneWall, - Block::MossyStoneBrickWall, - Block::GraniteWall, - Block::StoneBrickWall, - Block::NetherBrickWall, - Block::AndesiteWall, - Block::RedNetherBrickWall, - Block::SandstoneWall, - Block::EndStoneBrickWall, - Block::DioriteWall, - Block::BlackstoneWall, - Block::PolishedBlackstoneBrickWall, - Block::PolishedBlackstoneWall, - Block::CobbledDeepslateWall, - Block::PolishedDeepslateWall, - Block::DeepslateTileWall, - Block::DeepslateBrickWall, - Block::MudBrickWall, - ]) -}); -pub static STONE_PRESSURE_PLATES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::StonePressurePlate, - Block::PolishedBlackstonePressurePlate, - ]) -}); -pub static VIBRATION_RESONATORS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::AmethystBlock])); diff --git a/azalea-registry/src/tags/fluids.rs b/azalea-registry/src/tags/fluids.rs index 4f177f95..c29c9eba 100644 --- a/azalea-registry/src/tags/fluids.rs +++ b/azalea-registry/src/tags/fluids.rs @@ -6,7 +6,7 @@ use once_cell::sync::Lazy; use crate::Fluid; -pub static LAVA: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Fluid::Lava, Fluid::FlowingLava])); pub static WATER: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Fluid::Water, Fluid::FlowingWater])); +pub static LAVA: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Fluid::Lava, Fluid::FlowingLava])); diff --git a/azalea-registry/src/tags/items.rs b/azalea-registry/src/tags/items.rs index 6d5d3755..71cf247c 100644 --- a/azalea-registry/src/tags/items.rs +++ b/azalea-registry/src/tags/items.rs @@ -6,67 +6,633 @@ use once_cell::sync::Lazy; use crate::Item; -pub static WOODEN_FENCES: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_FOOT_ARMOR: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakFence, - Item::AcaciaFence, - Item::DarkOakFence, - Item::SpruceFence, - Item::BirchFence, - Item::JungleFence, - Item::CrimsonFence, - Item::WarpedFence, - Item::MangroveFence, - Item::BambooFence, - Item::CherryFence, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, ]) }); -pub static ACACIA_LOGS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_LEG_ARMOR: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::AcaciaLog, - Item::AcaciaWood, - Item::StrippedAcaciaLog, - Item::StrippedAcaciaWood, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, ]) }); -pub static CREEPER_IGNITERS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::FlintAndSteel, Item::FireCharge])); -pub static WOODEN_SLABS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_CHEST_ARMOR: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakSlab, - Item::SpruceSlab, - Item::BirchSlab, - Item::JungleSlab, - Item::AcaciaSlab, - Item::DarkOakSlab, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + ]) +}); +pub static ENCHANTABLE_HEAD_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + ]) +}); +pub static ENCHANTABLE_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + ]) +}); +pub static ENCHANTABLE_SWORD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + ]) +}); +pub static ENCHANTABLE_FIRE_ASPECT: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + ]) +}); +pub static ENCHANTABLE_MINING: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Shears, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + Item::DiamondPickaxe, + Item::StonePickaxe, + Item::GoldenPickaxe, + Item::NetheritePickaxe, + Item::WoodenPickaxe, + Item::IronPickaxe, + Item::DiamondShovel, + Item::StoneShovel, + Item::GoldenShovel, + Item::NetheriteShovel, + Item::WoodenShovel, + Item::IronShovel, + Item::DiamondHoe, + Item::StoneHoe, + Item::GoldenHoe, + Item::NetheriteHoe, + Item::WoodenHoe, + Item::IronHoe, + ]) +}); +pub static ENCHANTABLE_FISHING: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::FishingRod])); +pub static ENCHANTABLE_SHARP_WEAPON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + ]) +}); +pub static ENCHANTABLE_WEAPON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + ]) +}); +pub static ENCHANTABLE_TRIDENT: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Trident])); +pub static ENCHANTABLE_DURABILITY: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Elytra, + Item::Shield, + Item::Bow, + Item::Crossbow, + Item::Trident, + Item::FlintAndSteel, + Item::Shears, + Item::Brush, + Item::FishingRod, + Item::CarrotOnAStick, + Item::WarpedFungusOnAStick, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + Item::DiamondPickaxe, + Item::StonePickaxe, + Item::GoldenPickaxe, + Item::NetheritePickaxe, + Item::WoodenPickaxe, + Item::IronPickaxe, + Item::DiamondShovel, + Item::StoneShovel, + Item::GoldenShovel, + Item::NetheriteShovel, + Item::WoodenShovel, + Item::IronShovel, + Item::DiamondHoe, + Item::StoneHoe, + Item::GoldenHoe, + Item::NetheriteHoe, + Item::WoodenHoe, + Item::IronHoe, + ]) +}); +pub static ENCHANTABLE_BOW: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Bow])); +pub static ENCHANTABLE_CROSSBOW: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Crossbow])); +pub static ENCHANTABLE_EQUIPPABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Elytra, + Item::CarvedPumpkin, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + Item::PlayerHead, + Item::CreeperHead, + Item::ZombieHead, + Item::SkeletonSkull, + Item::WitherSkeletonSkull, + Item::DragonHead, + Item::PiglinHead, + ]) +}); +pub static ENCHANTABLE_VANISHING: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Compass, + Item::CarvedPumpkin, + Item::Elytra, + Item::Shield, + Item::Bow, + Item::Crossbow, + Item::Trident, + Item::FlintAndSteel, + Item::Shears, + Item::Brush, + Item::FishingRod, + Item::CarrotOnAStick, + Item::WarpedFungusOnAStick, + Item::PlayerHead, + Item::CreeperHead, + Item::ZombieHead, + Item::SkeletonSkull, + Item::WitherSkeletonSkull, + Item::DragonHead, + Item::PiglinHead, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + Item::DiamondPickaxe, + Item::StonePickaxe, + Item::GoldenPickaxe, + Item::NetheritePickaxe, + Item::WoodenPickaxe, + Item::IronPickaxe, + Item::DiamondShovel, + Item::StoneShovel, + Item::GoldenShovel, + Item::NetheriteShovel, + Item::WoodenShovel, + Item::IronShovel, + Item::DiamondHoe, + Item::StoneHoe, + Item::GoldenHoe, + Item::NetheriteHoe, + Item::WoodenHoe, + Item::IronHoe, + ]) +}); +pub static ENCHANTABLE_MINING_LOOT: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + Item::DiamondPickaxe, + Item::StonePickaxe, + Item::GoldenPickaxe, + Item::NetheritePickaxe, + Item::WoodenPickaxe, + Item::IronPickaxe, + Item::DiamondShovel, + Item::StoneShovel, + Item::GoldenShovel, + Item::NetheriteShovel, + Item::WoodenShovel, + Item::IronShovel, + Item::DiamondHoe, + Item::StoneHoe, + Item::GoldenHoe, + Item::NetheriteHoe, + Item::WoodenHoe, + Item::IronHoe, + ]) +}); +pub static BANNERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WhiteBanner, + Item::OrangeBanner, + Item::MagentaBanner, + Item::LightBlueBanner, + Item::YellowBanner, + Item::LimeBanner, + Item::PinkBanner, + Item::GrayBanner, + Item::LightGrayBanner, + Item::CyanBanner, + Item::PurpleBanner, + Item::BlueBanner, + Item::BrownBanner, + Item::GreenBanner, + Item::RedBanner, + Item::BlackBanner, + ]) +}); +pub static FISHES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Cod, + Item::CookedCod, + Item::Salmon, + Item::CookedSalmon, + Item::Pufferfish, + Item::TropicalFish, + ]) +}); +pub static CHEST_BOATS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakChestBoat, + Item::SpruceChestBoat, + Item::BirchChestBoat, + Item::JungleChestBoat, + Item::AcaciaChestBoat, + Item::DarkOakChestBoat, + Item::MangroveChestBoat, + Item::BambooChestRaft, + Item::CherryChestBoat, + ]) +}); +pub static BOATS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakBoat, + Item::SpruceBoat, + Item::BirchBoat, + Item::JungleBoat, + Item::AcaciaBoat, + Item::DarkOakBoat, + Item::MangroveBoat, + Item::BambooRaft, + Item::CherryBoat, + Item::OakChestBoat, + Item::SpruceChestBoat, + Item::BirchChestBoat, + Item::JungleChestBoat, + Item::AcaciaChestBoat, + Item::DarkOakChestBoat, + Item::MangroveChestBoat, + Item::BambooChestRaft, + Item::CherryChestBoat, + ]) +}); +pub static CREEPER_DROP_MUSIC_DISCS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::MusicDisc13, + Item::MusicDiscCat, + Item::MusicDiscBlocks, + Item::MusicDiscChirp, + Item::MusicDiscFar, + Item::MusicDiscMall, + Item::MusicDiscMellohi, + Item::MusicDiscStal, + Item::MusicDiscStrad, + Item::MusicDiscWard, + Item::MusicDisc11, + Item::MusicDiscWait, + ]) +}); +pub static MUSIC_DISCS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::MusicDiscPigstep, + Item::MusicDiscOtherside, + Item::MusicDisc5, + Item::MusicDiscRelic, + Item::MusicDisc13, + Item::MusicDiscCat, + Item::MusicDiscBlocks, + Item::MusicDiscChirp, + Item::MusicDiscFar, + Item::MusicDiscMall, + Item::MusicDiscMellohi, + Item::MusicDiscStal, + Item::MusicDiscStrad, + Item::MusicDiscWard, + Item::MusicDisc11, + Item::MusicDiscWait, + ]) +}); +pub static COALS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Coal, Item::Charcoal])); +pub static ARROWS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Arrow, Item::TippedArrow, Item::SpectralArrow])); +pub static LECTERN_BOOKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::WrittenBook, Item::WritableBook])); +pub static BEACON_PAYMENT_ITEMS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::NetheriteIngot, + Item::Emerald, + Item::Diamond, + Item::GoldIngot, + Item::IronIngot, + ]) +}); +pub static PIGLIN_REPELLENTS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::SoulTorch, Item::SoulLantern, Item::SoulCampfire])); +pub static IGNORED_BY_PIGLIN_BABIES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Leather])); +pub static PIGLIN_LOVED: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::GoldBlock, + Item::GildedBlackstone, + Item::LightWeightedPressurePlate, + Item::GoldIngot, + Item::Bell, + Item::Clock, + Item::GoldenCarrot, + Item::GlisteringMelonSlice, + Item::GoldenApple, + Item::EnchantedGoldenApple, + Item::GoldenHelmet, + Item::GoldenChestplate, + Item::GoldenLeggings, + Item::GoldenBoots, + Item::GoldenHorseArmor, + Item::GoldenSword, + Item::GoldenPickaxe, + Item::GoldenShovel, + Item::GoldenAxe, + Item::GoldenHoe, + Item::RawGold, + Item::RawGoldBlock, + Item::GoldOre, + Item::NetherGoldOre, + Item::DeepslateGoldOre, + ]) +}); +pub static PIGLIN_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Porkchop, Item::CookedPorkchop])); +pub static FOX_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::SweetBerries, Item::GlowBerries])); +pub static STONE_TOOL_MATERIALS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Cobblestone, + Item::Blackstone, + Item::CobbledDeepslate, + ]) +}); +pub static NON_FLAMMABLE_WOOD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WarpedStem, + Item::StrippedWarpedStem, + Item::WarpedHyphae, + Item::StrippedWarpedHyphae, + Item::CrimsonStem, + Item::StrippedCrimsonStem, + Item::CrimsonHyphae, + Item::StrippedCrimsonHyphae, + Item::CrimsonPlanks, + Item::WarpedPlanks, Item::CrimsonSlab, Item::WarpedSlab, - Item::MangroveSlab, - Item::BambooSlab, - Item::CherrySlab, - ]) -}); -pub static WOODEN_STAIRS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakStairs, - Item::SpruceStairs, - Item::BirchStairs, - Item::JungleStairs, - Item::AcaciaStairs, - Item::DarkOakStairs, + Item::CrimsonPressurePlate, + Item::WarpedPressurePlate, + Item::CrimsonFence, + Item::WarpedFence, + Item::CrimsonTrapdoor, + Item::WarpedTrapdoor, + Item::CrimsonFenceGate, + Item::WarpedFenceGate, Item::CrimsonStairs, Item::WarpedStairs, - Item::MangroveStairs, - Item::BambooStairs, - Item::CherryStairs, + Item::CrimsonButton, + Item::WarpedButton, + Item::CrimsonDoor, + Item::WarpedDoor, + Item::CrimsonSign, + Item::WarpedSign, + Item::WarpedHangingSign, + Item::CrimsonHangingSign, ]) }); -pub static MANGROVE_LOGS: Lazy> = Lazy::new(|| { +pub static STONE_CRAFTING_MATERIALS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::MangroveLog, - Item::MangroveWood, - Item::StrippedMangroveLog, - Item::StrippedMangroveWood, + Item::Cobblestone, + Item::Blackstone, + Item::CobbledDeepslate, + ]) +}); +pub static FREEZE_IMMUNE_WEARABLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherBoots, + Item::LeatherLeggings, + Item::LeatherChestplate, + Item::LeatherHelmet, + Item::LeatherHorseArmor, + ]) +}); +pub static AXOLOTL_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::TropicalFishBucket])); +pub static CLUSTER_MAX_HARVESTABLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondPickaxe, + Item::GoldenPickaxe, + Item::IronPickaxe, + Item::NetheritePickaxe, + Item::StonePickaxe, + Item::WoodenPickaxe, + ]) +}); +pub static COMPASSES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Compass, Item::RecoveryCompass])); +pub static CREEPER_IGNITERS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::FlintAndSteel, Item::FireCharge])); +pub static SWORDS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + ]) +}); +pub static AXES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + ]) +}); +pub static PICKAXES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondPickaxe, + Item::StonePickaxe, + Item::GoldenPickaxe, + Item::NetheritePickaxe, + Item::WoodenPickaxe, + Item::IronPickaxe, ]) }); pub static SHOVELS: Lazy> = Lazy::new(|| { @@ -79,134 +645,14 @@ pub static SHOVELS: Lazy> = Lazy::new(|| { Item::IronShovel, ]) }); -pub static DARK_OAK_LOGS: Lazy> = Lazy::new(|| { +pub static HOES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::DarkOakLog, - Item::DarkOakWood, - Item::StrippedDarkOakLog, - Item::StrippedDarkOakWood, - ]) -}); -pub static EMERALD_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::EmeraldOre, Item::DeepslateEmeraldOre])); -pub static TALL_FLOWERS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Sunflower, - Item::Lilac, - Item::Peony, - Item::RoseBush, - Item::PitcherPlant, - ]) -}); -pub static DOORS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::IronDoor, - Item::OakDoor, - Item::SpruceDoor, - Item::BirchDoor, - Item::JungleDoor, - Item::AcaciaDoor, - Item::DarkOakDoor, - Item::CrimsonDoor, - Item::WarpedDoor, - Item::MangroveDoor, - Item::BambooDoor, - Item::CherryDoor, - ]) -}); -pub static BEDS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::RedBed, - Item::BlackBed, - Item::BlueBed, - Item::BrownBed, - Item::CyanBed, - Item::GrayBed, - Item::GreenBed, - Item::LightBlueBed, - Item::LightGrayBed, - Item::LimeBed, - Item::MagentaBed, - Item::OrangeBed, - Item::PinkBed, - Item::PurpleBed, - Item::WhiteBed, - Item::YellowBed, - ]) -}); -pub static COMPASSES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Compass, Item::RecoveryCompass])); -pub static DECORATED_POT_INGREDIENTS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Brick, - Item::AnglerPotterySherd, - Item::ArcherPotterySherd, - Item::ArmsUpPotterySherd, - Item::BladePotterySherd, - Item::BrewerPotterySherd, - Item::BurnPotterySherd, - Item::DangerPotterySherd, - Item::ExplorerPotterySherd, - Item::FriendPotterySherd, - Item::HeartPotterySherd, - Item::HeartbreakPotterySherd, - Item::HowlPotterySherd, - Item::MinerPotterySherd, - Item::MournerPotterySherd, - Item::PlentyPotterySherd, - Item::PrizePotterySherd, - Item::SheafPotterySherd, - Item::ShelterPotterySherd, - Item::SkullPotterySherd, - Item::SnortPotterySherd, - ]) -}); -pub static COPPER_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::CopperOre, Item::DeepslateCopperOre])); -pub static TRIM_TEMPLATES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::WardArmorTrimSmithingTemplate, - Item::SpireArmorTrimSmithingTemplate, - Item::CoastArmorTrimSmithingTemplate, - Item::EyeArmorTrimSmithingTemplate, - Item::DuneArmorTrimSmithingTemplate, - Item::WildArmorTrimSmithingTemplate, - Item::RibArmorTrimSmithingTemplate, - Item::TideArmorTrimSmithingTemplate, - Item::SentryArmorTrimSmithingTemplate, - Item::VexArmorTrimSmithingTemplate, - Item::SnoutArmorTrimSmithingTemplate, - Item::WayfinderArmorTrimSmithingTemplate, - Item::ShaperArmorTrimSmithingTemplate, - Item::SilenceArmorTrimSmithingTemplate, - Item::RaiserArmorTrimSmithingTemplate, - Item::HostArmorTrimSmithingTemplate, - ]) -}); -pub static WOODEN_PRESSURE_PLATES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakPressurePlate, - Item::SprucePressurePlate, - Item::BirchPressurePlate, - Item::JunglePressurePlate, - Item::AcaciaPressurePlate, - Item::DarkOakPressurePlate, - Item::CrimsonPressurePlate, - Item::WarpedPressurePlate, - Item::MangrovePressurePlate, - Item::BambooPressurePlate, - Item::CherryPressurePlate, - ]) -}); -pub static NOTEBLOCK_TOP_INSTRUMENTS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::ZombieHead, - Item::SkeletonSkull, - Item::CreeperHead, - Item::DragonHead, - Item::WitherSkeletonSkull, - Item::PiglinHead, - Item::PlayerHead, + Item::DiamondHoe, + Item::StoneHoe, + Item::GoldenHoe, + Item::NetheriteHoe, + Item::WoodenHoe, + Item::IronHoe, ]) }); pub static BREAKS_DECORATED_POTS: Lazy> = Lazy::new(|| { @@ -244,12 +690,702 @@ pub static BREAKS_DECORATED_POTS: Lazy> = Lazy::new(|| { Item::IronHoe, ]) }); -pub static SAND: Lazy> = Lazy::new(|| { +pub static DECORATED_POT_SHERDS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Sand, - Item::RedSand, - Item::SuspiciousSand, - Item::SuspiciousSand, + Item::AnglerPotterySherd, + Item::ArcherPotterySherd, + Item::ArmsUpPotterySherd, + Item::BladePotterySherd, + Item::BrewerPotterySherd, + Item::BurnPotterySherd, + Item::DangerPotterySherd, + Item::ExplorerPotterySherd, + Item::FriendPotterySherd, + Item::HeartPotterySherd, + Item::HeartbreakPotterySherd, + Item::HowlPotterySherd, + Item::MinerPotterySherd, + Item::MournerPotterySherd, + Item::PlentyPotterySherd, + Item::PrizePotterySherd, + Item::SheafPotterySherd, + Item::ShelterPotterySherd, + Item::SkullPotterySherd, + Item::SnortPotterySherd, + ]) +}); +pub static DECORATED_POT_INGREDIENTS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Brick, + Item::AnglerPotterySherd, + Item::ArcherPotterySherd, + Item::ArmsUpPotterySherd, + Item::BladePotterySherd, + Item::BrewerPotterySherd, + Item::BurnPotterySherd, + Item::DangerPotterySherd, + Item::ExplorerPotterySherd, + Item::FriendPotterySherd, + Item::HeartPotterySherd, + Item::HeartbreakPotterySherd, + Item::HowlPotterySherd, + Item::MinerPotterySherd, + Item::MournerPotterySherd, + Item::PlentyPotterySherd, + Item::PrizePotterySherd, + Item::SheafPotterySherd, + Item::ShelterPotterySherd, + Item::SkullPotterySherd, + Item::SnortPotterySherd, + ]) +}); +pub static FOOT_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + ]) +}); +pub static LEG_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + ]) +}); +pub static CHEST_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + ]) +}); +pub static HEAD_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + ]) +}); +pub static SKULLS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::PlayerHead, + Item::CreeperHead, + Item::ZombieHead, + Item::SkeletonSkull, + Item::WitherSkeletonSkull, + Item::DragonHead, + Item::PiglinHead, + ]) +}); +pub static TRIMMABLE_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + ]) +}); +pub static TRIM_MATERIALS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::IronIngot, + Item::CopperIngot, + Item::GoldIngot, + Item::LapisLazuli, + Item::Emerald, + Item::Diamond, + Item::NetheriteIngot, + Item::Redstone, + Item::Quartz, + Item::AmethystShard, + ]) +}); +pub static TRIM_TEMPLATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WardArmorTrimSmithingTemplate, + Item::SpireArmorTrimSmithingTemplate, + Item::CoastArmorTrimSmithingTemplate, + Item::EyeArmorTrimSmithingTemplate, + Item::DuneArmorTrimSmithingTemplate, + Item::WildArmorTrimSmithingTemplate, + Item::RibArmorTrimSmithingTemplate, + Item::TideArmorTrimSmithingTemplate, + Item::SentryArmorTrimSmithingTemplate, + Item::VexArmorTrimSmithingTemplate, + Item::SnoutArmorTrimSmithingTemplate, + Item::WayfinderArmorTrimSmithingTemplate, + Item::ShaperArmorTrimSmithingTemplate, + Item::SilenceArmorTrimSmithingTemplate, + Item::RaiserArmorTrimSmithingTemplate, + Item::HostArmorTrimSmithingTemplate, + ]) +}); +pub static BOOKSHELF_BOOKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Book, + Item::WrittenBook, + Item::EnchantedBook, + Item::WritableBook, + Item::KnowledgeBook, + ]) +}); +pub static NOTEBLOCK_TOP_INSTRUMENTS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::ZombieHead, + Item::SkeletonSkull, + Item::CreeperHead, + Item::DragonHead, + Item::WitherSkeletonSkull, + Item::PiglinHead, + Item::PlayerHead, + ]) +}); +pub static SNIFFER_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::TorchflowerSeeds])); +pub static VILLAGER_PLANTABLE_SEEDS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WheatSeeds, + Item::Potato, + Item::Carrot, + Item::BeetrootSeeds, + Item::TorchflowerSeeds, + Item::PitcherPod, + ]) +}); +pub static DYEABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherHelmet, + Item::LeatherChestplate, + Item::LeatherLeggings, + Item::LeatherBoots, + Item::LeatherHorseArmor, + Item::WolfArmor, + ]) +}); +pub static MEAT: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Beef, + Item::Chicken, + Item::CookedBeef, + Item::CookedChicken, + Item::CookedMutton, + Item::CookedPorkchop, + Item::CookedRabbit, + Item::Mutton, + Item::Porkchop, + Item::Rabbit, + Item::RottenFlesh, + ]) +}); +pub static CAMEL_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Cactus])); +pub static ARMADILLO_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::SpiderEye])); +pub static WOLF_FOOD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Beef, + Item::Chicken, + Item::CookedBeef, + Item::CookedChicken, + Item::CookedMutton, + Item::CookedPorkchop, + Item::CookedRabbit, + Item::Mutton, + Item::Porkchop, + Item::Rabbit, + Item::RottenFlesh, + ]) +}); +pub static LLAMA_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Wheat, Item::HayBlock])); +pub static OCELOT_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Cod, Item::Salmon])); +pub static LLAMA_TEMPT_ITEMS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::HayBlock])); +pub static PANDA_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Bamboo])); +pub static PIG_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Carrot, Item::Potato, Item::Beetroot])); +pub static RABBIT_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Carrot, Item::GoldenCarrot, Item::Dandelion])); +pub static STRIDER_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::WarpedFungus])); +pub static STRIDER_TEMPT_ITEMS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::WarpedFungusOnAStick, Item::WarpedFungus])); +pub static TURTLE_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Seagrass])); +pub static PARROT_FOOD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WheatSeeds, + Item::MelonSeeds, + Item::PumpkinSeeds, + Item::BeetrootSeeds, + Item::TorchflowerSeeds, + Item::PitcherPod, + ]) +}); +pub static PARROT_POISONOUS_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Cookie])); +pub static COW_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Wheat])); +pub static SHEEP_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Wheat])); +pub static GOAT_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Wheat])); +pub static FENCES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::NetherBrickFence, + Item::OakFence, + Item::AcaciaFence, + Item::DarkOakFence, + Item::SpruceFence, + Item::BirchFence, + Item::JungleFence, + Item::CrimsonFence, + Item::WarpedFence, + Item::MangroveFence, + Item::BambooFence, + Item::CherryFence, + ]) +}); +pub static CAT_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Cod, Item::Salmon])); +pub static LEAVES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::JungleLeaves, + Item::OakLeaves, + Item::SpruceLeaves, + Item::DarkOakLeaves, + Item::AcaciaLeaves, + Item::BirchLeaves, + Item::AzaleaLeaves, + Item::FloweringAzaleaLeaves, + Item::MangroveLeaves, + Item::CherryLeaves, + ]) +}); +pub static DIAMOND_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::DiamondOre, Item::DeepslateDiamondOre])); +pub static IRON_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::IronOre, Item::DeepslateIronOre])); +pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::JungleLeaves, + Item::OakLeaves, + Item::SpruceLeaves, + Item::DarkOakLeaves, + Item::AcaciaLeaves, + Item::BirchLeaves, + Item::AzaleaLeaves, + Item::FloweringAzaleaLeaves, + Item::MangroveLeaves, + Item::CherryLeaves, + Item::NetherWartBlock, + Item::WarpedWartBlock, + Item::CrimsonStem, + Item::StrippedCrimsonStem, + Item::CrimsonHyphae, + Item::StrippedCrimsonHyphae, + Item::WarpedStem, + Item::StrippedWarpedStem, + Item::WarpedHyphae, + Item::StrippedWarpedHyphae, + Item::DarkOakLog, + Item::DarkOakWood, + Item::StrippedDarkOakLog, + Item::StrippedDarkOakWood, + Item::OakLog, + Item::OakWood, + Item::StrippedOakLog, + Item::StrippedOakWood, + Item::AcaciaLog, + Item::AcaciaWood, + Item::StrippedAcaciaLog, + Item::StrippedAcaciaWood, + Item::BirchLog, + Item::BirchWood, + Item::StrippedBirchLog, + Item::StrippedBirchWood, + Item::JungleLog, + Item::JungleWood, + Item::StrippedJungleLog, + Item::StrippedJungleWood, + Item::SpruceLog, + Item::SpruceWood, + Item::StrippedSpruceLog, + Item::StrippedSpruceWood, + Item::MangroveLog, + Item::MangroveWood, + Item::StrippedMangroveLog, + Item::StrippedMangroveWood, + Item::CherryLog, + Item::CherryWood, + Item::StrippedCherryLog, + Item::StrippedCherryWood, + ]) +}); +pub static PLANKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakPlanks, + Item::SprucePlanks, + Item::BirchPlanks, + Item::JunglePlanks, + Item::AcaciaPlanks, + Item::DarkOakPlanks, + Item::CrimsonPlanks, + Item::WarpedPlanks, + Item::MangrovePlanks, + Item::BambooPlanks, + Item::CherryPlanks, + ]) +}); +pub static FLOWERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::FloweringAzaleaLeaves, + Item::FloweringAzalea, + Item::MangrovePropagule, + Item::CherryLeaves, + Item::PinkPetals, + Item::ChorusFlower, + Item::SporeBlossom, + Item::Dandelion, + Item::Poppy, + Item::BlueOrchid, + Item::Allium, + Item::AzureBluet, + Item::RedTulip, + Item::OrangeTulip, + Item::WhiteTulip, + Item::PinkTulip, + Item::OxeyeDaisy, + Item::Cornflower, + Item::LilyOfTheValley, + Item::WitherRose, + Item::Torchflower, + Item::Sunflower, + Item::Lilac, + Item::Peony, + Item::RoseBush, + Item::PitcherPlant, + ]) +}); +pub static TRAPDOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::IronTrapdoor, + Item::AcaciaTrapdoor, + Item::BirchTrapdoor, + Item::DarkOakTrapdoor, + Item::JungleTrapdoor, + Item::OakTrapdoor, + Item::SpruceTrapdoor, + Item::CrimsonTrapdoor, + Item::WarpedTrapdoor, + Item::MangroveTrapdoor, + Item::BambooTrapdoor, + Item::CherryTrapdoor, + ]) +}); +pub static CHERRY_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::CherryLog, + Item::CherryWood, + Item::StrippedCherryLog, + Item::StrippedCherryWood, + ]) +}); +pub static STONE_BUTTONS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::StoneButton, Item::PolishedBlackstoneButton])); +pub static BUTTONS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakButton, + Item::SpruceButton, + Item::BirchButton, + Item::JungleButton, + Item::AcaciaButton, + Item::DarkOakButton, + Item::CrimsonButton, + Item::WarpedButton, + Item::MangroveButton, + Item::BambooButton, + Item::CherryButton, + Item::StoneButton, + Item::PolishedBlackstoneButton, + ]) +}); +pub static HORSE_FOOD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Wheat, + Item::Sugar, + Item::HayBlock, + Item::Apple, + Item::GoldenCarrot, + Item::GoldenApple, + Item::EnchantedGoldenApple, + ]) +}); +pub static TERRACOTTA: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Terracotta, + Item::WhiteTerracotta, + Item::OrangeTerracotta, + Item::MagentaTerracotta, + Item::LightBlueTerracotta, + Item::YellowTerracotta, + Item::LimeTerracotta, + Item::PinkTerracotta, + Item::GrayTerracotta, + Item::LightGrayTerracotta, + Item::CyanTerracotta, + Item::PurpleTerracotta, + Item::BlueTerracotta, + Item::BrownTerracotta, + Item::GreenTerracotta, + Item::RedTerracotta, + Item::BlackTerracotta, + ]) +}); +pub static STAIRS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::BambooMosaicStairs, + Item::CobblestoneStairs, + Item::SandstoneStairs, + Item::NetherBrickStairs, + Item::StoneBrickStairs, + Item::BrickStairs, + Item::PurpurStairs, + Item::QuartzStairs, + Item::RedSandstoneStairs, + Item::PrismarineBrickStairs, + Item::PrismarineStairs, + Item::DarkPrismarineStairs, + Item::PolishedGraniteStairs, + Item::SmoothRedSandstoneStairs, + Item::MossyStoneBrickStairs, + Item::PolishedDioriteStairs, + Item::MossyCobblestoneStairs, + Item::EndStoneBrickStairs, + Item::StoneStairs, + Item::SmoothSandstoneStairs, + Item::SmoothQuartzStairs, + Item::GraniteStairs, + Item::AndesiteStairs, + Item::RedNetherBrickStairs, + Item::PolishedAndesiteStairs, + Item::DioriteStairs, + Item::BlackstoneStairs, + Item::PolishedBlackstoneBrickStairs, + Item::PolishedBlackstoneStairs, + Item::CobbledDeepslateStairs, + Item::PolishedDeepslateStairs, + Item::DeepslateTileStairs, + Item::DeepslateBrickStairs, + Item::OxidizedCutCopperStairs, + Item::WeatheredCutCopperStairs, + Item::ExposedCutCopperStairs, + Item::CutCopperStairs, + Item::WaxedWeatheredCutCopperStairs, + Item::WaxedExposedCutCopperStairs, + Item::WaxedCutCopperStairs, + Item::WaxedOxidizedCutCopperStairs, + Item::MudBrickStairs, + Item::OakStairs, + Item::SpruceStairs, + Item::BirchStairs, + Item::JungleStairs, + Item::AcaciaStairs, + Item::DarkOakStairs, + Item::CrimsonStairs, + Item::WarpedStairs, + Item::MangroveStairs, + Item::BambooStairs, + Item::CherryStairs, + ]) +}); +pub static REDSTONE_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::RedstoneOre, Item::DeepslateRedstoneOre])); +pub static SPRUCE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::SpruceLog, + Item::SpruceWood, + Item::StrippedSpruceLog, + Item::StrippedSpruceWood, + ]) +}); +pub static HORSE_TEMPT_ITEMS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::GoldenCarrot, + Item::GoldenApple, + Item::EnchantedGoldenApple, + ]) +}); +pub static LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::CrimsonStem, + Item::StrippedCrimsonStem, + Item::CrimsonHyphae, + Item::StrippedCrimsonHyphae, + Item::WarpedStem, + Item::StrippedWarpedStem, + Item::WarpedHyphae, + Item::StrippedWarpedHyphae, + Item::DarkOakLog, + Item::DarkOakWood, + Item::StrippedDarkOakLog, + Item::StrippedDarkOakWood, + Item::OakLog, + Item::OakWood, + Item::StrippedOakLog, + Item::StrippedOakWood, + Item::AcaciaLog, + Item::AcaciaWood, + Item::StrippedAcaciaLog, + Item::StrippedAcaciaWood, + Item::BirchLog, + Item::BirchWood, + Item::StrippedBirchLog, + Item::StrippedBirchWood, + Item::JungleLog, + Item::JungleWood, + Item::StrippedJungleLog, + Item::StrippedJungleWood, + Item::SpruceLog, + Item::SpruceWood, + Item::StrippedSpruceLog, + Item::StrippedSpruceWood, + Item::MangroveLog, + Item::MangroveWood, + Item::StrippedMangroveLog, + Item::StrippedMangroveWood, + Item::CherryLog, + Item::CherryWood, + Item::StrippedCherryLog, + Item::StrippedCherryWood, + ]) +}); +pub static WALLS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::CobblestoneWall, + Item::MossyCobblestoneWall, + Item::BrickWall, + Item::PrismarineWall, + Item::RedSandstoneWall, + Item::MossyStoneBrickWall, + Item::GraniteWall, + Item::StoneBrickWall, + Item::NetherBrickWall, + Item::AndesiteWall, + Item::RedNetherBrickWall, + Item::SandstoneWall, + Item::EndStoneBrickWall, + Item::DioriteWall, + Item::BlackstoneWall, + Item::PolishedBlackstoneBrickWall, + Item::PolishedBlackstoneWall, + Item::CobbledDeepslateWall, + Item::PolishedDeepslateWall, + Item::DeepslateTileWall, + Item::DeepslateBrickWall, + Item::MudBrickWall, + ]) +}); +pub static OAK_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakLog, + Item::OakWood, + Item::StrippedOakLog, + Item::StrippedOakWood, + ]) +}); +pub static TALL_FLOWERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Sunflower, + Item::Lilac, + Item::Peony, + Item::RoseBush, + Item::PitcherPlant, + ]) +}); +pub static DARK_OAK_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DarkOakLog, + Item::DarkOakWood, + Item::StrippedDarkOakLog, + Item::StrippedDarkOakWood, + ]) +}); +pub static HANGING_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakHangingSign, + Item::SpruceHangingSign, + Item::BirchHangingSign, + Item::AcaciaHangingSign, + Item::CherryHangingSign, + Item::JungleHangingSign, + Item::DarkOakHangingSign, + Item::CrimsonHangingSign, + Item::WarpedHangingSign, + Item::MangroveHangingSign, + Item::BambooHangingSign, + ]) +}); +pub static CANDLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Candle, + Item::WhiteCandle, + Item::OrangeCandle, + Item::MagentaCandle, + Item::LightBlueCandle, + Item::YellowCandle, + Item::LimeCandle, + Item::PinkCandle, + Item::GrayCandle, + Item::LightGrayCandle, + Item::CyanCandle, + Item::PurpleCandle, + Item::BlueCandle, + Item::BrownCandle, + Item::GreenCandle, + Item::RedCandle, + Item::BlackCandle, + ]) +}); +pub static BAMBOO_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::BambooBlock, Item::StrippedBambooBlock])); +pub static CRIMSON_STEMS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::CrimsonStem, + Item::StrippedCrimsonStem, + Item::CrimsonHyphae, + Item::StrippedCrimsonHyphae, ]) }); pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { @@ -288,12 +1424,180 @@ pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { Item::StrippedCherryWood, ]) }); -pub static CHERRY_LOGS: Lazy> = Lazy::new(|| { +pub static SAPLINGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::CherryLog, - Item::CherryWood, - Item::StrippedCherryLog, - Item::StrippedCherryWood, + Item::OakSapling, + Item::SpruceSapling, + Item::BirchSapling, + Item::JungleSapling, + Item::AcaciaSapling, + Item::DarkOakSapling, + Item::Azalea, + Item::FloweringAzalea, + Item::MangrovePropagule, + Item::CherrySapling, + ]) +}); +pub static COPPER_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::CopperOre, Item::DeepslateCopperOre])); +pub static BIRCH_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::BirchLog, + Item::BirchWood, + Item::StrippedBirchLog, + Item::StrippedBirchWood, + ]) +}); +pub static BEDS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::RedBed, + Item::BlackBed, + Item::BlueBed, + Item::BrownBed, + Item::CyanBed, + Item::GrayBed, + Item::GreenBed, + Item::LightBlueBed, + Item::LightGrayBed, + Item::LimeBed, + Item::MagentaBed, + Item::OrangeBed, + Item::PinkBed, + Item::PurpleBed, + Item::WhiteBed, + Item::YellowBed, + ]) +}); +pub static DOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::IronDoor, + Item::OakDoor, + Item::SpruceDoor, + Item::BirchDoor, + Item::JungleDoor, + Item::AcaciaDoor, + Item::DarkOakDoor, + Item::CrimsonDoor, + Item::WarpedDoor, + Item::MangroveDoor, + Item::BambooDoor, + Item::CherryDoor, + ]) +}); +pub static WOODEN_TRAPDOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::AcaciaTrapdoor, + Item::BirchTrapdoor, + Item::DarkOakTrapdoor, + Item::JungleTrapdoor, + Item::OakTrapdoor, + Item::SpruceTrapdoor, + Item::CrimsonTrapdoor, + Item::WarpedTrapdoor, + Item::MangroveTrapdoor, + Item::BambooTrapdoor, + Item::CherryTrapdoor, + ]) +}); +pub static SMALL_FLOWERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Dandelion, + Item::Poppy, + Item::BlueOrchid, + Item::Allium, + Item::AzureBluet, + Item::RedTulip, + Item::OrangeTulip, + Item::WhiteTulip, + Item::PinkTulip, + Item::OxeyeDaisy, + Item::Cornflower, + Item::LilyOfTheValley, + Item::WitherRose, + Item::Torchflower, + ]) +}); +pub static SAND: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Sand, + Item::RedSand, + Item::SuspiciousSand, + Item::SuspiciousSand, + ]) +}); +pub static WOODEN_STAIRS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakStairs, + Item::SpruceStairs, + Item::BirchStairs, + Item::JungleStairs, + Item::AcaciaStairs, + Item::DarkOakStairs, + Item::CrimsonStairs, + Item::WarpedStairs, + Item::MangroveStairs, + Item::BambooStairs, + Item::CherryStairs, + ]) +}); +pub static WOODEN_SLABS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakSlab, + Item::SpruceSlab, + Item::BirchSlab, + Item::JungleSlab, + Item::AcaciaSlab, + Item::DarkOakSlab, + Item::CrimsonSlab, + Item::WarpedSlab, + Item::MangroveSlab, + Item::BambooSlab, + Item::CherrySlab, + ]) +}); +pub static DIRT: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Dirt, + Item::GrassBlock, + Item::Podzol, + Item::CoarseDirt, + Item::Mycelium, + Item::RootedDirt, + Item::MossBlock, + Item::Mud, + Item::MuddyMangroveRoots, + ]) +}); +pub static SMELTS_TO_GLASS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Sand, Item::RedSand])); +pub static STONE_BRICKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::StoneBricks, + Item::MossyStoneBricks, + Item::CrackedStoneBricks, + Item::ChiseledStoneBricks, + ]) +}); +pub static ANVIL: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Anvil, Item::ChippedAnvil, Item::DamagedAnvil])); +pub static SOUL_FIRE_BASE_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::SoulSand, Item::SoulSoil])); +pub static ACACIA_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::AcaciaLog, + Item::AcaciaWood, + Item::StrippedAcaciaLog, + Item::StrippedAcaciaWood, + ]) +}); +pub static LAPIS_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::LapisOre, Item::DeepslateLapisOre])); +pub static MANGROVE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::MangroveLog, + Item::MangroveWood, + Item::StrippedMangroveLog, + Item::StrippedMangroveWood, ]) }); pub static DAMPENS_VIBRATIONS: Lazy> = Lazy::new(|| { @@ -332,8 +1636,59 @@ pub static DAMPENS_VIBRATIONS: Lazy> = Lazy::new(|| { Item::BlackCarpet, ]) }); -pub static DIAMOND_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::DiamondOre, Item::DeepslateDiamondOre])); +pub static JUNGLE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::JungleLog, + Item::JungleWood, + Item::StrippedJungleLog, + Item::StrippedJungleWood, + ]) +}); +pub static WOODEN_PRESSURE_PLATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakPressurePlate, + Item::SprucePressurePlate, + Item::BirchPressurePlate, + Item::JunglePressurePlate, + Item::AcaciaPressurePlate, + Item::DarkOakPressurePlate, + Item::CrimsonPressurePlate, + Item::WarpedPressurePlate, + Item::MangrovePressurePlate, + Item::BambooPressurePlate, + Item::CherryPressurePlate, + ]) +}); +pub static WOOL_CARPETS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WhiteCarpet, + Item::OrangeCarpet, + Item::MagentaCarpet, + Item::LightBlueCarpet, + Item::YellowCarpet, + Item::LimeCarpet, + Item::PinkCarpet, + Item::GrayCarpet, + Item::LightGrayCarpet, + Item::CyanCarpet, + Item::PurpleCarpet, + Item::BlueCarpet, + Item::BrownCarpet, + Item::GreenCarpet, + Item::RedCarpet, + Item::BlackCarpet, + ]) +}); +pub static RAILS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Rail, + Item::PoweredRail, + Item::DetectorRail, + Item::ActivatorRail, + ]) +}); +pub static COAL_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::CoalOre, Item::DeepslateCoalOre])); pub static WOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Item::WhiteWool, @@ -354,118 +1709,76 @@ pub static WOOL: Lazy> = Lazy::new(|| { Item::BlackWool, ]) }); -pub static WOODEN_TRAPDOORS: Lazy> = Lazy::new(|| { +pub static WART_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::NetherWartBlock, Item::WarpedWartBlock])); +pub static WOODEN_BUTTONS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::AcaciaTrapdoor, - Item::BirchTrapdoor, - Item::DarkOakTrapdoor, - Item::JungleTrapdoor, - Item::OakTrapdoor, - Item::SpruceTrapdoor, - Item::CrimsonTrapdoor, - Item::WarpedTrapdoor, - Item::MangroveTrapdoor, - Item::BambooTrapdoor, - Item::CherryTrapdoor, + Item::OakButton, + Item::SpruceButton, + Item::BirchButton, + Item::JungleButton, + Item::AcaciaButton, + Item::DarkOakButton, + Item::CrimsonButton, + Item::WarpedButton, + Item::MangroveButton, + Item::BambooButton, + Item::CherryButton, ]) }); -pub static FLOWERS: Lazy> = Lazy::new(|| { +pub static WOODEN_FENCES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::FloweringAzaleaLeaves, - Item::FloweringAzalea, - Item::MangrovePropagule, - Item::CherryLeaves, - Item::PinkPetals, - Item::ChorusFlower, - Item::SporeBlossom, - Item::Dandelion, - Item::Poppy, - Item::BlueOrchid, - Item::Allium, - Item::AzureBluet, - Item::RedTulip, - Item::OrangeTulip, - Item::WhiteTulip, - Item::PinkTulip, - Item::OxeyeDaisy, - Item::Cornflower, - Item::LilyOfTheValley, - Item::WitherRose, - Item::Torchflower, - Item::Sunflower, - Item::Lilac, - Item::Peony, - Item::RoseBush, - Item::PitcherPlant, + Item::OakFence, + Item::AcaciaFence, + Item::DarkOakFence, + Item::SpruceFence, + Item::BirchFence, + Item::JungleFence, + Item::CrimsonFence, + Item::WarpedFence, + Item::MangroveFence, + Item::BambooFence, + Item::CherryFence, ]) }); -pub static BANNERS: Lazy> = Lazy::new(|| { +pub static EMERALD_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::EmeraldOre, Item::DeepslateEmeraldOre])); +pub static WOODEN_DOORS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::WhiteBanner, - Item::OrangeBanner, - Item::MagentaBanner, - Item::LightBlueBanner, - Item::YellowBanner, - Item::LimeBanner, - Item::PinkBanner, - Item::GrayBanner, - Item::LightGrayBanner, - Item::CyanBanner, - Item::PurpleBanner, - Item::BlueBanner, - Item::BrownBanner, - Item::GreenBanner, - Item::RedBanner, - Item::BlackBanner, + Item::OakDoor, + Item::SpruceDoor, + Item::BirchDoor, + Item::JungleDoor, + Item::AcaciaDoor, + Item::DarkOakDoor, + Item::CrimsonDoor, + Item::WarpedDoor, + Item::MangroveDoor, + Item::BambooDoor, + Item::CherryDoor, ]) }); -pub static TERRACOTTA: Lazy> = Lazy::new(|| { +pub static WARPED_STEMS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Terracotta, - Item::WhiteTerracotta, - Item::OrangeTerracotta, - Item::MagentaTerracotta, - Item::LightBlueTerracotta, - Item::YellowTerracotta, - Item::LimeTerracotta, - Item::PinkTerracotta, - Item::GrayTerracotta, - Item::LightGrayTerracotta, - Item::CyanTerracotta, - Item::PurpleTerracotta, - Item::BlueTerracotta, - Item::BrownTerracotta, - Item::GreenTerracotta, - Item::RedTerracotta, - Item::BlackTerracotta, + Item::WarpedStem, + Item::StrippedWarpedStem, + Item::WarpedHyphae, + Item::StrippedWarpedHyphae, ]) }); -pub static COALS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Coal, Item::Charcoal])); -pub static BIRCH_LOGS: Lazy> = Lazy::new(|| { +pub static SIGNS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::BirchLog, - Item::BirchWood, - Item::StrippedBirchLog, - Item::StrippedBirchWood, - ]) -}); -pub static PIGLIN_REPELLENTS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::SoulTorch, Item::SoulLantern, Item::SoulCampfire])); -pub static CREEPER_DROP_MUSIC_DISCS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::MusicDisc13, - Item::MusicDiscCat, - Item::MusicDiscBlocks, - Item::MusicDiscChirp, - Item::MusicDiscFar, - Item::MusicDiscMall, - Item::MusicDiscMellohi, - Item::MusicDiscStal, - Item::MusicDiscStrad, - Item::MusicDiscWard, - Item::MusicDisc11, - Item::MusicDiscWait, + Item::OakSign, + Item::SpruceSign, + Item::BirchSign, + Item::AcaciaSign, + Item::JungleSign, + Item::DarkOakSign, + Item::CrimsonSign, + Item::WarpedSign, + Item::MangroveSign, + Item::BambooSign, + Item::CherrySign, ]) }); pub static SLABS: Lazy> = Lazy::new(|| { @@ -529,322 +1842,25 @@ pub static SLABS: Lazy> = Lazy::new(|| { Item::CherrySlab, ]) }); -pub static ANVIL: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Anvil, Item::ChippedAnvil, Item::DamagedAnvil])); -pub static STAIRS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::BambooMosaicStairs, - Item::CobblestoneStairs, - Item::SandstoneStairs, - Item::NetherBrickStairs, - Item::StoneBrickStairs, - Item::BrickStairs, - Item::PurpurStairs, - Item::QuartzStairs, - Item::RedSandstoneStairs, - Item::PrismarineBrickStairs, - Item::PrismarineStairs, - Item::DarkPrismarineStairs, - Item::PolishedGraniteStairs, - Item::SmoothRedSandstoneStairs, - Item::MossyStoneBrickStairs, - Item::PolishedDioriteStairs, - Item::MossyCobblestoneStairs, - Item::EndStoneBrickStairs, - Item::StoneStairs, - Item::SmoothSandstoneStairs, - Item::SmoothQuartzStairs, - Item::GraniteStairs, - Item::AndesiteStairs, - Item::RedNetherBrickStairs, - Item::PolishedAndesiteStairs, - Item::DioriteStairs, - Item::BlackstoneStairs, - Item::PolishedBlackstoneBrickStairs, - Item::PolishedBlackstoneStairs, - Item::CobbledDeepslateStairs, - Item::PolishedDeepslateStairs, - Item::DeepslateTileStairs, - Item::DeepslateBrickStairs, - Item::OxidizedCutCopperStairs, - Item::WeatheredCutCopperStairs, - Item::ExposedCutCopperStairs, - Item::CutCopperStairs, - Item::WaxedWeatheredCutCopperStairs, - Item::WaxedExposedCutCopperStairs, - Item::WaxedCutCopperStairs, - Item::WaxedOxidizedCutCopperStairs, - Item::MudBrickStairs, - Item::OakStairs, - Item::SpruceStairs, - Item::BirchStairs, - Item::JungleStairs, - Item::AcaciaStairs, - Item::DarkOakStairs, - Item::CrimsonStairs, - Item::WarpedStairs, - Item::MangroveStairs, - Item::BambooStairs, - Item::CherryStairs, - ]) -}); -pub static STONE_CRAFTING_MATERIALS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Cobblestone, - Item::Blackstone, - Item::CobbledDeepslate, - ]) -}); -pub static FISHES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Cod, - Item::CookedCod, - Item::Salmon, - Item::CookedSalmon, - Item::Pufferfish, - Item::TropicalFish, - ]) -}); -pub static SOUL_FIRE_BASE_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::SoulSand, Item::SoulSoil])); -pub static AXOLOTL_TEMPT_ITEMS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::TropicalFishBucket])); -pub static WOOL_CARPETS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::WhiteCarpet, - Item::OrangeCarpet, - Item::MagentaCarpet, - Item::LightBlueCarpet, - Item::YellowCarpet, - Item::LimeCarpet, - Item::PinkCarpet, - Item::GrayCarpet, - Item::LightGrayCarpet, - Item::CyanCarpet, - Item::PurpleCarpet, - Item::BlueCarpet, - Item::BrownCarpet, - Item::GreenCarpet, - Item::RedCarpet, - Item::BlackCarpet, - ]) -}); -pub static VILLAGER_PLANTABLE_SEEDS: Lazy> = Lazy::new(|| { +pub static CHICKEN_FOOD: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Item::WheatSeeds, - Item::Potato, - Item::Carrot, + Item::MelonSeeds, + Item::PumpkinSeeds, Item::BeetrootSeeds, Item::TorchflowerSeeds, Item::PitcherPod, ]) }); -pub static WOODEN_DOORS: Lazy> = Lazy::new(|| { +pub static BEE_FOOD: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakDoor, - Item::SpruceDoor, - Item::BirchDoor, - Item::JungleDoor, - Item::AcaciaDoor, - Item::DarkOakDoor, - Item::CrimsonDoor, - Item::WarpedDoor, - Item::MangroveDoor, - Item::BambooDoor, - Item::CherryDoor, - ]) -}); -pub static COAL_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::CoalOre, Item::DeepslateCoalOre])); -pub static TOOLS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Trident, - Item::DiamondSword, - Item::StoneSword, - Item::GoldenSword, - Item::NetheriteSword, - Item::WoodenSword, - Item::IronSword, - Item::DiamondAxe, - Item::StoneAxe, - Item::GoldenAxe, - Item::NetheriteAxe, - Item::WoodenAxe, - Item::IronAxe, - Item::DiamondPickaxe, - Item::StonePickaxe, - Item::GoldenPickaxe, - Item::NetheritePickaxe, - Item::WoodenPickaxe, - Item::IronPickaxe, - Item::DiamondShovel, - Item::StoneShovel, - Item::GoldenShovel, - Item::NetheriteShovel, - Item::WoodenShovel, - Item::IronShovel, - Item::DiamondHoe, - Item::StoneHoe, - Item::GoldenHoe, - Item::NetheriteHoe, - Item::WoodenHoe, - Item::IronHoe, - ]) -}); -pub static BUTTONS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakButton, - Item::SpruceButton, - Item::BirchButton, - Item::JungleButton, - Item::AcaciaButton, - Item::DarkOakButton, - Item::CrimsonButton, - Item::WarpedButton, - Item::MangroveButton, - Item::BambooButton, - Item::CherryButton, - Item::StoneButton, - Item::PolishedBlackstoneButton, - ]) -}); -pub static GOLD_ORES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::GoldOre, - Item::NetherGoldOre, - Item::DeepslateGoldOre, - ]) -}); -pub static WART_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::NetherWartBlock, Item::WarpedWartBlock])); -pub static NON_FLAMMABLE_WOOD: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::WarpedStem, - Item::StrippedWarpedStem, - Item::WarpedHyphae, - Item::StrippedWarpedHyphae, - Item::CrimsonStem, - Item::StrippedCrimsonStem, - Item::CrimsonHyphae, - Item::StrippedCrimsonHyphae, - Item::CrimsonPlanks, - Item::WarpedPlanks, - Item::CrimsonSlab, - Item::WarpedSlab, - Item::CrimsonPressurePlate, - Item::WarpedPressurePlate, - Item::CrimsonFence, - Item::WarpedFence, - Item::CrimsonTrapdoor, - Item::WarpedTrapdoor, - Item::CrimsonFenceGate, - Item::WarpedFenceGate, - Item::CrimsonStairs, - Item::WarpedStairs, - Item::CrimsonButton, - Item::WarpedButton, - Item::CrimsonDoor, - Item::WarpedDoor, - Item::CrimsonSign, - Item::WarpedSign, - Item::WarpedHangingSign, - Item::CrimsonHangingSign, - ]) -}); -pub static PICKAXES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::DiamondPickaxe, - Item::StonePickaxe, - Item::GoldenPickaxe, - Item::NetheritePickaxe, - Item::WoodenPickaxe, - Item::IronPickaxe, - ]) -}); -pub static HOES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::DiamondHoe, - Item::StoneHoe, - Item::GoldenHoe, - Item::NetheriteHoe, - Item::WoodenHoe, - Item::IronHoe, - ]) -}); -pub static FENCES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::NetherBrickFence, - Item::OakFence, - Item::AcaciaFence, - Item::DarkOakFence, - Item::SpruceFence, - Item::BirchFence, - Item::JungleFence, - Item::CrimsonFence, - Item::WarpedFence, - Item::MangroveFence, - Item::BambooFence, - Item::CherryFence, - ]) -}); -pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::JungleLeaves, - Item::OakLeaves, - Item::SpruceLeaves, - Item::DarkOakLeaves, - Item::AcaciaLeaves, - Item::BirchLeaves, - Item::AzaleaLeaves, Item::FloweringAzaleaLeaves, - Item::MangroveLeaves, + Item::FloweringAzalea, + Item::MangrovePropagule, Item::CherryLeaves, - Item::NetherWartBlock, - Item::WarpedWartBlock, - Item::CrimsonStem, - Item::StrippedCrimsonStem, - Item::CrimsonHyphae, - Item::StrippedCrimsonHyphae, - Item::WarpedStem, - Item::StrippedWarpedStem, - Item::WarpedHyphae, - Item::StrippedWarpedHyphae, - Item::DarkOakLog, - Item::DarkOakWood, - Item::StrippedDarkOakLog, - Item::StrippedDarkOakWood, - Item::OakLog, - Item::OakWood, - Item::StrippedOakLog, - Item::StrippedOakWood, - Item::AcaciaLog, - Item::AcaciaWood, - Item::StrippedAcaciaLog, - Item::StrippedAcaciaWood, - Item::BirchLog, - Item::BirchWood, - Item::StrippedBirchLog, - Item::StrippedBirchWood, - Item::JungleLog, - Item::JungleWood, - Item::StrippedJungleLog, - Item::StrippedJungleWood, - Item::SpruceLog, - Item::SpruceWood, - Item::StrippedSpruceLog, - Item::StrippedSpruceWood, - Item::MangroveLog, - Item::MangroveWood, - Item::StrippedMangroveLog, - Item::StrippedMangroveWood, - Item::CherryLog, - Item::CherryWood, - Item::StrippedCherryLog, - Item::StrippedCherryWood, - ]) -}); -pub static SMALL_FLOWERS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ + Item::PinkPetals, + Item::ChorusFlower, + Item::SporeBlossom, Item::Dandelion, Item::Poppy, Item::BlueOrchid, @@ -859,10 +1875,23 @@ pub static SMALL_FLOWERS: Lazy> = Lazy::new(|| { Item::LilyOfTheValley, Item::WitherRose, Item::Torchflower, + Item::Sunflower, + Item::Lilac, + Item::Peony, + Item::RoseBush, + Item::PitcherPlant, ]) }); -pub static PIGLIN_FOOD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Porkchop, Item::CookedPorkchop])); +pub static GOLD_ORES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::GoldOre, + Item::NetherGoldOre, + Item::DeepslateGoldOre, + ]) +}); +pub static FROG_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::SlimeBall])); +pub static HOGLIN_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::CrimsonFungus])); pub static FENCE_GATES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Item::AcaciaFenceGate, @@ -878,504 +1907,3 @@ pub static FENCE_GATES: Lazy> = Lazy::new(|| { Item::CherryFenceGate, ]) }); -pub static OAK_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakLog, - Item::OakWood, - Item::StrippedOakLog, - Item::StrippedOakWood, - ]) -}); -pub static TRIM_MATERIALS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::IronIngot, - Item::CopperIngot, - Item::GoldIngot, - Item::LapisLazuli, - Item::Emerald, - Item::Diamond, - Item::NetheriteIngot, - Item::Redstone, - Item::Quartz, - Item::AmethystShard, - ]) -}); -pub static STONE_BRICKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::StoneBricks, - Item::MossyStoneBricks, - Item::CrackedStoneBricks, - Item::ChiseledStoneBricks, - ]) -}); -pub static STONE_TOOL_MATERIALS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Cobblestone, - Item::Blackstone, - Item::CobbledDeepslate, - ]) -}); -pub static LAPIS_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::LapisOre, Item::DeepslateLapisOre])); -pub static SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakSign, - Item::SpruceSign, - Item::BirchSign, - Item::AcaciaSign, - Item::JungleSign, - Item::DarkOakSign, - Item::CrimsonSign, - Item::WarpedSign, - Item::MangroveSign, - Item::BambooSign, - Item::CherrySign, - ]) -}); -pub static DIRT: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Dirt, - Item::GrassBlock, - Item::Podzol, - Item::CoarseDirt, - Item::Mycelium, - Item::RootedDirt, - Item::MossBlock, - Item::Mud, - Item::MuddyMangroveRoots, - ]) -}); -pub static LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::CrimsonStem, - Item::StrippedCrimsonStem, - Item::CrimsonHyphae, - Item::StrippedCrimsonHyphae, - Item::WarpedStem, - Item::StrippedWarpedStem, - Item::WarpedHyphae, - Item::StrippedWarpedHyphae, - Item::DarkOakLog, - Item::DarkOakWood, - Item::StrippedDarkOakLog, - Item::StrippedDarkOakWood, - Item::OakLog, - Item::OakWood, - Item::StrippedOakLog, - Item::StrippedOakWood, - Item::AcaciaLog, - Item::AcaciaWood, - Item::StrippedAcaciaLog, - Item::StrippedAcaciaWood, - Item::BirchLog, - Item::BirchWood, - Item::StrippedBirchLog, - Item::StrippedBirchWood, - Item::JungleLog, - Item::JungleWood, - Item::StrippedJungleLog, - Item::StrippedJungleWood, - Item::SpruceLog, - Item::SpruceWood, - Item::StrippedSpruceLog, - Item::StrippedSpruceWood, - Item::MangroveLog, - Item::MangroveWood, - Item::StrippedMangroveLog, - Item::StrippedMangroveWood, - Item::CherryLog, - Item::CherryWood, - Item::StrippedCherryLog, - Item::StrippedCherryWood, - ]) -}); -pub static AXES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::DiamondAxe, - Item::StoneAxe, - Item::GoldenAxe, - Item::NetheriteAxe, - Item::WoodenAxe, - Item::IronAxe, - ]) -}); -pub static CHEST_BOATS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakChestBoat, - Item::SpruceChestBoat, - Item::BirchChestBoat, - Item::JungleChestBoat, - Item::AcaciaChestBoat, - Item::DarkOakChestBoat, - Item::MangroveChestBoat, - Item::BambooChestRaft, - Item::CherryChestBoat, - ]) -}); -pub static BOOKSHELF_BOOKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Book, - Item::WrittenBook, - Item::EnchantedBook, - Item::WritableBook, - Item::KnowledgeBook, - ]) -}); -pub static ARROWS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Arrow, Item::TippedArrow, Item::SpectralArrow])); -pub static PIGLIN_LOVED: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::GoldBlock, - Item::GildedBlackstone, - Item::LightWeightedPressurePlate, - Item::GoldIngot, - Item::Bell, - Item::Clock, - Item::GoldenCarrot, - Item::GlisteringMelonSlice, - Item::GoldenApple, - Item::EnchantedGoldenApple, - Item::GoldenHelmet, - Item::GoldenChestplate, - Item::GoldenLeggings, - Item::GoldenBoots, - Item::GoldenHorseArmor, - Item::GoldenSword, - Item::GoldenPickaxe, - Item::GoldenShovel, - Item::GoldenAxe, - Item::GoldenHoe, - Item::RawGold, - Item::RawGoldBlock, - Item::GoldOre, - Item::NetherGoldOre, - Item::DeepslateGoldOre, - ]) -}); -pub static WOODEN_BUTTONS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakButton, - Item::SpruceButton, - Item::BirchButton, - Item::JungleButton, - Item::AcaciaButton, - Item::DarkOakButton, - Item::CrimsonButton, - Item::WarpedButton, - Item::MangroveButton, - Item::BambooButton, - Item::CherryButton, - ]) -}); -pub static SMELTS_TO_GLASS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Sand, Item::RedSand])); -pub static JUNGLE_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::JungleLog, - Item::JungleWood, - Item::StrippedJungleLog, - Item::StrippedJungleWood, - ]) -}); -pub static TRAPDOORS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::IronTrapdoor, - Item::AcaciaTrapdoor, - Item::BirchTrapdoor, - Item::DarkOakTrapdoor, - Item::JungleTrapdoor, - Item::OakTrapdoor, - Item::SpruceTrapdoor, - Item::CrimsonTrapdoor, - Item::WarpedTrapdoor, - Item::MangroveTrapdoor, - Item::BambooTrapdoor, - Item::CherryTrapdoor, - ]) -}); -pub static IGNORED_BY_PIGLIN_BABIES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Leather])); -pub static WARPED_STEMS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::WarpedStem, - Item::StrippedWarpedStem, - Item::WarpedHyphae, - Item::StrippedWarpedHyphae, - ]) -}); -pub static BEACON_PAYMENT_ITEMS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::NetheriteIngot, - Item::Emerald, - Item::Diamond, - Item::GoldIngot, - Item::IronIngot, - ]) -}); -pub static IRON_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::IronOre, Item::DeepslateIronOre])); -pub static BOATS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakBoat, - Item::SpruceBoat, - Item::BirchBoat, - Item::JungleBoat, - Item::AcaciaBoat, - Item::DarkOakBoat, - Item::MangroveBoat, - Item::BambooRaft, - Item::CherryBoat, - Item::OakChestBoat, - Item::SpruceChestBoat, - Item::BirchChestBoat, - Item::JungleChestBoat, - Item::AcaciaChestBoat, - Item::DarkOakChestBoat, - Item::MangroveChestBoat, - Item::BambooChestRaft, - Item::CherryChestBoat, - ]) -}); -pub static RAILS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Rail, - Item::PoweredRail, - Item::DetectorRail, - Item::ActivatorRail, - ]) -}); -pub static TRIMMABLE_ARMOR: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::NetheriteHelmet, - Item::NetheriteChestplate, - Item::NetheriteLeggings, - Item::NetheriteBoots, - Item::DiamondHelmet, - Item::DiamondChestplate, - Item::DiamondLeggings, - Item::DiamondBoots, - Item::GoldenHelmet, - Item::GoldenChestplate, - Item::GoldenLeggings, - Item::GoldenBoots, - Item::IronHelmet, - Item::IronChestplate, - Item::IronLeggings, - Item::IronBoots, - Item::ChainmailHelmet, - Item::ChainmailChestplate, - Item::ChainmailLeggings, - Item::ChainmailBoots, - Item::LeatherHelmet, - Item::LeatherChestplate, - Item::LeatherLeggings, - Item::LeatherBoots, - Item::TurtleHelmet, - ]) -}); -pub static PLANKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakPlanks, - Item::SprucePlanks, - Item::BirchPlanks, - Item::JunglePlanks, - Item::AcaciaPlanks, - Item::DarkOakPlanks, - Item::CrimsonPlanks, - Item::WarpedPlanks, - Item::MangrovePlanks, - Item::BambooPlanks, - Item::CherryPlanks, - ]) -}); -pub static FOX_FOOD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::SweetBerries, Item::GlowBerries])); -pub static BAMBOO_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::BambooBlock, Item::StrippedBambooBlock])); -pub static SNIFFER_FOOD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::TorchflowerSeeds])); -pub static CANDLES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Candle, - Item::WhiteCandle, - Item::OrangeCandle, - Item::MagentaCandle, - Item::LightBlueCandle, - Item::YellowCandle, - Item::LimeCandle, - Item::PinkCandle, - Item::GrayCandle, - Item::LightGrayCandle, - Item::CyanCandle, - Item::PurpleCandle, - Item::BlueCandle, - Item::BrownCandle, - Item::GreenCandle, - Item::RedCandle, - Item::BlackCandle, - ]) -}); -pub static SPRUCE_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::SpruceLog, - Item::SpruceWood, - Item::StrippedSpruceLog, - Item::StrippedSpruceWood, - ]) -}); -pub static SWORDS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::DiamondSword, - Item::StoneSword, - Item::GoldenSword, - Item::NetheriteSword, - Item::WoodenSword, - Item::IronSword, - ]) -}); -pub static LECTERN_BOOKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::WrittenBook, Item::WritableBook])); -pub static DECORATED_POT_SHERDS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::AnglerPotterySherd, - Item::ArcherPotterySherd, - Item::ArmsUpPotterySherd, - Item::BladePotterySherd, - Item::BrewerPotterySherd, - Item::BurnPotterySherd, - Item::DangerPotterySherd, - Item::ExplorerPotterySherd, - Item::FriendPotterySherd, - Item::HeartPotterySherd, - Item::HeartbreakPotterySherd, - Item::HowlPotterySherd, - Item::MinerPotterySherd, - Item::MournerPotterySherd, - Item::PlentyPotterySherd, - Item::PrizePotterySherd, - Item::SheafPotterySherd, - Item::ShelterPotterySherd, - Item::SkullPotterySherd, - Item::SnortPotterySherd, - ]) -}); -pub static SAPLINGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakSapling, - Item::SpruceSapling, - Item::BirchSapling, - Item::JungleSapling, - Item::AcaciaSapling, - Item::DarkOakSapling, - Item::Azalea, - Item::FloweringAzalea, - Item::MangrovePropagule, - Item::CherrySapling, - ]) -}); -pub static LEAVES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::JungleLeaves, - Item::OakLeaves, - Item::SpruceLeaves, - Item::DarkOakLeaves, - Item::AcaciaLeaves, - Item::BirchLeaves, - Item::AzaleaLeaves, - Item::FloweringAzaleaLeaves, - Item::MangroveLeaves, - Item::CherryLeaves, - ]) -}); -pub static STONE_BUTTONS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::StoneButton, Item::PolishedBlackstoneButton])); -pub static REDSTONE_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::RedstoneOre, Item::DeepslateRedstoneOre])); -pub static CRIMSON_STEMS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::CrimsonStem, - Item::StrippedCrimsonStem, - Item::CrimsonHyphae, - Item::StrippedCrimsonHyphae, - ]) -}); -pub static HANGING_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakHangingSign, - Item::SpruceHangingSign, - Item::BirchHangingSign, - Item::AcaciaHangingSign, - Item::CherryHangingSign, - Item::JungleHangingSign, - Item::DarkOakHangingSign, - Item::CrimsonHangingSign, - Item::WarpedHangingSign, - Item::MangroveHangingSign, - Item::BambooHangingSign, - ]) -}); -pub static WALLS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::CobblestoneWall, - Item::MossyCobblestoneWall, - Item::BrickWall, - Item::PrismarineWall, - Item::RedSandstoneWall, - Item::MossyStoneBrickWall, - Item::GraniteWall, - Item::StoneBrickWall, - Item::NetherBrickWall, - Item::AndesiteWall, - Item::RedNetherBrickWall, - Item::SandstoneWall, - Item::EndStoneBrickWall, - Item::DioriteWall, - Item::BlackstoneWall, - Item::PolishedBlackstoneBrickWall, - Item::PolishedBlackstoneWall, - Item::CobbledDeepslateWall, - Item::PolishedDeepslateWall, - Item::DeepslateTileWall, - Item::DeepslateBrickWall, - Item::MudBrickWall, - ]) -}); -pub static CLUSTER_MAX_HARVESTABLES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::DiamondPickaxe, - Item::GoldenPickaxe, - Item::IronPickaxe, - Item::NetheritePickaxe, - Item::StonePickaxe, - Item::WoodenPickaxe, - ]) -}); -pub static MUSIC_DISCS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::MusicDiscPigstep, - Item::MusicDiscOtherside, - Item::MusicDisc5, - Item::MusicDiscRelic, - Item::MusicDisc13, - Item::MusicDiscCat, - Item::MusicDiscBlocks, - Item::MusicDiscChirp, - Item::MusicDiscFar, - Item::MusicDiscMall, - Item::MusicDiscMellohi, - Item::MusicDiscStal, - Item::MusicDiscStrad, - Item::MusicDiscWard, - Item::MusicDisc11, - Item::MusicDiscWait, - ]) -}); -pub static FREEZE_IMMUNE_WEARABLES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::LeatherBoots, - Item::LeatherLeggings, - Item::LeatherChestplate, - Item::LeatherHelmet, - Item::LeatherHorseArmor, - ]) -}); diff --git a/azalea-world/Cargo.toml b/azalea-world/Cargo.toml index f01559d0..cdd3a4c9 100644 --- a/azalea-world/Cargo.toml +++ b/azalea-world/Cargo.toml @@ -15,7 +15,6 @@ azalea-buf = { path = "../azalea-buf", version = "0.9.0" } azalea-core = { path = "../azalea-core", version = "0.9.0", features = [ "bevy_ecs", ] } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } azalea-registry = { path = "../azalea-registry", version = "0.9.0" } bevy_ecs = "0.13.2" derive_more = { version = "0.99.17", features = ["deref", "deref_mut"] } diff --git a/azalea/Cargo.toml b/azalea/Cargo.toml index 372b4bb5..bc48ecb7 100644 --- a/azalea/Cargo.toml +++ b/azalea/Cargo.toml @@ -18,7 +18,6 @@ azalea-block = { version = "0.9.0", path = "../azalea-block" } azalea-chat = { version = "0.9.0", path = "../azalea-chat" } azalea-client = { version = "0.9.0", path = "../azalea-client", default-features = false } azalea-core = { version = "0.9.0", path = "../azalea-core" } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } azalea-physics = { version = "0.9.0", path = "../azalea-physics" } azalea-protocol = { version = "0.9.0", path = "../azalea-protocol" } azalea-registry = { version = "0.9.0", path = "../azalea-registry" } @@ -41,9 +40,10 @@ thiserror = "^1.0.58" tokio = "^1.37.0" uuid = "1.8.0" bevy_log = "0.13.2" -azalea-entity = { version = "0.9.0", path = "../azalea-entity" } bevy_time = "0.13.2" rustc-hash = "1.1.0" +azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } +azalea-entity = { version = "0.9.0", path = "../azalea-entity" } [dev-dependencies] criterion = "0.5.1" diff --git a/azalea/src/auto_tool.rs b/azalea/src/auto_tool.rs index bc9bb474..77345acc 100644 --- a/azalea/src/auto_tool.rs +++ b/azalea/src/auto_tool.rs @@ -2,7 +2,7 @@ use azalea_block::{Block, BlockState}; use azalea_client::{inventory::InventoryComponent, Client}; use azalea_entity::{FluidOnEyes, Physics}; use azalea_inventory::{ItemSlot, Menu}; -use azalea_registry::Fluid; +use azalea_registry::{DataComponentKind, Fluid}; #[derive(Debug)] pub struct BestToolResult { @@ -92,7 +92,11 @@ pub fn accurate_best_tool_in_hotbar_for_block( ItemSlot::Present(item_slot) => { // lazy way to avoid checking durability since azalea doesn't have durability // data yet - if item_slot.nbt.is_none() { + if item_slot + .components + .get(DataComponentKind::Damage) + .is_none() + { this_item_speed = Some(azalea_entity::mining::get_mine_progress( block.as_ref(), item_slot.kind, diff --git a/codegen/README.md b/codegen/README.md index ba5e54a3..60b881ce 100755 --- a/codegen/README.md +++ b/codegen/README.md @@ -40,7 +40,7 @@ If it all works, make a pull request. If the version you updated to is a snapsho At the time of writing, the following data generators are used: - [Vanilla data generator](https://wiki.vg/Data_Generators) -- [Burger](https://github.com/Pokechu22/Burger) +- [Burger](https://github.com/mat-1/Burger) - [PixLyzer](https://gitlab.bixilon.de/bixilon/pixlyzer) Some things can be obtained from multiple generators. You should prefer them by the order above (the vanilla generator is the most reliable). diff --git a/codegen/genblocks.py b/codegen/genblocks.py index 5e28b60a..1af0ad10 100755 --- a/codegen/genblocks.py +++ b/codegen/genblocks.py @@ -9,10 +9,11 @@ import lib.utils version_id = lib.code.version.get_version_id() +# TODO: pixlyzer is broken so we use old data shape_datas = lib.extract.get_pixlyzer_data( - version_id, 'shapes') + '1.20.3-pre4', 'shapes') pixlyzer_block_datas = lib.extract.get_pixlyzer_data( - version_id, 'blocks') + '1.20.3-pre4', 'blocks') mappings = lib.download.get_mappings_for_version(version_id) block_states_burger = lib.extract.get_block_states_burger(version_id) diff --git a/codegen/lib/code/blocks.py b/codegen/lib/code/blocks.py index f96b1116..64347849 100755 --- a/codegen/lib/code/blocks.py +++ b/codegen/lib/code/blocks.py @@ -41,7 +41,7 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat if property_burger is None: print( - 'Warning: The reports have states for a block, but Burger doesn\'t!', block_data_burger) + f'Warning: The reports have states for a block, but Burger doesn\'t! (missing "{property_name}")', block_data_burger) property_struct_name = get_property_struct_name( property_burger, block_data_burger, property_variants, mappings) @@ -90,7 +90,7 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat for block_id in ordered_blocks: block_data_burger = blocks_burger[block_id] block_data_report = blocks_report['minecraft:' + block_id] - block_data_pixlyzer = pixlyzer_block_datas[f'minecraft:{block_id}'] + block_data_pixlyzer = pixlyzer_block_datas.get(f'minecraft:{block_id}', {}) block_properties = block_data_burger.get('states', []) block_properties_burger = block_data_burger.get('states', []) @@ -202,6 +202,10 @@ def get_property_struct_name(property: Optional[dict], block_data_burger: dict, return 'ChestType' if property_variants == ['compare', 'subtract']: return 'ComparatorType' + if property_variants == ['inactive', 'waiting_for_players', 'active', 'waiting_for_reward_ejection', 'ejecting_reward', 'cooldown']: + return 'TrialSpawnerState' + if property_variants == ['inactive', 'active', 'unlocking', 'ejecting']: + return 'VaultState' if 'harp' in property_variants and 'didgeridoo' in property_variants: return 'Sound' diff --git a/codegen/lib/code/entity.py b/codegen/lib/code/entity.py index 8fa11430..5f0bc3d9 100644 --- a/codegen/lib/code/entity.py +++ b/codegen/lib/code/entity.py @@ -89,7 +89,7 @@ def generate_entity_metadata(burger_entities_data: dict, mappings: Mappings): with open(DATA_RS_DIR, 'w') as f: f.write('\n'.join(lines)) print('Expected metadata types:\n' + '\n'.join(new_metadata_names)) - print('Updated metadata types in azalea-world/src/entity/data.rs, go make sure they\'re correct and then press enter') + print('Updated metadata types in azalea-entity/src/data.rs, go make sure they\'re correct (check EntityDataSerializers.java) and then press enter') input() metadata_types = parse_metadata_types_from_code() @@ -100,12 +100,17 @@ def generate_entity_metadata(burger_entities_data: dict, mappings: Mappings): // This file is generated from codegen/lib/code/entity.py. // Don't change it manually! +use crate::particle::Particle; + use super::{ - EntityDataItem, EntityDataValue, OptionalUnsignedInt, Pose, Quaternion, Rotations, - SnifferState, VillagerData + ArmadilloStateKind, EntityDataItem, EntityDataValue, OptionalUnsignedInt, Pose, Quaternion, + Rotations, SnifferState, VillagerData, }; use azalea_chat::FormattedText; -use azalea_core::{particle::Particle, position::{BlockPos, Vec3}, direction::Direction}; +use azalea_core::{ + direction::Direction, + position::{BlockPos, Vec3}, +}; use azalea_inventory::ItemSlot; use bevy_ecs::{bundle::Bundle, component::Component}; use derive_more::{Deref, DerefMut}; @@ -218,8 +223,7 @@ impl From for UpdateMetadataError { struct_name = upper_first_letter( to_camel_case(name_or_bitfield)) - type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))[ - 'type_id'] + type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))['type_id'] metadata_type_data = metadata_types[type_id] rust_type = metadata_type_data['type'] @@ -281,8 +285,7 @@ impl From for UpdateMetadataError { if name_or_bitfield in single_use_imported_types: field_struct_name = '' - type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))[ - 'type_id'] + type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))['type_id'] metadata_type_data = metadata_types[type_id] rust_type = metadata_type_data['type'] type_name = metadata_type_data['name'] @@ -384,8 +387,7 @@ impl From for UpdateMetadataError { ' },') for index, name_or_bitfield in get_entity_metadata_names(this_entity_id, burger_entity_metadata, mappings).items(): - default = next(filter(lambda i: i['index'] == index, entity_metadatas)).get( - 'default', 'Default::default()') + default = next(filter(lambda i: i['index'] == index, entity_metadatas)).get('default', 'Default::default()') if isinstance(name_or_bitfield, str): type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))[ 'type_id'] @@ -454,8 +456,10 @@ impl From for UpdateMetadataError { for mask, name in name_or_bitfield.items(): name = maybe_rename_field(name, index) mask = int(mask, 0) - bit_default = 'true' if ( - default & mask != 0) else 'false' + if default is None: + bit_default = 'false' + else: + bit_default = 'true' if (default & mask != 0) else 'false' code.append( f' {name}: {upper_first_letter(to_camel_case(name))}({bit_default}),') code.append(' Self {') diff --git a/codegen/lib/download.py b/codegen/lib/download.py index 319c6080..41576594 100755 --- a/codegen/lib/download.py +++ b/codegen/lib/download.py @@ -16,7 +16,7 @@ def get_burger(): if not os.path.exists(get_dir_location('__cache__/Burger')): print('\033[92mDownloading Burger...\033[m') os.system( - f'cd {get_dir_location("__cache__")} && git clone https://github.com/pokechu22/Burger && cd Burger && git pull') + f'cd {get_dir_location("__cache__")} && git clone https://github.com/mat-1/Burger && cd Burger && git pull') print('\033[92mInstalling dependencies...\033[m') os.system(f'cd {get_dir_location("__cache__")}/Burger && pip install six jawa') diff --git a/codegen/lib/extract.py b/codegen/lib/extract.py index 608673fa..fa75c49e 100755 --- a/codegen/lib/extract.py +++ b/codegen/lib/extract.py @@ -1,5 +1,6 @@ # Extracting data from the Minecraft jars +from typing import TYPE_CHECKING from lib.download import get_server_jar, get_burger, get_client_jar, get_pixlyzer, get_yarn_data, get_fabric_api_versions, get_fabric_loader_versions from lib.utils import get_dir_location from zipfile import ZipFile @@ -275,3 +276,19 @@ def get_en_us_lang(version_id: str): return json.loads( get_file_from_jar(version_id, 'assets/minecraft/lang/en_us.json') ) + +# burger packet id extraction is broken since 1.20.5 (always returns -1, so we have to determine packet id ourselves from the mappings). +# this is very much not ideal. + +if TYPE_CHECKING: from codegen.lib.mappings import Mappings +def get_packet_list(burger_data, mappings: 'Mappings'): + packet_list = list(burger_data[0]['packets']['packet'].values()) + + current_packet_id = 0 + for packet in packet_list: + if packet['id'] == -1: + packet['id'] = current_packet_id + print(packet) + current_packet_id += 1 + + return packet_list diff --git a/codegen/migrate.py b/codegen/migrate.py index 860d860e..2be85643 100755 --- a/codegen/migrate.py +++ b/codegen/migrate.py @@ -26,88 +26,89 @@ if len(sys.argv) == 1: old_version_id = lib.code.version.get_version_id() old_mappings = lib.download.get_mappings_for_version(old_version_id) old_burger_data = lib.extract.get_burger_data_for_version(old_version_id) -old_packet_list = list(old_burger_data[0]['packets']['packet'].values()) new_version_id = sys.argv[1] new_mappings = lib.download.get_mappings_for_version(new_version_id) new_burger_data = lib.extract.get_burger_data_for_version(new_version_id) -new_packet_list = list(new_burger_data[0]['packets']['packet'].values()) + +old_packet_list = lib.extract.get_packet_list(old_burger_data, old_mappings) +new_packet_list = lib.extract.get_packet_list(new_burger_data, new_mappings) -old_packets: dict[PacketIdentifier, str] = {} -old_packets_data: dict[PacketIdentifier, dict] = {} -new_packets: dict[PacketIdentifier, str] = {} -new_packets_data: dict[PacketIdentifier, dict] = {} +# old_packets: dict[PacketIdentifier, str] = {} +# old_packets_data: dict[PacketIdentifier, dict] = {} +# new_packets: dict[PacketIdentifier, str] = {} +# new_packets_data: dict[PacketIdentifier, dict] = {} -for packet in old_packet_list: - assert packet['class'].endswith('.class') - packet_name = old_mappings.get_class(packet['class'][:-6]) - packet_ident = PacketIdentifier( - packet['id'], packet['direction'].lower(), fix_state(packet['state'])) - old_packets[packet_ident] = packet_name - old_packets_data[packet_ident] = packet -for packet in new_packet_list: - assert packet['class'].endswith('.class') - packet_name = new_mappings.get_class(packet['class'][:-6]) - packet_ident = PacketIdentifier( - packet['id'], packet['direction'].lower(), fix_state(packet['state'])) - new_packets[packet_ident] = packet_name - new_packets_data[packet_ident] = packet +# for packet in old_packet_list: +# assert packet['class'].endswith('.class') +# packet_name = old_mappings.get_class(packet['class'][:-6]) +# packet_ident = PacketIdentifier( +# packet['id'], packet['direction'].lower(), fix_state(packet['state'])) +# old_packets[packet_ident] = packet_name +# old_packets_data[packet_ident] = packet +# for packet in new_packet_list: +# assert packet['class'].endswith('.class') +# packet_name = new_mappings.get_class(packet['class'][:-6]) +# packet_ident = PacketIdentifier( +# packet['id'], packet['direction'].lower(), fix_state(packet['state'])) +# new_packets[packet_ident] = packet_name +# new_packets_data[packet_ident] = packet -# find removed packets -removed_packets: list[PacketIdentifier] = [] -for packet, packet_name in old_packets.items(): - if packet_name not in new_packets.values(): - removed_packets.append(packet) - print('Removed packet:', packet, packet_name) -for (direction, state), packets in group_packets(removed_packets).items(): - lib.code.packet.remove_packet_ids(packets, direction, state) +# # find removed packets +# removed_packets: list[PacketIdentifier] = [] +# for packet, packet_name in old_packets.items(): +# if packet_name not in new_packets.values(): +# removed_packets.append(packet) +# print('Removed packet:', packet, packet_name) +# for (direction, state), packets in group_packets(removed_packets).items(): +# lib.code.packet.remove_packet_ids(packets, direction, state) print() -# find packets that changed ids -changed_packets: dict[PacketIdentifier, int] = {} -for old_packet, old_packet_name in old_packets.items(): - for new_packet, new_packet_name in new_packets.items(): - if old_packet_name == new_packet_name and old_packet.direction == new_packet.direction and old_packet.state == new_packet.state and old_packet.packet_id != new_packet.packet_id: - changed_packets[old_packet] = new_packet.packet_id - print('Changed packet id:', old_packet, '->', - new_packet, f'({new_packet_name})') - break -for (direction, state), packets in group_packets(list(changed_packets.keys())).items(): - id_map: dict[int, int] = {} - for old_packet_id in packets: - new_packet_id = changed_packets[PacketIdentifier( - old_packet_id, direction, state)] - id_map[old_packet_id] = new_packet_id - lib.code.packet.change_packet_ids(id_map, direction, state) +# # find packets that changed ids +# changed_packets: dict[PacketIdentifier, int] = {} +# for old_packet, old_packet_name in old_packets.items(): +# for new_packet, new_packet_name in new_packets.items(): +# if old_packet_name == new_packet_name and old_packet.direction == new_packet.direction and old_packet.state == new_packet.state and old_packet.packet_id != new_packet.packet_id: +# changed_packets[old_packet] = new_packet.packet_id +# print('Changed packet id:', old_packet, '->', +# new_packet, f'({new_packet_name})') +# break +# for (direction, state), packets in group_packets(list(changed_packets.keys())).items(): +# id_map: dict[int, int] = {} +# for old_packet_id in packets: +# new_packet_id = changed_packets[PacketIdentifier( +# old_packet_id, direction, state)] +# id_map[old_packet_id] = new_packet_id +# lib.code.packet.change_packet_ids(id_map, direction, state) -print() +# print() -# find added/changed packets -added_or_changed_packets: list[PacketIdentifier] = [] -for new_packet, packet_name in new_packets.items(): - old_packet = None - for old_packet_tmp, old_packet_name in old_packets.items(): - if old_packet_name == packet_name: - old_packet = old_packet_tmp - break +# # find added/changed packets +# added_or_changed_packets: list[PacketIdentifier] = [] +# for new_packet, packet_name in new_packets.items(): +# old_packet = None +# for old_packet_tmp, old_packet_name in old_packets.items(): +# if old_packet_name == packet_name: +# old_packet = old_packet_tmp +# break - if packet_name not in old_packets.values(): - added_or_changed_packets.append(new_packet) - print('Added packet:', new_packet, packet_name) - elif old_packet and not lib.code.packet.are_packet_instructions_identical(new_packets_data[new_packet].get('instructions'), old_packets_data[old_packet].get('instructions')): - added_or_changed_packets.append(new_packet) - print('Changed packet:', new_packet, packet_name) -for packet in added_or_changed_packets: - lib.code.packet.generate_packet( - new_burger_data[0]['packets']['packet'], new_mappings, packet.packet_id, packet.direction, packet.state) +# if packet_name not in old_packets.values(): +# added_or_changed_packets.append(new_packet) +# print('Added packet:', new_packet, packet_name) +# elif old_packet and not lib.code.packet.are_packet_instructions_identical(new_packets_data[new_packet].get('instructions'), old_packets_data[old_packet].get('instructions')): +# added_or_changed_packets.append(new_packet) +# print('Changed packet:', new_packet, packet_name) +# for packet in added_or_changed_packets: +# lib.code.packet.generate_packet( +# new_burger_data[0]['packets']['packet'], new_mappings, packet.packet_id, packet.direction, packet.state) lib.code.version.set_protocol_version( new_burger_data[0]['version']['protocol']) -print('Updated protocol!') +# print('Updated protocol!') old_ordered_blocks = lib.extract.get_ordered_blocks_burger(old_version_id) @@ -118,10 +119,11 @@ if old_ordered_blocks != new_ordered_blocks: block_states_burger = lib.extract.get_block_states_burger(new_version_id) block_states_report = lib.extract.get_block_states_report(new_version_id) + # TODO: pixlyzer is currently broken so uhhhh shape_datas = lib.extract.get_pixlyzer_data( - new_version_id, 'shapes') + '1.20.3-pre4', 'shapes') pixlyzer_block_datas = lib.extract.get_pixlyzer_data( - new_version_id, 'blocks') + '1.20.3-pre4', 'blocks') lib.code.blocks.generate_blocks( block_states_burger, block_states_report, pixlyzer_block_datas, new_ordered_blocks, new_mappings) @@ -136,9 +138,9 @@ print('Generating registries...') import genregistries genregistries.generate(new_version_id) -print('Generating entity metadata...') -burger_entities_data = new_burger_data[0]['entities'] -lib.code.entity.generate_entity_metadata(burger_entities_data, new_mappings) +# print('Generating entity metadata...') +# burger_entities_data = new_burger_data[0]['entities'] +# lib.code.entity.generate_entity_metadata(burger_entities_data, new_mappings) print('Finishing touches, setting version in README and formatting code...') lib.code.version.set_version_id(new_version_id)