From 881055e58711838893416bfc555e0643c5cfa515 Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 2 May 2025 01:20:25 +0000 Subject: fix InstanceName desync --- azalea-client/src/plugins/chunks.rs | 2 +- azalea-client/src/plugins/packet/config/mod.rs | 2 +- azalea-client/src/plugins/packet/game/mod.rs | 25 +++++++++++++++++-------- 3 files changed, 19 insertions(+), 10 deletions(-) (limited to 'azalea-client/src/plugins') diff --git a/azalea-client/src/plugins/chunks.rs b/azalea-client/src/plugins/chunks.rs index 5599d7c9..2d31aabb 100644 --- a/azalea-client/src/plugins/chunks.rs +++ b/azalea-client/src/plugins/chunks.rs @@ -67,7 +67,7 @@ pub struct ChunkBatchFinishedEvent { pub fn handle_receive_chunk_events( mut events: EventReader, - mut query: Query<&mut InstanceHolder>, + mut query: Query<&InstanceHolder>, ) { for event in events.read() { let pos = ChunkPos::new(event.packet.x, event.packet.z); diff --git a/azalea-client/src/plugins/packet/config/mod.rs b/azalea-client/src/plugins/packet/config/mod.rs index 554135d2..861289b7 100644 --- a/azalea-client/src/plugins/packet/config/mod.rs +++ b/azalea-client/src/plugins/packet/config/mod.rs @@ -64,7 +64,7 @@ pub struct ConfigPacketHandler<'a> { } impl ConfigPacketHandler<'_> { pub fn registry_data(&mut self, p: &ClientboundRegistryData) { - as_system::>(self.ecs, |mut query| { + as_system::>(self.ecs, |mut query| { let instance_holder = query.get_mut(self.player).unwrap(); let mut instance = instance_holder.instance.write(); diff --git a/azalea-client/src/plugins/packet/game/mod.rs b/azalea-client/src/plugins/packet/game/mod.rs index 869a795c..71766f8b 100644 --- a/azalea-client/src/plugins/packet/game/mod.rs +++ b/azalea-client/src/plugins/packet/game/mod.rs @@ -227,7 +227,7 @@ impl GamePacketHandler<'_> { let new_instance_name = p.common.dimension.clone(); if let Some(mut instance_name) = instance_name { - *instance_name = instance_name.clone(); + **instance_name = new_instance_name.clone(); } else { commands .entity(self.player) @@ -243,7 +243,7 @@ impl GamePacketHandler<'_> { // add this world to the instance_container (or don't if it's already // there) - let weak_instance = instance_container.insert( + let weak_instance = instance_container.get_or_insert( new_instance_name.clone(), dimension_data.height, dimension_data.min_y, @@ -591,7 +591,7 @@ impl GamePacketHandler<'_> { pub fn set_chunk_cache_center(&mut self, p: &ClientboundSetChunkCacheCenter) { debug!("Got chunk cache center packet {p:?}"); - as_system::>(self.ecs, |mut query| { + as_system::>(self.ecs, |mut query| { let instance_holder = query.get_mut(self.player).unwrap(); let mut partial_world = instance_holder.partial_instance.write(); @@ -1122,7 +1122,7 @@ impl GamePacketHandler<'_> { pub fn block_update(&mut self, p: &ClientboundBlockUpdate) { debug!("Got block update packet {p:?}"); - as_system::>(self.ecs, |mut query| { + as_system::>(self.ecs, |mut query| { let local_player = query.get_mut(self.player).unwrap(); let world = local_player.instance.write(); @@ -1138,7 +1138,7 @@ impl GamePacketHandler<'_> { pub fn section_blocks_update(&mut self, p: &ClientboundSectionBlocksUpdate) { debug!("Got section blocks update packet {p:?}"); - as_system::>(self.ecs, |mut query| { + as_system::>(self.ecs, |mut query| { let local_player = query.get_mut(self.player).unwrap(); let world = local_player.instance.write(); for state in &p.states { @@ -1311,7 +1311,7 @@ impl GamePacketHandler<'_> { pub fn forget_level_chunk(&mut self, p: &ClientboundForgetLevelChunk) { debug!("Got forget level chunk packet {p:?}"); - as_system::>(self.ecs, |mut query| { + as_system::>(self.ecs, |mut query| { let local_player = query.get_mut(self.player).unwrap(); let mut partial_instance = local_player.partial_instance.write(); @@ -1410,6 +1410,7 @@ impl GamePacketHandler<'_> { &mut InstanceHolder, &GameProfileComponent, &ClientInformation, + Option<&mut InstanceName>, ), With, >, @@ -1419,11 +1420,19 @@ impl GamePacketHandler<'_> { )>( self.ecs, |(mut commands, mut query, mut events, mut instance_container, mut loaded_by_query)| { - let (mut instance_holder, game_profile, client_information) = + let (mut instance_holder, game_profile, client_information, instance_name) = query.get_mut(self.player).unwrap(); let new_instance_name = p.common.dimension.clone(); + if let Some(mut instance_name) = instance_name { + **instance_name = new_instance_name.clone(); + } else { + commands + .entity(self.player) + .insert(InstanceName(new_instance_name.clone())); + } + let Some((_dimension_type, dimension_data)) = p .common .dimension_type(&instance_holder.instance.read().registries) @@ -1433,7 +1442,7 @@ impl GamePacketHandler<'_> { // add this world to the instance_container (or don't if it's already // there) - let weak_instance = instance_container.insert( + let weak_instance = instance_container.get_or_insert( new_instance_name.clone(), dimension_data.height, dimension_data.min_y, -- cgit v1.2.3