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
deleted file mode 100644
index 84d836fd7..000000000
--- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * This file is part of Terra.
- *
- * Terra is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Terra is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Terra. If not, see .
- */
-
-package com.dfsek.terra.bukkit.listeners;
-
-import org.bukkit.event.Listener;
-
-
-/**
- * Listener for events on all implementations.
- */
-public class CommonListener implements Listener {
- public CommonListener() {
- }
-}
diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java
deleted file mode 100644
index 796053e82..000000000
--- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * This file is part of Terra.
- *
- * Terra is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Terra is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Terra. If not, see .
- */
-
-package com.dfsek.terra.bukkit.listeners;
-
-import org.bukkit.entity.Villager;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.Listener;
-import org.bukkit.event.entity.EntitySpawnEvent;
-import org.bukkit.event.entity.VillagerAcquireTradeEvent;
-import org.bukkit.event.entity.VillagerCareerChangeEvent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.dfsek.terra.api.Platform;
-
-
-/**
- * Listener to load on Spigot servers, contains Villager crash prevention and hacky ender eye redirection.
- *
- * (This is currently loaded on all servers; once Paper accepts the StructureLocateEvent PR this will only be loaded on servers without
- * StructureLocateEvent).
- */
-public class SpigotListener implements Listener {
- private static final Logger logger = LoggerFactory.getLogger(SpigotListener.class);
- private final Platform platform;
-
- public SpigotListener(Platform platform) {
- this.platform = platform;
- }
-
- @EventHandler(priority = EventPriority.NORMAL)
- public void onEnderEye(EntitySpawnEvent e) {
-/*
- Entity entity = e.getEntity();
- if(e.getEntityType() == EntityType.ENDER_SIGNAL) {
- logger.info("Detected Ender Signal...");
- World w = BukkitAdapter.adapt(e.getEntity().getWorld());
- EnderSignal signal = (EnderSignal) entity;
- ConfiguredStructure config = tw.getConfig().getRegistry(TerraStructure.class).get(w.getConfig().getLocatable().get
- ("STRONGHOLD"));
- if(config != null) {
- logger.info("Overriding Ender Signal...");
- AsyncStructureFinder finder = new AsyncStructureFinder(tw.getBiomeProvider(), config, BukkitAdapter.adapt(e.getLocation()
- .toVector()), tw.getWorld(), 0, 500, location -> {
- if(location != null)
- signal.setTargetLocation(BukkitAdapter.adapt(location).toLocation(e.getLocation().getWorld()));
- logger.info("Location: {}", location);
- }, main);
- finder.run(); // Do this synchronously so eye doesn't change direction several ticks after spawning.
- } else
- logger.warn("No overrides are defined for Strongholds. Ender Signals will not work correctly.");
- }
-*/
- }
-
- @EventHandler
- public void onCartographerChange(VillagerAcquireTradeEvent e) {
- if(!(e.getEntity() instanceof Villager))
- return;
- if(((Villager) e.getEntity()).getProfession() == Villager.Profession.CARTOGRAPHER) {
- logger.error("""
- .------------------------------------------------------------------------.
- | Prevented server crash by stopping Cartographer villager from |
- | spawning. Please upgrade to Paper, which has a StructureLocateEvent |
- | that fixes this issue at the source, and doesn't require us to do |
- | stupid band-aids. |
- |------------------------------------------------------------------------|
- """.strip());
- e.setCancelled(true); // Cancel leveling if the villager is a Cartographer, to prevent crashing server.
- }
- }
-
- @EventHandler
- public void onCartographerLevel(VillagerCareerChangeEvent e) {
- if(e.getProfession() == Villager.Profession.CARTOGRAPHER) {
- logger.error("""
- .------------------------------------------------------------------------.
- | Prevented server crash by stopping Cartographer villager from leveling |
- | up. Please upgrade to Paper, which has a StructureLocateEvent that |
- | fixes this issue at the source, and doesn't require us to do stupid |
- | band-aids. |
- |------------------------------------------------------------------------|
- """.strip());
- e.getEntity().setProfession(Villager.Profession.NITWIT); // Give villager new profession to prevent server crash.
- e.setCancelled(true);
- }
- }
-}
diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java
index 851333a4c..f2e4b30dd 100644
--- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java
+++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java
@@ -1,7 +1,5 @@
package com.dfsek.terra.bukkit.nms.v1_19_R1;
-import com.dfsek.terra.bukkit.nms.v1_19_R1.config.VanillaBiomeProperties;
-
import com.google.common.collect.ImmutableMap;
import com.mojang.serialization.Lifecycle;
import net.minecraft.core.Holder;
@@ -24,6 +22,9 @@ import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import com.dfsek.terra.api.structure.configured.ConfiguredStructure;
+import com.dfsek.terra.api.util.collection.ProbabilityCollection;
+import com.dfsek.terra.bukkit.nms.v1_19_R1.config.VanillaBiomeProperties;
import com.dfsek.terra.bukkit.world.BukkitPlatformBiome;
import com.dfsek.terra.registry.master.ConfigRegistry;
@@ -31,6 +32,9 @@ import com.dfsek.terra.registry.master.ConfigRegistry;
public class AwfulBukkitHacks {
private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class);
+ public static final Map, Map>>
+ TERRA_BIOME_FERTILIZABLE_MAP = new HashMap<>();
public static final Map, List>
TERRA_BIOME_TAG_MAP = new HashMap<>();
@@ -56,16 +60,19 @@ public class AwfulBukkitHacks {
BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform);
biomeRegistry.register(delegateKey, platform, Lifecycle.stable());
platformBiome.getContext().put(new NMSBiomeInfo(delegateKey));
-
+
Map villagerMap = Reflection.VILLAGER_TYPE.getByBiome();
villagerMap.put(ResourceKey.create(Registry.BIOME_REGISTRY, delegateKey.location()),
Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), VillagerType.PLAINS));
+ TERRA_BIOME_FERTILIZABLE_MAP.put(Holder.direct(platform), vanillaBiomeProperties.getFertilizables());
+
for(ResourceLocation tag : vanillaBiomeProperties.getTags()) {
- TERRA_BIOME_TAG_MAP.getOrDefault(TagKey.create(Registry.BIOME_REGISTRY, tag), new ArrayList<>()).add(delegateKey.location());
+ TERRA_BIOME_TAG_MAP.getOrDefault(TagKey.create(Registry.BIOME_REGISTRY, tag), new ArrayList<>()).add(
+ delegateKey.location());
}
-
+
LOGGER.debug("Registered biome: " + delegateKey);
} catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
throw new RuntimeException(e);
diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInjectListener.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInjectListener.java
index d57689a9b..f22430a84 100644
--- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInjectListener.java
+++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInjectListener.java
@@ -1,21 +1,31 @@
package com.dfsek.terra.bukkit.nms.v1_19_R1;
+import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.chunk.ChunkGenerator;
import org.bukkit.World;
+import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockGrowEvent;
+import org.bukkit.event.world.StructureGrowEvent;
import org.bukkit.event.world.WorldInitEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet;
+import java.util.Random;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
import com.dfsek.terra.api.config.ConfigPack;
+import com.dfsek.terra.api.util.vector.Vector3Int;
+import com.dfsek.terra.api.world.ServerWorld;
import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper;
+import com.dfsek.terra.bukkit.nms.v1_19_R1.util.FertilizableUtil;
+import com.dfsek.terra.bukkit.world.BukkitAdapter;
public class NMSInjectListener implements Listener {
@@ -38,14 +48,30 @@ public class NMSInjectListener implements Listener {
ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator();
NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed());
NMSChunkGeneratorDelegate custom = new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed());
-
+
custom.conf = vanilla.conf; // world config from Spigot
-
+
serverWorld.getChunkSource().chunkMap.generator = custom;
-
+
LOGGER.info("Successfully injected into world.");
-
+
INJECT_LOCK.unlock();
}
}
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onBlockGrow(BlockGrowEvent event) {
+ Block block = event.getBlock();
+ Vector3Int pos = Vector3Int.of(block.getX(), block.getY(), block.getZ());
+ ServerWorld world = BukkitAdapter.adapt(block.getWorld());
+ event.setCancelled(FertilizableUtil.grow(world, new Random(), pos, ResourceLocation.tryParse(block.getType().getKey().asString())));
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onStructureGow(StructureGrowEvent event) {
+ Block block = event.getLocation().getBlock();
+ Vector3Int pos = Vector3Int.of(block.getX(), block.getY(), block.getZ());
+ ServerWorld world = BukkitAdapter.adapt(block.getWorld());
+ event.setCancelled(FertilizableUtil.grow(world, new Random(), pos, ResourceLocation.tryParse(block.getType().getKey().asString())));
+ }
}
diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VanillaBiomeProperties.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VanillaBiomeProperties.java
index ebe54c996..fd624c6c1 100644
--- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VanillaBiomeProperties.java
+++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VanillaBiomeProperties.java
@@ -15,13 +15,21 @@ import net.minecraft.world.level.biome.Biome.TemperatureModifier;
import net.minecraft.world.level.biome.BiomeSpecialEffects.GrassColorModifier;
import net.minecraft.world.level.biome.MobSpawnSettings;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
import com.dfsek.terra.api.properties.Properties;
+import com.dfsek.terra.api.structure.configured.ConfiguredStructure;
+import com.dfsek.terra.api.util.collection.ProbabilityCollection;
public class VanillaBiomeProperties implements ConfigTemplate, Properties {
+ @Value("minecraft.fertilizables")
+ @Default
+ private Map> fertilizables = Collections.emptyMap();
+
@Value("minecraft.tags")
@Default
private List tags = null;
@@ -98,6 +106,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
@Default
private VillagerType villagerType = null;
+ public Map> getFertilizables() {
+ return fertilizables;
+ }
+
public List getTags() {
return tags;
}
diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/util/FertilizableUtil.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/util/FertilizableUtil.java
new file mode 100644
index 000000000..caa936035
--- /dev/null
+++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/util/FertilizableUtil.java
@@ -0,0 +1,29 @@
+package com.dfsek.terra.bukkit.nms.v1_19_R1.util;
+
+import net.minecraft.resources.ResourceLocation;
+
+import java.util.Map;
+import java.util.Random;
+
+import com.dfsek.terra.api.structure.configured.ConfiguredStructure;
+import com.dfsek.terra.api.util.Rotation;
+import com.dfsek.terra.api.util.collection.ProbabilityCollection;
+import com.dfsek.terra.api.util.vector.Vector3Int;
+import com.dfsek.terra.api.world.ServerWorld;
+import com.dfsek.terra.bukkit.nms.v1_19_R1.AwfulBukkitHacks;
+
+
+public class FertilizableUtil {
+ public static boolean grow(ServerWorld world, Random random, Vector3Int pos, ResourceLocation block) {
+ Map> fertilizables = AwfulBukkitHacks.TERRA_BIOME_FERTILIZABLE_MAP.get(world.getBiomeProvider().getBiome(pos, world.getSeed()));
+ if (fertilizables != null) {
+ ProbabilityCollection probabilityCollection = fertilizables.get(block);
+ if (probabilityCollection != null) {
+ ConfiguredStructure structure = probabilityCollection.get(random);
+ structure.getStructure().get(random).generate(pos, world, random, Rotation.NONE);
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/ASMUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/ASMUtil.java
similarity index 98%
rename from platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/ASMUtil.java
rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/ASMUtil.java
index 918c398b1..d424331c2 100644
--- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/ASMUtil.java
+++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/ASMUtil.java
@@ -1,4 +1,4 @@
-package com.dfsek.terra.lifecycle.util;
+package com.dfsek.terra.mod.util;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.tree.ClassNode;
diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/asm/FertilizableASM.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/asm/FertilizableASM.java
index 1f32e2d99..ff6bb8a07 100644
--- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/asm/FertilizableASM.java
+++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/asm/FertilizableASM.java
@@ -1,7 +1,5 @@
package com.dfsek.terra.lifecycle.asm;
-import com.dfsek.terra.mod.util.FertilizableUtil;
-
import net.gudenau.minecraft.asm.api.v1.Identifier;
import net.gudenau.minecraft.asm.api.v1.Transformer;
import org.objectweb.asm.Opcodes;
@@ -12,13 +10,13 @@ import org.objectweb.asm.tree.JumpInsnNode;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.VarInsnNode;
import java.io.IOException;
-import com.dfsek.terra.lifecycle.util.ASMUtil;
import com.dfsek.terra.lifecycle.util.LoaderUtil;
-
-import org.objectweb.asm.tree.VarInsnNode;
+import com.dfsek.terra.mod.util.ASMUtil;
+import com.dfsek.terra.mod.util.FertilizableUtil;
import static org.objectweb.asm.Opcodes.ACC_STATIC;