More fast

This commit is contained in:
suprohub 2025-02-25 16:00:10 +04:00
parent 634f9cb00c
commit dcdc2f544e
3 changed files with 30 additions and 25 deletions

View File

@ -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"

View File

@ -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 => {

View File

@ -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();
}
} }