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
49
50
51
52
53
54
55
56
57
58
use azalea_client::interact::{EntityInteractEvent, StartUseItemEvent, pick::HitResultComponent};
use azalea_core::{hit_result::HitResult, position::BlockPos};
use azalea_protocol::packets::game::s_interact::InteractionHand;
use bevy_ecs::entity::Entity;
use crate::Client;
impl Client {
/// Returns the current [`HitResult`], which is the block or entity in the
/// client's crosshair.
pub fn hit_result(&self) -> HitResult {
(**self.component::<HitResultComponent>()).clone()
}
/// Right-click a block.
///
/// The behavior of this depends on the target block,
/// and it'll either place the block you're holding in your hand or use the
/// block you clicked (like toggling a lever).
///
/// Note that this may trigger anticheats as it doesn't take into account
/// whether you're actually looking at the block.
pub fn block_interact(&self, position: BlockPos) {
self.ecs.write().write_message(StartUseItemEvent {
entity: self.entity,
hand: InteractionHand::MainHand,
force_block: Some(position),
});
}
/// Right-click an entity.
///
/// This can click through walls, which may trigger anticheats. If that
/// behavior isn't desired, consider using [`Client::start_use_item`]
/// instead.
pub fn entity_interact(&self, entity: Entity) {
self.ecs.write().trigger(EntityInteractEvent {
client: self.entity,
target: entity,
location: None,
});
}
/// Right-click the currently held item.
///
/// If the item is consumable, then it'll act as if right-click was held
/// until the item finishes being consumed. You can use this to eat food.
///
/// If we're looking at a block or entity, then it will be clicked. Also see
/// [`Client::block_interact`] and [`Client::entity_interact`].
pub fn start_use_item(&self) {
self.ecs.write().write_message(StartUseItemEvent {
entity: self.entity,
hand: InteractionHand::MainHand,
force_block: None,
});
}
}