diff options
Diffstat (limited to 'bot')
| -rw-r--r-- | bot/Cargo.toml | 2 | ||||
| -rw-r--r--[-rwxr-xr-x] | bot/src/main.rs | 132 |
2 files changed, 107 insertions, 27 deletions
diff --git a/bot/Cargo.toml b/bot/Cargo.toml index 6663d1f7..47b2a08f 100644 --- a/bot/Cargo.toml +++ b/bot/Cargo.toml @@ -10,7 +10,9 @@ version = "0.2.0" [dependencies] anyhow = "1.0.65" azalea = {path = "../azalea"} +azalea-protocol = {path = "../azalea-protocol"} env_logger = "0.9.1" parking_lot = {version = "^0.12.1", features = ["deadlock_detection"]} +rand = "0.8.5" tokio = "1.19.2" uuid = "1.1.2" 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(()) +} |
