From 81eab13ce1c59cb50a527d4d301b265403f758fe Mon Sep 17 00:00:00 2001 From: Christian Bergschneider Date: Thu, 19 Jun 2025 01:42:31 +0200 Subject: [PATCH 01/11] feat: backport latest minestom support from 7.0 branch --- buildSrc/src/main/kotlin/Versions.kt | 2 +- .../terra/minestom/MinestomPlatform.java | 2 +- .../minestom/biome/MinestomBiomeLoader.java | 4 +- .../block/DefaultBlockEntityFactory.java | 8 ++- .../minestom/block/MinestomBlockEntity.java | 57 +++++++++++++++++++ .../minestom/block/MinestomBlockState.java | 33 +++-------- .../minestom/entity/MinestomEntityType.java | 2 +- .../minestom/item/MinestomEnchantment.java | 30 +++++----- .../minestom/item/MinestomItemHandle.java | 2 +- .../minestom/item/MinestomItemStack.java | 13 ++--- .../terra/minestom/item/MinestomMaterial.java | 2 +- .../world/TerraMinestomWorldBuilder.java | 7 ++- 12 files changed, 106 insertions(+), 56 deletions(-) create mode 100644 platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockEntity.java diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 3996cab0b..4a8c0faf9 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -88,6 +88,6 @@ object Versions { } object Minestom { - const val minestom = "187931e50b" + const val minestom = "1_21_6-c3ccee696b" } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomPlatform.java index 7e6c6e0b5..4a77649fc 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomPlatform.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/MinestomPlatform.java @@ -52,7 +52,7 @@ public final class MinestomPlatform extends AbstractPlatform { if(world.generator() instanceof MinestomChunkGeneratorWrapper wrapper) { getConfigRegistry().get(wrapper.getPack().getRegistryKey()).ifPresent(pack -> { wrapper.setPack(pack); - LOGGER.info("Replaced pack in chunk generator for instance {}", world.getUniqueId()); + LOGGER.info("Replaced pack in chunk generator for instance {}", world.getUuid()); }); } }); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java index 9cb3eb960..92ea8f0f7 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java @@ -7,9 +7,9 @@ import com.dfsek.tectonic.api.loader.type.TypeLoader; import com.dfsek.terra.api.world.biome.PlatformBiome; +import net.kyori.adventure.key.Key; import net.minestom.server.MinecraftServer; import net.minestom.server.registry.DynamicRegistry; -import net.minestom.server.utils.NamespaceID; import net.minestom.server.world.biome.Biome; import org.jetbrains.annotations.NotNull; @@ -23,7 +23,7 @@ public class MinestomBiomeLoader implements TypeLoader { public PlatformBiome load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { String id = (String) o; - NamespaceID biomeID = NamespaceID.from(id); + Key biomeID = Key.key(id); Biome biome = biomeRegistry.get(biomeID); if(biome == null) throw new LoadException("Biome %s does not exist in registry".formatted(id), depthTracker); return new MinestomBiome(biome); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/DefaultBlockEntityFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/DefaultBlockEntityFactory.java index dbcbf2833..559736b6a 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/DefaultBlockEntityFactory.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/DefaultBlockEntityFactory.java @@ -4,11 +4,17 @@ import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.minestom.api.BlockEntityFactory; import net.minestom.server.coordinate.BlockVec; +import net.minestom.server.instance.Instance; public class DefaultBlockEntityFactory implements BlockEntityFactory { + private final Instance instance; + public DefaultBlockEntityFactory(Instance instance) { + this.instance = instance; + } + @Override public BlockEntity createBlockEntity(BlockVec position) { - return null; + return new MinestomBlockEntity(instance, position); } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockEntity.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockEntity.java new file mode 100644 index 000000000..3e89509fa --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockEntity.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.minestom.block; + +import com.dfsek.terra.api.util.vector.Vector3; + +import net.minestom.server.coordinate.BlockVec; +import net.minestom.server.instance.Instance; +import net.minestom.server.instance.block.Block; + +import com.dfsek.terra.api.block.entity.BlockEntity; +import com.dfsek.terra.api.block.state.BlockState; + +public class MinestomBlockEntity implements BlockEntity { + private final Instance instance; + private final BlockVec position; + private final Vector3 positionVec; + + public MinestomBlockEntity(Instance instance, BlockVec position) { + this.instance = instance; + this.position = position; + this.positionVec = Vector3.of(position.blockX(), position.blockY(), position.blockZ()); + } + + @Override + public boolean update(boolean applyPhysics) { + return false; + } + + @Override + public Vector3 getPosition() { + return positionVec; + } + + @Override + public int getX() { + return position.blockX(); + } + + @Override + public int getY() { + return position.blockY(); + } + + @Override + public int getZ() { + return position.blockZ(); + } + + @Override + public BlockState getBlockState() { + return new MinestomBlockState(instance.getBlock(position)); + } + + @Override + public Block getHandle() { + return instance.getBlock(position); + } +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java index 01bad55fa..991996380 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java @@ -1,15 +1,14 @@ package com.dfsek.terra.minestom.block; +import net.minestom.server.instance.block.Block; + +import java.util.Objects; +import java.util.stream.Collectors; + import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.properties.Property; -import net.minestom.server.instance.block.Block; - -import java.util.HashMap; -import java.util.Objects; -import java.util.stream.Collectors; - public class MinestomBlockState implements BlockState { private final Block block; @@ -23,24 +22,10 @@ public class MinestomBlockState implements BlockState { } public MinestomBlockState(String data) { - if(!data.contains("[")) { - block = Block.fromNamespaceId(data); - return; + block = Block.fromState(data); + if (block == null) { + throw new IllegalArgumentException("Invalid block state: " + data); } - - String[] split = data.split("\\["); - String namespaceId = split[0]; - String properties = split[1].substring(0, split[1].length() - 1); - Block block = Block.fromNamespaceId(namespaceId); - HashMap propertiesMap = new HashMap<>(); - - for(String property : properties.split(",")) { - String[] kv = property.split("="); - propertiesMap.put(kv[0].strip(), kv[1].strip()); - } - - assert block != null; - this.block = block.withProperties(propertiesMap); } @Override @@ -70,7 +55,7 @@ public class MinestomBlockState implements BlockState { @Override public String getAsString(boolean properties) { - String name = block.namespace().asString(); + String name = block.key().asString(); if(!properties || block.properties().isEmpty()) { return name; } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntityType.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntityType.java index 60fbac5d9..fbcd2a9f0 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntityType.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/MinestomEntityType.java @@ -8,7 +8,7 @@ public class MinestomEntityType implements com.dfsek.terra.api.entity.EntityType private final EntityType delegate; public MinestomEntityType(String id) { - delegate = EntityType.fromNamespaceId(id); + delegate = EntityType.fromKey(id); } @Override diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomEnchantment.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomEnchantment.java index 0ef720b31..ca32a8dc9 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomEnchantment.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomEnchantment.java @@ -5,47 +5,47 @@ import com.dfsek.terra.api.inventory.item.Enchantment; import net.minestom.server.MinecraftServer; import net.minestom.server.item.Material; -import net.minestom.server.utils.NamespaceID; - -import java.util.Objects; +import net.minestom.server.registry.DynamicRegistry; +import net.minestom.server.registry.RegistryKey; public class MinestomEnchantment implements Enchantment { - private final net.minestom.server.item.enchant.Enchantment delegate; - private final String id; + private final net.minestom.server.item.enchant.Enchantment registryItem; + private final RegistryKey id; + private static final DynamicRegistry enchantmentRegistry = + MinecraftServer.getEnchantmentRegistry(); - public MinestomEnchantment(net.minestom.server.item.enchant.Enchantment delegate) { - this.delegate = delegate; - id = Objects.requireNonNull(delegate.registry()).raw(); + public MinestomEnchantment(RegistryKey id) { + this.id = id; + this.registryItem = enchantmentRegistry.get(id); } public MinestomEnchantment(String id) { - this.delegate = MinecraftServer.getEnchantmentRegistry().get(NamespaceID.from(id)); - this.id = id; + this(RegistryKey.unsafeOf(id)); } @Override public boolean canEnchantItem(ItemStack itemStack) { - return delegate.supportedItems().contains((Material) itemStack.getType().getHandle()); + return registryItem.supportedItems().contains((Material) itemStack.getType().getHandle()); } @Override public boolean conflictsWith(Enchantment other) { - return delegate.exclusiveSet().contains(NamespaceID.from(((MinestomEnchantment) other).id)); + return registryItem.exclusiveSet().contains(((MinestomEnchantment) other).id); } @Override public String getID() { - return id; + return id.name(); } @Override public int getMaxLevel() { - return delegate.maxLevel(); + return registryItem.maxLevel(); } @Override public net.minestom.server.item.enchant.Enchantment getHandle() { - return delegate; + return registryItem; } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemHandle.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemHandle.java index c31983ed3..a4ff0c344 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemHandle.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemHandle.java @@ -23,6 +23,6 @@ public class MinestomItemHandle implements ItemHandle { @Override public Set getEnchantments() { - return MinecraftServer.getEnchantmentRegistry().values().stream().map(MinestomEnchantment::new).collect(Collectors.toSet()); + return MinecraftServer.getEnchantmentRegistry().keys().stream().map(MinestomEnchantment::new).collect(Collectors.toSet()); } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemStack.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemStack.java index 2b488a8c8..1da6cba76 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemStack.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomItemStack.java @@ -6,11 +6,11 @@ import com.dfsek.terra.api.inventory.item.Enchantment; import com.dfsek.terra.api.inventory.item.ItemMeta; import net.minestom.server.MinecraftServer; -import net.minestom.server.item.ItemComponent; +import net.minestom.server.component.DataComponents; import net.minestom.server.item.ItemStack; import net.minestom.server.item.component.EnchantmentList; import net.minestom.server.registry.DynamicRegistry; -import net.minestom.server.registry.DynamicRegistry.Key; +import net.minestom.server.registry.RegistryKey; import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -47,11 +47,10 @@ public class MinestomItemStack implements com.dfsek.terra.api.inventory.ItemStac @Override public ItemMeta getItemMeta() { HashMap enchantments = new HashMap<>(); - EnchantmentList enchantmentList = base.get(ItemComponent.ENCHANTMENTS); + EnchantmentList enchantmentList = base.get(DataComponents.ENCHANTMENTS); if(enchantmentList != null) { enchantmentList.enchantments().forEach((enchantmentKey, integer) -> { - enchantments.put( - new MinestomEnchantment(Objects.requireNonNull(MinecraftServer.getEnchantmentRegistry().get(enchantmentKey))), integer); + enchantments.put(new MinestomEnchantment(enchantmentKey), integer); }); } return new MinestomItemMeta(enchantments); @@ -59,7 +58,7 @@ public class MinestomItemStack implements com.dfsek.terra.api.inventory.ItemStac @Override public void setItemMeta(ItemMeta meta) { - HashMap, Integer> enchantments = new HashMap<>(); + HashMap, Integer> enchantments = new HashMap<>(); DynamicRegistry registry = MinecraftServer.getEnchantmentRegistry(); meta.getEnchantments().forEach((key, value) -> { MinestomEnchantment enchantment = (MinestomEnchantment) key; @@ -67,6 +66,6 @@ public class MinestomItemStack implements com.dfsek.terra.api.inventory.ItemStac }); EnchantmentList list = new EnchantmentList(enchantments); - base = base.with(ItemComponent.ENCHANTMENTS, list); + base = base.with(DataComponents.ENCHANTMENTS, list); } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomMaterial.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomMaterial.java index 6bd0a1908..fea36bbb9 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomMaterial.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/item/MinestomMaterial.java @@ -14,7 +14,7 @@ public class MinestomMaterial implements Item { } public MinestomMaterial(String id) { - this.delegate = Material.fromNamespaceId(id); + this.delegate = Material.fromKey(id); } @Override diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java index 46ae1691c..d73e7ba54 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java @@ -22,9 +22,12 @@ public class TerraMinestomWorldBuilder { private ConfigPack pack; private long seed = new Random().nextLong(); private EntityFactory entityFactory = new DefaultEntityFactory(); - private BlockEntityFactory blockEntityFactory = new DefaultBlockEntityFactory(); + private BlockEntityFactory blockEntityFactory; - private TerraMinestomWorldBuilder(Instance instance) { this.instance = instance; } + private TerraMinestomWorldBuilder(Instance instance) { + this.instance = instance; + this.blockEntityFactory = new DefaultBlockEntityFactory(instance); + } public static TerraMinestomWorldBuilder from(Instance instance) { return new TerraMinestomWorldBuilder(instance); From 85b6dcc89186d4311b5187d129dd963421ef2407 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 19 Jun 2025 14:24:04 +0100 Subject: [PATCH 02/11] Moved all code that requires Multiverse imports into MultiverseGeneratorPluginHook --- .../terra/bukkit/hooks/MultiverseGeneratorPluginHook.java | 6 ++++++ .../com/dfsek/terra/bukkit/listeners/CommonListener.java | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/hooks/MultiverseGeneratorPluginHook.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/hooks/MultiverseGeneratorPluginHook.java index a4a81d7f8..1d59c967f 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/hooks/MultiverseGeneratorPluginHook.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/hooks/MultiverseGeneratorPluginHook.java @@ -3,6 +3,7 @@ package com.dfsek.terra.bukkit.hooks; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.registry.key.Keyed; +import org.mvplugins.multiverse.core.MultiverseCoreApi; import org.mvplugins.multiverse.core.world.generators.GeneratorPlugin; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.external.jetbrains.annotations.Nullable; @@ -44,4 +45,9 @@ public final class MultiverseGeneratorPluginHook implements GeneratorPlugin { public @NotNull String getPluginName() { return "Terra"; } + + public static void register(Platform platform) { + MultiverseCoreApi.get().getGeneratorProvider() + .registerGeneratorPlugin(new MultiverseGeneratorPluginHook(platform)); + } } 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 522a6aa2a..bc48a7277 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 @@ -23,7 +23,6 @@ import com.dfsek.terra.bukkit.hooks.MultiverseGeneratorPluginHook; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.server.PluginEnableEvent; -import org.mvplugins.multiverse.core.MultiverseCoreApi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,8 +43,7 @@ public class CommonListener implements Listener { if(event.getPlugin().getName().equals("Multiverse-Core")) { try { Class.forName("org.mvplugins.multiverse.core.MultiverseCoreApi"); - MultiverseCoreApi.get().getGeneratorProvider() - .registerGeneratorPlugin(new MultiverseGeneratorPluginHook(platform)); + MultiverseGeneratorPluginHook.register(platform); } catch(ClassNotFoundException e) { logger.debug("Multiverse v5 is not installed."); } catch(IllegalStateException e) { From ad9d16f48c869515ffc01552db61005a3e240a02 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 19 Jun 2025 15:46:18 +0100 Subject: [PATCH 03/11] 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 04/11] 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 8cfa2e1467ab81a1c7437c5a377634be8ff7e4bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Thu, 19 Jun 2025 12:23:59 -0600 Subject: [PATCH 05/11] bump version --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a101c2773..722a59e4b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ preRelease(true) -versionProjects(":common:api", version("6.6.4")) -versionProjects(":common:implementation", version("6.6.4")) -versionProjects(":platforms", version("6.6.4")) +versionProjects(":common:api", version("6.6.5")) +versionProjects(":common:implementation", version("6.6.5")) +versionProjects(":platforms", version("6.6.5")) allprojects { From 7a041d8a6364b3f53e45e9d19f89878894d16a64 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 19 Jun 2025 20:49:37 +0100 Subject: [PATCH 06/11] 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 07/11] 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 08/11] 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 09/11] 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 10/11] 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 11/11] 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());