Skip to content

Commit 39eafa2

Browse files
committed
implement wolf sound variants
1 parent 985ebcf commit 39eafa2

File tree

6 files changed

+125
-1
lines changed

6 files changed

+125
-1
lines changed

build-data/paper.at

+2
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,11 @@ public net.minecraft.world.entity.animal.sniffer.Sniffer canDig()Z
331331
public net.minecraft.world.entity.animal.sniffer.Sniffer getExploredPositions()Ljava/util/stream/Stream;
332332
public net.minecraft.world.entity.animal.sniffer.Sniffer getState()Lnet/minecraft/world/entity/animal/sniffer/Sniffer$State;
333333
public net.minecraft.world.entity.animal.sniffer.Sniffer storeExploredPosition(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/entity/animal/sniffer/Sniffer;
334+
public net.minecraft.world.entity.animal.wolf.Wolf getSoundVariant()Lnet/minecraft/core/Holder;
334335
public net.minecraft.world.entity.animal.wolf.Wolf getVariant()Lnet/minecraft/core/Holder;
335336
public net.minecraft.world.entity.animal.wolf.Wolf isWet
336337
public net.minecraft.world.entity.animal.wolf.Wolf setCollarColor(Lnet/minecraft/world/item/DyeColor;)V
338+
public net.minecraft.world.entity.animal.wolf.Wolf setSoundVariant(Lnet/minecraft/core/Holder;)V
337339
public net.minecraft.world.entity.animal.wolf.Wolf setVariant(Lnet/minecraft/core/Holder;)V
338340
public net.minecraft.world.entity.boss.enderdragon.EnderDragon subEntities
339341
public net.minecraft.world.entity.boss.wither.WitherBoss bossEvent

paper-api/src/main/java/io/papermc/paper/datacomponent/DataComponentTypes.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ public final class DataComponentTypes {
352352
public static final DataComponentType.Valued<Key> BREAK_SOUND = valued("break_sound");
353353
public static final DataComponentType.Valued<Villager.Type> VILLAGER_VARIANT = valued("villager/variant");
354354
public static final DataComponentType.Valued<Wolf.Variant> WOLF_VARIANT = valued("wolf/variant");
355-
// public static final DataComponentType.Valued<Holder<WolfSoundVariant>> WOLF_SOUND_VARIANT = valued("wolf/sound_variant");
355+
public static final DataComponentType.Valued<Wolf.SoundVariant> WOLF_SOUND_VARIANT = valued("wolf/sound_variant");
356356
public static final DataComponentType.Valued<DyeColor> WOLF_COLLAR = valued("wolf/collar");
357357
public static final DataComponentType.Valued<Fox.Type> FOX_VARIANT = valued("fox/variant");
358358
public static final DataComponentType.Valued<Salmon.Variant> SALMON_SIZE = valued("salmon/size");

paper-api/src/main/java/io/papermc/paper/registry/RegistryKey.java

+5
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ public sealed interface RegistryKey<T> extends Keyed permits RegistryKeyImpl {
163163
* @see io.papermc.paper.registry.keys.WolfVariantKeys
164164
*/
165165
RegistryKey<Wolf.Variant> WOLF_VARIANT = create("wolf_variant");
166+
/**
167+
* Data-driven registry for wolf variants.
168+
* @see io.papermc.paper.registry.keys.WolfSoundVariantKeys
169+
*/
170+
RegistryKey<Wolf.SoundVariant> WOLF_SOUND_VARIANT = create("wolf_sound_variant");
166171
/**
167172
* Data-driven registry for enchantments.
168173
* @see io.papermc.paper.registry.keys.EnchantmentKeys

paper-api/src/main/java/org/bukkit/entity/Wolf.java

+34
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,21 @@ public interface Wolf extends Tameable, Sittable, io.papermc.paper.entity.Collar
9090
*/
9191
void setVariant(@NotNull Variant variant);
9292

93+
/**
94+
* Get the sound variant of this wolf.
95+
*
96+
* @return wolf sound variant
97+
*/
98+
@NotNull
99+
SoundVariant getSoundVariant();
100+
101+
/**
102+
* Set the sound variant of this wolf.
103+
*
104+
* @param soundVariant wolf sound variant
105+
*/
106+
void setSoundVariant(@NotNull SoundVariant soundVariant);
107+
93108
/**
94109
* Represents the variant of a wolf.
95110
*/
@@ -110,4 +125,23 @@ private static Variant getVariant(@NotNull String key) {
110125
return RegistryAccess.registryAccess().getRegistry(RegistryKey.WOLF_VARIANT).getOrThrow(NamespacedKey.minecraft(key));
111126
}
112127
}
128+
129+
/**
130+
* Represents the sound variant of a wolf.
131+
*/
132+
interface SoundVariant extends Keyed {
133+
134+
SoundVariant CLASSIC = getSoundVariant("classic");
135+
SoundVariant PUGLIN = getSoundVariant("puglin");
136+
SoundVariant SAD = getSoundVariant("sad");
137+
SoundVariant ANGRY = getSoundVariant("angry");
138+
SoundVariant GRUMPY = getSoundVariant("grumpy");
139+
SoundVariant BIG = getSoundVariant("big");
140+
SoundVariant CUTE = getSoundVariant("cute");
141+
142+
@NotNull
143+
private static SoundVariant getSoundVariant(@NotNull String key) {
144+
return RegistryAccess.registryAccess().getRegistry(RegistryKey.WOLF_SOUND_VARIANT).getOrThrow(NamespacedKey.minecraft(key));
145+
}
146+
}
113147
}

paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java

+1
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ public static void bootstrap() {
171171
register(DataComponents.VILLAGER_VARIANT, CraftVillager.CraftType::minecraftHolderToBukkit, CraftVillager.CraftType::bukkitToMinecraftHolder);
172172
register(DataComponents.WOLF_VARIANT, CraftWolf.CraftVariant::minecraftHolderToBukkit, CraftWolf.CraftVariant::bukkitToMinecraftHolder);
173173
register(DataComponents.WOLF_COLLAR, nms -> DyeColor.getByWoolData((byte) nms.getId()), api -> net.minecraft.world.item.DyeColor.byId(api.getWoolData()));
174+
register(DataComponents.WOLF_SOUND_VARIANT, CraftWolf.CraftSoundVariant::minecraftHolderToBukkit, CraftWolf.CraftSoundVariant::bukkitToMinecraftHolder);
174175
register(DataComponents.FOX_VARIANT, nms -> org.bukkit.entity.Fox.Type.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.Fox.Variant.byId(api.ordinal()));
175176
register(DataComponents.SALMON_SIZE, (nms) -> Salmon.Variant.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.Salmon.Variant.values()[api.ordinal()]);
176177
register(DataComponents.PARROT_VARIANT, (nms) -> Parrot.Variant.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.Parrot.Variant.byId(api.ordinal()));

paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java

+82
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.common.base.Preconditions;
44
import net.minecraft.core.Holder;
55
import net.minecraft.core.registries.Registries;
6+
import net.minecraft.world.entity.animal.wolf.WolfSoundVariant;
67
import net.minecraft.world.entity.animal.wolf.WolfVariant;
78
import org.bukkit.DyeColor;
89
import org.bukkit.NamespacedKey;
@@ -77,6 +78,18 @@ public void setVariant(Variant variant) {
7778
this.getHandle().setVariant(CraftVariant.bukkitToMinecraftHolder(variant));
7879
}
7980

81+
@Override
82+
public SoundVariant getSoundVariant() {
83+
return CraftSoundVariant.minecraftHolderToBukkit(this.getHandle().getSoundVariant());
84+
}
85+
86+
@Override
87+
public void setSoundVariant(SoundVariant soundVariant) {
88+
Preconditions.checkArgument(soundVariant != null, "soundVariant cannot be null");
89+
90+
this.getHandle().setSoundVariant(CraftSoundVariant.bukkitToMinecraftHolder(soundVariant));
91+
}
92+
8093
public static class CraftVariant implements Variant, Handleable<WolfVariant> {
8194

8295
public static Variant minecraftToBukkit(WolfVariant minecraft) {
@@ -145,4 +158,73 @@ public int hashCode() {
145158
return this.getKey().hashCode();
146159
}
147160
}
161+
162+
public static class CraftSoundVariant implements SoundVariant, Handleable<WolfSoundVariant> {
163+
164+
public static SoundVariant minecraftToBukkit(WolfSoundVariant minecraft) {
165+
return CraftRegistry.minecraftToBukkit(minecraft, Registries.WOLF_SOUND_VARIANT);
166+
}
167+
168+
public static SoundVariant minecraftHolderToBukkit(Holder<WolfSoundVariant> minecraft) {
169+
return CraftSoundVariant.minecraftToBukkit(minecraft.value());
170+
}
171+
172+
public static WolfSoundVariant bukkitToMinecraft(SoundVariant bukkit) {
173+
return CraftRegistry.bukkitToMinecraft(bukkit);
174+
}
175+
176+
public static Holder<WolfSoundVariant> bukkitToMinecraftHolder(SoundVariant bukkit) {
177+
Preconditions.checkArgument(bukkit != null);
178+
179+
net.minecraft.core.Registry<WolfSoundVariant> registry = CraftRegistry.getMinecraftRegistry(Registries.WOLF_SOUND_VARIANT);
180+
181+
if (registry.wrapAsHolder(CraftSoundVariant.bukkitToMinecraft(bukkit)) instanceof Holder.Reference<WolfSoundVariant> holder) {
182+
return holder;
183+
}
184+
185+
throw new IllegalArgumentException("No Reference holder found for " + bukkit
186+
+ ", this can happen if a plugin creates its own wolf sound variant with out properly registering it.");
187+
}
188+
189+
private final NamespacedKey key;
190+
private final WolfSoundVariant soundVariant;
191+
192+
public CraftSoundVariant(NamespacedKey key, WolfSoundVariant soundVariant) {
193+
this.key = key;
194+
this.soundVariant = soundVariant;
195+
}
196+
197+
@Override
198+
public WolfSoundVariant getHandle() {
199+
return this.soundVariant;
200+
}
201+
202+
@Override
203+
public NamespacedKey getKey() {
204+
return this.key;
205+
}
206+
207+
@Override
208+
public String toString() {
209+
return this.key.toString();
210+
}
211+
212+
@Override
213+
public boolean equals(Object other) {
214+
if (this == other) {
215+
return true;
216+
}
217+
218+
if (!(other instanceof CraftSoundVariant otherVariant)) {
219+
return false;
220+
}
221+
222+
return this.getKey().equals(otherVariant.getKey());
223+
}
224+
225+
@Override
226+
public int hashCode() {
227+
return this.getKey().hashCode();
228+
}
229+
}
148230
}

0 commit comments

Comments
 (0)