FINALLY DESERIALIZER WORKS YIPEEEE
This commit is contained in:
parent
eb18873960
commit
11eb08a46c
329
pumpkin-protocol/src/bytebuf/deserializer.rs
Normal file
329
pumpkin-protocol/src/bytebuf/deserializer.rs
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
use std::{error, fmt::Display};
|
||||||
|
|
||||||
|
use serde::de::{self, DeserializeOwned, DeserializeSeed, SeqAccess};
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
use crate::VarInt;
|
||||||
|
|
||||||
|
use super::ByteBuffer;
|
||||||
|
|
||||||
|
pub struct Deserializer<'a> {
|
||||||
|
inner: &'a mut ByteBuffer,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Error)]
|
||||||
|
pub enum DeserializerError {
|
||||||
|
#[error("serializer error {0}")]
|
||||||
|
Message(String),
|
||||||
|
#[error("Stdio error")]
|
||||||
|
Stdio(std::io::Error),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl de::Error for DeserializerError {
|
||||||
|
fn custom<T: Display>(msg: T) -> Self {
|
||||||
|
Self::Message(msg.to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Deserializer<'a> {
|
||||||
|
pub fn new(buf: &'a mut ByteBuffer) -> Self {
|
||||||
|
Self { inner: buf }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, 'de> de::Deserializer<'de> for Deserializer<'a> {
|
||||||
|
type Error = DeserializerError;
|
||||||
|
|
||||||
|
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!(
|
||||||
|
"This is impossible to do, since you cannot infer the data structure from the packet"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_bool<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_bool(self.inner.get_bool())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_i8(self.inner.get_i8())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_i16(self.inner.get_i16())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_i32(self.inner.get_i32())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_i64(self.inner.get_i64())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_u8(self.inner.get_u8())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_u16(self.inner.get_u16())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_u32(self.inner.get_u32())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_u64(self.inner.get_u64())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_f32(self.inner.get_f32())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
visitor.visit_f64(self.inner.get_f64())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
let string = self
|
||||||
|
.inner
|
||||||
|
.get_string()
|
||||||
|
.map_err(|e| DeserializerError::Stdio(e))?;
|
||||||
|
visitor.visit_str(&string)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
let string = self
|
||||||
|
.inner
|
||||||
|
.get_string()
|
||||||
|
.map_err(|e| DeserializerError::Stdio(e))?;
|
||||||
|
visitor.visit_str(&string)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_unit_struct<V>(
|
||||||
|
self,
|
||||||
|
name: &'static str,
|
||||||
|
visitor: V,
|
||||||
|
) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_newtype_struct<V>(
|
||||||
|
self,
|
||||||
|
name: &'static str,
|
||||||
|
visitor: V,
|
||||||
|
) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
struct Access<'a, 'b> {
|
||||||
|
deserializer: &'a mut Deserializer<'b>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de, 'a, 'b: 'a> SeqAccess<'de> for Access<'a, 'b> {
|
||||||
|
type Error = DeserializerError;
|
||||||
|
|
||||||
|
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
|
||||||
|
where
|
||||||
|
T: de::DeserializeSeed<'de>,
|
||||||
|
{
|
||||||
|
let value = DeserializeSeed::deserialize(
|
||||||
|
seed,
|
||||||
|
Deserializer {
|
||||||
|
inner: &mut self.deserializer.inner,
|
||||||
|
},
|
||||||
|
)?;
|
||||||
|
Ok(Some(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let value = visitor.visit_seq(Access {
|
||||||
|
deserializer: &mut self,
|
||||||
|
});
|
||||||
|
|
||||||
|
value
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_tuple<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
struct Access<'a, 'b> {
|
||||||
|
deserializer: &'a mut Deserializer<'b>,
|
||||||
|
len: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de, 'a, 'b: 'a> SeqAccess<'de> for Access<'a, 'b> {
|
||||||
|
type Error = DeserializerError;
|
||||||
|
|
||||||
|
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
|
||||||
|
where
|
||||||
|
T: de::DeserializeSeed<'de>,
|
||||||
|
{
|
||||||
|
if self.len > 0 {
|
||||||
|
self.len -= 1;
|
||||||
|
let value = DeserializeSeed::deserialize(
|
||||||
|
seed,
|
||||||
|
Deserializer {
|
||||||
|
inner: &mut self.deserializer.inner,
|
||||||
|
},
|
||||||
|
)?;
|
||||||
|
Ok(Some(value))
|
||||||
|
} else {
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let value = visitor.visit_seq(Access {
|
||||||
|
deserializer: &mut self,
|
||||||
|
len,
|
||||||
|
});
|
||||||
|
|
||||||
|
value
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_tuple_struct<V>(
|
||||||
|
self,
|
||||||
|
name: &'static str,
|
||||||
|
len: usize,
|
||||||
|
visitor: V,
|
||||||
|
) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_struct<V>(
|
||||||
|
self,
|
||||||
|
name: &'static str,
|
||||||
|
fields: &'static [&'static str],
|
||||||
|
visitor: V,
|
||||||
|
) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
self.deserialize_tuple(fields.len(), visitor)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_enum<V>(
|
||||||
|
self,
|
||||||
|
name: &'static str,
|
||||||
|
variants: &'static [&'static str],
|
||||||
|
visitor: V,
|
||||||
|
) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
where
|
||||||
|
V: de::Visitor<'de>,
|
||||||
|
{
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,6 +3,8 @@ use bytes::{Buf, BufMut, BytesMut};
|
|||||||
use core::str;
|
use core::str;
|
||||||
use std::io::{self, Error, ErrorKind};
|
use std::io::{self, Error, ErrorKind};
|
||||||
|
|
||||||
|
mod deserializer;
|
||||||
|
pub use deserializer::DeserializerError;
|
||||||
pub mod packet_id;
|
pub mod packet_id;
|
||||||
mod serializer;
|
mod serializer;
|
||||||
|
|
||||||
@ -301,3 +303,44 @@ impl ByteBuffer {
|
|||||||
self.buffer.split()
|
self.buffer.split()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::{bytebuf::{deserializer, serializer, ByteBuffer}, VarInt};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_i32_reserialize() {
|
||||||
|
#[derive(serde::Serialize, serde::Deserialize, PartialEq, Eq, Debug)]
|
||||||
|
struct Foo {
|
||||||
|
bar: i32,
|
||||||
|
}
|
||||||
|
let foo = Foo { bar: 69 };
|
||||||
|
let mut serializer = serializer::Serializer::new(ByteBuffer::empty());
|
||||||
|
foo.serialize(&mut serializer).unwrap();
|
||||||
|
|
||||||
|
let mut serialized: ByteBuffer = serializer.into();
|
||||||
|
let deserialized: Foo =
|
||||||
|
Foo::deserialize(deserializer::Deserializer::new(&mut serialized)).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(foo, deserialized);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_varint_reserialize() {
|
||||||
|
#[derive(serde::Serialize, serde::Deserialize, PartialEq, Eq, Debug)]
|
||||||
|
struct Foo {
|
||||||
|
bar: VarInt,
|
||||||
|
}
|
||||||
|
let foo = Foo { bar: 69.into() };
|
||||||
|
let mut serializer = serializer::Serializer::new(ByteBuffer::empty());
|
||||||
|
foo.serialize(&mut serializer).unwrap();
|
||||||
|
|
||||||
|
let mut serialized: ByteBuffer = serializer.into();
|
||||||
|
let deserialized: Foo =
|
||||||
|
Foo::deserialize(deserializer::Deserializer::new(&mut serialized)).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(foo, deserialized);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
use serde::{Serialize, Serializer};
|
use serde::{
|
||||||
|
de::{self, DeserializeOwned, SeqAccess, Visitor},
|
||||||
|
Deserialize, Deserializer, Serialize, Serializer,
|
||||||
|
};
|
||||||
|
|
||||||
use crate::{ClientPacket, VarInt, VarIntType};
|
use crate::{ClientPacket, ServerPacket, VarInt, VarIntType};
|
||||||
|
|
||||||
use super::{serializer, ByteBuffer};
|
use super::{deserializer, serializer, ByteBuffer, DeserializerError};
|
||||||
|
|
||||||
impl Serialize for VarInt {
|
impl Serialize for VarInt {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
@ -26,6 +29,43 @@ impl Serialize for VarInt {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for VarInt {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
struct VarIntVisitor;
|
||||||
|
|
||||||
|
impl<'de> Visitor<'de> for VarIntVisitor {
|
||||||
|
type Value = VarInt;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
|
formatter.write_str("a valid VarInt encoded in a byte sequence")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
||||||
|
where
|
||||||
|
A: SeqAccess<'de>,
|
||||||
|
{
|
||||||
|
let mut val = 0;
|
||||||
|
for i in 0..VarInt::MAX_SIZE {
|
||||||
|
if let Some(byte) = seq.next_element::<u8>()? {
|
||||||
|
val |= (i32::from(byte) & 0b01111111) << (i * 7);
|
||||||
|
if byte & 0b10000000 == 0 {
|
||||||
|
return Ok(VarInt(val));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(de::Error::custom("VarInt was too large"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_seq(VarIntVisitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait Packet {
|
pub trait Packet {
|
||||||
const PACKET_ID: VarIntType;
|
const PACKET_ID: VarIntType;
|
||||||
}
|
}
|
||||||
@ -43,3 +83,13 @@ where
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<P> ServerPacket for P
|
||||||
|
where
|
||||||
|
P: Packet + DeserializeOwned,
|
||||||
|
{
|
||||||
|
fn read(bytebuf: &mut ByteBuffer) -> Result<P, DeserializerError> {
|
||||||
|
let deserializer = deserializer::Deserializer::new(bytebuf);
|
||||||
|
P::deserialize(deserializer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
|
|
||||||
use bytebuf::{packet_id::Packet, ByteBuffer};
|
use bytebuf::{packet_id::Packet, ByteBuffer, DeserializerError};
|
||||||
use bytes::Buf;
|
use bytes::Buf;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
@ -24,7 +24,7 @@ pub type VarLongType = i64;
|
|||||||
|
|
||||||
pub struct BitSet(pub VarInt, pub Vec<i64>);
|
pub struct BitSet(pub VarInt, pub Vec<i64>);
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct VarInt(pub VarIntType);
|
pub struct VarInt(pub VarIntType);
|
||||||
|
|
||||||
impl VarInt {
|
impl VarInt {
|
||||||
@ -181,10 +181,8 @@ pub trait ClientPacket: Packet {
|
|||||||
fn write(&self, bytebuf: &mut ByteBuffer);
|
fn write(&self, bytebuf: &mut ByteBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ServerPacket {
|
pub trait ServerPacket: Packet + Sized {
|
||||||
const PACKET_ID: VarInt;
|
fn read(bytebuf: &mut ByteBuffer) -> Result<Self, DeserializerError>;
|
||||||
|
|
||||||
fn read(bytebuf: &mut ByteBuffer) -> Self;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
|
|||||||
@ -1,70 +1,9 @@
|
|||||||
use crate::{bytebuf::ByteBuffer, Identifier, ServerPacket, VarInt};
|
mod s_acknowledge_finish_config;
|
||||||
|
mod s_client_information;
|
||||||
|
mod s_known_packs;
|
||||||
|
mod s_plugin_message;
|
||||||
|
|
||||||
pub struct SClientInformation {
|
pub use s_acknowledge_finish_config::*;
|
||||||
pub locale: String, // 16
|
pub use s_client_information::*;
|
||||||
pub view_distance: i8,
|
pub use s_known_packs::*;
|
||||||
pub chat_mode: VarInt, // Varint
|
pub use s_plugin_message::*;
|
||||||
pub chat_colors: bool,
|
|
||||||
pub skin_parts: u8,
|
|
||||||
pub main_hand: VarInt,
|
|
||||||
pub text_filtering: bool,
|
|
||||||
pub server_listing: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SClientInformation {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x00);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
locale: bytebuf.get_string_len(16).unwrap(),
|
|
||||||
view_distance: bytebuf.get_i8(),
|
|
||||||
chat_mode: bytebuf.get_var_int(),
|
|
||||||
chat_colors: bytebuf.get_bool(),
|
|
||||||
skin_parts: bytebuf.get_u8(),
|
|
||||||
main_hand: bytebuf.get_var_int(),
|
|
||||||
text_filtering: bytebuf.get_bool(),
|
|
||||||
server_listing: bytebuf.get_bool(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SPluginMessage {
|
|
||||||
pub channel: Identifier,
|
|
||||||
pub data: Vec<u8>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SPluginMessage {
|
|
||||||
const PACKET_ID: VarInt = 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 {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x03);
|
|
||||||
|
|
||||||
fn read(_bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
Self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SKnownPacks {
|
|
||||||
pub known_pack_count: VarInt,
|
|
||||||
// known_packs: &'a [KnownPack]
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SKnownPacks {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x07);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
known_pack_count: bytebuf.get_var_int(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -0,0 +1,5 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x03)]
|
||||||
|
pub struct SAcknowledgeFinishConfig {}
|
||||||
16
pumpkin-protocol/src/server/config/s_client_information.rs
Normal file
16
pumpkin-protocol/src/server/config/s_client_information.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{bytebuf::ByteBuffer, Identifier, ServerPacket, VarInt};
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x00)]
|
||||||
|
pub struct SClientInformation {
|
||||||
|
pub locale: String, // 16
|
||||||
|
pub view_distance: i8,
|
||||||
|
pub chat_mode: VarInt, // Varint
|
||||||
|
pub chat_colors: bool,
|
||||||
|
pub skin_parts: u8,
|
||||||
|
pub main_hand: VarInt,
|
||||||
|
pub text_filtering: bool,
|
||||||
|
pub server_listing: bool,
|
||||||
|
}
|
||||||
10
pumpkin-protocol/src/server/config/s_known_packs.rs
Normal file
10
pumpkin-protocol/src/server/config/s_known_packs.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{bytebuf::ByteBuffer, Identifier, ServerPacket, VarInt};
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x07)]
|
||||||
|
pub struct SKnownPacks {
|
||||||
|
pub known_pack_count: VarInt,
|
||||||
|
// known_packs: &'a [KnownPack]
|
||||||
|
}
|
||||||
21
pumpkin-protocol/src/server/config/s_plugin_message.rs
Normal file
21
pumpkin-protocol/src/server/config/s_plugin_message.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
bytebuf::{ByteBuffer, DeserializerError},
|
||||||
|
Identifier, ServerPacket, VarInt,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[packet(0x02)]
|
||||||
|
pub struct SPluginMessage {
|
||||||
|
pub channel: Identifier,
|
||||||
|
pub data: Vec<u8>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ServerPacket for SPluginMessage {
|
||||||
|
fn read(bytebuf: &mut ByteBuffer) -> Result<Self, DeserializerError> {
|
||||||
|
Ok(Self {
|
||||||
|
channel: bytebuf.get_string().unwrap(),
|
||||||
|
data: bytebuf.get_slice().to_vec(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,11 @@
|
|||||||
use crate::{bytebuf::ByteBuffer, ConnectionState, ServerPacket, VarInt};
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
bytebuf::{ByteBuffer, DeserializerError},
|
||||||
|
ConnectionState, ServerPacket, VarInt,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[packet(0x00)]
|
||||||
pub struct SHandShake {
|
pub struct SHandShake {
|
||||||
pub protocol_version: VarInt,
|
pub protocol_version: VarInt,
|
||||||
pub server_address: String, // 255
|
pub server_address: String, // 255
|
||||||
@ -8,14 +14,12 @@ pub struct SHandShake {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ServerPacket for SHandShake {
|
impl ServerPacket for SHandShake {
|
||||||
const PACKET_ID: VarInt = VarInt(0x00);
|
fn read(bytebuf: &mut ByteBuffer) -> Result<Self, DeserializerError> {
|
||||||
|
Ok(Self {
|
||||||
fn read(bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol_version: bytebuf.get_var_int(),
|
protocol_version: bytebuf.get_var_int(),
|
||||||
server_address: bytebuf.get_string_len(255).unwrap(),
|
server_address: bytebuf.get_string_len(255).unwrap(),
|
||||||
server_port: bytebuf.get_u16(),
|
server_port: bytebuf.get_u16(),
|
||||||
next_state: bytebuf.get_var_int().into(),
|
next_state: bytebuf.get_var_int().into(),
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,72 +1,9 @@
|
|||||||
use crate::{bytebuf::ByteBuffer, ServerPacket, VarInt};
|
mod s_encryption_response;
|
||||||
|
mod s_login_response;
|
||||||
|
mod s_login_start;
|
||||||
|
mod s_plugin_response;
|
||||||
|
|
||||||
pub struct SLoginStart {
|
pub use s_encryption_response::*;
|
||||||
pub name: String, // 16
|
pub use s_login_response::*;
|
||||||
pub uuid: uuid::Uuid,
|
pub use s_login_start::*;
|
||||||
}
|
pub use s_plugin_response::*;
|
||||||
|
|
||||||
impl ServerPacket for SLoginStart {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x00);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
name: bytebuf.get_string_len(16).unwrap(),
|
|
||||||
uuid: bytebuf.get_uuid(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SEncryptionResponse {
|
|
||||||
pub shared_secret_length: VarInt,
|
|
||||||
pub shared_secret: Vec<u8>,
|
|
||||||
pub verify_token_length: VarInt,
|
|
||||||
pub verify_token: Vec<u8>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SEncryptionResponse {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x01);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
let shared_secret_length = bytebuf.get_var_int();
|
|
||||||
let shared_secret = bytebuf.copy_to_bytes(shared_secret_length.0 as usize);
|
|
||||||
let verify_token_length = bytebuf.get_var_int();
|
|
||||||
let verify_token = bytebuf.copy_to_bytes(shared_secret_length.0 as usize);
|
|
||||||
Self {
|
|
||||||
shared_secret_length,
|
|
||||||
shared_secret: shared_secret.to_vec(),
|
|
||||||
verify_token_length,
|
|
||||||
verify_token: verify_token.to_vec(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SLoginPluginResponse<'a> {
|
|
||||||
pub message_id: VarInt,
|
|
||||||
pub successful: bool,
|
|
||||||
pub data: Option<&'a [u8]>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> ServerPacket for SLoginPluginResponse<'a> {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x02);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
message_id: bytebuf.get_var_int(),
|
|
||||||
successful: bytebuf.get_bool(),
|
|
||||||
data: None, // TODO
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Acknowledgement to the Login Success packet sent to the server.
|
|
||||||
pub struct SLoginAcknowledged {
|
|
||||||
// empty
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SLoginAcknowledged {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x03);
|
|
||||||
|
|
||||||
fn read(_bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
Self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
29
pumpkin-protocol/src/server/login/s_encryption_response.rs
Normal file
29
pumpkin-protocol/src/server/login/s_encryption_response.rs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
bytebuf::{ByteBuffer, DeserializerError},
|
||||||
|
ServerPacket, VarInt,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[packet(0x01)]
|
||||||
|
pub struct SEncryptionResponse {
|
||||||
|
pub shared_secret_length: VarInt,
|
||||||
|
pub shared_secret: Vec<u8>,
|
||||||
|
pub verify_token_length: VarInt,
|
||||||
|
pub verify_token: Vec<u8>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ServerPacket for SEncryptionResponse {
|
||||||
|
fn read(bytebuf: &mut ByteBuffer) -> Result<Self, DeserializerError> {
|
||||||
|
let shared_secret_length = bytebuf.get_var_int();
|
||||||
|
let shared_secret = bytebuf.copy_to_bytes(shared_secret_length.0 as usize);
|
||||||
|
let verify_token_length = bytebuf.get_var_int();
|
||||||
|
let verify_token = bytebuf.copy_to_bytes(shared_secret_length.0 as usize);
|
||||||
|
Ok(Self {
|
||||||
|
shared_secret_length,
|
||||||
|
shared_secret: shared_secret.to_vec(),
|
||||||
|
verify_token_length,
|
||||||
|
verify_token: verify_token.to_vec(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
8
pumpkin-protocol/src/server/login/s_login_response.rs
Normal file
8
pumpkin-protocol/src/server/login/s_login_response.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{bytebuf::ByteBuffer, ServerPacket, VarInt};
|
||||||
|
|
||||||
|
// Acknowledgement to the Login Success packet sent to the server.
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x03)]
|
||||||
|
pub struct SLoginAcknowledged {}
|
||||||
21
pumpkin-protocol/src/server/login/s_login_start.rs
Normal file
21
pumpkin-protocol/src/server/login/s_login_start.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
bytebuf::{ByteBuffer, DeserializerError},
|
||||||
|
ServerPacket, VarInt,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[packet(0x00)]
|
||||||
|
pub struct SLoginStart {
|
||||||
|
pub name: String, // 16
|
||||||
|
pub uuid: uuid::Uuid,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ServerPacket for SLoginStart {
|
||||||
|
fn read(bytebuf: &mut ByteBuffer) -> Result<Self, DeserializerError> {
|
||||||
|
Ok(Self {
|
||||||
|
name: bytebuf.get_string_len(16).unwrap(),
|
||||||
|
uuid: bytebuf.get_uuid(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
23
pumpkin-protocol/src/server/login/s_plugin_response.rs
Normal file
23
pumpkin-protocol/src/server/login/s_plugin_response.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
bytebuf::{ByteBuffer, DeserializerError},
|
||||||
|
ServerPacket, VarInt,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[packet(0x02)]
|
||||||
|
pub struct SLoginPluginResponse<'a> {
|
||||||
|
pub message_id: VarInt,
|
||||||
|
pub successful: bool,
|
||||||
|
pub data: Option<&'a [u8]>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> ServerPacket for SLoginPluginResponse<'a> {
|
||||||
|
fn read(bytebuf: &mut ByteBuffer) -> Result<Self, DeserializerError> {
|
||||||
|
Ok(Self {
|
||||||
|
message_id: bytebuf.get_var_int(),
|
||||||
|
successful: bytebuf.get_bool(),
|
||||||
|
data: None, // TODO
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,123 +1,13 @@
|
|||||||
use num_derive::FromPrimitive;
|
mod s_confirm_teleport;
|
||||||
use num_traits::FromPrimitive;
|
mod s_chat_command;
|
||||||
|
mod s_player_command;
|
||||||
|
mod s_player_position;
|
||||||
|
mod s_player_position_rotation;
|
||||||
|
mod s_player_rotation;
|
||||||
|
|
||||||
use crate::{ServerPacket, VarInt};
|
pub use s_confirm_teleport::*;
|
||||||
|
pub use s_chat_command::*;
|
||||||
pub struct SConfirmTeleport {
|
pub use s_player_command::*;
|
||||||
pub teleport_id: VarInt,
|
pub use s_player_position::*;
|
||||||
}
|
pub use s_player_position_rotation::*;
|
||||||
|
pub use s_player_rotation::*;
|
||||||
impl ServerPacket for SConfirmTeleport {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x00);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut crate::bytebuf::ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
teleport_id: bytebuf.get_var_int(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SChatCommand {
|
|
||||||
pub command: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SChatCommand {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x04);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut crate::bytebuf::ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
command: bytebuf.get_string().unwrap(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SPlayerPosition {
|
|
||||||
pub x: f64,
|
|
||||||
pub feet_y: f64,
|
|
||||||
pub z: f64,
|
|
||||||
pub ground: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SPlayerPosition {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x1A);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut crate::bytebuf::ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
x: bytebuf.get_f64(),
|
|
||||||
feet_y: bytebuf.get_f64(),
|
|
||||||
z: bytebuf.get_f64(),
|
|
||||||
ground: bytebuf.get_bool(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SPlayerCommand {
|
|
||||||
pub entitiy_id: VarInt,
|
|
||||||
pub action: Action,
|
|
||||||
pub jump_boost: VarInt,
|
|
||||||
}
|
|
||||||
#[derive(FromPrimitive)]
|
|
||||||
pub enum Action {
|
|
||||||
StartSneaking = 0,
|
|
||||||
StopSneaking,
|
|
||||||
LeaveBed,
|
|
||||||
StartSprinting,
|
|
||||||
StopSprinting,
|
|
||||||
StartHourseJump,
|
|
||||||
OpenVehicleInventory,
|
|
||||||
StartFlyingElytra,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SPlayerCommand {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x25);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut crate::bytebuf::ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
entitiy_id: bytebuf.get_var_int(),
|
|
||||||
action: Action::from_i32(bytebuf.get_var_int().into()).unwrap(),
|
|
||||||
jump_boost: bytebuf.get_var_int(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SPlayerPositionRotation {
|
|
||||||
pub x: f64,
|
|
||||||
pub feet_y: f64,
|
|
||||||
pub z: f64,
|
|
||||||
pub yaw: f32,
|
|
||||||
pub pitch: f32,
|
|
||||||
pub ground: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SPlayerPositionRotation {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x1B);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut crate::bytebuf::ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
x: bytebuf.get_f64(),
|
|
||||||
feet_y: bytebuf.get_f64(),
|
|
||||||
z: bytebuf.get_f64(),
|
|
||||||
yaw: bytebuf.get_f32(),
|
|
||||||
pitch: bytebuf.get_f32(),
|
|
||||||
ground: bytebuf.get_bool(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SPlayerRotation {
|
|
||||||
pub yaw: f32,
|
|
||||||
pub pitch: f32,
|
|
||||||
pub ground: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SPlayerRotation {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x1C);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut crate::bytebuf::ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
yaw: bytebuf.get_f32(),
|
|
||||||
pitch: bytebuf.get_f32(),
|
|
||||||
ground: bytebuf.get_bool(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
11
pumpkin-protocol/src/server/play/s_chat_command.rs
Normal file
11
pumpkin-protocol/src/server/play/s_chat_command.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
use num_derive::FromPrimitive;
|
||||||
|
use num_traits::FromPrimitive;
|
||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{ServerPacket, VarInt};
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x04)]
|
||||||
|
pub struct SChatCommand {
|
||||||
|
pub command: String,
|
||||||
|
}
|
||||||
11
pumpkin-protocol/src/server/play/s_confirm_teleport.rs
Normal file
11
pumpkin-protocol/src/server/play/s_confirm_teleport.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
use num_derive::FromPrimitive;
|
||||||
|
use num_traits::FromPrimitive;
|
||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{ServerPacket, VarInt};
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x00)]
|
||||||
|
pub struct SConfirmTeleport {
|
||||||
|
pub teleport_id: VarInt,
|
||||||
|
}
|
||||||
33
pumpkin-protocol/src/server/play/s_player_command.rs
Normal file
33
pumpkin-protocol/src/server/play/s_player_command.rs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
use num_derive::FromPrimitive;
|
||||||
|
use num_traits::FromPrimitive;
|
||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{bytebuf::DeserializerError, ServerPacket, VarInt};
|
||||||
|
|
||||||
|
#[packet(0x25)]
|
||||||
|
pub struct SPlayerCommand {
|
||||||
|
pub entitiy_id: VarInt,
|
||||||
|
pub action: Action,
|
||||||
|
pub jump_boost: VarInt,
|
||||||
|
}
|
||||||
|
#[derive(FromPrimitive)]
|
||||||
|
pub enum Action {
|
||||||
|
StartSneaking = 0,
|
||||||
|
StopSneaking,
|
||||||
|
LeaveBed,
|
||||||
|
StartSprinting,
|
||||||
|
StopSprinting,
|
||||||
|
StartHourseJump,
|
||||||
|
OpenVehicleInventory,
|
||||||
|
StartFlyingElytra,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ServerPacket for SPlayerCommand {
|
||||||
|
fn read(bytebuf: &mut crate::bytebuf::ByteBuffer) -> Result<Self, DeserializerError> {
|
||||||
|
Ok(Self {
|
||||||
|
entitiy_id: bytebuf.get_var_int(),
|
||||||
|
action: Action::from_i32(bytebuf.get_var_int().into()).unwrap(),
|
||||||
|
jump_boost: bytebuf.get_var_int(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
14
pumpkin-protocol/src/server/play/s_player_position.rs
Normal file
14
pumpkin-protocol/src/server/play/s_player_position.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
use num_derive::FromPrimitive;
|
||||||
|
use num_traits::FromPrimitive;
|
||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{ServerPacket, VarInt};
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x1A)]
|
||||||
|
pub struct SPlayerPosition {
|
||||||
|
pub x: f64,
|
||||||
|
pub feet_y: f64,
|
||||||
|
pub z: f64,
|
||||||
|
pub ground: bool,
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
use num_derive::FromPrimitive;
|
||||||
|
use num_traits::FromPrimitive;
|
||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{ServerPacket, VarInt};
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x1B)]
|
||||||
|
pub struct SPlayerPositionRotation {
|
||||||
|
pub x: f64,
|
||||||
|
pub feet_y: f64,
|
||||||
|
pub z: f64,
|
||||||
|
pub yaw: f32,
|
||||||
|
pub pitch: f32,
|
||||||
|
pub ground: bool,
|
||||||
|
}
|
||||||
13
pumpkin-protocol/src/server/play/s_player_rotation.rs
Normal file
13
pumpkin-protocol/src/server/play/s_player_rotation.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
use num_derive::FromPrimitive;
|
||||||
|
use num_traits::FromPrimitive;
|
||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
use crate::{ServerPacket, VarInt};
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x1C)]
|
||||||
|
pub struct SPlayerRotation {
|
||||||
|
pub yaw: f32,
|
||||||
|
pub pitch: f32,
|
||||||
|
pub ground: bool,
|
||||||
|
}
|
||||||
@ -1,27 +1,7 @@
|
|||||||
use crate::{bytebuf::ByteBuffer, ServerPacket, VarInt};
|
use crate::{bytebuf::ByteBuffer, ServerPacket, VarInt};
|
||||||
|
|
||||||
pub struct SStatusRequest {
|
mod s_ping_request;
|
||||||
// empty
|
mod s_status_request;
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SStatusRequest {
|
pub use s_ping_request::*;
|
||||||
const PACKET_ID: VarInt = VarInt(0x00);
|
pub use s_status_request::*;
|
||||||
|
|
||||||
fn read(_bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
Self {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SPingRequest {
|
|
||||||
pub payload: i64,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ServerPacket for SPingRequest {
|
|
||||||
const PACKET_ID: VarInt = VarInt(0x01);
|
|
||||||
|
|
||||||
fn read(bytebuf: &mut ByteBuffer) -> Self {
|
|
||||||
Self {
|
|
||||||
payload: bytebuf.get_i64(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
7
pumpkin-protocol/src/server/status/s_ping_request.rs
Normal file
7
pumpkin-protocol/src/server/status/s_ping_request.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x01)]
|
||||||
|
pub struct SPingRequest {
|
||||||
|
pub payload: i64,
|
||||||
|
}
|
||||||
7
pumpkin-protocol/src/server/status/s_status_request.rs
Normal file
7
pumpkin-protocol/src/server/status/s_status_request.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use pumpkin_macros::packet;
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[packet(0x00)]
|
||||||
|
pub struct SStatusRequest {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
@ -14,14 +14,11 @@ use authentication::GameProfile;
|
|||||||
use mio::{event::Event, net::TcpStream, Token};
|
use mio::{event::Event, net::TcpStream, Token};
|
||||||
use num_traits::ToPrimitive;
|
use num_traits::ToPrimitive;
|
||||||
use pumpkin_protocol::{
|
use pumpkin_protocol::{
|
||||||
client::{
|
bytebuf::packet_id::Packet, client::{
|
||||||
config::CConfigDisconnect,
|
config::CConfigDisconnect,
|
||||||
login::CLoginDisconnect,
|
login::CLoginDisconnect,
|
||||||
play::{CGameEvent, CPlayDisconnect, CSyncPlayerPostion, CSystemChatMessge},
|
play::{CGameEvent, CPlayDisconnect, CSyncPlayerPostion, CSystemChatMessge},
|
||||||
},
|
}, packet_decoder::PacketDecoder, packet_encoder::PacketEncoder, server::{
|
||||||
packet_decoder::PacketDecoder,
|
|
||||||
packet_encoder::PacketEncoder,
|
|
||||||
server::{
|
|
||||||
config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks, SPluginMessage},
|
config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks, SPluginMessage},
|
||||||
handshake::SHandShake,
|
handshake::SHandShake,
|
||||||
login::{SEncryptionResponse, SLoginAcknowledged, SLoginPluginResponse, SLoginStart},
|
login::{SEncryptionResponse, SLoginAcknowledged, SLoginPluginResponse, SLoginStart},
|
||||||
@ -30,9 +27,7 @@ use pumpkin_protocol::{
|
|||||||
SPlayerPositionRotation, SPlayerRotation,
|
SPlayerPositionRotation, SPlayerRotation,
|
||||||
},
|
},
|
||||||
status::{SPingRequest, SStatusRequest},
|
status::{SPingRequest, SStatusRequest},
|
||||||
},
|
}, text::TextComponent, ClientPacket, ConnectionState, PacketError, RawPacket, ServerPacket
|
||||||
text::TextComponent,
|
|
||||||
ClientPacket, ConnectionState, PacketError, RawPacket, ServerPacket,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
@ -166,57 +161,58 @@ impl Client {
|
|||||||
|
|
||||||
/// Handles an incoming decoded Packet
|
/// Handles an incoming decoded Packet
|
||||||
pub fn handle_packet(&mut self, server: &mut Server, packet: &mut RawPacket) {
|
pub fn handle_packet(&mut self, server: &mut Server, packet: &mut RawPacket) {
|
||||||
|
// TODO: handle each packet's Error instead of calling .unwrap()
|
||||||
let bytebuf = &mut packet.bytebuf;
|
let bytebuf = &mut packet.bytebuf;
|
||||||
match self.connection_state {
|
match self.connection_state {
|
||||||
pumpkin_protocol::ConnectionState::HandShake => match packet.id {
|
pumpkin_protocol::ConnectionState::HandShake => match packet.id.0 {
|
||||||
SHandShake::PACKET_ID => self.handle_handshake(server, SHandShake::read(bytebuf)),
|
SHandShake::PACKET_ID => self.handle_handshake(server, SHandShake::read(bytebuf).unwrap()),
|
||||||
_ => log::error!(
|
_ => log::error!(
|
||||||
"Failed to handle packet id {} while in Handshake state",
|
"Failed to handle packet id {} while in Handshake state",
|
||||||
packet.id.0
|
packet.id.0
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
pumpkin_protocol::ConnectionState::Status => match packet.id {
|
pumpkin_protocol::ConnectionState::Status => match packet.id.0 {
|
||||||
SStatusRequest::PACKET_ID => {
|
SStatusRequest::PACKET_ID => {
|
||||||
self.handle_status_request(server, SStatusRequest::read(bytebuf))
|
self.handle_status_request(server, SStatusRequest::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SPingRequest::PACKET_ID => {
|
SPingRequest::PACKET_ID => {
|
||||||
self.handle_ping_request(server, SPingRequest::read(bytebuf))
|
self.handle_ping_request(server, SPingRequest::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
_ => log::error!(
|
_ => log::error!(
|
||||||
"Failed to handle packet id {} while in Status state",
|
"Failed to handle packet id {} while in Status state",
|
||||||
packet.id.0
|
packet.id.0
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
pumpkin_protocol::ConnectionState::Login => match packet.id {
|
pumpkin_protocol::ConnectionState::Login => match packet.id.0 {
|
||||||
SLoginStart::PACKET_ID => {
|
SLoginStart::PACKET_ID => {
|
||||||
self.handle_login_start(server, SLoginStart::read(bytebuf))
|
self.handle_login_start(server, SLoginStart::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SEncryptionResponse::PACKET_ID => {
|
SEncryptionResponse::PACKET_ID => {
|
||||||
self.handle_encryption_response(server, SEncryptionResponse::read(bytebuf))
|
self.handle_encryption_response(server, SEncryptionResponse::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SLoginPluginResponse::PACKET_ID => {
|
SLoginPluginResponse::PACKET_ID => {
|
||||||
self.handle_plugin_response(server, SLoginPluginResponse::read(bytebuf))
|
self.handle_plugin_response(server, SLoginPluginResponse::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SLoginAcknowledged::PACKET_ID => {
|
SLoginAcknowledged::PACKET_ID => {
|
||||||
self.handle_login_acknowledged(server, SLoginAcknowledged::read(bytebuf))
|
self.handle_login_acknowledged(server, SLoginAcknowledged::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
_ => log::error!(
|
_ => log::error!(
|
||||||
"Failed to handle packet id {} while in Login state",
|
"Failed to handle packet id {} while in Login state",
|
||||||
packet.id.0
|
packet.id.0
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
pumpkin_protocol::ConnectionState::Config => match packet.id {
|
pumpkin_protocol::ConnectionState::Config => match packet.id.0 {
|
||||||
SClientInformation::PACKET_ID => {
|
SClientInformation::PACKET_ID => {
|
||||||
self.handle_client_information(server, SClientInformation::read(bytebuf))
|
self.handle_client_information(server, SClientInformation::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SPluginMessage::PACKET_ID => {
|
SPluginMessage::PACKET_ID => {
|
||||||
self.handle_plugin_message(server, SPluginMessage::read(bytebuf))
|
self.handle_plugin_message(server, SPluginMessage::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SAcknowledgeFinishConfig::PACKET_ID => {
|
SAcknowledgeFinishConfig::PACKET_ID => {
|
||||||
self.handle_config_acknowledged(server, SAcknowledgeFinishConfig::read(bytebuf))
|
self.handle_config_acknowledged(server, SAcknowledgeFinishConfig::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SKnownPacks::PACKET_ID => {
|
SKnownPacks::PACKET_ID => {
|
||||||
self.handle_known_packs(server, SKnownPacks::read(bytebuf))
|
self.handle_known_packs(server, SKnownPacks::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
_ => log::error!(
|
_ => log::error!(
|
||||||
"Failed to handle packet id {} while in Config state",
|
"Failed to handle packet id {} while in Config state",
|
||||||
@ -237,24 +233,24 @@ impl Client {
|
|||||||
|
|
||||||
pub fn handle_play_packet(&mut self, server: &mut Server, packet: &mut RawPacket) {
|
pub fn handle_play_packet(&mut self, server: &mut Server, packet: &mut RawPacket) {
|
||||||
let bytebuf = &mut packet.bytebuf;
|
let bytebuf = &mut packet.bytebuf;
|
||||||
match packet.id {
|
match packet.id.0 {
|
||||||
SConfirmTeleport::PACKET_ID => {
|
SConfirmTeleport::PACKET_ID => {
|
||||||
self.handle_confirm_teleport(server, SConfirmTeleport::read(bytebuf))
|
self.handle_confirm_teleport(server, SConfirmTeleport::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SChatCommand::PACKET_ID => {
|
SChatCommand::PACKET_ID => {
|
||||||
self.handle_chat_command(server, SChatCommand::read(bytebuf))
|
self.handle_chat_command(server, SChatCommand::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SPlayerPosition::PACKET_ID => {
|
SPlayerPosition::PACKET_ID => {
|
||||||
self.handle_position(server, SPlayerPosition::read(bytebuf))
|
self.handle_position(server, SPlayerPosition::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SPlayerPositionRotation::PACKET_ID => {
|
SPlayerPositionRotation::PACKET_ID => {
|
||||||
self.handle_position_rotation(server, SPlayerPositionRotation::read(bytebuf))
|
self.handle_position_rotation(server, SPlayerPositionRotation::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SPlayerRotation::PACKET_ID => {
|
SPlayerRotation::PACKET_ID => {
|
||||||
self.handle_rotation(server, SPlayerRotation::read(bytebuf))
|
self.handle_rotation(server, SPlayerRotation::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
SPlayerCommand::PACKET_ID => {
|
SPlayerCommand::PACKET_ID => {
|
||||||
self.handle_player_command(server, SPlayerCommand::read(bytebuf))
|
self.handle_player_command(server, SPlayerCommand::read(bytebuf).unwrap())
|
||||||
}
|
}
|
||||||
_ => log::error!("Failed to handle player packet id {}", packet.id.0),
|
_ => log::error!("Failed to handle player packet id {}", packet.id.0),
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user