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: f64Implementations§
Source§impl Vec3
impl Vec3
pub const fn new(x: f64, y: f64, z: f64) -> Self
Sourcepub fn length_squared(&self) -> f64
pub fn length_squared(&self) -> f64
Get the distance of this vector to the origin by doing x^2 + y^2 + z^2.
Sourcepub fn distance_squared_to(self, other: Self) -> f64
pub fn distance_squared_to(self, other: Self) -> 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: Self) -> f64
Sourcepub fn down(&self, y: f64) -> Self
pub fn down(&self, y: f64) -> Self
Return a new instance of this position with the y coordinate decreased by the given number.
Sourcepub fn up(&self, y: f64) -> Self
pub fn up(&self, y: f64) -> Self
Return a new instance of this position with the y coordinate increased by the given number.
Examples found in repository?
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 source.reply("ok");
32 source
33 .bot
34 .start_goto(BlockPosGoal(BlockPos::from(position)));
35 1
36 })
37 .then(literal("xz").then(argument("x", integer()).then(
38 argument("z", integer()).executes(|ctx: &Ctx| {
39 let source = ctx.source.lock();
40 let x = get_integer(ctx, "x").unwrap();
41 let z = get_integer(ctx, "z").unwrap();
42 println!("goto xz {x} {z}");
43 source.reply("ok");
44 source.bot.start_goto(XZGoal { x, z });
45 1
46 }),
47 )))
48 .then(literal("radius").then(argument("radius", float()).then(
49 argument("x", integer()).then(argument("y", integer()).then(
50 argument("z", integer()).executes(|ctx: &Ctx| {
51 let source = ctx.source.lock();
52 let radius = get_float(ctx, "radius").unwrap();
53 let x = get_integer(ctx, "x").unwrap();
54 let y = get_integer(ctx, "y").unwrap();
55 let z = get_integer(ctx, "z").unwrap();
56 println!("goto radius {radius}, position: {x} {y} {z}");
57 source.reply("ok");
58 source.bot.start_goto(RadiusGoal {
59 pos: BlockPos::new(x, y, z).center(),
60 radius,
61 });
62 1
63 }),
64 )),
65 )))
66 .then(argument("x", integer()).then(argument("y", integer()).then(
67 argument("z", integer()).executes(|ctx: &Ctx| {
68 let source = ctx.source.lock();
69 let x = get_integer(ctx, "x").unwrap();
70 let y = get_integer(ctx, "y").unwrap();
71 let z = get_integer(ctx, "z").unwrap();
72 println!("goto xyz {x} {y} {z}");
73 source.reply("ok");
74 source.bot.start_goto(BlockPosGoal(BlockPos::new(x, y, z)));
75 1
76 }),
77 ))),
78 );
79
80 commands.register(literal("down").executes(|ctx: &Ctx| {
81 let source = ctx.source.clone();
82 tokio::spawn(async move {
83 let bot = source.lock().bot.clone();
84 let position = BlockPos::from(bot.position());
85 source.lock().reply("mining...");
86 bot.mine(position.down(1)).await;
87 source.lock().reply("done");
88 });
89 1
90 }));
91
92 commands.register(
93 literal("look")
94 .executes(|ctx: &Ctx| {
95 // look for the sender
96 let mut source = ctx.source.lock();
97 let Some(entity) = source.entity() else {
98 source.reply("I can't see you!");
99 return 0;
100 };
101 let Some(position) = source.bot.get_entity_component::<Position>(entity) else {
102 source.reply("I can't see you!");
103 return 0;
104 };
105 let eye_height = source
106 .bot
107 .get_entity_component::<EntityDimensions>(entity)
108 .map(|h| h.eye_height)
109 .unwrap_or_default();
110 source.bot.look_at(position.up(eye_height as f64));
111 1
112 })
113 .then(argument("x", integer()).then(argument("y", integer()).then(
114 argument("z", integer()).executes(|ctx: &Ctx| {
115 let pos = BlockPos::new(
116 get_integer(ctx, "x").unwrap(),
117 get_integer(ctx, "y").unwrap(),
118 get_integer(ctx, "z").unwrap(),
119 );
120 println!("{pos:?}");
121 let source = ctx.source.lock();
122 source.bot.look_at(pos.center());
123 1
124 }),
125 ))),
126 );
127
128 commands.register(
129 literal("walk").then(argument("seconds", float()).executes(|ctx: &Ctx| {
130 let mut seconds = get_float(ctx, "seconds").unwrap();
131 let source = ctx.source.lock();
132 let bot = source.bot.clone();
133
134 if seconds < 0. {
135 bot.walk(WalkDirection::Backward);
136 seconds = -seconds;
137 } else {
138 bot.walk(WalkDirection::Forward);
139 }
140
141 tokio::spawn(async move {
142 tokio::time::sleep(Duration::from_secs_f32(seconds)).await;
143 bot.walk(WalkDirection::None);
144 });
145 source.reply(format!("ok, walking for {seconds} seconds"));
146 1
147 })),
148 );
149 commands.register(
150 literal("sprint").then(argument("seconds", float()).executes(|ctx: &Ctx| {
151 let seconds = get_float(ctx, "seconds").unwrap();
152 let source = ctx.source.lock();
153 let bot = source.bot.clone();
154 bot.sprint(SprintDirection::Forward);
155 tokio::spawn(async move {
156 tokio::time::sleep(Duration::from_secs_f32(seconds)).await;
157 bot.walk(WalkDirection::None);
158 });
159 source.reply(format!("ok, sprinting for {seconds} seconds"));
160 1
161 })),
162 );
163
164 commands.register(literal("north").executes(|ctx: &Ctx| {
165 let source = ctx.source.lock();
166 source.bot.set_direction(180., 0.);
167 source.reply("ok");
168 1
169 }));
170 commands.register(literal("south").executes(|ctx: &Ctx| {
171 let source = ctx.source.lock();
172 source.bot.set_direction(0., 0.);
173 source.reply("ok");
174 1
175 }));
176 commands.register(literal("east").executes(|ctx: &Ctx| {
177 let source = ctx.source.lock();
178 source.bot.set_direction(-90., 0.);
179 source.reply("ok");
180 1
181 }));
182 commands.register(literal("west").executes(|ctx: &Ctx| {
183 let source = ctx.source.lock();
184 source.bot.set_direction(90., 0.);
185 source.reply("ok");
186 1
187 }));
188 commands.register(
189 literal("jump")
190 .executes(|ctx: &Ctx| {
191 let source = ctx.source.lock();
192 source.bot.jump();
193 source.reply("ok");
194 1
195 })
196 .then(argument("enabled", bool()).executes(|ctx: &Ctx| {
197 let jumping = get_bool(ctx, "enabled").unwrap();
198 let source = ctx.source.lock();
199 source.bot.set_jumping(jumping);
200 1
201 })),
202 );
203
204 let sneak = |ctx: &Ctx| {
205 let source = ctx.source.lock();
206 source.bot.set_crouching(!source.bot.crouching());
207 source.reply("ok");
208 1
209 };
210 let sneak_enabled = argument("enabled", bool()).executes(|ctx: &Ctx| {
211 let sneaking = get_bool(ctx, "enabled").unwrap();
212 let source = ctx.source.lock();
213 source.bot.set_crouching(sneaking);
214 1
215 });
216 commands.register(literal("sneak").executes(sneak).then(sneak_enabled.clone()));
217 commands.register(literal("crouch").executes(sneak).then(sneak_enabled));
218
219 commands.register(literal("stop").executes(|ctx: &Ctx| {
220 let source = ctx.source.lock();
221 source.bot.stop_pathfinding();
222 source.reply("ok");
223 *source.state.task.lock() = BotTask::None;
224 1
225 }));
226}Sourcepub fn north(&self, z: f64) -> Self
pub fn north(&self, z: f64) -> Self
Return a new instance of this position with the z coordinate subtracted by the given number.
Sourcepub fn east(&self, x: f64) -> Self
pub fn east(&self, x: f64) -> Self
Return a new instance of this position with the x coordinate increased by the given number.
Sourcepub fn south(&self, z: f64) -> Self
pub fn south(&self, z: f64) -> Self
Return a new instance of this position with the z coordinate increased by the given number.
Sourcepub fn west(&self, x: f64) -> Self
pub fn west(&self, x: f64) -> Self
Return a new instance of this position with the x coordinate subtracted by the given number.
pub fn dot(&self, other: Self) -> f64
Sourcepub fn min(&self, other: Self) -> Self
pub fn min(&self, other: Self) -> Self
Make a new position with the lower coordinates for each axis.
Sourcepub fn max(&self, other: Self) -> Self
pub fn max(&self, other: Self) -> Self
Make a new position with the higher coordinates for each axis.
pub fn with_x(&self, x: f64) -> Self
pub fn with_y(&self, y: f64) -> Self
pub fn with_z(&self, z: f64) -> Self
Source§impl Vec3
impl Vec3
Sourcepub fn length(&self) -> f64
pub fn length(&self) -> f64
Get the distance of this vector to the origin by doing
sqrt(x^2 + y^2 + z^2).
Sourcepub fn distance_to(self, other: Self) -> f64
pub fn distance_to(self, other: Self) -> f64
Get the distance from this position to another position.
Equivalent to (self - other).length().
Examples found in repository?
10pub fn tick(bot: Client, state: State) -> anyhow::Result<()> {
11 if !state.killaura {
12 return Ok(());
13 }
14 if bot.has_attack_cooldown() {
15 return Ok(());
16 }
17 let mut nearest_entity = None;
18 let mut nearest_distance = f64::INFINITY;
19 let bot_position = bot.eye_position();
20 let bot_instance_name = bot.component::<InstanceName>();
21 {
22 let mut ecs = bot.ecs.lock();
23 let mut query = ecs
24 .query_filtered::<(Entity, &Position, &InstanceName), (
25 With<AbstractMonster>,
26 Without<LocalEntity>,
27 Without<Dead>,
28 )>();
29 for (entity_id, position, instance_name) in query.iter(&ecs) {
30 if instance_name != &bot_instance_name {
31 continue;
32 }
33
34 let distance = bot_position.distance_to(**position);
35 if distance < 4. && distance < nearest_distance {
36 nearest_entity = Some(entity_id);
37 nearest_distance = distance;
38 }
39 }
40 }
41 if let Some(nearest_entity) = nearest_entity {
42 println!("attacking {nearest_entity:?}");
43 println!("distance {nearest_distance:?}");
44 bot.attack(nearest_entity);
45 }
46
47 Ok(())
48}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
Sourcepub fn closer_than(&self, other: Vec3, range: f64) -> bool
pub fn closer_than(&self, other: Vec3, range: f64) -> bool
Whether the distance between this point and other is less than
range.
Trait Implementations§
Source§impl AddAssign for Vec3
impl AddAssign for Vec3
Source§fn add_assign(&mut self, rhs: Self)
fn add_assign(&mut self, rhs: Self)
+= operation. Read moreSource§impl<'de> Deserialize<'de> for Vec3
impl<'de> Deserialize<'de> for Vec3
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl DivAssign<f64> for Vec3
impl DivAssign<f64> for Vec3
Source§fn div_assign(&mut self, divisor: f64)
fn div_assign(&mut self, divisor: f64)
/= operation. Read moreSource§impl From<&Vec3> for ChunkBlockPos
impl From<&Vec3> for ChunkBlockPos
Source§impl From<&Vec3> for ChunkSectionPos
impl From<&Vec3> for ChunkSectionPos
Source§impl<T: PositionDeltaTrait> From<T> for Vec3
impl<T: PositionDeltaTrait> From<T> for Vec3
Source§impl From<Vec3> for ChunkBlockPos
impl From<Vec3> for ChunkBlockPos
Source§impl From<Vec3> for ChunkSectionPos
impl From<Vec3> for ChunkSectionPos
Source§impl FromNbtTag for Vec3
impl FromNbtTag for Vec3
fn from_nbt_tag(tag: NbtTag<'_, '_>) -> Option<Self>
fn from_optional_nbt_tag( tag: Option<NbtTag<'_, '_>>, ) -> Result<Option<Self>, DeserializeError>
Source§impl FromStr for Vec3
Parses a string in the format “X Y Z” into a Vec3.
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.
Source§impl MulAssign<f64> for Vec3
impl MulAssign<f64> for Vec3
Source§fn mul_assign(&mut self, multiplier: f64)
fn mul_assign(&mut self, multiplier: f64)
*= operation. Read moreimpl 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§
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§unsafe fn clone_to_uninit(&self, dest: *mut u8)
unsafe fn clone_to_uninit(&self, dest: *mut u8)
clone_to_uninit)§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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
impl<T> DowncastSend for T
§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self using default().
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
Source§impl<T> Serialize for T
impl<T> Serialize for T
fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>
fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>
§impl<T> ToCompactString for Twhere
T: Display,
impl<T> ToCompactString for Twhere
T: Display,
§fn try_to_compact_string(&self) -> Result<CompactString, ToCompactStringError>
fn try_to_compact_string(&self) -> Result<CompactString, ToCompactStringError>
ToCompactString::to_compact_string()] Read more§fn to_compact_string(&self) -> CompactString
fn to_compact_string(&self) -> CompactString
CompactString]. Read more