aboutsummaryrefslogtreecommitdiff
path: root/azalea-registry/src
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2025-01-13 04:52:40 +0000
committermat <git@matdoes.dev>2025-01-13 04:52:40 +0000
commit5721eaf193977ce0d7c2fee9504b8ad057d1c1a2 (patch)
treef789d0707e46885e1da454b81740f2f4c20a2d6f /azalea-registry/src
parent862dec529bf7619401fd0ae021fc55cbbe27c697 (diff)
downloadazalea-drasl-5721eaf193977ce0d7c2fee9504b8ad057d1c1a2.tar.xz
fix ClientboundSound and implement az_registry::Holder
Diffstat (limited to 'azalea-registry/src')
-rwxr-xr-xazalea-registry/src/lib.rs50
1 files changed, 49 insertions, 1 deletions
diff --git a/azalea-registry/src/lib.rs b/azalea-registry/src/lib.rs
index ffead5b4..4a6df6aa 100755
--- a/azalea-registry/src/lib.rs
+++ b/azalea-registry/src/lib.rs
@@ -90,7 +90,6 @@ pub enum HolderSet<D: Registry, ResourceLocation: AzaleaRead + AzaleaWrite> {
contents: Vec<ResourceLocation>,
},
}
-
impl<D: Registry, ResourceLocation: AzaleaRead + AzaleaWrite> AzaleaRead
for HolderSet<D, ResourceLocation>
{
@@ -145,6 +144,55 @@ impl<D: Registry + Debug, ResourceLocation: AzaleaRead + AzaleaWrite + Debug> De
}
}
+/// A reference to either a registry or a custom value (usually something with a
+/// ResourceLocation).
+pub enum Holder<R: Registry, Direct: AzaleaRead + AzaleaWrite> {
+ Reference(R),
+ Direct(Direct),
+}
+impl<R: Registry, Direct: AzaleaRead + AzaleaWrite> AzaleaRead for Holder<R, Direct> {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ let id = u32::azalea_read_var(buf)?;
+ if id == 0 {
+ Ok(Self::Direct(Direct::azalea_read(buf)?))
+ } else {
+ let Some(value) = R::from_u32(id - 1) else {
+ return Err(BufReadError::UnexpectedEnumVariant {
+ id: (id - 1) as i32,
+ });
+ };
+ Ok(Self::Reference(value))
+ }
+ }
+}
+impl<R: Registry, Direct: AzaleaRead + AzaleaWrite> AzaleaWrite for Holder<R, Direct> {
+ fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+ match self {
+ Self::Reference(value) => (value.to_u32() + 1).azalea_write_var(buf),
+ Self::Direct(value) => {
+ 0u32.azalea_write_var(buf)?;
+ value.azalea_write(buf)
+ }
+ }
+ }
+}
+impl<R: Registry + Debug, Direct: AzaleaRead + AzaleaWrite + Debug> Debug for Holder<R, Direct> {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::Reference(value) => f.debug_tuple("Reference").field(value).finish(),
+ Self::Direct(value) => f.debug_tuple("Direct").field(value).finish(),
+ }
+ }
+}
+impl<R: Registry + Clone, Direct: AzaleaRead + AzaleaWrite + Clone> Clone for Holder<R, Direct> {
+ fn clone(&self) -> Self {
+ match self {
+ Self::Reference(value) => Self::Reference(value.clone()),
+ Self::Direct(value) => Self::Direct(value.clone()),
+ }
+ }
+}
+
registry! {
/// The AI code that's currently being executed for the entity.
enum Activity {