From 7405427199e5a994d4a6a706f84434a69cb7a7d9 Mon Sep 17 00:00:00 2001 From: mat <27899617+mat-1@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:20:40 -0500 Subject: Mining (#95) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * more mining stuff * initialize azalea-tags crate * more mining stuff 2 * mining in ecs * well technically mining works but no codegen for how long it takes to mine each block yet * rename downloads to __cache__ it was bothering me since it's not *just* downloads * codegen block behavior * fix not sending packet to finish breaking block * mining animation 🎉 * clippy * cleanup, move Client::mine into a client extension * add azalea/src/mining.rs --------- Co-authored-by: mat --- azalea/src/bot.rs | 5 +++-- azalea/src/lib.rs | 4 +++- azalea/src/mining.rs | 40 ++++++++++++++++++++++++++++++++++++++++ azalea/src/pathfinder/mod.rs | 12 +++++------- azalea/src/prelude.rs | 4 ++-- azalea/src/swarm/events.rs | 2 +- 6 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 azalea/src/mining.rs (limited to 'azalea/src') diff --git a/azalea/src/bot.rs b/azalea/src/bot.rs index 47c825ca..7940e7b0 100644 --- a/azalea/src/bot.rs +++ b/azalea/src/bot.rs @@ -9,9 +9,10 @@ use crate::ecs::{ system::{Commands, Query}, }; use azalea_core::Vec3; +use azalea_entity::{ + clamp_look_direction, metadata::Player, EyeHeight, Jumping, Local, LookDirection, Position, +}; use azalea_physics::{force_jump_listener, PhysicsSet}; -use azalea_world::entity::{clamp_look_direction, EyeHeight, LookDirection}; -use azalea_world::entity::{metadata::Player, Jumping, Local, Position}; use bevy_app::{FixedUpdate, Update}; use bevy_ecs::prelude::Event; use bevy_ecs::schedule::IntoSystemConfigs; diff --git a/azalea/src/lib.rs b/azalea/src/lib.rs index 1c6966c5..297199a0 100644 --- a/azalea/src/lib.rs +++ b/azalea/src/lib.rs @@ -6,6 +6,7 @@ mod auto_respawn; mod bot; mod container; +pub mod mining; pub mod pathfinder; pub mod prelude; pub mod swarm; @@ -17,9 +18,10 @@ pub use azalea_brigadier as brigadier; pub use azalea_chat::FormattedText; pub use azalea_client::*; pub use azalea_core::{BlockPos, Vec3}; +pub use azalea_entity as entity; pub use azalea_protocol as protocol; pub use azalea_registry::{Block, EntityKind, Item}; -pub use azalea_world::{entity, Instance}; +pub use azalea_world::Instance; pub use bot::DefaultBotPlugins; use ecs::component::Component; use futures::Future; diff --git a/azalea/src/mining.rs b/azalea/src/mining.rs new file mode 100644 index 00000000..8ba16436 --- /dev/null +++ b/azalea/src/mining.rs @@ -0,0 +1,40 @@ +use azalea_client::{ + interact::SwingArmEvent, + mining::{Mining, StartMiningBlockEvent}, + Client, TickBroadcast, +}; +use azalea_core::BlockPos; + +pub trait MiningExt { + /// Start mining a block. + async fn mine(&mut self, position: BlockPos); +} + +impl MiningExt for Client { + /// Start mining a block. This won't turn the bot's head towards the block, + /// so you'll have to do that yourself with [`look_at`]. + /// + /// [`look_at`]: crate::prelude::BotClientExt::look_at + async fn mine(&mut self, position: BlockPos) { + self.ecs.lock().send_event(StartMiningBlockEvent { + entity: self.entity, + position, + }); + // vanilla sends an extra swing arm packet when we start mining + self.ecs.lock().send_event(SwingArmEvent { + entity: self.entity, + }); + + let mut receiver = { + let ecs = self.ecs.lock(); + let tick_broadcast = ecs.resource::(); + tick_broadcast.subscribe() + }; + while receiver.recv().await.is_ok() { + let ecs = self.ecs.lock(); + if ecs.get::(self.entity).is_none() { + break; + } + } + } +} diff --git a/azalea/src/pathfinder/mod.rs b/azalea/src/pathfinder/mod.rs index 9547d263..f4e4d599 100644 --- a/azalea/src/pathfinder/mod.rs +++ b/azalea/src/pathfinder/mod.rs @@ -16,13 +16,11 @@ use crate::ecs::{ use astar::Edge; use azalea_client::{StartSprintEvent, StartWalkEvent}; use azalea_core::{BlockPos, CardinalDirection}; +use azalea_entity::metadata::Player; +use azalea_entity::Local; +use azalea_entity::{Physics, Position}; use azalea_physics::PhysicsSet; -use azalea_world::entity::metadata::Player; -use azalea_world::entity::Local; -use azalea_world::{ - entity::{Physics, Position, WorldName}, - InstanceContainer, -}; +use azalea_world::{InstanceContainer, InstanceName}; use bevy_app::{FixedUpdate, Update}; use bevy_ecs::prelude::Event; use bevy_ecs::schedule::IntoSystemConfigs; @@ -106,7 +104,7 @@ pub struct ComputePath(Task>); fn goto_listener( mut commands: Commands, mut events: EventReader, - mut query: Query<(&Position, &WorldName)>, + mut query: Query<(&Position, &InstanceName)>, instance_container: Res, ) { let thread_pool = AsyncComputeTaskPool::get(); diff --git a/azalea/src/prelude.rs b/azalea/src/prelude.rs index 87cb0b53..ff3c11de 100644 --- a/azalea/src/prelude.rs +++ b/azalea/src/prelude.rs @@ -2,8 +2,8 @@ //! re-exported here. pub use crate::{ - bot::BotClientExt, container::ContainerClientExt, pathfinder::PathfinderClientExt, - ClientBuilder, + bot::BotClientExt, container::ContainerClientExt, mining::MiningExt, + pathfinder::PathfinderClientExt, ClientBuilder, }; pub use azalea_client::{Account, Client, Event}; // this is necessary to make the macros that reference bevy_ecs work diff --git a/azalea/src/swarm/events.rs b/azalea/src/swarm/events.rs index b4752abf..3b290608 100644 --- a/azalea/src/swarm/events.rs +++ b/azalea/src/swarm/events.rs @@ -1,5 +1,5 @@ use azalea_client::LocalPlayer; -use azalea_world::entity::MinecraftEntityId; +use azalea_world::MinecraftEntityId; use bevy_app::{App, Plugin, Update}; use bevy_ecs::prelude::*; use derive_more::{Deref, DerefMut}; -- cgit v1.2.3