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

wait for block to exist when calling open_container_at

This commit is contained in:
mat 2025-06-05 00:59:14 -04:00
parent 874f051810
commit 338f931c51
2 changed files with 23 additions and 2 deletions

View file

@ -10,6 +10,7 @@ use azalea_inventory::{
ItemStack, Menu, ItemStack, Menu,
operations::{ClickOperation, PickupClick, QuickMoveClick}, operations::{ClickOperation, PickupClick, QuickMoveClick},
}; };
use azalea_physics::collision::BlockWithShape;
use azalea_protocol::packets::game::ClientboundGamePacket; use azalea_protocol::packets::game::ClientboundGamePacket;
use bevy_app::{App, Plugin, Update}; use bevy_app::{App, Plugin, Update};
use bevy_ecs::{component::Component, prelude::EventReader, system::Commands}; use bevy_ecs::{component::Component, prelude::EventReader, system::Commands};
@ -54,14 +55,28 @@ impl ContainerClientExt for Client {
/// # } /// # }
/// ``` /// ```
async fn open_container_at(&self, pos: BlockPos) -> Option<ContainerHandle> { async fn open_container_at(&self, pos: BlockPos) -> Option<ContainerHandle> {
let mut ticks = self.get_tick_broadcaster();
// wait until it's not air (up to 10 ticks)
for _ in 0..10 {
if !self
.world()
.read()
.get_block_state(&pos)
.unwrap_or_default()
.is_collision_shape_empty()
{
break;
}
let _ = ticks.recv().await;
}
self.ecs self.ecs
.lock() .lock()
.entity_mut(self.entity) .entity_mut(self.entity)
.insert(WaitingForInventoryOpen); .insert(WaitingForInventoryOpen);
self.block_interact(pos); self.block_interact(pos);
let mut receiver = self.get_tick_broadcaster(); while ticks.recv().await.is_ok() {
while receiver.recv().await.is_ok() {
let ecs = self.ecs.lock(); let ecs = self.ecs.lock();
if ecs.get::<WaitingForInventoryOpen>(self.entity).is_none() { if ecs.get::<WaitingForInventoryOpen>(self.entity).is_none() {
break; break;

View file

@ -220,6 +220,12 @@ impl Goal for ReachBlockPosGoal {
BlockPosGoal(self.pos).heuristic(n) BlockPosGoal(self.pos).heuristic(n)
} }
fn success(&self, n: BlockPos) -> bool { fn success(&self, n: BlockPos) -> bool {
if n.up(1) == self.pos {
// our head is in the block, assume it's always reachable (to reduce the amount
// of impossible goals)
return true;
}
// only do the expensive check if we're close enough // only do the expensive check if we're close enough
let distance = self.pos.distance_squared_to(&n); let distance = self.pos.distance_squared_to(&n);
if distance > self.max_check_distance.pow(2) { if distance > self.max_check_distance.pow(2) {