diff options
| author | mat <27899617+mat-1@users.noreply.github.com> | 2025-08-04 20:43:10 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-04 20:43:10 -0500 |
| commit | 23b7f20a0d88b54d430820baeb4a6da0316a009a (patch) | |
| tree | f3e780515b3bbb9973d2b94338be6194b5ec0af3 | |
| parent | 827d943c3f27c65724ff83689b40c87d1cd1838c (diff) | |
| download | azalea-drasl-23b7f20a0d88b54d430820baeb4a6da0316a009a.tar.xz | |
Default components (#232)
* add default components
* remove debug prints
* clippy
* use default components
* fix tests
26 files changed, 6373 insertions, 268 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f378770..2d2194a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ is breaking anyways, semantic versioning is not followed. - `HitResult` now contains the entity that's being looked at. - A `QueuedServerBlockUpdates` component that keeps track of block updates per `Update`. - Local clients now have a `TicksConnected` component. (@Kumpelinus) +- There is now a `azalea_inventory::default_components::get_default_component` function to get the default value of a component for a registry item. +- `ItemStack` now has a `get_component` function that supports default components. ### Changed @@ -20,6 +22,7 @@ is breaking anyways, semantic versioning is not followed. - Renamed `azalea_entity::EntityKind` to `EntityKindComponent` to disambiguate with `azalea_registry::EntityKind`. - Moved functions and types related to hit results from `azalea::interact` to `azalea::interact::pick`. - `Client::attack` now takes `Entity` instead of `MinecraftEntityId`. +- `ItemStackData::components` was renamed to `component_patch`. ### Fixed @@ -27,6 +30,7 @@ is breaking anyways, semantic versioning is not followed. - Clients no longer send invalid look directions if the server teleports us with one. - Movement code was updated with the changes from 1.21.5, so it no longer flags Grim. - `azalea-chat` now correctly handles arrays of integers in the `with` field. (@qwqawawow) +- Inventories now use the correct max stack sizes. ## [0.13.0+mc1.21.5] - 2025-06-15 diff --git a/azalea-chat/src/component.rs b/azalea-chat/src/component.rs index 1cb2bf30..2a7e588e 100644 --- a/azalea-chat/src/component.rs +++ b/azalea-chat/src/component.rs @@ -587,6 +587,16 @@ impl From<&str> for FormattedText { Self::from(s.to_string()) } } +impl From<TranslatableComponent> for FormattedText { + fn from(c: TranslatableComponent) -> Self { + FormattedText::Translatable(c) + } +} +impl From<TextComponent> for FormattedText { + fn from(c: TextComponent) -> Self { + FormattedText::Text(c) + } +} impl Display for FormattedText { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { diff --git a/azalea-chat/src/translatable_component.rs b/azalea-chat/src/translatable_component.rs index 431c08b2..80d5e8e2 100644 --- a/azalea-chat/src/translatable_component.rs +++ b/azalea-chat/src/translatable_component.rs @@ -224,6 +224,11 @@ impl From<StringOrComponent> for TextComponent { } } } +impl From<&str> for TranslatableComponent { + fn from(s: &str) -> Self { + TranslatableComponent::new(s.to_string(), vec![]) + } +} #[cfg(test)] mod tests { diff --git a/azalea-client/src/plugins/interact/mod.rs b/azalea-client/src/plugins/interact/mod.rs index 47e2e0b2..f02c05d5 100644 --- a/azalea-client/src/plugins/interact/mod.rs +++ b/azalea-client/src/plugins/interact/mod.rs @@ -383,7 +383,7 @@ 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 - if !item.components.has::<components::CanBreak>() { + if item.get_component::<components::CanBreak>().is_none() { // no CanDestroy tag return false; }; diff --git a/azalea-client/src/plugins/inventory.rs b/azalea-client/src/plugins/inventory.rs index 8efc0e71..1662be9f 100644 --- a/azalea-client/src/plugins/inventory.rs +++ b/azalea-client/src/plugins/inventory.rs @@ -950,11 +950,7 @@ mod tests { #[test] fn test_simulate_shift_click_in_crafting_table() { - let spruce_planks = ItemStack::Present(ItemStackData { - count: 4, - kind: Item::SprucePlanks, - components: Default::default(), - }); + let spruce_planks = ItemStack::new(Item::SprucePlanks, 4); let mut inventory = Inventory { inventory_menu: Menu::Player(azalea_inventory::Player::default()), diff --git a/azalea-core/src/resource_location.rs b/azalea-core/src/resource_location.rs index a4309035..c6e39150 100644 --- a/azalea-core/src/resource_location.rs +++ b/azalea-core/src/resource_location.rs @@ -11,7 +11,7 @@ use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError}; use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; use simdnbt::{FromNbtTag, ToNbtTag, owned::NbtTag}; -#[derive(Hash, Clone, PartialEq, Eq)] +#[derive(Hash, Clone, PartialEq, Eq, Default)] pub struct ResourceLocation { pub namespace: String, pub path: String, @@ -59,6 +59,11 @@ impl FromStr for ResourceLocation { Ok(ResourceLocation::new(s)) } } +impl From<&str> for ResourceLocation { + fn from(s: &str) -> Self { + ResourceLocation::new(s) + } +} impl AzaleaRead for ResourceLocation { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> { diff --git a/azalea-inventory/src/components.rs b/azalea-inventory/src/components.rs index 0440afe3..e11a4491 100644 --- a/azalea-inventory/src/components.rs +++ b/azalea-inventory/src/components.rs @@ -12,9 +12,8 @@ use azalea_core::{ sound::CustomSound, }; use azalea_registry::{ - self as registry, Attribute, Block, ConsumeEffectKind, DamageKind, DataComponentKind, - Enchantment, EntityKind, Holder, HolderSet, Item, MobEffect, Potion, SoundEvent, TrimMaterial, - TrimPattern, + self as registry, Attribute, Block, DamageKind, DataComponentKind, Enchantment, EntityKind, + Holder, HolderSet, Item, MobEffect, Potion, SoundEvent, TrimMaterial, TrimPattern, }; use simdnbt::owned::{Nbt, NbtCompound}; use tracing::trace; @@ -22,7 +21,7 @@ use uuid::Uuid; use crate::{ItemStack, item::consume_effect::ConsumeEffect}; -pub trait DataComponent: Send + Sync + Any { +pub trait DataComponent: Send + Sync + Any + Clone { const KIND: DataComponentKind; } @@ -329,9 +328,9 @@ pub enum EquipmentSlotGroup { #[derive(Clone, Copy, PartialEq, AzBuf)] pub enum AttributeModifierOperation { - Addition, - MultiplyBase, - MultiplyTotal, + AddValue, + AddMultipliedBase, + AddMultipliedTotal, } // this is duplicated in azalea-entity, BUT the one there has a different @@ -349,6 +348,7 @@ pub struct AttributeModifiersEntry { pub attribute: Attribute, pub modifier: AttributeModifier, pub slot: EquipmentSlotGroup, + pub display: AttributeModifierDisplay, } #[derive(Clone, PartialEq, AzBuf)] @@ -360,6 +360,13 @@ impl DataComponent for AttributeModifiers { } #[derive(Clone, PartialEq, AzBuf)] +pub enum AttributeModifierDisplay { + Default, + Hidden, + Override { text: FormattedText }, +} + +#[derive(Clone, PartialEq, AzBuf)] pub struct CustomModelData { pub floats: Vec<f32>, pub flags: Vec<bool>, @@ -410,10 +417,27 @@ pub struct MobEffectDetails { pub show_icon: bool, pub hidden_effect: Option<Box<MobEffectDetails>>, } +impl MobEffectDetails { + pub const fn new() -> Self { + MobEffectDetails { + amplifier: 0, + duration: 0, + ambient: false, + show_particles: true, + show_icon: false, + hidden_effect: None, + } + } +} +impl Default for MobEffectDetails { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct MobEffectInstance { - pub effect: MobEffect, + pub id: MobEffect, pub details: MobEffectDetails, } @@ -423,18 +447,25 @@ pub struct PossibleEffect { pub probability: f32, } -#[derive(Clone, PartialEq, AzBuf)] +#[derive(Clone, PartialEq, Default, AzBuf)] pub struct Food { #[var] pub nutrition: i32, pub saturation: f32, pub can_always_eat: bool, - pub eat_seconds: f32, - pub effects: Vec<PossibleEffect>, } impl DataComponent for Food { const KIND: DataComponentKind = DataComponentKind::Food; } +impl Food { + pub const fn new() -> Self { + Food { + nutrition: 0, + saturation: 0., + can_always_eat: false, + } + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct ToolRule { @@ -442,6 +473,20 @@ pub struct ToolRule { pub speed: Option<f32>, pub correct_for_drops: Option<bool>, } +impl ToolRule { + pub const fn new() -> Self { + ToolRule { + blocks: HolderSet::Direct { contents: vec![] }, + speed: None, + correct_for_drops: None, + } + } +} +impl Default for ToolRule { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct Tool { @@ -449,10 +494,26 @@ pub struct Tool { pub default_mining_speed: f32, #[var] pub damage_per_block: i32, + pub can_destroy_blocks_in_creative: bool, } impl DataComponent for Tool { const KIND: DataComponentKind = DataComponentKind::Tool; } +impl Tool { + pub const fn new() -> Self { + Tool { + rules: vec![], + default_mining_speed: 1., + damage_per_block: 1, + can_destroy_blocks_in_creative: true, + } + } +} +impl Default for Tool { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct StoredEnchantments { @@ -531,6 +592,21 @@ pub struct PotionContents { impl DataComponent for PotionContents { const KIND: DataComponentKind = DataComponentKind::PotionContents; } +impl PotionContents { + pub const fn new() -> Self { + PotionContents { + potion: None, + custom_color: None, + custom_effects: vec![], + custom_name: None, + } + } +} +impl Default for PotionContents { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct SuspiciousStewEffect { @@ -679,11 +755,25 @@ impl DataComponent for FireworkExplosion { pub struct Fireworks { #[var] pub flight_duration: i32, + #[limit(256)] pub explosions: Vec<FireworkExplosion>, } impl DataComponent for Fireworks { const KIND: DataComponentKind = DataComponentKind::Fireworks; } +impl Fireworks { + pub const fn new() -> Self { + Fireworks { + flight_duration: 0, + explosions: vec![], + } + } +} +impl Default for Fireworks { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct GameProfileProperty { @@ -839,6 +929,22 @@ pub struct Consumable { impl DataComponent for Consumable { const KIND: DataComponentKind = DataComponentKind::Consumable; } +impl Consumable { + pub const fn new() -> Self { + Self { + consume_seconds: 1.6, + animation: ItemUseAnimation::Eat, + sound: azalea_registry::Holder::Reference(SoundEvent::EntityGenericEat), + has_consume_particles: true, + on_consume_effects: Vec::new(), + } + } +} +impl Default for Consumable { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, Copy, PartialEq, AzBuf)] pub enum ItemUseAnimation { @@ -870,6 +976,19 @@ pub struct UseCooldown { impl DataComponent for UseCooldown { const KIND: DataComponentKind = DataComponentKind::UseCooldown; } +impl UseCooldown { + pub const fn new() -> Self { + Self { + seconds: 0., + cooldown_group: None, + } + } +} +impl Default for UseCooldown { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct Enchantable { @@ -924,22 +1043,46 @@ pub struct Equippable { pub dispensable: bool, pub swappable: bool, pub damage_on_hurt: bool, + pub equip_on_interact: bool, + pub can_be_sheared: bool, + pub shearing_sound: SoundEvent, } impl DataComponent for Equippable { const KIND: DataComponentKind = DataComponentKind::Equippable; } +impl Equippable { + pub const fn new() -> Self { + Self { + slot: EquipmentSlot::Body, + equip_sound: SoundEvent::ItemArmorEquipGeneric, + asset_id: None, + camera_overlay: None, + allowed_entities: None, + dispensable: true, + swappable: true, + damage_on_hurt: true, + equip_on_interact: false, + can_be_sheared: false, + shearing_sound: SoundEvent::ItemShearsSnip, + } + } +} +impl Default for Equippable { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, Copy, Debug, PartialEq, AzBuf)] pub enum EquipmentSlot { Mainhand, Offhand, - Hand, Feet, Legs, Chest, Head, - Armor, Body, + Saddle, } #[derive(Clone, PartialEq, AzBuf)] @@ -958,7 +1101,7 @@ impl DataComponent for TooltipStyle { #[derive(Clone, PartialEq, AzBuf)] pub struct DeathProtection { - pub death_effects: Vec<ConsumeEffectKind>, + pub death_effects: Vec<ConsumeEffect>, } impl DataComponent for DeathProtection { const KIND: DataComponentKind = DataComponentKind::DeathProtection; @@ -967,12 +1110,25 @@ impl DataComponent for DeathProtection { #[derive(Clone, PartialEq, AzBuf)] pub struct Weapon { #[var] - pub damage_per_attack: i32, - pub can_disable_blocking: bool, + pub item_damage_per_attack: i32, + pub disable_blocking_for_seconds: f32, } impl DataComponent for Weapon { const KIND: DataComponentKind = DataComponentKind::Weapon; } +impl Weapon { + pub const fn new() -> Self { + Self { + item_damage_per_attack: 1, + disable_blocking_for_seconds: 0., + } + } +} +impl Default for Weapon { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct PotionDurationScale { @@ -1173,7 +1329,7 @@ impl DataComponent for ShulkerColor { const KIND: DataComponentKind = DataComponentKind::ShulkerColor; } -#[derive(Clone, PartialEq, AzBuf)] +#[derive(Clone, PartialEq, AzBuf, Default)] pub struct TooltipDisplay { pub hide_tooltip: bool, pub hidden_components: Vec<DataComponentKind>, @@ -1181,6 +1337,14 @@ pub struct TooltipDisplay { impl DataComponent for TooltipDisplay { const KIND: DataComponentKind = DataComponentKind::TooltipDisplay; } +impl TooltipDisplay { + pub const fn new() -> Self { + Self { + hide_tooltip: false, + hidden_components: Vec::new(), + } + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct BlocksAttacks { @@ -1190,11 +1354,38 @@ pub struct BlocksAttacks { pub item_damage: ItemDamageFunction, pub bypassed_by: Option<ResourceLocation>, pub block_sound: Option<azalea_registry::Holder<SoundEvent, CustomSound>>, - pub disable_sound: Option<azalea_registry::Holder<SoundEvent, CustomSound>>, + pub disabled_sound: Option<azalea_registry::Holder<SoundEvent, CustomSound>>, } impl DataComponent for BlocksAttacks { const KIND: DataComponentKind = DataComponentKind::BlocksAttacks; } +impl BlocksAttacks { + pub fn new() -> Self { + Self { + block_delay_seconds: 0., + disable_cooldown_scale: 1., + damage_reductions: vec![DamageReduction { + horizontal_blocking_angle: 90., + kind: None, + base: 0., + factor: 1., + }], + item_damage: ItemDamageFunction { + threshold: 1., + base: 0., + factor: 1., + }, + bypassed_by: None, + block_sound: None, + disabled_sound: None, + } + } +} +impl Default for BlocksAttacks { + fn default() -> Self { + Self::new() + } +} #[derive(Clone, PartialEq, AzBuf)] pub struct DamageReduction { diff --git a/azalea-inventory/src/default_components/generated.rs b/azalea-inventory/src/default_components/generated.rs new file mode 100644 index 00000000..c62a43dd --- /dev/null +++ b/azalea-inventory/src/default_components/generated.rs @@ -0,0 +1,4892 @@ +// This file was @generated by codegen/lib/code/components.py, don't edit it +// manually! + +#![allow(clippy::all)] + +use std::collections::HashMap; + +use azalea_chat::translatable_component::TranslatableComponent; +use azalea_registry::{Attribute, Block, EntityKind, HolderSet, Item, MobEffect, SoundEvent}; +use simdnbt::owned::NbtCompound; + +use crate::{ + ItemStack, components::*, default_components::DefaultableComponent, + item::consume_effect::ConsumeEffect, +}; + +impl DefaultableComponent for AttributeModifiers { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::CarvedPumpkin => vec![AttributeModifiersEntry { + display: AttributeModifierDisplay::Hidden, + slot: EquipmentSlotGroup::Head, + attribute: Attribute::WaypointTransmitRange, + modifier: AttributeModifier { + id: "minecraft:waypoint_transmit_range_hide".into(), + amount: -1.0, + operation: AttributeModifierOperation::AddMultipliedTotal, + }, + }], + Item::ChainmailBoots => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 1.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::ChainmailChestplate => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 5.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::ChainmailHelmet => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::ChainmailLeggings => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 4.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::CreeperHead => vec![AttributeModifiersEntry { + display: AttributeModifierDisplay::Hidden, + slot: EquipmentSlotGroup::Head, + attribute: Attribute::WaypointTransmitRange, + modifier: AttributeModifier { + id: "minecraft:waypoint_transmit_range_hide".into(), + amount: -1.0, + operation: AttributeModifierOperation::AddMultipliedTotal, + }, + }], + Item::DiamondAxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 8.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DiamondBoots => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DiamondChestplate => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 8.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DiamondHelmet => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DiamondHoe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DiamondHorseArmor => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 11.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DiamondLeggings => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 6.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DiamondPickaxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 4.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.799999952316284, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DiamondShovel => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 4.5, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DiamondSword => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 6.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.4000000953674316, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::DragonHead => vec![AttributeModifiersEntry { + display: AttributeModifierDisplay::Hidden, + slot: EquipmentSlotGroup::Head, + attribute: Attribute::WaypointTransmitRange, + modifier: AttributeModifier { + id: "minecraft:waypoint_transmit_range_hide".into(), + amount: -1.0, + operation: AttributeModifierOperation::AddMultipliedTotal, + }, + }], + Item::GoldenAxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 6.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::GoldenBoots => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 1.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::GoldenChestplate => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 5.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::GoldenHelmet => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::GoldenHoe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::GoldenHorseArmor => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 7.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::GoldenLeggings => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::GoldenPickaxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 1.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.799999952316284, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::GoldenShovel => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 1.5, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::GoldenSword => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.4000000953674316, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronAxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 8.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0999999046325684, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronBoots => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronChestplate => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 6.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronHelmet => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronHoe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -1.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronHorseArmor => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 5.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronLeggings => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 5.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronPickaxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.799999952316284, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronShovel => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 3.5, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::IronSword => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 5.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.4000000953674316, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::LeatherBoots => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 1.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::LeatherChestplate => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::LeatherHelmet => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 1.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::LeatherHorseArmor => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::LeatherLeggings => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::Mace => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 5.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.4000000953674316, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::NetheriteAxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 9.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::NetheriteBoots => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Feet, + attribute: Attribute::KnockbackResistance, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.boots".into(), + amount: 0.10000000149011612, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::NetheriteChestplate => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 8.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Chest, + attribute: Attribute::KnockbackResistance, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.chestplate".into(), + amount: 0.10000000149011612, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::NetheriteHelmet => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::KnockbackResistance, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 0.10000000149011612, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::NetheriteHoe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::NetheriteLeggings => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 6.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Legs, + attribute: Attribute::KnockbackResistance, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.leggings".into(), + amount: 0.10000000149011612, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::NetheritePickaxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 5.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.799999952316284, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::NetheriteShovel => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 5.5, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::NetheriteSword => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 7.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.4000000953674316, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::PiglinHead => vec![AttributeModifiersEntry { + display: AttributeModifierDisplay::Hidden, + slot: EquipmentSlotGroup::Head, + attribute: Attribute::WaypointTransmitRange, + modifier: AttributeModifier { + id: "minecraft:waypoint_transmit_range_hide".into(), + amount: -1.0, + operation: AttributeModifierOperation::AddMultipliedTotal, + }, + }], + Item::PlayerHead => vec![AttributeModifiersEntry { + display: AttributeModifierDisplay::Hidden, + slot: EquipmentSlotGroup::Head, + attribute: Attribute::WaypointTransmitRange, + modifier: AttributeModifier { + id: "minecraft:waypoint_transmit_range_hide".into(), + amount: -1.0, + operation: AttributeModifierOperation::AddMultipliedTotal, + }, + }], + Item::SkeletonSkull => vec![AttributeModifiersEntry { + display: AttributeModifierDisplay::Hidden, + slot: EquipmentSlotGroup::Head, + attribute: Attribute::WaypointTransmitRange, + modifier: AttributeModifier { + id: "minecraft:waypoint_transmit_range_hide".into(), + amount: -1.0, + operation: AttributeModifierOperation::AddMultipliedTotal, + }, + }], + Item::StoneAxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 8.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.200000047683716, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::StoneHoe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::StonePickaxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.799999952316284, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::StoneShovel => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 2.5, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::StoneSword => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 4.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.4000000953674316, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::Trident => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 8.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.9000000953674316, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::TurtleHelmet => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 2.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Head, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.helmet".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::WitherSkeletonSkull => vec![AttributeModifiersEntry { + display: AttributeModifierDisplay::Hidden, + slot: EquipmentSlotGroup::Head, + attribute: Attribute::WaypointTransmitRange, + modifier: AttributeModifier { + id: "minecraft:waypoint_transmit_range_hide".into(), + amount: -1.0, + operation: AttributeModifierOperation::AddMultipliedTotal, + }, + }], + Item::WolfArmor => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::Armor, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 11.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Body, + attribute: Attribute::ArmorToughness, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:armor.body".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::WoodenAxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 6.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.200000047683716, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::WoodenHoe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 0.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::WoodenPickaxe => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 1.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.799999952316284, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::WoodenShovel => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 1.5, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::WoodenSword => vec![ + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackDamage, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_damage".into(), + amount: 3.0, + operation: AttributeModifierOperation::AddValue, + }, + }, + AttributeModifiersEntry { + slot: EquipmentSlotGroup::Mainhand, + attribute: Attribute::AttackSpeed, + display: AttributeModifierDisplay::Default, + modifier: AttributeModifier { + id: "minecraft:base_attack_speed".into(), + amount: -2.4000000953674316, + operation: AttributeModifierOperation::AddValue, + }, + }, + ], + Item::ZombieHead => vec![AttributeModifiersEntry { + display: AttributeModifierDisplay::Hidden, + slot: EquipmentSlotGroup::Head, + attribute: Attribute::WaypointTransmitRange, + modifier: AttributeModifier { + id: "minecraft:waypoint_transmit_range_hide".into(), + amount: -1.0, + operation: AttributeModifierOperation::AddMultipliedTotal, + }, + }], + _ => vec![], + }; + Some(AttributeModifiers { modifiers: value }) + } +} +impl DefaultableComponent for BreakSound { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Shield => azalea_registry::Holder::Reference(SoundEvent::ItemShieldBreak), + Item::WolfArmor => azalea_registry::Holder::Reference(SoundEvent::ItemWolfArmorBreak), + _ => azalea_registry::Holder::Reference(SoundEvent::EntityItemBreak), + }; + Some(BreakSound { sound: value }) + } +} +impl DefaultableComponent for Enchantments { + fn default_for_item(_item: Item) -> Option<Self> { + Some(Enchantments { + levels: HashMap::from_iter([]), + }) + } +} +#[rustfmt::skip] +static ITEM_MODEL_VALUES: [&str; 1416] = ["minecraft:air","minecraft:stone","minecraft:granite","minecraft:polished_granite","minecraft:diorite","minecraft:polished_diorite","minecraft:andesite","minecraft:polished_andesite","minecraft:deepslate","minecraft:cobbled_deepslate","minecraft:polished_deepslate","minecraft:calcite","minecraft:tuff","minecraft:tuff_slab","minecraft:tuff_stairs","minecraft:tuff_wall","minecraft:chiseled_tuff","minecraft:polished_tuff","minecraft:polished_tuff_slab","minecraft:polished_tuff_stairs","minecraft:polished_tuff_wall","minecraft:tuff_bricks","minecraft:tuff_brick_slab","minecraft:tuff_brick_stairs","minecraft:tuff_brick_wall","minecraft:chiseled_tuff_bricks","minecraft:dripstone_block","minecraft:grass_block","minecraft:dirt","minecraft:coarse_dirt","minecraft:podzol","minecraft:rooted_dirt","minecraft:mud","minecraft:crimson_nylium","minecraft:warped_nylium","minecraft:cobblestone","minecraft:oak_planks","minecraft:spruce_planks","minecraft:birch_planks","minecraft:jungle_planks","minecraft:acacia_planks","minecraft:cherry_planks","minecraft:dark_oak_planks","minecraft:pale_oak_planks","minecraft:mangrove_planks","minecraft:bamboo_planks","minecraft:crimson_planks","minecraft:warped_planks","minecraft:bamboo_mosaic","minecraft:oak_sapling","minecraft:spruce_sapling","minecraft:birch_sapling","minecraft:jungle_sapling","minecraft:acacia_sapling","minecraft:cherry_sapling","minecraft:dark_oak_sapling","minecraft:pale_oak_sapling","minecraft:mangrove_propagule","minecraft:bedrock","minecraft:sand","minecraft:suspicious_sand","minecraft:suspicious_gravel","minecraft:red_sand","minecraft:gravel","minecraft:coal_ore","minecraft:deepslate_coal_ore","minecraft:iron_ore","minecraft:deepslate_iron_ore","minecraft:copper_ore","minecraft:deepslate_copper_ore","minecraft:gold_ore","minecraft:deepslate_gold_ore","minecraft:redstone_ore","minecraft:deepslate_redstone_ore","minecraft:emerald_ore","minecraft:deepslate_emerald_ore","minecraft:lapis_ore","minecraft:deepslate_lapis_ore","minecraft:diamond_ore","minecraft:deepslate_diamond_ore","minecraft:nether_gold_ore","minecraft:nether_quartz_ore","minecraft:ancient_debris","minecraft:coal_block","minecraft:raw_iron_block","minecraft:raw_copper_block","minecraft:raw_gold_block","minecraft:heavy_core","minecraft:amethyst_block","minecraft:budding_amethyst","minecraft:iron_block","minecraft:copper_block","minecraft:gold_block","minecraft:diamond_block","minecraft:netherite_block","minecraft:exposed_copper","minecraft:weathered_copper","minecraft:oxidized_copper","minecraft:chiseled_copper","minecraft:exposed_chiseled_copper","minecraft:weathered_chiseled_copper","minecraft:oxidized_chiseled_copper","minecraft:cut_copper","minecraft:exposed_cut_copper","minecraft:weathered_cut_copper","minecraft:oxidized_cut_copper","minecraft:cut_copper_stairs","minecraft:exposed_cut_copper_stairs","minecraft:weathered_cut_copper_stairs","minecraft:oxidized_cut_copper_stairs","minecraft:cut_copper_slab","minecraft:exposed_cut_copper_slab","minecraft:weathered_cut_copper_slab","minecraft:oxidized_cut_copper_slab","minecraft:waxed_copper_block","minecraft:waxed_exposed_copper","minecraft:waxed_weathered_copper","minecraft:waxed_oxidized_copper","minecraft:waxed_chiseled_copper","minecraft:waxed_exposed_chiseled_copper","minecraft:waxed_weathered_chiseled_copper","minecraft:waxed_oxidized_chiseled_copper","minecraft:waxed_cut_copper","minecraft:waxed_exposed_cut_copper","minecraft:waxed_weathered_cut_copper","minecraft:waxed_oxidized_cut_copper","minecraft:waxed_cut_copper_stairs","minecraft:waxed_exposed_cut_copper_stairs","minecraft:waxed_weathered_cut_copper_stairs","minecraft:waxed_oxidized_cut_copper_stairs","minecraft:waxed_cut_copper_slab","minecraft:waxed_exposed_cut_copper_slab","minecraft:waxed_weathered_cut_copper_slab","minecraft:waxed_oxidized_cut_copper_slab","minecraft:oak_log","minecraft:spruce_log","minecraft:birch_log","minecraft:jungle_log","minecraft:acacia_log","minecraft:cherry_log","minecraft:pale_oak_log","minecraft:dark_oak_log","minecraft:mangrove_log","minecraft:mangrove_roots","minecraft:muddy_mangrove_roots","minecraft:crimson_stem","minecraft:warped_stem","minecraft:bamboo_block","minecraft:stripped_oak_log","minecraft:stripped_spruce_log","minecraft:stripped_birch_log","minecraft:stripped_jungle_log","minecraft:stripped_acacia_log","minecraft:stripped_cherry_log","minecraft:stripped_dark_oak_log","minecraft:stripped_pale_oak_log","minecraft:stripped_mangrove_log","minecraft:stripped_crimson_stem","minecraft:stripped_warped_stem","minecraft:stripped_oak_wood","minecraft:stripped_spruce_wood","minecraft:stripped_birch_wood","minecraft:stripped_jungle_wood","minecraft:stripped_acacia_wood","minecraft:stripped_cherry_wood","minecraft:stripped_dark_oak_wood","minecraft:stripped_pale_oak_wood","minecraft:stripped_mangrove_wood","minecraft:stripped_crimson_hyphae","minecraft:stripped_warped_hyphae","minecraft:stripped_bamboo_block","minecraft:oak_wood","minecraft:spruce_wood","minecraft:birch_wood","minecraft:jungle_wood","minecraft:acacia_wood","minecraft:cherry_wood","minecraft:pale_oak_wood","minecraft:dark_oak_wood","minecraft:mangrove_wood","minecraft:crimson_hyphae","minecraft:warped_hyphae","minecraft:oak_leaves","minecraft:spruce_leaves","minecraft:birch_leaves","minecraft:jungle_leaves","minecraft:acacia_leaves","minecraft:cherry_leaves","minecraft:dark_oak_leaves","minecraft:pale_oak_leaves","minecraft:mangrove_leaves","minecraft:azalea_leaves","minecraft:flowering_azalea_leaves","minecraft:sponge","minecraft:wet_sponge","minecraft:glass","minecraft:tinted_glass","minecraft:lapis_block","minecraft:sandstone","minecraft:chiseled_sandstone","minecraft:cut_sandstone","minecraft:cobweb","minecraft:short_grass","minecraft:fern","minecraft:bush","minecraft:azalea","minecraft:flowering_azalea","minecraft:dead_bush","minecraft:firefly_bush","minecraft:short_dry_grass","minecraft:tall_dry_grass","minecraft:seagrass","minecraft:sea_pickle","minecraft:white_wool","minecraft:orange_wool","minecraft:magenta_wool","minecraft:light_blue_wool","minecraft:yellow_wool","minecraft:lime_wool","minecraft:pink_wool","minecraft:gray_wool","minecraft:light_gray_wool","minecraft:cyan_wool","minecraft:purple_wool","minecraft:blue_wool","minecraft:brown_wool","minecraft:green_wool","minecraft:red_wool","minecraft:black_wool","minecraft:dandelion","minecraft:open_eyeblossom","minecraft:closed_eyeblossom","minecraft:poppy","minecraft:blue_orchid","minecraft:allium","minecraft:azure_bluet","minecraft:red_tulip","minecraft:orange_tulip","minecraft:white_tulip","minecraft:pink_tulip","minecraft:oxeye_daisy","minecraft:cornflower","minecraft:lily_of_the_valley","minecraft:wither_rose","minecraft:torchflower","minecraft:pitcher_plant","minecraft:spore_blossom","minecraft:brown_mushroom","minecraft:red_mushroom","minecraft:crimson_fungus","minecraft:warped_fungus","minecraft:crimson_roots","minecraft:warped_roots","minecraft:nether_sprouts","minecraft:weeping_vines","minecraft:twisting_vines","minecraft:sugar_cane","minecraft:kelp","minecraft:pink_petals","minecraft:wildflowers","minecraft:leaf_litter","minecraft:moss_carpet","minecraft:moss_block","minecraft:pale_moss_carpet","minecraft:pale_hanging_moss","minecraft:pale_moss_block","minecraft:hanging_roots","minecraft:big_dripleaf","minecraft:small_dripleaf","minecraft:bamboo","minecraft:oak_slab","minecraft:spruce_slab","minecraft:birch_slab","minecraft:jungle_slab","minecraft:acacia_slab","minecraft:cherry_slab","minecraft:dark_oak_slab","minecraft:pale_oak_slab","minecraft:mangrove_slab","minecraft:bamboo_slab","minecraft:bamboo_mosaic_slab","minecraft:crimson_slab","minecraft:warped_slab","minecraft:stone_slab","minecraft:smooth_stone_slab","minecraft:sandstone_slab","minecraft:cut_sandstone_slab","minecraft:petrified_oak_slab","minecraft:cobblestone_slab","minecraft:brick_slab","minecraft:stone_brick_slab","minecraft:mud_brick_slab","minecraft:nether_brick_slab","minecraft:quartz_slab","minecraft:red_sandstone_slab","minecraft:cut_red_sandstone_slab","minecraft:purpur_slab","minecraft:prismarine_slab","minecraft:prismarine_brick_slab","minecraft:dark_prismarine_slab","minecraft:smooth_quartz","minecraft:smooth_red_sandstone","minecraft:smooth_sandstone","minecraft:smooth_stone","minecraft:bricks","minecraft:bookshelf","minecraft:chiseled_bookshelf","minecraft:decorated_pot","minecraft:mossy_cobblestone","minecraft:obsidian","minecraft:torch","minecraft:end_rod","minecraft:chorus_plant","minecraft:chorus_flower","minecraft:purpur_block","minecraft:purpur_pillar","minecraft:purpur_stairs","minecraft:spawner","minecraft:creaking_heart","minecraft:chest","minecraft:crafting_table","minecraft:farmland","minecraft:furnace","minecraft:ladder","minecraft:cobblestone_stairs","minecraft:snow","minecraft:ice","minecraft:snow_block","minecraft:cactus","minecraft:cactus_flower","minecraft:clay","minecraft:jukebox","minecraft:oak_fence","minecraft:spruce_fence","minecraft:birch_fence","minecraft:jungle_fence","minecraft:acacia_fence","minecraft:cherry_fence","minecraft:dark_oak_fence","minecraft:pale_oak_fence","minecraft:mangrove_fence","minecraft:bamboo_fence","minecraft:crimson_fence","minecraft:warped_fence","minecraft:pumpkin","minecraft:carved_pumpkin","minecraft:jack_o_lantern","minecraft:netherrack","minecraft:soul_sand","minecraft:soul_soil","minecraft:basalt","minecraft:polished_basalt","minecraft:smooth_basalt","minecraft:soul_torch","minecraft:glowstone","minecraft:infested_stone","minecraft:infested_cobblestone","minecraft:infested_stone_bricks","minecraft:infested_mossy_stone_bricks","minecraft:infested_cracked_stone_bricks","minecraft:infested_chiseled_stone_bricks","minecraft:infested_deepslate","minecraft:stone_bricks","minecraft:mossy_stone_bricks","minecraft:cracked_stone_bricks","minecraft:chiseled_stone_bricks","minecraft:packed_mud","minecraft:mud_bricks","minecraft:deepslate_bricks","minecraft:cracked_deepslate_bricks","minecraft:deepslate_tiles","minecraft:cracked_deepslate_tiles","minecraft:chiseled_deepslate","minecraft:reinforced_deepslate","minecraft:brown_mushroom_block","minecraft:red_mushroom_block","minecraft:mushroom_stem","minecraft:iron_bars","minecraft:chain","minecraft:glass_pane","minecraft:melon","minecraft:vine","minecraft:glow_lichen","minecraft:resin_clump","minecraft:resin_block","minecraft:resin_bricks","minecraft:resin_brick_stairs","minecraft:resin_brick_slab","minecraft:resin_brick_wall","minecraft:chiseled_resin_bricks","minecraft:brick_stairs","minecraft:stone_brick_stairs","minecraft:mud_brick_stairs","minecraft:mycelium","minecraft:lily_pad","minecraft:nether_bricks","minecraft:cracked_nether_bricks","minecraft:chiseled_nether_bricks","minecraft:nether_brick_fence","minecraft:nether_brick_stairs","minecraft:sculk","minecraft:sculk_vein","minecraft:sculk_catalyst","minecraft:sculk_shrieker","minecraft:enchanting_table","minecraft:end_portal_frame","minecraft:end_stone","minecraft:end_stone_bricks","minecraft:dragon_egg","minecraft:sandstone_stairs","minecraft:ender_chest","minecraft:emerald_block","minecraft:oak_stairs","minecraft:spruce_stairs","minecraft:birch_stairs","minecraft:jungle_stairs","minecraft:acacia_stairs","minecraft:cherry_stairs","minecraft:dark_oak_stairs","minecraft:pale_oak_stairs","minecraft:mangrove_stairs","minecraft:bamboo_stairs","minecraft:bamboo_mosaic_stairs","minecraft:crimson_stairs","minecraft:warped_stairs","minecraft:command_block","minecraft:beacon","minecraft:cobblestone_wall","minecraft:mossy_cobblestone_wall","minecraft:brick_wall","minecraft:prismarine_wall","minecraft:red_sandstone_wall","minecraft:mossy_stone_brick_wall","minecraft:granite_wall","minecraft:stone_brick_wall","minecraft:mud_brick_wall","minecraft:nether_brick_wall","minecraft:andesite_wall","minecraft:red_nether_brick_wall","minecraft:sandstone_wall","minecraft:end_stone_brick_wall","minecraft:diorite_wall","minecraft:blackstone_wall","minecraft:polished_blackstone_wall","minecraft:polished_blackstone_brick_wall","minecraft:cobbled_deepslate_wall","minecraft:polished_deepslate_wall","minecraft:deepslate_brick_wall","minecraft:deepslate_tile_wall","minecraft:anvil","minecraft:chipped_anvil","minecraft:damaged_anvil","minecraft:chiseled_quartz_block","minecraft:quartz_block","minecraft:quartz_bricks","minecraft:quartz_pillar","minecraft:quartz_stairs","minecraft:white_terracotta","minecraft:orange_terracotta","minecraft:magenta_terracotta","minecraft:light_blue_terracotta","minecraft:yellow_terracotta","minecraft:lime_terracotta","minecraft:pink_terracotta","minecraft:gray_terracotta","minecraft:light_gray_terracotta","minecraft:cyan_terracotta","minecraft:purple_terracotta","minecraft:blue_terracotta","minecraft:brown_terracotta","minecraft:green_terracotta","minecraft:red_terracotta","minecraft:black_terracotta","minecraft:barrier","minecraft:light","minecraft:hay_block","minecraft:white_carpet","minecraft:orange_carpet","minecraft:magenta_carpet","minecraft:light_blue_carpet","minecraft:yellow_carpet","minecraft:lime_carpet","minecraft:pink_carpet","minecraft:gray_carpet","minecraft:light_gray_carpet","minecraft:cyan_carpet","minecraft:purple_carpet","minecraft:blue_carpet","minecraft:brown_carpet","minecraft:green_carpet","minecraft:red_carpet","minecraft:black_carpet","minecraft:terracotta","minecraft:packed_ice","minecraft:dirt_path","minecraft:sunflower","minecraft:lilac","minecraft:rose_bush","minecraft:peony","minecraft:tall_grass","minecraft:large_fern","minecraft:white_stained_glass","minecraft:orange_stained_glass","minecraft:magenta_stained_glass","minecraft:light_blue_stained_glass","minecraft:yellow_stained_glass","minecraft:lime_stained_glass","minecraft:pink_stained_glass","minecraft:gray_stained_glass","minecraft:light_gray_stained_glass","minecraft:cyan_stained_glass","minecraft:purple_stained_glass","minecraft:blue_stained_glass","minecraft:brown_stained_glass","minecraft:green_stained_glass","minecraft:red_stained_glass","minecraft:black_stained_glass","minecraft:white_stained_glass_pane","minecraft:orange_stained_glass_pane","minecraft:magenta_stained_glass_pane","minecraft:light_blue_stained_glass_pane","minecraft:yellow_stained_glass_pane","minecraft:lime_stained_glass_pane","minecraft:pink_stained_glass_pane","minecraft:gray_stained_glass_pane","minecraft:light_gray_stained_glass_pane","minecraft:cyan_stained_glass_pane","minecraft:purple_stained_glass_pane","minecraft:blue_stained_glass_pane","minecraft:brown_stained_glass_pane","minecraft:green_stained_glass_pane","minecraft:red_stained_glass_pane","minecraft:black_stained_glass_pane","minecraft:prismarine","minecraft:prismarine_bricks","minecraft:dark_prismarine","minecraft:prismarine_stairs","minecraft:prismarine_brick_stairs","minecraft:dark_prismarine_stairs","minecraft:sea_lantern","minecraft:red_sandstone","minecraft:chiseled_red_sandstone","minecraft:cut_red_sandstone","minecraft:red_sandstone_stairs","minecraft:repeating_command_block","minecraft:chain_command_block","minecraft:magma_block","minecraft:nether_wart_block","minecraft:warped_wart_block","minecraft:red_nether_bricks","minecraft:bone_block","minecraft:structure_void","minecraft:shulker_box","minecraft:white_shulker_box","minecraft:orange_shulker_box","minecraft:magenta_shulker_box","minecraft:light_blue_shulker_box","minecraft:yellow_shulker_box","minecraft:lime_shulker_box","minecraft:pink_shulker_box","minecraft:gray_shulker_box","minecraft:light_gray_shulker_box","minecraft:cyan_shulker_box","minecraft:purple_shulker_box","minecraft:blue_shulker_box","minecraft:brown_shulker_box","minecraft:green_shulker_box","minecraft:red_shulker_box","minecraft:black_shulker_box","minecraft:white_glazed_terracotta","minecraft:orange_glazed_terracotta","minecraft:magenta_glazed_terracotta","minecraft:light_blue_glazed_terracotta","minecraft:yellow_glazed_terracotta","minecraft:lime_glazed_terracotta","minecraft:pink_glazed_terracotta","minecraft:gray_glazed_terracotta","minecraft:light_gray_glazed_terracotta","minecraft:cyan_glazed_terracotta","minecraft:purple_glazed_terracotta","minecraft:blue_glazed_terracotta","minecraft:brown_glazed_terracotta","minecraft:green_glazed_terracotta","minecraft:red_glazed_terracotta","minecraft:black_glazed_terracotta","minecraft:white_concrete","minecraft:orange_concrete","minecraft:magenta_concrete","minecraft:light_blue_concrete","minecraft:yellow_concrete","minecraft:lime_concrete","minecraft:pink_concrete","minecraft:gray_concrete","minecraft:light_gray_concrete","minecraft:cyan_concrete","minecraft:purple_concrete","minecraft:blue_concrete","minecraft:brown_concrete","minecraft:green_concrete","minecraft:red_concrete","minecraft:black_concrete","minecraft:white_concrete_powder","minecraft:orange_concrete_powder","minecraft:magenta_concrete_powder","minecraft:light_blue_concrete_powder","minecraft:yellow_concrete_powder","minecraft:lime_concrete_powder","minecraft:pink_concrete_powder","minecraft:gray_concrete_powder","minecraft:light_gray_concrete_powder","minecraft:cyan_concrete_powder","minecraft:purple_concrete_powder","minecraft:blue_concrete_powder","minecraft:brown_concrete_powder","minecraft:green_concrete_powder","minecraft:red_concrete_powder","minecraft:black_concrete_powder","minecraft:turtle_egg","minecraft:sniffer_egg","minecraft:dried_ghast","minecraft:dead_tube_coral_block","minecraft:dead_brain_coral_block","minecraft:dead_bubble_coral_block","minecraft:dead_fire_coral_block","minecraft:dead_horn_coral_block","minecraft:tube_coral_block","minecraft:brain_coral_block","minecraft:bubble_coral_block","minecraft:fire_coral_block","minecraft:horn_coral_block","minecraft:tube_coral","minecraft:brain_coral","minecraft:bubble_coral","minecraft:fire_coral","minecraft:horn_coral","minecraft:dead_brain_coral","minecraft:dead_bubble_coral","minecraft:dead_fire_coral","minecraft:dead_horn_coral","minecraft:dead_tube_coral","minecraft:tube_coral_fan","minecraft:brain_coral_fan","minecraft:bubble_coral_fan","minecraft:fire_coral_fan","minecraft:horn_coral_fan","minecraft:dead_tube_coral_fan","minecraft:dead_brain_coral_fan","minecraft:dead_bubble_coral_fan","minecraft:dead_fire_coral_fan","minecraft:dead_horn_coral_fan","minecraft:blue_ice","minecraft:conduit","minecraft:polished_granite_stairs","minecraft:smooth_red_sandstone_stairs","minecraft:mossy_stone_brick_stairs","minecraft:polished_diorite_stairs","minecraft:mossy_cobblestone_stairs","minecraft:end_stone_brick_stairs","minecraft:stone_stairs","minecraft:smooth_sandstone_stairs","minecraft:smooth_quartz_stairs","minecraft:granite_stairs","minecraft:andesite_stairs","minecraft:red_nether_brick_stairs","minecraft:polished_andesite_stairs","minecraft:diorite_stairs","minecraft:cobbled_deepslate_stairs","minecraft:polished_deepslate_stairs","minecraft:deepslate_brick_stairs","minecraft:deepslate_tile_stairs","minecraft:polished_granite_slab","minecraft:smooth_red_sandstone_slab","minecraft:mossy_stone_brick_slab","minecraft:polished_diorite_slab","minecraft:mossy_cobblestone_slab","minecraft:end_stone_brick_slab","minecraft:smooth_sandstone_slab","minecraft:smooth_quartz_slab","minecraft:granite_slab","minecraft:andesite_slab","minecraft:red_nether_brick_slab","minecraft:polished_andesite_slab","minecraft:diorite_slab","minecraft:cobbled_deepslate_slab","minecraft:polished_deepslate_slab","minecraft:deepslate_brick_slab","minecraft:deepslate_tile_slab","minecraft:scaffolding","minecraft:redstone","minecraft:redstone_torch","minecraft:redstone_block","minecraft:repeater","minecraft:comparator","minecraft:piston","minecraft:sticky_piston","minecraft:slime_block","minecraft:honey_block","minecraft:observer","minecraft:hopper","minecraft:dispenser","minecraft:dropper","minecraft:lectern","minecraft:target","minecraft:lever","minecraft:lightning_rod","minecraft:daylight_detector","minecraft:sculk_sensor","minecraft:calibrated_sculk_sensor","minecraft:tripwire_hook","minecraft:trapped_chest","minecraft:tnt","minecraft:redstone_lamp","minecraft:note_block","minecraft:stone_button","minecraft:polished_blackstone_button","minecraft:oak_button","minecraft:spruce_button","minecraft:birch_button","minecraft:jungle_button","minecraft:acacia_button","minecraft:cherry_button","minecraft:dark_oak_button","minecraft:pale_oak_button","minecraft:mangrove_button","minecraft:bamboo_button","minecraft:crimson_button","minecraft:warped_button","minecraft:stone_pressure_plate","minecraft:polished_blackstone_pressure_plate","minecraft:light_weighted_pressure_plate","minecraft:heavy_weighted_pressure_plate","minecraft:oak_pressure_plate","minecraft:spruce_pressure_plate","minecraft:birch_pressure_plate","minecraft:jungle_pressure_plate","minecraft:acacia_pressure_plate","minecraft:cherry_pressure_plate","minecraft:dark_oak_pressure_plate","minecraft:pale_oak_pressure_plate","minecraft:mangrove_pressure_plate","minecraft:bamboo_pressure_plate","minecraft:crimson_pressure_plate","minecraft:warped_pressure_plate","minecraft:iron_door","minecraft:oak_door","minecraft:spruce_door","minecraft:birch_door","minecraft:jungle_door","minecraft:acacia_door","minecraft:cherry_door","minecraft:dark_oak_door","minecraft:pale_oak_door","minecraft:mangrove_door","minecraft:bamboo_door","minecraft:crimson_door","minecraft:warped_door","minecraft:copper_door","minecraft:exposed_copper_door","minecraft:weathered_copper_door","minecraft:oxidized_copper_door","minecraft:waxed_copper_door","minecraft:waxed_exposed_copper_door","minecraft:waxed_weathered_copper_door","minecraft:waxed_oxidized_copper_door","minecraft:iron_trapdoor","minecraft:oak_trapdoor","minecraft:spruce_trapdoor","minecraft:birch_trapdoor","minecraft:jungle_trapdoor","minecraft:acacia_trapdoor","minecraft:cherry_trapdoor","minecraft:dark_oak_trapdoor","minecraft:pale_oak_trapdoor","minecraft:mangrove_trapdoor","minecraft:bamboo_trapdoor","minecraft:crimson_trapdoor","minecraft:warped_trapdoor","minecraft:copper_trapdoor","minecraft:exposed_copper_trapdoor","minecraft:weathered_copper_trapdoor","minecraft:oxidized_copper_trapdoor","minecraft:waxed_copper_trapdoor","minecraft:waxed_exposed_copper_trapdoor","minecraft:waxed_weathered_copper_trapdoor","minecraft:waxed_oxidized_copper_trapdoor","minecraft:oak_fence_gate","minecraft:spruce_fence_gate","minecraft:birch_fence_gate","minecraft:jungle_fence_gate","minecraft:acacia_fence_gate","minecraft:cherry_fence_gate","minecraft:dark_oak_fence_gate","minecraft:pale_oak_fence_gate","minecraft:mangrove_fence_gate","minecraft:bamboo_fence_gate","minecraft:crimson_fence_gate","minecraft:warped_fence_gate","minecraft:powered_rail","minecraft:detector_rail","minecraft:rail","minecraft:activator_rail","minecraft:saddle","minecraft:white_harness","minecraft:orange_harness","minecraft:magenta_harness","minecraft:light_blue_harness","minecraft:yellow_harness","minecraft:lime_harness","minecraft:pink_harness","minecraft:gray_harness","minecraft:light_gray_harness","minecraft:cyan_harness","minecraft:purple_harness","minecraft:blue_harness","minecraft:brown_harness","minecraft:green_harness","minecraft:red_harness","minecraft:black_harness","minecraft:minecart","minecraft:chest_minecart","minecraft:furnace_minecart","minecraft:tnt_minecart","minecraft:hopper_minecart","minecraft:carrot_on_a_stick","minecraft:warped_fungus_on_a_stick","minecraft:phantom_membrane","minecraft:elytra","minecraft:oak_boat","minecraft:oak_chest_boat","minecraft:spruce_boat","minecraft:spruce_chest_boat","minecraft:birch_boat","minecraft:birch_chest_boat","minecraft:jungle_boat","minecraft:jungle_chest_boat","minecraft:acacia_boat","minecraft:acacia_chest_boat","minecraft:cherry_boat","minecraft:cherry_chest_boat","minecraft:dark_oak_boat","minecraft:dark_oak_chest_boat","minecraft:pale_oak_boat","minecraft:pale_oak_chest_boat","minecraft:mangrove_boat","minecraft:mangrove_chest_boat","minecraft:bamboo_raft","minecraft:bamboo_chest_raft","minecraft:structure_block","minecraft:jigsaw","minecraft:test_block","minecraft:test_instance_block","minecraft:turtle_helmet","minecraft:turtle_scute","minecraft:armadillo_scute","minecraft:wolf_armor","minecraft:flint_and_steel","minecraft:bowl","minecraft:apple","minecraft:bow","minecraft:arrow","minecraft:coal","minecraft:charcoal","minecraft:diamond","minecraft:emerald","minecraft:lapis_lazuli","minecraft:quartz","minecraft:amethyst_shard","minecraft:raw_iron","minecraft:iron_ingot","minecraft:raw_copper","minecraft:copper_ingot","minecraft:raw_gold","minecraft:gold_ingot","minecraft:netherite_ingot","minecraft:netherite_scrap","minecraft:wooden_sword","minecraft:wooden_shovel","minecraft:wooden_pickaxe","minecraft:wooden_axe","minecraft:wooden_hoe","minecraft:stone_sword","minecraft:stone_shovel","minecraft:stone_pickaxe","minecraft:stone_axe","minecraft:stone_hoe","minecraft:golden_sword","minecraft:golden_shovel","minecraft:golden_pickaxe","minecraft:golden_axe","minecraft:golden_hoe","minecraft:iron_sword","minecraft:iron_shovel","minecraft:iron_pickaxe","minecraft:iron_axe","minecraft:iron_hoe","minecraft:diamond_sword","minecraft:diamond_shovel","minecraft:diamond_pickaxe","minecraft:diamond_axe","minecraft:diamond_hoe","minecraft:netherite_sword","minecraft:netherite_shovel","minecraft:netherite_pickaxe","minecraft:netherite_axe","minecraft:netherite_hoe","minecraft:stick","minecraft:mushroom_stew","minecraft:string","minecraft:feather","minecraft:gunpowder","minecraft:wheat_seeds","minecraft:wheat","minecraft:bread","minecraft:leather_helmet","minecraft:leather_chestplate","minecraft:leather_leggings","minecraft:leather_boots","minecraft:chainmail_helmet","minecraft:chainmail_chestplate","minecraft:chainmail_leggings","minecraft:chainmail_boots","minecraft:iron_helmet","minecraft:iron_chestplate","minecraft:iron_leggings","minecraft:iron_boots","minecraft:diamond_helmet","minecraft:diamond_chestplate","minecraft:diamond_leggings","minecraft:diamond_boots","minecraft:golden_helmet","minecraft:golden_chestplate","minecraft:golden_leggings","minecraft:golden_boots","minecraft:netherite_helmet","minecraft:netherite_chestplate","minecraft:netherite_leggings","minecraft:netherite_boots","minecraft:flint","minecraft:porkchop","minecraft:cooked_porkchop","minecraft:painting","minecraft:golden_apple","minecraft:enchanted_golden_apple","minecraft:oak_sign","minecraft:spruce_sign","minecraft:birch_sign","minecraft:jungle_sign","minecraft:acacia_sign","minecraft:cherry_sign","minecraft:dark_oak_sign","minecraft:pale_oak_sign","minecraft:mangrove_sign","minecraft:bamboo_sign","minecraft:crimson_sign","minecraft:warped_sign","minecraft:oak_hanging_sign","minecraft:spruce_hanging_sign","minecraft:birch_hanging_sign","minecraft:jungle_hanging_sign","minecraft:acacia_hanging_sign","minecraft:cherry_hanging_sign","minecraft:dark_oak_hanging_sign","minecraft:pale_oak_hanging_sign","minecraft:mangrove_hanging_sign","minecraft:bamboo_hanging_sign","minecraft:crimson_hanging_sign","minecraft:warped_hanging_sign","minecraft:bucket","minecraft:water_bucket","minecraft:lava_bucket","minecraft:powder_snow_bucket","minecraft:snowball","minecraft:leather","minecraft:milk_bucket","minecraft:pufferfish_bucket","minecraft:salmon_bucket","minecraft:cod_bucket","minecraft:tropical_fish_bucket","minecraft:axolotl_bucket","minecraft:tadpole_bucket","minecraft:brick","minecraft:clay_ball","minecraft:dried_kelp_block","minecraft:paper","minecraft:book","minecraft:slime_ball","minecraft:egg","minecraft:blue_egg","minecraft:brown_egg","minecraft:compass","minecraft:recovery_compass","minecraft:bundle","minecraft:white_bundle","minecraft:orange_bundle","minecraft:magenta_bundle","minecraft:light_blue_bundle","minecraft:yellow_bundle","minecraft:lime_bundle","minecraft:pink_bundle","minecraft:gray_bundle","minecraft:light_gray_bundle","minecraft:cyan_bundle","minecraft:purple_bundle","minecraft:blue_bundle","minecraft:brown_bundle","minecraft:green_bundle","minecraft:red_bundle","minecraft:black_bundle","minecraft:fishing_rod","minecraft:clock","minecraft:spyglass","minecraft:glowstone_dust","minecraft:cod","minecraft:salmon","minecraft:tropical_fish","minecraft:pufferfish","minecraft:cooked_cod","minecraft:cooked_salmon","minecraft:ink_sac","minecraft:glow_ink_sac","minecraft:cocoa_beans","minecraft:white_dye","minecraft:orange_dye","minecraft:magenta_dye","minecraft:light_blue_dye","minecraft:yellow_dye","minecraft:lime_dye","minecraft:pink_dye","minecraft:gray_dye","minecraft:light_gray_dye","minecraft:cyan_dye","minecraft:purple_dye","minecraft:blue_dye","minecraft:brown_dye","minecraft:green_dye","minecraft:red_dye","minecraft:black_dye","minecraft:bone_meal","minecraft:bone","minecraft:sugar","minecraft:cake","minecraft:white_bed","minecraft:orange_bed","minecraft:magenta_bed","minecraft:light_blue_bed","minecraft:yellow_bed","minecraft:lime_bed","minecraft:pink_bed","minecraft:gray_bed","minecraft:light_gray_bed","minecraft:cyan_bed","minecraft:purple_bed","minecraft:blue_bed","minecraft:brown_bed","minecraft:green_bed","minecraft:red_bed","minecraft:black_bed","minecraft:cookie","minecraft:crafter","minecraft:filled_map","minecraft:shears","minecraft:melon_slice","minecraft:dried_kelp","minecraft:pumpkin_seeds","minecraft:melon_seeds","minecraft:beef","minecraft:cooked_beef","minecraft:chicken","minecraft:cooked_chicken","minecraft:rotten_flesh","minecraft:ender_pearl","minecraft:blaze_rod","minecraft:ghast_tear","minecraft:gold_nugget","minecraft:nether_wart","minecraft:glass_bottle","minecraft:potion","minecraft:spider_eye","minecraft:fermented_spider_eye","minecraft:blaze_powder","minecraft:magma_cream","minecraft:brewing_stand","minecraft:cauldron","minecraft:ender_eye","minecraft:glistering_melon_slice","minecraft:armadillo_spawn_egg","minecraft:allay_spawn_egg","minecraft:axolotl_spawn_egg","minecraft:bat_spawn_egg","minecraft:bee_spawn_egg","minecraft:blaze_spawn_egg","minecraft:bogged_spawn_egg","minecraft:breeze_spawn_egg","minecraft:cat_spawn_egg","minecraft:camel_spawn_egg","minecraft:cave_spider_spawn_egg","minecraft:chicken_spawn_egg","minecraft:cod_spawn_egg","minecraft:cow_spawn_egg","minecraft:creeper_spawn_egg","minecraft:dolphin_spawn_egg","minecraft:donkey_spawn_egg","minecraft:drowned_spawn_egg","minecraft:elder_guardian_spawn_egg","minecraft:ender_dragon_spawn_egg","minecraft:enderman_spawn_egg","minecraft:endermite_spawn_egg","minecraft:evoker_spawn_egg","minecraft:fox_spawn_egg","minecraft:frog_spawn_egg","minecraft:ghast_spawn_egg","minecraft:happy_ghast_spawn_egg","minecraft:glow_squid_spawn_egg","minecraft:goat_spawn_egg","minecraft:guardian_spawn_egg","minecraft:hoglin_spawn_egg","minecraft:horse_spawn_egg","minecraft:husk_spawn_egg","minecraft:iron_golem_spawn_egg","minecraft:llama_spawn_egg","minecraft:magma_cube_spawn_egg","minecraft:mooshroom_spawn_egg","minecraft:mule_spawn_egg","minecraft:ocelot_spawn_egg","minecraft:panda_spawn_egg","minecraft:parrot_spawn_egg","minecraft:phantom_spawn_egg","minecraft:pig_spawn_egg","minecraft:piglin_spawn_egg","minecraft:piglin_brute_spawn_egg","minecraft:pillager_spawn_egg","minecraft:polar_bear_spawn_egg","minecraft:pufferfish_spawn_egg","minecraft:rabbit_spawn_egg","minecraft:ravager_spawn_egg","minecraft:salmon_spawn_egg","minecraft:sheep_spawn_egg","minecraft:shulker_spawn_egg","minecraft:silverfish_spawn_egg","minecraft:skeleton_spawn_egg","minecraft:skeleton_horse_spawn_egg","minecraft:slime_spawn_egg","minecraft:sniffer_spawn_egg","minecraft:snow_golem_spawn_egg","minecraft:spider_spawn_egg","minecraft:squid_spawn_egg","minecraft:stray_spawn_egg","minecraft:strider_spawn_egg","minecraft:tadpole_spawn_egg","minecraft:trader_llama_spawn_egg","minecraft:tropical_fish_spawn_egg","minecraft:turtle_spawn_egg","minecraft:vex_spawn_egg","minecraft:villager_spawn_egg","minecraft:vindicator_spawn_egg","minecraft:wandering_trader_spawn_egg","minecraft:warden_spawn_egg","minecraft:witch_spawn_egg","minecraft:wither_spawn_egg","minecraft:wither_skeleton_spawn_egg","minecraft:wolf_spawn_egg","minecraft:zoglin_spawn_egg","minecraft:creaking_spawn_egg","minecraft:zombie_spawn_egg","minecraft:zombie_horse_spawn_egg","minecraft:zombie_villager_spawn_egg","minecraft:zombified_piglin_spawn_egg","minecraft:experience_bottle","minecraft:fire_charge","minecraft:wind_charge","minecraft:writable_book","minecraft:written_book","minecraft:breeze_rod","minecraft:mace","minecraft:item_frame","minecraft:glow_item_frame","minecraft:flower_pot","minecraft:carrot","minecraft:potato","minecraft:baked_potato","minecraft:poisonous_potato","minecraft:map","minecraft:golden_carrot","minecraft:skeleton_skull","minecraft:wither_skeleton_skull","minecraft:player_head","minecraft:zombie_head","minecraft:creeper_head","minecraft:dragon_head","minecraft:piglin_head","minecraft:nether_star","minecraft:pumpkin_pie","minecraft:firework_rocket","minecraft:firework_star","minecraft:enchanted_book","minecraft:nether_brick","minecraft:resin_brick","minecraft:prismarine_shard","minecraft:prismarine_crystals","minecraft:rabbit","minecraft:cooked_rabbit","minecraft:rabbit_stew","minecraft:rabbit_foot","minecraft:rabbit_hide","minecraft:armor_stand","minecraft:iron_horse_armor","minecraft:golden_horse_armor","minecraft:diamond_horse_armor","minecraft:leather_horse_armor","minecraft:lead","minecraft:name_tag","minecraft:command_block_minecart","minecraft:mutton","minecraft:cooked_mutton","minecraft:white_banner","minecraft:orange_banner","minecraft:magenta_banner","minecraft:light_blue_banner","minecraft:yellow_banner","minecraft:lime_banner","minecraft:pink_banner","minecraft:gray_banner","minecraft:light_gray_banner","minecraft:cyan_banner","minecraft:purple_banner","minecraft:blue_banner","minecraft:brown_banner","minecraft:green_banner","minecraft:red_banner","minecraft:black_banner","minecraft:end_crystal","minecraft:chorus_fruit","minecraft:popped_chorus_fruit","minecraft:torchflower_seeds","minecraft:pitcher_pod","minecraft:beetroot","minecraft:beetroot_seeds","minecraft:beetroot_soup","minecraft:dragon_breath","minecraft:splash_potion","minecraft:spectral_arrow","minecraft:tipped_arrow","minecraft:lingering_potion","minecraft:shield","minecraft:totem_of_undying","minecraft:shulker_shell","minecraft:iron_nugget","minecraft:knowledge_book","minecraft:debug_stick","minecraft:music_disc_13","minecraft:music_disc_cat","minecraft:music_disc_blocks","minecraft:music_disc_chirp","minecraft:music_disc_creator","minecraft:music_disc_creator_music_box","minecraft:music_disc_far","minecraft:music_disc_lava_chicken","minecraft:music_disc_mall","minecraft:music_disc_mellohi","minecraft:music_disc_stal","minecraft:music_disc_strad","minecraft:music_disc_ward","minecraft:music_disc_11","minecraft:music_disc_wait","minecraft:music_disc_otherside","minecraft:music_disc_relic","minecraft:music_disc_5","minecraft:music_disc_pigstep","minecraft:music_disc_precipice","minecraft:music_disc_tears","minecraft:disc_fragment_5","minecraft:trident","minecraft:nautilus_shell","minecraft:heart_of_the_sea","minecraft:crossbow","minecraft:suspicious_stew","minecraft:loom","minecraft:flower_banner_pattern","minecraft:creeper_banner_pattern","minecraft:skull_banner_pattern","minecraft:mojang_banner_pattern","minecraft:globe_banner_pattern","minecraft:piglin_banner_pattern","minecraft:flow_banner_pattern","minecraft:guster_banner_pattern","minecraft:field_masoned_banner_pattern","minecraft:bordure_indented_banner_pattern","minecraft:goat_horn","minecraft:composter","minecraft:barrel","minecraft:smoker","minecraft:blast_furnace","minecraft:cartography_table","minecraft:fletching_table","minecraft:grindstone","minecraft:smithing_table","minecraft:stonecutter","minecraft:bell","minecraft:lantern","minecraft:soul_lantern","minecraft:sweet_berries","minecraft:glow_berries","minecraft:campfire","minecraft:soul_campfire","minecraft:shroomlight","minecraft:honeycomb","minecraft:bee_nest","minecraft:beehive","minecraft:honey_bottle","minecraft:honeycomb_block","minecraft:lodestone","minecraft:crying_obsidian","minecraft:blackstone","minecraft:blackstone_slab","minecraft:blackstone_stairs","minecraft:gilded_blackstone","minecraft:polished_blackstone","minecraft:polished_blackstone_slab","minecraft:polished_blackstone_stairs","minecraft:chiseled_polished_blackstone","minecraft:polished_blackstone_bricks","minecraft:polished_blackstone_brick_slab","minecraft:polished_blackstone_brick_stairs","minecraft:cracked_polished_blackstone_bricks","minecraft:respawn_anchor","minecraft:candle","minecraft:white_candle","minecraft:orange_candle","minecraft:magenta_candle","minecraft:light_blue_candle","minecraft:yellow_candle","minecraft:lime_candle","minecraft:pink_candle","minecraft:gray_candle","minecraft:light_gray_candle","minecraft:cyan_candle","minecraft:purple_candle","minecraft:blue_candle","minecraft:brown_candle","minecraft:green_candle","minecraft:red_candle","minecraft:black_candle","minecraft:small_amethyst_bud","minecraft:medium_amethyst_bud","minecraft:large_amethyst_bud","minecraft:amethyst_cluster","minecraft:pointed_dripstone","minecraft:ochre_froglight","minecraft:verdant_froglight","minecraft:pearlescent_froglight","minecraft:frogspawn","minecraft:echo_shard","minecraft:brush","minecraft:netherite_upgrade_smithing_template","minecraft:sentry_armor_trim_smithing_template","minecraft:dune_armor_trim_smithing_template","minecraft:coast_armor_trim_smithing_template","minecraft:wild_armor_trim_smithing_template","minecraft:ward_armor_trim_smithing_template","minecraft:eye_armor_trim_smithing_template","minecraft:vex_armor_trim_smithing_template","minecraft:tide_armor_trim_smithing_template","minecraft:snout_armor_trim_smithing_template","minecraft:rib_armor_trim_smithing_template","minecraft:spire_armor_trim_smithing_template","minecraft:wayfinder_armor_trim_smithing_template","minecraft:shaper_armor_trim_smithing_template","minecraft:silence_armor_trim_smithing_template","minecraft:raiser_armor_trim_smithing_template","minecraft:host_armor_trim_smithing_template","minecraft:flow_armor_trim_smithing_template","minecraft:bolt_armor_trim_smithing_template","minecraft:angler_pottery_sherd","minecraft:archer_pottery_sherd","minecraft:arms_up_pottery_sherd","minecraft:blade_pottery_sherd","minecraft:brewer_pottery_sherd","minecraft:burn_pottery_sherd","minecraft:danger_pottery_sherd","minecraft:explorer_pottery_sherd","minecraft:flow_pottery_sherd","minecraft:friend_pottery_sherd","minecraft:guster_pottery_sherd","minecraft:heart_pottery_sherd","minecraft:heartbreak_pottery_sherd","minecraft:howl_pottery_sherd","minecraft:miner_pottery_sherd","minecraft:mourner_pottery_sherd","minecraft:plenty_pottery_sherd","minecraft:prize_pottery_sherd","minecraft:scrape_pottery_sherd","minecraft:sheaf_pottery_sherd","minecraft:shelter_pottery_sherd","minecraft:skull_pottery_sherd","minecraft:snort_pottery_sherd","minecraft:copper_grate","minecraft:exposed_copper_grate","minecraft:weathered_copper_grate","minecraft:oxidized_copper_grate","minecraft:waxed_copper_grate","minecraft:waxed_exposed_copper_grate","minecraft:waxed_weathered_copper_grate","minecraft:waxed_oxidized_copper_grate","minecraft:copper_bulb","minecraft:exposed_copper_bulb","minecraft:weathered_copper_bulb","minecraft:oxidized_copper_bulb","minecraft:waxed_copper_bulb","minecraft:waxed_exposed_copper_bulb","minecraft:waxed_weathered_copper_bulb","minecraft:waxed_oxidized_copper_bulb","minecraft:trial_spawner","minecraft:trial_key","minecraft:ominous_trial_key","minecraft:vault","minecraft:ominous_bottle"]; +impl DefaultableComponent for ItemModel { + fn default_for_item(item: Item) -> Option<Self> { + let value = ITEM_MODEL_VALUES[item as usize]; + Some(ItemModel { + resource_location: value.into(), + }) + } +} +#[rustfmt::skip] +static ITEM_NAME_VALUES: [&str; 1416] = ["block.minecraft.air","block.minecraft.stone","block.minecraft.granite","block.minecraft.polished_granite","block.minecraft.diorite","block.minecraft.polished_diorite","block.minecraft.andesite","block.minecraft.polished_andesite","block.minecraft.deepslate","block.minecraft.cobbled_deepslate","block.minecraft.polished_deepslate","block.minecraft.calcite","block.minecraft.tuff","block.minecraft.tuff_slab","block.minecraft.tuff_stairs","block.minecraft.tuff_wall","block.minecraft.chiseled_tuff","block.minecraft.polished_tuff","block.minecraft.polished_tuff_slab","block.minecraft.polished_tuff_stairs","block.minecraft.polished_tuff_wall","block.minecraft.tuff_bricks","block.minecraft.tuff_brick_slab","block.minecraft.tuff_brick_stairs","block.minecraft.tuff_brick_wall","block.minecraft.chiseled_tuff_bricks","block.minecraft.dripstone_block","block.minecraft.grass_block","block.minecraft.dirt","block.minecraft.coarse_dirt","block.minecraft.podzol","block.minecraft.rooted_dirt","block.minecraft.mud","block.minecraft.crimson_nylium","block.minecraft.warped_nylium","block.minecraft.cobblestone","block.minecraft.oak_planks","block.minecraft.spruce_planks","block.minecraft.birch_planks","block.minecraft.jungle_planks","block.minecraft.acacia_planks","block.minecraft.cherry_planks","block.minecraft.dark_oak_planks","block.minecraft.pale_oak_planks","block.minecraft.mangrove_planks","block.minecraft.bamboo_planks","block.minecraft.crimson_planks","block.minecraft.warped_planks","block.minecraft.bamboo_mosaic","block.minecraft.oak_sapling","block.minecraft.spruce_sapling","block.minecraft.birch_sapling","block.minecraft.jungle_sapling","block.minecraft.acacia_sapling","block.minecraft.cherry_sapling","block.minecraft.dark_oak_sapling","block.minecraft.pale_oak_sapling","block.minecraft.mangrove_propagule","block.minecraft.bedrock","block.minecraft.sand","block.minecraft.suspicious_sand","block.minecraft.suspicious_gravel","block.minecraft.red_sand","block.minecraft.gravel","block.minecraft.coal_ore","block.minecraft.deepslate_coal_ore","block.minecraft.iron_ore","block.minecraft.deepslate_iron_ore","block.minecraft.copper_ore","block.minecraft.deepslate_copper_ore","block.minecraft.gold_ore","block.minecraft.deepslate_gold_ore","block.minecraft.redstone_ore","block.minecraft.deepslate_redstone_ore","block.minecraft.emerald_ore","block.minecraft.deepslate_emerald_ore","block.minecraft.lapis_ore","block.minecraft.deepslate_lapis_ore","block.minecraft.diamond_ore","block.minecraft.deepslate_diamond_ore","block.minecraft.nether_gold_ore","block.minecraft.nether_quartz_ore","block.minecraft.ancient_debris","block.minecraft.coal_block","block.minecraft.raw_iron_block","block.minecraft.raw_copper_block","block.minecraft.raw_gold_block","block.minecraft.heavy_core","block.minecraft.amethyst_block","block.minecraft.budding_amethyst","block.minecraft.iron_block","block.minecraft.copper_block","block.minecraft.gold_block","block.minecraft.diamond_block","block.minecraft.netherite_block","block.minecraft.exposed_copper","block.minecraft.weathered_copper","block.minecraft.oxidized_copper","block.minecraft.chiseled_copper","block.minecraft.exposed_chiseled_copper","block.minecraft.weathered_chiseled_copper","block.minecraft.oxidized_chiseled_copper","block.minecraft.cut_copper","block.minecraft.exposed_cut_copper","block.minecraft.weathered_cut_copper","block.minecraft.oxidized_cut_copper","block.minecraft.cut_copper_stairs","block.minecraft.exposed_cut_copper_stairs","block.minecraft.weathered_cut_copper_stairs","block.minecraft.oxidized_cut_copper_stairs","block.minecraft.cut_copper_slab","block.minecraft.exposed_cut_copper_slab","block.minecraft.weathered_cut_copper_slab","block.minecraft.oxidized_cut_copper_slab","block.minecraft.waxed_copper_block","block.minecraft.waxed_exposed_copper","block.minecraft.waxed_weathered_copper","block.minecraft.waxed_oxidized_copper","block.minecraft.waxed_chiseled_copper","block.minecraft.waxed_exposed_chiseled_copper","block.minecraft.waxed_weathered_chiseled_copper","block.minecraft.waxed_oxidized_chiseled_copper","block.minecraft.waxed_cut_copper","block.minecraft.waxed_exposed_cut_copper","block.minecraft.waxed_weathered_cut_copper","block.minecraft.waxed_oxidized_cut_copper","block.minecraft.waxed_cut_copper_stairs","block.minecraft.waxed_exposed_cut_copper_stairs","block.minecraft.waxed_weathered_cut_copper_stairs","block.minecraft.waxed_oxidized_cut_copper_stairs","block.minecraft.waxed_cut_copper_slab","block.minecraft.waxed_exposed_cut_copper_slab","block.minecraft.waxed_weathered_cut_copper_slab","block.minecraft.waxed_oxidized_cut_copper_slab","block.minecraft.oak_log","block.minecraft.spruce_log","block.minecraft.birch_log","block.minecraft.jungle_log","block.minecraft.acacia_log","block.minecraft.cherry_log","block.minecraft.pale_oak_log","block.minecraft.dark_oak_log","block.minecraft.mangrove_log","block.minecraft.mangrove_roots","block.minecraft.muddy_mangrove_roots","block.minecraft.crimson_stem","block.minecraft.warped_stem","block.minecraft.bamboo_block","block.minecraft.stripped_oak_log","block.minecraft.stripped_spruce_log","block.minecraft.stripped_birch_log","block.minecraft.stripped_jungle_log","block.minecraft.stripped_acacia_log","block.minecraft.stripped_cherry_log","block.minecraft.stripped_dark_oak_log","block.minecraft.stripped_pale_oak_log","block.minecraft.stripped_mangrove_log","block.minecraft.stripped_crimson_stem","block.minecraft.stripped_warped_stem","block.minecraft.stripped_oak_wood","block.minecraft.stripped_spruce_wood","block.minecraft.stripped_birch_wood","block.minecraft.stripped_jungle_wood","block.minecraft.stripped_acacia_wood","block.minecraft.stripped_cherry_wood","block.minecraft.stripped_dark_oak_wood","block.minecraft.stripped_pale_oak_wood","block.minecraft.stripped_mangrove_wood","block.minecraft.stripped_crimson_hyphae","block.minecraft.stripped_warped_hyphae","block.minecraft.stripped_bamboo_block","block.minecraft.oak_wood","block.minecraft.spruce_wood","block.minecraft.birch_wood","block.minecraft.jungle_wood","block.minecraft.acacia_wood","block.minecraft.cherry_wood","block.minecraft.pale_oak_wood","block.minecraft.dark_oak_wood","block.minecraft.mangrove_wood","block.minecraft.crimson_hyphae","block.minecraft.warped_hyphae","block.minecraft.oak_leaves","block.minecraft.spruce_leaves","block.minecraft.birch_leaves","block.minecraft.jungle_leaves","block.minecraft.acacia_leaves","block.minecraft.cherry_leaves","block.minecraft.dark_oak_leaves","block.minecraft.pale_oak_leaves","block.minecraft.mangrove_leaves","block.minecraft.azalea_leaves","block.minecraft.flowering_azalea_leaves","block.minecraft.sponge","block.minecraft.wet_sponge","block.minecraft.glass","block.minecraft.tinted_glass","block.minecraft.lapis_block","block.minecraft.sandstone","block.minecraft.chiseled_sandstone","block.minecraft.cut_sandstone","block.minecraft.cobweb","block.minecraft.short_grass","block.minecraft.fern","block.minecraft.bush","block.minecraft.azalea","block.minecraft.flowering_azalea","block.minecraft.dead_bush","block.minecraft.firefly_bush","block.minecraft.short_dry_grass","block.minecraft.tall_dry_grass","block.minecraft.seagrass","block.minecraft.sea_pickle","block.minecraft.white_wool","block.minecraft.orange_wool","block.minecraft.magenta_wool","block.minecraft.light_blue_wool","block.minecraft.yellow_wool","block.minecraft.lime_wool","block.minecraft.pink_wool","block.minecraft.gray_wool","block.minecraft.light_gray_wool","block.minecraft.cyan_wool","block.minecraft.purple_wool","block.minecraft.blue_wool","block.minecraft.brown_wool","block.minecraft.green_wool","block.minecraft.red_wool","block.minecraft.black_wool","block.minecraft.dandelion","block.minecraft.open_eyeblossom","block.minecraft.closed_eyeblossom","block.minecraft.poppy","block.minecraft.blue_orchid","block.minecraft.allium","block.minecraft.azure_bluet","block.minecraft.red_tulip","block.minecraft.orange_tulip","block.minecraft.white_tulip","block.minecraft.pink_tulip","block.minecraft.oxeye_daisy","block.minecraft.cornflower","block.minecraft.lily_of_the_valley","block.minecraft.wither_rose","block.minecraft.torchflower","block.minecraft.pitcher_plant","block.minecraft.spore_blossom","block.minecraft.brown_mushroom","block.minecraft.red_mushroom","block.minecraft.crimson_fungus","block.minecraft.warped_fungus","block.minecraft.crimson_roots","block.minecraft.warped_roots","block.minecraft.nether_sprouts","block.minecraft.weeping_vines","block.minecraft.twisting_vines","block.minecraft.sugar_cane","block.minecraft.kelp","block.minecraft.pink_petals","block.minecraft.wildflowers","block.minecraft.leaf_litter","block.minecraft.moss_carpet","block.minecraft.moss_block","block.minecraft.pale_moss_carpet","block.minecraft.pale_hanging_moss","block.minecraft.pale_moss_block","block.minecraft.hanging_roots","block.minecraft.big_dripleaf","block.minecraft.small_dripleaf","block.minecraft.bamboo","block.minecraft.oak_slab","block.minecraft.spruce_slab","block.minecraft.birch_slab","block.minecraft.jungle_slab","block.minecraft.acacia_slab","block.minecraft.cherry_slab","block.minecraft.dark_oak_slab","block.minecraft.pale_oak_slab","block.minecraft.mangrove_slab","block.minecraft.bamboo_slab","block.minecraft.bamboo_mosaic_slab","block.minecraft.crimson_slab","block.minecraft.warped_slab","block.minecraft.stone_slab","block.minecraft.smooth_stone_slab","block.minecraft.sandstone_slab","block.minecraft.cut_sandstone_slab","block.minecraft.petrified_oak_slab","block.minecraft.cobblestone_slab","block.minecraft.brick_slab","block.minecraft.stone_brick_slab","block.minecraft.mud_brick_slab","block.minecraft.nether_brick_slab","block.minecraft.quartz_slab","block.minecraft.red_sandstone_slab","block.minecraft.cut_red_sandstone_slab","block.minecraft.purpur_slab","block.minecraft.prismarine_slab","block.minecraft.prismarine_brick_slab","block.minecraft.dark_prismarine_slab","block.minecraft.smooth_quartz","block.minecraft.smooth_red_sandstone","block.minecraft.smooth_sandstone","block.minecraft.smooth_stone","block.minecraft.bricks","block.minecraft.bookshelf","block.minecraft.chiseled_bookshelf","block.minecraft.decorated_pot","block.minecraft.mossy_cobblestone","block.minecraft.obsidian","block.minecraft.torch","block.minecraft.end_rod","block.minecraft.chorus_plant","block.minecraft.chorus_flower","block.minecraft.purpur_block","block.minecraft.purpur_pillar","block.minecraft.purpur_stairs","block.minecraft.spawner","block.minecraft.creaking_heart","block.minecraft.chest","block.minecraft.crafting_table","block.minecraft.farmland","block.minecraft.furnace","block.minecraft.ladder","block.minecraft.cobblestone_stairs","block.minecraft.snow","block.minecraft.ice","block.minecraft.snow_block","block.minecraft.cactus","block.minecraft.cactus_flower","block.minecraft.clay","block.minecraft.jukebox","block.minecraft.oak_fence","block.minecraft.spruce_fence","block.minecraft.birch_fence","block.minecraft.jungle_fence","block.minecraft.acacia_fence","block.minecraft.cherry_fence","block.minecraft.dark_oak_fence","block.minecraft.pale_oak_fence","block.minecraft.mangrove_fence","block.minecraft.bamboo_fence","block.minecraft.crimson_fence","block.minecraft.warped_fence","block.minecraft.pumpkin","block.minecraft.carved_pumpkin","block.minecraft.jack_o_lantern","block.minecraft.netherrack","block.minecraft.soul_sand","block.minecraft.soul_soil","block.minecraft.basalt","block.minecraft.polished_basalt","block.minecraft.smooth_basalt","block.minecraft.soul_torch","block.minecraft.glowstone","block.minecraft.infested_stone","block.minecraft.infested_cobblestone","block.minecraft.infested_stone_bricks","block.minecraft.infested_mossy_stone_bricks","block.minecraft.infested_cracked_stone_bricks","block.minecraft.infested_chiseled_stone_bricks","block.minecraft.infested_deepslate","block.minecraft.stone_bricks","block.minecraft.mossy_stone_bricks","block.minecraft.cracked_stone_bricks","block.minecraft.chiseled_stone_bricks","block.minecraft.packed_mud","block.minecraft.mud_bricks","block.minecraft.deepslate_bricks","block.minecraft.cracked_deepslate_bricks","block.minecraft.deepslate_tiles","block.minecraft.cracked_deepslate_tiles","block.minecraft.chiseled_deepslate","block.minecraft.reinforced_deepslate","block.minecraft.brown_mushroom_block","block.minecraft.red_mushroom_block","block.minecraft.mushroom_stem","block.minecraft.iron_bars","block.minecraft.chain","block.minecraft.glass_pane","block.minecraft.melon","block.minecraft.vine","block.minecraft.glow_lichen","item.minecraft.resin_clump","block.minecraft.resin_block","block.minecraft.resin_bricks","block.minecraft.resin_brick_stairs","block.minecraft.resin_brick_slab","block.minecraft.resin_brick_wall","block.minecraft.chiseled_resin_bricks","block.minecraft.brick_stairs","block.minecraft.stone_brick_stairs","block.minecraft.mud_brick_stairs","block.minecraft.mycelium","block.minecraft.lily_pad","block.minecraft.nether_bricks","block.minecraft.cracked_nether_bricks","block.minecraft.chiseled_nether_bricks","block.minecraft.nether_brick_fence","block.minecraft.nether_brick_stairs","block.minecraft.sculk","block.minecraft.sculk_vein","block.minecraft.sculk_catalyst","block.minecraft.sculk_shrieker","block.minecraft.enchanting_table","block.minecraft.end_portal_frame","block.minecraft.end_stone","block.minecraft.end_stone_bricks","block.minecraft.dragon_egg","block.minecraft.sandstone_stairs","block.minecraft.ender_chest","block.minecraft.emerald_block","block.minecraft.oak_stairs","block.minecraft.spruce_stairs","block.minecraft.birch_stairs","block.minecraft.jungle_stairs","block.minecraft.acacia_stairs","block.minecraft.cherry_stairs","block.minecraft.dark_oak_stairs","block.minecraft.pale_oak_stairs","block.minecraft.mangrove_stairs","block.minecraft.bamboo_stairs","block.minecraft.bamboo_mosaic_stairs","block.minecraft.crimson_stairs","block.minecraft.warped_stairs","block.minecraft.command_block","block.minecraft.beacon","block.minecraft.cobblestone_wall","block.minecraft.mossy_cobblestone_wall","block.minecraft.brick_wall","block.minecraft.prismarine_wall","block.minecraft.red_sandstone_wall","block.minecraft.mossy_stone_brick_wall","block.minecraft.granite_wall","block.minecraft.stone_brick_wall","block.minecraft.mud_brick_wall","block.minecraft.nether_brick_wall","block.minecraft.andesite_wall","block.minecraft.red_nether_brick_wall","block.minecraft.sandstone_wall","block.minecraft.end_stone_brick_wall","block.minecraft.diorite_wall","block.minecraft.blackstone_wall","block.minecraft.polished_blackstone_wall","block.minecraft.polished_blackstone_brick_wall","block.minecraft.cobbled_deepslate_wall","block.minecraft.polished_deepslate_wall","block.minecraft.deepslate_brick_wall","block.minecraft.deepslate_tile_wall","block.minecraft.anvil","block.minecraft.chipped_anvil","block.minecraft.damaged_anvil","block.minecraft.chiseled_quartz_block","block.minecraft.quartz_block","block.minecraft.quartz_bricks","block.minecraft.quartz_pillar","block.minecraft.quartz_stairs","block.minecraft.white_terracotta","block.minecraft.orange_terracotta","block.minecraft.magenta_terracotta","block.minecraft.light_blue_terracotta","block.minecraft.yellow_terracotta","block.minecraft.lime_terracotta","block.minecraft.pink_terracotta","block.minecraft.gray_terracotta","block.minecraft.light_gray_terracotta","block.minecraft.cyan_terracotta","block.minecraft.purple_terracotta","block.minecraft.blue_terracotta","block.minecraft.brown_terracotta","block.minecraft.green_terracotta","block.minecraft.red_terracotta","block.minecraft.black_terracotta","block.minecraft.barrier","block.minecraft.light","block.minecraft.hay_block","block.minecraft.white_carpet","block.minecraft.orange_carpet","block.minecraft.magenta_carpet","block.minecraft.light_blue_carpet","block.minecraft.yellow_carpet","block.minecraft.lime_carpet","block.minecraft.pink_carpet","block.minecraft.gray_carpet","block.minecraft.light_gray_carpet","block.minecraft.cyan_carpet","block.minecraft.purple_carpet","block.minecraft.blue_carpet","block.minecraft.brown_carpet","block.minecraft.green_carpet","block.minecraft.red_carpet","block.minecraft.black_carpet","block.minecraft.terracotta","block.minecraft.packed_ice","block.minecraft.dirt_path","block.minecraft.sunflower","block.minecraft.lilac","block.minecraft.rose_bush","block.minecraft.peony","block.minecraft.tall_grass","block.minecraft.large_fern","block.minecraft.white_stained_glass","block.minecraft.orange_stained_glass","block.minecraft.magenta_stained_glass","block.minecraft.light_blue_stained_glass","block.minecraft.yellow_stained_glass","block.minecraft.lime_stained_glass","block.minecraft.pink_stained_glass","block.minecraft.gray_stained_glass","block.minecraft.light_gray_stained_glass","block.minecraft.cyan_stained_glass","block.minecraft.purple_stained_glass","block.minecraft.blue_stained_glass","block.minecraft.brown_stained_glass","block.minecraft.green_stained_glass","block.minecraft.red_stained_glass","block.minecraft.black_stained_glass","block.minecraft.white_stained_glass_pane","block.minecraft.orange_stained_glass_pane","block.minecraft.magenta_stained_glass_pane","block.minecraft.light_blue_stained_glass_pane","block.minecraft.yellow_stained_glass_pane","block.minecraft.lime_stained_glass_pane","block.minecraft.pink_stained_glass_pane","block.minecraft.gray_stained_glass_pane","block.minecraft.light_gray_stained_glass_pane","block.minecraft.cyan_stained_glass_pane","block.minecraft.purple_stained_glass_pane","block.minecraft.blue_stained_glass_pane","block.minecraft.brown_stained_glass_pane","block.minecraft.green_stained_glass_pane","block.minecraft.red_stained_glass_pane","block.minecraft.black_stained_glass_pane","block.minecraft.prismarine","block.minecraft.prismarine_bricks","block.minecraft.dark_prismarine","block.minecraft.prismarine_stairs","block.minecraft.prismarine_brick_stairs","block.minecraft.dark_prismarine_stairs","block.minecraft.sea_lantern","block.minecraft.red_sandstone","block.minecraft.chiseled_red_sandstone","block.minecraft.cut_red_sandstone","block.minecraft.red_sandstone_stairs","block.minecraft.repeating_command_block","block.minecraft.chain_command_block","block.minecraft.magma_block","block.minecraft.nether_wart_block","block.minecraft.warped_wart_block","block.minecraft.red_nether_bricks","block.minecraft.bone_block","block.minecraft.structure_void","block.minecraft.shulker_box","block.minecraft.white_shulker_box","block.minecraft.orange_shulker_box","block.minecraft.magenta_shulker_box","block.minecraft.light_blue_shulker_box","block.minecraft.yellow_shulker_box","block.minecraft.lime_shulker_box","block.minecraft.pink_shulker_box","block.minecraft.gray_shulker_box","block.minecraft.light_gray_shulker_box","block.minecraft.cyan_shulker_box","block.minecraft.purple_shulker_box","block.minecraft.blue_shulker_box","block.minecraft.brown_shulker_box","block.minecraft.green_shulker_box","block.minecraft.red_shulker_box","block.minecraft.black_shulker_box","block.minecraft.white_glazed_terracotta","block.minecraft.orange_glazed_terracotta","block.minecraft.magenta_glazed_terracotta","block.minecraft.light_blue_glazed_terracotta","block.minecraft.yellow_glazed_terracotta","block.minecraft.lime_glazed_terracotta","block.minecraft.pink_glazed_terracotta","block.minecraft.gray_glazed_terracotta","block.minecraft.light_gray_glazed_terracotta","block.minecraft.cyan_glazed_terracotta","block.minecraft.purple_glazed_terracotta","block.minecraft.blue_glazed_terracotta","block.minecraft.brown_glazed_terracotta","block.minecraft.green_glazed_terracotta","block.minecraft.red_glazed_terracotta","block.minecraft.black_glazed_terracotta","block.minecraft.white_concrete","block.minecraft.orange_concrete","block.minecraft.magenta_concrete","block.minecraft.light_blue_concrete","block.minecraft.yellow_concrete","block.minecraft.lime_concrete","block.minecraft.pink_concrete","block.minecraft.gray_concrete","block.minecraft.light_gray_concrete","block.minecraft.cyan_concrete","block.minecraft.purple_concrete","block.minecraft.blue_concrete","block.minecraft.brown_concrete","block.minecraft.green_concrete","block.minecraft.red_concrete","block.minecraft.black_concrete","block.minecraft.white_concrete_powder","block.minecraft.orange_concrete_powder","block.minecraft.magenta_concrete_powder","block.minecraft.light_blue_concrete_powder","block.minecraft.yellow_concrete_powder","block.minecraft.lime_concrete_powder","block.minecraft.pink_concrete_powder","block.minecraft.gray_concrete_powder","block.minecraft.light_gray_concrete_powder","block.minecraft.cyan_concrete_powder","block.minecraft.purple_concrete_powder","block.minecraft.blue_concrete_powder","block.minecraft.brown_concrete_powder","block.minecraft.green_concrete_powder","block.minecraft.red_concrete_powder","block.minecraft.black_concrete_powder","block.minecraft.turtle_egg","block.minecraft.sniffer_egg","block.minecraft.dried_ghast","block.minecraft.dead_tube_coral_block","block.minecraft.dead_brain_coral_block","block.minecraft.dead_bubble_coral_block","block.minecraft.dead_fire_coral_block","block.minecraft.dead_horn_coral_block","block.minecraft.tube_coral_block","block.minecraft.brain_coral_block","block.minecraft.bubble_coral_block","block.minecraft.fire_coral_block","block.minecraft.horn_coral_block","block.minecraft.tube_coral","block.minecraft.brain_coral","block.minecraft.bubble_coral","block.minecraft.fire_coral","block.minecraft.horn_coral","block.minecraft.dead_brain_coral","block.minecraft.dead_bubble_coral","block.minecraft.dead_fire_coral","block.minecraft.dead_horn_coral","block.minecraft.dead_tube_coral","block.minecraft.tube_coral_fan","block.minecraft.brain_coral_fan","block.minecraft.bubble_coral_fan","block.minecraft.fire_coral_fan","block.minecraft.horn_coral_fan","block.minecraft.dead_tube_coral_fan","block.minecraft.dead_brain_coral_fan","block.minecraft.dead_bubble_coral_fan","block.minecraft.dead_fire_coral_fan","block.minecraft.dead_horn_coral_fan","block.minecraft.blue_ice","block.minecraft.conduit","block.minecraft.polished_granite_stairs","block.minecraft.smooth_red_sandstone_stairs","block.minecraft.mossy_stone_brick_stairs","block.minecraft.polished_diorite_stairs","block.minecraft.mossy_cobblestone_stairs","block.minecraft.end_stone_brick_stairs","block.minecraft.stone_stairs","block.minecraft.smooth_sandstone_stairs","block.minecraft.smooth_quartz_stairs","block.minecraft.granite_stairs","block.minecraft.andesite_stairs","block.minecraft.red_nether_brick_stairs","block.minecraft.polished_andesite_stairs","block.minecraft.diorite_stairs","block.minecraft.cobbled_deepslate_stairs","block.minecraft.polished_deepslate_stairs","block.minecraft.deepslate_brick_stairs","block.minecraft.deepslate_tile_stairs","block.minecraft.polished_granite_slab","block.minecraft.smooth_red_sandstone_slab","block.minecraft.mossy_stone_brick_slab","block.minecraft.polished_diorite_slab","block.minecraft.mossy_cobblestone_slab","block.minecraft.end_stone_brick_slab","block.minecraft.smooth_sandstone_slab","block.minecraft.smooth_quartz_slab","block.minecraft.granite_slab","block.minecraft.andesite_slab","block.minecraft.red_nether_brick_slab","block.minecraft.polished_andesite_slab","block.minecraft.diorite_slab","block.minecraft.cobbled_deepslate_slab","block.minecraft.polished_deepslate_slab","block.minecraft.deepslate_brick_slab","block.minecraft.deepslate_tile_slab","block.minecraft.scaffolding","item.minecraft.redstone","block.minecraft.redstone_torch","block.minecraft.redstone_block","block.minecraft.repeater","block.minecraft.comparator","block.minecraft.piston","block.minecraft.sticky_piston","block.minecraft.slime_block","block.minecraft.honey_block","block.minecraft.observer","block.minecraft.hopper","block.minecraft.dispenser","block.minecraft.dropper","block.minecraft.lectern","block.minecraft.target","block.minecraft.lever","block.minecraft.lightning_rod","block.minecraft.daylight_detector","block.minecraft.sculk_sensor","block.minecraft.calibrated_sculk_sensor","block.minecraft.tripwire_hook","block.minecraft.trapped_chest","block.minecraft.tnt","block.minecraft.redstone_lamp","block.minecraft.note_block","block.minecraft.stone_button","block.minecraft.polished_blackstone_button","block.minecraft.oak_button","block.minecraft.spruce_button","block.minecraft.birch_button","block.minecraft.jungle_button","block.minecraft.acacia_button","block.minecraft.cherry_button","block.minecraft.dark_oak_button","block.minecraft.pale_oak_button","block.minecraft.mangrove_button","block.minecraft.bamboo_button","block.minecraft.crimson_button","block.minecraft.warped_button","block.minecraft.stone_pressure_plate","block.minecraft.polished_blackstone_pressure_plate","block.minecraft.light_weighted_pressure_plate","block.minecraft.heavy_weighted_pressure_plate","block.minecraft.oak_pressure_plate","block.minecraft.spruce_pressure_plate","block.minecraft.birch_pressure_plate","block.minecraft.jungle_pressure_plate","block.minecraft.acacia_pressure_plate","block.minecraft.cherry_pressure_plate","block.minecraft.dark_oak_pressure_plate","block.minecraft.pale_oak_pressure_plate","block.minecraft.mangrove_pressure_plate","block.minecraft.bamboo_pressure_plate","block.minecraft.crimson_pressure_plate","block.minecraft.warped_pressure_plate","block.minecraft.iron_door","block.minecraft.oak_door","block.minecraft.spruce_door","block.minecraft.birch_door","block.minecraft.jungle_door","block.minecraft.acacia_door","block.minecraft.cherry_door","block.minecraft.dark_oak_door","block.minecraft.pale_oak_door","block.minecraft.mangrove_door","block.minecraft.bamboo_door","block.minecraft.crimson_door","block.minecraft.warped_door","block.minecraft.copper_door","block.minecraft.exposed_copper_door","block.minecraft.weathered_copper_door","block.minecraft.oxidized_copper_door","block.minecraft.waxed_copper_door","block.minecraft.waxed_exposed_copper_door","block.minecraft.waxed_weathered_copper_door","block.minecraft.waxed_oxidized_copper_door","block.minecraft.iron_trapdoor","block.minecraft.oak_trapdoor","block.minecraft.spruce_trapdoor","block.minecraft.birch_trapdoor","block.minecraft.jungle_trapdoor","block.minecraft.acacia_trapdoor","block.minecraft.cherry_trapdoor","block.minecraft.dark_oak_trapdoor","block.minecraft.pale_oak_trapdoor","block.minecraft.mangrove_trapdoor","block.minecraft.bamboo_trapdoor","block.minecraft.crimson_trapdoor","block.minecraft.warped_trapdoor","block.minecraft.copper_trapdoor","block.minecraft.exposed_copper_trapdoor","block.minecraft.weathered_copper_trapdoor","block.minecraft.oxidized_copper_trapdoor","block.minecraft.waxed_copper_trapdoor","block.minecraft.waxed_exposed_copper_trapdoor","block.minecraft.waxed_weathered_copper_trapdoor","block.minecraft.waxed_oxidized_copper_trapdoor","block.minecraft.oak_fence_gate","block.minecraft.spruce_fence_gate","block.minecraft.birch_fence_gate","block.minecraft.jungle_fence_gate","block.minecraft.acacia_fence_gate","block.minecraft.cherry_fence_gate","block.minecraft.dark_oak_fence_gate","block.minecraft.pale_oak_fence_gate","block.minecraft.mangrove_fence_gate","block.minecraft.bamboo_fence_gate","block.minecraft.crimson_fence_gate","block.minecraft.warped_fence_gate","block.minecraft.powered_rail","block.minecraft.detector_rail","block.minecraft.rail","block.minecraft.activator_rail","item.minecraft.saddle","item.minecraft.white_harness","item.minecraft.orange_harness","item.minecraft.magenta_harness","item.minecraft.light_blue_harness","item.minecraft.yellow_harness","item.minecraft.lime_harness","item.minecraft.pink_harness","item.minecraft.gray_harness","item.minecraft.light_gray_harness","item.minecraft.cyan_harness","item.minecraft.purple_harness","item.minecraft.blue_harness","item.minecraft.brown_harness","item.minecraft.green_harness","item.minecraft.red_harness","item.minecraft.black_harness","item.minecraft.minecart","item.minecraft.chest_minecart","item.minecraft.furnace_minecart","item.minecraft.tnt_minecart","item.minecraft.hopper_minecart","item.minecraft.carrot_on_a_stick","item.minecraft.warped_fungus_on_a_stick","item.minecraft.phantom_membrane","item.minecraft.elytra","item.minecraft.oak_boat","item.minecraft.oak_chest_boat","item.minecraft.spruce_boat","item.minecraft.spruce_chest_boat","item.minecraft.birch_boat","item.minecraft.birch_chest_boat","item.minecraft.jungle_boat","item.minecraft.jungle_chest_boat","item.minecraft.acacia_boat","item.minecraft.acacia_chest_boat","item.minecraft.cherry_boat","item.minecraft.cherry_chest_boat","item.minecraft.dark_oak_boat","item.minecraft.dark_oak_chest_boat","item.minecraft.pale_oak_boat","item.minecraft.pale_oak_chest_boat","item.minecraft.mangrove_boat","item.minecraft.mangrove_chest_boat","item.minecraft.bamboo_raft","item.minecraft.bamboo_chest_raft","block.minecraft.structure_block","block.minecraft.jigsaw","block.minecraft.test_block","block.minecraft.test_instance_block","item.minecraft.turtle_helmet","item.minecraft.turtle_scute","item.minecraft.armadillo_scute","item.minecraft.wolf_armor","item.minecraft.flint_and_steel","item.minecraft.bowl","item.minecraft.apple","item.minecraft.bow","item.minecraft.arrow","item.minecraft.coal","item.minecraft.charcoal","item.minecraft.diamond","item.minecraft.emerald","item.minecraft.lapis_lazuli","item.minecraft.quartz","item.minecraft.amethyst_shard","item.minecraft.raw_iron","item.minecraft.iron_ingot","item.minecraft.raw_copper","item.minecraft.copper_ingot","item.minecraft.raw_gold","item.minecraft.gold_ingot","item.minecraft.netherite_ingot","item.minecraft.netherite_scrap","item.minecraft.wooden_sword","item.minecraft.wooden_shovel","item.minecraft.wooden_pickaxe","item.minecraft.wooden_axe","item.minecraft.wooden_hoe","item.minecraft.stone_sword","item.minecraft.stone_shovel","item.minecraft.stone_pickaxe","item.minecraft.stone_axe","item.minecraft.stone_hoe","item.minecraft.golden_sword","item.minecraft.golden_shovel","item.minecraft.golden_pickaxe","item.minecraft.golden_axe","item.minecraft.golden_hoe","item.minecraft.iron_sword","item.minecraft.iron_shovel","item.minecraft.iron_pickaxe","item.minecraft.iron_axe","item.minecraft.iron_hoe","item.minecraft.diamond_sword","item.minecraft.diamond_shovel","item.minecraft.diamond_pickaxe","item.minecraft.diamond_axe","item.minecraft.diamond_hoe","item.minecraft.netherite_sword","item.minecraft.netherite_shovel","item.minecraft.netherite_pickaxe","item.minecraft.netherite_axe","item.minecraft.netherite_hoe","item.minecraft.stick","item.minecraft.mushroom_stew","item.minecraft.string","item.minecraft.feather","item.minecraft.gunpowder","item.minecraft.wheat_seeds","item.minecraft.wheat","item.minecraft.bread","item.minecraft.leather_helmet","item.minecraft.leather_chestplate","item.minecraft.leather_leggings","item.minecraft.leather_boots","item.minecraft.chainmail_helmet","item.minecraft.chainmail_chestplate","item.minecraft.chainmail_leggings","item.minecraft.chainmail_boots","item.minecraft.iron_helmet","item.minecraft.iron_chestplate","item.minecraft.iron_leggings","item.minecraft.iron_boots","item.minecraft.diamond_helmet","item.minecraft.diamond_chestplate","item.minecraft.diamond_leggings","item.minecraft.diamond_boots","item.minecraft.golden_helmet","item.minecraft.golden_chestplate","item.minecraft.golden_leggings","item.minecraft.golden_boots","item.minecraft.netherite_helmet","item.minecraft.netherite_chestplate","item.minecraft.netherite_leggings","item.minecraft.netherite_boots","item.minecraft.flint","item.minecraft.porkchop","item.minecraft.cooked_porkchop","item.minecraft.painting","item.minecraft.golden_apple","item.minecraft.enchanted_golden_apple","block.minecraft.oak_sign","block.minecraft.spruce_sign","block.minecraft.birch_sign","block.minecraft.jungle_sign","block.minecraft.acacia_sign","block.minecraft.cherry_sign","block.minecraft.dark_oak_sign","block.minecraft.pale_oak_sign","block.minecraft.mangrove_sign","block.minecraft.bamboo_sign","block.minecraft.crimson_sign","block.minecraft.warped_sign","block.minecraft.oak_hanging_sign","block.minecraft.spruce_hanging_sign","block.minecraft.birch_hanging_sign","block.minecraft.jungle_hanging_sign","block.minecraft.acacia_hanging_sign","block.minecraft.cherry_hanging_sign","block.minecraft.dark_oak_hanging_sign","block.minecraft.pale_oak_hanging_sign","block.minecraft.mangrove_hanging_sign","block.minecraft.bamboo_hanging_sign","block.minecraft.crimson_hanging_sign","block.minecraft.warped_hanging_sign","item.minecraft.bucket","item.minecraft.water_bucket","item.minecraft.lava_bucket","item.minecraft.powder_snow_bucket","item.minecraft.snowball","item.minecraft.leather","item.minecraft.milk_bucket","item.minecraft.pufferfish_bucket","item.minecraft.salmon_bucket","item.minecraft.cod_bucket","item.minecraft.tropical_fish_bucket","item.minecraft.axolotl_bucket","item.minecraft.tadpole_bucket","item.minecraft.brick","item.minecraft.clay_ball","block.minecraft.dried_kelp_block","item.minecraft.paper","item.minecraft.book","item.minecraft.slime_ball","item.minecraft.egg","item.minecraft.blue_egg","item.minecraft.brown_egg","item.minecraft.compass","item.minecraft.recovery_compass","item.minecraft.bundle","item.minecraft.white_bundle","item.minecraft.orange_bundle","item.minecraft.magenta_bundle","item.minecraft.light_blue_bundle","item.minecraft.yellow_bundle","item.minecraft.lime_bundle","item.minecraft.pink_bundle","item.minecraft.gray_bundle","item.minecraft.light_gray_bundle","item.minecraft.cyan_bundle","item.minecraft.purple_bundle","item.minecraft.blue_bundle","item.minecraft.brown_bundle","item.minecraft.green_bundle","item.minecraft.red_bundle","item.minecraft.black_bundle","item.minecraft.fishing_rod","item.minecraft.clock","item.minecraft.spyglass","item.minecraft.glowstone_dust","item.minecraft.cod","item.minecraft.salmon","item.minecraft.tropical_fish","item.minecraft.pufferfish","item.minecraft.cooked_cod","item.minecraft.cooked_salmon","item.minecraft.ink_sac","item.minecraft.glow_ink_sac","item.minecraft.cocoa_beans","item.minecraft.white_dye","item.minecraft.orange_dye","item.minecraft.magenta_dye","item.minecraft.light_blue_dye","item.minecraft.yellow_dye","item.minecraft.lime_dye","item.minecraft.pink_dye","item.minecraft.gray_dye","item.minecraft.light_gray_dye","item.minecraft.cyan_dye","item.minecraft.purple_dye","item.minecraft.blue_dye","item.minecraft.brown_dye","item.minecraft.green_dye","item.minecraft.red_dye","item.minecraft.black_dye","item.minecraft.bone_meal","item.minecraft.bone","item.minecraft.sugar","block.minecraft.cake","block.minecraft.white_bed","block.minecraft.orange_bed","block.minecraft.magenta_bed","block.minecraft.light_blue_bed","block.minecraft.yellow_bed","block.minecraft.lime_bed","block.minecraft.pink_bed","block.minecraft.gray_bed","block.minecraft.light_gray_bed","block.minecraft.cyan_bed","block.minecraft.purple_bed","block.minecraft.blue_bed","block.minecraft.brown_bed","block.minecraft.green_bed","block.minecraft.red_bed","block.minecraft.black_bed","item.minecraft.cookie","block.minecraft.crafter","item.minecraft.filled_map","item.minecraft.shears","item.minecraft.melon_slice","item.minecraft.dried_kelp","item.minecraft.pumpkin_seeds","item.minecraft.melon_seeds","item.minecraft.beef","item.minecraft.cooked_beef","item.minecraft.chicken","item.minecraft.cooked_chicken","item.minecraft.rotten_flesh","item.minecraft.ender_pearl","item.minecraft.blaze_rod","item.minecraft.ghast_tear","item.minecraft.gold_nugget","item.minecraft.nether_wart","item.minecraft.glass_bottle","item.minecraft.potion","item.minecraft.spider_eye","item.minecraft.fermented_spider_eye","item.minecraft.blaze_powder","item.minecraft.magma_cream","block.minecraft.brewing_stand","block.minecraft.cauldron","item.minecraft.ender_eye","item.minecraft.glistering_melon_slice","item.minecraft.armadillo_spawn_egg","item.minecraft.allay_spawn_egg","item.minecraft.axolotl_spawn_egg","item.minecraft.bat_spawn_egg","item.minecraft.bee_spawn_egg","item.minecraft.blaze_spawn_egg","item.minecraft.bogged_spawn_egg","item.minecraft.breeze_spawn_egg","item.minecraft.cat_spawn_egg","item.minecraft.camel_spawn_egg","item.minecraft.cave_spider_spawn_egg","item.minecraft.chicken_spawn_egg","item.minecraft.cod_spawn_egg","item.minecraft.cow_spawn_egg","item.minecraft.creeper_spawn_egg","item.minecraft.dolphin_spawn_egg","item.minecraft.donkey_spawn_egg","item.minecraft.drowned_spawn_egg","item.minecraft.elder_guardian_spawn_egg","item.minecraft.ender_dragon_spawn_egg","item.minecraft.enderman_spawn_egg","item.minecraft.endermite_spawn_egg","item.minecraft.evoker_spawn_egg","item.minecraft.fox_spawn_egg","item.minecraft.frog_spawn_egg","item.minecraft.ghast_spawn_egg","item.minecraft.happy_ghast_spawn_egg","item.minecraft.glow_squid_spawn_egg","item.minecraft.goat_spawn_egg","item.minecraft.guardian_spawn_egg","item.minecraft.hoglin_spawn_egg","item.minecraft.horse_spawn_egg","item.minecraft.husk_spawn_egg","item.minecraft.iron_golem_spawn_egg","item.minecraft.llama_spawn_egg","item.minecraft.magma_cube_spawn_egg","item.minecraft.mooshroom_spawn_egg","item.minecraft.mule_spawn_egg","item.minecraft.ocelot_spawn_egg","item.minecraft.panda_spawn_egg","item.minecraft.parrot_spawn_egg","item.minecraft.phantom_spawn_egg","item.minecraft.pig_spawn_egg","item.minecraft.piglin_spawn_egg","item.minecraft.piglin_brute_spawn_egg","item.minecraft.pillager_spawn_egg","item.minecraft.polar_bear_spawn_egg","item.minecraft.pufferfish_spawn_egg","item.minecraft.rabbit_spawn_egg","item.minecraft.ravager_spawn_egg","item.minecraft.salmon_spawn_egg","item.minecraft.sheep_spawn_egg","item.minecraft.shulker_spawn_egg","item.minecraft.silverfish_spawn_egg","item.minecraft.skeleton_spawn_egg","item.minecraft.skeleton_horse_spawn_egg","item.minecraft.slime_spawn_egg","item.minecraft.sniffer_spawn_egg","item.minecraft.snow_golem_spawn_egg","item.minecraft.spider_spawn_egg","item.minecraft.squid_spawn_egg","item.minecraft.stray_spawn_egg","item.minecraft.strider_spawn_egg","item.minecraft.tadpole_spawn_egg","item.minecraft.trader_llama_spawn_egg","item.minecraft.tropical_fish_spawn_egg","item.minecraft.turtle_spawn_egg","item.minecraft.vex_spawn_egg","item.minecraft.villager_spawn_egg","item.minecraft.vindicator_spawn_egg","item.minecraft.wandering_trader_spawn_egg","item.minecraft.warden_spawn_egg","item.minecraft.witch_spawn_egg","item.minecraft.wither_spawn_egg","item.minecraft.wither_skeleton_spawn_egg","item.minecraft.wolf_spawn_egg","item.minecraft.zoglin_spawn_egg","item.minecraft.creaking_spawn_egg","item.minecraft.zombie_spawn_egg","item.minecraft.zombie_horse_spawn_egg","item.minecraft.zombie_villager_spawn_egg","item.minecraft.zombified_piglin_spawn_egg","item.minecraft.experience_bottle","item.minecraft.fire_charge","item.minecraft.wind_charge","item.minecraft.writable_book","item.minecraft.written_book","item.minecraft.breeze_rod","item.minecraft.mace","item.minecraft.item_frame","item.minecraft.glow_item_frame","block.minecraft.flower_pot","item.minecraft.carrot","item.minecraft.potato","item.minecraft.baked_potato","item.minecraft.poisonous_potato","item.minecraft.map","item.minecraft.golden_carrot","block.minecraft.skeleton_skull","block.minecraft.wither_skeleton_skull","block.minecraft.player_head","block.minecraft.zombie_head","block.minecraft.creeper_head","block.minecraft.dragon_head","block.minecraft.piglin_head","item.minecraft.nether_star","item.minecraft.pumpkin_pie","item.minecraft.firework_rocket","item.minecraft.firework_star","item.minecraft.enchanted_book","item.minecraft.nether_brick","item.minecraft.resin_brick","item.minecraft.prismarine_shard","item.minecraft.prismarine_crystals","item.minecraft.rabbit","item.minecraft.cooked_rabbit","item.minecraft.rabbit_stew","item.minecraft.rabbit_foot","item.minecraft.rabbit_hide","item.minecraft.armor_stand","item.minecraft.iron_horse_armor","item.minecraft.golden_horse_armor","item.minecraft.diamond_horse_armor","item.minecraft.leather_horse_armor","item.minecraft.lead","item.minecraft.name_tag","item.minecraft.command_block_minecart","item.minecraft.mutton","item.minecraft.cooked_mutton","block.minecraft.white_banner","block.minecraft.orange_banner","block.minecraft.magenta_banner","block.minecraft.light_blue_banner","block.minecraft.yellow_banner","block.minecraft.lime_banner","block.minecraft.pink_banner","block.minecraft.gray_banner","block.minecraft.light_gray_banner","block.minecraft.cyan_banner","block.minecraft.purple_banner","block.minecraft.blue_banner","block.minecraft.brown_banner","block.minecraft.green_banner","block.minecraft.red_banner","block.minecraft.black_banner","item.minecraft.end_crystal","item.minecraft.chorus_fruit","item.minecraft.popped_chorus_fruit","item.minecraft.torchflower_seeds","item.minecraft.pitcher_pod","item.minecraft.beetroot","item.minecraft.beetroot_seeds","item.minecraft.beetroot_soup","item.minecraft.dragon_breath","item.minecraft.splash_potion","item.minecraft.spectral_arrow","item.minecraft.tipped_arrow","item.minecraft.lingering_potion","item.minecraft.shield","item.minecraft.totem_of_undying","item.minecraft.shulker_shell","item.minecraft.iron_nugget","item.minecraft.knowledge_book","item.minecraft.debug_stick","item.minecraft.music_disc_13","item.minecraft.music_disc_cat","item.minecraft.music_disc_blocks","item.minecraft.music_disc_chirp","item.minecraft.music_disc_creator","item.minecraft.music_disc_creator_music_box","item.minecraft.music_disc_far","item.minecraft.music_disc_lava_chicken","item.minecraft.music_disc_mall","item.minecraft.music_disc_mellohi","item.minecraft.music_disc_stal","item.minecraft.music_disc_strad","item.minecraft.music_disc_ward","item.minecraft.music_disc_11","item.minecraft.music_disc_wait","item.minecraft.music_disc_otherside","item.minecraft.music_disc_relic","item.minecraft.music_disc_5","item.minecraft.music_disc_pigstep","item.minecraft.music_disc_precipice","item.minecraft.music_disc_tears","item.minecraft.disc_fragment_5","item.minecraft.trident","item.minecraft.nautilus_shell","item.minecraft.heart_of_the_sea","item.minecraft.crossbow","item.minecraft.suspicious_stew","block.minecraft.loom","item.minecraft.flower_banner_pattern","item.minecraft.creeper_banner_pattern","item.minecraft.skull_banner_pattern","item.minecraft.mojang_banner_pattern","item.minecraft.globe_banner_pattern","item.minecraft.piglin_banner_pattern","item.minecraft.flow_banner_pattern","item.minecraft.guster_banner_pattern","item.minecraft.field_masoned_banner_pattern","item.minecraft.bordure_indented_banner_pattern","item.minecraft.goat_horn","block.minecraft.composter","block.minecraft.barrel","block.minecraft.smoker","block.minecraft.blast_furnace","block.minecraft.cartography_table","block.minecraft.fletching_table","block.minecraft.grindstone","block.minecraft.smithing_table","block.minecraft.stonecutter","block.minecraft.bell","block.minecraft.lantern","block.minecraft.soul_lantern","item.minecraft.sweet_berries","item.minecraft.glow_berries","block.minecraft.campfire","block.minecraft.soul_campfire","block.minecraft.shroomlight","item.minecraft.honeycomb","block.minecraft.bee_nest","block.minecraft.beehive","item.minecraft.honey_bottle","block.minecraft.honeycomb_block","block.minecraft.lodestone","block.minecraft.crying_obsidian","block.minecraft.blackstone","block.minecraft.blackstone_slab","block.minecraft.blackstone_stairs","block.minecraft.gilded_blackstone","block.minecraft.polished_blackstone","block.minecraft.polished_blackstone_slab","block.minecraft.polished_blackstone_stairs","block.minecraft.chiseled_polished_blackstone","block.minecraft.polished_blackstone_bricks","block.minecraft.polished_blackstone_brick_slab","block.minecraft.polished_blackstone_brick_stairs","block.minecraft.cracked_polished_blackstone_bricks","block.minecraft.respawn_anchor","block.minecraft.candle","block.minecraft.white_candle","block.minecraft.orange_candle","block.minecraft.magenta_candle","block.minecraft.light_blue_candle","block.minecraft.yellow_candle","block.minecraft.lime_candle","block.minecraft.pink_candle","block.minecraft.gray_candle","block.minecraft.light_gray_candle","block.minecraft.cyan_candle","block.minecraft.purple_candle","block.minecraft.blue_candle","block.minecraft.brown_candle","block.minecraft.green_candle","block.minecraft.red_candle","block.minecraft.black_candle","block.minecraft.small_amethyst_bud","block.minecraft.medium_amethyst_bud","block.minecraft.large_amethyst_bud","block.minecraft.amethyst_cluster","block.minecraft.pointed_dripstone","block.minecraft.ochre_froglight","block.minecraft.verdant_froglight","block.minecraft.pearlescent_froglight","block.minecraft.frogspawn","item.minecraft.echo_shard","item.minecraft.brush","item.minecraft.netherite_upgrade_smithing_template","item.minecraft.sentry_armor_trim_smithing_template","item.minecraft.dune_armor_trim_smithing_template","item.minecraft.coast_armor_trim_smithing_template","item.minecraft.wild_armor_trim_smithing_template","item.minecraft.ward_armor_trim_smithing_template","item.minecraft.eye_armor_trim_smithing_template","item.minecraft.vex_armor_trim_smithing_template","item.minecraft.tide_armor_trim_smithing_template","item.minecraft.snout_armor_trim_smithing_template","item.minecraft.rib_armor_trim_smithing_template","item.minecraft.spire_armor_trim_smithing_template","item.minecraft.wayfinder_armor_trim_smithing_template","item.minecraft.shaper_armor_trim_smithing_template","item.minecraft.silence_armor_trim_smithing_template","item.minecraft.raiser_armor_trim_smithing_template","item.minecraft.host_armor_trim_smithing_template","item.minecraft.flow_armor_trim_smithing_template","item.minecraft.bolt_armor_trim_smithing_template","item.minecraft.angler_pottery_sherd","item.minecraft.archer_pottery_sherd","item.minecraft.arms_up_pottery_sherd","item.minecraft.blade_pottery_sherd","item.minecraft.brewer_pottery_sherd","item.minecraft.burn_pottery_sherd","item.minecraft.danger_pottery_sherd","item.minecraft.explorer_pottery_sherd","item.minecraft.flow_pottery_sherd","item.minecraft.friend_pottery_sherd","item.minecraft.guster_pottery_sherd","item.minecraft.heart_pottery_sherd","item.minecraft.heartbreak_pottery_sherd","item.minecraft.howl_pottery_sherd","item.minecraft.miner_pottery_sherd","item.minecraft.mourner_pottery_sherd","item.minecraft.plenty_pottery_sherd","item.minecraft.prize_pottery_sherd","item.minecraft.scrape_pottery_sherd","item.minecraft.sheaf_pottery_sherd","item.minecraft.shelter_pottery_sherd","item.minecraft.skull_pottery_sherd","item.minecraft.snort_pottery_sherd","block.minecraft.copper_grate","block.minecraft.exposed_copper_grate","block.minecraft.weathered_copper_grate","block.minecraft.oxidized_copper_grate","block.minecraft.waxed_copper_grate","block.minecraft.waxed_exposed_copper_grate","block.minecraft.waxed_weathered_copper_grate","block.minecraft.waxed_oxidized_copper_grate","block.minecraft.copper_bulb","block.minecraft.exposed_copper_bulb","block.minecraft.weathered_copper_bulb","block.minecraft.oxidized_copper_bulb","block.minecraft.waxed_copper_bulb","block.minecraft.waxed_exposed_copper_bulb","block.minecraft.waxed_weathered_copper_bulb","block.minecraft.waxed_oxidized_copper_bulb","block.minecraft.trial_spawner","item.minecraft.trial_key","item.minecraft.ominous_trial_key","block.minecraft.vault","item.minecraft.ominous_bottle"]; +impl DefaultableComponent for ItemName { + fn default_for_item(item: Item) -> Option<Self> { + let value = ITEM_NAME_VALUES[item as usize]; + Some(ItemName { + name: TranslatableComponent::from(value).into(), + }) + } +} +impl DefaultableComponent for Lore { + fn default_for_item(_item: Item) -> Option<Self> { + Some(Lore { lines: vec![] }) + } +} +#[rustfmt::skip] +static MAX_STACK_SIZE_VALUES: [i32; 1416] = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,64,64,64,1,64,64,1,1,64,64,1,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,1,64,64,64,64,64,64,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,64,64,64,64,64,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,1,1,1,16,64,1,1,1,1,1,1,1,64,64,64,64,64,64,16,16,16,64,64,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,1,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,64,64,1,64,64,64,64,64,64,64,64,64,16,64,64,64,64,64,1,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,1,16,64,1,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,1,64,64,64,64,64,64,1,64,64,16,1,1,1,1,64,64,1,64,64,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,64,64,64,64,64,64,64,1,64,1,64,64,1,1,1,64,64,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,1,64,64,1,1,64,1,1,1,1,1,1,1,1,1,1,1,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,16,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,1,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]; +impl DefaultableComponent for MaxStackSize { + fn default_for_item(item: Item) -> Option<Self> { + let value = MAX_STACK_SIZE_VALUES[item as usize]; + Some(MaxStackSize { count: value }) + } +} +impl DefaultableComponent for Rarity { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::AnglerPotterySherd => Rarity::Uncommon, + Item::ArcherPotterySherd => Rarity::Uncommon, + Item::ArmsUpPotterySherd => Rarity::Uncommon, + Item::Barrier => Rarity::Epic, + Item::Beacon => Rarity::Rare, + Item::BladePotterySherd => Rarity::Uncommon, + Item::BoltArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::BrewerPotterySherd => Rarity::Uncommon, + Item::BurnPotterySherd => Rarity::Uncommon, + Item::ChainCommandBlock => Rarity::Epic, + Item::ChainmailBoots => Rarity::Uncommon, + Item::ChainmailChestplate => Rarity::Uncommon, + Item::ChainmailHelmet => Rarity::Uncommon, + Item::ChainmailLeggings => Rarity::Uncommon, + Item::CoastArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::CommandBlock => Rarity::Epic, + Item::CommandBlockMinecart => Rarity::Epic, + Item::Conduit => Rarity::Uncommon, + Item::CreeperBannerPattern => Rarity::Uncommon, + Item::CreeperHead => Rarity::Uncommon, + Item::DangerPotterySherd => Rarity::Uncommon, + Item::DebugStick => Rarity::Epic, + Item::DiscFragment5 => Rarity::Uncommon, + Item::DragonBreath => Rarity::Uncommon, + Item::DragonEgg => Rarity::Epic, + Item::DragonHead => Rarity::Epic, + Item::DuneArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::EchoShard => Rarity::Uncommon, + Item::Elytra => Rarity::Epic, + Item::EnchantedBook => Rarity::Uncommon, + Item::EnchantedGoldenApple => Rarity::Rare, + Item::ExperienceBottle => Rarity::Uncommon, + Item::ExplorerPotterySherd => Rarity::Uncommon, + Item::EyeArmorTrimSmithingTemplate => Rarity::Rare, + Item::FlowArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::FlowBannerPattern => Rarity::Rare, + Item::FlowPotterySherd => Rarity::Uncommon, + Item::FriendPotterySherd => Rarity::Uncommon, + Item::GoatHorn => Rarity::Uncommon, + Item::GusterBannerPattern => Rarity::Rare, + Item::GusterPotterySherd => Rarity::Uncommon, + Item::HeartOfTheSea => Rarity::Uncommon, + Item::HeartPotterySherd => Rarity::Uncommon, + Item::HeartbreakPotterySherd => Rarity::Uncommon, + Item::HeavyCore => Rarity::Epic, + Item::HostArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::HowlPotterySherd => Rarity::Uncommon, + Item::Jigsaw => Rarity::Epic, + Item::KnowledgeBook => Rarity::Epic, + Item::Light => Rarity::Epic, + Item::Mace => Rarity::Epic, + Item::MinerPotterySherd => Rarity::Uncommon, + Item::MojangBannerPattern => Rarity::Rare, + Item::MournerPotterySherd => Rarity::Uncommon, + Item::MusicDisc11 => Rarity::Uncommon, + Item::MusicDisc13 => Rarity::Uncommon, + Item::MusicDisc5 => Rarity::Uncommon, + Item::MusicDiscBlocks => Rarity::Uncommon, + Item::MusicDiscCat => Rarity::Uncommon, + Item::MusicDiscChirp => Rarity::Uncommon, + Item::MusicDiscCreator => Rarity::Rare, + Item::MusicDiscCreatorMusicBox => Rarity::Uncommon, + Item::MusicDiscFar => Rarity::Uncommon, + Item::MusicDiscLavaChicken => Rarity::Rare, + Item::MusicDiscMall => Rarity::Uncommon, + Item::MusicDiscMellohi => Rarity::Uncommon, + Item::MusicDiscOtherside => Rarity::Rare, + Item::MusicDiscPigstep => Rarity::Rare, + Item::MusicDiscPrecipice => Rarity::Uncommon, + Item::MusicDiscRelic => Rarity::Uncommon, + Item::MusicDiscStal => Rarity::Uncommon, + Item::MusicDiscStrad => Rarity::Uncommon, + Item::MusicDiscTears => Rarity::Uncommon, + Item::MusicDiscWait => Rarity::Uncommon, + Item::MusicDiscWard => Rarity::Uncommon, + Item::NautilusShell => Rarity::Uncommon, + Item::NetherStar => Rarity::Rare, + Item::NetheriteUpgradeSmithingTemplate => Rarity::Uncommon, + Item::OminousBottle => Rarity::Uncommon, + Item::PiglinBannerPattern => Rarity::Uncommon, + Item::PiglinHead => Rarity::Uncommon, + Item::PlayerHead => Rarity::Uncommon, + Item::PlentyPotterySherd => Rarity::Uncommon, + Item::PrizePotterySherd => Rarity::Uncommon, + Item::RaiserArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::RecoveryCompass => Rarity::Uncommon, + Item::RepeatingCommandBlock => Rarity::Epic, + Item::RibArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::ScrapePotterySherd => Rarity::Uncommon, + Item::SentryArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::ShaperArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::SheafPotterySherd => Rarity::Uncommon, + Item::ShelterPotterySherd => Rarity::Uncommon, + Item::SilenceArmorTrimSmithingTemplate => Rarity::Epic, + Item::SkeletonSkull => Rarity::Uncommon, + Item::SkullBannerPattern => Rarity::Rare, + Item::SkullPotterySherd => Rarity::Uncommon, + Item::SnifferEgg => Rarity::Uncommon, + Item::SnortPotterySherd => Rarity::Uncommon, + Item::SnoutArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::SpireArmorTrimSmithingTemplate => Rarity::Rare, + Item::StructureBlock => Rarity::Epic, + Item::StructureVoid => Rarity::Epic, + Item::TestBlock => Rarity::Epic, + Item::TestInstanceBlock => Rarity::Epic, + Item::TideArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::TotemOfUndying => Rarity::Uncommon, + Item::Trident => Rarity::Rare, + Item::VexArmorTrimSmithingTemplate => Rarity::Rare, + Item::WardArmorTrimSmithingTemplate => Rarity::Rare, + Item::WayfinderArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::WildArmorTrimSmithingTemplate => Rarity::Uncommon, + Item::WitherSkeletonSkull => Rarity::Rare, + Item::ZombieHead => Rarity::Uncommon, + _ => Rarity::Common, + }; + Some(value) + } +} +impl DefaultableComponent for RepairCost { + fn default_for_item(_item: Item) -> Option<Self> { + Some(RepairCost { cost: 0 }) + } +} +impl DefaultableComponent for TooltipDisplay { + fn default_for_item(_item: Item) -> Option<Self> { + Some(TooltipDisplay::new()) + } +} +impl DefaultableComponent for ProvidesTrimMaterial { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::AmethystShard => ProvidesTrimMaterial::Referenced("minecraft:amethyst".into()), + Item::CopperIngot => ProvidesTrimMaterial::Referenced("minecraft:copper".into()), + Item::Diamond => ProvidesTrimMaterial::Referenced("minecraft:diamond".into()), + Item::Emerald => ProvidesTrimMaterial::Referenced("minecraft:emerald".into()), + Item::GoldIngot => ProvidesTrimMaterial::Referenced("minecraft:gold".into()), + Item::IronIngot => ProvidesTrimMaterial::Referenced("minecraft:iron".into()), + Item::LapisLazuli => ProvidesTrimMaterial::Referenced("minecraft:lapis".into()), + Item::NetheriteIngot => ProvidesTrimMaterial::Referenced("minecraft:netherite".into()), + Item::Quartz => ProvidesTrimMaterial::Referenced("minecraft:quartz".into()), + Item::Redstone => ProvidesTrimMaterial::Referenced("minecraft:redstone".into()), + Item::ResinBrick => ProvidesTrimMaterial::Referenced("minecraft:resin".into()), + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for DamageResistant { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::AncientDebris => "#minecraft:is_fire".into(), + Item::NetherStar => "#minecraft:is_explosion".into(), + Item::NetheriteAxe => "#minecraft:is_fire".into(), + Item::NetheriteBlock => "#minecraft:is_fire".into(), + Item::NetheriteBoots => "#minecraft:is_fire".into(), + Item::NetheriteChestplate => "#minecraft:is_fire".into(), + Item::NetheriteHelmet => "#minecraft:is_fire".into(), + Item::NetheriteHoe => "#minecraft:is_fire".into(), + Item::NetheriteIngot => "#minecraft:is_fire".into(), + Item::NetheriteLeggings => "#minecraft:is_fire".into(), + Item::NetheritePickaxe => "#minecraft:is_fire".into(), + Item::NetheriteScrap => "#minecraft:is_fire".into(), + Item::NetheriteShovel => "#minecraft:is_fire".into(), + Item::NetheriteSword => "#minecraft:is_fire".into(), + _ => return None, + }; + Some(DamageResistant { types: value }) + } +} +impl DefaultableComponent for Consumable { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Apple => Consumable::new(), + Item::BakedPotato => Consumable::new(), + Item::Beef => Consumable::new(), + Item::Beetroot => Consumable::new(), + Item::BeetrootSoup => Consumable::new(), + Item::Bread => Consumable::new(), + Item::Carrot => Consumable::new(), + Item::Chicken => Consumable { + on_consume_effects: vec![ConsumeEffect::ApplyEffects { + effects: vec![MobEffectInstance { + id: MobEffect::Hunger, + details: MobEffectDetails { + duration: 600, + show_icon: true, + ..MobEffectDetails::new() + }, + }], + probability: 0.3, + }], + ..Consumable::new() + }, + Item::ChorusFruit => Consumable { + on_consume_effects: vec![ConsumeEffect::TeleportRandomly { diameter: 16.0 }], + ..Consumable::new() + }, + Item::Cod => Consumable::new(), + Item::CookedBeef => Consumable::new(), + Item::CookedChicken => Consumable::new(), + Item::CookedCod => Consumable::new(), + Item::CookedMutton => Consumable::new(), + Item::CookedPorkchop => Consumable::new(), + Item::CookedRabbit => Consumable::new(), + Item::CookedSalmon => Consumable::new(), + Item::Cookie => Consumable::new(), + Item::DriedKelp => Consumable { + consume_seconds: 0.8, + ..Consumable::new() + }, + Item::EnchantedGoldenApple => Consumable { + on_consume_effects: vec![ConsumeEffect::ApplyEffects { + effects: vec![ + MobEffectInstance { + id: MobEffect::Regeneration, + details: MobEffectDetails { + amplifier: 1, + duration: 400, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + MobEffectInstance { + id: MobEffect::Resistance, + details: MobEffectDetails { + duration: 6000, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + MobEffectInstance { + id: MobEffect::FireResistance, + details: MobEffectDetails { + duration: 6000, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + MobEffectInstance { + id: MobEffect::Absorption, + details: MobEffectDetails { + amplifier: 3, + duration: 2400, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + ], + probability: 1.0, + }], + ..Consumable::new() + }, + Item::GlowBerries => Consumable::new(), + Item::GoldenApple => Consumable { + on_consume_effects: vec![ConsumeEffect::ApplyEffects { + effects: vec![ + MobEffectInstance { + id: MobEffect::Regeneration, + details: MobEffectDetails { + amplifier: 1, + duration: 100, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + MobEffectInstance { + id: MobEffect::Absorption, + details: MobEffectDetails { + duration: 2400, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + ], + probability: 1.0, + }], + ..Consumable::new() + }, + Item::GoldenCarrot => Consumable::new(), + Item::HoneyBottle => Consumable { + animation: ItemUseAnimation::Drink, + consume_seconds: 2.0, + has_consume_particles: false, + on_consume_effects: vec![ConsumeEffect::RemoveEffects { + effects: HolderSet::Direct { + contents: vec![MobEffect::Poison], + }, + }], + sound: azalea_registry::Holder::Reference(SoundEvent::ItemHoneyBottleDrink), + }, + Item::MelonSlice => Consumable::new(), + Item::MilkBucket => Consumable { + animation: ItemUseAnimation::Drink, + has_consume_particles: false, + on_consume_effects: vec![ConsumeEffect::ClearAllEffects {}], + sound: azalea_registry::Holder::Reference(SoundEvent::EntityGenericDrink), + ..Consumable::new() + }, + Item::MushroomStew => Consumable::new(), + Item::Mutton => Consumable::new(), + Item::OminousBottle => Consumable { + animation: ItemUseAnimation::Drink, + has_consume_particles: false, + on_consume_effects: vec![ConsumeEffect::PlaySound { + sound: SoundEvent::ItemOminousBottleDispose, + }], + sound: azalea_registry::Holder::Reference(SoundEvent::EntityGenericDrink), + ..Consumable::new() + }, + Item::PoisonousPotato => Consumable { + on_consume_effects: vec![ConsumeEffect::ApplyEffects { + effects: vec![MobEffectInstance { + id: MobEffect::Poison, + details: MobEffectDetails { + duration: 100, + show_icon: true, + ..MobEffectDetails::new() + }, + }], + probability: 0.6, + }], + ..Consumable::new() + }, + Item::Porkchop => Consumable::new(), + Item::Potato => Consumable::new(), + Item::Potion => Consumable { + animation: ItemUseAnimation::Drink, + has_consume_particles: false, + sound: azalea_registry::Holder::Reference(SoundEvent::EntityGenericDrink), + ..Consumable::new() + }, + Item::Pufferfish => Consumable { + on_consume_effects: vec![ConsumeEffect::ApplyEffects { + effects: vec![ + MobEffectInstance { + id: MobEffect::Poison, + details: MobEffectDetails { + amplifier: 1, + duration: 1200, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + MobEffectInstance { + id: MobEffect::Hunger, + details: MobEffectDetails { + amplifier: 2, + duration: 300, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + MobEffectInstance { + id: MobEffect::Nausea, + details: MobEffectDetails { + duration: 300, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + ], + probability: 1.0, + }], + ..Consumable::new() + }, + Item::PumpkinPie => Consumable::new(), + Item::Rabbit => Consumable::new(), + Item::RabbitStew => Consumable::new(), + Item::RottenFlesh => Consumable { + on_consume_effects: vec![ConsumeEffect::ApplyEffects { + effects: vec![MobEffectInstance { + id: MobEffect::Hunger, + details: MobEffectDetails { + duration: 600, + show_icon: true, + ..MobEffectDetails::new() + }, + }], + probability: 0.8, + }], + ..Consumable::new() + }, + Item::Salmon => Consumable::new(), + Item::SpiderEye => Consumable { + on_consume_effects: vec![ConsumeEffect::ApplyEffects { + effects: vec![MobEffectInstance { + id: MobEffect::Poison, + details: MobEffectDetails { + duration: 100, + show_icon: true, + ..MobEffectDetails::new() + }, + }], + probability: 1.0, + }], + ..Consumable::new() + }, + Item::SuspiciousStew => Consumable::new(), + Item::SweetBerries => Consumable::new(), + Item::TropicalFish => Consumable::new(), + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for Food { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Apple => Food { + nutrition: 4, + saturation: 2.4, + ..Food::new() + }, + Item::BakedPotato => Food { + nutrition: 5, + saturation: 6.0, + ..Food::new() + }, + Item::Beef => Food { + nutrition: 3, + saturation: 1.8000001, + ..Food::new() + }, + Item::Beetroot => Food { + nutrition: 1, + saturation: 1.2, + ..Food::new() + }, + Item::BeetrootSoup => Food { + nutrition: 6, + saturation: 7.2000003, + ..Food::new() + }, + Item::Bread => Food { + nutrition: 5, + saturation: 6.0, + ..Food::new() + }, + Item::Carrot => Food { + nutrition: 3, + saturation: 3.6000001, + ..Food::new() + }, + Item::Chicken => Food { + nutrition: 2, + saturation: 1.2, + ..Food::new() + }, + Item::ChorusFruit => Food { + can_always_eat: true, + nutrition: 4, + saturation: 2.4, + }, + Item::Cod => Food { + nutrition: 2, + saturation: 0.4, + ..Food::new() + }, + Item::CookedBeef => Food { + nutrition: 8, + saturation: 12.8, + ..Food::new() + }, + Item::CookedChicken => Food { + nutrition: 6, + saturation: 7.2000003, + ..Food::new() + }, + Item::CookedCod => Food { + nutrition: 5, + saturation: 6.0, + ..Food::new() + }, + Item::CookedMutton => Food { + nutrition: 6, + saturation: 9.6, + ..Food::new() + }, + Item::CookedPorkchop => Food { + nutrition: 8, + saturation: 12.8, + ..Food::new() + }, + Item::CookedRabbit => Food { + nutrition: 5, + saturation: 6.0, + ..Food::new() + }, + Item::CookedSalmon => Food { + nutrition: 6, + saturation: 9.6, + ..Food::new() + }, + Item::Cookie => Food { + nutrition: 2, + saturation: 0.4, + ..Food::new() + }, + Item::DriedKelp => Food { + nutrition: 1, + saturation: 0.6, + ..Food::new() + }, + Item::EnchantedGoldenApple => Food { + can_always_eat: true, + nutrition: 4, + saturation: 9.6, + }, + Item::GlowBerries => Food { + nutrition: 2, + saturation: 0.4, + ..Food::new() + }, + Item::GoldenApple => Food { + can_always_eat: true, + nutrition: 4, + saturation: 9.6, + }, + Item::GoldenCarrot => Food { + nutrition: 6, + saturation: 14.400001, + ..Food::new() + }, + Item::HoneyBottle => Food { + can_always_eat: true, + nutrition: 6, + saturation: 1.2, + }, + Item::MelonSlice => Food { + nutrition: 2, + saturation: 1.2, + ..Food::new() + }, + Item::MushroomStew => Food { + nutrition: 6, + saturation: 7.2000003, + ..Food::new() + }, + Item::Mutton => Food { + nutrition: 2, + saturation: 1.2, + ..Food::new() + }, + Item::PoisonousPotato => Food { + nutrition: 2, + saturation: 1.2, + ..Food::new() + }, + Item::Porkchop => Food { + nutrition: 3, + saturation: 1.8000001, + ..Food::new() + }, + Item::Potato => Food { + nutrition: 1, + saturation: 0.6, + ..Food::new() + }, + Item::Pufferfish => Food { + nutrition: 1, + saturation: 0.2, + ..Food::new() + }, + Item::PumpkinPie => Food { + nutrition: 8, + saturation: 4.8, + ..Food::new() + }, + Item::Rabbit => Food { + nutrition: 3, + saturation: 1.8000001, + ..Food::new() + }, + Item::RabbitStew => Food { + nutrition: 10, + saturation: 12.0, + ..Food::new() + }, + Item::RottenFlesh => Food { + nutrition: 4, + saturation: 0.8, + ..Food::new() + }, + Item::Salmon => Food { + nutrition: 2, + saturation: 0.4, + ..Food::new() + }, + Item::SpiderEye => Food { + nutrition: 2, + saturation: 3.2, + ..Food::new() + }, + Item::SuspiciousStew => Food { + can_always_eat: true, + nutrition: 6, + saturation: 7.2000003, + }, + Item::SweetBerries => Food { + nutrition: 2, + saturation: 0.4, + ..Food::new() + }, + Item::TropicalFish => Food { + nutrition: 1, + saturation: 0.2, + ..Food::new() + }, + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for BucketEntityData { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::AxolotlBucket => NbtCompound::new(), + Item::CodBucket => NbtCompound::new(), + Item::PufferfishBucket => NbtCompound::new(), + Item::SalmonBucket => NbtCompound::new(), + Item::TadpoleBucket => NbtCompound::new(), + Item::TropicalFishBucket => NbtCompound::new(), + _ => return None, + }; + Some(BucketEntityData { entity: value }) + } +} +impl DefaultableComponent for Container { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Barrel => vec![], + Item::BlackShulkerBox => vec![], + Item::BlastFurnace => vec![], + Item::BlueShulkerBox => vec![], + Item::BrewingStand => vec![], + Item::BrownShulkerBox => vec![], + Item::Campfire => vec![], + Item::Chest => vec![], + Item::ChiseledBookshelf => vec![], + Item::Crafter => vec![], + Item::CyanShulkerBox => vec![], + Item::DecoratedPot => vec![], + Item::Dispenser => vec![], + Item::Dropper => vec![], + Item::Furnace => vec![], + Item::GrayShulkerBox => vec![], + Item::GreenShulkerBox => vec![], + Item::Hopper => vec![], + Item::LightBlueShulkerBox => vec![], + Item::LightGrayShulkerBox => vec![], + Item::LimeShulkerBox => vec![], + Item::MagentaShulkerBox => vec![], + Item::OrangeShulkerBox => vec![], + Item::PinkShulkerBox => vec![], + Item::PurpleShulkerBox => vec![], + Item::RedShulkerBox => vec![], + Item::ShulkerBox => vec![], + Item::Smoker => vec![], + Item::SoulCampfire => vec![], + Item::TrappedChest => vec![], + Item::WhiteShulkerBox => vec![], + Item::YellowShulkerBox => vec![], + _ => return None, + }; + Some(Container { items: value }) + } +} +impl DefaultableComponent for Bees { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::BeeNest => vec![], + Item::Beehive => vec![], + _ => return None, + }; + Some(Bees { occupants: value }) + } +} +impl DefaultableComponent for BlockState { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::BeeNest => HashMap::from_iter([("honey_level".to_string(), "0".to_string())]), + Item::Beehive => HashMap::from_iter([("honey_level".to_string(), "0".to_string())]), + Item::Light => HashMap::from_iter([("level".to_string(), "15".to_string())]), + Item::TestBlock => HashMap::from_iter([("mode".to_string(), "start".to_string())]), + _ => return None, + }; + Some(BlockState { properties: value }) + } +} +impl DefaultableComponent for UseRemainder { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::BeetrootSoup => ItemStack::from(Item::Bowl), + Item::HoneyBottle => ItemStack::from(Item::GlassBottle), + Item::MilkBucket => ItemStack::from(Item::Bucket), + Item::MushroomStew => ItemStack::from(Item::Bowl), + Item::Potion => ItemStack::from(Item::GlassBottle), + Item::RabbitStew => ItemStack::from(Item::Bowl), + Item::SuspiciousStew => ItemStack::from(Item::Bowl), + _ => return None, + }; + Some(UseRemainder { + convert_into: value, + }) + } +} +impl DefaultableComponent for BannerPatterns { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::BlackBanner => vec![], + Item::BlueBanner => vec![], + Item::BrownBanner => vec![], + Item::CyanBanner => vec![], + Item::GrayBanner => vec![], + Item::GreenBanner => vec![], + Item::LightBlueBanner => vec![], + Item::LightGrayBanner => vec![], + Item::LimeBanner => vec![], + Item::MagentaBanner => vec![], + Item::OrangeBanner => vec![], + Item::PinkBanner => vec![], + Item::PurpleBanner => vec![], + Item::RedBanner => vec![], + Item::Shield => vec![], + Item::WhiteBanner => vec![], + Item::YellowBanner => vec![], + _ => return None, + }; + Some(BannerPatterns { patterns: value }) + } +} +impl DefaultableComponent for BundleContents { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::BlackBundle => vec![], + Item::BlueBundle => vec![], + Item::BrownBundle => vec![], + Item::Bundle => vec![], + Item::CyanBundle => vec![], + Item::GrayBundle => vec![], + Item::GreenBundle => vec![], + Item::LightBlueBundle => vec![], + Item::LightGrayBundle => vec![], + Item::LimeBundle => vec![], + Item::MagentaBundle => vec![], + Item::OrangeBundle => vec![], + Item::PinkBundle => vec![], + Item::PurpleBundle => vec![], + Item::RedBundle => vec![], + Item::WhiteBundle => vec![], + Item::YellowBundle => vec![], + _ => return None, + }; + Some(BundleContents { items: value }) + } +} +impl DefaultableComponent for Equippable { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::BlackCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:black_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::BlackHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:black_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::BlueCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:blue_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::BlueHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:blue_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::BrownCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:brown_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::BrownHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:brown_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::CarvedPumpkin => Equippable { + camera_overlay: Some("minecraft:misc/pumpkinblur".into()), + slot: EquipmentSlot::Head, + swappable: false, + ..Equippable::new() + }, + Item::ChainmailBoots => Equippable { + asset_id: Some("minecraft:chainmail".into()), + equip_sound: SoundEvent::ItemArmorEquipChain, + slot: EquipmentSlot::Feet, + ..Equippable::new() + }, + Item::ChainmailChestplate => Equippable { + asset_id: Some("minecraft:chainmail".into()), + equip_sound: SoundEvent::ItemArmorEquipChain, + slot: EquipmentSlot::Chest, + ..Equippable::new() + }, + Item::ChainmailHelmet => Equippable { + asset_id: Some("minecraft:chainmail".into()), + equip_sound: SoundEvent::ItemArmorEquipChain, + slot: EquipmentSlot::Head, + ..Equippable::new() + }, + Item::ChainmailLeggings => Equippable { + asset_id: Some("minecraft:chainmail".into()), + equip_sound: SoundEvent::ItemArmorEquipChain, + slot: EquipmentSlot::Legs, + ..Equippable::new() + }, + Item::CreeperHead => Equippable { + slot: EquipmentSlot::Head, + swappable: false, + ..Equippable::new() + }, + Item::CyanCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:cyan_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::CyanHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:cyan_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::DiamondBoots => Equippable { + asset_id: Some("minecraft:diamond".into()), + equip_sound: SoundEvent::ItemArmorEquipDiamond, + slot: EquipmentSlot::Feet, + ..Equippable::new() + }, + Item::DiamondChestplate => Equippable { + asset_id: Some("minecraft:diamond".into()), + equip_sound: SoundEvent::ItemArmorEquipDiamond, + slot: EquipmentSlot::Chest, + ..Equippable::new() + }, + Item::DiamondHelmet => Equippable { + asset_id: Some("minecraft:diamond".into()), + equip_sound: SoundEvent::ItemArmorEquipDiamond, + slot: EquipmentSlot::Head, + ..Equippable::new() + }, + Item::DiamondHorseArmor => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_WEAR_HORSE_ARMOR + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:diamond".into()), + can_be_sheared: true, + damage_on_hurt: false, + equip_sound: SoundEvent::EntityHorseArmor, + shearing_sound: SoundEvent::ItemHorseArmorUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::DiamondLeggings => Equippable { + asset_id: Some("minecraft:diamond".into()), + equip_sound: SoundEvent::ItemArmorEquipDiamond, + slot: EquipmentSlot::Legs, + ..Equippable::new() + }, + Item::DragonHead => Equippable { + slot: EquipmentSlot::Head, + swappable: false, + ..Equippable::new() + }, + Item::Elytra => Equippable { + asset_id: Some("minecraft:elytra".into()), + damage_on_hurt: false, + equip_sound: SoundEvent::ItemArmorEquipElytra, + slot: EquipmentSlot::Chest, + ..Equippable::new() + }, + Item::GoldenBoots => Equippable { + asset_id: Some("minecraft:gold".into()), + equip_sound: SoundEvent::ItemArmorEquipGold, + slot: EquipmentSlot::Feet, + ..Equippable::new() + }, + Item::GoldenChestplate => Equippable { + asset_id: Some("minecraft:gold".into()), + equip_sound: SoundEvent::ItemArmorEquipGold, + slot: EquipmentSlot::Chest, + ..Equippable::new() + }, + Item::GoldenHelmet => Equippable { + asset_id: Some("minecraft:gold".into()), + equip_sound: SoundEvent::ItemArmorEquipGold, + slot: EquipmentSlot::Head, + ..Equippable::new() + }, + Item::GoldenHorseArmor => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_WEAR_HORSE_ARMOR + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:gold".into()), + can_be_sheared: true, + damage_on_hurt: false, + equip_sound: SoundEvent::EntityHorseArmor, + shearing_sound: SoundEvent::ItemHorseArmorUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::GoldenLeggings => Equippable { + asset_id: Some("minecraft:gold".into()), + equip_sound: SoundEvent::ItemArmorEquipGold, + slot: EquipmentSlot::Legs, + ..Equippable::new() + }, + Item::GrayCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:gray_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::GrayHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:gray_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::GreenCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:green_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::GreenHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:green_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::IronBoots => Equippable { + asset_id: Some("minecraft:iron".into()), + equip_sound: SoundEvent::ItemArmorEquipIron, + slot: EquipmentSlot::Feet, + ..Equippable::new() + }, + Item::IronChestplate => Equippable { + asset_id: Some("minecraft:iron".into()), + equip_sound: SoundEvent::ItemArmorEquipIron, + slot: EquipmentSlot::Chest, + ..Equippable::new() + }, + Item::IronHelmet => Equippable { + asset_id: Some("minecraft:iron".into()), + equip_sound: SoundEvent::ItemArmorEquipIron, + slot: EquipmentSlot::Head, + ..Equippable::new() + }, + Item::IronHorseArmor => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_WEAR_HORSE_ARMOR + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:iron".into()), + can_be_sheared: true, + damage_on_hurt: false, + equip_sound: SoundEvent::EntityHorseArmor, + shearing_sound: SoundEvent::ItemHorseArmorUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::IronLeggings => Equippable { + asset_id: Some("minecraft:iron".into()), + equip_sound: SoundEvent::ItemArmorEquipIron, + slot: EquipmentSlot::Legs, + ..Equippable::new() + }, + Item::LeatherBoots => Equippable { + asset_id: Some("minecraft:leather".into()), + equip_sound: SoundEvent::ItemArmorEquipLeather, + slot: EquipmentSlot::Feet, + ..Equippable::new() + }, + Item::LeatherChestplate => Equippable { + asset_id: Some("minecraft:leather".into()), + equip_sound: SoundEvent::ItemArmorEquipLeather, + slot: EquipmentSlot::Chest, + ..Equippable::new() + }, + Item::LeatherHelmet => Equippable { + asset_id: Some("minecraft:leather".into()), + equip_sound: SoundEvent::ItemArmorEquipLeather, + slot: EquipmentSlot::Head, + ..Equippable::new() + }, + Item::LeatherHorseArmor => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_WEAR_HORSE_ARMOR + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:leather".into()), + can_be_sheared: true, + damage_on_hurt: false, + equip_sound: SoundEvent::EntityHorseArmor, + shearing_sound: SoundEvent::ItemHorseArmorUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::LeatherLeggings => Equippable { + asset_id: Some("minecraft:leather".into()), + equip_sound: SoundEvent::ItemArmorEquipLeather, + slot: EquipmentSlot::Legs, + ..Equippable::new() + }, + Item::LightBlueCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:light_blue_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::LightBlueHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:light_blue_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::LightGrayCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:light_gray_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::LightGrayHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:light_gray_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::LimeCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:lime_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::LimeHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:lime_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::MagentaCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:magenta_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::MagentaHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:magenta_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::NetheriteBoots => Equippable { + asset_id: Some("minecraft:netherite".into()), + equip_sound: SoundEvent::ItemArmorEquipNetherite, + slot: EquipmentSlot::Feet, + ..Equippable::new() + }, + Item::NetheriteChestplate => Equippable { + asset_id: Some("minecraft:netherite".into()), + equip_sound: SoundEvent::ItemArmorEquipNetherite, + slot: EquipmentSlot::Chest, + ..Equippable::new() + }, + Item::NetheriteHelmet => Equippable { + asset_id: Some("minecraft:netherite".into()), + equip_sound: SoundEvent::ItemArmorEquipNetherite, + slot: EquipmentSlot::Head, + ..Equippable::new() + }, + Item::NetheriteLeggings => Equippable { + asset_id: Some("minecraft:netherite".into()), + equip_sound: SoundEvent::ItemArmorEquipNetherite, + slot: EquipmentSlot::Legs, + ..Equippable::new() + }, + Item::OrangeCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:orange_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::OrangeHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:orange_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::PiglinHead => Equippable { + slot: EquipmentSlot::Head, + swappable: false, + ..Equippable::new() + }, + Item::PinkCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:pink_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::PinkHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:pink_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::PlayerHead => Equippable { + slot: EquipmentSlot::Head, + swappable: false, + ..Equippable::new() + }, + Item::PurpleCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:purple_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::PurpleHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:purple_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::RedCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:red_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::RedHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:red_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::Saddle => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_SADDLE + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:saddle".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHorseSaddle, + shearing_sound: SoundEvent::ItemSaddleUnequip, + slot: EquipmentSlot::Saddle, + ..Equippable::new() + }, + Item::Shield => Equippable { + slot: EquipmentSlot::Offhand, + swappable: false, + ..Equippable::new() + }, + Item::SkeletonSkull => Equippable { + slot: EquipmentSlot::Head, + swappable: false, + ..Equippable::new() + }, + Item::TurtleHelmet => Equippable { + asset_id: Some("minecraft:turtle_scute".into()), + equip_sound: SoundEvent::ItemArmorEquipTurtle, + slot: EquipmentSlot::Head, + ..Equippable::new() + }, + Item::WhiteCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:white_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::WhiteHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:white_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::WitherSkeletonSkull => Equippable { + slot: EquipmentSlot::Head, + swappable: false, + ..Equippable::new() + }, + Item::WolfArmor => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Wolf], + }), + asset_id: Some("minecraft:armadillo_scute".into()), + can_be_sheared: true, + equip_sound: SoundEvent::ItemArmorEquipWolf, + shearing_sound: SoundEvent::ItemArmorUnequipWolf, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::YellowCarpet => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: vec![EntityKind::Llama, EntityKind::TraderLlama], + }), + asset_id: Some("minecraft:yellow_carpet".into()), + can_be_sheared: true, + equip_sound: SoundEvent::EntityLlamaSwag, + shearing_sound: SoundEvent::ItemLlamaCarpetUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::YellowHarness => Equippable { + allowed_entities: Some(HolderSet::Direct { + contents: azalea_registry::tags::entities::CAN_EQUIP_HARNESS + .clone() + .into_iter() + .collect(), + }), + asset_id: Some("minecraft:yellow_harness".into()), + can_be_sheared: true, + equip_on_interact: true, + equip_sound: SoundEvent::EntityHappyGhastEquip, + shearing_sound: SoundEvent::EntityHappyGhastUnequip, + slot: EquipmentSlot::Body, + ..Equippable::new() + }, + Item::ZombieHead => Equippable { + slot: EquipmentSlot::Head, + swappable: false, + ..Equippable::new() + }, + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for ChickenVariant { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::BlueEgg => ChickenVariant::Referenced("minecraft:cold".into()), + Item::BrownEgg => ChickenVariant::Referenced("minecraft:warm".into()), + Item::Egg => ChickenVariant::Referenced("minecraft:temperate".into()), + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for Enchantable { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Book => 1, + Item::Bow => 1, + Item::ChainmailBoots => 12, + Item::ChainmailChestplate => 12, + Item::ChainmailHelmet => 12, + Item::ChainmailLeggings => 12, + Item::Crossbow => 1, + Item::DiamondAxe => 10, + Item::DiamondBoots => 10, + Item::DiamondChestplate => 10, + Item::DiamondHelmet => 10, + Item::DiamondHoe => 10, + Item::DiamondLeggings => 10, + Item::DiamondPickaxe => 10, + Item::DiamondShovel => 10, + Item::DiamondSword => 10, + Item::FishingRod => 1, + Item::GoldenAxe => 22, + Item::GoldenBoots => 25, + Item::GoldenChestplate => 25, + Item::GoldenHelmet => 25, + Item::GoldenHoe => 22, + Item::GoldenLeggings => 25, + Item::GoldenPickaxe => 22, + Item::GoldenShovel => 22, + Item::GoldenSword => 22, + Item::IronAxe => 14, + Item::IronBoots => 9, + Item::IronChestplate => 9, + Item::IronHelmet => 9, + Item::IronHoe => 14, + Item::IronLeggings => 9, + Item::IronPickaxe => 14, + Item::IronShovel => 14, + Item::IronSword => 14, + Item::LeatherBoots => 15, + Item::LeatherChestplate => 15, + Item::LeatherHelmet => 15, + Item::LeatherLeggings => 15, + Item::Mace => 15, + Item::NetheriteAxe => 15, + Item::NetheriteBoots => 15, + Item::NetheriteChestplate => 15, + Item::NetheriteHelmet => 15, + Item::NetheriteHoe => 15, + Item::NetheriteLeggings => 15, + Item::NetheritePickaxe => 15, + Item::NetheriteShovel => 15, + Item::NetheriteSword => 15, + Item::StoneAxe => 5, + Item::StoneHoe => 5, + Item::StonePickaxe => 5, + Item::StoneShovel => 5, + Item::StoneSword => 5, + Item::Trident => 1, + Item::TurtleHelmet => 9, + Item::WoodenAxe => 15, + Item::WoodenHoe => 15, + Item::WoodenPickaxe => 15, + Item::WoodenShovel => 15, + Item::WoodenSword => 15, + _ => return None, + }; + Some(Enchantable { value: value }) + } +} +impl DefaultableComponent for ProvidesBannerPatterns { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::BordureIndentedBannerPattern => "#minecraft:pattern_item/bordure_indented".into(), + Item::CreeperBannerPattern => "#minecraft:pattern_item/creeper".into(), + Item::FieldMasonedBannerPattern => "#minecraft:pattern_item/field_masoned".into(), + Item::FlowBannerPattern => "#minecraft:pattern_item/flow".into(), + Item::FlowerBannerPattern => "#minecraft:pattern_item/flower".into(), + Item::GlobeBannerPattern => "#minecraft:pattern_item/globe".into(), + Item::GusterBannerPattern => "#minecraft:pattern_item/guster".into(), + Item::MojangBannerPattern => "#minecraft:pattern_item/mojang".into(), + Item::PiglinBannerPattern => "#minecraft:pattern_item/piglin".into(), + Item::SkullBannerPattern => "#minecraft:pattern_item/skull".into(), + _ => return None, + }; + Some(ProvidesBannerPatterns { key: value }) + } +} +impl DefaultableComponent for Damage { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Bow => 0, + Item::Brush => 0, + Item::CarrotOnAStick => 0, + Item::ChainmailBoots => 0, + Item::ChainmailChestplate => 0, + Item::ChainmailHelmet => 0, + Item::ChainmailLeggings => 0, + Item::Crossbow => 0, + Item::DiamondAxe => 0, + Item::DiamondBoots => 0, + Item::DiamondChestplate => 0, + Item::DiamondHelmet => 0, + Item::DiamondHoe => 0, + Item::DiamondLeggings => 0, + Item::DiamondPickaxe => 0, + Item::DiamondShovel => 0, + Item::DiamondSword => 0, + Item::Elytra => 0, + Item::FishingRod => 0, + Item::FlintAndSteel => 0, + Item::GoldenAxe => 0, + Item::GoldenBoots => 0, + Item::GoldenChestplate => 0, + Item::GoldenHelmet => 0, + Item::GoldenHoe => 0, + Item::GoldenLeggings => 0, + Item::GoldenPickaxe => 0, + Item::GoldenShovel => 0, + Item::GoldenSword => 0, + Item::IronAxe => 0, + Item::IronBoots => 0, + Item::IronChestplate => 0, + Item::IronHelmet => 0, + Item::IronHoe => 0, + Item::IronLeggings => 0, + Item::IronPickaxe => 0, + Item::IronShovel => 0, + Item::IronSword => 0, + Item::LeatherBoots => 0, + Item::LeatherChestplate => 0, + Item::LeatherHelmet => 0, + Item::LeatherLeggings => 0, + Item::Mace => 0, + Item::NetheriteAxe => 0, + Item::NetheriteBoots => 0, + Item::NetheriteChestplate => 0, + Item::NetheriteHelmet => 0, + Item::NetheriteHoe => 0, + Item::NetheriteLeggings => 0, + Item::NetheritePickaxe => 0, + Item::NetheriteShovel => 0, + Item::NetheriteSword => 0, + Item::Shears => 0, + Item::Shield => 0, + Item::StoneAxe => 0, + Item::StoneHoe => 0, + Item::StonePickaxe => 0, + Item::StoneShovel => 0, + Item::StoneSword => 0, + Item::Trident => 0, + Item::TurtleHelmet => 0, + Item::WarpedFungusOnAStick => 0, + Item::WolfArmor => 0, + Item::WoodenAxe => 0, + Item::WoodenHoe => 0, + Item::WoodenPickaxe => 0, + Item::WoodenShovel => 0, + Item::WoodenSword => 0, + _ => return None, + }; + Some(Damage { amount: value }) + } +} +impl DefaultableComponent for MaxDamage { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Bow => 384, + Item::Brush => 64, + Item::CarrotOnAStick => 25, + Item::ChainmailBoots => 195, + Item::ChainmailChestplate => 240, + Item::ChainmailHelmet => 165, + Item::ChainmailLeggings => 225, + Item::Crossbow => 465, + Item::DiamondAxe => 1561, + Item::DiamondBoots => 429, + Item::DiamondChestplate => 528, + Item::DiamondHelmet => 363, + Item::DiamondHoe => 1561, + Item::DiamondLeggings => 495, + Item::DiamondPickaxe => 1561, + Item::DiamondShovel => 1561, + Item::DiamondSword => 1561, + Item::Elytra => 432, + Item::FishingRod => 64, + Item::FlintAndSteel => 64, + Item::GoldenAxe => 32, + Item::GoldenBoots => 91, + Item::GoldenChestplate => 112, + Item::GoldenHelmet => 77, + Item::GoldenHoe => 32, + Item::GoldenLeggings => 105, + Item::GoldenPickaxe => 32, + Item::GoldenShovel => 32, + Item::GoldenSword => 32, + Item::IronAxe => 250, + Item::IronBoots => 195, + Item::IronChestplate => 240, + Item::IronHelmet => 165, + Item::IronHoe => 250, + Item::IronLeggings => 225, + Item::IronPickaxe => 250, + Item::IronShovel => 250, + Item::IronSword => 250, + Item::LeatherBoots => 65, + Item::LeatherChestplate => 80, + Item::LeatherHelmet => 55, + Item::LeatherLeggings => 75, + Item::Mace => 500, + Item::NetheriteAxe => 2031, + Item::NetheriteBoots => 481, + Item::NetheriteChestplate => 592, + Item::NetheriteHelmet => 407, + Item::NetheriteHoe => 2031, + Item::NetheriteLeggings => 555, + Item::NetheritePickaxe => 2031, + Item::NetheriteShovel => 2031, + Item::NetheriteSword => 2031, + Item::Shears => 238, + Item::Shield => 336, + Item::StoneAxe => 131, + Item::StoneHoe => 131, + Item::StonePickaxe => 131, + Item::StoneShovel => 131, + Item::StoneSword => 131, + Item::Trident => 250, + Item::TurtleHelmet => 275, + Item::WarpedFungusOnAStick => 100, + Item::WolfArmor => 64, + Item::WoodenAxe => 59, + Item::WoodenHoe => 59, + Item::WoodenPickaxe => 59, + Item::WoodenShovel => 59, + Item::WoodenSword => 59, + _ => return None, + }; + Some(MaxDamage { amount: value }) + } +} +impl DefaultableComponent for Repairable { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::ChainmailBoots => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_CHAIN_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::ChainmailChestplate => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_CHAIN_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::ChainmailHelmet => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_CHAIN_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::ChainmailLeggings => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_CHAIN_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::DiamondAxe => HolderSet::Direct { + contents: azalea_registry::tags::items::DIAMOND_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::DiamondBoots => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_DIAMOND_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::DiamondChestplate => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_DIAMOND_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::DiamondHelmet => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_DIAMOND_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::DiamondHoe => HolderSet::Direct { + contents: azalea_registry::tags::items::DIAMOND_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::DiamondLeggings => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_DIAMOND_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::DiamondPickaxe => HolderSet::Direct { + contents: azalea_registry::tags::items::DIAMOND_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::DiamondShovel => HolderSet::Direct { + contents: azalea_registry::tags::items::DIAMOND_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::DiamondSword => HolderSet::Direct { + contents: azalea_registry::tags::items::DIAMOND_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::Elytra => HolderSet::Direct { + contents: vec![Item::PhantomMembrane], + }, + Item::GoldenAxe => HolderSet::Direct { + contents: azalea_registry::tags::items::GOLD_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::GoldenBoots => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_GOLD_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::GoldenChestplate => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_GOLD_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::GoldenHelmet => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_GOLD_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::GoldenHoe => HolderSet::Direct { + contents: azalea_registry::tags::items::GOLD_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::GoldenLeggings => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_GOLD_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::GoldenPickaxe => HolderSet::Direct { + contents: azalea_registry::tags::items::GOLD_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::GoldenShovel => HolderSet::Direct { + contents: azalea_registry::tags::items::GOLD_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::GoldenSword => HolderSet::Direct { + contents: azalea_registry::tags::items::GOLD_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::IronAxe => HolderSet::Direct { + contents: azalea_registry::tags::items::IRON_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::IronBoots => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_IRON_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::IronChestplate => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_IRON_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::IronHelmet => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_IRON_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::IronHoe => HolderSet::Direct { + contents: azalea_registry::tags::items::IRON_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::IronLeggings => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_IRON_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::IronPickaxe => HolderSet::Direct { + contents: azalea_registry::tags::items::IRON_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::IronShovel => HolderSet::Direct { + contents: azalea_registry::tags::items::IRON_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::IronSword => HolderSet::Direct { + contents: azalea_registry::tags::items::IRON_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::LeatherBoots => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_LEATHER_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::LeatherChestplate => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_LEATHER_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::LeatherHelmet => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_LEATHER_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::LeatherLeggings => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_LEATHER_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::Mace => HolderSet::Direct { + contents: vec![Item::BreezeRod], + }, + Item::NetheriteAxe => HolderSet::Direct { + contents: azalea_registry::tags::items::NETHERITE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::NetheriteBoots => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_NETHERITE_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::NetheriteChestplate => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_NETHERITE_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::NetheriteHelmet => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_NETHERITE_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::NetheriteHoe => HolderSet::Direct { + contents: azalea_registry::tags::items::NETHERITE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::NetheriteLeggings => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_NETHERITE_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::NetheritePickaxe => HolderSet::Direct { + contents: azalea_registry::tags::items::NETHERITE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::NetheriteShovel => HolderSet::Direct { + contents: azalea_registry::tags::items::NETHERITE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::NetheriteSword => HolderSet::Direct { + contents: azalea_registry::tags::items::NETHERITE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::Shield => HolderSet::Direct { + contents: azalea_registry::tags::items::WOODEN_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::StoneAxe => HolderSet::Direct { + contents: azalea_registry::tags::items::STONE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::StoneHoe => HolderSet::Direct { + contents: azalea_registry::tags::items::STONE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::StonePickaxe => HolderSet::Direct { + contents: azalea_registry::tags::items::STONE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::StoneShovel => HolderSet::Direct { + contents: azalea_registry::tags::items::STONE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::StoneSword => HolderSet::Direct { + contents: azalea_registry::tags::items::STONE_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::TurtleHelmet => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_TURTLE_HELMET + .clone() + .into_iter() + .collect(), + }, + Item::WolfArmor => HolderSet::Direct { + contents: azalea_registry::tags::items::REPAIRS_WOLF_ARMOR + .clone() + .into_iter() + .collect(), + }, + Item::WoodenAxe => HolderSet::Direct { + contents: azalea_registry::tags::items::WOODEN_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::WoodenHoe => HolderSet::Direct { + contents: azalea_registry::tags::items::WOODEN_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::WoodenPickaxe => HolderSet::Direct { + contents: azalea_registry::tags::items::WOODEN_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::WoodenShovel => HolderSet::Direct { + contents: azalea_registry::tags::items::WOODEN_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + Item::WoodenSword => HolderSet::Direct { + contents: azalea_registry::tags::items::WOODEN_TOOL_MATERIALS + .clone() + .into_iter() + .collect(), + }, + _ => return None, + }; + Some(Repairable { items: value }) + } +} +impl DefaultableComponent for UseCooldown { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::ChorusFruit => UseCooldown { + seconds: 1.0, + ..UseCooldown::new() + }, + Item::EnderPearl => UseCooldown { + seconds: 1.0, + ..UseCooldown::new() + }, + Item::WindCharge => UseCooldown { + seconds: 0.5, + ..UseCooldown::new() + }, + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for ChargedProjectiles { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Crossbow => vec![], + _ => return None, + }; + Some(ChargedProjectiles { items: value }) + } +} +impl DefaultableComponent for DebugStickState { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::DebugStick => NbtCompound::new(), + _ => return None, + }; + Some(DebugStickState { properties: value }) + } +} +impl DefaultableComponent for EnchantmentGlintOverride { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::DebugStick => true, + Item::EnchantedBook => true, + Item::EnchantedGoldenApple => true, + Item::EndCrystal => true, + Item::ExperienceBottle => true, + Item::NetherStar => true, + Item::WrittenBook => true, + _ => return None, + }; + Some(EnchantmentGlintOverride { show_glint: value }) + } +} +impl DefaultableComponent for PotDecorations { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::DecoratedPot => vec![Item::Brick, Item::Brick, Item::Brick, Item::Brick], + _ => return None, + }; + Some(PotDecorations { items: value }) + } +} +impl DefaultableComponent for Tool { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::DiamondAxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_DIAMOND_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_AXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(8.0), + }, + ], + ..Tool::new() + }, + Item::DiamondHoe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_DIAMOND_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_HOE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(8.0), + }, + ], + ..Tool::new() + }, + Item::DiamondPickaxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_DIAMOND_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_PICKAXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(8.0), + }, + ], + ..Tool::new() + }, + Item::DiamondShovel => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_DIAMOND_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_SHOVEL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(8.0), + }, + ], + ..Tool::new() + }, + Item::DiamondSword => Tool { + can_destroy_blocks_in_creative: false, + damage_per_block: 2, + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: vec![Block::Cobweb], + }, + correct_for_drops: Some(true), + speed: Some(15.0), + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_INSTANTLY_MINES + .clone() + .into_iter() + .collect(), + }, + speed: Some(3.4028235e+38), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_EFFICIENT + .clone() + .into_iter() + .collect(), + }, + speed: Some(1.5), + ..ToolRule::new() + }, + ], + ..Tool::new() + }, + Item::GoldenAxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_GOLD_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_AXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(12.0), + }, + ], + ..Tool::new() + }, + Item::GoldenHoe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_GOLD_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_HOE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(12.0), + }, + ], + ..Tool::new() + }, + Item::GoldenPickaxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_GOLD_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_PICKAXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(12.0), + }, + ], + ..Tool::new() + }, + Item::GoldenShovel => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_GOLD_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_SHOVEL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(12.0), + }, + ], + ..Tool::new() + }, + Item::GoldenSword => Tool { + can_destroy_blocks_in_creative: false, + damage_per_block: 2, + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: vec![Block::Cobweb], + }, + correct_for_drops: Some(true), + speed: Some(15.0), + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_INSTANTLY_MINES + .clone() + .into_iter() + .collect(), + }, + speed: Some(3.4028235e+38), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_EFFICIENT + .clone() + .into_iter() + .collect(), + }, + speed: Some(1.5), + ..ToolRule::new() + }, + ], + ..Tool::new() + }, + Item::IronAxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_IRON_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_AXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(6.0), + }, + ], + ..Tool::new() + }, + Item::IronHoe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_IRON_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_HOE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(6.0), + }, + ], + ..Tool::new() + }, + Item::IronPickaxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_IRON_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_PICKAXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(6.0), + }, + ], + ..Tool::new() + }, + Item::IronShovel => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_IRON_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_SHOVEL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(6.0), + }, + ], + ..Tool::new() + }, + Item::IronSword => Tool { + can_destroy_blocks_in_creative: false, + damage_per_block: 2, + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: vec![Block::Cobweb], + }, + correct_for_drops: Some(true), + speed: Some(15.0), + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_INSTANTLY_MINES + .clone() + .into_iter() + .collect(), + }, + speed: Some(3.4028235e+38), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_EFFICIENT + .clone() + .into_iter() + .collect(), + }, + speed: Some(1.5), + ..ToolRule::new() + }, + ], + ..Tool::new() + }, + Item::Mace => Tool { + can_destroy_blocks_in_creative: false, + damage_per_block: 2, + rules: vec![], + ..Tool::new() + }, + Item::NetheriteAxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_NETHERITE_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_AXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(9.0), + }, + ], + ..Tool::new() + }, + Item::NetheriteHoe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_NETHERITE_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_HOE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(9.0), + }, + ], + ..Tool::new() + }, + Item::NetheritePickaxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_NETHERITE_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_PICKAXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(9.0), + }, + ], + ..Tool::new() + }, + Item::NetheriteShovel => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_NETHERITE_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_SHOVEL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(9.0), + }, + ], + ..Tool::new() + }, + Item::NetheriteSword => Tool { + can_destroy_blocks_in_creative: false, + damage_per_block: 2, + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: vec![Block::Cobweb], + }, + correct_for_drops: Some(true), + speed: Some(15.0), + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_INSTANTLY_MINES + .clone() + .into_iter() + .collect(), + }, + speed: Some(3.4028235e+38), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_EFFICIENT + .clone() + .into_iter() + .collect(), + }, + speed: Some(1.5), + ..ToolRule::new() + }, + ], + ..Tool::new() + }, + Item::Shears => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: vec![Block::Cobweb], + }, + correct_for_drops: Some(true), + speed: Some(15.0), + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::LEAVES + .clone() + .into_iter() + .collect(), + }, + speed: Some(15.0), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::WOOL + .clone() + .into_iter() + .collect(), + }, + speed: Some(5.0), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: vec![Block::Vine, Block::GlowLichen], + }, + speed: Some(2.0), + ..ToolRule::new() + }, + ], + ..Tool::new() + }, + Item::StoneAxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_STONE_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_AXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(4.0), + }, + ], + ..Tool::new() + }, + Item::StoneHoe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_STONE_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_HOE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(4.0), + }, + ], + ..Tool::new() + }, + Item::StonePickaxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_STONE_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_PICKAXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(4.0), + }, + ], + ..Tool::new() + }, + Item::StoneShovel => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_STONE_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_SHOVEL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(4.0), + }, + ], + ..Tool::new() + }, + Item::StoneSword => Tool { + can_destroy_blocks_in_creative: false, + damage_per_block: 2, + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: vec![Block::Cobweb], + }, + correct_for_drops: Some(true), + speed: Some(15.0), + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_INSTANTLY_MINES + .clone() + .into_iter() + .collect(), + }, + speed: Some(3.4028235e+38), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_EFFICIENT + .clone() + .into_iter() + .collect(), + }, + speed: Some(1.5), + ..ToolRule::new() + }, + ], + ..Tool::new() + }, + Item::Trident => Tool { + can_destroy_blocks_in_creative: false, + damage_per_block: 2, + rules: vec![], + ..Tool::new() + }, + Item::WoodenAxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_WOODEN_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_AXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(2.0), + }, + ], + ..Tool::new() + }, + Item::WoodenHoe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_WOODEN_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_HOE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(2.0), + }, + ], + ..Tool::new() + }, + Item::WoodenPickaxe => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_WOODEN_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_PICKAXE + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(2.0), + }, + ], + ..Tool::new() + }, + Item::WoodenShovel => Tool { + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::INCORRECT_FOR_WOODEN_TOOL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(false), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::MINEABLE_SHOVEL + .clone() + .into_iter() + .collect(), + }, + correct_for_drops: Some(true), + speed: Some(2.0), + }, + ], + ..Tool::new() + }, + Item::WoodenSword => Tool { + can_destroy_blocks_in_creative: false, + damage_per_block: 2, + rules: vec![ + ToolRule { + blocks: HolderSet::Direct { + contents: vec![Block::Cobweb], + }, + correct_for_drops: Some(true), + speed: Some(15.0), + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_INSTANTLY_MINES + .clone() + .into_iter() + .collect(), + }, + speed: Some(3.4028235e+38), + ..ToolRule::new() + }, + ToolRule { + blocks: HolderSet::Direct { + contents: azalea_registry::tags::blocks::SWORD_EFFICIENT + .clone() + .into_iter() + .collect(), + }, + speed: Some(1.5), + ..ToolRule::new() + }, + ], + ..Tool::new() + }, + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for Weapon { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::DiamondAxe => Weapon { + disable_blocking_for_seconds: 5.0, + item_damage_per_attack: 2, + }, + Item::DiamondHoe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::DiamondPickaxe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::DiamondShovel => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::DiamondSword => Weapon::new(), + Item::GoldenAxe => Weapon { + disable_blocking_for_seconds: 5.0, + item_damage_per_attack: 2, + }, + Item::GoldenHoe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::GoldenPickaxe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::GoldenShovel => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::GoldenSword => Weapon::new(), + Item::IronAxe => Weapon { + disable_blocking_for_seconds: 5.0, + item_damage_per_attack: 2, + }, + Item::IronHoe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::IronPickaxe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::IronShovel => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::IronSword => Weapon::new(), + Item::Mace => Weapon::new(), + Item::NetheriteAxe => Weapon { + disable_blocking_for_seconds: 5.0, + item_damage_per_attack: 2, + }, + Item::NetheriteHoe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::NetheritePickaxe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::NetheriteShovel => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::NetheriteSword => Weapon::new(), + Item::StoneAxe => Weapon { + disable_blocking_for_seconds: 5.0, + item_damage_per_attack: 2, + }, + Item::StoneHoe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::StonePickaxe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::StoneShovel => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::StoneSword => Weapon::new(), + Item::Trident => Weapon::new(), + Item::WoodenAxe => Weapon { + disable_blocking_for_seconds: 5.0, + item_damage_per_attack: 2, + }, + Item::WoodenHoe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::WoodenPickaxe => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::WoodenShovel => Weapon { + item_damage_per_attack: 2, + ..Weapon::new() + }, + Item::WoodenSword => Weapon::new(), + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for Glider { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Elytra => Glider, + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for StoredEnchantments { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::EnchantedBook => HashMap::from_iter([]), + _ => return None, + }; + Some(StoredEnchantments { + enchantments: value, + }) + } +} +impl DefaultableComponent for MapColor { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::FilledMap => 4603950, + _ => return None, + }; + Some(MapColor { color: value }) + } +} +impl DefaultableComponent for MapDecorations { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::FilledMap => NbtCompound::new(), + _ => return None, + }; + Some(MapDecorations { decorations: value }) + } +} +impl DefaultableComponent for Fireworks { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::FireworkRocket => Fireworks { + flight_duration: 1, + ..Fireworks::new() + }, + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for Instrument { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::GoatHorn => Instrument::Registry(azalea_registry::Instrument::PonderGoatHorn), + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for Recipes { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::KnowledgeBook => vec![], + _ => return None, + }; + Some(Recipes { recipes: value }) + } +} +impl DefaultableComponent for PotionContents { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::LingeringPotion => PotionContents::new(), + Item::Potion => PotionContents::new(), + Item::SplashPotion => PotionContents::new(), + Item::TippedArrow => PotionContents::new(), + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for PotionDurationScale { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::LingeringPotion => 0.25, + Item::TippedArrow => 0.125, + _ => return None, + }; + Some(PotionDurationScale { value: value }) + } +} +impl DefaultableComponent for JukeboxPlayable { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::MusicDisc11 => JukeboxPlayable::Referenced("minecraft:11".into()), + Item::MusicDisc13 => JukeboxPlayable::Referenced("minecraft:13".into()), + Item::MusicDisc5 => JukeboxPlayable::Referenced("minecraft:5".into()), + Item::MusicDiscBlocks => JukeboxPlayable::Referenced("minecraft:blocks".into()), + Item::MusicDiscCat => JukeboxPlayable::Referenced("minecraft:cat".into()), + Item::MusicDiscChirp => JukeboxPlayable::Referenced("minecraft:chirp".into()), + Item::MusicDiscCreator => JukeboxPlayable::Referenced("minecraft:creator".into()), + Item::MusicDiscCreatorMusicBox => { + JukeboxPlayable::Referenced("minecraft:creator_music_box".into()) + } + Item::MusicDiscFar => JukeboxPlayable::Referenced("minecraft:far".into()), + Item::MusicDiscLavaChicken => { + JukeboxPlayable::Referenced("minecraft:lava_chicken".into()) + } + Item::MusicDiscMall => JukeboxPlayable::Referenced("minecraft:mall".into()), + Item::MusicDiscMellohi => JukeboxPlayable::Referenced("minecraft:mellohi".into()), + Item::MusicDiscOtherside => JukeboxPlayable::Referenced("minecraft:otherside".into()), + Item::MusicDiscPigstep => JukeboxPlayable::Referenced("minecraft:pigstep".into()), + Item::MusicDiscPrecipice => JukeboxPlayable::Referenced("minecraft:precipice".into()), + Item::MusicDiscRelic => JukeboxPlayable::Referenced("minecraft:relic".into()), + Item::MusicDiscStal => JukeboxPlayable::Referenced("minecraft:stal".into()), + Item::MusicDiscStrad => JukeboxPlayable::Referenced("minecraft:strad".into()), + Item::MusicDiscTears => JukeboxPlayable::Referenced("minecraft:tears".into()), + Item::MusicDiscWait => JukeboxPlayable::Referenced("minecraft:wait".into()), + Item::MusicDiscWard => JukeboxPlayable::Referenced("minecraft:ward".into()), + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for OminousBottleAmplifier { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::OminousBottle => 0, + _ => return None, + }; + Some(OminousBottleAmplifier { amplifier: value }) + } +} +impl DefaultableComponent for BlocksAttacks { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::Shield => BlocksAttacks { + block_delay_seconds: 0.25, + block_sound: Some(azalea_registry::Holder::Reference( + SoundEvent::ItemShieldBlock, + )), + bypassed_by: Some("#minecraft:bypasses_shield".into()), + disabled_sound: Some(azalea_registry::Holder::Reference( + SoundEvent::ItemShieldBreak, + )), + item_damage: ItemDamageFunction { + base: 1.0, + factor: 1.0, + threshold: 3.0, + }, + ..BlocksAttacks::new() + }, + _ => return None, + }; + Some(value) + } +} +impl DefaultableComponent for SuspiciousStewEffects { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::SuspiciousStew => vec![], + _ => return None, + }; + Some(SuspiciousStewEffects { effects: value }) + } +} +impl DefaultableComponent for DeathProtection { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::TotemOfUndying => vec![ + ConsumeEffect::ClearAllEffects {}, + ConsumeEffect::ApplyEffects { + effects: vec![ + MobEffectInstance { + id: MobEffect::Regeneration, + details: MobEffectDetails { + amplifier: 1, + duration: 900, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + MobEffectInstance { + id: MobEffect::Absorption, + details: MobEffectDetails { + amplifier: 1, + duration: 100, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + MobEffectInstance { + id: MobEffect::FireResistance, + details: MobEffectDetails { + duration: 800, + show_icon: true, + ..MobEffectDetails::new() + }, + }, + ], + probability: 1.0, + }, + ], + _ => return None, + }; + Some(DeathProtection { + death_effects: value, + }) + } +} +impl DefaultableComponent for WritableBookContent { + fn default_for_item(item: Item) -> Option<Self> { + let value = match item { + Item::WritableBook => Vec::new(), + _ => return None, + }; + Some(WritableBookContent { pages: value }) + } +} diff --git a/azalea-inventory/src/default_components/mod.rs b/azalea-inventory/src/default_components/mod.rs new file mode 100644 index 00000000..e6150066 --- /dev/null +++ b/azalea-inventory/src/default_components/mod.rs @@ -0,0 +1,20 @@ +pub mod generated; + +use azalea_registry::Item; + +use crate::components::DataComponent; + +/// A [`DataComponent`] that some [`Item`]s may have a default value for. +pub trait DefaultableComponent: DataComponent { + fn default_for_item(item: Item) -> Option<Self> + where + Self: Sized; +} +impl<T: DataComponent> DefaultableComponent for T { + default fn default_for_item(_item: Item) -> Option<Self> { + None + } +} +pub fn get_default_component<T: DefaultableComponent>(item: Item) -> Option<T> { + T::default_for_item(item) +} diff --git a/azalea-inventory/src/item/consume_effect.rs b/azalea-inventory/src/item/consume_effect.rs index 898f64ff..b9540955 100644 --- a/azalea-inventory/src/item/consume_effect.rs +++ b/azalea-inventory/src/item/consume_effect.rs @@ -10,7 +10,9 @@ pub enum ConsumeEffect { effects: Vec<MobEffectInstance>, probability: f32, }, - RemoveEffects(HolderSet<MobEffect, ResourceLocation>), + RemoveEffects { + effects: HolderSet<MobEffect, ResourceLocation>, + }, ClearAllEffects, TeleportRandomly { diameter: f32, diff --git a/azalea-inventory/src/item/mod.rs b/azalea-inventory/src/item/mod.rs index bbff2d50..0e9947e2 100644 --- a/azalea-inventory/src/item/mod.rs +++ b/azalea-inventory/src/item/mod.rs @@ -1,3 +1,5 @@ +use crate::{components::MaxStackSize, default_components::get_default_component}; + pub mod consume_effect; pub trait MaxStackSizeExt { @@ -19,7 +21,6 @@ pub trait MaxStackSizeExt { impl MaxStackSizeExt for azalea_registry::Item { fn max_stack_size(&self) -> i32 { - // TODO: have the properties for every item defined somewhere - 64 + get_default_component::<MaxStackSize>(*self).map_or(64, |s| s.count) } } diff --git a/azalea-inventory/src/lib.rs b/azalea-inventory/src/lib.rs index 3bcb0019..4a15ea31 100644 --- a/azalea-inventory/src/lib.rs +++ b/azalea-inventory/src/lib.rs @@ -1,6 +1,9 @@ //! Representations of various inventory data structures in Minecraft. +#![feature(min_specialization)] + pub mod components; +pub mod default_components; pub mod item; pub mod operations; mod slot; diff --git a/azalea-inventory/src/slot.rs b/azalea-inventory/src/slot.rs index 2d00236f..57f57696 100644 --- a/azalea-inventory/src/slot.rs +++ b/azalea-inventory/src/slot.rs @@ -1,14 +1,18 @@ use std::{ any::Any, + borrow::Cow, fmt, io::{self, Cursor, Write}, }; use azalea_buf::{AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError}; -use azalea_registry::DataComponentKind; +use azalea_registry::{DataComponentKind, Item}; use indexmap::IndexMap; -use crate::components::{self}; +use crate::{ + components::{self}, + default_components::get_default_component, +}; /// Either an item in an inventory or nothing. #[derive(Debug, Clone, Default, PartialEq)] @@ -19,6 +23,17 @@ pub enum ItemStack { } impl ItemStack { + /// Create a new [`ItemStack`] with the given number of [`Item`]s. + /// + /// If item is air or the count isn't positive, then it'll be set to an + /// empty `ItemStack`. + pub fn new(item: Item, count: i32) -> Self { + let mut i = ItemStack::Present(ItemStackData::new(item, count)); + // set it to Empty if the item is air or if the count isn't positive + i.update_empty(); + i + } + /// Check if the slot is ItemStack::Empty, if the count is <= 0, or if the /// item is air. /// @@ -94,6 +109,14 @@ impl ItemStack { ItemStack::Present(i) => Some(i), } } + + /// Get the value of a data component for this item. + /// + /// This is used for things like getting the damage of an item, or seeing + /// how much food it replenishes. + pub fn get_component<'a, T: components::DataComponent>(&'a self) -> Option<Cow<'a, T>> { + self.as_present().and_then(|i| i.get_component::<T>()) + } } /// An item in an inventory, with a count and NBT. Usually you want @@ -105,10 +128,21 @@ pub struct ItemStackData { /// The count can be zero or negative, but this is rare. pub count: i32, pub kind: azalea_registry::Item, - pub components: DataComponentPatch, + /// The item's components that the server set to be different from the + /// defaults. + pub component_patch: DataComponentPatch, } impl ItemStackData { + /// Create a new [`ItemStackData`] with the given number of [`Item`]s. + pub fn new(item: Item, count: i32) -> Self { + ItemStackData { + count, + kind: item, + component_patch: DataComponentPatch::default(), + } + } + /// Remove `count` items from this slot, returning the removed items. pub fn split(&mut self, count: u32) -> ItemStackData { let returning_count = i32::min(count as i32, self.count); @@ -128,23 +162,27 @@ impl ItemStackData { /// ``` /// # use azalea_inventory::ItemStackData; /// # use azalea_registry::Item; - /// let mut a = ItemStackData { - /// kind: Item::Stone, - /// count: 1, - /// components: Default::default(), - /// }; - /// let mut b = ItemStackData { - /// kind: Item::Stone, - /// count: 2, - /// components: Default::default(), - /// }; + /// let mut a = ItemStackData::from(Item::Stone); + /// let mut b = ItemStackData::new(Item::Stone, 2); /// assert!(a.is_same_item_and_components(&b)); /// /// b.kind = Item::Dirt; /// assert!(!a.is_same_item_and_components(&b)); /// ``` pub fn is_same_item_and_components(&self, other: &ItemStackData) -> bool { - self.kind == other.kind && self.components == other.components + self.kind == other.kind && self.component_patch == other.component_patch + } + + /// Get the value of a data component for this item. + /// + /// This is used for things like getting the damage of an item, or seeing + /// how much food it replenishes. + pub fn get_component<'a, T: components::DataComponent>(&'a self) -> Option<Cow<'a, T>> { + if let Some(c) = self.component_patch.get::<T>() { + Some(Cow::Borrowed(c)) + } else { + get_default_component::<T>(self.kind).map(|c| Cow::Owned(c)) + } } } @@ -155,11 +193,11 @@ impl AzaleaRead for ItemStack { Ok(ItemStack::Empty) } else { let kind = azalea_registry::Item::azalea_read(buf)?; - let components = DataComponentPatch::azalea_read(buf)?; + let component_patch = DataComponentPatch::azalea_read(buf)?; Ok(ItemStack::Present(ItemStackData { count, kind, - components, + component_patch, })) } } @@ -172,7 +210,7 @@ impl AzaleaWrite for ItemStack { ItemStack::Present(i) => { i.count.azalea_write_var(buf)?; i.kind.azalea_write(buf)?; - i.components.azalea_write(buf)?; + i.component_patch.azalea_write(buf)?; } }; Ok(()) @@ -188,6 +226,26 @@ impl From<ItemStackData> for ItemStack { } } } +impl From<Item> for ItemStack { + fn from(item: Item) -> Self { + ItemStack::new(item, 1) + } +} +impl From<(Item, i32)> for ItemStack { + fn from(item: (Item, i32)) -> Self { + ItemStack::new(item.0, item.1) + } +} +impl From<Item> for ItemStackData { + fn from(item: Item) -> Self { + ItemStackData::new(item, 1) + } +} +impl From<(Item, i32)> for ItemStackData { + fn from(item: (Item, i32)) -> Self { + ItemStackData::new(item.0, item.1) + } +} /// An update to an item's data components. /// @@ -207,7 +265,7 @@ impl DataComponentPatch { /// # use azalea_inventory::{ItemStackData, DataComponentPatch, components}; /// # use azalea_registry::Item; /// # fn example(item: &ItemStackData) -> Option<()> { - /// let item_nutrition = item.components.get::<components::Food>()?.nutrition; + /// let item_nutrition = item.component_patch.get::<components::Food>()?.nutrition; /// # Some(()) /// # } /// ``` @@ -230,12 +288,8 @@ impl DataComponentPatch { /// ``` /// # use azalea_inventory::{ItemStackData, DataComponentPatch, components}; /// # use azalea_registry::Item; - /// # let item = ItemStackData { - /// # kind: Item::Stone, - /// # count: 1, - /// # components: Default::default(), - /// # }; - /// let is_edible = item.components.has::<components::Food>(); + /// # let item = ItemStackData::from(Item::Stone); + /// let is_edible = item.component_patch.has::<components::Food>(); /// # assert!(!is_edible); /// ``` pub fn has<T: components::DataComponent>(&self) -> bool { diff --git a/azalea-protocol/src/packets/game/s_container_click.rs b/azalea-protocol/src/packets/game/s_container_click.rs index 19085363..9c4696ed 100644 --- a/azalea-protocol/src/packets/game/s_container_click.rs +++ b/azalea-protocol/src/packets/game/s_container_click.rs @@ -56,7 +56,7 @@ impl From<&ItemStack> for HashedStack { let mut added_components = Vec::new(); let mut removed_components = Vec::new(); - for (&kind, data) in &item.components.components { + for (&kind, data) in &item.component_patch.components { if let Some(data) = data { // encodeCap in TypedDataComponent.java let mut buf = Vec::new(); diff --git a/azalea-registry/src/tags/entities.rs b/azalea-registry/src/tags/entities.rs new file mode 100644 index 00000000..c58e8ab0 --- /dev/null +++ b/azalea-registry/src/tags/entities.rs @@ -0,0 +1,428 @@ +// This file was @generated by codegen/lib/code/tags.py, don't edit it manually! + +use std::{collections::HashSet, sync::LazyLock}; + +use crate::EntityKind; + +pub static AQUATIC: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Turtle, + EntityKind::Axolotl, + EntityKind::Guardian, + EntityKind::ElderGuardian, + EntityKind::Cod, + EntityKind::Pufferfish, + EntityKind::Salmon, + EntityKind::TropicalFish, + EntityKind::Dolphin, + EntityKind::Squid, + EntityKind::GlowSquid, + EntityKind::Tadpole, + ]) +}); +pub static ARROWS: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::Arrow, EntityKind::SpectralArrow])); +pub static ARTHROPOD: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Bee, + EntityKind::Endermite, + EntityKind::Silverfish, + EntityKind::Spider, + EntityKind::CaveSpider, + ]) +}); +pub static AXOLOTL_ALWAYS_HOSTILES: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Drowned, + EntityKind::Guardian, + EntityKind::ElderGuardian, + ]) +}); +pub static AXOLOTL_HUNT_TARGETS: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::TropicalFish, + EntityKind::Pufferfish, + EntityKind::Salmon, + EntityKind::Cod, + EntityKind::Squid, + EntityKind::GlowSquid, + EntityKind::Tadpole, + ]) +}); +pub static BEEHIVE_INHABITORS: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::Bee])); +pub static BOAT: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::OakBoat, + EntityKind::SpruceBoat, + EntityKind::BirchBoat, + EntityKind::JungleBoat, + EntityKind::AcaciaBoat, + EntityKind::CherryBoat, + EntityKind::DarkOakBoat, + EntityKind::PaleOakBoat, + EntityKind::MangroveBoat, + EntityKind::BambooRaft, + ]) +}); +pub static CAN_BREATHE_UNDER_WATER: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Axolotl, + EntityKind::Frog, + EntityKind::Guardian, + EntityKind::ElderGuardian, + EntityKind::Turtle, + EntityKind::GlowSquid, + EntityKind::Cod, + EntityKind::Pufferfish, + EntityKind::Salmon, + EntityKind::Squid, + EntityKind::TropicalFish, + EntityKind::Tadpole, + EntityKind::ArmorStand, + EntityKind::Wither, + EntityKind::Phantom, + EntityKind::Skeleton, + EntityKind::Stray, + EntityKind::WitherSkeleton, + EntityKind::SkeletonHorse, + EntityKind::Bogged, + EntityKind::ZombieHorse, + EntityKind::Zombie, + EntityKind::ZombieVillager, + EntityKind::ZombifiedPiglin, + EntityKind::Zoglin, + EntityKind::Drowned, + EntityKind::Husk, + ]) +}); +pub static CAN_EQUIP_HARNESS: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::HappyGhast])); +pub static CAN_EQUIP_SADDLE: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Horse, + EntityKind::SkeletonHorse, + EntityKind::ZombieHorse, + EntityKind::Donkey, + EntityKind::Mule, + EntityKind::Pig, + EntityKind::Strider, + EntityKind::Camel, + ]) +}); +pub static CAN_TURN_IN_BOATS: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::Breeze])); +pub static CAN_WEAR_HORSE_ARMOR: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::Horse])); +pub static DEFLECTS_PROJECTILES: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::Breeze])); +pub static DISMOUNTS_UNDERWATER: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Camel, + EntityKind::Chicken, + EntityKind::Donkey, + EntityKind::HappyGhast, + EntityKind::Horse, + EntityKind::Llama, + EntityKind::Mule, + EntityKind::Pig, + EntityKind::Ravager, + EntityKind::Spider, + EntityKind::Strider, + EntityKind::TraderLlama, + EntityKind::ZombieHorse, + ]) +}); +pub static FALL_DAMAGE_IMMUNE: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::IronGolem, + EntityKind::SnowGolem, + EntityKind::Shulker, + EntityKind::Allay, + EntityKind::Bat, + EntityKind::Bee, + EntityKind::Blaze, + EntityKind::Cat, + EntityKind::Chicken, + EntityKind::Ghast, + EntityKind::HappyGhast, + EntityKind::Phantom, + EntityKind::MagmaCube, + EntityKind::Ocelot, + EntityKind::Parrot, + EntityKind::Wither, + EntityKind::Breeze, + ]) +}); +pub static FOLLOWABLE_FRIENDLY_MOBS: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Armadillo, + EntityKind::Bee, + EntityKind::Camel, + EntityKind::Cat, + EntityKind::Chicken, + EntityKind::Cow, + EntityKind::Donkey, + EntityKind::Fox, + EntityKind::Goat, + EntityKind::HappyGhast, + EntityKind::Horse, + EntityKind::SkeletonHorse, + EntityKind::Llama, + EntityKind::Mule, + EntityKind::Ocelot, + EntityKind::Panda, + EntityKind::Parrot, + EntityKind::Pig, + EntityKind::PolarBear, + EntityKind::Rabbit, + EntityKind::Sheep, + EntityKind::Sniffer, + EntityKind::Strider, + EntityKind::Villager, + EntityKind::Wolf, + ]) +}); +pub static FREEZE_HURTS_EXTRA_TYPES: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Strider, + EntityKind::Blaze, + EntityKind::MagmaCube, + ]) +}); +pub static FREEZE_IMMUNE_ENTITY_TYPES: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Stray, + EntityKind::PolarBear, + EntityKind::SnowGolem, + EntityKind::Wither, + ]) +}); +pub static FROG_FOOD: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::Slime, EntityKind::MagmaCube])); +pub static IGNORES_POISON_AND_REGEN: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Wither, + EntityKind::Phantom, + EntityKind::Skeleton, + EntityKind::Stray, + EntityKind::WitherSkeleton, + EntityKind::SkeletonHorse, + EntityKind::Bogged, + EntityKind::ZombieHorse, + EntityKind::Zombie, + EntityKind::ZombieVillager, + EntityKind::ZombifiedPiglin, + EntityKind::Zoglin, + EntityKind::Drowned, + EntityKind::Husk, + ]) +}); +pub static ILLAGER: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Evoker, + EntityKind::Illusioner, + EntityKind::Pillager, + EntityKind::Vindicator, + ]) +}); +pub static ILLAGER_FRIENDS: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Evoker, + EntityKind::Illusioner, + EntityKind::Pillager, + EntityKind::Vindicator, + ]) +}); +pub static IMMUNE_TO_INFESTED: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::Silverfish])); +pub static IMMUNE_TO_OOZING: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::Slime])); +pub static IMPACT_PROJECTILES: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::FireworkRocket, + EntityKind::Snowball, + EntityKind::Fireball, + EntityKind::SmallFireball, + EntityKind::Egg, + EntityKind::Trident, + EntityKind::DragonFireball, + EntityKind::WitherSkull, + EntityKind::WindCharge, + EntityKind::BreezeWindCharge, + EntityKind::Arrow, + EntityKind::SpectralArrow, + ]) +}); +pub static INVERTED_HEALING_AND_HARM: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Wither, + EntityKind::Phantom, + EntityKind::Skeleton, + EntityKind::Stray, + EntityKind::WitherSkeleton, + EntityKind::SkeletonHorse, + EntityKind::Bogged, + EntityKind::ZombieHorse, + EntityKind::Zombie, + EntityKind::ZombieVillager, + EntityKind::ZombifiedPiglin, + EntityKind::Zoglin, + EntityKind::Drowned, + EntityKind::Husk, + ]) +}); +pub static NO_ANGER_FROM_WIND_CHARGE: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Breeze, + EntityKind::Skeleton, + EntityKind::Bogged, + EntityKind::Stray, + EntityKind::Zombie, + EntityKind::Husk, + EntityKind::Spider, + EntityKind::CaveSpider, + EntityKind::Slime, + ]) +}); +pub static NON_CONTROLLING_RIDER: LazyLock<HashSet<EntityKind>> = + LazyLock::new(|| HashSet::from_iter(vec![EntityKind::Slime, EntityKind::MagmaCube])); +pub static NOT_SCARY_FOR_PUFFERFISH: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Turtle, + EntityKind::Guardian, + EntityKind::ElderGuardian, + EntityKind::Cod, + EntityKind::Pufferfish, + EntityKind::Salmon, + EntityKind::TropicalFish, + EntityKind::Dolphin, + EntityKind::Squid, + EntityKind::GlowSquid, + EntityKind::Tadpole, + ]) +}); +pub static POWDER_SNOW_WALKABLE_MOBS: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Rabbit, + EntityKind::Endermite, + EntityKind::Silverfish, + EntityKind::Fox, + ]) +}); +pub static RAIDERS: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Evoker, + EntityKind::Pillager, + EntityKind::Ravager, + EntityKind::Vindicator, + EntityKind::Illusioner, + EntityKind::Witch, + ]) +}); +pub static REDIRECTABLE_PROJECTILE: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Fireball, + EntityKind::WindCharge, + EntityKind::BreezeWindCharge, + ]) +}); +pub static SENSITIVE_TO_BANE_OF_ARTHROPODS: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Bee, + EntityKind::Endermite, + EntityKind::Silverfish, + EntityKind::Spider, + EntityKind::CaveSpider, + ]) +}); +pub static SENSITIVE_TO_IMPALING: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Turtle, + EntityKind::Axolotl, + EntityKind::Guardian, + EntityKind::ElderGuardian, + EntityKind::Cod, + EntityKind::Pufferfish, + EntityKind::Salmon, + EntityKind::TropicalFish, + EntityKind::Dolphin, + EntityKind::Squid, + EntityKind::GlowSquid, + EntityKind::Tadpole, + ]) +}); +pub static SENSITIVE_TO_SMITE: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Wither, + EntityKind::Phantom, + EntityKind::Skeleton, + EntityKind::Stray, + EntityKind::WitherSkeleton, + EntityKind::SkeletonHorse, + EntityKind::Bogged, + EntityKind::ZombieHorse, + EntityKind::Zombie, + EntityKind::ZombieVillager, + EntityKind::ZombifiedPiglin, + EntityKind::Zoglin, + EntityKind::Drowned, + EntityKind::Husk, + ]) +}); +pub static SKELETONS: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Skeleton, + EntityKind::Stray, + EntityKind::WitherSkeleton, + EntityKind::SkeletonHorse, + EntityKind::Bogged, + ]) +}); +pub static UNDEAD: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Wither, + EntityKind::Phantom, + EntityKind::Skeleton, + EntityKind::Stray, + EntityKind::WitherSkeleton, + EntityKind::SkeletonHorse, + EntityKind::Bogged, + EntityKind::ZombieHorse, + EntityKind::Zombie, + EntityKind::ZombieVillager, + EntityKind::ZombifiedPiglin, + EntityKind::Zoglin, + EntityKind::Drowned, + EntityKind::Husk, + ]) +}); +pub static WITHER_FRIENDS: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::Wither, + EntityKind::Phantom, + EntityKind::Skeleton, + EntityKind::Stray, + EntityKind::WitherSkeleton, + EntityKind::SkeletonHorse, + EntityKind::Bogged, + EntityKind::ZombieHorse, + EntityKind::Zombie, + EntityKind::ZombieVillager, + EntityKind::ZombifiedPiglin, + EntityKind::Zoglin, + EntityKind::Drowned, + EntityKind::Husk, + ]) +}); +pub static ZOMBIES: LazyLock<HashSet<EntityKind>> = LazyLock::new(|| { + HashSet::from_iter(vec![ + EntityKind::ZombieHorse, + EntityKind::Zombie, + EntityKind::ZombieVillager, + EntityKind::ZombifiedPiglin, + EntityKind::Zoglin, + EntityKind::Drowned, + EntityKind::Husk, + ]) +}); diff --git a/azalea-registry/src/tags/mod.rs b/azalea-registry/src/tags/mod.rs index 7ac46e6a..8d3fb8fe 100644 --- a/azalea-registry/src/tags/mod.rs +++ b/azalea-registry/src/tags/mod.rs @@ -1,3 +1,4 @@ pub mod blocks; +pub mod entities; pub mod fluids; pub mod items; diff --git a/azalea/examples/testbot/commands.rs b/azalea/examples/testbot/commands.rs index 79a73bd9..ecd68ade 100644 --- a/azalea/examples/testbot/commands.rs +++ b/azalea/examples/testbot/commands.rs @@ -19,12 +19,13 @@ pub struct CommandSource { } impl CommandSource { - pub fn reply(&self, message: &str) { + pub fn reply(&self, message: impl Into<String>) { + let message = message.into(); if self.chat.is_whisper() { self.bot - .chat(&format!("/w {} {}", self.chat.sender().unwrap(), message)); + .chat(&format!("/w {} {message}", self.chat.sender().unwrap())); } else { - self.bot.chat(message); + self.bot.chat(&message); } } diff --git a/azalea/examples/testbot/commands/debug.rs b/azalea/examples/testbot/commands/debug.rs index d721fddc..d0d72b40 100644 --- a/azalea/examples/testbot/commands/debug.rs +++ b/azalea/examples/testbot/commands/debug.rs @@ -10,10 +10,12 @@ use azalea::{ interact::pick::HitResultComponent, packet::game, pathfinder::{ExecutingPath, Pathfinder}, + prelude::ContainerClientExt, world::MinecraftEntityId, }; use azalea_core::hit_result::HitResult; use azalea_entity::EntityKindComponent; +use azalea_inventory::components::MaxStackSize; use azalea_world::InstanceContainer; use bevy_ecs::event::Events; use parking_lot::Mutex; @@ -191,6 +193,16 @@ pub fn register(commands: &mut CommandDispatcher<Mutex<CommandSource>>) { source.reply("Ok!"); 1 })); + commands.register(literal("maxstacksize").executes(|ctx: &Ctx| { + let source = ctx.source.lock(); + let max_stack_size = source + .bot + .get_held_item() + .get_component::<MaxStackSize>() + .map_or(-1, |s| s.count); + source.reply(format!("{max_stack_size}")); + 1 + })); commands.register(literal("debugecsleak").executes(|ctx: &Ctx| { let source = ctx.source.lock(); diff --git a/azalea/src/auto_tool.rs b/azalea/src/auto_tool.rs index 1f339c85..0182e200 100644 --- a/azalea/src/auto_tool.rs +++ b/azalea/src/auto_tool.rs @@ -97,7 +97,7 @@ pub fn accurate_best_tool_in_hotbar_for_block( ItemStack::Present(item_stack) => { // lazy way to avoid checking durability since azalea doesn't have durability // data yet - if !item_stack.components.has::<components::Damage>() { + if !item_stack.component_patch.has::<components::Damage>() { this_item_speed = Some(azalea_entity::mining::get_mine_progress( block.as_ref(), item_stack.kind, diff --git a/codegen/genitemcomponents.py b/codegen/genitemcomponents.py index b0002ae2..9a4b4961 100644 --- a/codegen/genitemcomponents.py +++ b/codegen/genitemcomponents.py @@ -1,6 +1,6 @@ -import lib.code.item_components +import lib.code.data_components import lib.code.version -if __name__ == '__main__': +if __name__ == "__main__": version_id = lib.code.version.get_version_id() - lib.code.item_components.generate(version_id) + lib.code.data_components.generate(version_id) diff --git a/codegen/genregistries.py b/codegen/genregistries.py index 175d1b20..d34cce97 100644 --- a/codegen/genregistries.py +++ b/codegen/genregistries.py @@ -1,31 +1,32 @@ import lib.code.inventory import lib.code.registry import lib.code.version -import lib.code.packet import lib.code.utils import lib.code.tags -import lib.download import lib.extract -import lib.utils + def generate(version_id: str): registries = lib.extract.get_registries_report(version_id) lib.code.registry.generate_registries(registries) - lib.code.inventory.update_menus(registries['minecraft:menu']['entries']) + lib.code.inventory.update_menus(registries["minecraft:menu"]["entries"]) - block_tags = lib.extract.get_registry_tags(version_id, 'block') - item_tags = lib.extract.get_registry_tags(version_id, 'item') - fluid_tags = lib.extract.get_registry_tags(version_id, 'fluid') + block_tags = lib.extract.get_registry_tags(version_id, "block") + item_tags = lib.extract.get_registry_tags(version_id, "item") + fluid_tags = lib.extract.get_registry_tags(version_id, "fluid") + entity_tags = lib.extract.get_registry_tags(version_id, "entity_type") - lib.code.tags.generate_tags(block_tags, 'blocks', 'Block') - lib.code.tags.generate_tags(item_tags, 'items', 'Item') - lib.code.tags.generate_tags(fluid_tags, 'fluids', 'Fluid') + lib.code.tags.generate_tags(block_tags, "blocks", "Block") + lib.code.tags.generate_tags(item_tags, "items", "Item") + lib.code.tags.generate_tags(fluid_tags, "fluids", "Fluid") + lib.code.tags.generate_tags(entity_tags, "entities", "EntityKind") lib.code.utils.fmt() - print('Done!') + print("Done!") + -if __name__ == '__main__': +if __name__ == "__main__": version_id = lib.code.version.get_version_id() generate(version_id) diff --git a/codegen/lib/code/data_components.py b/codegen/lib/code/data_components.py new file mode 100644 index 00000000..c6c88f12 --- /dev/null +++ b/codegen/lib/code/data_components.py @@ -0,0 +1,629 @@ +from typing import Any, Optional +import lib.code.utils +import lib.extract +import lib.utils + + +DATA_COMPONENTS_DIR = "azalea-inventory/src/components.rs" +DEFAULT_DATA_COMPONENTS_DIR = "azalea-inventory/src/default_components/generated.rs" + + +def generate(version_id: str): + expected_variants = get_expected_variants(version_id) + actual_variants = get_actual_variants() + + new_variants = [] + removed_variants = [] + + for variant in expected_variants: + if variant not in actual_variants: + new_variants.append(variant) + for variant in actual_variants: + if variant not in expected_variants: + removed_variants.append(variant) + + print("New variants:") + for variant in new_variants: + print("-", variant) + print() + print("Removed variants:") + for variant in removed_variants: + print("-", variant) + print() + + for variant in removed_variants: + print(f"Removing {variant}...") + remove_variant(variant) + for variant in new_variants: + print(f"Adding {variant}...") + add_variant(variant) + + update_default_variants(version_id) + + lib.code.utils.fmt() + + print("Done!") + + +def get_expected_variants(version_id: str): + expected_variants = [] + registries = lib.extract.get_registries_report(version_id) + + registry = registries["minecraft:data_component_type"] + registry_entries = sorted( + registry["entries"].items(), key=lambda x: x[1]["protocol_id"] + ) + for variant_name, _variant in registry_entries: + variant_struct_name = lib.utils.to_camel_case(variant_name.split(":")[-1]) + expected_variants.append(variant_struct_name) + + return expected_variants + + +def get_actual_variants(): + actual_variants = [] + with open(DATA_COMPONENTS_DIR, "r") as f: + code = f.read().split("\n") + + in_match = False + for line in code: + if in_match: + if line == " })": + break + variant_line_prefix = " DataComponentKind::" + if line.startswith(variant_line_prefix): + variant = line[len(variant_line_prefix) :].split(" ", 1)[0] + actual_variants.append(variant) + elif line == " Ok(match kind {": + in_match = True + + return actual_variants + + +def remove_variant(variant: str): + with open(DATA_COMPONENTS_DIR, "r") as f: + code = f.read().split("\n") + + first_line_with_variant = None + line_after_variant = None + + in_match = False + for i, line in enumerate(list(code)): + if in_match: + if line == " })": + line_after_variant = i + break + variant_line_prefix = " DataComponentKind::" + if line.startswith(variant_line_prefix): + if first_line_with_variant is not None: + line_after_variant = i + break + variant_name = line[len(variant_line_prefix) :].split(" ", 1)[0] + if variant_name == variant: + first_line_with_variant = i + elif line == " Ok(match kind {": + in_match = True + + if first_line_with_variant is None: + raise ValueError(f"Variant {variant} not found") + if line_after_variant is None: + raise ValueError(f"Couldn't find end of variant {variant}") + + code = code[:first_line_with_variant] + code[line_after_variant:] + + # now remove the struct + line_before_struct = None # this is the #[derive] line + line_after_struct = None # impl DataComponent for ... {\n...\n} + for i, line in enumerate(list(code)): + if line == f"pub struct {variant} {{" or line == f"pub struct {variant};": + line_before_struct = i - 1 + elif line == f"impl DataComponent for {variant} {{": + line_after_struct = i + 3 + break + if line_before_struct is None: + raise ValueError(f"Couldn't find struct {variant}") + if line_after_struct is None: + raise ValueError(f"Couldn't find impl DataComponent for {variant}") + + code = code[:line_before_struct] + code[line_after_struct:] + + with open(DATA_COMPONENTS_DIR, "w") as f: + f.write("\n".join(code)) + + +def add_variant(variant: str): + with open(DATA_COMPONENTS_DIR, "r") as f: + code = f.read().split("\n") + + in_match = False + last_line_in_match = None + for i, line in enumerate(list(code)): + if in_match: + if line == " })": + last_line_in_match = i + break + elif line == " Ok(match kind {": + in_match = True + + if last_line_in_match is None: + raise ValueError("Couldn't find end of match") + + code = ( + code[:last_line_in_match] + + [ + f" DataComponentKind::{variant} => Box::new({variant}::azalea_read(buf)?),", + ] + + code[last_line_in_match:] + ) + + # now insert the struct + code.append("") + code.append("#[derive(Clone, PartialEq, AzBuf)]") + code.append(f"pub struct {variant} {{") + code.append(" pub todo: todo!(), // see DataComponents.java") + code.append("}") + code.append(f"impl DataComponent for {variant} {{") + code.append(f" const KIND: DataComponentKind = DataComponentKind::{variant};") + code.append("}") + + with open(DATA_COMPONENTS_DIR, "w") as f: + f.write("\n".join(code)) + + +def update_default_variants(version_id: str): + items = lib.extract.get_items_report(version_id) + + code = """// This file was @generated by codegen/lib/code/components.py, don't edit it +// manually! + +#![allow(clippy::all)] + +use std::collections::HashMap; + +use azalea_chat::translatable_component::TranslatableComponent; +use azalea_registry::{Attribute, Block, EntityKind, HolderSet, Item, MobEffect, SoundEvent}; +use simdnbt::owned::NbtCompound; + +use crate::{ + ItemStack, components::*, default_components::DefaultableComponent, + item::consume_effect::ConsumeEffect, +}; + +""".splitlines() + + # { max_stack_size: { air: 64, ... } } + components_to_item_defaults = {} + + for item_resource_id, data in items.items(): + item_resource_id = item_resource_id.split(":")[1] + components = data["components"] + for component_resource_id, component_value in components.items(): + component_resource_id = component_resource_id.split(":")[1] + if component_resource_id not in components_to_item_defaults: + components_to_item_defaults[component_resource_id] = {} + components_to_item_defaults[component_resource_id][item_resource_id] = ( + component_value + ) + + registries = lib.extract.get_registries_report(version_id) + item_resource_id_to_protocol_id = {} + item_resource_ids = [None] * len(registries["minecraft:item"]["entries"]) + for item_resource_id, item_data in registries["minecraft:item"]["entries"].items(): + item_resource_id = item_resource_id.split(":")[-1] + item_protocol_id = item_data["protocol_id"] + item_resource_id_to_protocol_id[item_resource_id] = item_protocol_id + item_resource_ids[item_protocol_id] = item_resource_id + + enum_and_struct_fields = get_enum_and_struct_fields() + # a few types that exist elsewhere + enum_and_struct_fields["ConsumeEffect::ApplyEffects"] = { + "effects": "Vec<MobEffectInstance>", + "probability": "f32", + } + enum_and_struct_fields["ConsumeEffect::RemoveEffects"] = { + "effects": "HolderSet<MobEffect, ResourceLocation>", + } + enum_and_struct_fields["ConsumeEffect::ClearAllEffects"] = {} + enum_and_struct_fields["ConsumeEffect::TeleportRandomly"] = { + "diameter": "f32", + } + enum_and_struct_fields["ConsumeEffect::PlaySound"] = { + "sound": "SoundEvent", + } + + # we can't call ::new() on enum variants, so define the defaults manually here + enum_variant_defaults = { + "ConsumeEffect::ApplyEffects": { + "effects": [], + "probability": 1.0, + }, + "ConsumeEffect::TeleportRandomly": { + "diameter": 16.0, + }, + } + + def python_to_rust_value(python_value: Any, target_rust_type: Optional[str]): + # manual implementations + if isinstance(python_value, dict) and len(python_value) > 0: + if target_rust_type == "ConsumeEffect": + variant = lib.utils.to_camel_case(python_value["type"].split(":")[-1]) + type_with_variant = f"ConsumeEffect::{variant}" + details_without_type = python_value.copy() + del details_without_type["type"] + return python_to_rust_value(details_without_type, type_with_variant) + elif target_rust_type == "MobEffectInstance": + effect_id = python_value["id"] + details_without_id = python_value.copy() + del details_without_id["id"] + return ( + "MobEffectInstance {" + + f"id: {python_to_rust_value(effect_id, 'MobEffect')}," + + f"details: {python_to_rust_value(details_without_id, 'MobEffectDetails')}" + + "}" + ) + elif target_rust_type == "AttributeModifiersEntry": + attribute = python_value["type"] + amount = python_value["amount"] + display_type = python_value.get("display", {}).get("type") or "default" + id = python_value["id"] + operation = python_value["operation"] + + del python_value["amount"] + del python_value["type"] + python_value["attribute"] = attribute + del python_value["id"] + del python_value["operation"] + if display_type is not None: + python_value["display"] = display_type + python_value["modifier"] = { + "id": id, + "amount": amount, + "operation": operation, + } + + if target_rust_type is None: + return "None" + + if target_rust_type.startswith("Option<"): + if python_value is None: + return "None" + inner_type = target_rust_type.split("<", 1)[1].rsplit(">", 1)[0] + return f"Some({python_to_rust_value(python_value, inner_type)})" + elif target_rust_type.startswith("HashMap<"): + hashmap_key, hashmap_value = ( + target_rust_type.split("<", 1)[1].rsplit(">", 1)[0].split(",", 1) + ) + hashmap_key = hashmap_key.strip() + hashmap_value = hashmap_value.strip() + + # HashMap::from_iter([("honey_level".to_string(), "0".to_string())]) + t = "HashMap::from_iter([" + for k, v in python_value.items(): + t += f"({python_to_rust_value(k, hashmap_key)}, {python_to_rust_value(v, hashmap_value)})," + t = t.rstrip(",") + "])" + return t + elif target_rust_type == "String": + return f'"{python_value}".to_string()' + elif target_rust_type == "&str": + if isinstance(python_value, dict): + return python_to_rust_value( + list(python_value.values())[0], target_rust_type + ) + return f'"{python_value}"' + elif target_rust_type in {'i64', 'u64', 'f64', 'i32', 'u32', 'f32', 'i16', 'u16', 'i8', 'u8'}: # fmt: skip + if isinstance(python_value, dict) and len(python_value) == 1: + return python_to_rust_value( + list(python_value.values())[0], target_rust_type + ) + return str(python_value) + + if isinstance(python_value, dict): + if target_rust_type == "ResourceLocation" and len(python_value) == 1: + return python_to_rust_value( + list(python_value.values())[0], target_rust_type + ) + elif target_rust_type.startswith("HolderSet<") and len(python_value) == 1: + return python_to_rust_value( + list(python_value.values())[0], target_rust_type + ) + elif target_rust_type.startswith("Vec<") and len(python_value) == 1: + return python_to_rust_value( + list(python_value.values())[0], target_rust_type + ) + elif target_rust_type == "ItemStack": + item_rust_value = python_to_rust_value(python_value["id"], "Item") + count = python_value["count"] + if count == 1: + return f"ItemStack::from({item_rust_value})" + else: + return f"ItemStack::new({item_rust_value}, {python_to_rust_value(python_value['count'], 'i32')})" + + if "::" in target_rust_type and target_rust_type in enum_variant_defaults: + # we can't call ::new() on enum variants, so extend the python type with the defaults + python_value = { + **enum_variant_defaults[target_rust_type], + **python_value, + } + + # the :: check is so we don't do this for enum variants + if len(python_value) == 0 and "::" not in target_rust_type: + if ( + target_rust_type in enum_and_struct_fields + and len(enum_and_struct_fields[target_rust_type]) == 0 + ): + # don't do ::new() for structs with no fields (like `Glider`) + return f"{target_rust_type}" + # this ::new has to be implemented manually for these types + t = f"{target_rust_type.split('<')[0]}::new()" + else: + # create a struct based on the defaults + t = f"{target_rust_type} {{" + for k, v in python_value.items(): + # get the type of the fields + inner_type = enum_and_struct_fields.get(target_rust_type, {}).get( + k, "FIXME_UNKNOWN_TYPE" + ) + t += f"{k}: {python_to_rust_value(v, inner_type)}," + + # add ..Struct::new(), unless we already know that all of the fields are there + if len(python_value) < len( + enum_and_struct_fields.get(target_rust_type, []) + ): + t += f"..{target_rust_type}::new()" + + t += "}" + return t + if isinstance(python_value, bool): + return str(python_value).lower() + if isinstance(python_value, str): + fields_for_rust_type = enum_and_struct_fields.get(target_rust_type, []) + if "Referenced(ResourceLocation)" in fields_for_rust_type: + return f"{target_rust_type}::Referenced({python_to_rust_value(python_value, 'ResourceLocation')})" + elif "Registry(registry::Instrument)" in fields_for_rust_type: + return f"{target_rust_type}::Registry({python_to_rust_value(python_value, 'azalea_registry::Instrument')})" + elif target_rust_type.startswith("HolderSet<"): + holderset_type = target_rust_type.split("<", 1)[1].split(",", 1)[0] + main_vec = python_to_rust_value( + [python_value], f"Vec<{holderset_type}>" + ) + return f"HolderSet::Direct {{ contents: {main_vec} }}" + elif target_rust_type.startswith("azalea_registry::Holder<"): + holder_type = target_rust_type.split("<", 1)[1].split(",", 1)[0] + inner_type = python_to_rust_value(python_value, holder_type) + return f"azalea_registry::Holder::Reference({inner_type})" + elif target_rust_type == "ResourceLocation": + # convert minecraft:air into ResourceLocation::from_static("minecraft:air") + return f'"{python_value}".into()' + else: + # enum variant + return f"{target_rust_type}::{lib.utils.to_camel_case(python_value.split(':')[-1])}" + if isinstance(python_value, list): + # convert Vec<Thing> into Thing + inner_type = ( + target_rust_type.split("<", 1)[1] + .rsplit(">", 1)[0] + .split(",")[0] + .strip() + if (target_rust_type and "<" in target_rust_type) + else None + ) + if inner_type is None: + # if the only field is a Vec, use that as the type + rust_type_fields = enum_and_struct_fields.get(target_rust_type, {}) + if len(rust_type_fields) == 1 and isinstance(rust_type_fields, dict): + _field_name, field_type = list(rust_type_fields.items())[0] + return python_to_rust_value(python_value, field_type) + + vectors = [] + main_vec = "vec![" + for v in python_value: + # handle tags correctly + if isinstance(v, str) and v.startswith("#minecraft:"): + tag_name = lib.utils.to_snake_case(v.split(":")[-1]).upper() + if inner_type == "EntityKind": + tag_module = "entities" + elif inner_type == "Item": + tag_module = "items" + elif inner_type == "Block": + tag_module = "blocks" + else: + tag_module = "FIXME_UNKNOWN_MODULE" + vectors.append( + f"azalea_registry::tags::{tag_module}::{tag_name}.clone().into_iter().collect()" + ) + continue + main_vec += python_to_rust_value(v, inner_type) + "," + main_vec = main_vec.rstrip(",") + "]" + if len(vectors) == 0 or main_vec != "vec![]": + vectors.append(main_vec) + + if len(vectors) == 1: + as_vec = vectors[0] + else: + # concat + as_vec = f"[{','.join(vectors)}].concat()" + + if target_rust_type.startswith("HolderSet<"): + return f"HolderSet::Direct {{ contents: {as_vec} }}" + return as_vec + + return str(python_value) + + for component_resource_id, item_defaults in components_to_item_defaults.items(): + component_struct_name = lib.utils.to_camel_case(component_resource_id) + component_struct_fields = enum_and_struct_fields[component_struct_name] + + if len(component_struct_fields) == 1 and isinstance( + component_struct_fields, dict + ): + field_name, field_type = list(component_struct_fields.items())[0] + + # if field_type not in ["i32", "u32", "f32", "bool"]: + # continue + + def transform_value_fn(rust_value: str): + return f"{component_struct_name} {{ {field_name}: {rust_value} }}" + else: + field_type = component_struct_name + # if component_resource_id != "rarity": + # continue + + def transform_value_fn(rust_value: str): + return rust_value + + rust_value = "value" + if component_resource_id == "item_name": + rust_value = f"TranslatableComponent::from({rust_value}).into()" + field_type = "&str" + elif component_resource_id == "item_model": + rust_value = f"{rust_value}.into()" + field_type = "&str" + + item_defaults_original = item_defaults + item_defaults = {} + for k, v in item_defaults_original.items(): + item_defaults[k] = python_to_rust_value(v, field_type) + + default_values_frequency = {} + for value in item_defaults.values(): + if value not in default_values_frequency: + default_values_frequency[value] = 0 + default_values_frequency[value] += 1 + most_common_default_value = max( + default_values_frequency.items(), key=lambda x: x[1] + )[0] + default_values_count_except_most_common = ( + len(item_defaults) - default_values_frequency[most_common_default_value] + ) + + # if it looks like there's a default (like, vec![]) that's used for most items, then we + # always use a match statement with a default handler + includes_every_item_but_mostly_same_values = ( + len(item_resource_ids) == len(item_defaults) + and default_values_count_except_most_common <= 128 + ) + + # use a lookup table for some components to avoid big match statements + if len(item_defaults) > 128 and not includes_every_item_but_mostly_same_values: + static_values_name = component_resource_id.upper() + "_VALUES" + + values_set = set(item_defaults.values()) + if len(values_set) == 1: + # always returns the same value + code.append(f"impl DefaultableComponent for {component_struct_name} {{") + code.append(" fn default_for_item(_item: Item) -> Option<Self> {") + value = next(iter(values_set)) + code.append(f" Some({transform_value_fn(value)})") + code.append(" }") + code.append("}") + continue + + # find a sentinel value that isn't already being used + none_value = 0 + while none_value in values_set: + none_value += 1 + none_value_is_used = False + + static_def_line = f"static {static_values_name}: [{field_type}; {len(item_resource_ids)}] = [" + for item_protocol_id, item_resource_id in enumerate(item_resource_ids): + value = item_defaults.get(item_resource_id, none_value) + static_def_line += f"{value}," + if value == none_value: + none_value_is_used = True + static_def_line = static_def_line.rstrip(",") + static_def_line += "];" + + code.append("#[rustfmt::skip]") + code.append(static_def_line) + + code.append(f"impl DefaultableComponent for {component_struct_name} {{") + code.append(" fn default_for_item(item: Item) -> Option<Self> {") + code.append(f" let value = {static_values_name}[item as usize];") + if none_value_is_used: + code.append(f" if value == {none_value} {{") + code.append(" return None;") + code.append(" }") + code.append(f" Some({transform_value_fn(rust_value)})") + code.append(" }") + code.append("}") + elif includes_every_item_but_mostly_same_values: + code.append(f"impl DefaultableComponent for {component_struct_name} {{") + if default_values_count_except_most_common > 0: + code.append(" fn default_for_item(item: Item) -> Option<Self> {") + code.append(" let value = match item {") + for item_resource_id, value in item_defaults.items(): + if value == most_common_default_value: + continue + item_variant_name = lib.utils.to_camel_case(item_resource_id) + code.append(f" Item::{item_variant_name} => {value},") + code.append(f" _ => {most_common_default_value},") + code.append(" };") + code.append(f" Some({transform_value_fn('value')})") + else: + code.append(" fn default_for_item(_item: Item) -> Option<Self> {") + code.append( + f" Some({transform_value_fn(most_common_default_value)})" + ) + code.append(" }") + code.append("}") + else: + code.append(f"impl DefaultableComponent for {component_struct_name} {{") + code.append(" fn default_for_item(item: Item) -> Option<Self> {") + code.append(" let value = match item {") + for item_resource_id, value in item_defaults.items(): + item_variant_name = lib.utils.to_camel_case(item_resource_id) + code.append(f" Item::{item_variant_name} => {value},") + code.append(" _ => return None,") + code.append(" };") + code.append(f" Some({transform_value_fn('value')})") + code.append(" }") + code.append("}") + + with open(DEFAULT_DATA_COMPONENTS_DIR, "w") as f: + f.write("\n".join(code)) + + +def get_enum_and_struct_fields(): + """ + Returns a map like map like `{ "MaxStackSize": { "count": i32 }, "Rarity": [ "common", ... ], ... }` + with an entry for each struct in components.rs. + """ + + with open(DATA_COMPONENTS_DIR, "r") as f: + code = f.read().split("\n") + + # we copy from here to `metadatas` if we find a DataComponent impl for the struct + all_enum_and_struct_fields = {} + + i = 0 + while i < len(code): + line = code[i] + if line.startswith("pub struct "): + struct_name = line.split()[2].strip(":;") + # map like { "count": i32 } + this_struct_fields = {} + if line[-1] not in "};": + while line != "}": + i += 1 + line = code[i].strip() + if line.startswith("pub "): + field_name = line.split(" ")[1].strip(":") + field_type = line.split(" ", 2)[2].strip(",") + this_struct_fields[field_name] = field_type + all_enum_and_struct_fields[struct_name] = this_struct_fields + elif line.startswith("pub enum "): + enum_name = line.split()[2].strip(":") + # list of string values + this_enum_variants = [] + if line[-1] not in "};": + while line != "}": + i += 1 + line = code[i].strip() + variant_name = line.split()[0].strip(",") + if not variant_name.startswith("#"): + this_enum_variants.append(variant_name) + all_enum_and_struct_fields[enum_name] = this_enum_variants + + i += 1 + + return all_enum_and_struct_fields diff --git a/codegen/lib/code/item_components.py b/codegen/lib/code/item_components.py deleted file mode 100644 index ce5d6d82..00000000 --- a/codegen/lib/code/item_components.py +++ /dev/null @@ -1,168 +0,0 @@ -import lib.code.utils -import lib.extract -import lib.utils - - -ITEM_COMPONENTS_DIR = "azalea-inventory/src/components.rs" - - -def generate(version_id: str): - expected_variants = get_expected_variants(version_id) - actual_variants = get_actual_variants() - - new_variants = [] - removed_variants = [] - - for variant in expected_variants: - if variant not in actual_variants: - new_variants.append(variant) - for variant in actual_variants: - if variant not in expected_variants: - removed_variants.append(variant) - - print("New variants:") - for variant in new_variants: - print("-", variant) - print() - print("Removed variants:") - for variant in removed_variants: - print("-", variant) - print() - - for variant in removed_variants: - print(f"Removing {variant}...") - remove_variant(variant) - for variant in new_variants: - print(f"Adding {variant}...") - add_variant(variant) - - lib.code.utils.fmt() - - print("Done!") - - -def get_expected_variants(version_id: str): - expected_variants = [] - registries = lib.extract.get_registries_report(version_id) - - registry = registries["minecraft:data_component_type"] - registry_entries = sorted( - registry["entries"].items(), key=lambda x: x[1]["protocol_id"] - ) - for variant_name, _variant in registry_entries: - variant_struct_name = lib.utils.to_camel_case(variant_name.split(":")[-1]) - expected_variants.append(variant_struct_name) - - return expected_variants - - -def get_actual_variants(): - actual_variants = [] - with open(ITEM_COMPONENTS_DIR, "r") as f: - code = f.read().split("\n") - - in_match = False - for line in code: - if in_match: - if line == " })": - break - variant_line_prefix = " DataComponentKind::" - if line.startswith(variant_line_prefix): - variant = line[len(variant_line_prefix) :].split(" ", 1)[0] - actual_variants.append(variant) - elif line == " Ok(match kind {": - in_match = True - - return actual_variants - - -def remove_variant(variant: str): - with open(ITEM_COMPONENTS_DIR, "r") as f: - code = f.read().split("\n") - - first_line_with_variant = None - line_after_variant = None - - in_match = False - for i, line in enumerate(list(code)): - if in_match: - if line == " })": - line_after_variant = i - break - variant_line_prefix = " DataComponentKind::" - if line.startswith(variant_line_prefix): - if first_line_with_variant is not None: - line_after_variant = i - break - variant_name = line[len(variant_line_prefix) :].split(" ", 1)[0] - if variant_name == variant: - first_line_with_variant = i - elif line == " Ok(match kind {": - in_match = True - - if first_line_with_variant is None: - raise ValueError(f"Variant {variant} not found") - if line_after_variant is None: - raise ValueError(f"Couldn't find end of variant {variant}") - - code = code[:first_line_with_variant] + code[line_after_variant:] - - # now remove the struct - line_before_struct = None # this is the #[derive] line - line_after_struct = None # impl DataComponent for ... {\n...\n} - for i, line in enumerate(list(code)): - if line == f"pub struct {variant} {{" or line == f"pub struct {variant};": - line_before_struct = i - 1 - elif line == f"impl DataComponent for {variant} {{": - line_after_struct = i + 3 - break - if line_before_struct is None: - raise ValueError(f"Couldn't find struct {variant}") - if line_after_struct is None: - raise ValueError(f"Couldn't find impl DataComponent for {variant}") - - code = code[:line_before_struct] + code[line_after_struct:] - - with open(ITEM_COMPONENTS_DIR, "w") as f: - f.write("\n".join(code)) - - -def add_variant(variant: str): - with open(ITEM_COMPONENTS_DIR, "r") as f: - code = f.read().split("\n") - - in_match = False - last_line_in_match = None - for i, line in enumerate(list(code)): - if in_match: - if line == " })": - last_line_in_match = i - break - elif line == " Ok(match kind {": - in_match = True - - if last_line_in_match is None: - raise ValueError("Couldn't find end of match") - - code = ( - code[:last_line_in_match] - + [ - f" DataComponentKind::{variant} => Box::new({variant}::azalea_read(buf)?),", - ] - + code[last_line_in_match:] - ) - - # now insert the struct - code.append("") - code.append("#[derive(Clone, PartialEq, AzBuf)]") - code.append(f"pub struct {variant} {{") - code.append(" pub todo: todo!(), // see DataComponents.java") - code.append("}") - code.append(f"impl DataComponent for {variant} {{") - code.append(f" const KIND: DataComponentKind = DataComponentKind::{variant};") - code.append("}") - - with open(ITEM_COMPONENTS_DIR, "w") as f: - f.write("\n".join(code)) - - lib.code.utils.fmt() diff --git a/codegen/lib/extract.py b/codegen/lib/extract.py index 57ece9f2..eaebab84 100644 --- a/codegen/lib/extract.py +++ b/codegen/lib/extract.py @@ -40,6 +40,10 @@ def get_packets_report(version_id: str): return get_report(version_id, "packets") +def get_items_report(version_id: str): + return get_report(version_id, "items") + + def get_report(version_id: str, name: str): generate_data_from_server_jar(version_id) with open( diff --git a/codegen/lib/utils.py b/codegen/lib/utils.py index fd1e553b..8d1e8756 100644 --- a/codegen/lib/utils.py +++ b/codegen/lib/utils.py @@ -5,18 +5,21 @@ import os def to_snake_case(name: str): - s = re.sub('([A-Z])', r'_\1', name) - return s.lower().strip('_') + s = re.sub("([A-Z])", r"_\1", name).replace(".", "_").replace("/", "_") + return s.lower().strip("_") def to_camel_case(name: str): - s = re.sub(r'[_ ](\w)', lambda m: m.group(1).upper(), - name.replace('.', '_').replace('/', '_')) + s = re.sub( + r"[_ ](\w)", + lambda m: m.group(1).upper(), + name.replace(".", "_").replace("/", "_"), + ) s = upper_first_letter(s) # if the first character is a number, we need to add an underscore # maybe we could convert it to the number name (like 2 would become "two")? if s[0].isdigit(): - s = f'_{s}' + s = f"_{s}" return s @@ -25,7 +28,7 @@ def upper_first_letter(name: str): def padded_hex(n: int): - return f'0x{n:02X}' + return f"0x{n:02X}" class PacketIdentifier: @@ -35,16 +38,20 @@ class PacketIdentifier: self.state = state def __eq__(self, other): - return self.packet_id == other.packet_id and self.direction == other.direction and self.state == other.state + return ( + self.packet_id == other.packet_id + and self.direction == other.direction + and self.state == other.state + ) def __hash__(self): return hash((self.packet_id, self.direction, self.state)) def __str__(self): - return f'{self.packet_id} {self.direction} {self.state}' + return f"{self.packet_id} {self.direction} {self.state}" def __repr__(self): - return f'PacketIdentifier({self.packet_id}, {self.direction}, {self.state})' + return f"PacketIdentifier({self.packet_id}, {self.direction}, {self.state})" def group_packets(packets: list[PacketIdentifier]): diff --git a/codegen/migrate.py b/codegen/migrate.py index 56874273..85dc927d 100644 --- a/codegen/migrate.py +++ b/codegen/migrate.py @@ -1,4 +1,4 @@ -import lib.code.item_components +import codegen.lib.code.data_components import lib.code.inventory import lib.code.language import lib.code.registry @@ -15,10 +15,10 @@ import sys lib.download.clear_version_cache() if len(sys.argv) == 1: - print('\033[91mYou must provide a version to migrate to.\033[m') + print("\033[91mYou must provide a version to migrate to.\033[m") version_manifest = lib.download.get_version_manifest() - newest_version = version_manifest['latest']['snapshot'] - print(f'Hint: newest version is \033[1m{newest_version}\033[m') + newest_version = version_manifest["latest"]["snapshot"] + print(f"Hint: newest version is \033[1m{newest_version}\033[m") exit() @@ -33,42 +33,49 @@ new_burger_data = lib.extract.get_burger_data_for_version(new_version_id) new_packets_report = lib.extract.get_packets_report(new_version_id) lib.code.packet.set_packets(new_packets_report) -lib.code.version.set_protocol_version( - new_burger_data[0]['version']['protocol']) +lib.code.version.set_protocol_version(new_burger_data[0]["version"]["protocol"]) lib.code.version.set_version_name(new_version_id) -print('Updated protocol!') +print("Updated protocol!") -print('Generating blocks and shapes...') -new_pumpkin_block_datas = lib.extract.get_pumpkin_data(new_version_id, 'blocks') +print("Generating blocks and shapes...") +new_pumpkin_block_datas = lib.extract.get_pumpkin_data(new_version_id, "blocks") new_block_states_report = lib.extract.get_block_states_report(new_version_id) new_registries = lib.extract.get_registries_report(new_version_id) new_ordered_blocks = lib.code.blocks.get_ordered_blocks(new_registries) -lib.code.blocks.generate_blocks(new_block_states_report, new_pumpkin_block_datas, new_ordered_blocks, new_burger_data) +lib.code.blocks.generate_blocks( + new_block_states_report, + new_pumpkin_block_datas, + new_ordered_blocks, + new_burger_data, +) lib.code.shapes.generate_block_shapes(new_pumpkin_block_datas, new_block_states_report) -print('Getting en_us.json...') +print("Getting en_us.json...") language = lib.extract.get_en_us_lang(new_version_id) lib.code.language.write_language(language) -print('Generating registries...') +print("Generating registries...") import genregistries + genregistries.generate(new_version_id) -print('Generating entity data...') -burger_entities_data = new_burger_data[0]['entities'] +print("Generating entity data...") +burger_entities_data = new_burger_data[0]["entities"] lib.code.entity.generate_entity_metadata(burger_entities_data, new_mappings) lib.code.entity.generate_entity_dimensions(burger_entities_data) -print('Generating item components...') -lib.code.item_components.generate(new_version_id) +print("Generating item components...") +lib.code.data_components.generate(new_version_id) -print('Finishing touches, setting version in README and formatting code...') +print("Finishing touches, setting version in README and formatting code...") lib.code.version.set_version_id(new_version_id) lib.code.utils.fmt() -print('Done!') -print('Make sure to `cargo check` and look for the generated `TODO`s to make sure everything is correct!') +print("Done!") +print( + "Make sure to `cargo check` and look for the generated `TODO`s to make sure everything is correct!" +) |
