More fast
This commit is contained in:
parent
634f9cb00c
commit
dcdc2f544e
@ -15,7 +15,7 @@ simple_logger = "5.0.0"
|
|||||||
clap = { version = "4.5.30", features = ["derive"] }
|
clap = { version = "4.5.30", features = ["derive"] }
|
||||||
# Networking
|
# Networking
|
||||||
tokio = { version = "1.43.0", features = ["net", "io-util"] }
|
tokio = { version = "1.43.0", features = ["net", "io-util"] }
|
||||||
pumpkin-protocol = { git = "https://github.com/Pumpkin-MC/Pumpkin", package = "pumpkin-protocol", default-features = false, features = ["packets"]}
|
pumpkin-protocol = { git = "https://github.com/Pumpkin-MC/Pumpkin", package = "pumpkin-protocol", default-features = false, features = ["packets"] }
|
||||||
|
|
||||||
crossbeam = "0.8.4"
|
crossbeam = "0.8.4"
|
||||||
uuid = "1.14.0"
|
uuid = "1.14.0"
|
||||||
@ -17,7 +17,6 @@ use pumpkin_protocol::{
|
|||||||
packet_decoder::PacketDecoder, packet_encoder::PacketEncoder,
|
packet_decoder::PacketDecoder, packet_encoder::PacketEncoder,
|
||||||
};
|
};
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::net::SocketAddr;
|
|
||||||
use std::sync::{Arc, atomic::AtomicBool};
|
use std::sync::{Arc, atomic::AtomicBool};
|
||||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
@ -170,11 +169,11 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn join_server(&self, address: SocketAddr, name: String) {
|
pub async fn join_server(&self, ip: String, port: u16, name: String) {
|
||||||
self.send_packet(&SHandShake {
|
self.send_packet(&SHandShake {
|
||||||
protocol_version: VarInt(CURRENT_MC_PROTOCOL.get() as i32),
|
protocol_version: VarInt(CURRENT_MC_PROTOCOL.get() as i32),
|
||||||
server_address: address.ip().to_string(),
|
server_address: ip,
|
||||||
server_port: address.port(),
|
server_port: port,
|
||||||
next_state: pumpkin_protocol::ConnectionState::Login,
|
next_state: pumpkin_protocol::ConnectionState::Login,
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
@ -214,7 +213,7 @@ impl Client {
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
CLoginDisconnect::PACKET_ID => {
|
CLoginDisconnect::PACKET_ID => {
|
||||||
log::error!("Kicking in Login State");
|
log::error!("Kicking in Login State with reason:\n{}", String::from_utf8_lossy(packet.bytebuf.iter().as_slice()));
|
||||||
self.close().await;
|
self.close().await;
|
||||||
}
|
}
|
||||||
CLoginSuccess::PACKET_ID => {
|
CLoginSuccess::PACKET_ID => {
|
||||||
|
|||||||
44
src/main.rs
44
src/main.rs
@ -1,4 +1,4 @@
|
|||||||
use std::net::SocketAddr;
|
use std::sync::{atomic::{AtomicUsize, Ordering}, Arc};
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use client::Client;
|
use client::Client;
|
||||||
@ -11,6 +11,8 @@ mod client;
|
|||||||
struct Args {
|
struct Args {
|
||||||
#[arg(short, long)]
|
#[arg(short, long)]
|
||||||
ip: String,
|
ip: String,
|
||||||
|
#[arg(short, long, default_value_t = 25565)]
|
||||||
|
port: u16,
|
||||||
#[arg(short, long, default_value_t = 1)]
|
#[arg(short, long, default_value_t = 1)]
|
||||||
count: u32,
|
count: u32,
|
||||||
}
|
}
|
||||||
@ -19,17 +21,26 @@ struct Args {
|
|||||||
async fn main() {
|
async fn main() {
|
||||||
simple_logger::init_with_level(log::Level::Info).unwrap();
|
simple_logger::init_with_level(log::Level::Info).unwrap();
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
let address = args.ip.parse::<SocketAddr>().unwrap();
|
let address = Arc::new(args.ip);
|
||||||
log::info!("{} Bots will Join {}", args.count, address);
|
let port = args.port;
|
||||||
let mut join_handles = Vec::with_capacity(args.count as usize);
|
|
||||||
|
log::info!("{} Bots will Join {}", args.count, address);
|
||||||
|
|
||||||
|
let counter = Arc::new(AtomicUsize::new(0));
|
||||||
|
for _ in 0..args.count {
|
||||||
|
let counter = counter.clone();
|
||||||
|
let address = address.clone();
|
||||||
|
|
||||||
|
tokio::spawn(async move {
|
||||||
|
let stream = TcpStream::connect(address.to_string() + ":" + &port.to_string())
|
||||||
|
.await
|
||||||
|
.expect("Failed to connect to Ip");
|
||||||
|
let client = Client::new(stream);
|
||||||
|
let i = counter.fetch_add(1, Ordering::Relaxed);
|
||||||
|
|
||||||
|
client.join_server(address.to_string(), port, format!("BOT_{i}")).await;
|
||||||
|
log::info!("{}/{} Bots Joined", i + 1, args.count);
|
||||||
|
|
||||||
for i in 0..args.count {
|
|
||||||
let stream = TcpStream::connect(address)
|
|
||||||
.await
|
|
||||||
.expect("Failed to connect to Ip");
|
|
||||||
let client = Client::new(stream);
|
|
||||||
client.join_server(address, format!("BOT_{}", i)).await;
|
|
||||||
let join_handle = tokio::spawn(async move {
|
|
||||||
loop {
|
loop {
|
||||||
if !client.poll().await {
|
if !client.poll().await {
|
||||||
break;
|
break;
|
||||||
@ -37,15 +48,10 @@ async fn main() {
|
|||||||
client.process_packets().await;
|
client.process_packets().await;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
join_handles.push(join_handle);
|
};
|
||||||
log::info!("{}/{} Bots Joined", i + 1, args.count);
|
|
||||||
}
|
|
||||||
// Graceful shutdown on Ctrl+C
|
// Graceful shutdown on Ctrl+C
|
||||||
tokio::signal::ctrl_c().await.unwrap();
|
tokio::signal::ctrl_c().await.unwrap();
|
||||||
log::info!("Shutting down...");
|
log::info!("Shutting down...");
|
||||||
|
|
||||||
// Wait for all bot tasks to exit
|
|
||||||
for handle in join_handles {
|
|
||||||
handle.abort();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user