aboutsummaryrefslogtreecommitdiff
path: root/azalea/examples/testbot/killaura.rs
blob: d86356fe21d60d03636e9e556470675f8eb16365 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use azalea::{
    ecs::prelude::*,
    entity::{metadata::AbstractMonster, Dead, LocalEntity, Position},
    prelude::*,
    world::{InstanceName, MinecraftEntityId},
};

use crate::State;

pub fn tick(mut bot: Client, state: State) -> anyhow::Result<()> {
    if !state.killaura {
        return Ok(());
    }
    if bot.has_attack_cooldown() {
        return Ok(());
    }
    let mut nearest_entity = None;
    let mut nearest_distance = f64::INFINITY;
    let bot_position = bot.eye_position();
    let bot_instance_name = bot.component::<InstanceName>();
    {
        let mut ecs = bot.ecs.lock();
        let mut query = ecs
            .query_filtered::<(&MinecraftEntityId, &Position, &InstanceName), (
                With<AbstractMonster>,
                Without<LocalEntity>,
                Without<Dead>,
            )>();
        for (&entity_id, position, instance_name) in query.iter(&ecs) {
            if instance_name != &bot_instance_name {
                continue;
            }

            let distance = bot_position.distance_to(position);
            if distance < 4. && distance < nearest_distance {
                nearest_entity = Some(entity_id);
                nearest_distance = distance;
            }
        }
    }
    if let Some(nearest_entity) = nearest_entity {
        println!("attacking {:?}", nearest_entity);
        println!("distance {:?}", nearest_distance);
        bot.attack(nearest_entity);
    }

    Ok(())
}