1
2
Fork 0
mirror of https://github.com/mat-1/azalea.git synced 2025-08-02 14:26:04 +00:00

fix panic on bot disconnect

This commit is contained in:
mat 2025-01-12 05:07:53 +00:00
parent a5cb21f039
commit 608ccb8e54
4 changed files with 55 additions and 7 deletions

View file

@ -4,7 +4,10 @@ mod relative_updates;
use std::collections::HashSet; use std::collections::HashSet;
use azalea_block::{fluid_state::FluidKind, BlockState}; use azalea_block::{fluid_state::FluidKind, BlockState};
use azalea_core::position::{BlockPos, ChunkPos, Vec3}; use azalea_core::{
position::{BlockPos, ChunkPos, Vec3},
tick::GameTick,
};
use azalea_world::{InstanceContainer, InstanceName, MinecraftEntityId}; use azalea_world::{InstanceContainer, InstanceName, MinecraftEntityId};
use bevy_app::{App, Plugin, PreUpdate, Update}; use bevy_app::{App, Plugin, PreUpdate, Update};
use bevy_ecs::prelude::*; use bevy_ecs::prelude::*;
@ -59,7 +62,7 @@ impl Plugin for EntityPlugin {
), ),
) )
.add_systems(Update, update_bounding_box) .add_systems(Update, update_bounding_box)
.add_systems(PreUpdate, update_in_loaded_chunk) .add_systems(GameTick, update_in_loaded_chunk)
.init_resource::<EntityUuidIndex>(); .init_resource::<EntityUuidIndex>();
} }
} }
@ -215,6 +218,7 @@ pub fn update_in_loaded_chunk(
for (entity, instance_name, position) in &query { for (entity, instance_name, position) in &query {
let player_chunk_pos = ChunkPos::from(position); let player_chunk_pos = ChunkPos::from(position);
let Some(instance_lock) = instance_container.get(instance_name) else { let Some(instance_lock) = instance_container.get(instance_name) else {
commands.entity(entity).remove::<InLoadedChunk>();
continue; continue;
}; };

View file

@ -23,7 +23,7 @@ pub fn update_in_water_state_and_do_fluid_pushing(
for (mut physics, position, instance_name) in &mut query { for (mut physics, position, instance_name) in &mut query {
let world_lock = instance_container let world_lock = instance_container
.get(instance_name) .get(instance_name)
.expect("All entities should be in a valid world"); .expect("All entities with InLoadedChunk should be in a valid world");
let world = world_lock.read(); let world = world_lock.read();
physics.water_fluid_height = 0.; physics.water_fluid_height = 0.;

View file

@ -109,10 +109,8 @@ pub fn ai_step(
if !physics.is_in_lava() if !physics.is_in_lava()
|| physics.on_ground() && fluid_height <= fluid_jump_threshold || physics.on_ground() && fluid_height <= fluid_jump_threshold
{ {
if physics.on_ground() if (physics.on_ground() || in_water && fluid_height <= fluid_jump_threshold)
|| in_water && physics.no_jump_delay == 0
&& fluid_height <= fluid_jump_threshold
&& physics.no_jump_delay == 0
{ {
jump_from_ground( jump_from_ground(
&mut physics, &mut physics,

View file

@ -363,3 +363,49 @@ fn test_negative_coordinates_weird_wall_collision() {
let entity_pos = app.world_mut().get::<Position>(entity).unwrap(); let entity_pos = app.world_mut().get::<Position>(entity).unwrap();
assert_eq!(entity_pos.y, 70.5); assert_eq!(entity_pos.y, 70.5);
} }
#[test]
fn spawn_and_unload_world() {
let mut app = make_test_app();
let world_lock = app.world_mut().resource_mut::<InstanceContainer>().insert(
ResourceLocation::new("minecraft:overworld"),
384,
-64,
);
let mut partial_world = PartialInstance::default();
partial_world.chunks.set(
&ChunkPos { x: -1, z: -1 },
Some(Chunk::default()),
&mut world_lock.write().chunks,
);
let _entity = app
.world_mut()
.spawn((
EntityBundle::new(
Uuid::nil(),
Vec3 {
x: -7.5,
y: 73.,
z: -7.5,
},
azalea_registry::EntityKind::Player,
ResourceLocation::new("minecraft:overworld"),
),
MinecraftEntityId(0),
LocalEntity,
))
.id();
// do a tick
app.world_mut().run_schedule(GameTick);
app.update();
// now unload the partial_world and world_lock
drop(partial_world);
drop(world_lock);
// do another tick
app.world_mut().run_schedule(GameTick);
app.update();
}