From 09c1957ab6bafbd70051f2b38e610a561eeb1f47 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 16 Jan 2021 17:30:11 -0700 Subject: [PATCH] StructureLocateEvent implementation --- build.gradle.kts | 2 +- .../com/dfsek/terra/DependencyConfig.kt | 2 +- platforms/bukkit/build.gradle.kts | 5 +-- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 42 ++++++++++++++++--- ...EventListener.java => CommonListener.java} | 4 +- .../terra/bukkit/listeners/PaperListener.java | 34 +++++++++++++++ .../bukkit/listeners/SpigotListener.java | 9 +++- 7 files changed, 85 insertions(+), 13 deletions(-) rename platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/{EventListener.java => CommonListener.java} (96%) diff --git a/build.gradle.kts b/build.gradle.kts index 655476747..4d47210e1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("3", "1", "0", true) +val versionObj = Version("3", "1", "1", true) allprojects { version = versionObj diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt index 28a6f8e00..c495f01f7 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt @@ -7,7 +7,7 @@ import org.gradle.kotlin.dsl.repositories fun Project.configureDependencies() { repositories { - maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } + maven { url = uri("https://papermc.io/repo/repository/maven-public/") } maven { url = uri("http://maven.enginehub.org/repo/") } maven { url = uri("https://repo.codemc.org/repository/maven-public") } maven { url = uri("https://papermc.io/repo/repository/maven-public/") } diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 8de466339..82de65aac 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -16,7 +16,6 @@ group = "com.dfsek.terra.bukkit" repositories { mavenCentral() - maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } maven { url = uri("http://maven.enginehub.org/repo/") } maven { url = uri("https://repo.codemc.org/repository/maven-public") } maven { url = uri("https://papermc.io/repo/repository/maven-public/") } @@ -25,7 +24,7 @@ repositories { dependencies { "shadedApi"(project(":common")) - "compileOnly"("org.spigotmc:spigot-api:1.16.2-R0.1-SNAPSHOT") + "compileOnly"("com.destroystokyo.paper:paper-api:1.16.5-R0.1-SNAPSHOT") "shadedImplementation"("io.papermc:paperlib:1.0.5") "shadedImplementation"("org.bstats:bstats-bukkit:1.7") @@ -100,7 +99,7 @@ val testWithPaper = task(name = "testWithPaper") { "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear") maxHeapSize = "3G" minHeapSize = "3G" - args = listOf("nogui") + //args = listOf("nogui") workingDir = file("${testDir}/") classpath = files("${testDir}/paper.jar") } 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 b81acd213..ea9e1b22e 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 @@ -19,7 +19,8 @@ import com.dfsek.terra.bukkit.command.command.structure.LocateCommand; import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.bukkit.handles.BukkitItemHandle; import com.dfsek.terra.bukkit.handles.BukkitWorldHandle; -import com.dfsek.terra.bukkit.listeners.EventListener; +import com.dfsek.terra.bukkit.listeners.CommonListener; +import com.dfsek.terra.bukkit.listeners.PaperListener; import com.dfsek.terra.bukkit.listeners.SpigotListener; import com.dfsek.terra.bukkit.util.PaperUtil; import com.dfsek.terra.bukkit.world.BukkitBiome; @@ -30,6 +31,7 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.registry.ConfigRegistry; +import io.papermc.lib.PaperLib; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.TreeType; @@ -149,11 +151,41 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { long save = config.getDataSaveInterval(); Bukkit.getScheduler().runTaskTimerAsynchronously(this, BukkitChunkGeneratorWrapper::saveAll, save, save); // Schedule population data saving - - Bukkit.getPluginManager().registerEvents(new EventListener(this), this); // Register master event listener - Bukkit.getPluginManager().registerEvents(new SpigotListener(this), this); // Register Spigot event listener, once Paper accepts StructureLocateEvent PR Spigot and Paper events will be separate. - + Bukkit.getPluginManager().registerEvents(new CommonListener(this), this); // Register master event listener PaperUtil.checkPaper(this); + + if(PaperLib.isPaper()) { + try { + Class.forName("io.papermc.paper.event.world.StructureLocateEvent"); // Check if user is on Paper version with event. + Bukkit.getPluginManager().registerEvents(new PaperListener(this), this); // Register Paper events. + } catch(ClassNotFoundException e) { + registerSpigotEvents(true); // Outdated Paper version. + } + } else { + registerSpigotEvents(false); + } + } + + private void registerSpigotEvents(boolean outdated) { + if(outdated) { + getLogger().severe("You are using an outdated version of Paper."); + getLogger().severe("This version does not contain StructureLocateEvent."); + getLogger().severe("Terra will now fall back to Spigot events."); + getLogger().severe("This will prevent cartographer villagers from spawning,"); + getLogger().severe("and cause structure location to not function."); + getLogger().severe("If you want these functionalities, update to the latest build of Paper."); + getLogger().severe("If you use a fork, update to the latest version, then if you still"); + getLogger().severe("receive this message, ask the fork developer to update upstream."); + } else { + getLogger().severe("Paper is not in use. Falling back to Spigot events."); + getLogger().severe("This will prevent cartographer villagers from spawning,"); + getLogger().severe("and cause structure location to not function."); + getLogger().severe("If you want these functionalities (and all the other"); + getLogger().severe("benefits that Paper offers), upgrade your server to Paper."); + getLogger().severe("Find out more at https://papermc.io/"); + } + + Bukkit.getPluginManager().registerEvents(new SpigotListener(this), this); // Register Spigot event listener } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java similarity index 96% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index cea3e77eb..e13f818a9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -22,10 +22,10 @@ import org.bukkit.event.world.StructureGrowEvent; /** * Listener for events on all implementations. */ -public class EventListener implements Listener { +public class CommonListener implements Listener { private final TerraPlugin main; - public EventListener(TerraPlugin main) { + public CommonListener(TerraPlugin main) { this.main = main; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java index ae8e74b06..39f7d218a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java @@ -1,11 +1,45 @@ package com.dfsek.terra.bukkit.listeners; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.async.AsyncStructureFinder; +import com.dfsek.terra.bukkit.world.BukkitAdapter; +import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.population.items.TerraStructure; +import io.papermc.paper.event.world.StructureLocateEvent; +import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; /** * Placeholder, will be used once Paper accepts StructureLocateEvent PR. */ public class PaperListener implements Listener { + private final TerraPlugin main; + + public PaperListener(TerraPlugin main) { + this.main = main; + } + + @EventHandler + public void onStructureLocate(StructureLocateEvent e) { + e.setResult(null); // Assume no result. + String name = "minecraft:" + e.getType().getName(); + if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getWorld()))) return; + Debug.info("Overriding structure location for \"" + name + "\""); + TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getWorld())); + TerraStructure config = tw.getConfig().getStructure(tw.getConfig().getTemplate().getLocatable().get(name)); + if(config != null) { + AsyncStructureFinder finder = new AsyncStructureFinder(tw.getGrid(), config, BukkitAdapter.adapt(e.getOrigin()), 0, 500, location -> { + if(location != null) + e.setResult(BukkitAdapter.adapt(location.toLocation(BukkitAdapter.adapt(e.getWorld())))); + Debug.info("Location: " + location); + }, main); + finder.run(); // Do this synchronously. + } else { + main.getLogger().warning("No overrides are defined for \"" + name + "\""); + } + + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java index 9d4e52065..490c77e0f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java @@ -56,14 +56,21 @@ public class SpigotListener implements Listener { public void onCartographerChange(VillagerAcquireTradeEvent e) { if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; if(!(e.getEntity() instanceof Villager)) return; - if(((Villager) e.getEntity()).getProfession().equals(Villager.Profession.CARTOGRAPHER)) + if(((Villager) e.getEntity()).getProfession().equals(Villager.Profession.CARTOGRAPHER)) { + main.getLogger().severe("Prevented server crash by stopping Cartographer villager from spawning."); + main.getLogger().severe("Please upgrade to Paper, which has a StructureLocateEvent that fixes this issue"); + main.getLogger().severe("at the source, and doesn't require us to do stupid band-aids."); e.setCancelled(true); // Cancel leveling if the villager is a Cartographer, to prevent crashing server. + } } @EventHandler public void onCartographerLevel(VillagerCareerChangeEvent e) { if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; if(e.getProfession().equals(Villager.Profession.CARTOGRAPHER)) { + main.getLogger().severe("Prevented server crash by stopping Cartographer villager from spawning."); + main.getLogger().severe("Please upgrade to Paper, which has a StructureLocateEvent that fixes this issue"); + main.getLogger().severe("at the source, and doesn't require us to do stupid band-aids."); e.getEntity().setProfession(Villager.Profession.NITWIT); // Give villager new profession to prevent server crash. e.setCancelled(true); }