diff --git a/src/data/mod.rs b/src/data/mod.rs index 13e257d..d45f3d7 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -70,3 +70,23 @@ pub struct Property { pub value: String, pub signature: Option, } + +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)] +pub enum DyeColor { + White, + Orange, + Magenta, + LightBlue, + Yellow, + Lime, + Pink, + Gray, + LightGray, + Cyan, + Purple, + Blue, + Brown, + Green, + Red, + Black, +} diff --git a/src/data/slot.rs b/src/data/slot.rs index b50bc2d..f842053 100644 --- a/src/data/slot.rs +++ b/src/data/slot.rs @@ -6,7 +6,7 @@ use uuid::Uuid; use crate::ServerError; -use super::{IdOr, IdSet, Property, component::TextComponent, sound::SoundEvent}; +use super::{DyeColor, IdOr, IdSet, Property, component::TextComponent, sound::SoundEvent}; pub const SLOT_COMPONENT_LENGTH: u16 = 96; @@ -164,24 +164,7 @@ pub struct BannerLayer { pub pattern_type: i32, pub asset_id: Option, pub translation_key: Option, - /// Can be one of the following: - /// - 0 - White - /// - 1 - Orange - /// - 2 - Magenta - /// - 3 - Light Blue - /// - 4 - Yellow - /// - 5 - Lime - /// - 6 - Pink - /// - 7 - Gray - /// - 8 - Light Gray - /// - 9 - Cyan - /// - 10 - Purple - /// - 11 - Blue - /// - 12 - Brown - /// - 13 - Green - /// - 14 - Red - /// - 15 - Black - pub color: u8, + pub color: DyeColor, } #[derive(Clone)] @@ -229,52 +212,52 @@ pub struct DamageReduction { /// https://minecraft.wiki/w/Java_Edition_protocol/Slot_data#Structured_components #[derive(Clone, EnumIndex)] pub enum StructuredComponent { - CustomData(DynNBT), + CustomData(DynNBT), // 0 /// 1 - 99 - MaxStackSize(i32), - MaxDamage(i32), - Damage(i32), - Unbreakable, - CustomName(TextComponent), - ItemName(TextComponent), - ItemModel(String), - Lore(TextComponent), + MaxStackSize(i32), // 1 + MaxDamage(i32), // 2 + Damage(i32), // 3 + Unbreakable, // 4 + CustomName(TextComponent), // 5 + ItemName(TextComponent), // 6 + ItemModel(String), // 7 + Lore(TextComponent), // 8 /// Can be one of the following: /// - 0 - Common (white) /// - 1 - Uncommon (yellow) /// - 2 - Rare (aqua) /// - 3 - Epic (pink) - Rarity(u8), + Rarity(u8), // 9 /// Key: The ID of the enchantment in the enchantment registry. \ /// Value: The level of the enchantment. - Enchantments(Vec<(u64, i32)>), - CanPlaceOn(Vec), - CanBreak(Vec), - AttributeModifiers(Vec), + Enchantments(Vec<(u64, i32)>), // 10 + CanPlaceOn(Vec), // 11 + CanBreak(Vec), // 12 + AttributeModifiers(Vec), // 13 /// Floats, Flags, Strings, Colors - CustomModelData(Vec, Vec, Vec, Vec), + CustomModelData(Vec, Vec, Vec, Vec), // 14 /// Parameters: /// - Hide Tooltip /// - The IDs of data components in the minecraft:data_component_type registry to hide. - TooltipDisplay(bool, Vec), + TooltipDisplay(bool, Vec), // 15 /// Accumulated anvil usage cost. /// The client displays "Too Expensive" if the value is greater than 40 and /// the player is not in creative mode (more specifically, /// if they don't have the insta-build flag enabled). /// This behavior can be overridden by setting the level /// with the Set Container Property packet. - RepairCost(i32), + RepairCost(i32), // 16 /// Marks the item as non-interactive on the creative inventory (the first 5 rows of items). \ /// This is used internally by the client on the paper icon in the saved hot-bars tab. - CreativeSlotLock, - EnchantmentGlintOverride(bool), + CreativeSlotLock, // 17 + EnchantmentGlintOverride(bool), // 18 /// Marks the projectile as intangible (cannot be picked-up). - IntangibleProjectile, + IntangibleProjectile, // 19 /// Parameters: /// - Nutrition, Non-negative /// - How much saturation will be given after consuming the item. /// - Whether the item can always be eaten, even at full hunger. - Food(u32, f32, bool), + Food(u32, f32, bool), // 20 /// Animation: 0: none, 1: eat, 2: drink, 3: block, 4: bow, 5: spear, 6: crossbow, 7: spyglass, 8: toot_horn, 9: brush Consumable { consume_seconds: f32, @@ -282,26 +265,26 @@ pub enum StructuredComponent { sound: IdOr, has_particles: bool, effects: Vec, - }, - UseRemainder(Slot), + }, // 21 + UseRemainder(Slot), // 22 /// Group of items to apply the cooldown to. Only present if Has cooldown group is true; otherwise defaults to the item's identifier. UseCooldown { seconds: f32, group: Option, - }, + }, // 23 /// Parameter - Types, Tag specifying damage types the item is immune to. Not prefixed by '#'!. - DamageResistant(String), + DamageResistant(String), // 24 Tool { rules: Vec, default_mining_speed: f32, damage_per_block: i32, - }, + }, // 25 Weapon { damage_per_attack: i32, disable_blocking_for_seconds: f32, - }, + }, // 26 // Opaque internal value controlling how expensive enchantments may be offered. - Enchantable(i32), + Enchantable(i32), // 27 Equippable { slot: u8, equip_sound: IdOr, @@ -311,14 +294,14 @@ pub enum StructuredComponent { dispensable: bool, swappable: bool, damage_on_hurt: bool, - }, + }, // 28 /// Items that can be combined with this item in an anvil to repair it. - Repairable(IdSet), + Repairable(IdSet), // 29 /// Makes the item function like elytra. - Glider, - TooltipStyle(String), + Glider, // 30 + TooltipStyle(String), // 31 /// Makes the item function like a totem of undying. - DeathProtection(Vec), + DeathProtection(Vec), // 32 BlockAttacks { block_delay_seconds: f32, disable_cooldown_scale: f32, @@ -329,38 +312,38 @@ pub enum StructuredComponent { bypassed_by: Option, block_sound: Option>, disable_sound: Option>, - }, + }, // 33 /// The enchantments stored in this enchanted book. /// Key: The ID of the enchantment in the enchantment registry. \ /// Value: The level of the enchantment. - StoredEnchantments(Vec<(u64, i32)>), - DyedColor(i32), - MapColor(i32), - MapId(i32), - MapDecorations(DynNBT), + StoredEnchantments(Vec<(u64, i32)>), // 34 + DyedColor(i32), // 35 + MapColor(i32), // 36 + MapId(i32), // 37 + MapDecorations(DynNBT), // 38 /// Type of post processing. Can be either: /// - 0 - Lock /// - 1 - Scale - MapPostProcessing(u8), + MapPostProcessing(u8), // 39 /// Projectiles loaded into a charged crossbow. - ChargedProjectiles(Vec), - BundleContents(Vec), + ChargedProjectiles(Vec), // 40 + BundleContents(Vec), // 41 PotionContents { potion_id: Option, custom_color: Option, custom_effects: Vec, custom_name: String, - }, + }, // 42 /// Parameter - Effect Multiplier - PotionDurationScale(f32), + PotionDurationScale(f32), // 43 /// Key - The ID of the effect in the potion effect type registry. /// Value - The duration of the effect. - SuspiciousStewEffects(Vec<(u64, i32)>), + SuspiciousStewEffects(Vec<(u64, i32)>), // 44 /// Parameter - Pages /// Page: /// - The raw text of the page /// - The content after passing through chat filters - WritableBookContent(Vec<(String, Option)>), + WritableBookContent(Vec<(String, Option)>), // 45 WrittenBookContent { raw_title: String, filtered_title: Option, @@ -371,183 +354,81 @@ pub enum StructuredComponent { /// - The content after passing through chat filters pages: Vec<(String, Option)>, resolved: bool, - }, + }, // 46 /// Armor's trim pattern and color - Trim(IdOr, IdOr), - DebugStrickState(DynNBT), - EntityData(DynNBT), - BucketEntityData(DynNBT), - BlockEntityData(DynNBT), - Instrument(IdOr), - ProvidesTrimMaterial(ProvidesTrimMaterial), + Trim(IdOr, IdOr), // 47 + DebugStrickState(DynNBT), // 48 + EntityData(DynNBT), // 49 + BucketEntityData(DynNBT), // 50 + BlockEntityData(DynNBT), // 51 + Instrument(IdOr), // 52 + ProvidesTrimMaterial(ProvidesTrimMaterial), // 53 /// Between 0 and 4. - OminousBottleAmplifier(u8), - JukeboxPlayable(JukeboxPlayable), + OminousBottleAmplifier(u8), // 54 + JukeboxPlayable(JukeboxPlayable), // 55 /// A pattern identifier like #minecraft:pattern_item/globe - ProvidesBannerPatterns(String), - Recipes(DynNBT), + ProvidesBannerPatterns(String), // 56 + Recipes(DynNBT), // 57 LodestoneTracker { has_global_position: bool, dimension: String, position: (f64, f64, f64), tracked: bool, - }, - FireworkExplosion(FireworkExplosion), + }, // 58 + FireworkExplosion(FireworkExplosion), // 59 Fireworks { flight_duration: i32, explosions: Vec, - }, + }, // 60 Profile { name: Option, unique_id: Option, properties: Vec, - }, - NoteBlockSound(String), - BannerPatterns(Vec), - /// Can be one of the following: - /// - 0 - White - /// - 1 - Orange - /// - 2 - Magenta - /// - 3 - Light Blue - /// - 4 - Yellow - /// - 5 - Lime - /// - 6 - Pink - /// - 7 - Gray - /// - 8 - Light Gray - /// - 9 - Cyan - /// - 10 - Purple - /// - 11 - Blue - /// - 12 - Brown - /// - 13 - Green - /// - 14 - Red - /// - 15 - Black - BaseColor(u8), + }, // 61 + NoteBlockSound(String), // 62 + BannerPatterns(Vec), // 63 + BaseColor(DyeColor), // 64 /// The ID of the items in the item registry. - PotDecorations([u64; 4]), + PotDecorations([u64; 4]), // 65 /// Items inside a container of any type. - Container(Vec), - BlockState(Vec<(String, String)>), - Bees(Vec), - Lock(String), - ContainerLoot(DynNBT), - BreakSound(IdOr), - VillagerVariant(u64), - WolfVariant(u64), - WolfSoundVariant(u64), - WolfCollar(u8), + Container(Vec), // 66 + BlockState(Vec<(String, String)>), // 67 + Bees(Vec), // 68 + Lock(String), // 69 + ContainerLoot(DynNBT), // 70 + BreakSound(IdOr), // 71 + VillagerVariant(u64), // 72 + WolfVariant(u64), // 73 + WolfSoundVariant(u64), // 74 + WolfCollar(u8), // 75 /// 0: red, 1: snow - FoxVariant(u8), + FoxVariant(u8), // 76 /// 0: small, 1: medium, 2: large. - SalmonSize(u8), - ParrotVariant(u64), + SalmonSize(u8), // 77 + ParrotVariant(u64), // 78 /// 0: kob, 1: sunstreak, 2: snooper, 3: dasher, 4: brinely, 5: spotty, 6: flopper, 7: stripey, 8: glitter, 9: blockfish, 10: betty, 11: clayfish. - TropicalFishPattern(u8), - /// Can be one of the following: - /// - 0 - White - /// - 1 - Orange - /// - 2 - Magenta - /// - 3 - Light Blue - /// - 4 - Yellow - /// - 5 - Lime - /// - 6 - Pink - /// - 7 - Gray - /// - 8 - Light Gray - /// - 9 - Cyan - /// - 10 - Purple - /// - 11 - Blue - /// - 12 - Brown - /// - 13 - Green - /// - 14 - Red - /// - 15 - Black - TropicalFishBaseColor(u8), - /// Can be one of the following: - /// - 0 - White - /// - 1 - Orange - /// - 2 - Magenta - /// - 3 - Light Blue - /// - 4 - Yellow - /// - 5 - Lime - /// - 6 - Pink - /// - 7 - Gray - /// - 8 - Light Gray - /// - 9 - Cyan - /// - 10 - Purple - /// - 11 - Blue - /// - 12 - Brown - /// - 13 - Green - /// - 14 - Red - /// - 15 - Black - TropicalFishPatternColor(u8), + TropicalFishPattern(u8), // 79 + TropicalFishBaseColor(DyeColor), // 80 + TropicalFishPatternColor(DyeColor), // 81 /// 0: red, 1: brown. - MooshroomVariant(u8), + MooshroomVariant(u8), // 82 /// 0: brown, 1: white, 2: black, 3: white splotched, 4: gold, 5: salt, 6: evil. - RabbitVariant(u8), - PigVariant(u64), - CowVariant(u64), - ChickenVariant(ChickenVariant), - FrogVariant(u64), + RabbitVariant(u8), // 83 + PigVariant(u64), // 84 + CowVariant(u64), // 85 + ChickenVariant(ChickenVariant), // 86 + FrogVariant(u64), // 87 /// 0: white, 1: creamy, 2: chestnut, 3: brown, 4: black, 5: gray, 6: dark brown. - HorseVariant(u8), - PaintingVariant(PaintingVariant), + HorseVariant(u8), // 88 + PaintingVariant(PaintingVariant), // 89 /// 0: creamy, 1: white, 2: brown, 3: gray. - LlamaVariant(u8), + LlamaVariant(u8), // 90 /// 0: lucy, 1: wild, 2: gold, 3: cyan, 4: blue. - AxolotlVariant(u8), - CatVariant(u64), - /// Can be one of the following: - /// - 0 - White - /// - 1 - Orange - /// - 2 - Magenta - /// - 3 - Light Blue - /// - 4 - Yellow - /// - 5 - Lime - /// - 6 - Pink - /// - 7 - Gray - /// - 8 - Light Gray - /// - 9 - Cyan - /// - 10 - Purple - /// - 11 - Blue - /// - 12 - Brown - /// - 13 - Green - /// - 14 - Red - /// - 15 - Black - CatCollar(u8), - /// Can be one of the following: - /// - 0 - White - /// - 1 - Orange - /// - 2 - Magenta - /// - 3 - Light Blue - /// - 4 - Yellow - /// - 5 - Lime - /// - 6 - Pink - /// - 7 - Gray - /// - 8 - Light Gray - /// - 9 - Cyan - /// - 10 - Purple - /// - 11 - Blue - /// - 12 - Brown - /// - 13 - Green - /// - 14 - Red - /// - 15 - Black - SheepColor(u8), - /// Can be one of the following: - /// - 0 - White - /// - 1 - Orange - /// - 2 - Magenta - /// - 3 - Light Blue - /// - 4 - Yellow - /// - 5 - Lime - /// - 6 - Pink - /// - 7 - Gray - /// - 8 - Light Gray - /// - 9 - Cyan - /// - 10 - Purple - /// - 11 - Blue - /// - 12 - Brown - /// - 13 - Green - /// - 14 - Red - /// - 15 - Black - ShulkerColor(u8), + AxolotlVariant(u8), // 91 + CatVariant(u64), // 92 + CatCollar(DyeColor), // 93 + SheepColor(DyeColor), // 94 + ShulkerColor(DyeColor), // 95 } pub trait ReadWriteSlotComponent: DataReader + DataWriter { @@ -561,6 +442,7 @@ impl ReadWriteSlotComponent for Packet { todo!() } + fn write_slot_component(&mut self, val: &StructuredComponent) -> Result<(), ServerError> { self.write_usize_varint(val.enum_index())?; @@ -602,6 +484,7 @@ impl ReadWriteSlot for Packet { Ok(None) } } + fn write_slot(&mut self, val: Option) -> Result<(), ServerError> { if let Some(val) = val { self.write_varint(val.amount)?; @@ -661,6 +544,7 @@ impl ReadWriteHashedSlot for Packet { Ok(None) } } + fn write_hashed_slot(&mut self, val: Option) -> Result<(), ServerError> { if let Some(val) = val { self.write_varint(val.amount)?;