nearest_entity/
nearest_entity.rs1use 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}