Merge branch 'structurelocate' into biome

# Conflicts:
#	build.gradle.kts
This commit is contained in:
dfsek 2021-01-17 01:25:28 -07:00
commit beb18c6e2c
6 changed files with 84 additions and 12 deletions

View File

@ -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/") }

View File

@ -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<JavaExec>(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")
}

View File

@ -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

View File

@ -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;
}

View File

@ -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 + "\"");
}
}
}

View File

@ -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);
}