Handle older/newer Clients

This commit is contained in:
Snowiiii 2024-08-13 13:05:04 +02:00
parent 32a172f3c0
commit c5612f6ddb
4 changed files with 30 additions and 13 deletions

View File

@ -13,7 +13,7 @@ use pumpkin_protocol::{
login::{SEncryptionResponse, SLoginAcknowledged, SLoginPluginResponse, SLoginStart},
status::{SPingRequest, SStatusRequest},
},
ConnectionState, KnownPack,
ConnectionState, KnownPack, CURRENT_MC_PROTOCOL,
};
use pumpkin_text::TextComponent;
use rsa::Pkcs1v15Encrypt;
@ -22,7 +22,7 @@ use sha1::{Digest, Sha1};
use crate::{
client::authentication::{self, GameProfile},
entity::player::{ChatMode, Hand},
server::Server,
server::{Server, CURRENT_MC_VERSION},
};
use super::{
@ -34,9 +34,17 @@ use super::{
/// Implements the `Client` Packets
impl Client {
pub fn handle_handshake(&mut self, _server: &mut Server, handshake: SHandShake) {
// TODO set protocol version and check protocol version
self.protocol_version = handshake.protocol_version.0;
self.connection_state = handshake.next_state;
dbg!("handshake");
if self.connection_state == ConnectionState::Login {
if self.protocol_version < CURRENT_MC_PROTOCOL as i32 {
self.kick(&format!("Client outdated, Server uses Minecraft {CURRENT_MC_VERSION}, Protocol {CURRENT_MC_PROTOCOL}"));
return;
} else if self.protocol_version > CURRENT_MC_PROTOCOL as i32 {
self.kick(&format!("Server outdated, Server uses Minecraft {CURRENT_MC_VERSION}, Protocol {CURRENT_MC_PROTOCOL}"));
return;
}
}
}
pub fn handle_status_request(&mut self, server: &mut Server, _status_request: SStatusRequest) {

View File

@ -62,6 +62,7 @@ pub struct Client {
pub config: Option<PlayerConfig>,
pub brand: Option<String>,
pub protocol_version: i32,
pub connection_state: ConnectionState,
pub encrytion: bool,
pub closed: bool,
@ -76,6 +77,7 @@ pub struct Client {
impl Client {
pub fn new(token: Rc<Token>, connection: TcpStream, address: SocketAddr) -> Self {
Self {
protocol_version: 0,
gameprofile: None,
config: None,
brand: None,

View File

@ -17,7 +17,10 @@ impl<'a> Command<'a> for GamemodeCommand {
let args: Vec<&str> = command.split_whitespace().collect();
if args.len() != 2 {
player.send_system_message(TextComponent::from("Usage: /gamemode <mode>").color_named(pumpkin_text::color::NamedColor::Red));
player.send_system_message(
TextComponent::from("Usage: /gamemode <mode>")
.color_named(pumpkin_text::color::NamedColor::Red),
);
return;
}
@ -33,16 +36,20 @@ impl<'a> Command<'a> for GamemodeCommand {
Ok(i) => match GameMode::from_u8(i) {
Some(mode) => {
player.set_gamemode(mode);
player.send_system_message(format!("Set own game mode to {:?}", mode).into());
player.send_system_message(
format!("Set own game mode to {:?}", mode).into(),
);
return;
},
None => {},
}
None => {}
},
Err(_) => {},
Err(_) => {}
}
player.send_system_message(TextComponent::from("Invalid gamemode").color_named(pumpkin_text::color::NamedColor::Red));
player.send_system_message(
TextComponent::from("Invalid gamemode")
.color_named(pumpkin_text::color::NamedColor::Red),
);
}
}
}

View File

@ -37,7 +37,7 @@ use crate::{
entity::player::{GameMode, Player},
};
pub const CURRENT_MC_VERSION: &str = "1.21";
pub const CURRENT_MC_VERSION: &str = "1.21.1";
pub struct Server {
pub compression_threshold: Option<u8>,