more slot data structures

This commit is contained in:
MeexReay 2025-05-11 14:54:08 +03:00
parent 1eed718f38
commit 39a06655c5
2 changed files with 127 additions and 38 deletions

View File

@ -53,7 +53,13 @@ impl ReadWritePosition for Packet {
} }
#[derive(Clone)] #[derive(Clone)]
pub enum IDSet { pub enum IdOr<T> {
Id(i32),
Or(T),
}
#[derive(Clone)]
pub enum IdSet {
Tag(String), Tag(String),
Ids(Vec<u32>), Ids(Vec<u32>),
} }

View File

@ -6,40 +6,123 @@ use uuid::Uuid;
use crate::ServerError; use crate::ServerError;
use super::{IDSet, Property, component::TextComponent, sound::SoundEvent}; use super::{IdOr, IdSet, Property, component::TextComponent, sound::SoundEvent};
pub const SLOT_COMPONENT_LENGTH: u16 = 96; pub const SLOT_COMPONENT_LENGTH: u16 = 96;
#[derive(Clone)]
pub struct BlockPredicate;
#[derive(Clone)]
pub struct ConsumeEffect;
#[derive(Clone)]
pub struct PotionEffect;
#[derive(Clone)]
pub struct TrimPattern;
#[derive(Clone)]
pub struct Instrument;
#[derive(Clone)]
pub struct TrimMaterial;
#[derive(Clone)] #[derive(Clone)]
pub struct JukeboxSong; pub struct JukeboxSong;
#[derive(Clone)]
pub struct FireworkExplosion;
#[derive(Clone)] #[derive(Clone)]
pub struct ChickenVariant; pub struct ChickenVariant;
#[derive(Clone)] #[derive(Clone)]
pub struct PaintingVariant; pub struct PaintingVariant;
#[derive(Clone)]
pub enum BlockPredicatePropertyMatch {
Exact(String),
Range(String, String),
}
#[derive(Clone)]
pub struct BlockPredicateExactDataMatcher {
/// ID of the data component as listed in the table of data component types above.
pub component_index: usize,
pub value: StructuredComponent,
}
#[derive(Clone)]
pub struct BlockPredicatePartialDataMatcher {
/// 0: damage, 1: enchantments, 2: stored_enchantments, 3: potion_contents, 4: custom_data, 5: container, 6: bundle_contents, 7: firework_explosion, 8: fireworks, 9: writable_book_content, 10: written_book_content, 11: attribute_modifiers, 12: trim, 13: jukebox_playable.
pub type_id: u8,
/// https://minecraft.wiki/w/Data_component_predicate
pub predicate: DynNBT,
}
#[derive(Clone)]
pub struct BlockPredicateProperty {
pub name: String,
pub matches: BlockPredicatePropertyMatch,
}
#[derive(Clone)]
pub struct BlockPredicate {
pub blocks: Option<IdSet>,
pub properties: Option<Vec<BlockPredicateProperty>>,
pub nbt: Option<DynNBT>,
pub exact_matchers: Vec<BlockPredicateExactDataMatcher>,
pub partial_matchers: Vec<BlockPredicatePartialDataMatcher>,
}
#[derive(Clone)]
pub struct Instrument {
pub sound: IdOr<SoundEvent>,
pub sound_range: f32,
pub range: f32,
pub description: TextComponent,
}
#[derive(Clone)]
pub enum ConsumeEffect {
/// Effects, Probability
ApplyEffects(Vec<PotionEffect>, f32),
RemoveEffects(IdSet),
ClearAllEffects,
/// Diameter
TeleportRandomly(f32),
PlaySound(SoundEvent),
}
#[derive(Clone)]
pub struct TrimMaterial {
pub suffix: String,
/// Key - Armor Material Type Identifier
/// Value - Overriden Asset Name
pub overrides: Vec<(String, String)>,
pub description: TextComponent,
}
#[derive(Clone)]
pub struct TrimPattern {
pub asset_name: String,
pub template_item: i32,
pub description: TextComponent,
pub decal: bool,
}
#[derive(Clone)]
pub struct PotionEffectDetail {
pub amplifier: i32,
/// -1 for infinite.
pub duration: i32,
pub ambient: bool,
pub show_particles: bool,
pub show_icon: bool,
pub hidden_effect: Option<Box<PotionEffectDetail>>,
}
#[derive(Clone)]
pub struct PotionEffect {
pub type_id: u32,
pub detail: PotionEffectDetail,
}
#[derive(Clone)]
pub struct FireworkExplosion {
/// Can be one of the following:
/// - 0 - Small ball
/// - 1 - Large ball
/// - 2 - Star
/// - 3 - Creeper
/// - 4 - Burst
pub shape: u8,
pub colors: Vec<i32>,
pub fade_colors: Vec<i32>,
pub has_trail: bool,
pub has_twinkle: bool,
}
#[derive(Clone)] #[derive(Clone)]
pub struct HiveBee { pub struct HiveBee {
pub entity_data: DynNBT, pub entity_data: DynNBT,
@ -99,7 +182,7 @@ pub struct AttributeModifier {
#[derive(Clone)] #[derive(Clone)]
pub struct ToolRule { pub struct ToolRule {
pub blocks: IDSet, pub blocks: IdSet,
pub has_speed: bool, pub has_speed: bool,
pub speed: Option<f32>, pub speed: Option<f32>,
pub has_correct_drop_for_blocks: bool, pub has_correct_drop_for_blocks: bool,
@ -109,14 +192,14 @@ pub struct ToolRule {
#[derive(Clone)] #[derive(Clone)]
pub struct DamageReduction { pub struct DamageReduction {
pub horizontal_blocking_angle: f32, pub horizontal_blocking_angle: f32,
pub damage_kind: Option<IDSet>, pub damage_kind: Option<IdSet>,
pub base: f32, pub base: f32,
pub factor: f32, pub factor: f32,
} }
/// https://minecraft.wiki/w/Java_Edition_protocol/Slot_data#Structured_components /// https://minecraft.wiki/w/Java_Edition_protocol/Slot_data#Structured_components
#[derive(Clone, EnumIndex)] #[derive(Clone, EnumIndex)]
pub enum SlotComponent { pub enum StructuredComponent {
CustomData(DynNBT), CustomData(DynNBT),
/// 1 - 99 /// 1 - 99
MaxStackSize(i32), MaxStackSize(i32),
@ -167,7 +250,7 @@ pub enum SlotComponent {
Consumable { Consumable {
consume_seconds: f32, consume_seconds: f32,
animation: u8, animation: u8,
sound: SoundEvent, sound: IdOr<SoundEvent>,
has_particles: bool, has_particles: bool,
effects: Vec<ConsumeEffect>, effects: Vec<ConsumeEffect>,
}, },
@ -192,16 +275,16 @@ pub enum SlotComponent {
Enchantable(i32), Enchantable(i32),
Equippable { Equippable {
slot: u8, slot: u8,
equip_sound: SoundEvent, equip_sound: IdOr<SoundEvent>,
model: Option<String>, model: Option<String>,
camera_overlay: Option<String>, camera_overlay: Option<String>,
allowed_entities: Option<IDSet>, allowed_entities: Option<IdSet>,
dispensable: bool, dispensable: bool,
swappable: bool, swappable: bool,
damage_on_hurt: bool, damage_on_hurt: bool,
}, },
/// Items that can be combined with this item in an anvil to repair it. /// Items that can be combined with this item in an anvil to repair it.
Repairable(IDSet), Repairable(IdSet),
/// Makes the item function like elytra. /// Makes the item function like elytra.
Glider, Glider,
TooltipStyle(String), TooltipStyle(String),
@ -215,8 +298,8 @@ pub enum SlotComponent {
item_damage_base: f32, item_damage_base: f32,
item_damage_factor: f32, item_damage_factor: f32,
bypassed_by: Option<String>, bypassed_by: Option<String>,
block_sound: Option<SoundEvent>, block_sound: Option<IdOr<SoundEvent>>,
disable_sound: Option<SoundEvent>, disable_sound: Option<IdOr<SoundEvent>>,
}, },
/// The enchantments stored in this enchanted book. /// The enchantments stored in this enchanted book.
/// Key: The ID of the enchantment in the enchantment registry. \ /// Key: The ID of the enchantment in the enchantment registry. \
@ -318,7 +401,7 @@ pub enum SlotComponent {
Bees(Vec<HiveBee>), Bees(Vec<HiveBee>),
Lock(String), Lock(String),
ContainerLoot(DynNBT), ContainerLoot(DynNBT),
BreakSound(SoundEvent), BreakSound(IdOr<SoundEvent>),
VillagerVariant(u64), VillagerVariant(u64),
WolfVariant(u64), WolfVariant(u64),
WolfSoundVariant(u64), WolfSoundVariant(u64),
@ -439,17 +522,17 @@ pub enum SlotComponent {
} }
pub trait ReadWriteSlotComponent: DataReader + DataWriter { pub trait ReadWriteSlotComponent: DataReader + DataWriter {
fn read_slot_component(&mut self) -> Result<SlotComponent, ServerError>; fn read_slot_component(&mut self) -> Result<StructuredComponent, ServerError>;
fn write_slot_component(&mut self, val: &SlotComponent) -> Result<(), ServerError>; fn write_slot_component(&mut self, val: &StructuredComponent) -> Result<(), ServerError>;
} }
impl ReadWriteSlotComponent for Packet { impl ReadWriteSlotComponent for Packet {
fn read_slot_component(&mut self) -> Result<SlotComponent, ServerError> { fn read_slot_component(&mut self) -> Result<StructuredComponent, ServerError> {
let _ = self.read_u16_varint()?; // id let _ = self.read_u16_varint()?; // id
todo!() todo!()
} }
fn write_slot_component(&mut self, val: &SlotComponent) -> Result<(), ServerError> { fn write_slot_component(&mut self, val: &StructuredComponent) -> Result<(), ServerError> {
self.write_usize_varint(val.enum_index())?; self.write_usize_varint(val.enum_index())?;
todo!() todo!()
@ -460,7 +543,7 @@ impl ReadWriteSlotComponent for Packet {
pub struct Slot { pub struct Slot {
pub id: i32, pub id: i32,
pub amount: i32, pub amount: i32,
pub components: Vec<SlotComponent>, pub components: Vec<StructuredComponent>,
} }
pub trait ReadWriteSlot: DataReader + DataWriter { pub trait ReadWriteSlot: DataReader + DataWriter {