From f19f598abe834e26cd38d99830893a8e4cf89c20 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tim=20Vis=C3=A9e?= <tim+github@visee.me>
Date: Tue, 9 Nov 2021 19:57:44 +0100
Subject: [PATCH] Add Handshake (#19)

Co-authored-by: mibac138 <5672750+mibac138@users.noreply.github.com>
---
 protocol/src/version/v1_14_4/handshake.rs | 55 +++++++++++++++++++++++
 protocol/src/version/v1_14_4/mod.rs       |  1 +
 2 files changed, 56 insertions(+)
 create mode 100644 protocol/src/version/v1_14_4/handshake.rs

diff --git a/protocol/src/version/v1_14_4/handshake.rs b/protocol/src/version/v1_14_4/handshake.rs
new file mode 100644
index 0000000..f678043
--- /dev/null
+++ b/protocol/src/version/v1_14_4/handshake.rs
@@ -0,0 +1,55 @@
+use crate::decoder::Decoder;
+use crate::error::DecodeError;
+use minecraft_protocol_derive::{Decoder, Encoder};
+use std::io::Read;
+
+pub enum HandshakeServerBoundPacket {
+    Handshake(Handshake),
+}
+
+impl HandshakeServerBoundPacket {
+    pub fn get_type_id(&self) -> u8 {
+        match self {
+            HandshakeServerBoundPacket::Handshake(_) => 0x00,
+        }
+    }
+
+    pub fn decode<R: Read>(type_id: u8, reader: &mut R) -> Result<Self, DecodeError> {
+        match type_id {
+            0x00 => {
+                let handshake = Handshake::decode(reader)?;
+                Ok(HandshakeServerBoundPacket::Handshake(handshake))
+            }
+            _ => Err(DecodeError::UnknownPacketType { type_id }),
+        }
+    }
+}
+
+#[derive(Encoder, Decoder, Debug)]
+pub struct Handshake {
+    #[data_type(with = "var_int")]
+    pub protocol_version: i32,
+    #[data_type(max_length = 255)]
+    pub server_addr: String,
+    pub server_port: u16,
+    #[data_type(with = "var_int")]
+    pub next_state: i32,
+}
+
+impl Handshake {
+    pub fn new(
+        protocol_version: i32,
+        server_addr: String,
+        server_port: u16,
+        next_state: i32,
+    ) -> HandshakeServerBoundPacket {
+        let handshake = Handshake {
+            protocol_version,
+            server_addr,
+            server_port,
+            next_state,
+        };
+
+        HandshakeServerBoundPacket::Handshake(handshake)
+    }
+}
diff --git a/protocol/src/version/v1_14_4/mod.rs b/protocol/src/version/v1_14_4/mod.rs
index 986f00e..29a91c1 100644
--- a/protocol/src/version/v1_14_4/mod.rs
+++ b/protocol/src/version/v1_14_4/mod.rs
@@ -1,3 +1,4 @@
 pub mod game;
+pub mod handshake;
 pub mod login;
 pub mod status;