diff --git a/build.gradle.kts b/build.gradle.kts index 8ae1e205f..5caa726ac 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("4", "1", "0", true) +val versionObj = Version("4", "2", "0", true) allprojects { version = versionObj diff --git a/common/src/main/java/com/dfsek/terra/api/core/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/core/TerraPlugin.java index 85237e801..397176b19 100644 --- a/common/src/main/java/com/dfsek/terra/api/core/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/core/TerraPlugin.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.core; import com.dfsek.terra.api.LoaderRegistrar; +import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; @@ -50,4 +51,6 @@ public interface TerraPlugin extends LoaderRegistrar { } DebugLogger getDebugLogger(); + + EventManager getEventManager(); } diff --git a/common/src/main/java/com/dfsek/terra/api/core/event/TerraEventManager.java b/common/src/main/java/com/dfsek/terra/api/core/event/TerraEventManager.java index 9baaf9982..5030eb9f2 100644 --- a/common/src/main/java/com/dfsek/terra/api/core/event/TerraEventManager.java +++ b/common/src/main/java/com/dfsek/terra/api/core/event/TerraEventManager.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.util.ReflectionUtil; import java.io.PrintWriter; import java.io.StringWriter; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; @@ -23,17 +24,23 @@ public class TerraEventManager implements EventManager { public void callEvent(Event event) { if(!listeners.containsKey(event.getClass())) return; listeners.get(event.getClass()).forEach((eventListener, methods) -> methods.forEach(method -> { - try { - method.invoke(eventListener, event); - } catch(Exception e) { - StringWriter writer = new StringWriter(); - e.printStackTrace(new PrintWriter(writer)); - main.getLogger().warning("Exception occurred during event handling:"); - main.getLogger().warning(writer.toString()); - main.getLogger().warning("Report this to the maintainers of " + eventListener.getClass().getCanonicalName()); - - } - })); + try { + method.invoke(eventListener, event); + } catch(InvocationTargetException e) { + StringWriter writer = new StringWriter(); + e.getTargetException().printStackTrace(new PrintWriter(writer)); + main.getLogger().warning("Exception occurred during event handling:"); + main.getLogger().warning(writer.toString()); + main.getLogger().warning("Report this to the maintainers of " + eventListener.getClass().getCanonicalName()); + } catch(Exception e) { + StringWriter writer = new StringWriter(); + e.printStackTrace(new PrintWriter(writer)); + main.getLogger().warning("Exception occurred during event handling:"); + main.getLogger().warning(writer.toString()); + main.getLogger().warning("Report this to the maintainers of " + eventListener.getClass().getCanonicalName()); + } + }) + ); } @SuppressWarnings("unchecked") diff --git a/common/src/main/java/com/dfsek/terra/api/core/event/events/config/ConfigPackLoadEvent.java b/common/src/main/java/com/dfsek/terra/api/core/event/events/config/ConfigPackLoadEvent.java new file mode 100644 index 000000000..9b0766e5a --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/core/event/events/config/ConfigPackLoadEvent.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.api.core.event.events.config; + +import com.dfsek.terra.api.core.event.Event; +import com.dfsek.terra.config.pack.ConfigPack; + +public abstract class ConfigPackLoadEvent implements Event { + private final ConfigPack pack; + + public ConfigPackLoadEvent(ConfigPack pack) { + this.pack = pack; + } + + public ConfigPack getPack() { + return pack; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/core/event/events/config/ConfigPackPostLoadEvent.java b/common/src/main/java/com/dfsek/terra/api/core/event/events/config/ConfigPackPostLoadEvent.java new file mode 100644 index 000000000..838f0e22a --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/core/event/events/config/ConfigPackPostLoadEvent.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.api.core.event.events.config; + +import com.dfsek.terra.config.pack.ConfigPack; + +/** + * Called when a config pack has finished loading. + */ +public class ConfigPackPostLoadEvent extends ConfigPackLoadEvent { + public ConfigPackPostLoadEvent(ConfigPack pack) { + super(pack); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/core/event/events/config/ConfigPackPreLoadEvent.java b/common/src/main/java/com/dfsek/terra/api/core/event/events/config/ConfigPackPreLoadEvent.java new file mode 100644 index 000000000..e2d72d17d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/core/event/events/config/ConfigPackPreLoadEvent.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.api.core.event.events.config; + +import com.dfsek.terra.config.pack.ConfigPack; + +/** + * Called before a config pack's registries are filled. At this point, the pack manifest has been loaded, and all registries are empty. + */ +public class ConfigPackPreLoadEvent extends ConfigPackLoadEvent { + public ConfigPackPreLoadEvent(ConfigPack pack) { + super(pack); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/core/event/events/world/TerraWorldLoadEvent.java b/common/src/main/java/com/dfsek/terra/api/core/event/events/world/TerraWorldLoadEvent.java new file mode 100644 index 000000000..51b01d290 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/core/event/events/world/TerraWorldLoadEvent.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.api.core.event.events.world; + +import com.dfsek.terra.api.core.event.Event; +import com.dfsek.terra.world.TerraWorld; + +/** + * Called upon initialization of a TerraWorld. + */ +public class TerraWorldLoadEvent implements Event { + private final TerraWorld world; + + public TerraWorldLoadEvent(TerraWorld world) { + this.world = world; + } + + public TerraWorld getWorld() { + return world; + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java index 257361acd..5ff19e287 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java @@ -8,6 +8,8 @@ import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.core.TerraPlugin; +import com.dfsek.terra.api.core.event.events.config.ConfigPackPostLoadEvent; +import com.dfsek.terra.api.core.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.util.seeded.NoiseSeeded; @@ -195,6 +197,7 @@ public class ConfigPack implements LoaderRegistrar { } private void load(long start, TerraPlugin main) throws ConfigException { + main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this)); main.packPreLoadCallback(this); for(Map.Entry var : template.getVariables().entrySet()) { varScope.create(var.getKey(), var.getValue()); @@ -228,6 +231,8 @@ public class ConfigPack implements LoaderRegistrar { .open("flora", ".yml").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close(); main.packPostLoadCallback(this); + + main.getEventManager().callEvent(new ConfigPackPostLoadEvent(this)); LangUtil.log("config-pack.loaded", Level.INFO, template.getID(), String.valueOf((System.nanoTime() - start) / 1000000D), template.getAuthor(), template.getVersion()); } diff --git a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java index 936582d38..e9442141a 100644 --- a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java @@ -1,6 +1,7 @@ package com.dfsek.terra.world; import com.dfsek.terra.api.core.TerraPlugin; +import com.dfsek.terra.api.core.event.events.world.TerraWorldLoadEvent; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.BlockData; @@ -30,6 +31,7 @@ public class TerraWorld { this.provider = config.getBiomeProviderBuilder().build(w.getSeed()); this.world = w; air = main.getWorldHandle().createBlockData("minecraft:air"); + main.getEventManager().callEvent(new TerraWorldLoadEvent(this)); safe = true; } diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java index f54a59fef..3d2d32dcc 100644 --- a/common/src/test/java/biome/DistributionTest.java +++ b/common/src/test/java/biome/DistributionTest.java @@ -10,6 +10,7 @@ import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.core.TerraPlugin; +import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; @@ -126,6 +127,11 @@ public class DistributionTest { return new DebugLogger(Logger.getLogger("Terra")); } + @Override + public EventManager getEventManager() { + return null; + } + @Override public void register(TypeRegistry registry) { diff --git a/common/src/test/java/event/EventTest.java b/common/src/test/java/event/EventTest.java index b16498277..1e9e8a0f7 100644 --- a/common/src/test/java/event/EventTest.java +++ b/common/src/test/java/event/EventTest.java @@ -4,8 +4,8 @@ import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.core.TerraPlugin; import com.dfsek.terra.api.core.event.Event; import com.dfsek.terra.api.core.event.EventListener; +import com.dfsek.terra.api.core.event.EventManager; import com.dfsek.terra.api.core.event.TerraEventManager; -import com.dfsek.terra.api.core.event.annotations.Listener; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; @@ -22,6 +22,7 @@ import java.util.logging.Logger; public class EventTest { public TerraPlugin main = new TerraPlugin() { private final Logger logger = Logger.getLogger("Terra"); + private final EventManager eventManager = new TerraEventManager(this); @Override public WorldHandle getWorldHandle() { @@ -97,11 +98,16 @@ public class EventTest { public void register(TypeRegistry registry) { } + + @Override + public EventManager getEventManager() { + return eventManager; + } }; @Test public void eventTest() { - TerraEventManager eventManager = new TerraEventManager(main); + EventManager eventManager = main.getEventManager(); eventManager.registerListener(new TestListener()); eventManager.registerListener(new TestListener2()); @@ -110,26 +116,23 @@ public class EventTest { eventManager.registerListener(new TestListenerException()); - TestEvent event2 = new TestEvent(4); + TestEvent event2 = new TestEvent(5); eventManager.callEvent(event2); } static class TestListener implements EventListener { - @Listener public void doThing(TestEvent event) { System.out.println("Event value: " + event.value); } } static class TestListener2 implements EventListener { - @Listener public void doThing(TestEvent event) { System.out.println("Event value 2: " + event.value); } } static class TestListenerException implements EventListener { - @Listener public void doThing(TestEvent event) { throw new RuntimeException("bazinga: " + event.value); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 497e06ad8..5cfe055d8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -2,6 +2,8 @@ package com.dfsek.terra.bukkit; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.core.TerraPlugin; +import com.dfsek.terra.api.core.event.EventManager; +import com.dfsek.terra.api.core.event.TerraEventManager; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.handle.ItemHandle; @@ -56,6 +58,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { private final GenericLoaders genericLoaders = new GenericLoaders(this); private DebugLogger debugLogger; + private final EventManager eventManager = new TerraEventManager(this); + public static final Version BUKKIT_VERSION; static { @@ -111,6 +115,11 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { return debugLogger; } + @Override + public EventManager getEventManager() { + return eventManager; + } + @Override public void onDisable() { BukkitChunkGeneratorWrapper.saveAll(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index bb40d30cd..822902e40 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -2,6 +2,8 @@ package com.dfsek.terra.fabric; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.core.TerraPlugin; +import com.dfsek.terra.api.core.event.EventManager; +import com.dfsek.terra.api.core.event.TerraEventManager; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.handle.ItemHandle; @@ -68,6 +70,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final Map worldMap = new HashMap<>(); private static TerraFabricPlugin instance; + private final EventManager eventManager = new TerraEventManager(this); + public static TerraFabricPlugin getInstance() { return instance; } @@ -285,4 +289,9 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } } + + @Override + public EventManager getEventManager() { + return eventManager; + } } diff --git a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java index aa76db4f7..c933025c0 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java +++ b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java @@ -2,6 +2,8 @@ package com.dfsek.terra; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.core.TerraPlugin; +import com.dfsek.terra.api.core.event.EventManager; +import com.dfsek.terra.api.core.event.TerraEventManager; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.handle.ItemHandle; @@ -26,6 +28,7 @@ public class StandalonePlugin implements TerraPlugin { private final ConfigRegistry registry = new ConfigRegistry(); private final PluginConfig config = new PluginConfig(); private final RawWorldHandle worldHandle = new RawWorldHandle(); + private final EventManager eventManager = new TerraEventManager(this); @Override public WorldHandle getWorldHandle() { @@ -115,4 +118,9 @@ public class StandalonePlugin implements TerraPlugin { registry.loadAll(this); config.load(this); } + + @Override + public EventManager getEventManager() { + return eventManager; + } }