package com.plotsquared.nukkit.listeners;
import cn.nukkit.event.EventHandler;
import cn.nukkit.event.EventPriority;
import cn.nukkit.event.Listener;
import cn.nukkit.event.level.LevelInitEvent;
import cn.nukkit.event.level.LevelLoadEvent;
import cn.nukkit.level.Level;
import cn.nukkit.level.generator.Generator;
import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.generator.GeneratorWrapper;
import com.intellectualcrafters.plot.object.PlotArea;
import com.plotsquared.nukkit.generator.NukkitPlotGenerator;
import java.lang.reflect.Field;
import java.util.HashMap;
public class WorldEvents implements Listener {
private final Field instance;
public WorldEvents() {
try {
this.instance = Level.class.getDeclaredField("generatorInstance");
this.instance.setAccessible(true);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onWorldLoad(LevelLoadEvent event) {
handle(event.getLevel());
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onWorldInit(LevelInitEvent event) {
handle(event.getLevel());
}
private void handle(Level level) {
String name = level.getName();
try {
Generator gen = (Generator) instance.get(level);
if (gen instanceof GeneratorWrapper) {
PS.get().loadWorld(name, (GeneratorWrapper<?>) gen);
} else {
HashMap<String, Object> settings = new HashMap<>();
settings.put("world", level.getName());
settings.put("generator", gen);
PS.get().loadWorld(name, new NukkitPlotGenerator(settings));
for (PlotArea area : PS.get().getPlotAreas(name)) {
area.MAX_BUILD_HEIGHT = Math.min(127, area.MAX_BUILD_HEIGHT);
}
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}