use alloc::{ borrow::ToOwned, string::{String, ToString}, vec::Vec, }; use alloc::fmt; use fmt::Debug; use crate::{*, types::*, uuid::*}; pub use crate::v1_19::CommandNode; #[cfg(all(test, feature = "std"))] use crate::protocol::TestRandom; define_protocol!(760, Packet760, RawPacket760, RawPacket760Body, Packet760Kind => { // Handshaking Handshake, 0x00, Handshaking, ServerBound => HandshakeSpec { version: VarInt, server_address: String, server_port: u16, next_state: HandshakeNextState }, // Status - ClientBound StatusRespone, 0x00, Status, ClientBound => StatusResponseSpec { response: super::status::StatusSpec }, PingResponse, 0x01, Status, ClientBound => PingResponseSpec { payload: i64 }, // Status - ServerBound StatusRequest, 0x00, Status, ServerBound => StatusRequestSpec { }, PingRequest, 0x01, Status, ServerBound => PingRequestSpec { payload: i64 }, // Login - ClientBound DisconnectLogin, 0x00, Login, ClientBound => DisconnectLoginSpec { payloadreason: Chat }, EncryptionRequest, 0x01, Login, ClientBound => EncryptionRequestSpec { server_id: String, public_key: CountedArray, verify_token: CountedArray }, LoginSuccess, 0x02, Login, ClientBound => LoginSuccessSpec { uuid: UUID4, username: String, properties: CountedArray }, SetCompression, 0x03, Login, ClientBound => SetCompressionSpec { threshold: VarInt }, LoginPluginRequest, 0x04, Login, ClientBound => LoginPluginRequestSpec { message_id: VarInt, channel: String, data: RemainingBytes }, // Login - ServerBound LoginStart, 0x00, Login, ServerBound => LoginStartSpec { name: String, player_uuid: Option }, EncryptionResponse, 0x01, Login, ServerBound => EncryptionResponseSpec { shared_secret: CountedArray, verfiy_token: CountedArray }, LoginPluginResponse, 0x02, Login, ServerBound => LoginPluginResponseSpec { message_id: VarInt, successful: bool, data: RemainingBytes }, // Play - ClientBound SpawnEntity, 0x00, Play, ClientBound => SpawnEntitySpec { entity_id: VarInt, entity_uuid: UUID4, entity_type: VarInt, // TODO enumerate mob types position: Vec3, pitch: Angle, yaw: Angle, data: i32, velocity: Vec3 }, SpawnExperienceOrb, 0x01, Play, ClientBound => SpawnExperienceOrbSpec { entity_id: VarInt, position: Vec3, count: i16 }, SpawnPlayer, 0x02, Play, ClientBound => SpawnPlayerSpec { entity_id: VarInt, player_uuid: UUID4, position: Vec3, yaw: Angle, pitch: Angle }, EntityAnimation, 0x03, Play, ClientBound => EntityAnimationSpec { entity_id: VarInt, animation: u8 // TODO: enumerate animation id }, AwardStatistics, 0x04, Play, ClientBound => AwardStatisticsSpec { statistics: CountedArray }, AcknowledgeBlockChange, 0x05, Play, ClientBound => AcknowledgeBlockChangeSpec { sequence_id: VarInt }, SetBlockDestroyStage, 0x06, Play, ClientBound => SetBlockDestroyStageSpec { entity_id: VarInt, location: IntPosition, destroy_stage: u8 }, BlockEntityData, 0x07, Play, ClientBound => BlockEntityDataSpec { location: IntPosition, block_entity_type: VarInt, nbt_data: NamedNbtTag }, BlockAction, 0x08, Play, ClientBound => BlockActionSpec { location: IntPosition, action_id: u8, action_parameter: u8, block_type: VarInt }, BlockUpdate, 0x09, Play, ClientBound => BlockUpdateSpec { location: IntPosition, block_id: VarInt }, BossBar, 0x0A, Play, ClientBound => BossBarSpec { uuid: UUID4, action: BossBarAction }, ChangeDifficulty, 0x0B, Play, ClientBound => ChangeDifficultySpec { difficulty: Difficulty, difficulty_locked: bool }, ClearTitles, 0x0C, Play, ClientBound => ClearTitlesSpec { reset: bool }, CommandSuggestionResponse, 0x0D, Play, ClientBound => CommandSuggestionResponseSpec { transaction_id: VarInt, start: VarInt, length: VarInt, suggestions: CountedArray }, Commands, 0x0E, Play, ClientBound => CommandsSpec { nodes: CountedArray, root_index: VarInt }, CloseContainer, 0x0F, Play, ClientBound => CloseContainerSpec { window_id: u8 }, SetContainerContent, 0x10, Play, ClientBound => SetContainerContentSpec { window_id: u8, state_id: VarInt, slot_data: CountedArray, carried_item: Slot }, SetContainerProperty, 0x11, Play, ClientBound => SetContainerPropertySpec { window_id: u8, property: i16, value: i16 }, SetContainerSlot, 0x12, Play, ClientBound => SetContainerSlotSpec { window_id: u8, state_id: VarInt, slot_index: i16, slot_data: Slot }, SetCooldown, 0x13, Play, ClientBound => SetCooldownSpec { item_id: VarInt, cooldown_ticks: VarInt }, ChatSuggestions, 0x14, Play, ClientBound => ChatSuggestionsSpec { action: VarInt, entries: CountedArray }, PluginMessage, 0x15, Play, ClientBound => PluginMessageSpec { channel: String, data: RemainingBytes }, DeleteMessage, 0x16, Play, ClientBound => DeleteMessageSpec { signature: CountedArray }, DisconnectPlay, 0x17, Play, ClientBound => DisconnectPlaySpec { reason: Chat }, DisguisedChatMessage, 0x18, Play, ClientBound => DisguisedChatMessageSpec { message: Chat, chat_type: VarInt, chat_type_name: Chat, target_name: Option }, EntityEvent, 0x19, Play, ClientBound => EntityEventSpec { entity_id: i32, entity_status: u8 }, Explosion, 0x1A, Play, ClientBound => ExplosionSpec { position: Vec3, strength: f32, affected_blocks: CountedArray, VarInt>, player_motion: Vec3 }, UnloadChunk, 0x1B, Play, ClientBound => UnloadChunkSpec { chunk_x: i32, chunk_z: i32 }, GameEvent, 0x1C, Play, ClientBound => GameEventSpec { event: GameEventType, data: f32 }, OpenHorseScreen, 0x1D, Play, ClientBound => OpenHorseScreenSpec { window_id: u8, slot_count: VarInt, entity_id: i32 }, InitializeWorldBorder, 0x1E, Play, ClientBound => InitializeWorldBorderSpec { x: f32, z: f32, old_diameter: f32, new_diameter: f32, speed: VarLong, portal_teleport_boundary: VarInt, warning_blocks: VarInt, warning_time: VarInt }, KeepAlive, 0x1f, Play, ClientBound => KeepAliveSpec { keep_alive_id: i64 }, ChunkDataAndUpdateLight, 0x20, Play, ClientBound => ChunkDataAndUpdateLightSpec { chunk_x: i32, chunk_z: i32, heightmaps: NamedNbtTag, chunk_data: CountedArray, block_entities: CountedArray, trust_edges: bool // TODO: HEEELP } }); // Helper types proto_struct!(BlockEntity { packed_xz: u8, y: i16, block_entity_type: VarInt, data: NamedNbtTag }); proto_byte_enum!(GameEventType, 0 :: NoRespawnBlockAvailable, 1 :: EndRaining, 2 :: BeginRaining, 3 :: ChangeGamemode, 4 :: WinGame, 5 :: DemoEvent, 6 :: ArrowHitPlayer, 7 :: RainLevelChange, 8 :: ThunderLevelChange, 9 :: PlayPufferfishStingSound, 10 :: PlayElderGuardianMobAppearance, 11 :: SetImmediateRespawn ); proto_struct!(CommandSuggestion { match_text: String, tooltip: Option }); proto_byte_enum!(Difficulty, 0 :: Peaceful, 1 :: Easy, 2 :: Normal, 3 :: Hard ); proto_byte_enum!(HandshakeNextState, 0x01 :: Status, 0x02 :: Login ); proto_struct!(LoginProperty { name: String, value: String, signature: Option }); proto_struct!(StatisticValue { category_id: StatisticCategory, statistic_id: VarInt, value: VarInt }); proto_varint_enum!(StatisticCategory, 0 :: Mined, 1 :: Crafted, 2 :: Used, 3 :: Broken, 4 :: PickedUp, 5 :: Dropped, 6 :: Killed, 7 :: KilledBy, 8 :: Custom ); proto_varint_enum!(BossBarAction, 0 :: Add(BossBarAddSpec), 1 :: Remove, 2 :: UpdateHealth(f32), 3 :: UpdateTitle(Chat), 4 :: UpdateStyle(BossBarUpdateStyleSpec), 5 :: UpdateFlags(BossBarFlags) ); proto_struct!(BossBarAddSpec { title: Chat, health: f32, color: BossBarColor, division: BossBarDivision, flags: BossBarFlags }); proto_struct!(BossBarUpdateStyleSpec { color: BossBarColor, dividers: BossBarDivision }); proto_varint_enum!(BossBarColor, 0 :: Pink, 1 :: Blue, 2 :: Red, 3 :: Green, 4 :: Yellow, 5 :: Purple, 6 :: White ); proto_varint_enum!(BossBarDivison, 0 :: NoDivision, 1 :: SixNotches, 2 :: TenNotches, 3 :: TwelveNotches, 4 :: TwentyNotches ); proto_byte_flag!(BossBarFlags, 0x01 :: is_darken_sky set_darken_sky, 0x02 :: is_dragon_bar set_dragon_bar, 0x03 :: is_create_fog set_create_fog );