nearest_entity/
nearest_entity.rs

1use azalea::{
2    ClientBuilder,
3    bot::{Bot, LookAtEvent},
4    nearest_entity::EntityFinder,
5    prelude::*,
6};
7use azalea_client::Account;
8use azalea_core::tick::GameTick;
9use azalea_entity::{
10    LocalEntity, Position,
11    dimensions::EntityDimensions,
12    metadata::{ItemItem, Player},
13};
14use bevy_app::Plugin;
15use bevy_ecs::{
16    prelude::{Entity, MessageWriter},
17    query::With,
18    system::Query,
19};
20
21#[tokio::main]
22async fn main() -> AppExit {
23    let account = Account::offline("bot");
24
25    ClientBuilder::new()
26        .add_plugins(LookAtStuffPlugin)
27        .start(account, "localhost")
28        .await
29}
30
31pub struct LookAtStuffPlugin;
32impl Plugin for LookAtStuffPlugin {
33    fn build(&self, app: &mut bevy_app::App) {
34        app.add_systems(GameTick, (look_at_everything, log_nearby_item_drops));
35    }
36}
37
38fn look_at_everything(
39    bots: Query<Entity, (With<LocalEntity>, With<Player>)>,
40    entities: EntityFinder,
41    entity_positions: Query<(&Position, Option<&EntityDimensions>)>,
42    mut look_at_event: MessageWriter<LookAtEvent>,
43) {
44    for bot_id in bots.iter() {
45        let Some(entity) = entities.nearest_to_entity(bot_id, 16.0) else {
46            continue;
47        };
48
49        let (position, dimensions) = entity_positions.get(entity).unwrap();
50
51        let mut look_target = **position;
52        if let Some(dimensions) = dimensions {
53            look_target.y += dimensions.eye_height as f64;
54        }
55
56        look_at_event.write(LookAtEvent {
57            entity: bot_id,
58            position: look_target,
59        });
60    }
61}
62
63fn log_nearby_item_drops(
64    bots: Query<Entity, With<Bot>>,
65    entities: EntityFinder<With<ItemItem>>,
66    item_drops: Query<&ItemItem>,
67) {
68    for bot_id in bots.iter() {
69        for (entity, distance) in entities.nearby_entities_to_entity(bot_id, 8.0) {
70            let item_drop = item_drops.get(entity).unwrap();
71            let kind = item_drop.kind();
72
73            println!("Bot {bot_id:?} can see an {kind:?} {distance:.1} meters away.");
74        }
75    }
76}