/* * This file is a part of the SteamWar software. * * Copyright (C) 2025 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package de.steamwar.bausystem; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.configplayer.ConfigConverter; import de.steamwar.bausystem.features.gui.BauGUI; import de.steamwar.bausystem.features.script.lua.SteamWarLuaPlugin; import de.steamwar.bausystem.features.script.lua.libs.LuaLib; import de.steamwar.bausystem.features.slaves.laufbau.BoundingBoxLoader; import de.steamwar.bausystem.features.slaves.panzern.Panzern; import de.steamwar.bausystem.features.slaves.panzern.PanzernAlgorithm; import de.steamwar.bausystem.features.tracer.TraceManager; import de.steamwar.bausystem.features.tracer.TraceRecorder; import de.steamwar.bausystem.features.world.BauScoreboard; import de.steamwar.bausystem.linkage.BauGuiItem; import de.steamwar.bausystem.region.RegionSystem; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.bausystem.utils.TickListener; import de.steamwar.bausystem.utils.TickManager; import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.command.AbstractValidator; import de.steamwar.command.SWCommandUtils; import de.steamwar.core.CRIUSleepEvent; import de.steamwar.core.WorldEditRendererCUIEditor; import de.steamwar.linkage.AbstractLinker; import de.steamwar.linkage.SpigotLinker; import de.steamwar.message.Message; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.logging.Level; public class BauSystem extends JavaPlugin implements Listener { // This should be treated as final! public static Message MESSAGE; public static final boolean DEV_SERVER = !System.getProperty("user.home").endsWith("minecraft"); @Getter private static BauSystem instance; private SpigotLinker linker; @Override public void onEnable() { // LOGGER fixLogging(); MESSAGE = new Message("BauSystem", getClassLoader()); instance = this; SWUtils.setBausystem(instance); RegionSystem.INSTANCE.load(); SWCommandUtils.addValidator(Player.class, validator(Permission.BUILD)); SWCommandUtils.addValidator(CommandSender.class, validator(Permission.BUILD)); SWCommandUtils.addValidator("supervisor", validator(Permission.SUPERVISOR)); SWCommandUtils.addValidator("owner", validator(Permission.OWNER)); linker = new SpigotLinker(BauSystem.getInstance(), BauSystem.MESSAGE) { @Override protected void linkObject(Object any) { super.linkObject(any); if (any instanceof LuaLib) { SteamWarLuaPlugin.add((LuaLib) any); } if (any instanceof ScoreboardElement) { BauScoreboard.addElement((ScoreboardElement) any); } if (any instanceof BauGuiItem) { BauGUI.addItem((BauGuiItem) any); } if (any instanceof PanzernAlgorithm) { Panzern.add((PanzernAlgorithm) any); } if (any instanceof ConfigConverter) { Config.addConfigConverter((ConfigConverter) any); } if (any instanceof BoundingBoxLoader) { ((BoundingBoxLoader) any).load(); } } }; try { linker.addLinkableInstance(BauServer.getInstance()); linker.link(); } catch (AbstractLinker.LinkException e) { getLogger().log(Level.SEVERE, "Could not link a class.", e); Bukkit.shutdown(); } TickListener.impl.init(); TraceManager.instance.init(); TraceRecorder.instance.init(); new WorldEditRendererCUIEditor(); } @EventHandler public void onCRIUSleep(CRIUSleepEvent event) { RegionSystem.INSTANCE.save(); } @Override public void onDisable() { linker.unlink(); WorldData.write(); RegionSystem.INSTANCE.save(); Config.getInstance().saveAll(); } private AbstractValidator validator(Permission permission) { return (commandSender, object, messageSender) -> { if (commandSender instanceof Player) { if (permission.hasPermission((Player) commandSender)) { return true; } messageSender.send("NO_PERMISSION"); return false; } return true; }; } private void fixLogging() { System.setErr(new PrintStream(new OutputStream() { private StringBuilder current = new StringBuilder(); @Override public void write(int b) throws IOException { if (b == '\n') { String logging = current.toString(); if (logging.contains("SLF4J")) { Bukkit.getLogger().info(logging); } else { Bukkit.getLogger().warning(logging); } current = new StringBuilder(); } else { current.append((char) b); } } })); } public static BukkitTask runTaskLater(Plugin plugin, Runnable runnable, long delay) { return new BukkitRunnable() { private int counter = 1; @Override public void run() { if (TickManager.impl.isFrozen()) return; if (counter >= delay) { runnable.run(); cancel(); return; } counter++; } }.runTaskTimer(plugin, 0, 1); } public static BukkitTask runTaskTimer(Plugin plugin, Runnable runnable, long delay, long period) { return new BukkitRunnable() { private int counter = 1; private boolean first = true; @Override public void run() { if (TickManager.impl.isFrozen()) return; if (counter >= (first ? delay : period)) { first = false; runnable.run(); counter = 1; return; } counter++; } }.runTaskTimer(plugin, 0, 1); } public static void runTaskTimer(Plugin plugin, Consumer consumer, long delay, long period) { AtomicReference task = new AtomicReference<>(); task.set(runTaskTimer(plugin, () -> consumer.accept(task.get()), delay, period)); } }