aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2022-05-07 19:46:06 -0500
committermat <github@matdoes.dev>2022-05-07 19:46:06 -0500
commite53ef8b0ddd46b3a85e597e7da57139960304e35 (patch)
tree272a3dfb42113dc53e51b5d21052e033bae92fd7 /azalea-protocol
parent0b84e1cbb826f1a502ffc81efc000369a3c5bb85 (diff)
downloadazalea-drasl-e53ef8b0ddd46b3a85e597e7da57139960304e35.tar.xz
update advancements packet
Diffstat (limited to 'azalea-protocol')
-rwxr-xr-xazalea-protocol/packet-macros/src/lib.rs2
-rwxr-xr-xazalea-protocol/src/mc_buf/read.rs13
-rwxr-xr-xazalea-protocol/src/mc_buf/write.rs14
-rw-r--r--azalea-protocol/src/packets/game/clientbound_update_advancements_packet.rs90
-rwxr-xr-xazalea-protocol/src/packets/game/mod.rs2
5 files changed, 118 insertions, 3 deletions
diff --git a/azalea-protocol/packet-macros/src/lib.rs b/azalea-protocol/packet-macros/src/lib.rs
index a25492c6..35bf8b9b 100755
--- a/azalea-protocol/packet-macros/src/lib.rs
+++ b/azalea-protocol/packet-macros/src/lib.rs
@@ -72,7 +72,7 @@ fn create_impl_mcbufreadable(ident: &Ident, data: &Data) -> proc_macro2::TokenSt
impl crate::mc_buf::McBufReadable for #ident {
fn read_into(buf: &mut impl std::io::Read) -> Result<Self, String>
{
- let id = buf.read_varint()?;
+ let id = crate::mc_buf::McBufVarReadable::var_read_into(buf)?;
match id {
#match_contents
_ => Err(format!("Unknown enum variant {}", id)),
diff --git a/azalea-protocol/src/mc_buf/read.rs b/azalea-protocol/src/mc_buf/read.rs
index e67cfa3c..991bf53b 100755
--- a/azalea-protocol/src/mc_buf/read.rs
+++ b/azalea-protocol/src/mc_buf/read.rs
@@ -6,7 +6,7 @@ use azalea_core::{
};
use byteorder::{ReadBytesExt, WriteBytesExt, BE};
use serde::Deserialize;
-use std::io::Read;
+use std::{collections::HashMap, hash::Hash, io::Read};
use tokio::io::{AsyncRead, AsyncReadExt};
use uuid::Uuid;
@@ -294,6 +294,17 @@ impl<T: McBufReadable + Send> McBufReadable for Vec<T> {
}
}
+impl<K: McBufReadable + Send + Eq + Hash, V: McBufReadable + Send> McBufReadable for HashMap<K, V> {
+ default fn read_into(buf: &mut impl Read) -> Result<Self, String> {
+ let length = buf.read_varint()? as usize;
+ let mut contents = HashMap::with_capacity(length);
+ for _ in 0..length {
+ contents.insert(K::read_into(buf)?, V::read_into(buf)?);
+ }
+ Ok(contents)
+ }
+}
+
impl McBufReadable for Vec<u8> {
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
buf.read_byte_array()
diff --git a/azalea-protocol/src/mc_buf/write.rs b/azalea-protocol/src/mc_buf/write.rs
index 10271bf8..66f129f1 100755
--- a/azalea-protocol/src/mc_buf/write.rs
+++ b/azalea-protocol/src/mc_buf/write.rs
@@ -5,7 +5,7 @@ use azalea_core::{
serializable_uuid::SerializableUuid, BlockPos, Direction, Slot,
};
use byteorder::{BigEndian, WriteBytesExt};
-use std::io::Write;
+use std::{collections::HashMap, io::Write};
use uuid::Uuid;
pub trait Writable: Write {
@@ -174,6 +174,18 @@ impl<T: McBufWritable> McBufWritable for Vec<T> {
}
}
+impl<K: McBufWritable, V: McBufWritable> McBufWritable for HashMap<K, V> {
+ default fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+ u32::var_write_into(&(self.len() as u32), buf)?;
+ for (key, value) in self {
+ key.write_into(buf)?;
+ value.write_into(buf)?;
+ }
+
+ Ok(())
+ }
+}
+
impl McBufWritable for Vec<u8> {
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
buf.write_byte_array(self)
diff --git a/azalea-protocol/src/packets/game/clientbound_update_advancements_packet.rs b/azalea-protocol/src/packets/game/clientbound_update_advancements_packet.rs
new file mode 100644
index 00000000..fe2c226d
--- /dev/null
+++ b/azalea-protocol/src/packets/game/clientbound_update_advancements_packet.rs
@@ -0,0 +1,90 @@
+use crate::packets::{McBufReadable, McBufWritable};
+use azalea_chat::component::Component;
+use azalea_core::{resource_location::ResourceLocation, Slot};
+use packet_macros::{GamePacket, McBufReadable, McBufWritable};
+use std::{
+ collections::HashMap,
+ io::{Read, Write},
+};
+
+#[derive(Clone, Debug, GamePacket)]
+pub struct ClientboundUpdateAdvancementsPacket {
+ pub reset: bool,
+ pub added: HashMap<ResourceLocation, Advancement>,
+ pub removed: Vec<ResourceLocation>,
+ pub progress: HashMap<ResourceLocation, AdvancementProgress>,
+}
+
+#[derive(Clone, Debug, McBufReadable, McBufWritable)]
+pub struct Advancement {
+ parent_id: Option<ResourceLocation>,
+ display: Option<DisplayInfo>,
+ // rewards: AdvancementRewards.EMPTY,
+ criteria: HashMap<ResourceLocation, Criterion>,
+ requirements: Vec<Vec<String>>,
+ // requirements_strategy: RequirementsStrategy.AND
+}
+
+#[derive(Clone, Debug, McBufReadable, McBufWritable)]
+pub struct DisplayInfo {
+ pub title: Component,
+ pub description: Component,
+ pub icon: Slot,
+ pub frame: FrameType,
+ pub flags: DisplayFlags,
+ pub background: Option<ResourceLocation>,
+ pub x: f32,
+ pub y: f32,
+}
+
+#[derive(Clone, Debug)]
+pub struct DisplayFlags {
+ pub background: bool,
+ pub show_toast: bool,
+ pub hidden: bool,
+}
+
+impl McBufReadable for DisplayFlags {
+ fn read_into(buf: &mut impl Read) -> Result<Self, String> {
+ let data = u32::read_into(buf)?;
+ Ok(DisplayFlags {
+ background: (data & 0b1) != 0,
+ show_toast: (data & 0b10) != 0,
+ hidden: (data & 0b100) != 0,
+ })
+ }
+}
+
+impl McBufWritable for DisplayFlags {
+ fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+ let mut data = 0;
+ if self.background {
+ data |= 0b1;
+ }
+ if self.show_toast {
+ data |= 0b10;
+ }
+ if self.hidden {
+ data |= 0b100;
+ }
+ u32::write_into(&data, buf)
+ }
+}
+
+#[derive(Clone, Debug, Copy, McBufReadable, McBufWritable)]
+pub enum FrameType {
+ Task = 0,
+ Challenge = 1,
+ Goal = 2,
+}
+
+// nothing is written here
+#[derive(Clone, Debug, McBufReadable, McBufWritable)]
+pub struct Criterion {}
+
+pub type AdvancementProgress = HashMap<ResourceLocation, CriterionProgress>;
+
+#[derive(Clone, Debug, McBufReadable, McBufWritable)]
+pub struct CriterionProgress {
+ date: Option<u64>,
+}
diff --git a/azalea-protocol/src/packets/game/mod.rs b/azalea-protocol/src/packets/game/mod.rs
index d3ea7281..db1c0b11 100755
--- a/azalea-protocol/src/packets/game/mod.rs
+++ b/azalea-protocol/src/packets/game/mod.rs
@@ -25,6 +25,7 @@ pub mod clientbound_set_experience_packet;
pub mod clientbound_set_health_packet;
pub mod clientbound_set_time_packet;
pub mod clientbound_teleport_entity_packet;
+pub mod clientbound_update_advancements_packet;
pub mod clientbound_update_attributes_packet;
pub mod clientbound_update_recipes_packet;
pub mod clientbound_update_tags_packet;
@@ -67,6 +68,7 @@ declare_state_packets!(
0x52: clientbound_set_health_packet::ClientboundSetHealthPacket,
0x59: clientbound_set_time_packet::ClientboundSetTimePacket,
0x62: clientbound_teleport_entity_packet::ClientboundTeleportEntityPacket,
+ 0x63: clientbound_update_advancements_packet::ClientboundUpdateAdvancementsPacket,
0x64: clientbound_update_attributes_packet::ClientboundUpdateAttributesPacket,
0x66: clientbound_update_recipes_packet::ClientboundUpdateRecipesPacket,
0x67: clientbound_update_tags_packet::ClientboundUpdateTagsPacket,