aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol/src
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2022-04-26 15:13:47 +0000
committermat <github@matdoes.dev>2022-04-26 15:13:47 +0000
commitf9528a9f9a9e73b1d657af7c78d743067307d843 (patch)
treed24e46982572d3b8607e130a5f24a7f7c198f484 /azalea-protocol/src
parent15b4dd6bd1c50ee8a9ebadf781e3ecbfdf62e266 (diff)
downloadazalea-drasl-f9528a9f9a9e73b1d657af7c78d743067307d843.tar.xz
work on adding more stuff for recipes
Diffstat (limited to 'azalea-protocol/src')
-rwxr-xr-xazalea-protocol/src/mc_buf/read.rs24
-rw-r--r--azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs130
2 files changed, 146 insertions, 8 deletions
diff --git a/azalea-protocol/src/mc_buf/read.rs b/azalea-protocol/src/mc_buf/read.rs
index 3d50e5aa..1e7db1dd 100755
--- a/azalea-protocol/src/mc_buf/read.rs
+++ b/azalea-protocol/src/mc_buf/read.rs
@@ -1,11 +1,12 @@
+use crate::mc_buf::ByteArray;
use async_trait::async_trait;
use azalea_chat::component::Component;
use azalea_core::{
- difficulty::Difficulty, game_type::GameType, resource_location::ResourceLocation,
+ difficulty::Difficulty, game_type::GameType, resource_location::ResourceLocation, Slot,
+ SlotData,
};
use serde::Deserialize;
use tokio::io::{AsyncRead, AsyncReadExt};
-use crate::mc_buf::ByteArray;
use super::MAX_STRING_LENGTH;
@@ -252,7 +253,6 @@ impl McBufReadable for Vec<u8> {
}
}
-
#[async_trait]
impl McBufReadable for ByteArray {
async fn read_into<R>(buf: &mut R) -> Result<Self, String>
@@ -469,3 +469,21 @@ impl McBufReadable for Component {
Ok(component)
}
}
+
+// Slot
+#[async_trait]
+impl McBufReadable for Slot {
+ async fn read_into<R>(buf: &mut R) -> Result<Self, String>
+ where
+ R: AsyncRead + std::marker::Unpin + std::marker::Send,
+ {
+ let present = buf.read_boolean().await?;
+ if !present {
+ return Ok(Slot::Empty);
+ }
+ let id = buf.read_varint().await?;
+ let count = buf.read_byte().await?;
+ let nbt = buf.read_nbt().await?;
+ Ok(Slot::Present(SlotData { id, count, nbt }))
+ }
+}
diff --git a/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs b/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs
index 8f9deae8..558b74c7 100644
--- a/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs
+++ b/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs
@@ -1,14 +1,134 @@
+use async_trait::async_trait;
use azalea_chat::component::Component;
-use azalea_core::resource_location::ResourceLocation;
+use azalea_core::{resource_location::ResourceLocation, Slot};
use packet_macros::GamePacket;
+use tokio::io::AsyncRead;
+
+use crate::mc_buf::{McBufReadable, McBufWritable, Readable, Writable};
#[derive(Clone, Debug, GamePacket)]
pub struct ClientboundUpdateRecipesPacket {
pub recipes: Vec<Recipe>,
}
-struct Recipe {
- type_: ResourceLocation,
- identifier: ResourceLocation,
- // data
+#[derive(Clone, Debug)]
+pub struct Recipe {
+ pub identifier: ResourceLocation,
+ pub data: RecipeData,
+}
+
+#[derive(Clone, Debug)]
+pub enum RecipeData {
+ CraftingShapeless {
+ /// Used to group similar recipes together in the recipe book.
+ /// Tag is present in recipe JSON
+ group: String,
+ // ingredients
+ ingredients: Vec<Ingredient>,
+ result: Slot,
+ },
+}
+
+#[derive(Clone, Debug)]
+pub struct Ingredient {
+ pub allowed: Vec<Slot>,
+}
+
+impl McBufWritable for Recipe {
+ fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
+ todo!()
+ }
+}
+#[async_trait]
+impl McBufReadable for Recipe {
+ async fn read_into<R>(buf: &mut R) -> Result<Self, String>
+ where
+ R: AsyncRead + std::marker::Unpin + std::marker::Send,
+ {
+ let recipe_type = buf.read_resource_location().await?;
+ let identifier = buf.read_resource_location().await?;
+
+ // rust doesn't let us match ResourceLocation so we have to do a big
+ // if-else chain :(
+ let data = if recipe_type == ResourceLocation::new("minecraft:crafting_shapeless").unwrap()
+ {
+ let group = buf.read_utf().await?;
+ let ingredients = Vec::<Ingredient>::read_into(buf).await?;
+ let result = Slot::read_into(buf).await?;
+
+ RecipeData::CraftingShapeless {
+ group,
+ ingredients,
+ result,
+ }
+ } else {
+ panic!();
+ };
+
+ let recipe = Recipe { identifier, data };
+
+ Ok(recipe)
+ }
+}
+
+impl McBufWritable for Ingredient {
+ fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
+ todo!()
+ }
+}
+#[async_trait]
+impl McBufReadable for Ingredient {
+ async fn read_into<R>(buf: &mut R) -> Result<Self, String>
+ where
+ R: AsyncRead + std::marker::Unpin + std::marker::Send,
+ {
+ let ingredient = Ingredient {
+ allowed: Vec::<Slot>::read_into(buf).await?,
+ };
+ Ok(ingredient)
+ }
+}
+
+impl McBufWritable for Vec<Recipe> {
+ fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
+ buf.write_varint(self.len() as i32)?;
+ for recipe in self {
+ recipe.write_into(buf)?;
+ }
+ Ok(())
+ }
+}
+#[async_trait]
+impl McBufReadable for Vec<Recipe> {
+ async fn read_into<R>(buf: &mut R) -> Result<Self, String>
+ where
+ R: AsyncRead + std::marker::Unpin + std::marker::Send,
+ {
+ let recipe_count = buf.read_varint().await?;
+ let mut recipes = Vec::with_capacity(recipe_count as usize);
+ for _ in 0..recipe_count {
+ recipes.push(Recipe::read_into(buf).await?);
+ }
+ Ok(recipes)
+ }
+}
+
+impl McBufWritable for Vec<Ingredient> {
+ fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
+ buf.write_varint(self.len() as i32)?;
+ for ingredient in self {
+ ingredient.write_into(buf)?;
+ }
+ Ok(())
+ }
+}
+
+#[async_trait]
+impl McBufReadable for Vec<Ingredient> {
+ async fn read_into<R>(buf: &mut R) -> Result<Self, String>
+ where
+ R: AsyncRead + std::marker::Unpin + std::marker::Send,
+ {
+ todo!()
+ }
}