Vec3

Struct Vec3 

pub struct Vec3 {
    pub x: f64,
    pub y: f64,
    pub z: f64,
}
Expand description

Used to represent an exact position in the world where an entity could be.

For blocks, BlockPos is used instead.

Fields§

§x: f64§y: f64§z: f64

Implementations§

§

impl Vec3

pub fn with_delta(&self, delta: &impl PositionDeltaTrait) -> Vec3

pub fn normalize(&self) -> Vec3

pub fn multiply(&self, x: f64, y: f64, z: f64) -> Vec3

pub fn scale(&self, amount: f64) -> Vec3

§

impl Vec3

pub const ZERO: Vec3

The position where x, y, and z are all 0.

pub const fn new(x: f64, y: f64, z: f64) -> Vec3

pub fn length_squared(&self) -> f64

Get the distance of this vector to the origin by doing x^2 + y^2 + z^2.

pub fn distance_squared_to(self, other: Vec3) -> f64

Get the squared distance from this position to another position. Equivalent to (self - other).length_squared().

pub fn horizontal_distance_squared(&self) -> f64

pub fn horizontal_distance_squared_to(self, other: Vec3) -> f64

pub fn down(&self, y: f64) -> Vec3

Return a new instance of this position with the y coordinate decreased by the given number.

pub fn up(&self, y: f64) -> Vec3

Return a new instance of this position with the y coordinate increased by the given number.

Examples found in repository?
azalea/examples/testbot/commands/movement.rs (line 111)
16pub fn register(commands: &mut CommandDispatcher<Mutex<CommandSource>>) {
17    commands.register(
18        literal("goto")
19            .executes(|ctx: &Ctx| {
20                let mut source = ctx.source.lock();
21                println!("got goto");
22                // look for the sender
23                let Some(entity) = source.entity() else {
24                    source.reply("I can't see you!");
25                    return 0;
26                };
27                let Some(position) = source.bot.get_entity_component::<Position>(entity) else {
28                    source.reply("I can't see you!");
29                    return 0;
30                };
31                let position = position.clone();
32                source.reply("ok");
33                source
34                    .bot
35                    .start_goto(BlockPosGoal(BlockPos::from(position)));
36                1
37            })
38            .then(literal("xz").then(argument("x", integer()).then(
39                argument("z", integer()).executes(|ctx: &Ctx| {
40                    let source = ctx.source.lock();
41                    let x = get_integer(ctx, "x").unwrap();
42                    let z = get_integer(ctx, "z").unwrap();
43                    println!("goto xz {x} {z}");
44                    source.reply("ok");
45                    source.bot.start_goto(XZGoal { x, z });
46                    1
47                }),
48            )))
49            .then(literal("radius").then(argument("radius", float()).then(
50                argument("x", integer()).then(argument("y", integer()).then(
51                    argument("z", integer()).executes(|ctx: &Ctx| {
52                        let source = ctx.source.lock();
53                        let radius = get_float(ctx, "radius").unwrap();
54                        let x = get_integer(ctx, "x").unwrap();
55                        let y = get_integer(ctx, "y").unwrap();
56                        let z = get_integer(ctx, "z").unwrap();
57                        println!("goto radius {radius}, position: {x} {y} {z}");
58                        source.reply("ok");
59                        source.bot.start_goto(RadiusGoal {
60                            pos: BlockPos::new(x, y, z).center(),
61                            radius,
62                        });
63                        1
64                    }),
65                )),
66            )))
67            .then(argument("x", integer()).then(argument("y", integer()).then(
68                argument("z", integer()).executes(|ctx: &Ctx| {
69                    let source = ctx.source.lock();
70                    let x = get_integer(ctx, "x").unwrap();
71                    let y = get_integer(ctx, "y").unwrap();
72                    let z = get_integer(ctx, "z").unwrap();
73                    println!("goto xyz {x} {y} {z}");
74                    source.reply("ok");
75                    source.bot.start_goto(BlockPosGoal(BlockPos::new(x, y, z)));
76                    1
77                }),
78            ))),
79    );
80
81    commands.register(literal("down").executes(|ctx: &Ctx| {
82        let source = ctx.source.clone();
83        tokio::spawn(async move {
84            let bot = source.lock().bot.clone();
85            let position = BlockPos::from(bot.position());
86            source.lock().reply("mining...");
87            bot.mine(position.down(1)).await;
88            source.lock().reply("done");
89        });
90        1
91    }));
92
93    commands.register(
94        literal("look")
95            .executes(|ctx: &Ctx| {
96                // look for the sender
97                let mut source = ctx.source.lock();
98                let Some(entity) = source.entity() else {
99                    source.reply("I can't see you!");
100                    return 0;
101                };
102                let Some(position) = source.bot.get_entity_component::<Position>(entity) else {
103                    source.reply("I can't see you!");
104                    return 0;
105                };
106                let eye_height = source
107                    .bot
108                    .get_entity_component::<EntityDimensions>(entity)
109                    .map(|h| h.eye_height)
110                    .unwrap_or_default();
111                source.bot.look_at(position.up(eye_height as f64));
112                1
113            })
114            .then(argument("x", integer()).then(argument("y", integer()).then(
115                argument("z", integer()).executes(|ctx: &Ctx| {
116                    let pos = BlockPos::new(
117                        get_integer(ctx, "x").unwrap(),
118                        get_integer(ctx, "y").unwrap(),
119                        get_integer(ctx, "z").unwrap(),
120                    );
121                    println!("{pos:?}");
122                    let source = ctx.source.lock();
123                    source.bot.look_at(pos.center());
124                    1
125                }),
126            ))),
127    );
128
129    commands.register(
130        literal("walk").then(argument("seconds", float()).executes(|ctx: &Ctx| {
131            let mut seconds = get_float(ctx, "seconds").unwrap();
132            let source = ctx.source.lock();
133            let bot = source.bot.clone();
134
135            if seconds < 0. {
136                bot.walk(WalkDirection::Backward);
137                seconds = -seconds;
138            } else {
139                bot.walk(WalkDirection::Forward);
140            }
141
142            tokio::spawn(async move {
143                tokio::time::sleep(Duration::from_secs_f32(seconds)).await;
144                bot.walk(WalkDirection::None);
145            });
146            source.reply(format!("ok, walking for {seconds} seconds"));
147            1
148        })),
149    );
150    commands.register(
151        literal("sprint").then(argument("seconds", float()).executes(|ctx: &Ctx| {
152            let seconds = get_float(ctx, "seconds").unwrap();
153            let source = ctx.source.lock();
154            let bot = source.bot.clone();
155            bot.sprint(SprintDirection::Forward);
156            tokio::spawn(async move {
157                tokio::time::sleep(Duration::from_secs_f32(seconds)).await;
158                bot.walk(WalkDirection::None);
159            });
160            source.reply(format!("ok, sprinting for {seconds} seconds"));
161            1
162        })),
163    );
164
165    commands.register(literal("north").executes(|ctx: &Ctx| {
166        let source = ctx.source.lock();
167        source.bot.set_direction(180., 0.);
168        source.reply("ok");
169        1
170    }));
171    commands.register(literal("south").executes(|ctx: &Ctx| {
172        let source = ctx.source.lock();
173        source.bot.set_direction(0., 0.);
174        source.reply("ok");
175        1
176    }));
177    commands.register(literal("east").executes(|ctx: &Ctx| {
178        let source = ctx.source.lock();
179        source.bot.set_direction(-90., 0.);
180        source.reply("ok");
181        1
182    }));
183    commands.register(literal("west").executes(|ctx: &Ctx| {
184        let source = ctx.source.lock();
185        source.bot.set_direction(90., 0.);
186        source.reply("ok");
187        1
188    }));
189    commands.register(
190        literal("jump")
191            .executes(|ctx: &Ctx| {
192                let source = ctx.source.lock();
193                source.bot.jump();
194                source.reply("ok");
195                1
196            })
197            .then(argument("enabled", bool()).executes(|ctx: &Ctx| {
198                let jumping = get_bool(ctx, "enabled").unwrap();
199                let source = ctx.source.lock();
200                source.bot.set_jumping(jumping);
201                1
202            })),
203    );
204
205    let sneak = |ctx: &Ctx| {
206        let source = ctx.source.lock();
207        source.bot.set_crouching(!source.bot.crouching());
208        source.reply("ok");
209        1
210    };
211    let sneak_enabled = argument("enabled", bool()).executes(|ctx: &Ctx| {
212        let sneaking = get_bool(ctx, "enabled").unwrap();
213        let source = ctx.source.lock();
214        source.bot.set_crouching(sneaking);
215        1
216    });
217    commands.register(literal("sneak").executes(sneak).then(sneak_enabled.clone()));
218    commands.register(literal("crouch").executes(sneak).then(sneak_enabled));
219
220    commands.register(literal("stop").executes(|ctx: &Ctx| {
221        let source = ctx.source.lock();
222        source.bot.stop_pathfinding();
223        source.reply("ok");
224        *source.state.task.lock() = BotTask::None;
225        1
226    }));
227}

pub fn north(&self, z: f64) -> Vec3

Return a new instance of this position with the z coordinate subtracted by the given number.

pub fn east(&self, x: f64) -> Vec3

Return a new instance of this position with the x coordinate increased by the given number.

pub fn south(&self, z: f64) -> Vec3

Return a new instance of this position with the z coordinate increased by the given number.

pub fn west(&self, x: f64) -> Vec3

Return a new instance of this position with the x coordinate subtracted by the given number.

pub fn dot(&self, other: Vec3) -> f64

pub fn min(&self, other: Vec3) -> Vec3

Make a new position with the lower coordinates for each axis.

pub fn max(&self, other: Vec3) -> Vec3

Make a new position with the higher coordinates for each axis.

pub fn xz(&self) -> Vec3

Replace the Y with 0.

pub fn with_x(&self, x: f64) -> Vec3

pub fn with_y(&self, y: f64) -> Vec3

pub fn with_z(&self, z: f64) -> Vec3

§

impl Vec3

pub fn length(&self) -> f64

Get the distance of this vector to the origin by doing sqrt(x^2 + y^2 + z^2).

pub fn distance_to(self, other: Vec3) -> f64

Get the distance from this position to another position. Equivalent to (self - other).length().

Examples found in repository?
azalea/examples/testbot/killaura.rs (line 23)
9pub fn tick(bot: Client, state: State) -> anyhow::Result<()> {
10    if !state.killaura {
11        return Ok(());
12    }
13    if bot.has_attack_cooldown() {
14        return Ok(());
15    }
16    let bot_position = bot.eye_position();
17
18    let nearest_entity = bot.nearest_entity_by::<&Position, (
19        With<AbstractMonster>,
20        Without<LocalEntity>,
21        Without<Dead>,
22    )>(|position: &Position| {
23        let distance = bot_position.distance_to(**position);
24        distance < 4.
25    });
26
27    if let Some(nearest_entity) = nearest_entity {
28        println!("attacking {nearest_entity:?}");
29        bot.attack(nearest_entity);
30    }
31
32    Ok(())
33}

pub fn x_rot(self, radians: f32) -> Vec3

pub fn y_rot(self, radians: f32) -> Vec3

pub fn to_block_pos_floor(&self) -> BlockPos

pub fn to_block_pos_ceil(&self) -> BlockPos

pub fn closer_than(&self, other: Vec3, range: f64) -> bool

Whether the distance between this point and other is less than range.

Trait Implementations§

§

impl Add<f64> for Vec3

§

type Output = Vec3

The resulting type after applying the + operator.
§

fn add(self, rhs: f64) -> <Vec3 as Add<f64>>::Output

Performs the + operation. Read more
§

impl Add for &Vec3

§

type Output = Vec3

The resulting type after applying the + operator.
§

fn add(self, rhs: &Vec3) -> <&Vec3 as Add>::Output

Performs the + operation. Read more
§

impl Add for Vec3

§

type Output = Vec3

The resulting type after applying the + operator.
§

fn add(self, rhs: Vec3) -> <Vec3 as Add>::Output

Performs the + operation. Read more
§

impl AddAssign for Vec3

§

fn add_assign(&mut self, rhs: Vec3)

Performs the += operation. Read more
§

impl AzaleaRead for Vec3

§

impl AzaleaWrite for Vec3

§

fn azalea_write(&self, buf: &mut impl Write) -> Result<(), Error>

§

impl Clone for Vec3

§

fn clone(&self) -> Vec3

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Vec3

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for Vec3

§

fn default() -> Vec3

Returns the “default value” for a type. Read more
§

impl<'de> Deserialize<'de> for Vec3

§

fn deserialize<__D>( __deserializer: __D, ) -> Result<Vec3, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Display for Vec3

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Display a position as x y z.

§

impl Div<f64> for Vec3

§

type Output = Vec3

The resulting type after applying the / operator.
§

fn div(self, divisor: f64) -> <Vec3 as Div<f64>>::Output

Performs the / operation. Read more
§

impl DivAssign<f64> for Vec3

§

fn div_assign(&mut self, divisor: f64)

Performs the /= operation. Read more
§

impl From<&(f64, f64, f64)> for Vec3

§

fn from(pos: &(f64, f64, f64)) -> Vec3

Converts to this type from the input type.
§

impl From<&LastSentPosition> for Vec3

§

fn from(value: &LastSentPosition) -> Vec3

Converts to this type from the input type.
§

impl From<&Position> for Vec3

§

fn from(value: &Position) -> Vec3

Converts to this type from the input type.
§

impl From<&Vec3> for BlockPos

§

fn from(pos: &Vec3) -> BlockPos

Converts to this type from the input type.
§

impl From<&Vec3> for ChunkPos

§

fn from(pos: &Vec3) -> ChunkPos

Converts to this type from the input type.
§

impl From<(f64, f64, f64)> for Vec3

§

fn from(pos: (f64, f64, f64)) -> Vec3

Converts to this type from the input type.
§

impl From<LpVec3> for Vec3

§

fn from(value: LpVec3) -> Vec3

Converts to this type from the input type.
§

impl<T> From<T> for Vec3
where T: PositionDeltaTrait,

§

fn from(value: T) -> Vec3

Converts to this type from the input type.
§

impl From<Vec3> for BlockPos

§

fn from(pos: Vec3) -> BlockPos

Converts to this type from the input type.
§

impl From<Vec3> for ChunkPos

§

fn from(pos: Vec3) -> ChunkPos

Converts to this type from the input type.
§

impl From<Vec3> for Vec3f32

§

fn from(v: Vec3) -> Vec3f32

Converts to this type from the input type.
§

impl From<Vec3f32> for Vec3

§

fn from(v: Vec3f32) -> Vec3

Converts to this type from the input type.
§

impl FromNbtTag for Vec3

§

fn from_nbt_tag(tag: NbtTag<'_, '_>) -> Option<Vec3>

§

fn from_optional_nbt_tag( tag: Option<NbtTag<'_, '_>>, ) -> Result<Option<Self>, DeserializeError>

§

impl FromStr for Vec3

Parses a string in the format “X Y Z” into a Vec3.

The input string should contain three floating-point values separated by spaces, representing the x, y, and z components of the vector respectively. This can be used to parse user input or from Vec3::to_string.

§

type Err = &'static str

The associated error which can be returned from parsing.
§

fn from_str(s: &str) -> Result<Vec3, <Vec3 as FromStr>::Err>

Parses a string s to return a value of this type. Read more
§

impl Mul<f64> for Vec3

§

type Output = Vec3

The resulting type after applying the * operator.
§

fn mul(self, multiplier: f64) -> <Vec3 as Mul<f64>>::Output

Performs the * operation. Read more
§

impl MulAssign<f64> for Vec3

§

fn mul_assign(&mut self, multiplier: f64)

Performs the *= operation. Read more
§

impl PartialEq for Vec3

§

fn eq(&self, other: &Vec3) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
§

impl Rem<f64> for Vec3

§

type Output = Vec3

The resulting type after applying the % operator.
§

fn rem(self, rhs: f64) -> <Vec3 as Rem<f64>>::Output

Performs the % operation. Read more
§

impl Serialize for Vec3

§

fn serialize<__S>( &self, __serializer: __S, ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Sub for &Vec3

§

fn sub(self, other: &Vec3) -> <&Vec3 as Sub>::Output

Find the difference between two positions.

§

type Output = Vec3

The resulting type after applying the - operator.
§

impl Sub for Vec3

§

type Output = Vec3

The resulting type after applying the - operator.
§

fn sub(self, other: Vec3) -> <Vec3 as Sub>::Output

Performs the - operation. Read more
§

impl Copy for Vec3

§

impl StructuralPartialEq for Vec3

Auto Trait Implementations§

§

impl Freeze for Vec3

§

impl RefUnwindSafe for Vec3

§

impl Send for Vec3

§

impl Sync for Vec3

§

impl Unpin for Vec3

§

impl UnwindSafe for Vec3

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> CompatExt for T

§

fn compat(self) -> Compat<T>

Applies the [Compat] adapter by value. Read more
§

fn compat_ref(&self) -> Compat<&T>

Applies the [Compat] adapter by shared reference. Read more
§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the [Compat] adapter by mutable reference. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromWorld for T
where T: Default,

§

fn from_world(_world: &mut World) -> T

Creates Self using default().

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> IntoResult<T> for T

§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
§

impl<A> Is for A
where A: Any,

§

fn is<T>() -> bool
where T: Any,

Checks if the current type “is” another type, using a TypeId equality comparison. This is most useful in the context of generic logic. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Serialize for T
where T: Serialize + ?Sized,

Source§

fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>

Source§

fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>

§

impl<T> ToCompactString for T
where T: Display,

§

fn try_to_compact_string(&self) -> Result<CompactString, ToCompactStringError>

Fallible version of [ToCompactString::to_compact_string()] Read more
§

fn to_compact_string(&self) -> CompactString

Converts the given value to a [CompactString]. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> TypeData for T
where T: 'static + Send + Sync + Clone,

§

fn clone_type_data(&self) -> Box<dyn TypeData>

Creates a type-erased clone of this value.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ConditionalSend for T
where T: Send,

Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,