Add game disconnect packet

This commit is contained in:
Vladislav Golub 2020-01-09 22:17:09 +03:00
parent 908a52df73
commit dc3cf19ecb
2 changed files with 50 additions and 2 deletions

View File

@ -18,6 +18,7 @@ pub enum GameClientBoundPacket {
JoinGame(JoinGame), JoinGame(JoinGame),
ClientBoundKeepAlive(ClientBoundKeepAlive), ClientBoundKeepAlive(ClientBoundKeepAlive),
ChunkData(ChunkData), ChunkData(ChunkData),
GameDisconnect(GameDisconnect),
} }
impl GameServerBoundPacket { impl GameServerBoundPacket {
@ -49,6 +50,7 @@ impl GameClientBoundPacket {
pub fn get_type_id(&self) -> u8 { pub fn get_type_id(&self) -> u8 {
match self { match self {
GameClientBoundPacket::ClientBoundChatMessage(_) => 0x0E, GameClientBoundPacket::ClientBoundChatMessage(_) => 0x0E,
GameClientBoundPacket::GameDisconnect(_) => 0x1A,
GameClientBoundPacket::ClientBoundKeepAlive(_) => 0x20, GameClientBoundPacket::ClientBoundKeepAlive(_) => 0x20,
GameClientBoundPacket::ChunkData(_) => 0x21, GameClientBoundPacket::ChunkData(_) => 0x21,
GameClientBoundPacket::JoinGame(_) => 0x25, GameClientBoundPacket::JoinGame(_) => 0x25,
@ -62,6 +64,11 @@ impl GameClientBoundPacket {
Ok(GameClientBoundPacket::ClientBoundChatMessage(chat_message)) Ok(GameClientBoundPacket::ClientBoundChatMessage(chat_message))
} }
0x1A => {
let game_disconnect = GameDisconnect::decode(reader)?;
Ok(GameClientBoundPacket::GameDisconnect(game_disconnect))
}
0x20 => { 0x20 => {
let keep_alive = ClientBoundKeepAlive::decode(reader)?; let keep_alive = ClientBoundKeepAlive::decode(reader)?;
@ -229,12 +236,25 @@ impl ChunkData {
} }
} }
#[derive(Packet, Debug)]
pub struct GameDisconnect {
pub reason: Message,
}
impl GameDisconnect {
pub fn new(reason: Message) -> GameClientBoundPacket {
let game_disconnect = GameDisconnect { reason };
GameClientBoundPacket::GameDisconnect(game_disconnect)
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::chat::{Message, Payload}; use crate::chat::{Message, Payload};
use crate::game::{ use crate::game::{
ChunkData, ClientBoundChatMessage, ClientBoundKeepAlive, GameMode, JoinGame, ChunkData, ClientBoundChatMessage, ClientBoundKeepAlive, GameDisconnect, GameMode,
MessagePosition, ServerBoundChatMessage, ServerBoundKeepAlive, JoinGame, MessagePosition, ServerBoundChatMessage, ServerBoundKeepAlive,
}; };
use crate::{DecodeError, Encoder, EncoderWriteExt, STRING_MAX_LENGTH}; use crate::{DecodeError, Encoder, EncoderWriteExt, STRING_MAX_LENGTH};
use crate::{Decoder, EncodeError}; use crate::{Decoder, EncodeError};
@ -454,4 +474,31 @@ mod tests {
assert_eq!(chunk_data.primary_mask, 65535); assert_eq!(chunk_data.primary_mask, 65535);
assert_eq!(chunk_data.tiles[0].name, Some(String::from("TileEntity"))); assert_eq!(chunk_data.tiles[0].name, Some(String::from("TileEntity")));
} }
#[test]
fn test_game_disconnect_encode() {
let game_disconnect = GameDisconnect {
reason: Message::new(Payload::text("Message")),
};
let mut vec = Vec::new();
game_disconnect.encode(&mut vec).unwrap();
assert_eq!(
vec,
include_bytes!("../test/packet/game/game_disconnect.dat").to_vec()
);
}
#[test]
fn test_game_disconnect_decode() {
let mut cursor =
Cursor::new(include_bytes!("../test/packet/game/game_disconnect.dat").to_vec());
let game_disconnect = GameDisconnect::decode(&mut cursor).unwrap();
assert_eq!(
game_disconnect.reason,
Message::new(Payload::text("Message"))
);
}
} }

View File

@ -0,0 +1 @@
{"text":"Message"}