Refactor CoreProtect.java
This commit is contained in:
parent
779b1acbff
commit
1d294c51c4
4 changed files with 371 additions and 185 deletions
|
|
@ -1,37 +1,18 @@
|
||||||
package net.coreprotect;
|
package net.coreprotect;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import org.bstats.bukkit.MetricsLite;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.plugin.PluginDescriptionFile;
|
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
import net.coreprotect.command.CommandHandler;
|
|
||||||
import net.coreprotect.command.TabHandler;
|
|
||||||
import net.coreprotect.config.Config;
|
|
||||||
import net.coreprotect.config.ConfigHandler;
|
import net.coreprotect.config.ConfigHandler;
|
||||||
import net.coreprotect.consumer.Consumer;
|
|
||||||
import net.coreprotect.consumer.process.Process;
|
|
||||||
import net.coreprotect.language.Language;
|
|
||||||
import net.coreprotect.language.Phrase;
|
import net.coreprotect.language.Phrase;
|
||||||
import net.coreprotect.listener.ListenerHandler;
|
import net.coreprotect.services.PluginInitializationService;
|
||||||
import net.coreprotect.listener.player.PlayerQuitListener;
|
import net.coreprotect.services.ShutdownService;
|
||||||
import net.coreprotect.paper.PaperAdapter;
|
|
||||||
import net.coreprotect.thread.CacheHandler;
|
|
||||||
import net.coreprotect.thread.NetworkHandler;
|
|
||||||
import net.coreprotect.thread.Scheduler;
|
|
||||||
import net.coreprotect.utility.Chat;
|
import net.coreprotect.utility.Chat;
|
||||||
import net.coreprotect.utility.ChatUtils;
|
|
||||||
import net.coreprotect.utility.Color;
|
|
||||||
import net.coreprotect.utility.Teleport;
|
|
||||||
import net.coreprotect.utility.VersionUtils;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main class for the CoreProtect plugin
|
||||||
|
*/
|
||||||
public final class CoreProtect extends JavaPlugin {
|
public final class CoreProtect extends JavaPlugin {
|
||||||
|
|
||||||
private static CoreProtect instance;
|
private static CoreProtect instance;
|
||||||
|
|
@ -45,7 +26,7 @@ public final class CoreProtect extends JavaPlugin {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private CoreProtectAPI api = new CoreProtectAPI();
|
private final CoreProtectAPI api = new CoreProtectAPI();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the CoreProtect API
|
* Get the CoreProtect API
|
||||||
|
|
@ -58,73 +39,15 @@ public final class CoreProtect extends JavaPlugin {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
|
// Set plugin instance and data folder path
|
||||||
instance = this;
|
instance = this;
|
||||||
ConfigHandler.path = this.getDataFolder().getPath() + File.separator;
|
ConfigHandler.path = this.getDataFolder().getPath() + File.separator;
|
||||||
Language.loadPhrases();
|
|
||||||
|
|
||||||
boolean start = performVersionChecks();
|
// Initialize plugin using the initialization service
|
||||||
if (start) {
|
boolean initialized = PluginInitializationService.initializePlugin(this);
|
||||||
try {
|
|
||||||
Consumer.initialize(); // Prepare consumer (keep this here)
|
|
||||||
new ListenerHandler(this);
|
|
||||||
getCommand("coreprotect").setExecutor(CommandHandler.getInstance());
|
|
||||||
getCommand("coreprotect").setTabCompleter(new TabHandler());
|
|
||||||
getCommand("core").setExecutor(CommandHandler.getInstance());
|
|
||||||
getCommand("core").setTabCompleter(new TabHandler());
|
|
||||||
getCommand("co").setExecutor(CommandHandler.getInstance());
|
|
||||||
getCommand("co").setTabCompleter(new TabHandler());
|
|
||||||
|
|
||||||
boolean exists = (new File(ConfigHandler.path)).exists();
|
// Disable plugin if initialization failed
|
||||||
if (!exists) {
|
if (!initialized) {
|
||||||
new File(ConfigHandler.path).mkdir();
|
|
||||||
}
|
|
||||||
start = ConfigHandler.performInitialization(true); // Perform any necessary initialization
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
start = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start) {
|
|
||||||
PluginDescriptionFile pluginDescription = this.getDescription();
|
|
||||||
ChatUtils.sendConsoleComponentStartup(Bukkit.getServer().getConsoleSender(), Phrase.build(Phrase.ENABLE_SUCCESS, ConfigHandler.EDITION_NAME));
|
|
||||||
if (Config.getGlobal().MYSQL) {
|
|
||||||
Chat.console(Phrase.build(Phrase.USING_MYSQL));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Chat.console(Phrase.build(Phrase.USING_SQLITE));
|
|
||||||
}
|
|
||||||
|
|
||||||
Chat.console("--------------------");
|
|
||||||
Chat.console(Phrase.build(Phrase.ENJOY_COREPROTECT, pluginDescription.getName()));
|
|
||||||
Chat.console(Phrase.build(Phrase.LINK_DISCORD, "www.coreprotect.net/discord/"));
|
|
||||||
Chat.console("--------------------");
|
|
||||||
|
|
||||||
Scheduler.scheduleSyncDelayedTask(this, () -> {
|
|
||||||
try {
|
|
||||||
Thread networkHandler = new Thread(new NetworkHandler(true, true));
|
|
||||||
networkHandler.start();
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
Thread cacheCleanUpThread = new Thread(new CacheHandler());
|
|
||||||
cacheCleanUpThread.start();
|
|
||||||
|
|
||||||
Consumer.startConsumer();
|
|
||||||
|
|
||||||
// Enabling bStats
|
|
||||||
try {
|
|
||||||
new MetricsLite(this, 2876);
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
// Failed to connect to bStats server or something else went wrong.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Chat.console(Phrase.build(Phrase.ENABLE_FAILED, ConfigHandler.EDITION_NAME));
|
Chat.console(Phrase.build(Phrase.ENABLE_FAILED, ConfigHandler.EDITION_NAME));
|
||||||
getServer().getPluginManager().disablePlugin(this);
|
getServer().getPluginManager().disablePlugin(this);
|
||||||
}
|
}
|
||||||
|
|
@ -132,102 +55,6 @@ public final class CoreProtect extends JavaPlugin {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
safeShutdown(this);
|
ShutdownService.safeShutdown(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean performVersionChecks() {
|
|
||||||
try {
|
|
||||||
String[] bukkitVersion = Bukkit.getServer().getBukkitVersion().split("[-.]");
|
|
||||||
if (VersionUtils.newVersion(bukkitVersion[0] + "." + bukkitVersion[1], ConfigHandler.MINECRAFT_VERSION)) {
|
|
||||||
Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Minecraft", ConfigHandler.MINECRAFT_VERSION));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (VersionUtils.newVersion(ConfigHandler.LATEST_VERSION, bukkitVersion[0] + "." + bukkitVersion[1]) && VersionUtils.isBranch("master")) {
|
|
||||||
Chat.console(Phrase.build(Phrase.VERSION_INCOMPATIBLE, "Minecraft", bukkitVersion[0] + "." + bukkitVersion[1]));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
String[] javaVersion = (System.getProperty("java.version").replaceAll("[^0-9.]", "") + ".0").split("\\.");
|
|
||||||
if (VersionUtils.newVersion(javaVersion[0] + "." + javaVersion[1], ConfigHandler.JAVA_VERSION)) {
|
|
||||||
Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Java", ConfigHandler.JAVA_VERSION));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ConfigHandler.EDITION_BRANCH.length() == 0) {
|
|
||||||
Chat.sendConsoleMessage(Color.RED + "[CoreProtect] " + Phrase.build(Phrase.INVALID_BRANCH_1));
|
|
||||||
Chat.sendConsoleMessage(Color.GREY + "[CoreProtect] " + Phrase.build(Phrase.INVALID_BRANCH_2));
|
|
||||||
Chat.sendConsoleMessage(Color.GREY + "[CoreProtect] " + Phrase.build(Phrase.INVALID_BRANCH_3));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigHandler.SERVER_VERSION = Integer.parseInt(bukkitVersion[1]);
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void safeShutdown(CoreProtect plugin) {
|
|
||||||
try {
|
|
||||||
/* if server is stopping, log disconnections of online players */
|
|
||||||
if (ConfigHandler.serverRunning && PaperAdapter.ADAPTER.isStopping(plugin.getServer())) {
|
|
||||||
for (Player player : plugin.getServer().getOnlinePlayers()) {
|
|
||||||
PlayerQuitListener.queuePlayerQuit(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ConfigHandler.isFolia) {
|
|
||||||
Iterator<Entry<Location, BlockData>> iterator = Teleport.revertBlocks.entrySet().iterator();
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
Entry<Location, BlockData> entry = iterator.next();
|
|
||||||
entry.getKey().getBlock().setBlockData(entry.getValue());
|
|
||||||
iterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigHandler.serverRunning = false;
|
|
||||||
long shutdownTime = System.currentTimeMillis();
|
|
||||||
long alertTime = shutdownTime + (10 * 1000);
|
|
||||||
if (ConfigHandler.converterRunning) {
|
|
||||||
Chat.console(Phrase.build(Phrase.FINISHING_CONVERSION));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Chat.console(Phrase.build(Phrase.FINISHING_LOGGING));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ConfigHandler.migrationRunning) {
|
|
||||||
ConfigHandler.purgeRunning = false;
|
|
||||||
}
|
|
||||||
while ((Consumer.isRunning() || ConfigHandler.converterRunning) && !ConfigHandler.purgeRunning) {
|
|
||||||
long time = System.currentTimeMillis();
|
|
||||||
if (time >= alertTime) {
|
|
||||||
if (!ConfigHandler.converterRunning) {
|
|
||||||
int consumerId = (Consumer.currentConsumer == 1) ? 1 : 0;
|
|
||||||
int consumerCount = Consumer.getConsumerSize(consumerId) + Process.getCurrentConsumerSize();
|
|
||||||
Chat.console(Phrase.build(Phrase.LOGGING_ITEMS, String.format("%,d", consumerCount)));
|
|
||||||
}
|
|
||||||
alertTime = alertTime + (30 * 1000);
|
|
||||||
}
|
|
||||||
else if (!ConfigHandler.databaseReachable && (time - shutdownTime) >= (5 * 60 * 1000)) {
|
|
||||||
Chat.console(Phrase.build(Phrase.DATABASE_UNREACHABLE));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if ((time - shutdownTime) >= (15 * 60 * 1000)) {
|
|
||||||
Chat.console(Phrase.build(Phrase.LOGGING_TIME_LIMIT));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Thread.sleep(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigHandler.performDisable();
|
|
||||||
Chat.console(Phrase.build(Phrase.DISABLE_SUCCESS, "CoreProtect v" + plugin.getDescription().getVersion()));
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,172 @@
|
||||||
|
package net.coreprotect.services;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.bstats.bukkit.MetricsLite;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.plugin.PluginDescriptionFile;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import net.coreprotect.CoreProtect;
|
||||||
|
import net.coreprotect.command.CommandHandler;
|
||||||
|
import net.coreprotect.command.TabHandler;
|
||||||
|
import net.coreprotect.config.Config;
|
||||||
|
import net.coreprotect.config.ConfigHandler;
|
||||||
|
import net.coreprotect.consumer.Consumer;
|
||||||
|
import net.coreprotect.language.Language;
|
||||||
|
import net.coreprotect.language.Phrase;
|
||||||
|
import net.coreprotect.listener.ListenerHandler;
|
||||||
|
import net.coreprotect.thread.CacheHandler;
|
||||||
|
import net.coreprotect.thread.NetworkHandler;
|
||||||
|
import net.coreprotect.thread.Scheduler;
|
||||||
|
import net.coreprotect.utility.Chat;
|
||||||
|
import net.coreprotect.utility.ChatUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service responsible for plugin initialization tasks
|
||||||
|
*/
|
||||||
|
public class PluginInitializationService {
|
||||||
|
|
||||||
|
private PluginInitializationService() {
|
||||||
|
throw new IllegalStateException("Utility class");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes plugin components and configurations
|
||||||
|
*
|
||||||
|
* @param plugin
|
||||||
|
* The CoreProtect plugin instance
|
||||||
|
* @return true if initialization was successful, false otherwise
|
||||||
|
*/
|
||||||
|
public static boolean initializePlugin(CoreProtect plugin) {
|
||||||
|
// Load language phrases
|
||||||
|
Language.loadPhrases();
|
||||||
|
|
||||||
|
// Perform version checks
|
||||||
|
boolean start = VersionCheckService.performVersionChecks();
|
||||||
|
if (!start) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Initialize core components
|
||||||
|
Consumer.initialize();
|
||||||
|
new ListenerHandler(plugin);
|
||||||
|
|
||||||
|
// Register commands
|
||||||
|
registerCommands(plugin);
|
||||||
|
|
||||||
|
// Ensure data directory exists
|
||||||
|
createDataDirectory();
|
||||||
|
|
||||||
|
// Initialize configuration
|
||||||
|
start = ConfigHandler.performInitialization(true);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start) {
|
||||||
|
// Display startup messages
|
||||||
|
displayStartupMessages(plugin);
|
||||||
|
|
||||||
|
// Start background services
|
||||||
|
startBackgroundServices(plugin);
|
||||||
|
|
||||||
|
// Start metrics
|
||||||
|
enableMetrics(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers plugin commands
|
||||||
|
*
|
||||||
|
* @param plugin
|
||||||
|
* The CoreProtect plugin instance
|
||||||
|
*/
|
||||||
|
private static void registerCommands(JavaPlugin plugin) {
|
||||||
|
plugin.getCommand("coreprotect").setExecutor(CommandHandler.getInstance());
|
||||||
|
plugin.getCommand("coreprotect").setTabCompleter(new TabHandler());
|
||||||
|
plugin.getCommand("core").setExecutor(CommandHandler.getInstance());
|
||||||
|
plugin.getCommand("core").setTabCompleter(new TabHandler());
|
||||||
|
plugin.getCommand("co").setExecutor(CommandHandler.getInstance());
|
||||||
|
plugin.getCommand("co").setTabCompleter(new TabHandler());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the plugin data directory if it doesn't exist
|
||||||
|
*/
|
||||||
|
private static void createDataDirectory() {
|
||||||
|
boolean exists = (new File(ConfigHandler.path)).exists();
|
||||||
|
if (!exists) {
|
||||||
|
new File(ConfigHandler.path).mkdir();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays startup messages in the console
|
||||||
|
*
|
||||||
|
* @param plugin
|
||||||
|
* The CoreProtect plugin instance
|
||||||
|
*/
|
||||||
|
private static void displayStartupMessages(JavaPlugin plugin) {
|
||||||
|
PluginDescriptionFile pluginDescription = plugin.getDescription();
|
||||||
|
ChatUtils.sendConsoleComponentStartup(Bukkit.getServer().getConsoleSender(), Phrase.build(Phrase.ENABLE_SUCCESS, ConfigHandler.EDITION_NAME));
|
||||||
|
|
||||||
|
if (Config.getGlobal().MYSQL) {
|
||||||
|
Chat.console(Phrase.build(Phrase.USING_MYSQL));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Chat.console(Phrase.build(Phrase.USING_SQLITE));
|
||||||
|
}
|
||||||
|
|
||||||
|
Chat.console("--------------------");
|
||||||
|
Chat.console(Phrase.build(Phrase.ENJOY_COREPROTECT, pluginDescription.getName()));
|
||||||
|
Chat.console(Phrase.build(Phrase.LINK_DISCORD, "www.coreprotect.net/discord/"));
|
||||||
|
Chat.console("--------------------");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts background services
|
||||||
|
*
|
||||||
|
* @param plugin
|
||||||
|
* The CoreProtect plugin instance
|
||||||
|
*/
|
||||||
|
private static void startBackgroundServices(CoreProtect plugin) {
|
||||||
|
// Start network handler
|
||||||
|
Scheduler.scheduleSyncDelayedTask(plugin, () -> {
|
||||||
|
try {
|
||||||
|
Thread networkHandler = new Thread(new NetworkHandler(true, true));
|
||||||
|
networkHandler.start();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
|
||||||
|
// Start cache cleanup thread
|
||||||
|
Thread cacheCleanUpThread = new Thread(new CacheHandler());
|
||||||
|
cacheCleanUpThread.start();
|
||||||
|
|
||||||
|
// Start consumer
|
||||||
|
Consumer.startConsumer();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables metrics reporting
|
||||||
|
*
|
||||||
|
* @param plugin
|
||||||
|
* The CoreProtect plugin instance
|
||||||
|
*/
|
||||||
|
private static void enableMetrics(JavaPlugin plugin) {
|
||||||
|
try {
|
||||||
|
new MetricsLite(plugin, 2876);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
// Failed to connect to bStats server or something else went wrong
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
122
src/main/java/net/coreprotect/services/ShutdownService.java
Normal file
122
src/main/java/net/coreprotect/services/ShutdownService.java
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
package net.coreprotect.services;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
import net.coreprotect.config.ConfigHandler;
|
||||||
|
import net.coreprotect.consumer.Consumer;
|
||||||
|
import net.coreprotect.consumer.process.Process;
|
||||||
|
import net.coreprotect.language.Phrase;
|
||||||
|
import net.coreprotect.listener.player.PlayerQuitListener;
|
||||||
|
import net.coreprotect.paper.PaperAdapter;
|
||||||
|
import net.coreprotect.utility.Chat;
|
||||||
|
import net.coreprotect.utility.Teleport;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service responsible for handling plugin shutdown operations
|
||||||
|
*/
|
||||||
|
public class ShutdownService {
|
||||||
|
|
||||||
|
private static final long ALERT_INTERVAL_MS = 30 * 1000; // 30 seconds
|
||||||
|
private static final long MAX_SHUTDOWN_WAIT_MS = 15 * 60 * 1000; // 15 minutes
|
||||||
|
private static final long DB_UNREACHABLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
||||||
|
|
||||||
|
private ShutdownService() {
|
||||||
|
throw new IllegalStateException("Utility class");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Safely shuts down the plugin, ensuring all data is saved
|
||||||
|
*
|
||||||
|
* @param plugin
|
||||||
|
* The CoreProtect plugin instance
|
||||||
|
*/
|
||||||
|
public static void safeShutdown(Plugin plugin) {
|
||||||
|
try {
|
||||||
|
// Log disconnections of online players if server is stopping
|
||||||
|
if (ConfigHandler.serverRunning && PaperAdapter.ADAPTER.isStopping(plugin.getServer())) {
|
||||||
|
for (Player player : plugin.getServer().getOnlinePlayers()) {
|
||||||
|
PlayerQuitListener.queuePlayerQuit(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Revert any teleport blocks if not using Folia
|
||||||
|
if (!ConfigHandler.isFolia) {
|
||||||
|
revertTeleportBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigHandler.serverRunning = false;
|
||||||
|
long shutdownTime = System.currentTimeMillis();
|
||||||
|
long nextAlertTime = shutdownTime + ALERT_INTERVAL_MS;
|
||||||
|
|
||||||
|
if (ConfigHandler.converterRunning) {
|
||||||
|
Chat.console(Phrase.build(Phrase.FINISHING_CONVERSION));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Chat.console(Phrase.build(Phrase.FINISHING_LOGGING));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ConfigHandler.migrationRunning) {
|
||||||
|
ConfigHandler.purgeRunning = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
waitForPendingOperations(shutdownTime, nextAlertTime);
|
||||||
|
|
||||||
|
ConfigHandler.performDisable();
|
||||||
|
Chat.console(Phrase.build(Phrase.DISABLE_SUCCESS, "CoreProtect v" + plugin.getDescription().getVersion()));
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Waits for pending operations (consumer tasks or conversions) to complete
|
||||||
|
*
|
||||||
|
* @param shutdownTime
|
||||||
|
* The time when shutdown began
|
||||||
|
* @param nextAlertTime
|
||||||
|
* The time for the next status message
|
||||||
|
*/
|
||||||
|
private static void waitForPendingOperations(long shutdownTime, long nextAlertTime) throws InterruptedException {
|
||||||
|
while ((Consumer.isRunning() || ConfigHandler.converterRunning) && !ConfigHandler.purgeRunning) {
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
if (currentTime >= nextAlertTime) {
|
||||||
|
if (!ConfigHandler.converterRunning) {
|
||||||
|
int consumerId = (Consumer.currentConsumer == 1) ? 1 : 0;
|
||||||
|
int consumerCount = Consumer.getConsumerSize(consumerId) + Process.getCurrentConsumerSize();
|
||||||
|
Chat.console(Phrase.build(Phrase.LOGGING_ITEMS, String.format("%,d", consumerCount)));
|
||||||
|
}
|
||||||
|
nextAlertTime = currentTime + ALERT_INTERVAL_MS;
|
||||||
|
}
|
||||||
|
else if (!ConfigHandler.databaseReachable && (currentTime - shutdownTime) >= DB_UNREACHABLE_TIMEOUT_MS) {
|
||||||
|
Chat.console(Phrase.build(Phrase.DATABASE_UNREACHABLE));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if ((currentTime - shutdownTime) >= MAX_SHUTDOWN_WAIT_MS) {
|
||||||
|
Chat.console(Phrase.build(Phrase.LOGGING_TIME_LIMIT));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.sleep(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverts any blocks that were temporarily changed during player teleports
|
||||||
|
*/
|
||||||
|
private static void revertTeleportBlocks() {
|
||||||
|
Iterator<Entry<Location, BlockData>> iterator = Teleport.revertBlocks.entrySet().iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
Entry<Location, BlockData> entry = iterator.next();
|
||||||
|
entry.getKey().getBlock().setBlockData(entry.getValue());
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
package net.coreprotect.services;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
import net.coreprotect.config.ConfigHandler;
|
||||||
|
import net.coreprotect.language.Phrase;
|
||||||
|
import net.coreprotect.utility.Chat;
|
||||||
|
import net.coreprotect.utility.Color;
|
||||||
|
import net.coreprotect.utility.VersionUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service responsible for checking compatibility of Minecraft, Java versions,
|
||||||
|
* and plugin branch validation.
|
||||||
|
*/
|
||||||
|
public class VersionCheckService {
|
||||||
|
|
||||||
|
private VersionCheckService() {
|
||||||
|
throw new IllegalStateException("Utility class");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs all necessary version checks during plugin startup
|
||||||
|
*
|
||||||
|
* @return true if all version checks pass, false otherwise
|
||||||
|
*/
|
||||||
|
public static boolean performVersionChecks() {
|
||||||
|
try {
|
||||||
|
// Check Minecraft version compatibility
|
||||||
|
String[] bukkitVersion = Bukkit.getServer().getBukkitVersion().split("[-.]");
|
||||||
|
if (VersionUtils.newVersion(bukkitVersion[0] + "." + bukkitVersion[1], ConfigHandler.MINECRAFT_VERSION)) {
|
||||||
|
Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Minecraft", ConfigHandler.MINECRAFT_VERSION));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VersionUtils.newVersion(ConfigHandler.LATEST_VERSION, bukkitVersion[0] + "." + bukkitVersion[1]) && VersionUtils.isBranch("master")) {
|
||||||
|
Chat.console(Phrase.build(Phrase.VERSION_INCOMPATIBLE, "Minecraft", bukkitVersion[0] + "." + bukkitVersion[1]));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check Java version compatibility
|
||||||
|
String[] javaVersion = (System.getProperty("java.version").replaceAll("[^0-9.]", "") + ".0").split("\\.");
|
||||||
|
if (VersionUtils.newVersion(javaVersion[0] + "." + javaVersion[1], ConfigHandler.JAVA_VERSION)) {
|
||||||
|
Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Java", ConfigHandler.JAVA_VERSION));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Branch validation
|
||||||
|
if (ConfigHandler.EDITION_BRANCH.length() == 0) {
|
||||||
|
Chat.sendConsoleMessage(Color.RED + "[CoreProtect] " + Phrase.build(Phrase.INVALID_BRANCH_1));
|
||||||
|
Chat.sendConsoleMessage(Color.GREY + "[CoreProtect] " + Phrase.build(Phrase.INVALID_BRANCH_2));
|
||||||
|
Chat.sendConsoleMessage(Color.GREY + "[CoreProtect] " + Phrase.build(Phrase.INVALID_BRANCH_3));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store Minecraft server version for later use
|
||||||
|
ConfigHandler.SERVER_VERSION = Integer.parseInt(bukkitVersion[1]);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue