diff options
Diffstat (limited to 'azalea-client/src')
| -rw-r--r-- | azalea-client/src/test_simulation.rs | 77 |
1 files changed, 63 insertions, 14 deletions
diff --git a/azalea-client/src/test_simulation.rs b/azalea-client/src/test_simulation.rs index 67dcb818..564db0cf 100644 --- a/azalea-client/src/test_simulation.rs +++ b/azalea-client/src/test_simulation.rs @@ -2,29 +2,32 @@ use std::{fmt::Debug, sync::Arc, time::Duration}; use azalea_auth::game_profile::GameProfile; use azalea_buf::AzaleaWrite; +use azalea_core::delta::PositionDelta8; use azalea_core::game_type::{GameMode, OptionalGameType}; -use azalea_core::position::ChunkPos; +use azalea_core::position::{ChunkPos, Vec3}; use azalea_core::resource_location::ResourceLocation; use azalea_core::tick::GameTick; use azalea_entity::metadata::PlayerMetadataBundle; use azalea_protocol::packets::common::CommonPlayerSpawnInfo; +use azalea_protocol::packets::config::{ClientboundFinishConfiguration, ClientboundRegistryData}; use azalea_protocol::packets::game::c_level_chunk_with_light::ClientboundLevelChunkPacketData; use azalea_protocol::packets::game::c_light_update::ClientboundLightUpdatePacketData; use azalea_protocol::packets::game::{ - ClientboundLevelChunkWithLight, ClientboundLogin, ClientboundRespawn, + ClientboundAddEntity, ClientboundLevelChunkWithLight, ClientboundLogin, ClientboundRespawn, }; use azalea_protocol::packets::{ConnectionProtocol, Packet, ProtocolPacket}; -use azalea_registry::DimensionType; +use azalea_registry::{DimensionType, EntityKind}; use azalea_world::palette::{PalettedContainer, PalettedContainerKind}; use azalea_world::{Chunk, Instance, MinecraftEntityId, Section}; use bevy_app::App; use bevy_ecs::{prelude::*, schedule::ExecutorKind}; use parking_lot::{Mutex, RwLock}; -use simdnbt::owned::Nbt; +use simdnbt::owned::{Nbt, NbtCompound, NbtTag}; use tokio::task::JoinHandle; use tokio::{sync::mpsc, time::sleep}; use uuid::Uuid; +use crate::disconnect::DisconnectEvent; use crate::{ ClientInformation, GameProfileComponent, InConfigState, InstanceHolder, LocalPlayerBundle, events::LocalPlayerEvents, @@ -48,29 +51,49 @@ impl Simulation { let mut app = create_simulation_app(); let mut entity = app.world_mut().spawn_empty(); let (player, clear_outgoing_packets_receiver_task, incoming_packet_queue, rt) = - create_local_player_bundle(entity.id(), initial_connection_protocol); + create_local_player_bundle(entity.id(), ConnectionProtocol::Configuration); entity.insert(player); let entity = entity.id(); tick_app(&mut app); - #[allow(clippy::single_match)] - match initial_connection_protocol { - ConnectionProtocol::Configuration => { - app.world_mut().entity_mut(entity).insert(InConfigState); - tick_app(&mut app); - } - _ => {} - } + // start in the config state + app.world_mut().entity_mut(entity).insert(InConfigState); + tick_app(&mut app); - Self { + let mut simulation = Self { app, entity, rt, incoming_packet_queue, clear_outgoing_packets_receiver_task, + }; + + #[allow(clippy::single_match)] + match initial_connection_protocol { + ConnectionProtocol::Configuration => {} + ConnectionProtocol::Game => { + simulation.receive_packet(ClientboundRegistryData { + registry_id: ResourceLocation::new("minecraft:dimension_type"), + entries: vec![( + ResourceLocation::new("minecraft:overworld"), + Some(NbtCompound::from_values(vec![ + ("height".into(), NbtTag::Int(384)), + ("min_y".into(), NbtTag::Int(-64)), + ])), + )] + .into_iter() + .collect(), + }); + + simulation.receive_packet(ClientboundFinishConfiguration); + simulation.tick(); + } + _ => unimplemented!("unsupported ConnectionProtocol {initial_connection_protocol:?}"), } + + simulation } pub fn receive_packet<P: ProtocolPacket + Debug>(&mut self, packet: impl Packet<P>) { @@ -98,6 +121,14 @@ impl Simulation { .chunks .get(&chunk_pos) } + + pub fn disconnect(&mut self) { + // send DisconnectEvent + self.app.world_mut().send_event(DisconnectEvent { + entity: self.entity, + reason: None, + }); + } } #[allow(clippy::type_complexity)] @@ -270,3 +301,21 @@ pub fn make_basic_empty_chunk( light_data: ClientboundLightUpdatePacketData::default(), } } + +pub fn make_basic_add_entity( + entity_type: EntityKind, + id: i32, + position: impl Into<Vec3>, +) -> ClientboundAddEntity { + ClientboundAddEntity { + id: id.into(), + uuid: Uuid::from_u128(1234), + entity_type, + position: position.into(), + x_rot: 0, + y_rot: 0, + y_head_rot: 0, + data: 0, + velocity: PositionDelta8::default(), + } +} |
