aboutsummaryrefslogtreecommitdiff
path: root/bot/src
diff options
context:
space:
mode:
Diffstat (limited to 'bot/src')
-rw-r--r--[-rwxr-xr-x]bot/src/main.rs132
1 files changed, 105 insertions, 27 deletions
diff --git a/bot/src/main.rs b/bot/src/main.rs
index 942868e2..e50da728 100755..100644
--- a/bot/src/main.rs
+++ b/bot/src/main.rs
@@ -1,16 +1,21 @@
use azalea::pathfinder::BlockPosGoal;
-use azalea::{prelude::*, BlockPos};
+// use azalea::ClientInformation;
+use azalea::{prelude::*, BlockPos, Swarm, SwarmEvent, WalkDirection};
use azalea::{Account, Client, Event};
+use azalea_protocol::packets::game::serverbound_client_command_packet::ServerboundClientCommandPacket;
+use std::time::Duration;
#[derive(Default, Clone)]
struct State {}
+#[derive(Default, Clone)]
+struct SwarmState {}
+
#[tokio::main]
async fn main() -> anyhow::Result<()> {
env_logger::init();
{
- // only for #[cfg]
use parking_lot::deadlock;
use std::thread;
use std::time::Duration;
@@ -32,52 +37,125 @@ async fn main() -> anyhow::Result<()> {
}
}
});
- } // only for #[cfg]
+ }
- // let account = Account::microsoft("example@example.com").await?;
- let account = Account::offline("bot");
+ let mut accounts = Vec::new();
+ let mut states = Vec::new();
+
+ for i in 0..7 {
+ accounts.push(Account::offline(&format!("bot{}", i)));
+ states.push(State::default());
+ }
loop {
- let e = azalea::start(azalea::Options {
- account: account.clone(),
+ let e = azalea::start_swarm(azalea::SwarmOptions {
+ accounts: accounts.clone(),
address: "localhost",
- state: State::default(),
+
+ states: states.clone(),
+ swarm_state: SwarmState::default(),
+
plugins: plugins![],
+ swarm_plugins: swarm_plugins![],
+
handle,
+ swarm_handle,
+
+ join_delay: Some(Duration::from_millis(1000)),
+ // join_delay: None,
})
.await;
println!("{e:?}");
}
}
-async fn handle(bot: Client, event: Event, _state: State) -> anyhow::Result<()> {
+async fn handle(mut bot: Client, event: Event, _state: State) -> anyhow::Result<()> {
match event {
+ Event::Init => {
+ // bot.set_client_information(ClientInformation {
+ // view_distance: 2,
+ // ..Default::default()
+ // })
+ // .await?;
+ }
Event::Login => {
- // bot.chat("Hello world").await?;
+ bot.chat("Hello world").await?;
}
Event::Chat(m) => {
- println!("{}", m.message().to_ansi(None));
- if m.message().to_string() == "<py5> goto" {
- let target_pos_vec3 = *(bot
- .world
- .read()
- .entity_by_uuid(&uuid::uuid!("6536bfed869548fd83a1ecd24cf2a0fd"))
- .unwrap()
- .pos());
- let target_pos: BlockPos = (&target_pos_vec3).into();
- // bot.look_at(&target_pos_vec3);
- bot.goto(BlockPosGoal::from(target_pos));
- // bot.walk(WalkDirection::Forward);
+ if m.content() == bot.profile.name {
+ bot.chat("Bye").await?;
+ tokio::time::sleep(Duration::from_millis(50)).await;
+ bot.disconnect().await?;
+ }
+ let entity = bot
+ .world
+ .read()
+ .entity_by_uuid(&uuid::uuid!("6536bfed-8695-48fd-83a1-ecd24cf2a0fd"));
+ if let Some(entity) = entity {
+ if m.content() == "goto" {
+ let target_pos_vec3 = entity.pos();
+ let target_pos: BlockPos = target_pos_vec3.into();
+ bot.goto(BlockPosGoal::from(target_pos));
+ } else if m.content() == "look" {
+ let target_pos_vec3 = entity.pos();
+ let target_pos: BlockPos = target_pos_vec3.into();
+ println!("target_pos: {:?}", target_pos);
+ bot.look_at(&target_pos.center());
+ } else if m.content() == "jump" {
+ bot.set_jumping(true);
+ } else if m.content() == "walk" {
+ bot.walk(WalkDirection::Forward);
+ } else if m.content() == "stop" {
+ bot.set_jumping(false);
+ bot.walk(WalkDirection::None);
+ } else if m.content() == "lag" {
+ std::thread::sleep(Duration::from_millis(1000));
+ }
}
}
- Event::Initialize => {
- println!("initialized");
- }
- Event::Tick => {
- // bot.jump();
+ Event::Death(_) => {
+ bot.write_packet(ServerboundClientCommandPacket {
+ action: azalea_protocol::packets::game::serverbound_client_command_packet::Action::PerformRespawn,
+ }.get()).await?;
}
_ => {}
}
Ok(())
}
+
+async fn swarm_handle(
+ mut swarm: Swarm<State>,
+ event: SwarmEvent,
+ _state: SwarmState,
+) -> anyhow::Result<()> {
+ match &event {
+ SwarmEvent::Disconnect(account) => {
+ println!("bot got kicked! {}", account.username);
+ tokio::time::sleep(Duration::from_secs(5)).await;
+ swarm.add(account, State::default()).await?;
+ }
+ SwarmEvent::Chat(m) => {
+ println!("swarm chat message: {}", m.message().to_ansi(None));
+ if m.message().to_string() == "<py5> world" {
+ for (name, world) in &swarm.worlds.read().worlds {
+ println!("world name: {}", name);
+ if let Some(w) = world.upgrade() {
+ for chunk_pos in w.chunk_storage.read().chunks.values() {
+ println!("chunk: {:?}", chunk_pos);
+ }
+ } else {
+ println!("nvm world is gone");
+ }
+ }
+ }
+ if m.message().to_string() == "<py5> hi" {
+ for (bot, _) in swarm {
+ bot.chat("hello").await?;
+ }
+ }
+ }
+ _ => {}
+ }
+ Ok(())
+}