protocol: add SPluginMessage
This commit is contained in:
parent
a548c3ee40
commit
e9b475639a
@ -280,4 +280,8 @@ impl ByteBuffer {
|
||||
pub fn put_slice(&mut self, src: &[u8]) {
|
||||
self.buffer.put_slice(src)
|
||||
}
|
||||
|
||||
pub fn get_slice(&mut self) -> BytesMut {
|
||||
self.buffer.split()
|
||||
}
|
||||
}
|
||||
|
||||
@ -14,6 +14,8 @@ pub mod packet_encoder;
|
||||
|
||||
pub const MAX_PACKET_SIZE: i32 = 2097152;
|
||||
|
||||
/// usally uses a namespace like "minecraft:thing"
|
||||
pub type Identifier = String;
|
||||
pub type VarInt = i32;
|
||||
pub type VarLong = i64;
|
||||
|
||||
|
||||
@ -3,10 +3,7 @@ use std::io::Write;
|
||||
use aes::cipher::{generic_array::GenericArray, BlockEncryptMut, BlockSizeUser, KeyIvInit};
|
||||
use bytes::{BufMut, BytesMut};
|
||||
|
||||
use crate::{
|
||||
bytebuf::ByteBuffer, ClientPacket, PacketError, VarInt32,
|
||||
MAX_PACKET_SIZE,
|
||||
};
|
||||
use crate::{bytebuf::ByteBuffer, ClientPacket, PacketError, VarInt32, MAX_PACKET_SIZE};
|
||||
|
||||
type Cipher = cfb8::Encryptor<aes::Aes128>;
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
use crate::{bytebuf::ByteBuffer, ServerPacket, VarInt};
|
||||
use crate::{bytebuf::ByteBuffer, Identifier, ServerPacket, VarInt};
|
||||
|
||||
pub struct SClientInformation {
|
||||
pub locale: String, // 16
|
||||
@ -28,6 +28,22 @@ impl ServerPacket for SClientInformation {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct SPluginMessage {
|
||||
pub channel: Identifier,
|
||||
pub data: Vec<u8>,
|
||||
}
|
||||
|
||||
impl ServerPacket for SPluginMessage {
|
||||
const PACKET_ID: VarInt = 0x02;
|
||||
|
||||
fn read(bytebuf: &mut ByteBuffer) -> Self {
|
||||
Self {
|
||||
channel: bytebuf.get_string().unwrap(),
|
||||
data: bytebuf.get_slice().to_vec(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct SAcknowledgeFinishConfig {}
|
||||
|
||||
impl ServerPacket for SAcknowledgeFinishConfig {
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
use pumpkin_protocol::{
|
||||
client::{
|
||||
config::{CFinishConfig, CKnownPacks, CRegistryData, Entry},
|
||||
@ -5,7 +6,7 @@ use pumpkin_protocol::{
|
||||
status::{CPingResponse, CStatusResponse},
|
||||
},
|
||||
server::{
|
||||
config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks},
|
||||
config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks, SPluginMessage},
|
||||
handshake::SHandShake,
|
||||
login::{SEncryptionResponse, SLoginAcknowledged, SLoginPluginResponse, SLoginStart},
|
||||
status::{SPingRequest, SStatusRequest},
|
||||
@ -52,6 +53,7 @@ pub trait ClientPacketProcessor {
|
||||
server: &mut Server,
|
||||
client_information: SClientInformation,
|
||||
);
|
||||
fn handle_plugin_message(&mut self, server: &mut Server, plugin_message: SPluginMessage);
|
||||
fn handle_known_packs(&mut self, server: &mut Server, config_acknowledged: SKnownPacks);
|
||||
fn handle_config_acknowledged(
|
||||
&mut self,
|
||||
@ -161,6 +163,18 @@ impl ClientPacketProcessor for Client {
|
||||
});
|
||||
}
|
||||
|
||||
fn handle_plugin_message(&mut self, _server: &mut Server, plugin_message: SPluginMessage) {
|
||||
if plugin_message.channel.starts_with("minecraft:brand")
|
||||
|| plugin_message.channel.starts_with("MC|Brand")
|
||||
{
|
||||
dbg!("got a client brand");
|
||||
match String::from_utf8(plugin_message.data) {
|
||||
Ok(brand) => self.brand = Some(brand),
|
||||
Err(e) => self.kick(&e.to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_known_packs(&mut self, server: &mut Server, config_acknowledged: SKnownPacks) {
|
||||
self.send_packet(CRegistryData::new(
|
||||
"dimension_type",
|
||||
|
||||
@ -15,7 +15,7 @@ use pumpkin_protocol::{
|
||||
packet_decoder::PacketDecoder,
|
||||
packet_encoder::PacketEncoder,
|
||||
server::{
|
||||
config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks},
|
||||
config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks, SPluginMessage},
|
||||
handshake::SHandShake,
|
||||
login::{SEncryptionResponse, SLoginAcknowledged, SLoginPluginResponse, SLoginStart},
|
||||
status::{SPingRequest, SStatusRequest},
|
||||
@ -49,6 +49,7 @@ pub struct Client {
|
||||
pub name: Option<String>,
|
||||
pub uuid: Option<uuid::Uuid>,
|
||||
pub config: Option<PlayerConfig>,
|
||||
pub brand: Option<String>,
|
||||
|
||||
pub connection_state: ConnectionState,
|
||||
pub encrytion: bool,
|
||||
@ -66,6 +67,7 @@ impl Client {
|
||||
name: None,
|
||||
uuid: None,
|
||||
config: None,
|
||||
brand: None,
|
||||
token,
|
||||
player: None,
|
||||
connection_state: ConnectionState::HandShake,
|
||||
@ -169,6 +171,9 @@ impl Client {
|
||||
SClientInformation::PACKET_ID => {
|
||||
self.handle_client_information(server, SClientInformation::read(bytebuf))
|
||||
}
|
||||
SPluginMessage::PACKET_ID => {
|
||||
self.handle_plugin_message(server, SPluginMessage::read(bytebuf))
|
||||
}
|
||||
SAcknowledgeFinishConfig::PACKET_ID => {
|
||||
self.handle_config_acknowledged(server, SAcknowledgeFinishConfig::read(bytebuf))
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user