From ad9d16f48c869515ffc01552db61005a3e240a02 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 19 Jun 2025 15:46:18 +0100 Subject: [PATCH 1/8] Updated biome collection --- .../main/java/com/dfsek/terra/bukkit/PlatformImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java index 32a059721..55df7a207 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java @@ -23,7 +23,10 @@ import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.terra.bukkit.nms.Initializer; +import io.papermc.paper.registry.RegistryAccess; +import io.papermc.paper.registry.RegistryKey; import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; import org.bukkit.entity.EntityType; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -132,7 +135,8 @@ public class PlatformImpl extends AbstractPlatform { } private BukkitPlatformBiome parseBiome(String id, DepthTracker depthTracker) throws LoadException { - if(!id.startsWith("minecraft:")) throw new LoadException("Invalid biome identifier " + id, depthTracker); - return new BukkitPlatformBiome(org.bukkit.block.Biome.valueOf(id.toUpperCase(Locale.ROOT).substring(10))); + NamespacedKey key = NamespacedKey.fromString(id); + if(key == null || !key.namespace().equals("minecraft")) throw new LoadException("Invalid biome identifier " + id, depthTracker); + return new BukkitPlatformBiome(RegistryAccess.registryAccess().getRegistry(RegistryKey.BIOME).getOrThrow(key)); } } From f4db7fc5073db12cdb65f493e96561dbdb294453 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 19 Jun 2025 15:46:46 +0100 Subject: [PATCH 2/8] Added initial wolf variant support (not functional) --- .../bukkit/listeners/CommonListener.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index bc48a7277..651c5af33 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -18,20 +18,32 @@ package com.dfsek.terra.bukkit.listeners; import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.bukkit.hooks.MultiverseGeneratorPluginHook; +import org.bukkit.World; +import org.bukkit.entity.Wolf; +import org.bukkit.entity.Wolf.Variant; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.event.server.PluginEnableEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + /** * Listener for events on all implementations. */ public class CommonListener implements Listener { private static final Logger logger = LoggerFactory.getLogger(CommonListener.class); + private static final List WOLF_VARIANT_SPAWN_REASONS = List.of( + SpawnReason.SPAWNER, SpawnReason.TRIAL_SPAWNER, SpawnReason.SPAWNER_EGG, SpawnReason.DEFAULT + ); private final Platform platform; public CommonListener(Platform platform) { @@ -51,4 +63,35 @@ public class CommonListener implements Listener { } } } + + @EventHandler + public void onWolfSpawn(CreatureSpawnEvent event) { + if (!(event.getEntity() instanceof Wolf wolf)) { + return; + } + + // Doesn't apply if variant has already been applied + if (wolf.getVariant() != Variant.PALE) { + return; + } + + if (!WOLF_VARIANT_SPAWN_REASONS.contains(event.getSpawnReason())) { + return; + } + + World world = wolf.getWorld(); + if (!(world.getGenerator() instanceof BukkitChunkGeneratorWrapper wrapper)) { + return; + } + + ConfigPack pack = platform.getConfigRegistry().get(wrapper.getPack().getRegistryKey()).orElse(null); + if (pack == null) { + return; + } + + // TODO: Implement logic to calculate variant + if (wolf.getWorld().getBiome(wolf.getLocation()).getKey().toString().equalsIgnoreCase("terra:overworld/overworld/taiga")) { + wolf.setVariant(Variant.RUSTY); + } + } } From 7a041d8a6364b3f53e45e9d19f89878894d16a64 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 19 Jun 2025 20:49:37 +0100 Subject: [PATCH 3/8] Removed unused import --- .../src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java index 55df7a207..2c37356ca 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java @@ -34,7 +34,6 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.List; -import java.util.Locale; import com.dfsek.terra.AbstractPlatform; import com.dfsek.terra.api.addon.BaseAddon; From 78162eaafe1cc08f40a4fb28e3411b6832227a5e Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 19 Jun 2025 20:49:57 +0100 Subject: [PATCH 4/8] Added vanilla biome key to biome context --- .../com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java | 8 ++++++++ .../dfsek/terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java | 3 +++ 2 files changed, 11 insertions(+) create mode 100644 platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java new file mode 100644 index 000000000..8db2a2cfb --- /dev/null +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.bukkit.world; + +import com.dfsek.terra.api.properties.Properties; + +import org.bukkit.NamespacedKey; + + +public record BukkitBiomeInfo(NamespacedKey vanillaBiomeKey) implements Properties {} diff --git a/platforms/bukkit/nms/v1_21_6/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21_6/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java index 980194f92..7e69ebe31 100644 --- a/platforms/bukkit/nms/v1_21_6/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21_6/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java @@ -2,6 +2,8 @@ package com.dfsek.terra.bukkit.nms.v1_21_6; import com.dfsek.terra.bukkit.nms.v1_21_6.config.VanillaBiomeProperties; +import com.dfsek.terra.bukkit.world.BukkitBiomeInfo; + import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; import net.minecraft.core.HolderSet; @@ -62,6 +64,7 @@ public class AwfulBukkitHacks { Reference holder = biomeRegistry.register(delegateKey, platform, RegistrationInfo.BUILT_IN); Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. + platformBiome.getContext().put(new BukkitBiomeInfo(vanillaBukkitKey)); platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); From 85234ddc39d013000a36a8c95fc05ac4f78aab96 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 19 Jun 2025 20:50:31 +0100 Subject: [PATCH 5/8] Progress on wolves --- .../bukkit/listeners/CommonListener.java | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index 651c5af33..ff3ade3d5 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -22,7 +22,13 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.bukkit.hooks.MultiverseGeneratorPluginHook; +import com.dfsek.terra.bukkit.world.BukkitBiomeInfo; +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; + +import io.papermc.paper.registry.RegistryAccess; +import io.papermc.paper.registry.RegistryKey; import org.bukkit.World; +import org.bukkit.block.Biome; import org.bukkit.entity.Wolf; import org.bukkit.entity.Wolf.Variant; import org.bukkit.event.EventHandler; @@ -89,9 +95,21 @@ public class CommonListener implements Listener { return; } - // TODO: Implement logic to calculate variant - if (wolf.getWorld().getBiome(wolf.getLocation()).getKey().toString().equalsIgnoreCase("terra:overworld/overworld/taiga")) { - wolf.setVariant(Variant.RUSTY); + // TODO: This is not functional + pack.getBiomeProvider().stream() + .map(biome -> RegistryAccess.registryAccess().getRegistry(RegistryKey.BIOME) + .getOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .get(BukkitBiomeInfo.class) + .vanillaBiomeKey())); + + + Biome biome = wolf.getWorld().getBiome(wolf.getLocation()); + switch(biome.getKey().toString()) { + case "minecraft:snowy_taiga" -> wolf.setVariant(Variant.ASHEN); + case "minecraft:old_growth_pine_taiga" -> wolf.setVariant(Variant.BLACK); + case "minecraft:old_growth_spruce_taiga" -> wolf.setVariant(Variant.CHESTNUT); + case "minecraft:grove" -> wolf.setVariant(Variant.SNOWY); + case "minecraft:forest" -> wolf.setVariant(Variant.WOODS); } } } From d8524603c6d88ddf0b05252f691cab76910b85ed Mon Sep 17 00:00:00 2001 From: Oak Date: Thu, 19 Jun 2025 21:12:24 +0100 Subject: [PATCH 6/8] Implemented wolf variant support --- .../bukkit/listeners/CommonListener.java | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index ff3ade3d5..8486c9d75 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -25,10 +25,8 @@ import com.dfsek.terra.bukkit.hooks.MultiverseGeneratorPluginHook; import com.dfsek.terra.bukkit.world.BukkitBiomeInfo; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; -import io.papermc.paper.registry.RegistryAccess; -import io.papermc.paper.registry.RegistryKey; +import org.bukkit.NamespacedKey; import org.bukkit.World; -import org.bukkit.block.Biome; import org.bukkit.entity.Wolf; import org.bukkit.entity.Wolf.Variant; import org.bukkit.event.EventHandler; @@ -95,21 +93,21 @@ public class CommonListener implements Listener { return; } - // TODO: This is not functional + NamespacedKey biomeKey = wolf.getWorld().getBiome(wolf.getLocation()).getKey(); pack.getBiomeProvider().stream() - .map(biome -> RegistryAccess.registryAccess().getRegistry(RegistryKey.BIOME) - .getOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() - .get(BukkitBiomeInfo.class) - .vanillaBiomeKey())); - - - Biome biome = wolf.getWorld().getBiome(wolf.getLocation()); - switch(biome.getKey().toString()) { - case "minecraft:snowy_taiga" -> wolf.setVariant(Variant.ASHEN); - case "minecraft:old_growth_pine_taiga" -> wolf.setVariant(Variant.BLACK); - case "minecraft:old_growth_spruce_taiga" -> wolf.setVariant(Variant.CHESTNUT); - case "minecraft:grove" -> wolf.setVariant(Variant.SNOWY); - case "minecraft:forest" -> wolf.setVariant(Variant.WOODS); - } + .map(biome -> ((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .get(BukkitBiomeInfo.class) + .vanillaBiomeKey()) + .filter(biomeKey::equals) + .findFirst() + .ifPresent(vanillaBiomeKey -> { + switch(vanillaBiomeKey.toString()) { + case "minecraft:snowy_taiga" -> wolf.setVariant(Variant.ASHEN); + case "minecraft:old_growth_pine_taiga" -> wolf.setVariant(Variant.BLACK); + case "minecraft:old_growth_spruce_taiga" -> wolf.setVariant(Variant.CHESTNUT); + case "minecraft:grove" -> wolf.setVariant(Variant.SNOWY); + case "minecraft:forest" -> wolf.setVariant(Variant.WOODS); + } + }); } } From d71c6bb25f3003e7a1f70c2f539a17a5185445fd Mon Sep 17 00:00:00 2001 From: Oak Date: Thu, 19 Jun 2025 21:22:06 +0100 Subject: [PATCH 7/8] Corrected checks --- .../dfsek/terra/bukkit/listeners/CommonListener.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index 8486c9d75..a79a363da 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -95,12 +95,14 @@ public class CommonListener implements Listener { NamespacedKey biomeKey = wolf.getWorld().getBiome(wolf.getLocation()).getKey(); pack.getBiomeProvider().stream() - .map(biome -> ((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() - .get(BukkitBiomeInfo.class) - .vanillaBiomeKey()) - .filter(biomeKey::equals) + .filter(biome -> ((BukkitPlatformBiome) biome.getPlatformBiome()).getHandle() + .getKey().equals(biomeKey)) .findFirst() - .ifPresent(vanillaBiomeKey -> { + .ifPresent(biome -> { + NamespacedKey vanillaBiomeKey = ((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .get(BukkitBiomeInfo.class) + .vanillaBiomeKey(); + switch(vanillaBiomeKey.toString()) { case "minecraft:snowy_taiga" -> wolf.setVariant(Variant.ASHEN); case "minecraft:old_growth_pine_taiga" -> wolf.setVariant(Variant.BLACK); From 5446b729f91bd9784499bb1c5c527571cd464123 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 19 Jun 2025 21:44:24 +0100 Subject: [PATCH 8/8] Finalised wolves --- .../terra/bukkit/listeners/CommonListener.java | 13 +++++++------ .../dfsek/terra/bukkit/world/BukkitBiomeInfo.java | 2 +- .../terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java | 9 ++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index a79a363da..4c670a7d1 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -95,14 +95,15 @@ public class CommonListener implements Listener { NamespacedKey biomeKey = wolf.getWorld().getBiome(wolf.getLocation()).getKey(); pack.getBiomeProvider().stream() - .filter(biome -> ((BukkitPlatformBiome) biome.getPlatformBiome()).getHandle() - .getKey().equals(biomeKey)) + .filter(biome -> { + NamespacedKey key = ((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .get(BukkitBiomeInfo.class) + .biomeKey(); + return key.equals(biomeKey); + }) .findFirst() .ifPresent(biome -> { - NamespacedKey vanillaBiomeKey = ((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() - .get(BukkitBiomeInfo.class) - .vanillaBiomeKey(); - + NamespacedKey vanillaBiomeKey = ((BukkitPlatformBiome) biome.getPlatformBiome()).getHandle().getKey(); switch(vanillaBiomeKey.toString()) { case "minecraft:snowy_taiga" -> wolf.setVariant(Variant.ASHEN); case "minecraft:old_growth_pine_taiga" -> wolf.setVariant(Variant.BLACK); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java index 8db2a2cfb..7e0499c0c 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeInfo.java @@ -5,4 +5,4 @@ import com.dfsek.terra.api.properties.Properties; import org.bukkit.NamespacedKey; -public record BukkitBiomeInfo(NamespacedKey vanillaBiomeKey) implements Properties {} +public record BukkitBiomeInfo(NamespacedKey biomeKey) implements Properties {} diff --git a/platforms/bukkit/nms/v1_21_6/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21_6/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java index 7e69ebe31..5411fdcac 100644 --- a/platforms/bukkit/nms/v1_21_6/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21_6/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_6/AwfulBukkitHacks.java @@ -56,15 +56,14 @@ public class AwfulBukkitHacks { Biome platform = NMSBiomeInjector.createBiome(biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value(), vanillaBiomeProperties); - ResourceKey delegateKey = ResourceKey.create( - Registries.BIOME, - ResourceLocation.fromNamespaceAndPath("terra", NMSBiomeInjector.createBiomeID(pack, key)) - ); + ResourceLocation delegateMinecraftKey = ResourceLocation.fromNamespaceAndPath("terra", NMSBiomeInjector.createBiomeID(pack, key)); + NamespacedKey delegateBukkitKey = NamespacedKey.fromString(delegateMinecraftKey.toString()); + ResourceKey delegateKey = ResourceKey.create(Registries.BIOME, delegateMinecraftKey); Reference holder = biomeRegistry.register(delegateKey, platform, RegistrationInfo.BUILT_IN); Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. - platformBiome.getContext().put(new BukkitBiomeInfo(vanillaBukkitKey)); + platformBiome.getContext().put(new BukkitBiomeInfo(delegateBukkitKey)); platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location());