From 5d57527c2a7055be38b18e7bf5c30bcdece6dd86 Mon Sep 17 00:00:00 2001 From: DerFrZocker Date: Wed, 24 Apr 2024 04:22:03 +1000 Subject: [PATCH] #1380: Change wolf variant from enum to interface --- .../org/bukkit/craftbukkit/CraftRegistry.java | 5 ++ .../bukkit/craftbukkit/entity/CraftWolf.java | 60 ++++++++++++++----- .../provider/RegistriesArgumentProvider.java | 4 ++ 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java b/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java index 4c3804463..b6a1682aa 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java @@ -19,6 +19,7 @@ import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.craftbukkit.damage.CraftDamageType; import org.bukkit.craftbukkit.enchantments.CraftEnchantment; +import org.bukkit.craftbukkit.entity.CraftWolf; import org.bukkit.craftbukkit.generator.structure.CraftStructure; import org.bukkit.craftbukkit.generator.structure.CraftStructureType; import org.bukkit.craftbukkit.inventory.trim.CraftTrimMaterial; @@ -28,6 +29,7 @@ import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.craftbukkit.util.Handleable; import org.bukkit.damage.DamageType; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Wolf; import org.bukkit.generator.structure.Structure; import org.bukkit.generator.structure.StructureType; import org.bukkit.inventory.meta.trim.TrimMaterial; @@ -134,6 +136,9 @@ public class CraftRegistry implements Registry { if (bukkitClass == DamageType.class) { return new CraftRegistry<>(DamageType.class, registryHolder.registryOrThrow(Registries.DAMAGE_TYPE), CraftDamageType::new); } + if (bukkitClass == Wolf.Variant.class) { + return new CraftRegistry<>(Wolf.Variant.class, registryHolder.registryOrThrow(Registries.WOLF_VARIANT), CraftWolf.CraftVariant::new); + } return null; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java index 211897929..14b31d4f9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java @@ -8,10 +8,11 @@ import net.minecraft.world.entity.animal.EntityWolf; import net.minecraft.world.entity.animal.WolfVariant; import net.minecraft.world.item.EnumColor; import org.bukkit.DyeColor; +import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.craftbukkit.CraftRegistry; import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.util.Handleable; import org.bukkit.entity.Wolf; public class CraftWolf extends CraftTameableAnimal implements Wolf { @@ -80,17 +81,10 @@ public class CraftWolf extends CraftTameableAnimal implements Wolf { getHandle().setVariant(CraftVariant.bukkitToMinecraftHolder(variant)); } - public static class CraftVariant { + public static class CraftVariant implements Variant, Handleable { public static Variant minecraftToBukkit(WolfVariant minecraft) { - Preconditions.checkArgument(minecraft != null); - - IRegistry registry = CraftRegistry.getMinecraftRegistry(Registries.WOLF_VARIANT); - Variant bukkit = Registry.WOLF_VARIANT.get(CraftNamespacedKey.fromMinecraft(registry.getResourceKey(minecraft).orElseThrow().location())); - - Preconditions.checkArgument(bukkit != null); - - return bukkit; + return CraftRegistry.minecraftToBukkit(minecraft, Registries.WOLF_VARIANT, Registry.WOLF_VARIANT); } public static Variant minecraftHolderToBukkit(Holder minecraft) { @@ -98,10 +92,7 @@ public class CraftWolf extends CraftTameableAnimal implements Wolf { } public static WolfVariant bukkitToMinecraft(Variant bukkit) { - Preconditions.checkArgument(bukkit != null); - - return CraftRegistry.getMinecraftRegistry(Registries.WOLF_VARIANT) - .getOptional(CraftNamespacedKey.toMinecraft(bukkit.getKey())).orElseThrow(); + return CraftRegistry.bukkitToMinecraft(bukkit); } public static Holder bukkitToMinecraftHolder(Variant bukkit) { @@ -116,5 +107,46 @@ public class CraftWolf extends CraftTameableAnimal implements Wolf { throw new IllegalArgumentException("No Reference holder found for " + bukkit + ", this can happen if a plugin creates its own wolf variant with out properly registering it."); } + + private final NamespacedKey key; + private final WolfVariant variant; + + public CraftVariant(NamespacedKey key, WolfVariant variant) { + this.key = key; + this.variant = variant; + } + + @Override + public WolfVariant getHandle() { + return variant; + } + + @Override + public NamespacedKey getKey() { + return key; + } + + @Override + public String toString() { + return key.toString(); + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + + if (!(other instanceof CraftVariant otherVariant)) { + return false; + } + + return getKey().equals(otherVariant.getKey()); + } + + @Override + public int hashCode() { + return getKey().hashCode(); + } } } diff --git a/src/test/java/org/bukkit/support/provider/RegistriesArgumentProvider.java b/src/test/java/org/bukkit/support/provider/RegistriesArgumentProvider.java index f33d7061e..d77026835 100644 --- a/src/test/java/org/bukkit/support/provider/RegistriesArgumentProvider.java +++ b/src/test/java/org/bukkit/support/provider/RegistriesArgumentProvider.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.stream.Stream; import net.minecraft.core.registries.Registries; import net.minecraft.world.effect.MobEffectList; +import net.minecraft.world.entity.animal.WolfVariant; import net.minecraft.world.item.Instrument; import org.bukkit.GameEvent; import org.bukkit.MusicInstrument; @@ -12,6 +13,7 @@ import org.bukkit.craftbukkit.CraftGameEvent; import org.bukkit.craftbukkit.CraftMusicInstrument; import org.bukkit.craftbukkit.damage.CraftDamageType; import org.bukkit.craftbukkit.enchantments.CraftEnchantment; +import org.bukkit.craftbukkit.entity.CraftWolf; import org.bukkit.craftbukkit.generator.structure.CraftStructure; import org.bukkit.craftbukkit.generator.structure.CraftStructureType; import org.bukkit.craftbukkit.inventory.trim.CraftTrimMaterial; @@ -19,6 +21,7 @@ import org.bukkit.craftbukkit.inventory.trim.CraftTrimPattern; import org.bukkit.craftbukkit.potion.CraftPotionEffectType; import org.bukkit.damage.DamageType; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Wolf; import org.bukkit.generator.structure.Structure; import org.bukkit.generator.structure.StructureType; import org.bukkit.inventory.meta.trim.TrimMaterial; @@ -43,6 +46,7 @@ public class RegistriesArgumentProvider implements ArgumentsProvider { DATA.add(Arguments.of(TrimMaterial.class, Registries.TRIM_MATERIAL, CraftTrimMaterial.class, net.minecraft.world.item.armortrim.TrimMaterial.class)); DATA.add(Arguments.of(TrimPattern.class, Registries.TRIM_PATTERN, CraftTrimPattern.class, net.minecraft.world.item.armortrim.TrimPattern.class)); DATA.add(Arguments.of(DamageType.class, Registries.DAMAGE_TYPE, CraftDamageType.class, net.minecraft.world.damagesource.DamageType.class)); + DATA.add(Arguments.of(Wolf.Variant.class, Registries.WOLF_VARIANT, CraftWolf.CraftVariant.class, WolfVariant.class)); } @Override