summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/connect.rs78
-rw-r--r--src/main.rs149
-rw-r--r--src/nbtdsl.rs82
3 files changed, 163 insertions, 146 deletions
diff --git a/src/connect.rs b/src/connect.rs
new file mode 100644
index 0000000..82590fb
--- /dev/null
+++ b/src/connect.rs
@@ -0,0 +1,78 @@
+use std::net::TcpStream;
+
+use anyhow::Result;
+use craftio_rs::{CraftSyncReader, CraftSyncWriter, CraftTcpConnection};
+use mcproto_rs::protocol::HasPacketKind;
+use mcproto_rs::v1_19_3::{Packet761, Packet761Kind, RawPacket761};
+
+#[macro_export]
+macro_rules! await_packet {
+ ($packet_type:ident, $conn:expr) => {
+ assert_packet!(
+ $packet_type,
+ $conn.wait_for_packet(Packet761Kind::$packet_type).await?
+ )
+ };
+}
+
+#[macro_export]
+macro_rules! assert_packet {
+ ($packet_type:ident, $obj:expr) => {
+ if let Packet761::$packet_type(packet_data) = $obj {
+ packet_data
+ } else {
+ panic!("Expected packet of type {}", stringify!($packet_type))
+ }
+ };
+ ($packet_type:ident, $conn:expr, $errmgs:literal) => {
+ assert_packet!(
+ $packet_type,
+ $conn
+ .read_next_packet()
+ .await?
+ .ok_or(anyhow::anyhow!("Missing packet"))?
+ )
+ };
+}
+
+pub struct MinecraftClient {
+ pub connection: CraftTcpConnection,
+}
+
+impl MinecraftClient {
+ pub fn new(connection: CraftTcpConnection) -> Self {
+ Self { connection }
+ }
+
+ pub fn from_stream(stream: TcpStream) -> Result<Self> {
+ Ok(Self {
+ connection: CraftTcpConnection::from_std(
+ stream,
+ mcproto_rs::protocol::PacketDirection::ServerBound,
+ )?,
+ })
+ }
+ pub async fn read_next_packet(&mut self) -> Result<Option<Packet761>> {
+ if let Some(raw) = self.connection.read_packet::<RawPacket761>()? {
+ println!("Client -> Server: {:?}", raw);
+ Ok(Some(raw))
+ } else {
+ Ok(None)
+ }
+ }
+ pub async fn send_packet(&mut self, packet: Packet761) -> Result<()> {
+ println!("Server -> Client: {:?}", packet);
+ self.connection.write_packet(packet)?;
+ Ok(())
+ }
+ pub async fn wait_for_packet(&mut self, packet_kind: Packet761Kind) -> Result<Packet761> {
+ loop {
+ if let Some(packet) = self.read_next_packet().await? {
+ if packet.kind() == packet_kind {
+ return Ok(packet);
+ }
+ println!("Skipping packet {:?}", packet);
+ }
+ }
+ }
+}
diff --git a/src/main.rs b/src/main.rs
index d81b0a6..088f27f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -12,155 +12,12 @@ use mcproto_rs::uuid::UUID4;
use mcproto_rs::v1_19_3::{BitSet, BlobArray, BookSettings, ChunkDataAndUpdateLightSpec, ChunkDataSpec, ChunkSection, CommandNode, CommandNodeSpec, CommandsSpec, EntityEventSpec, InitializeWorldBorderSpec, KeepAliveClientBoundSpec, LightDataSpec, PalettedContainer, PluginMessageSpec, RecipeBookAction, RecipeBookInitSpec, SetCenterChunkSpec, SetContainerContentSpec, SetDefaultSpawnPositionSpec, SynchronizePlayerPositionSpec, TagType, TypedTagList, UpdateRecipeBookSpec};
use mcproto_rs::v1_19_3::{GameMode, HandshakeNextState, LoginPlaySpec, LoginSuccessSpec, Packet761, Packet761Kind, PingRequestSpec, PingResponseSpec, PreviousGameMode, RawPacket761, SetHeldItemClientSpec, StatusResponseSpec, UpdateRecipesSpec, UpdateTagsSpec};
use tokio;
+use crate::connect::MinecraftClient;
-pub struct MinecraftClient {
- connection: CraftTcpConnection,
-}
-
-impl MinecraftClient {
- pub fn new(connection: CraftTcpConnection) -> Self {
- Self { connection }
- }
-
- pub fn from_stream(stream: TcpStream) -> Result<Self> {
- Ok(Self {
- connection: CraftTcpConnection::from_std(
- stream,
- mcproto_rs::protocol::PacketDirection::ServerBound,
- )?,
- })
- }
- pub async fn read_next_packet(&mut self) -> Result<Option<Packet761>> {
- if let Some(raw) = self.connection.read_packet::<RawPacket761>()? {
- println!("Client -> Server: {:?}", raw);
- Ok(Some(raw))
- } else {
- Ok(None)
- }
- }
- pub async fn send_packet(&mut self, packet: Packet761) -> Result<()> {
- println!("Server -> Client: {:?}", packet);
- self.connection.write_packet(packet)?;
- Ok(())
- }
- pub async fn wait_for_packet(&mut self, packet_kind: Packet761Kind) -> Result<Packet761> {
- loop {
- if let Some(packet) = self.read_next_packet().await? {
- if packet.kind() == packet_kind {
- return Ok(packet);
- }
- println!("Skipping packet {:?}", packet);
- }
- }
- }
-}
-
-macro_rules! await_packet {
- ($packet_type:ident, $conn:expr) => {
- assert_packet!(
- $packet_type,
- $conn.wait_for_packet(Packet761Kind::$packet_type).await?
- )
- };
-}
-
-macro_rules! assert_packet {
- ($packet_type:ident, $obj:expr) => {
- if let Packet761::$packet_type(packet_data) = $obj {
- packet_data
- } else {
- panic!("Expected packet of type {}", stringify!($packet_type))
- }
- };
- ($packet_type:ident, $conn:expr, $errmgs:literal) => {
- assert_packet!(
- $packet_type,
- $conn
- .read_next_packet()
- .await?
- .ok_or(anyhow::anyhow!("Missing packet"))?
- )
- };
-}
-
-trait ShittyToNbt {
- fn to_nbt(self) -> Tag;
-}
-impl ShittyToNbt for String {
- fn to_nbt(self) -> Tag {
- Tag::String(self)
- }
-}
-
-impl ShittyToNbt for &str {
- fn to_nbt(self) -> Tag {
- Tag::String(self.into())
- }
-}
-
-impl ShittyToNbt for i32 {
- fn to_nbt(self) -> Tag {
- Tag::Int(self)
- }
-}
-
-impl ShittyToNbt for i64 {
- fn to_nbt(self) -> Tag {
- Tag::Long(self)
- }
-}
-
-impl ShittyToNbt for bool {
- fn to_nbt(self) -> Tag {
- Tag::Byte(if self { 1 } else { 0 })
- }
-}
-
-impl ShittyToNbt for Tag {
- fn to_nbt(self) -> Tag {
- self
- }
-}
-
-impl ShittyToNbt for f32 {
- fn to_nbt(self) -> Tag {
- Tag::Float(self)
- }
-}
-
-impl ShittyToNbt for f64 {
- fn to_nbt(self) -> Tag {
- Tag::Double(self)
- }
-}
+pub mod connect;
+pub mod nbtdsl;
-macro_rules! nbt {
- ( {$($name:literal :: $value:tt),* $(,)? } ) => {
- Tag::Compound(vec![
- $(
- nbt!($value).with_name($name)
- ),*
- ])
- };
- { $($name:literal :: $value:tt),* $(,)? } => {
- Tag::Compound(vec![
- $(
- nbt!($value).with_name($name)
- ),*
- ])
- };
- ([ $($value:tt),* $(,)? ]) => {
- Tag::List(vec![
- $(
- nbt!($value)
- ),*
- ])
- };
- (($e:expr)) => {
- ShittyToNbt::to_nbt($e)
- };
-}
#[tokio::main]
async fn main() -> Result<()> {
println!("Starting server");
diff --git a/src/nbtdsl.rs b/src/nbtdsl.rs
new file mode 100644
index 0000000..bfa9090
--- /dev/null
+++ b/src/nbtdsl.rs
@@ -0,0 +1,82 @@
+use mcproto_rs::nbt::Tag;
+
+
+pub trait ShittyToNbt {
+ fn to_nbt(self) -> Tag;
+}
+
+impl ShittyToNbt for String {
+ fn to_nbt(self) -> Tag {
+ Tag::String(self)
+ }
+}
+
+impl ShittyToNbt for &str {
+ fn to_nbt(self) -> Tag {
+ Tag::String(self.into())
+ }
+}
+
+impl ShittyToNbt for i32 {
+ fn to_nbt(self) -> Tag {
+ Tag::Int(self)
+ }
+}
+
+impl ShittyToNbt for i64 {
+ fn to_nbt(self) -> Tag {
+ Tag::Long(self)
+ }
+}
+
+impl ShittyToNbt for bool {
+ fn to_nbt(self) -> Tag {
+ Tag::Byte(if self { 1 } else { 0 })
+ }
+}
+
+impl ShittyToNbt for Tag {
+ fn to_nbt(self) -> Tag {
+ self
+ }
+}
+
+impl ShittyToNbt for f32 {
+ fn to_nbt(self) -> Tag {
+ Tag::Float(self)
+ }
+}
+
+impl ShittyToNbt for f64 {
+ fn to_nbt(self) -> Tag {
+ Tag::Double(self)
+ }
+}
+
+#[macro_export]
+macro_rules! nbt {
+ ( {$($name:literal :: $value:tt),* $(,)? } ) => {
+ Tag::Compound(vec![
+ $(
+ nbt!($value).with_name($name)
+ ),*
+ ])
+ };
+ { $($name:literal :: $value:tt),* $(,)? } => {
+ Tag::Compound(vec![
+ $(
+ nbt!($value).with_name($name)
+ ),*
+ ])
+ };
+ ([ $($value:tt),* $(,)? ]) => {
+ Tag::List(vec![
+ $(
+ nbt!($value)
+ ),*
+ ])
+ };
+ (($e:expr)) => {
+ $crate::nbtdsl::ShittyToNbt::to_nbt($e)
+ };
+} \ No newline at end of file