From b45037511f8c445f5a6df4ae6c17dbd8843d1b2a Mon Sep 17 00:00:00 2001 From: NotAlexNoyle Date: Thu, 1 Jan 2026 07:56:08 -0500 Subject: [PATCH] Milestone towards tracking config files on git. Waiting on true-og/SubstAgent update --- build.gradle.kts | 32 +- config/formatter/eclipse-java-formatter.xml | 404 +++ .../java/net/coreprotect/CoreProtect.java | 168 +- .../java/net/coreprotect/CoreProtectAPI.java | 634 ++-- .../java/net/coreprotect/api/BlockAPI.java | 35 +- .../java/net/coreprotect/api/QueueLookup.java | 47 +- .../net/coreprotect/api/SessionLookup.java | 31 +- .../net/coreprotect/bukkit/BukkitAdapter.java | 112 +- .../coreprotect/bukkit/BukkitInterface.java | 5 +- .../net/coreprotect/bukkit/Bukkit_v1_17.java | 405 +-- .../net/coreprotect/bukkit/Bukkit_v1_18.java | 11 + .../net/coreprotect/bukkit/Bukkit_v1_19.java | 443 +-- .../net/coreprotect/command/ApplyCommand.java | 33 +- .../coreprotect/command/CancelCommand.java | 33 +- .../coreprotect/command/CommandHandler.java | 1417 ++++++--- .../coreprotect/command/ConsumerCommand.java | 76 +- .../net/coreprotect/command/HelpCommand.java | 406 ++- .../coreprotect/command/InspectCommand.java | 52 +- .../coreprotect/command/LookupCommand.java | 1390 +++++---- .../command/NetworkDebugCommand.java | 14 +- .../net/coreprotect/command/PurgeCommand.java | 275 +- .../coreprotect/command/ReloadCommand.java | 68 +- .../command/RollbackRestoreCommand.java | 557 ++-- .../coreprotect/command/StatusCommand.java | 175 +- .../net/coreprotect/command/TabHandler.java | 494 +-- .../coreprotect/command/TeleportCommand.java | 82 +- .../net/coreprotect/command/UndoCommand.java | 32 +- .../coreprotect/command/WorldEditHandler.java | 25 +- .../java/net/coreprotect/config/Config.java | 1017 ++++--- .../net/coreprotect/config/ConfigFile.java | 97 +- .../net/coreprotect/config/ConfigHandler.java | 153 +- .../net/coreprotect/consumer/Consumer.java | 100 +- .../java/net/coreprotect/consumer/Queue.java | 613 ++-- .../consumer/process/ArtInsertProcess.java | 23 +- .../consumer/process/BlockBreakProcess.java | 38 +- .../process/BlockDataInsertProcess.java | 19 +- .../consumer/process/BlockPlaceProcess.java | 86 +- .../process/ContainerBreakProcess.java | 18 +- .../process/ContainerTransactionProcess.java | 80 +- .../consumer/process/EntityInsertProcess.java | 23 +- .../consumer/process/EntityKillProcess.java | 18 +- .../consumer/process/EntitySpawnProcess.java | 5 + .../process/ItemTransactionProcess.java | 32 +- .../process/MaterialInsertProcess.java | 19 +- .../process/NaturalBlockBreakProcess.java | 38 +- .../consumer/process/PlayerChatProcess.java | 14 +- .../process/PlayerCommandProcess.java | 14 +- .../process/PlayerInteractionProcess.java | 5 + .../consumer/process/PlayerKillProcess.java | 5 + .../consumer/process/PlayerLoginProcess.java | 24 +- .../consumer/process/PlayerLogoutProcess.java | 5 + .../coreprotect/consumer/process/Process.java | 237 +- .../process/RollbackUpdateProcess.java | 14 +- .../consumer/process/SignTextProcess.java | 44 +- .../consumer/process/SignUpdateProcess.java | 33 +- .../consumer/process/SkullUpdateProcess.java | 14 +- .../process/StructureGrowthProcess.java | 48 +- .../consumer/process/WorldInsertProcess.java | 19 +- .../database/ContainerRollback.java | 331 +- .../net/coreprotect/database/Database.java | 434 ++- .../java/net/coreprotect/database/Lookup.java | 816 +++-- .../database/logger/BlockBreakLogger.java | 49 +- .../database/logger/BlockPlaceLogger.java | 126 +- .../database/logger/ChatLogger.java | 17 +- .../database/logger/CommandLogger.java | 23 +- .../database/logger/ContainerBreakLogger.java | 28 +- .../database/logger/ContainerLogger.java | 153 +- .../database/logger/EntityKillLogger.java | 34 +- .../database/logger/ItemLogger.java | 42 +- .../database/logger/PlayerInteractLogger.java | 24 +- .../database/logger/PlayerKillLogger.java | 22 +- .../database/logger/PlayerSessionLogger.java | 17 +- .../database/logger/SignTextLogger.java | 69 +- .../database/logger/SkullBreakLogger.java | 39 +- .../database/logger/SkullPlaceLogger.java | 46 +- .../database/logger/UsernameLogger.java | 41 +- .../database/lookup/BlockLookup.java | 121 +- .../lookup/ChestTransactionLookup.java | 103 +- .../database/lookup/InteractionLookup.java | 93 +- .../database/lookup/PlayerLookup.java | 18 + .../database/lookup/SignMessageLookup.java | 109 +- .../database/rollback/Rollback.java | 2681 ++++++++++------- .../database/rollback/RollbackComplete.java | 385 ++- .../database/rollback/RollbackUtil.java | 295 +- .../database/statement/BlockStatement.java | 31 +- .../database/statement/ChatStatement.java | 24 +- .../database/statement/CommandStatement.java | 24 +- .../statement/ContainerStatement.java | 29 +- .../database/statement/EntityStatement.java | 23 + .../database/statement/ItemStatement.java | 27 +- .../database/statement/MaterialStatement.java | 20 + .../database/statement/SessionStatement.java | 24 +- .../database/statement/SignStatement.java | 53 +- .../database/statement/SkullStatement.java | 27 + .../database/statement/UserStatement.java | 57 +- .../database/statement/WorldStatement.java | 11 + .../event/CoreProtectPreLogEvent.java | 17 + .../coreprotect/extensions/Extensions.java | 13 +- .../net/coreprotect/language/Language.java | 19 +- .../java/net/coreprotect/language/Phrase.java | 286 +- .../net/coreprotect/language/Selector.java | 33 +- .../coreprotect/listener/ListenerHandler.java | 59 +- .../listener/block/BlockBreakListener.java | 293 +- .../listener/block/BlockBurnListener.java | 5 + .../listener/block/BlockDispenseListener.java | 101 +- .../listener/block/BlockExplodeListener.java | 97 +- .../listener/block/BlockFadeListener.java | 16 +- .../block/BlockFertilizeListener.java | 52 +- .../listener/block/BlockFormListener.java | 76 +- .../listener/block/BlockFromToListener.java | 71 +- .../listener/block/BlockIgniteListener.java | 90 +- .../listener/block/BlockPistonListener.java | 49 +- .../listener/block/BlockPlaceListener.java | 133 +- .../listener/block/BlockSpreadListener.java | 103 +- .../coreprotect/listener/block/BlockUtil.java | 62 +- .../listener/block/CampfireStartListener.java | 13 +- .../PluginChannelHandshakeListener.java | 31 + .../channel/PluginChannelListener.java | 120 +- .../entity/CreatureSpawnListener.java | 33 +- .../entity/EntityBlockFormListener.java | 19 +- .../entity/EntityChangeBlockListener.java | 40 +- .../entity/EntityDamageByBlockListener.java | 40 +- .../entity/EntityDamageByEntityListener.java | 116 +- .../listener/entity/EntityDeathListener.java | 237 +- .../entity/EntityExplodeListener.java | 25 + .../entity/EntityInteractListener.java | 13 +- .../entity/EntityPickupItemListener.java | 9 + .../entity/HangingBreakByEntityListener.java | 109 +- .../listener/entity/HangingBreakListener.java | 46 +- .../listener/entity/HangingPlaceListener.java | 26 +- .../player/ArmorStandManipulateListener.java | 125 +- .../listener/player/CraftItemListener.java | 92 +- .../player/FoodLevelChangeListener.java | 68 +- .../listener/player/HopperPullListener.java | 85 +- .../listener/player/HopperPushListener.java | 86 +- .../player/InventoryChangeListener.java | 266 +- .../player/InventoryClickListener.java | 3 + .../player/PlayerBucketEmptyListener.java | 30 +- .../player/PlayerBucketFillListener.java | 16 +- .../listener/player/PlayerChatListener.java | 9 + .../player/PlayerCommandListener.java | 24 +- .../listener/player/PlayerDeathListener.java | 13 + .../player/PlayerDropItemListener.java | 7 + .../player/PlayerInteractEntityListener.java | 105 +- .../player/PlayerInteractListener.java | 1049 ++++--- .../player/PlayerItemBreakListener.java | 7 + .../listener/player/PlayerJoinListener.java | 8 +- .../player/PlayerPickupArrowListener.java | 12 +- .../listener/player/PlayerQuitListener.java | 7 + .../player/PlayerTakeLecternBookListener.java | 8 +- .../player/ProjectileLaunchListener.java | 82 +- .../listener/player/SignChangeListener.java | 101 +- .../listener/world/ChunkPopulateListener.java | 6 +- .../listener/world/LeavesDecayListener.java | 12 +- .../listener/world/PortalCreateListener.java | 35 +- .../listener/world/StructureGrowListener.java | 37 +- .../net/coreprotect/model/BlockGroup.java | 645 +--- .../net/coreprotect/paper/PaperAdapter.java | 25 + .../net/coreprotect/paper/PaperHandler.java | 7 + .../net/coreprotect/paper/PaperInterface.java | 1 + .../net/coreprotect/paper/Paper_v1_17.java | 5 + .../listener/BlockPreDispenseListener.java | 12 +- .../paper/listener/PaperChatListener.java | 9 + .../java/net/coreprotect/patch/Patch.java | 188 +- .../coreprotect/patch/script/__2_10_0.java | 11 + .../coreprotect/patch/script/__2_11_0.java | 27 + .../coreprotect/patch/script/__2_15_0.java | 25 +- .../coreprotect/patch/script/__2_16_0.java | 57 +- .../coreprotect/patch/script/__2_17_0.java | 11 + .../coreprotect/patch/script/__2_18_0.java | 117 +- .../coreprotect/patch/script/__2_18_1.java | 9 + .../coreprotect/patch/script/__2_19_0.java | 145 +- .../coreprotect/patch/script/__2_20_0.java | 58 +- .../coreprotect/patch/script/__2_21_0.java | 33 +- .../coreprotect/patch/script/__2_22_0.java | 147 +- .../coreprotect/patch/script/__2_23_0.java | 17 +- .../coreprotect/patch/script/__2_23_1.java | 29 +- .../net/coreprotect/patch/script/__2_5_0.java | 15 + .../net/coreprotect/patch/script/__2_6_0.java | 16 +- .../net/coreprotect/spigot/SpigotAdapter.java | 25 + .../net/coreprotect/spigot/SpigotHandler.java | 103 +- .../coreprotect/spigot/SpigotInterface.java | 1 + .../net/coreprotect/thread/CacheHandler.java | 26 +- .../coreprotect/thread/NetworkHandler.java | 183 +- .../net/coreprotect/thread/Scheduler.java | 95 +- .../java/net/coreprotect/utility/Chat.java | 32 + .../net/coreprotect/utility/ChatMessage.java | 56 +- .../net/coreprotect/utility/ChestTool.java | 69 +- .../java/net/coreprotect/utility/Color.java | 3 + .../net/coreprotect/utility/Teleport.java | 85 +- .../java/net/coreprotect/utility/Util.java | 940 +++++- .../net/coreprotect/utility/Validate.java | 9 + .../utility/entity/EntityUtil.java | 1206 +++++--- .../utility/entity/HangingUtil.java | 125 +- .../utility/serialize/ItemMetaHandler.java | 93 +- .../CoreProtectEditSessionEvent.java | 53 +- .../worldedit/CoreProtectLogger.java | 16 +- .../worldedit/WorldEditBlockState.java | 61 + .../worldedit/WorldEditLogger.java | 203 +- src/main/resources/config.yml | 150 + 200 files changed, 17340 insertions(+), 9325 deletions(-) create mode 100644 config/formatter/eclipse-java-formatter.xml create mode 100644 src/main/resources/config.yml diff --git a/build.gradle.kts b/build.gradle.kts index 65318fd..c5158ae 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,17 +1,16 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import org.apache.tools.ant.filters.ReplaceTokens -import org.gradle.jvm.tasks.Jar /* ------------------------------ Plugins ------------------------------ */ plugins { id("java") // Import Java plugin. id("java-library") // Import Java Library plugin. - id("com.diffplug.spotless") version "7.0.4" // Import Spotless plugin. - id("com.gradleup.shadow") version "8.3.6" // Import Shadow plugin. + id("com.diffplug.spotless") version "8.1.0" // Import Spotless plugin. + id("com.gradleup.shadow") version "8.3.9" // Import Shadow plugin. id("checkstyle") // Import Checkstyle plugin. eclipse // Import Eclipse plugin. kotlin("jvm") version "2.1.21" // Import Kotlin JVM plugin. } + /* --------------------------- JDK / Kotlin ---------------------------- */ java { sourceCompatibility = JavaVersion.VERSION_17 // Compile with JDK 17 compatibility. @@ -23,7 +22,7 @@ java { kotlin { jvmToolchain(17) } -/* ----------------------------- // Declare bundle identifier. Metadata ------------------------------ */ +/* ----------------------------- Metadata ------------------------------ */ group = "net.coreprotect" val version = "22.4" // Declare plugin version (will be in .jar). @@ -54,9 +53,9 @@ repositories { /* ---------------------- Java project deps ---------------------------- */ dependencies { - implementation(platform("com.intellectualsites.bom:bom-newest:1.45")) compileOnly("io.papermc.paper:paper-api:1.19-R0.1-SNAPSHOT") compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.3.0-SNAPSHOT") + implementation(platform("com.intellectualsites.bom:bom-newest:1.45")) implementation("com.zaxxer:HikariCP:5.0.1") implementation("com.github.oshi:oshi-core:6.6.5") } @@ -94,9 +93,30 @@ tasks.withType().configureEach { options.encoding = "UTF-8" // Use UTF-8 file encoding. } +/* ----------------------------- Auto Formatting ------------------------ */ +spotless { + java { + eclipse().configFile("config/formatter/eclipse-java-formatter.xml") // Eclipse java formatting. + leadingTabsToSpaces() // Convert leftover leading tabs to spaces. + removeUnusedImports() // Remove imports that aren't being called. + } + kotlinGradle { + ktfmt().kotlinlangStyle().configure { it.setMaxWidth(120) } // JetBrains Kotlin formatting. + target("build.gradle.kts", "settings.gradle.kts") // Gradle files to format. + } +} + checkstyle { toolVersion = "10.18.1" // Declare checkstyle version to use. configFile = file("config/checkstyle/checkstyle.xml") // Point checkstyle to config file. isIgnoreFailures = true // Don't fail the build if checkstyle does not pass. isShowViolations = true // Show the violations in any IDE with the checkstyle plugin. } + +tasks.named("compileJava") { + dependsOn("spotlessApply") // Run spotless before compiling with the JDK. +} + +tasks.named("spotlessCheck") { + dependsOn("spotlessApply") // Run spotless before checking if spotless ran. +} diff --git a/config/formatter/eclipse-java-formatter.xml b/config/formatter/eclipse-java-formatter.xml new file mode 100644 index 0000000..a3e01a0 --- /dev/null +++ b/config/formatter/eclipse-java-formatter.xml @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/net/coreprotect/CoreProtect.java b/src/main/java/net/coreprotect/CoreProtect.java index e131d5c..202dfc1 100755 --- a/src/main/java/net/coreprotect/CoreProtect.java +++ b/src/main/java/net/coreprotect/CoreProtect.java @@ -3,6 +3,12 @@ package net.coreprotect; import java.io.File; import java.util.Iterator; import java.util.Map.Entry; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.block.data.BlockData; +import org.bukkit.plugin.java.JavaPlugin; + import net.coreprotect.command.CommandHandler; import net.coreprotect.command.TabHandler; import net.coreprotect.config.Config; @@ -20,12 +26,6 @@ import net.coreprotect.thread.Scheduler; import net.coreprotect.utility.Chat; import net.coreprotect.utility.Teleport; import net.coreprotect.utility.Util; -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; public final class CoreProtect extends JavaPlugin { @@ -37,10 +37,12 @@ public final class CoreProtect extends JavaPlugin { * @return This CoreProtect instance */ public static CoreProtect getInstance() { + return instance; + } - private CoreProtectAPI api = new CoreProtectAPI(); + private final CoreProtectAPI api = new CoreProtectAPI(); /** * Get the CoreProtect API @@ -48,18 +50,23 @@ public final class CoreProtect extends JavaPlugin { * @return The CoreProtect API */ public CoreProtectAPI getAPI() { + return api; + } @Override public void onEnable() { + instance = this; ConfigHandler.path = this.getDataFolder().getPath() + File.separator; Language.loadPhrases(); boolean start = performVersionChecks(); if (start) { + try { + Consumer.initialize(); // Prepare consumer (keep this here) new ListenerHandler(this); getCommand("coreprotect").setExecutor(CommandHandler.getInstance()); @@ -69,146 +76,207 @@ public final class CoreProtect extends JavaPlugin { getCommand("co").setExecutor(CommandHandler.getInstance()); getCommand("co").setTabCompleter(new TabHandler()); - boolean exists = (new File(ConfigHandler.path)).exists(); + final boolean exists = (new File(ConfigHandler.path)).exists(); if (!exists) { + new File(ConfigHandler.path).mkdir(); + } + start = ConfigHandler.performInitialization(true); // Perform any necessary initialization - } catch (Exception e) { - e.printStackTrace(); + + } catch (Exception error) { + + error.printStackTrace(); start = false; + } + } if (start) { - PluginDescriptionFile pluginDescription = this.getDescription(); - Util.sendConsoleComponentStartup( - Bukkit.getServer().getConsoleSender(), + + Util.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.ENJOY_COREPROTECT, getPluginMeta().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); + Scheduler.scheduleSyncDelayedTask(this, () -> { - Thread cacheCleanUpThread = new Thread(new CacheHandler()); + try { + + final Thread networkHandler = new Thread(new NetworkHandler(true, true)); + networkHandler.start(); + + } catch (Exception error) { + + error.printStackTrace(); + + } + + }, 0); + + final Thread cacheCleanUpThread = new Thread(new CacheHandler()); cacheCleanUpThread.start(); Consumer.startConsumer(); } else { + Chat.console(Phrase.build(Phrase.ENABLE_FAILED, ConfigHandler.EDITION_NAME)); getServer().getPluginManager().disablePlugin(this); + } + } @Override public void onDisable() { + safeShutdown(this); + } private static boolean performVersionChecks() { + try { - String[] bukkitVersion = Bukkit.getServer().getBukkitVersion().split("[-.]"); + + final String[] bukkitVersion = Bukkit.getServer().getBukkitVersion().split("[-.]"); if (Util.newVersion(bukkitVersion[0] + "." + bukkitVersion[1], ConfigHandler.MINECRAFT_VERSION)) { + Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Minecraft", ConfigHandler.MINECRAFT_VERSION)); return false; + } + if (Util.newVersion(ConfigHandler.LATEST_VERSION, bukkitVersion[0] + "." + bukkitVersion[1]) - && Util.isBranch("master")) { - Chat.console(Phrase.build( - Phrase.VERSION_INCOMPATIBLE, "Minecraft", bukkitVersion[0] + "." + bukkitVersion[1])); + && Util.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("\\."); + + final String[] javaVersion = (System.getProperty("java.version").replaceAll("[^0-9.]", "") + ".0") + .split("\\."); if (Util.newVersion(javaVersion[0] + "." + javaVersion[1], ConfigHandler.JAVA_VERSION)) { + Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Java", ConfigHandler.JAVA_VERSION)); return false; + } ConfigHandler.SERVER_VERSION = Integer.parseInt(bukkitVersion[1]); - } catch (Exception e) { - e.printStackTrace(); + + } catch (Exception error) { + + error.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); - } + + plugin.getServer().getOnlinePlayers().forEach(PlayerQuitListener::queuePlayerQuit); + } if (!ConfigHandler.isFolia) { - Iterator> iterator = - Teleport.revertBlocks.entrySet().iterator(); + + final Iterator> iterator = Teleport.revertBlocks.entrySet().iterator(); while (iterator.hasNext()) { - Entry entry = iterator.next(); + + final Entry entry = iterator.next(); entry.getKey().getBlock().setBlockData(entry.getValue()); iterator.remove(); + } + } ConfigHandler.serverRunning = false; - long shutdownTime = System.currentTimeMillis(); + final 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(); + + final 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))); + + final int consumerId = (Consumer.currentConsumer == 1) ? 1 : 0; + final int consumerCount = Consumer.getConsumerSize(consumerId) + + Process.getCurrentConsumerSize(); + Chat.console(Phrase.build(Phrase.LOGGING_ITEMS, "%,d".formatted(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(); + Chat.console(Phrase.build(Phrase.DISABLE_SUCCESS, "CoreProtect v" + plugin.getPluginMeta().getVersion())); + + } catch (Exception error) { + + error.printStackTrace(); + } + } -} + +} \ No newline at end of file diff --git a/src/main/java/net/coreprotect/CoreProtectAPI.java b/src/main/java/net/coreprotect/CoreProtectAPI.java index 71e61e7..dcf7630 100755 --- a/src/main/java/net/coreprotect/CoreProtectAPI.java +++ b/src/main/java/net/coreprotect/CoreProtectAPI.java @@ -32,64 +32,94 @@ import org.bukkit.entity.Player; public class CoreProtectAPI extends Queue { public class ParseResult { + String[] parse; public ParseResult(String[] data) { + parse = data; + } public int getActionId() { + return Integer.parseInt(parse[7]); + } public String getActionString() { + int actionID = Integer.parseInt(parse[7]); if (parse.length < 13 && Integer.parseInt(parse[6]) == SessionLookup.ID) { + switch (actionID) { + case 0: return "logout"; case 1: return "login"; default: return "unknown"; + } + } String result = "unknown"; if (actionID == 0) { + result = "break"; + } else if (actionID == 1) { + result = "place"; + } else if (actionID == 2) { + result = "click"; + } else if (actionID == 3) { + result = "kill"; + } return result; + } @Deprecated public int getData() { + return Integer.parseInt(parse[6]); + } public String getPlayer() { + return parse[1]; + } @Deprecated public int getTime() { + return Integer.parseInt(parse[0]); + } public long getTimestamp() { + return Long.parseLong(parse[0]) * 1000L; + } public Material getType() { + if (parse.length < 13) { + return null; + } int actionID = this.getActionId(); @@ -97,547 +127,636 @@ public class CoreProtectAPI extends Queue { String typeName; if (actionID == 3) { + typeName = Util.getEntityType(type).name(); + } else { + typeName = Util.getType(type).name().toLowerCase(Locale.ROOT); typeName = Util.nameFilter(typeName, this.getData()); + } return Util.getType(typeName); + } public BlockData getBlockData() { + if (parse.length < 13) { + return null; + } String blockData = parse[12]; if (blockData == null || blockData.length() == 0) { + return getType().createBlockData(); + } + return Bukkit.getServer().createBlockData(blockData); + } public int getX() { + return Integer.parseInt(parse[2]); + } public int getY() { + return Integer.parseInt(parse[3]); + } public int getZ() { + return Integer.parseInt(parse[4]); + } public boolean isRolledBack() { + if (parse.length < 13) { + return false; + } return (Integer.parseInt(parse[8]) == 1 || Integer.parseInt(parse[8]) == 3); + } public String worldName() { + return Util.getWorldName(Integer.parseInt(parse.length < 13 ? parse[5] : parse[9])); + } + } private static Map parseList(List list) { + Map result = new HashMap<>(); if (list != null) { + for (Object value : list) { + if (value instanceof Material || value instanceof EntityType) { + result.put(value, false); + } else if (value instanceof Integer) { + Material material = Util.getType((Integer) value); result.put(material, false); + } + } + } return result; + } public int APIVersion() { + return 10; + } public List blockLookup(Block block, int time) { + if (Config.getGlobal().API_ENABLED) { + return BlockAPI.performLookup(block, time); + } + return null; + } public List queueLookup(Block block) { + return QueueLookup.performLookup(block); + } public List sessionLookup(String user, int time) { + return SessionLookup.performLookup(user, time); + } public boolean hasPlaced(String user, Block block, int time, int offset) { - // Determine if a user has placed a block at this location in the last # of seconds. + + // Determine if a user has placed a block at this location in the last # of + // seconds. boolean match = false; if (Config.getGlobal().API_ENABLED) { + long timestamp = System.currentTimeMillis(); long offsetTime = timestamp - offset * 1000L; List check = blockLookup(block, time); for (String[] value : check) { + ParseResult result = parseResult(value); - if (user.equalsIgnoreCase(result.getPlayer()) - && result.getActionId() == 1 - && result.getTimestamp() <= offsetTime) { + if (user.equalsIgnoreCase(result.getPlayer()) && result.getActionId() == 1 + && result.getTimestamp() <= offsetTime) + { + match = true; break; + } + } + } return match; + } public boolean hasRemoved(String user, Block block, int time, int offset) { - // Determine if a user has removed a block at this location in the last # of seconds. + + // Determine if a user has removed a block at this location in the last # of + // seconds. boolean match = false; if (Config.getGlobal().API_ENABLED) { + long timestamp = System.currentTimeMillis(); long offsetTime = timestamp - offset * 1000L; List check = blockLookup(block, time); for (String[] value : check) { + ParseResult result = parseResult(value); - if (user.equalsIgnoreCase(result.getPlayer()) - && result.getActionId() == 0 - && result.getTimestamp() <= offsetTime) { + if (user.equalsIgnoreCase(result.getPlayer()) && result.getActionId() == 0 + && result.getTimestamp() <= offsetTime) + { + match = true; break; + } + } + } return match; + } public boolean isEnabled() { + return Config.getGlobal().API_ENABLED; + } public boolean logChat(Player player, String message) { + if (Config.getGlobal().API_ENABLED && player != null && Config.getConfig(player.getWorld()).PLAYER_MESSAGES) { + if (message != null) { + if (message.length() > 0 && !message.startsWith("/")) { + long timestamp = System.currentTimeMillis() / 1000L; Queue.queuePlayerChat(player, message, timestamp); return true; + } + } + } return false; + } public boolean logCommand(Player player, String command) { + if (Config.getGlobal().API_ENABLED && player != null && Config.getConfig(player.getWorld()).PLAYER_COMMANDS) { + if (command != null) { + if (command.length() > 0 && command.startsWith("/")) { + long timestamp = System.currentTimeMillis() / 1000L; Queue.queuePlayerCommand(player, command, timestamp); return true; + } + } + } return false; + } public boolean logInteraction(String user, Location location) { + if (Config.getGlobal().API_ENABLED) { + if (user != null && location != null) { + if (user.length() > 0) { - Queue.queuePlayerInteraction( - user, - location.getBlock().getState(), - location.getBlock().getType()); + + Queue.queuePlayerInteraction(user, location.getBlock().getState(), location.getBlock().getType()); return true; + } + } + } return false; + } public boolean logContainerTransaction(String user, Location location) { + if (Config.getGlobal().API_ENABLED) { + return InventoryChangeListener.inventoryTransaction(user, location, null); + } + return false; + } public boolean logPlacement(String user, BlockState blockState) { + if (!Config.getGlobal().API_ENABLED) { + return false; + } if (blockState == null || user == null || user.length() == 0) { + return false; + } - Queue.queueBlockPlace( - user, - blockState, - blockState.getType(), - null, - blockState.getType(), - -1, - 0, + Queue.queueBlockPlace(user, blockState, blockState.getType(), null, blockState.getType(), -1, 0, blockState.getBlockData().getAsString()); return true; + } public boolean logPlacement(String user, Location location, Material type, BlockData blockData) { + if (Config.getGlobal().API_ENABLED) { + if (user != null && location != null) { + if (user.length() > 0) { + Block block = location.getBlock(); BlockState blockState = block.getState(); String blockDataString = null; if (blockData != null) { + blockDataString = blockData.getAsString(); + } Queue.queueBlockPlace(user, blockState, block.getType(), null, type, -1, 0, blockDataString); return true; + } + } + } + return false; + } @Deprecated public boolean logPlacement(String user, Location location, Material type, byte data) { + if (Config.getGlobal().API_ENABLED) { + if (user != null && location != null) { + if (user.length() > 0) { - Queue.queueBlockPlace( - user, - location.getBlock().getState(), - location.getBlock().getType(), - null, - type, - data, - 1, - null); + + Queue.queueBlockPlace(user, location.getBlock().getState(), location.getBlock().getType(), null, + type, data, 1, null); return true; + } + } + } return false; + } public boolean logRemoval(String user, BlockState blockState) { + if (!Config.getGlobal().API_ENABLED) { + return false; + } if (blockState == null || user == null || user.length() == 0) { + return false; + } - Queue.queueBlockBreak( - user, - blockState, - blockState.getType(), - blockState.getBlockData().getAsString(), - 0); + Queue.queueBlockBreak(user, blockState, blockState.getType(), blockState.getBlockData().getAsString(), 0); return true; + } public boolean logRemoval(String user, Location location, Material type, BlockData blockData) { + if (Config.getGlobal().API_ENABLED) { + if (user != null && location != null) { + if (user.length() > 0) { + String blockDataString = null; if (blockData != null) { + blockDataString = blockData.getAsString(); + } Block block = location.getBlock(); Database.containerBreakCheck(user, block.getType(), block, null, location); Queue.queueBlockBreak(user, location.getBlock().getState(), type, blockDataString, 0); return true; + } + } + } + return false; + } @Deprecated public boolean logRemoval(String user, Location location, Material type, byte data) { + if (Config.getGlobal().API_ENABLED) { + if (user != null && location != null) { + if (user.length() > 0) { - Queue.queueBlockBreak( - user, - location.getBlock().getState(), - type, - type.createBlockData().getAsString(), - data); + + Queue.queueBlockBreak(user, location.getBlock().getState(), type, + type.createBlockData().getAsString(), data); return true; + } + } + } return false; + } public ParseResult parseResult(String[] results) { + return new ParseResult(results); + } - public List performLookup( - int time, - List restrictUsers, - List excludeUsers, - List restrictBlocks, - List excludeBlocks, - List actionList, - int radius, - Location radiusLocation) { + public List performLookup(int time, List restrictUsers, List excludeUsers, + List restrictBlocks, List excludeBlocks, List actionList, int radius, + Location radiusLocation) + { + if (Config.getGlobal().API_ENABLED) { - return processData( - time, - radius, - radiusLocation, - parseList(restrictBlocks), - parseList(excludeBlocks), - restrictUsers, - excludeUsers, - actionList, - 0, - 1, - -1, - -1, + + return processData(time, radius, radiusLocation, parseList(restrictBlocks), parseList(excludeBlocks), + restrictUsers, excludeUsers, actionList, 0, 1, -1, -1, false); + + } + + return null; + + } + + @Deprecated + public List performLookup(String user, int time, int radius, Location location, List restrict, + List exclude) + { + + if (Config.getGlobal().API_ENABLED) { + + return processData(user, time, radius, location, parseList(restrict), parseList(exclude), 0, 1, -1, -1, false); + } + return null; + + } + + public List performPartialLookup(int time, List restrictUsers, List excludeUsers, + List restrictBlocks, List excludeBlocks, List actionList, int radius, + Location radiusLocation, int limitOffset, int limitCount) + { + + if (Config.getGlobal().API_ENABLED) { + + return processData(time, radius, radiusLocation, parseList(restrictBlocks), parseList(excludeBlocks), + restrictUsers, excludeUsers, actionList, 0, 1, limitOffset, limitCount, true); + + } + + return null; + } @Deprecated - public List performLookup( - String user, int time, int radius, Location location, List restrict, List exclude) { - if (Config.getGlobal().API_ENABLED) { - return processData( - user, time, radius, location, parseList(restrict), parseList(exclude), 0, 1, -1, -1, false); - } - return null; - } + public List performPartialLookup(String user, int time, int radius, Location location, + List restrict, List exclude, int limitOffset, int limitCount) + { - public List performPartialLookup( - int time, - List restrictUsers, - List excludeUsers, - List restrictBlocks, - List excludeBlocks, - List actionList, - int radius, - Location radiusLocation, - int limitOffset, - int limitCount) { if (Config.getGlobal().API_ENABLED) { - return processData( - time, - radius, - radiusLocation, - parseList(restrictBlocks), - parseList(excludeBlocks), - restrictUsers, - excludeUsers, - actionList, - 0, - 1, - limitOffset, - limitCount, - true); - } - return null; - } - @Deprecated - public List performPartialLookup( - String user, - int time, - int radius, - Location location, - List restrict, - List exclude, - int limitOffset, - int limitCount) { - if (Config.getGlobal().API_ENABLED) { - return processData( - user, - time, - radius, - location, - parseList(restrict), - parseList(exclude), - 0, - 1, - limitOffset, - limitCount, - true); + return processData(user, time, radius, location, parseList(restrict), parseList(exclude), 0, 1, limitOffset, + limitCount, true); + } + return null; + } public void performPurge(int time) { + Server server = Bukkit.getServer(); server.dispatchCommand(server.getConsoleSender(), "co purge t:" + time + "s"); + } - public List performRestore( - int time, - List restrictUsers, - List excludeUsers, - List restrictBlocks, - List excludeBlocks, - List actionList, - int radius, - Location radiusLocation) { + public List performRestore(int time, List restrictUsers, List excludeUsers, + List restrictBlocks, List excludeBlocks, List actionList, int radius, + Location radiusLocation) + { + if (Config.getGlobal().API_ENABLED) { - return processData( - time, - radius, - radiusLocation, - parseList(restrictBlocks), - parseList(excludeBlocks), - restrictUsers, - excludeUsers, - actionList, - 1, - 2, - -1, - -1, - false); + + return processData(time, radius, radiusLocation, parseList(restrictBlocks), parseList(excludeBlocks), + restrictUsers, excludeUsers, actionList, 1, 2, -1, -1, false); + } + return null; + } @Deprecated - public List performRestore( - String user, int time, int radius, Location location, List restrict, List exclude) { + public List performRestore(String user, int time, int radius, Location location, List restrict, + List exclude) + { + if (Config.getGlobal().API_ENABLED) { - return processData( - user, time, radius, location, parseList(restrict), parseList(exclude), 1, 2, -1, -1, false); + + return processData(user, time, radius, location, parseList(restrict), parseList(exclude), 1, 2, -1, -1, + false); + } + return null; + } - public List performRollback( - int time, - List restrictUsers, - List excludeUsers, - List restrictBlocks, - List excludeBlocks, - List actionList, - int radius, - Location radiusLocation) { + public List performRollback(int time, List restrictUsers, List excludeUsers, + List restrictBlocks, List excludeBlocks, List actionList, int radius, + Location radiusLocation) + { + if (Config.getGlobal().API_ENABLED) { - return processData( - time, - radius, - radiusLocation, - parseList(restrictBlocks), - parseList(excludeBlocks), - restrictUsers, - excludeUsers, - actionList, - 0, - 2, - -1, - -1, - false); + + return processData(time, radius, radiusLocation, parseList(restrictBlocks), parseList(excludeBlocks), + restrictUsers, excludeUsers, actionList, 0, 2, -1, -1, false); + } + return null; + } @Deprecated - public List performRollback( - String user, int time, int radius, Location location, List restrict, List exclude) { + public List performRollback(String user, int time, int radius, Location location, List restrict, + List exclude) + { + if (Config.getGlobal().API_ENABLED) { - return processData( - user, time, radius, location, parseList(restrict), parseList(exclude), 0, 2, -1, -1, false); + + return processData(user, time, radius, location, parseList(restrict), parseList(exclude), 0, 2, -1, -1, + false); + } + return null; + } - private List processData( - int time, - int radius, - Location location, - Map restrictBlocksMap, - Map excludeBlocks, - List restrictUsers, - List excludeUsers, - List actionList, - int action, - int lookup, - int offset, - int rowCount, - boolean useLimit) { + private List processData(int time, int radius, Location location, Map restrictBlocksMap, + Map excludeBlocks, List restrictUsers, List excludeUsers, + List actionList, int action, int lookup, int offset, int rowCount, boolean useLimit) + { + // You need to either specify time/radius or time/user List result = new ArrayList<>(); List uuids = new ArrayList<>(); if (restrictUsers == null) { + restrictUsers = new ArrayList<>(); + } if (excludeUsers == null) { + excludeUsers = new ArrayList<>(); + } if (actionList == null) { + actionList = new ArrayList<>(); + } List restrictBlocks = new ArrayList<>(restrictBlocksMap.keySet()); if (actionList.size() == 0 && restrictBlocks.size() > 0) { + boolean addedMaterial = false; boolean addedEntity = false; for (Object argBlock : restrictBlocks) { + if (argBlock instanceof Material && !addedMaterial) { + actionList.add(0); actionList.add(1); addedMaterial = true; + } else if (argBlock instanceof EntityType && !addedEntity) { + actionList.add(3); addedEntity = true; + } + } + } if (actionList.size() == 0) { + actionList.add(0); actionList.add(1); + } actionList.removeIf(actionListItem -> actionListItem > 3); if (restrictUsers.size() == 0) { + restrictUsers.add("#global"); + } long timestamp = System.currentTimeMillis() / 1000L; @@ -645,151 +764,128 @@ public class CoreProtectAPI extends Queue { long endTime = 0; if (radius < 1) { + radius = -1; + } if (restrictUsers.contains("#global") && radius == -1) { + return null; + } if (radius > -1 && location == null) { + return null; + } try (Connection connection = Database.getConnection(false, 1000)) { + if (connection != null) { + Statement statement = connection.createStatement(); boolean restrictWorld = false; if (radius > 0) { + restrictWorld = true; + } if (location == null) { + restrictWorld = false; + } Integer[] argRadius = null; if (location != null && radius > 0) { + int xMin = location.getBlockX() - radius; int xMax = location.getBlockX() + radius; int zMin = location.getBlockZ() - radius; int zMax = location.getBlockZ() + radius; - argRadius = new Integer[] {radius, xMin, xMax, null, null, zMin, zMax, 0}; + argRadius = new Integer[] { radius, xMin, xMax, null, null, zMin, zMax, 0 }; + } if (lookup == 1) { + if (location != null) { + restrictWorld = true; + } if (useLimit) { - result = Lookup.performPartialLookup( - statement, - null, - uuids, - restrictUsers, - restrictBlocks, - excludeBlocks, - excludeUsers, - actionList, - location, - argRadius, - null, - startTime, - endTime, - offset, - rowCount, - restrictWorld, - true); + + result = Lookup.performPartialLookup(statement, null, uuids, restrictUsers, restrictBlocks, + excludeBlocks, excludeUsers, actionList, location, argRadius, null, startTime, endTime, + offset, rowCount, restrictWorld, true); + } else { - result = Lookup.performLookup( - statement, - null, - uuids, - restrictUsers, - restrictBlocks, - excludeBlocks, - excludeUsers, - actionList, - location, - argRadius, - startTime, - endTime, - restrictWorld, - true); + + result = Lookup.performLookup(statement, null, uuids, restrictUsers, restrictBlocks, + excludeBlocks, excludeUsers, actionList, location, argRadius, startTime, endTime, + restrictWorld, true); + } + } else { + if (!Bukkit.isPrimaryThread()) { + boolean verbose = false; - result = Rollback.performRollbackRestore( - statement, - null, - uuids, - restrictUsers, - null, - restrictBlocks, - excludeBlocks, - excludeUsers, - actionList, - location, - argRadius, - startTime, - endTime, - restrictWorld, - false, - verbose, - action, - 0); + result = Rollback.performRollbackRestore(statement, null, uuids, restrictUsers, null, + restrictBlocks, excludeBlocks, excludeUsers, actionList, location, argRadius, startTime, + endTime, restrictWorld, false, verbose, action, 0); + } else { + Chat.console(Phrase.build(Phrase.PRIMARY_THREAD_ERROR)); + } + } statement.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } return result; + } @Deprecated - private List processData( - String user, - int time, - int radius, - Location location, - Map restrictBlocks, - Map excludeBlocks, - int action, - int lookup, - int offset, - int rowCount, - boolean useLimit) { + private List processData(String user, int time, int radius, Location location, + Map restrictBlocks, Map excludeBlocks, int action, int lookup, int offset, + int rowCount, boolean useLimit) + { + ArrayList restrictUsers = new ArrayList<>(); if (user != null) { + restrictUsers.add(user); + } - return processData( - time, - radius, - location, - restrictBlocks, - excludeBlocks, - restrictUsers, - null, - null, - action, - lookup, - offset, - rowCount, - useLimit); + return processData(time, radius, location, restrictBlocks, excludeBlocks, restrictUsers, null, null, action, + lookup, offset, rowCount, useLimit); + } public void testAPI() { + Chat.console(Phrase.build(Phrase.API_TEST)); + } + } diff --git a/src/main/java/net/coreprotect/api/BlockAPI.java b/src/main/java/net/coreprotect/api/BlockAPI.java index 96792b7..11f7e84 100644 --- a/src/main/java/net/coreprotect/api/BlockAPI.java +++ b/src/main/java/net/coreprotect/api/BlockAPI.java @@ -14,11 +14,15 @@ import org.bukkit.block.Block; public class BlockAPI { public static List performLookup(Block block, int offset) { + List result = new ArrayList<>(); try (Connection connection = Database.getConnection(false, 1000)) { + if (block == null) { + return result; + } int x = block.getX(); @@ -28,11 +32,15 @@ public class BlockAPI { int worldId = Util.getWorldId(block.getWorld().getName()); int checkTime = 0; if (offset > 0) { + checkTime = time - offset; + } if (connection == null) { + return result; + } Statement statement = connection.createStatement(); @@ -42,6 +50,7 @@ public class BlockAPI { ResultSet results = statement.executeQuery(query); while (results.next()) { + String resultTime = results.getString("time"); int resultUserId = results.getInt("user"); String resultAction = results.getString("action"); @@ -50,33 +59,33 @@ public class BlockAPI { byte[] resultBlockData = results.getBytes("blockdata"); String resultRolledBack = results.getString("rolled_back"); if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) { + UserStatement.loadName(connection, resultUserId); + } + String resultUser = ConfigHandler.playerIdCacheReversed.get(resultUserId); String blockData = Util.byteDataToString(resultBlockData, resultType); - String[] lookupData = new String[] { - resultTime, - resultUser, - String.valueOf(x), - String.valueOf(y), - String.valueOf(z), - String.valueOf(resultType), - resultData, - resultAction, - resultRolledBack, - String.valueOf(worldId), - blockData - }; + String[] lookupData = new String[] { resultTime, resultUser, String.valueOf(x), String.valueOf(y), + String.valueOf(z), String.valueOf(resultType), resultData, resultAction, resultRolledBack, + String.valueOf(worldId), blockData }; String[] lineData = Util.toStringArray(lookupData); result.add(lineData); + } + results.close(); statement.close(); + } catch (Exception e) { + e.printStackTrace(); + } return result; + } + } diff --git a/src/main/java/net/coreprotect/api/QueueLookup.java b/src/main/java/net/coreprotect/api/QueueLookup.java index 7dbad31..2504fdd 100644 --- a/src/main/java/net/coreprotect/api/QueueLookup.java +++ b/src/main/java/net/coreprotect/api/QueueLookup.java @@ -18,27 +18,39 @@ import org.bukkit.block.BlockState; public class QueueLookup extends Queue { private QueueLookup() { + throw new IllegalStateException("API class"); + } public static List performLookup(Block block) { + List result = new ArrayList<>(); if (!Config.getGlobal().API_ENABLED) { + return result; + } try { + int consumerCount = 0; int currentConsumerSize = Process.getCurrentConsumerSize(); if (currentConsumerSize == 0) { + consumerCount = Consumer.getConsumerSize(0) + Consumer.getConsumerSize(1); + } else { + int consumerId = (Consumer.currentConsumer == 1) ? 1 : 0; consumerCount = Consumer.getConsumerSize(consumerId) + currentConsumerSize; + } if (consumerCount == 0) { + return result; + } int currentConsumer = Consumer.currentConsumer; @@ -49,19 +61,22 @@ public class QueueLookup extends Queue { Location oldLocation = block.getLocation(); ListIterator iterator = consumerData.listIterator(); while (iterator.hasNext()) { + Object[] data = iterator.next(); int id = (int) data[0]; int action = (int) data[1]; if (action != Process.BLOCK_BREAK && action != Process.BLOCK_PLACE) { + continue; + } String[] userData = users.get(id); Object objectData = consumerObject.get(id); - if (userData != null - && objectData != null - && (objectData instanceof BlockState) - && ((BlockState) objectData).getLocation().equals(oldLocation)) { + if (userData != null && objectData != null && (objectData instanceof BlockState) + && ((BlockState) objectData).getLocation().equals(oldLocation)) + { + Material blockType = (Material) data[2]; int legacyData = (int) data[3]; String blockData = (String) data[7]; @@ -72,29 +87,27 @@ public class QueueLookup extends Queue { int resultType = Util.getBlockId(blockType); int time = (int) (System.currentTimeMillis() / 1000L); - String[] lookupData = new String[] { - String.valueOf(time), - user, - String.valueOf(location.getBlockX()), - String.valueOf(location.getBlockY()), - String.valueOf(location.getBlockZ()), - String.valueOf(resultType), - String.valueOf(legacyData), - String.valueOf(action), - "0", - String.valueOf(wid), - blockData - }; + String[] lookupData = new String[] { String.valueOf(time), user, + String.valueOf(location.getBlockX()), String.valueOf(location.getBlockY()), + String.valueOf(location.getBlockZ()), String.valueOf(resultType), + String.valueOf(legacyData), String.valueOf(action), "0", String.valueOf(wid), blockData }; String[] lineData = Util.toStringArray(lookupData); result.add(lineData); + } + } Collections.reverse(result); + } catch (Exception e) { + e.printStackTrace(); + } return result; + } + } diff --git a/src/main/java/net/coreprotect/api/SessionLookup.java b/src/main/java/net/coreprotect/api/SessionLookup.java index add3c6e..ff4a229 100644 --- a/src/main/java/net/coreprotect/api/SessionLookup.java +++ b/src/main/java/net/coreprotect/api/SessionLookup.java @@ -16,37 +16,52 @@ public class SessionLookup { public static final int ID = 0; private SessionLookup() { + throw new IllegalStateException("API class"); + } public static List performLookup(String user, int offset) { + List result = new ArrayList<>(); if (!Config.getGlobal().API_ENABLED) { + return result; + } try (Connection connection = Database.getConnection(false, 1000)) { + if (connection == null || user == null) { + return result; + } String type = String.valueOf(ID); int time = (int) (System.currentTimeMillis() / 1000L); int checkTime = 0; if (offset > 0) { + checkTime = time - offset; + } if (ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT)) == null) { + UserStatement.loadId(connection, user, null); + } + int userId = ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT)); try (Statement statement = connection.createStatement()) { + String query = "SELECT time,user,wid,x,y,z,action FROM " + ConfigHandler.prefix + "session WHERE user = '" + userId + "' AND time > '" + checkTime + "' ORDER BY rowid DESC"; ResultSet results = statement.executeQuery(query); while (results.next()) { + String resultTime = results.getString("time"); int resultUserId = results.getInt("user"); String resultWorldId = results.getString("wid"); @@ -56,21 +71,31 @@ public class SessionLookup { String resultAction = results.getString("action"); if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) { + UserStatement.loadName(connection, resultUserId); + } + String resultUser = ConfigHandler.playerIdCacheReversed.get(resultUserId); - String[] lookupData = new String[] { - resultTime, resultUser, resultX, resultY, resultZ, resultWorldId, type, resultAction - }; + String[] lookupData = new String[] { resultTime, resultUser, resultX, resultY, resultZ, + resultWorldId, type, resultAction }; result.add(lookupData); + } + results.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } return result; + } + } diff --git a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java index 2a9c358..2febe94 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java @@ -43,7 +43,9 @@ public class BukkitAdapter implements BukkitInterface { public static final int BUKKIT_V1_20 = 20; public static void loadAdapter() { + switch (ConfigHandler.SERVER_VERSION) { + case BUKKIT_V1_13: case BUKKIT_V1_14: case BUKKIT_V1_15: @@ -62,54 +64,69 @@ public class BukkitAdapter implements BukkitInterface { default: BukkitAdapter.ADAPTER = new Bukkit_v1_19(); break; + } + } @Override public String parseLegacyName(String name) { + return name; + } @Override public int getLegacyBlockId(Material material) { + return -1; + } @Override public boolean getEntityMeta(LivingEntity entity, List info) { + return false; + } @Override public boolean setEntityMeta(Entity entity, Object value, int count) { + return false; + } @Override - public boolean getItemMeta( - ItemMeta itemMeta, List> list, List>> metadata, int slot) { + public boolean getItemMeta(ItemMeta itemMeta, List> list, + List>> metadata, int slot) + { + return false; + } @Override public boolean setItemMeta(Material rowType, ItemStack itemstack, List> map) { + return false; + } @Override public boolean isAttached(Block block, Block scanBlock, BlockData blockData, int scanMin) { + if (blockData instanceof Directional && blockData instanceof FaceAttachable) { + Directional directional = (Directional) blockData; FaceAttachable faceAttachable = (FaceAttachable) blockData; boolean scanButton = false; switch (faceAttachable.getAttachedFace()) { + case WALL: - scanButton = (scanMin < 5 - && scanBlock - .getRelative(directional.getFacing().getOppositeFace()) - .getLocation() - .equals(block.getLocation())); + scanButton = (scanMin < 5 && scanBlock.getRelative(directional.getFacing().getOppositeFace()) + .getLocation().equals(block.getLocation())); break; case FLOOR: scanButton = (scanMin == 5); @@ -119,95 +136,132 @@ public class BukkitAdapter implements BukkitInterface { break; default: break; + } return scanButton; + } return true; // unvalidated attachments default to true + } @Override public int getMinHeight(World world) { + return 0; + } @Override public Material getBucketContents(Material material) { + return Material.AIR; + } @Override public boolean isItemFrame(Material material) { + return (material == Material.ITEM_FRAME); + } @Override public Material getFrameType(Entity entity) { + return Material.ITEM_FRAME; + } @Override public Material getFrameType(EntityType type) { + return type == EntityType.ITEM_FRAME ? Material.ITEM_FRAME : null; + } @Override public Class getFrameClass(Material material) { + return ItemFrame.class; + } @Override public boolean isGlowing(Sign sign, boolean isFront) { + return false; + } @Override public boolean isWaxed(Sign sign) { + return false; + } @Override public boolean isInvisible(Material material) { + return Util.isAir(material); + } @Override public ItemStack adjustIngredient(MerchantRecipe recipe, ItemStack itemStack) { + return null; + } @Override public void setGlowing(Sign sign, boolean isFront, boolean isGlowing) { + return; + } @Override public void setColor(Sign sign, boolean isFront, int color) { + if (!isFront) { + return; + } sign.setColor(DyeColor.getByColor(Color.fromRGB(color))); + } @Override public void setWaxed(Sign sign, boolean isWaxed) { + return; + } @Override public int getColor(Sign sign, boolean isFront) { + if (isFront) { + return sign.getColor().getColor().asRGB(); + } return 0; + } @Override public Material getPlantSeeds(Material material) { + switch (material) { + case WHEAT: material = Material.WHEAT_SEEDS; break; @@ -221,99 +275,143 @@ public class BukkitAdapter implements BukkitInterface { material = Material.BEETROOT_SEEDS; break; default: + } return material; + } @Override public boolean isDecoratedPot(Material material) { + return false; + } @Override public boolean isSuspiciousBlock(Material material) { + return false; + } @Override public boolean isSign(Material material) { + return Tag.SIGNS.isTagged(material); + } @Override public boolean isChiseledBookshelf(Material material) { + return false; + } @Override public boolean isBookshelfBook(Material material) { + return false; + } @Override public ItemStack getChiseledBookshelfBook(BlockState blockState, PlayerInteractEvent event) { + return null; + } @Override public String getLine(Sign sign, int line) { + if (line < 4) { + return sign.getLine(line); + } else { + return ""; + } + } @Override public void setLine(Sign sign, int line, String string) { + if (string == null) { + string = ""; + } if (line < 4) { + sign.setLine(line, string); + } + } @Override public boolean isSignFront(SignChangeEvent event) { + return true; + } @Override public ItemStack getArrowMeta(Arrow arrow, ItemStack itemStack) { + PotionData data = arrow.getBasePotionData(); if (data.getType() != PotionType.valueOf("UNCRAFTABLE")) { + itemStack = new ItemStack(Material.TIPPED_ARROW); PotionMeta meta = (PotionMeta) itemStack.getItemMeta(); meta.setBasePotionData(data); for (PotionEffect effect : arrow.getCustomEffects()) { + meta.addCustomEffect(effect, false); + } + itemStack.setItemMeta(meta); + } return itemStack; + } @Override public EntityType getEntityType(Material material) { + switch (material) { + case END_CRYSTAL: return EntityType.valueOf("ENDER_CRYSTAL"); default: return EntityType.UNKNOWN; + } + } @Override public Object getRegistryKey(Object value) { + return value; + } @Override public Object getRegistryValue(String key, Object tClass) { + return null; + } + } diff --git a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java index e5452c6..e3482aa 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java @@ -36,8 +36,8 @@ public interface BukkitInterface { public boolean setEntityMeta(Entity entity, Object value, int count); - public boolean getItemMeta( - ItemMeta itemMeta, List> list, List>> metadata, int slot); + public boolean getItemMeta(ItemMeta itemMeta, List> list, + List>> metadata, int slot); public boolean setItemMeta(Material rowType, ItemStack itemstack, List> map); @@ -90,4 +90,5 @@ public interface BukkitInterface { public Object getRegistryKey(Object value); public Object getRegistryValue(String key, Object tClass); + } diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_17.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_17.java index 1ab2a7b..27b11d4 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_17.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_17.java @@ -28,317 +28,179 @@ import org.bukkit.inventory.meta.ItemMeta; public class Bukkit_v1_17 extends BukkitAdapter implements BukkitInterface { public Bukkit_v1_17() { - BlockGroup.TRACK_ANY = new HashSet<>(Arrays.asList( - Material.PISTON_HEAD, - Material.LEVER, - Material.BELL, - Material.SMALL_AMETHYST_BUD, - Material.MEDIUM_AMETHYST_BUD, - Material.LARGE_AMETHYST_BUD, - Material.AMETHYST_CLUSTER, - Material.GLOW_LICHEN)); - BlockGroup.TRACK_TOP = new HashSet<>(Arrays.asList( - Material.TORCH, - Material.REDSTONE_TORCH, - Material.BAMBOO, - Material.BAMBOO_SAPLING, - Material.CORNFLOWER, - Material.LILY_OF_THE_VALLEY, - Material.WITHER_ROSE, - Material.SWEET_BERRY_BUSH, - Material.SCAFFOLDING, - Material.OAK_SAPLING, - Material.SPRUCE_SAPLING, - Material.BIRCH_SAPLING, - Material.JUNGLE_SAPLING, - Material.ACACIA_SAPLING, - Material.DARK_OAK_SAPLING, - Material.POWERED_RAIL, - Material.DETECTOR_RAIL, - Material.FERN, - Material.DEAD_BUSH, - Material.DANDELION, - Material.POPPY, - Material.BLUE_ORCHID, - Material.ALLIUM, - Material.AZURE_BLUET, - Material.RED_TULIP, - Material.ORANGE_TULIP, - Material.WHITE_TULIP, - Material.PINK_TULIP, - Material.OXEYE_DAISY, - Material.BROWN_MUSHROOM, - Material.RED_MUSHROOM, - Material.REDSTONE_WIRE, - Material.WHEAT, - Material.ACACIA_SIGN, - Material.BIRCH_SIGN, - Material.DARK_OAK_SIGN, - Material.JUNGLE_SIGN, - Material.OAK_SIGN, - Material.SPRUCE_SIGN, - Material.WHITE_BANNER, - Material.ORANGE_BANNER, - Material.MAGENTA_BANNER, - Material.LIGHT_BLUE_BANNER, - Material.YELLOW_BANNER, - Material.LIME_BANNER, - Material.PINK_BANNER, - Material.GRAY_BANNER, - Material.LIGHT_GRAY_BANNER, - Material.CYAN_BANNER, - Material.PURPLE_BANNER, - Material.BLUE_BANNER, - Material.BROWN_BANNER, - Material.GREEN_BANNER, - Material.RED_BANNER, - Material.BLACK_BANNER, - Material.RAIL, - Material.IRON_DOOR, - Material.SNOW, - Material.CACTUS, - Material.SUGAR_CANE, - Material.REPEATER, - Material.PUMPKIN_STEM, - Material.MELON_STEM, - Material.CARROT, - Material.POTATO, - Material.COMPARATOR, - Material.ACTIVATOR_RAIL, - Material.SUNFLOWER, - Material.LILAC, - Material.TALL_GRASS, - Material.LARGE_FERN, - Material.ROSE_BUSH, - Material.PEONY, - Material.NETHER_WART, - Material.CHORUS_PLANT, - Material.CHORUS_FLOWER, - Material.KELP, - Material.SOUL_TORCH, - Material.TWISTING_VINES, - Material.CRIMSON_FUNGUS, - Material.WARPED_FUNGUS, - Material.CRIMSON_ROOTS, - Material.WARPED_ROOTS, - Material.NETHER_SPROUTS, - Material.CRIMSON_SIGN, - Material.WARPED_SIGN, - Material.AZALEA, - Material.FLOWERING_AZALEA, - Material.SMALL_DRIPLEAF, - Material.BIG_DRIPLEAF)); - BlockGroup.TRACK_TOP_BOTTOM = - new HashSet<>(Arrays.asList(Material.POINTED_DRIPSTONE, Material.BIG_DRIPLEAF_STEM)); - BlockGroup.TRACK_BOTTOM = new HashSet<>(Arrays.asList( - Material.WEEPING_VINES, Material.CAVE_VINES, Material.CAVE_VINES_PLANT, Material.HANGING_ROOTS)); + + BlockGroup.TRACK_ANY = new HashSet<>(Arrays.asList(Material.PISTON_HEAD, Material.LEVER, Material.BELL, + Material.SMALL_AMETHYST_BUD, Material.MEDIUM_AMETHYST_BUD, Material.LARGE_AMETHYST_BUD, + Material.AMETHYST_CLUSTER, Material.GLOW_LICHEN)); + BlockGroup.TRACK_TOP = new HashSet<>(Arrays.asList(Material.TORCH, Material.REDSTONE_TORCH, Material.BAMBOO, + Material.BAMBOO_SAPLING, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, + Material.SWEET_BERRY_BUSH, Material.SCAFFOLDING, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, + Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, + Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, + Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, + Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, + Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.REDSTONE_WIRE, Material.WHEAT, + Material.ACACIA_SIGN, Material.BIRCH_SIGN, Material.DARK_OAK_SIGN, Material.JUNGLE_SIGN, + Material.OAK_SIGN, Material.SPRUCE_SIGN, Material.WHITE_BANNER, Material.ORANGE_BANNER, + Material.MAGENTA_BANNER, Material.LIGHT_BLUE_BANNER, Material.YELLOW_BANNER, Material.LIME_BANNER, + Material.PINK_BANNER, Material.GRAY_BANNER, Material.LIGHT_GRAY_BANNER, Material.CYAN_BANNER, + Material.PURPLE_BANNER, Material.BLUE_BANNER, Material.BROWN_BANNER, Material.GREEN_BANNER, + Material.RED_BANNER, Material.BLACK_BANNER, Material.RAIL, Material.IRON_DOOR, Material.SNOW, + Material.CACTUS, Material.SUGAR_CANE, Material.REPEATER, Material.PUMPKIN_STEM, Material.MELON_STEM, + Material.CARROT, Material.POTATO, Material.COMPARATOR, Material.ACTIVATOR_RAIL, Material.SUNFLOWER, + Material.LILAC, Material.TALL_GRASS, Material.LARGE_FERN, Material.ROSE_BUSH, Material.PEONY, + Material.NETHER_WART, Material.CHORUS_PLANT, Material.CHORUS_FLOWER, Material.KELP, Material.SOUL_TORCH, + Material.TWISTING_VINES, Material.CRIMSON_FUNGUS, Material.WARPED_FUNGUS, Material.CRIMSON_ROOTS, + Material.WARPED_ROOTS, Material.NETHER_SPROUTS, Material.CRIMSON_SIGN, Material.WARPED_SIGN, + Material.AZALEA, Material.FLOWERING_AZALEA, Material.SMALL_DRIPLEAF, Material.BIG_DRIPLEAF)); + BlockGroup.TRACK_TOP_BOTTOM = new HashSet<>( + Arrays.asList(Material.POINTED_DRIPSTONE, Material.BIG_DRIPLEAF_STEM)); + BlockGroup.TRACK_BOTTOM = new HashSet<>(Arrays.asList(Material.WEEPING_VINES, Material.CAVE_VINES, + Material.CAVE_VINES_PLANT, Material.HANGING_ROOTS)); BlockGroup.VINES = new HashSet<>( Arrays.asList(Material.VINE, Material.WEEPING_VINES, Material.TWISTING_VINES, Material.CAVE_VINES)); - BlockGroup.CANDLES = new HashSet<>(Arrays.asList( - Material.CANDLE, - Material.BLACK_CANDLE, - Material.BLUE_CANDLE, - Material.BROWN_CANDLE, - Material.CYAN_CANDLE, - Material.GRAY_CANDLE, - Material.GREEN_CANDLE, - Material.LIGHT_BLUE_CANDLE, - Material.LIGHT_GRAY_CANDLE, - Material.LIME_CANDLE, - Material.MAGENTA_CANDLE, - Material.ORANGE_CANDLE, - Material.PINK_CANDLE, - Material.PURPLE_CANDLE, - Material.RED_CANDLE, - Material.WHITE_CANDLE, - Material.YELLOW_CANDLE, - Material.CANDLE_CAKE, - Material.BLACK_CANDLE_CAKE, - Material.BLUE_CANDLE_CAKE, - Material.BROWN_CANDLE_CAKE, - Material.CYAN_CANDLE_CAKE, - Material.GRAY_CANDLE_CAKE, - Material.GREEN_CANDLE_CAKE, - Material.LIGHT_BLUE_CANDLE_CAKE, - Material.LIGHT_GRAY_CANDLE_CAKE, - Material.LIME_CANDLE_CAKE, - Material.MAGENTA_CANDLE_CAKE, - Material.ORANGE_CANDLE_CAKE, - Material.PINK_CANDLE_CAKE, - Material.PURPLE_CANDLE_CAKE, - Material.RED_CANDLE_CAKE, - Material.WHITE_CANDLE_CAKE, - Material.YELLOW_CANDLE_CAKE)); - BlockGroup.AMETHYST = new HashSet<>(Arrays.asList( - Material.SMALL_AMETHYST_BUD, - Material.MEDIUM_AMETHYST_BUD, - Material.LARGE_AMETHYST_BUD, - Material.AMETHYST_CLUSTER)); - BlockGroup.UPDATE_STATE = new HashSet<>(Arrays.asList( - Material.TORCH, - Material.WALL_TORCH, - Material.REDSTONE_WIRE, - Material.RAIL, - Material.POWERED_RAIL, - Material.DETECTOR_RAIL, - Material.FURNACE, - Material.BLAST_FURNACE, - Material.SMOKER, - Material.LEVER, - Material.REDSTONE_TORCH, - Material.REDSTONE_WALL_TORCH, - Material.GLOWSTONE, - Material.JACK_O_LANTERN, - Material.REPEATER, - Material.REDSTONE_LAMP, - Material.BEACON, - Material.COMPARATOR, - Material.DAYLIGHT_DETECTOR, - Material.REDSTONE_BLOCK, - Material.HOPPER, - Material.CHEST, - Material.TRAPPED_CHEST, - Material.ACTIVATOR_RAIL, - Material.SOUL_TORCH, - Material.SOUL_WALL_TORCH, - Material.SHROOMLIGHT, - Material.RESPAWN_ANCHOR, - Material.CRYING_OBSIDIAN, - Material.TARGET, - Material.SMALL_AMETHYST_BUD, - Material.MEDIUM_AMETHYST_BUD, - Material.LARGE_AMETHYST_BUD, - Material.AMETHYST_CLUSTER, - Material.CAVE_VINES, - Material.CAVE_VINES_PLANT, - Material.GLOW_LICHEN, - Material.LIGHT, + BlockGroup.CANDLES = new HashSet<>(Arrays.asList(Material.CANDLE, Material.BLACK_CANDLE, Material.BLUE_CANDLE, + Material.BROWN_CANDLE, Material.CYAN_CANDLE, Material.GRAY_CANDLE, Material.GREEN_CANDLE, + Material.LIGHT_BLUE_CANDLE, Material.LIGHT_GRAY_CANDLE, Material.LIME_CANDLE, Material.MAGENTA_CANDLE, + Material.ORANGE_CANDLE, Material.PINK_CANDLE, Material.PURPLE_CANDLE, Material.RED_CANDLE, + Material.WHITE_CANDLE, Material.YELLOW_CANDLE, Material.CANDLE_CAKE, Material.BLACK_CANDLE_CAKE, + Material.BLUE_CANDLE_CAKE, Material.BROWN_CANDLE_CAKE, Material.CYAN_CANDLE_CAKE, + Material.GRAY_CANDLE_CAKE, Material.GREEN_CANDLE_CAKE, Material.LIGHT_BLUE_CANDLE_CAKE, + Material.LIGHT_GRAY_CANDLE_CAKE, Material.LIME_CANDLE_CAKE, Material.MAGENTA_CANDLE_CAKE, + Material.ORANGE_CANDLE_CAKE, Material.PINK_CANDLE_CAKE, Material.PURPLE_CANDLE_CAKE, + Material.RED_CANDLE_CAKE, Material.WHITE_CANDLE_CAKE, Material.YELLOW_CANDLE_CAKE)); + BlockGroup.AMETHYST = new HashSet<>(Arrays.asList(Material.SMALL_AMETHYST_BUD, Material.MEDIUM_AMETHYST_BUD, + Material.LARGE_AMETHYST_BUD, Material.AMETHYST_CLUSTER)); + BlockGroup.UPDATE_STATE = new HashSet<>(Arrays.asList(Material.TORCH, Material.WALL_TORCH, + Material.REDSTONE_WIRE, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FURNACE, + Material.BLAST_FURNACE, Material.SMOKER, Material.LEVER, Material.REDSTONE_TORCH, + Material.REDSTONE_WALL_TORCH, Material.GLOWSTONE, Material.JACK_O_LANTERN, Material.REPEATER, + Material.REDSTONE_LAMP, Material.BEACON, Material.COMPARATOR, Material.DAYLIGHT_DETECTOR, + Material.REDSTONE_BLOCK, Material.HOPPER, Material.CHEST, Material.TRAPPED_CHEST, + Material.ACTIVATOR_RAIL, Material.SOUL_TORCH, Material.SOUL_WALL_TORCH, Material.SHROOMLIGHT, + Material.RESPAWN_ANCHOR, Material.CRYING_OBSIDIAN, Material.TARGET, Material.SMALL_AMETHYST_BUD, + Material.MEDIUM_AMETHYST_BUD, Material.LARGE_AMETHYST_BUD, Material.AMETHYST_CLUSTER, + Material.CAVE_VINES, Material.CAVE_VINES_PLANT, Material.GLOW_LICHEN, Material.LIGHT, Material.LAVA_CAULDRON)); - BlockGroup.NON_ATTACHABLE = new HashSet<>(Arrays.asList( - Material.AIR, - Material.CAVE_AIR, - Material.BARRIER, - Material.CORNFLOWER, - Material.LILY_OF_THE_VALLEY, - Material.WITHER_ROSE, - Material.SWEET_BERRY_BUSH, - Material.OAK_SAPLING, - Material.SPRUCE_SAPLING, - Material.BIRCH_SAPLING, - Material.JUNGLE_SAPLING, - Material.ACACIA_SAPLING, - Material.DARK_OAK_SAPLING, - Material.WATER, - Material.LAVA, - Material.POWERED_RAIL, - Material.DETECTOR_RAIL, - Material.FERN, - Material.DEAD_BUSH, - Material.DANDELION, - Material.POPPY, - Material.BLUE_ORCHID, - Material.ALLIUM, - Material.AZURE_BLUET, - Material.RED_TULIP, - Material.ORANGE_TULIP, - Material.WHITE_TULIP, - Material.PINK_TULIP, - Material.OXEYE_DAISY, - Material.BROWN_MUSHROOM, - Material.RED_MUSHROOM, - Material.TORCH, - Material.WALL_TORCH, - Material.REDSTONE_WIRE, - Material.LADDER, - Material.RAIL, - Material.LEVER, - Material.REDSTONE_TORCH, - Material.REDSTONE_WALL_TORCH, - Material.SNOW, - Material.SUGAR_CANE, - Material.NETHER_PORTAL, - Material.REPEATER, - Material.KELP, - Material.CHORUS_FLOWER, - Material.CHORUS_PLANT, - Material.SOUL_TORCH, - Material.SOUL_WALL_TORCH, - Material.LIGHT, - Material.SMALL_DRIPLEAF, - Material.BIG_DRIPLEAF, - Material.BIG_DRIPLEAF_STEM, - Material.GLOW_LICHEN, - Material.HANGING_ROOTS)); + BlockGroup.NON_ATTACHABLE = new HashSet<>(Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.BARRIER, + Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, + Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, + Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.WATER, Material.LAVA, + Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, + Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, + Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, + Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.TORCH, Material.WALL_TORCH, + Material.REDSTONE_WIRE, Material.LADDER, Material.RAIL, Material.LEVER, Material.REDSTONE_TORCH, + Material.REDSTONE_WALL_TORCH, Material.SNOW, Material.SUGAR_CANE, Material.NETHER_PORTAL, + Material.REPEATER, Material.KELP, Material.CHORUS_FLOWER, Material.CHORUS_PLANT, Material.SOUL_TORCH, + Material.SOUL_WALL_TORCH, Material.LIGHT, Material.SMALL_DRIPLEAF, Material.BIG_DRIPLEAF, + Material.BIG_DRIPLEAF_STEM, Material.GLOW_LICHEN, Material.HANGING_ROOTS)); BlockGroup.VERTICAL_TOP_BOTTOM = new HashSet<>(Arrays.asList(Material.BIG_DRIPLEAF_STEM)); + } @Override public String parseLegacyName(String name) { + switch (name) { + case "GRASS_PATH": name = "DIRT_PATH"; break; default: break; + } return name; + } @Override public int getLegacyBlockId(Material material) { + switch (material) { + case DIRT_PATH: return Util.getBlockId("GRASS_PATH", false); default: return -1; + } + } @Override public boolean getEntityMeta(LivingEntity entity, List info) { + if (entity instanceof Axolotl) { + Axolotl axolotl = (Axolotl) entity; info.add(axolotl.getVariant()); + } else if (entity instanceof Goat) { + Goat goat = (Goat) entity; info.add(goat.isScreaming()); + } else if (super.getEntityMeta(entity, info)) { + return true; + } else { + return false; + } return true; + } @Override public boolean setEntityMeta(Entity entity, Object value, int count) { + if (entity instanceof Axolotl) { + Axolotl axolotl = (Axolotl) entity; if (count == 0) { + org.bukkit.entity.Axolotl.Variant set = (org.bukkit.entity.Axolotl.Variant) value; axolotl.setVariant(set); + } + } else if (entity instanceof Goat) { + Goat goat = (Goat) entity; if (count == 0) { + boolean set = (Boolean) value; goat.setScreaming(set); + } + } else if (super.setEntityMeta(entity, value, count)) { + return true; + } else { + return false; + } return true; + } @Override - public boolean getItemMeta( - ItemMeta itemMeta, List> list, List>> metadata, int slot) { + public boolean getItemMeta(ItemMeta itemMeta, List> list, + List>> metadata, int slot) + { + if (itemMeta instanceof BundleMeta) { + BundleMeta meta = (BundleMeta) itemMeta; BundleMeta subMeta = (BundleMeta) meta.clone(); meta.setItems(null); @@ -346,120 +208,177 @@ public class Bukkit_v1_17 extends BukkitAdapter implements BukkitInterface { metadata.add(list); if (subMeta.hasItems()) { + list = new ArrayList<>(); for (ItemStack itemStack : subMeta.getItems()) { + Map itemMap = Util.serializeItemStack(itemStack, null, slot); if (itemMap.size() > 0) { + list.add(itemMap); + } + } + metadata.add(list); + } + } else if (super.getItemMeta(itemMeta, list, metadata, slot)) { + return true; + } else { + return false; + } return true; + } @Override public boolean setItemMeta(Material rowType, ItemStack itemstack, List> map) { + if ((rowType == Material.BUNDLE)) { + BundleMeta meta = (BundleMeta) itemstack.getItemMeta(); for (Map itemData : map) { + ItemStack itemStack = Util.unserializeItemStack(itemData); if (itemStack != null) { + meta.addItem(itemStack); + } + } + itemstack.setItemMeta(meta); + } else if (super.setItemMeta(rowType, itemstack, map)) { + return true; + } else { + return false; + } return true; + } @Override public boolean isAttached(Block block, Block scanBlock, BlockData blockData, int scanMin) { + if (blockData instanceof PointedDripstone) { + PointedDripstone pointedDripstone = (PointedDripstone) blockData; BlockFace blockFace = pointedDripstone.getVerticalDirection(); - boolean adjacent = scanBlock - .getRelative(blockFace.getOppositeFace()) - .getLocation() + boolean adjacent = scanBlock.getRelative(blockFace.getOppositeFace()).getLocation() .equals(block.getLocation()); if (!adjacent) { + return false; + } + } else if (!super.isAttached(block, scanBlock, blockData, scanMin)) { + return false; + } return true; + } @Override public int getMinHeight(World world) { + return world.getMinHeight(); + } @Override public Material getBucketContents(Material material) { + return (material == Material.POWDER_SNOW_BUCKET ? Material.POWDER_SNOW : Material.AIR); + } @Override public boolean isItemFrame(Material material) { + return (material == Material.ITEM_FRAME || material == Material.GLOW_ITEM_FRAME); + } @Override public Material getFrameType(Entity entity) { + return (entity instanceof GlowItemFrame) ? Material.GLOW_ITEM_FRAME : Material.ITEM_FRAME; + } @Override public Material getFrameType(EntityType type) { + switch (type) { + case ITEM_FRAME: return Material.ITEM_FRAME; case GLOW_ITEM_FRAME: return Material.GLOW_ITEM_FRAME; default: return null; + } + } @Override public Class getFrameClass(Material material) { + return (material == Material.GLOW_ITEM_FRAME) ? GlowItemFrame.class : ItemFrame.class; + } @Override public boolean isGlowing(Sign sign, boolean isFront) { + if (!isFront) { + return false; + } return sign.isGlowingText(); + } @Override public void setGlowing(Sign sign, boolean isFront, boolean isGlowing) { + if (!isFront) { + return; + } sign.setGlowingText(isGlowing); + } @Override public boolean isInvisible(Material material) { + return material.isAir() || material == Material.LIGHT; + } + } diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_18.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_18.java index 5fce477..e8690de 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_18.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_18.java @@ -9,20 +9,31 @@ public class Bukkit_v1_18 extends Bukkit_v1_17 implements BukkitInterface { @Override public ItemStack adjustIngredient(MerchantRecipe recipe, ItemStack itemStack) { + try { + if (hasAdjust == null) { + hasAdjust = true; MerchantRecipe.class.getMethod("adjust", ItemStack.class); // Bukkit 1.18.1+ + } else if (Boolean.FALSE.equals(hasAdjust)) { + return null; + } ItemStack adjustedStack = itemStack.clone(); recipe.adjust(adjustedStack); return adjustedStack; + } catch (Exception e) { + hasAdjust = false; return null; + } + } + } diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java index fe70312..8f33a40 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java @@ -14,384 +14,191 @@ import org.bukkit.entity.Tadpole; public class Bukkit_v1_19 extends Bukkit_v1_18 implements BukkitInterface { public Bukkit_v1_19() { - BlockGroup.TRACK_TOP = new HashSet<>(Arrays.asList( - Material.TORCH, - Material.REDSTONE_TORCH, - Material.BAMBOO, - Material.BAMBOO_SAPLING, - Material.CORNFLOWER, - Material.LILY_OF_THE_VALLEY, - Material.WITHER_ROSE, - Material.SWEET_BERRY_BUSH, - Material.SCAFFOLDING, - Material.OAK_SAPLING, - Material.SPRUCE_SAPLING, - Material.BIRCH_SAPLING, - Material.JUNGLE_SAPLING, - Material.MANGROVE_PROPAGULE, - Material.ACACIA_SAPLING, - Material.DARK_OAK_SAPLING, - Material.POWERED_RAIL, - Material.DETECTOR_RAIL, - Material.FERN, - Material.DEAD_BUSH, - Material.DANDELION, - Material.POPPY, - Material.BLUE_ORCHID, - Material.ALLIUM, - Material.AZURE_BLUET, - Material.RED_TULIP, - Material.ORANGE_TULIP, - Material.WHITE_TULIP, - Material.PINK_TULIP, - Material.OXEYE_DAISY, - Material.BROWN_MUSHROOM, - Material.RED_MUSHROOM, - Material.REDSTONE_WIRE, - Material.WHEAT, - Material.MANGROVE_SIGN, - Material.ACACIA_SIGN, - Material.BIRCH_SIGN, - Material.DARK_OAK_SIGN, - Material.JUNGLE_SIGN, - Material.OAK_SIGN, - Material.SPRUCE_SIGN, - Material.WHITE_BANNER, - Material.ORANGE_BANNER, - Material.MAGENTA_BANNER, - Material.LIGHT_BLUE_BANNER, - Material.YELLOW_BANNER, - Material.LIME_BANNER, - Material.PINK_BANNER, - Material.GRAY_BANNER, - Material.LIGHT_GRAY_BANNER, - Material.CYAN_BANNER, - Material.PURPLE_BANNER, - Material.BLUE_BANNER, - Material.BROWN_BANNER, - Material.GREEN_BANNER, - Material.RED_BANNER, - Material.BLACK_BANNER, - Material.RAIL, - Material.IRON_DOOR, - Material.SNOW, - Material.CACTUS, - Material.SUGAR_CANE, - Material.REPEATER, - Material.PUMPKIN_STEM, - Material.MELON_STEM, - Material.CARROT, - Material.POTATO, - Material.COMPARATOR, - Material.ACTIVATOR_RAIL, - Material.SUNFLOWER, - Material.LILAC, - Material.TALL_GRASS, - Material.LARGE_FERN, - Material.ROSE_BUSH, - Material.PEONY, - Material.NETHER_WART, - Material.CHORUS_PLANT, - Material.CHORUS_FLOWER, - Material.KELP, - Material.SOUL_TORCH, - Material.TWISTING_VINES, - Material.CRIMSON_FUNGUS, - Material.WARPED_FUNGUS, - Material.CRIMSON_ROOTS, - Material.WARPED_ROOTS, - Material.NETHER_SPROUTS, - Material.CRIMSON_SIGN, - Material.WARPED_SIGN, - Material.AZALEA, - Material.FLOWERING_AZALEA, - Material.SMALL_DRIPLEAF, - Material.BIG_DRIPLEAF)); - BlockGroup.TRACK_SIDE = new HashSet<>(Arrays.asList( - Material.WALL_TORCH, - Material.REDSTONE_WALL_TORCH, - Material.RAIL, - Material.POWERED_RAIL, - Material.DETECTOR_RAIL, - Material.ACTIVATOR_RAIL, - Material.WHITE_BED, - Material.ORANGE_BED, - Material.MAGENTA_BED, - Material.LIGHT_BLUE_BED, - Material.YELLOW_BED, - Material.LIME_BED, - Material.PINK_BED, - Material.GRAY_BED, - Material.LIGHT_GRAY_BED, - Material.CYAN_BED, - Material.PURPLE_BED, - Material.BLUE_BED, - Material.BROWN_BED, - Material.GREEN_BED, - Material.RED_BED, - Material.BLACK_BED, - Material.LADDER, - Material.MANGROVE_WALL_SIGN, - Material.ACACIA_WALL_SIGN, - Material.BIRCH_WALL_SIGN, - Material.DARK_OAK_WALL_SIGN, - Material.JUNGLE_WALL_SIGN, - Material.OAK_WALL_SIGN, - Material.SPRUCE_WALL_SIGN, - Material.VINE, - Material.COCOA, - Material.TRIPWIRE_HOOK, - Material.WHITE_WALL_BANNER, - Material.ORANGE_WALL_BANNER, - Material.MAGENTA_WALL_BANNER, - Material.LIGHT_BLUE_WALL_BANNER, - Material.YELLOW_WALL_BANNER, - Material.LIME_WALL_BANNER, - Material.PINK_WALL_BANNER, - Material.GRAY_WALL_BANNER, - Material.LIGHT_GRAY_WALL_BANNER, - Material.CYAN_WALL_BANNER, - Material.PURPLE_WALL_BANNER, - Material.BLUE_WALL_BANNER, - Material.BROWN_WALL_BANNER, - Material.GREEN_WALL_BANNER, - Material.RED_WALL_BANNER, - Material.BLACK_WALL_BANNER, - Material.SOUL_WALL_TORCH, - Material.CRIMSON_WALL_SIGN, - Material.WARPED_WALL_SIGN)); - BlockGroup.DOORS = new HashSet<>(Arrays.asList( - Material.OAK_DOOR, - Material.SPRUCE_DOOR, - Material.BIRCH_DOOR, - Material.JUNGLE_DOOR, - Material.MANGROVE_DOOR, - Material.ACACIA_DOOR, - Material.DARK_OAK_DOOR, - Material.CRIMSON_DOOR, - Material.WARPED_DOOR)); - BlockGroup.BUTTONS = new HashSet<>(Arrays.asList( - Material.STONE_BUTTON, - Material.OAK_BUTTON, - Material.MANGROVE_BUTTON, - Material.ACACIA_BUTTON, - Material.BIRCH_BUTTON, - Material.DARK_OAK_BUTTON, - Material.JUNGLE_BUTTON, - Material.SPRUCE_BUTTON, - Material.POLISHED_BLACKSTONE_BUTTON, - Material.CRIMSON_BUTTON, - Material.WARPED_BUTTON)); - BlockGroup.PRESSURE_PLATES = new HashSet<>(Arrays.asList( - Material.STONE_PRESSURE_PLATE, - Material.MANGROVE_PRESSURE_PLATE, - Material.ACACIA_PRESSURE_PLATE, - Material.BIRCH_PRESSURE_PLATE, - Material.DARK_OAK_PRESSURE_PLATE, - Material.HEAVY_WEIGHTED_PRESSURE_PLATE, - Material.JUNGLE_PRESSURE_PLATE, - Material.LIGHT_WEIGHTED_PRESSURE_PLATE, - Material.OAK_PRESSURE_PLATE, - Material.SPRUCE_PRESSURE_PLATE, - Material.CRIMSON_PRESSURE_PLATE, - Material.WARPED_PRESSURE_PLATE, + + BlockGroup.TRACK_TOP = new HashSet<>(Arrays.asList(Material.TORCH, Material.REDSTONE_TORCH, Material.BAMBOO, + Material.BAMBOO_SAPLING, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, + Material.SWEET_BERRY_BUSH, Material.SCAFFOLDING, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, + Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.MANGROVE_PROPAGULE, Material.ACACIA_SAPLING, + Material.DARK_OAK_SAPLING, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, + Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, + Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, + Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, + Material.REDSTONE_WIRE, Material.WHEAT, Material.MANGROVE_SIGN, Material.ACACIA_SIGN, + Material.BIRCH_SIGN, Material.DARK_OAK_SIGN, Material.JUNGLE_SIGN, Material.OAK_SIGN, + Material.SPRUCE_SIGN, Material.WHITE_BANNER, Material.ORANGE_BANNER, Material.MAGENTA_BANNER, + Material.LIGHT_BLUE_BANNER, Material.YELLOW_BANNER, Material.LIME_BANNER, Material.PINK_BANNER, + Material.GRAY_BANNER, Material.LIGHT_GRAY_BANNER, Material.CYAN_BANNER, Material.PURPLE_BANNER, + Material.BLUE_BANNER, Material.BROWN_BANNER, Material.GREEN_BANNER, Material.RED_BANNER, + Material.BLACK_BANNER, Material.RAIL, Material.IRON_DOOR, Material.SNOW, Material.CACTUS, + Material.SUGAR_CANE, Material.REPEATER, Material.PUMPKIN_STEM, Material.MELON_STEM, Material.CARROT, + Material.POTATO, Material.COMPARATOR, Material.ACTIVATOR_RAIL, Material.SUNFLOWER, Material.LILAC, + Material.TALL_GRASS, Material.LARGE_FERN, Material.ROSE_BUSH, Material.PEONY, Material.NETHER_WART, + Material.CHORUS_PLANT, Material.CHORUS_FLOWER, Material.KELP, Material.SOUL_TORCH, + Material.TWISTING_VINES, Material.CRIMSON_FUNGUS, Material.WARPED_FUNGUS, Material.CRIMSON_ROOTS, + Material.WARPED_ROOTS, Material.NETHER_SPROUTS, Material.CRIMSON_SIGN, Material.WARPED_SIGN, + Material.AZALEA, Material.FLOWERING_AZALEA, Material.SMALL_DRIPLEAF, Material.BIG_DRIPLEAF)); + BlockGroup.TRACK_SIDE = new HashSet<>(Arrays.asList(Material.WALL_TORCH, Material.REDSTONE_WALL_TORCH, + Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.ACTIVATOR_RAIL, + Material.WHITE_BED, Material.ORANGE_BED, Material.MAGENTA_BED, Material.LIGHT_BLUE_BED, + Material.YELLOW_BED, Material.LIME_BED, Material.PINK_BED, Material.GRAY_BED, Material.LIGHT_GRAY_BED, + Material.CYAN_BED, Material.PURPLE_BED, Material.BLUE_BED, Material.BROWN_BED, Material.GREEN_BED, + Material.RED_BED, Material.BLACK_BED, Material.LADDER, Material.MANGROVE_WALL_SIGN, + Material.ACACIA_WALL_SIGN, Material.BIRCH_WALL_SIGN, Material.DARK_OAK_WALL_SIGN, + Material.JUNGLE_WALL_SIGN, Material.OAK_WALL_SIGN, Material.SPRUCE_WALL_SIGN, Material.VINE, + Material.COCOA, Material.TRIPWIRE_HOOK, Material.WHITE_WALL_BANNER, Material.ORANGE_WALL_BANNER, + Material.MAGENTA_WALL_BANNER, Material.LIGHT_BLUE_WALL_BANNER, Material.YELLOW_WALL_BANNER, + Material.LIME_WALL_BANNER, Material.PINK_WALL_BANNER, Material.GRAY_WALL_BANNER, + Material.LIGHT_GRAY_WALL_BANNER, Material.CYAN_WALL_BANNER, Material.PURPLE_WALL_BANNER, + Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.GREEN_WALL_BANNER, + Material.RED_WALL_BANNER, Material.BLACK_WALL_BANNER, Material.SOUL_WALL_TORCH, + Material.CRIMSON_WALL_SIGN, Material.WARPED_WALL_SIGN)); + BlockGroup.DOORS = new HashSet<>(Arrays.asList(Material.OAK_DOOR, Material.SPRUCE_DOOR, Material.BIRCH_DOOR, + Material.JUNGLE_DOOR, Material.MANGROVE_DOOR, Material.ACACIA_DOOR, Material.DARK_OAK_DOOR, + Material.CRIMSON_DOOR, Material.WARPED_DOOR)); + BlockGroup.BUTTONS = new HashSet<>(Arrays.asList(Material.STONE_BUTTON, Material.OAK_BUTTON, + Material.MANGROVE_BUTTON, Material.ACACIA_BUTTON, Material.BIRCH_BUTTON, Material.DARK_OAK_BUTTON, + Material.JUNGLE_BUTTON, Material.SPRUCE_BUTTON, Material.POLISHED_BLACKSTONE_BUTTON, + Material.CRIMSON_BUTTON, Material.WARPED_BUTTON)); + BlockGroup.PRESSURE_PLATES = new HashSet<>(Arrays.asList(Material.STONE_PRESSURE_PLATE, + Material.MANGROVE_PRESSURE_PLATE, Material.ACACIA_PRESSURE_PLATE, Material.BIRCH_PRESSURE_PLATE, + Material.DARK_OAK_PRESSURE_PLATE, Material.HEAVY_WEIGHTED_PRESSURE_PLATE, + Material.JUNGLE_PRESSURE_PLATE, Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Material.OAK_PRESSURE_PLATE, + Material.SPRUCE_PRESSURE_PLATE, Material.CRIMSON_PRESSURE_PLATE, Material.WARPED_PRESSURE_PLATE, Material.POLISHED_BLACKSTONE_PRESSURE_PLATE)); - BlockGroup.INTERACT_BLOCKS = new HashSet<>(Arrays.asList( - Material.SPRUCE_FENCE_GATE, - Material.BIRCH_FENCE_GATE, - Material.JUNGLE_FENCE_GATE, - Material.DARK_OAK_FENCE_GATE, - Material.MANGROVE_FENCE_GATE, - Material.ACACIA_FENCE_GATE, - Material.DISPENSER, - Material.NOTE_BLOCK, - Material.CHEST, - Material.FURNACE, - Material.LEVER, - Material.REPEATER, - Material.MANGROVE_TRAPDOOR, - Material.ACACIA_TRAPDOOR, - Material.BIRCH_TRAPDOOR, - Material.DARK_OAK_TRAPDOOR, - Material.JUNGLE_TRAPDOOR, - Material.SPRUCE_TRAPDOOR, - Material.OAK_TRAPDOOR, - Material.OAK_FENCE_GATE, - Material.BREWING_STAND, - Material.ANVIL, - Material.CHIPPED_ANVIL, - Material.DAMAGED_ANVIL, - Material.ENDER_CHEST, - Material.TRAPPED_CHEST, - Material.COMPARATOR, - Material.HOPPER, - Material.DROPPER, - Material.SHULKER_BOX, - Material.BLACK_SHULKER_BOX, - Material.BLUE_SHULKER_BOX, - Material.BROWN_SHULKER_BOX, - Material.CYAN_SHULKER_BOX, - Material.GRAY_SHULKER_BOX, - Material.GREEN_SHULKER_BOX, - Material.LIGHT_BLUE_SHULKER_BOX, - Material.LIME_SHULKER_BOX, - Material.MAGENTA_SHULKER_BOX, - Material.ORANGE_SHULKER_BOX, - Material.PINK_SHULKER_BOX, - Material.PURPLE_SHULKER_BOX, - Material.RED_SHULKER_BOX, - Material.LIGHT_GRAY_SHULKER_BOX, - Material.WHITE_SHULKER_BOX, - Material.YELLOW_SHULKER_BOX, - Material.BARREL, - Material.BLAST_FURNACE, - Material.GRINDSTONE, - Material.LOOM, - Material.SMOKER, - Material.CRAFTING_TABLE, - Material.CARTOGRAPHY_TABLE, - Material.ENCHANTING_TABLE, - Material.SMITHING_TABLE, - Material.STONECUTTER, - Material.CRIMSON_FENCE_GATE, - Material.WARPED_FENCE_GATE, - Material.CRIMSON_TRAPDOOR, - Material.WARPED_TRAPDOOR)); - BlockGroup.SAFE_INTERACT_BLOCKS = new HashSet<>(Arrays.asList( - Material.LEVER, - Material.MANGROVE_TRAPDOOR, - Material.ACACIA_TRAPDOOR, - Material.BIRCH_TRAPDOOR, - Material.DARK_OAK_TRAPDOOR, - Material.JUNGLE_TRAPDOOR, - Material.SPRUCE_TRAPDOOR, - Material.OAK_TRAPDOOR, - Material.OAK_FENCE_GATE, - Material.SPRUCE_FENCE_GATE, - Material.BIRCH_FENCE_GATE, - Material.JUNGLE_FENCE_GATE, - Material.DARK_OAK_FENCE_GATE, - Material.MANGROVE_FENCE_GATE, - Material.ACACIA_FENCE_GATE, - Material.CRIMSON_FENCE_GATE, - Material.WARPED_FENCE_GATE, - Material.CRIMSON_TRAPDOOR, - Material.WARPED_TRAPDOOR)); - BlockGroup.NON_ATTACHABLE = new HashSet<>(Arrays.asList( - Material.AIR, - Material.CAVE_AIR, - Material.BARRIER, - Material.CORNFLOWER, - Material.LILY_OF_THE_VALLEY, - Material.WITHER_ROSE, - Material.SWEET_BERRY_BUSH, - Material.OAK_SAPLING, - Material.SPRUCE_SAPLING, - Material.BIRCH_SAPLING, - Material.JUNGLE_SAPLING, - Material.MANGROVE_PROPAGULE, - Material.ACACIA_SAPLING, - Material.DARK_OAK_SAPLING, - Material.WATER, - Material.LAVA, - Material.POWERED_RAIL, - Material.DETECTOR_RAIL, - Material.FERN, - Material.DEAD_BUSH, - Material.DANDELION, - Material.POPPY, - Material.BLUE_ORCHID, - Material.ALLIUM, - Material.AZURE_BLUET, - Material.RED_TULIP, - Material.ORANGE_TULIP, - Material.WHITE_TULIP, - Material.PINK_TULIP, - Material.OXEYE_DAISY, - Material.BROWN_MUSHROOM, - Material.RED_MUSHROOM, - Material.TORCH, - Material.WALL_TORCH, - Material.REDSTONE_WIRE, - Material.LADDER, - Material.RAIL, - Material.LEVER, - Material.REDSTONE_TORCH, - Material.REDSTONE_WALL_TORCH, - Material.SNOW, - Material.SUGAR_CANE, - Material.NETHER_PORTAL, - Material.REPEATER, - Material.KELP, - Material.CHORUS_FLOWER, - Material.CHORUS_PLANT, - Material.SOUL_TORCH, - Material.SOUL_WALL_TORCH, - Material.LIGHT, - Material.SMALL_DRIPLEAF, - Material.BIG_DRIPLEAF, - Material.BIG_DRIPLEAF_STEM, - Material.GLOW_LICHEN, - Material.HANGING_ROOTS)); + BlockGroup.INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE, + Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.MANGROVE_FENCE_GATE, + Material.ACACIA_FENCE_GATE, Material.DISPENSER, Material.NOTE_BLOCK, Material.CHEST, Material.FURNACE, + Material.LEVER, Material.REPEATER, Material.MANGROVE_TRAPDOOR, Material.ACACIA_TRAPDOOR, + Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, Material.SPRUCE_TRAPDOOR, + Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.BREWING_STAND, Material.ANVIL, + Material.CHIPPED_ANVIL, Material.DAMAGED_ANVIL, Material.ENDER_CHEST, Material.TRAPPED_CHEST, + Material.COMPARATOR, Material.HOPPER, Material.DROPPER, Material.SHULKER_BOX, + Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, + Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, + Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, + Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, + Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, + Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.GRINDSTONE, + Material.LOOM, Material.SMOKER, Material.CRAFTING_TABLE, Material.CARTOGRAPHY_TABLE, + Material.ENCHANTING_TABLE, Material.SMITHING_TABLE, Material.STONECUTTER, Material.CRIMSON_FENCE_GATE, + Material.WARPED_FENCE_GATE, Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR)); + BlockGroup.SAFE_INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.LEVER, Material.MANGROVE_TRAPDOOR, + Material.ACACIA_TRAPDOOR, Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, + Material.SPRUCE_TRAPDOOR, Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.SPRUCE_FENCE_GATE, + Material.BIRCH_FENCE_GATE, Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, + Material.MANGROVE_FENCE_GATE, Material.ACACIA_FENCE_GATE, Material.CRIMSON_FENCE_GATE, + Material.WARPED_FENCE_GATE, Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR)); + BlockGroup.NON_ATTACHABLE = new HashSet<>(Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.BARRIER, + Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, + Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, + Material.MANGROVE_PROPAGULE, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.WATER, + Material.LAVA, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, + Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, + Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, + Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.TORCH, + Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.LADDER, Material.RAIL, Material.LEVER, + Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.SNOW, Material.SUGAR_CANE, + Material.NETHER_PORTAL, Material.REPEATER, Material.KELP, Material.CHORUS_FLOWER, Material.CHORUS_PLANT, + Material.SOUL_TORCH, Material.SOUL_WALL_TORCH, Material.LIGHT, Material.SMALL_DRIPLEAF, + Material.BIG_DRIPLEAF, Material.BIG_DRIPLEAF_STEM, Material.GLOW_LICHEN, Material.HANGING_ROOTS)); BlockGroup.SCULK = new HashSet<>( Arrays.asList(Material.SCULK, Material.SCULK_VEIN, Material.SCULK_SENSOR, Material.SCULK_SHRIEKER)); + } @Override public boolean getEntityMeta(LivingEntity entity, List info) { + if (entity instanceof Frog) { + Frog frog = (Frog) entity; info.add(BukkitAdapter.ADAPTER.getRegistryKey(frog.getVariant())); + } else if (entity instanceof Tadpole) { + Tadpole tadpole = (Tadpole) entity; info.add(tadpole.getAge()); + } else if (entity instanceof Goat) { + Goat goat = (Goat) entity; info.add(goat.isScreaming()); info.add(goat.hasLeftHorn()); info.add(goat.hasRightHorn()); + } else if (super.getEntityMeta(entity, info)) { + return true; + } else { + return false; + } return true; + } @Override public boolean setEntityMeta(Entity entity, Object value, int count) { + if (entity instanceof Frog) { + Frog frog = (Frog) entity; if (count == 0) { + if (value instanceof String) { + value = BukkitAdapter.ADAPTER.getRegistryValue((String) value, Frog.Variant.class); + } + Frog.Variant set = (Frog.Variant) value; frog.setVariant(set); + } + } else if (entity instanceof Tadpole) { + Tadpole tadpole = (Tadpole) entity; if (count == 0) { + int set = (int) value; tadpole.setAge(set); + } + } else if (entity instanceof Goat) { + Goat goat = (Goat) entity; boolean set = (Boolean) value; if (count == 0) { + goat.setScreaming(set); + } else if (count == 1) { + goat.setLeftHorn(set); + } else if (count == 2) { + goat.setRightHorn(set); + } + } else if (super.setEntityMeta(entity, value, count)) { + return true; + } else { + return false; + } return true; + } + } diff --git a/src/main/java/net/coreprotect/command/ApplyCommand.java b/src/main/java/net/coreprotect/command/ApplyCommand.java index 603e85a..8cb8ffd 100755 --- a/src/main/java/net/coreprotect/command/ApplyCommand.java +++ b/src/main/java/net/coreprotect/command/ApplyCommand.java @@ -11,9 +11,13 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; public class ApplyCommand { + protected static void runCommand(CommandSender user, Command command, boolean permission, String[] args) { + try { + if (ConfigHandler.lastRollback.get(user.getName()) != null) { + List list = ConfigHandler.lastRollback.get(user.getName()); long startTime = (Long) list.get(0); long endTime = (Long) list.get(1); @@ -21,28 +25,41 @@ public class ApplyCommand { Location location = (Location) list.get(3); boolean valid = false; for (int i = 0; i < args.length; i++) { + if (args[i].equals("#preview")) { + valid = true; args[i] = args[i].replaceAll("#preview", ""); + } + } + if (!valid) { - Chat.sendMessage( - user, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST)); + + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST)); + } else { + ConfigHandler.lastRollback.remove(user.getName()); RollbackRestoreCommand.runCommand(user, command, permission, args, location, startTime, endTime); + } + } else { - Chat.sendMessage( - user, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST)); + + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } diff --git a/src/main/java/net/coreprotect/command/CancelCommand.java b/src/main/java/net/coreprotect/command/CancelCommand.java index b5f41c8..0030cfe 100755 --- a/src/main/java/net/coreprotect/command/CancelCommand.java +++ b/src/main/java/net/coreprotect/command/CancelCommand.java @@ -11,9 +11,13 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; public class CancelCommand { + protected static void runCommand(CommandSender user, Command command, boolean permission, String[] args) { + try { + if (ConfigHandler.lastRollback.get(user.getName()) != null) { + List list = ConfigHandler.lastRollback.get(user.getName()); long startTime = (Long) list.get(0); long endTime = (Long) list.get(1); @@ -21,28 +25,41 @@ public class CancelCommand { Location location = (Location) list.get(3); boolean valid = false; for (int i = 0; i < args.length; i++) { + if (args[i].equals("#preview")) { + valid = true; args[i] = args[i].replaceAll("#preview", "#preview_cancel"); + } + } + if (!valid) { - Chat.sendMessage( - user, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST)); + + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST)); + } else { + ConfigHandler.lastRollback.remove(user.getName()); RollbackRestoreCommand.runCommand(user, command, permission, args, location, startTime, endTime); + } + } else { - Chat.sendMessage( - user, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST)); + + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } diff --git a/src/main/java/net/coreprotect/command/CommandHandler.java b/src/main/java/net/coreprotect/command/CommandHandler.java index 831227e..b699a1e 100755 --- a/src/main/java/net/coreprotect/command/CommandHandler.java +++ b/src/main/java/net/coreprotect/command/CommandHandler.java @@ -32,235 +32,260 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; public class CommandHandler implements CommandExecutor { + private static CommandHandler instance; private static ConcurrentHashMap versionAlert = new ConcurrentHashMap<>(); public static CommandHandler getInstance() { + if (instance == null) { + instance = new CommandHandler(); + } + return instance; + } protected static String[] parsePage(String[] argumentArray) { + if (argumentArray.length == 2) { + argumentArray[1] = argumentArray[1].replaceFirst("page:", ""); + } return argumentArray; + } protected static List parseAction(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); List result = new ArrayList<>(); int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("a:") || argument.equals("action:")) { + next = 1; + } else if (next == 1 || argument.startsWith("a:") || argument.startsWith("action:")) { + result.clear(); argument = argument.replaceAll("action:", ""); argument = argument.replaceAll("a:", ""); if (argument.startsWith("#")) { + argument = argument.replaceFirst("#", ""); + } - if (argument.equals("broke") - || argument.equals("break") - || argument.equals("remove") - || argument.equals("destroy") - || argument.equals("block-break") - || argument.equals("block-remove") - || argument.equals("-block") - || argument.equals("-blocks") - || argument.equals("block-")) { + + if (argument.equals("broke") || argument.equals("break") || argument.equals("remove") + || argument.equals("destroy") || argument.equals("block-break") + || argument.equals("block-remove") || argument.equals("-block") + || argument.equals("-blocks") || argument.equals("block-")) + { + result.add(0); - } else if (argument.equals("placed") - || argument.equals("place") - || argument.equals("block-place") - || argument.equals("+block") - || argument.equals("+blocks") - || argument.equals("block+")) { + + } else if (argument.equals("placed") || argument.equals("place") || argument.equals("block-place") + || argument.equals("+block") || argument.equals("+blocks") || argument.equals("block+")) + { + result.add(1); - } else if (argument.equals("block") - || argument.equals("blocks") - || argument.equals("block-change") - || argument.equals("change") - || argument.equals("changes")) { + + } else if (argument.equals("block") || argument.equals("blocks") || argument.equals("block-change") + || argument.equals("change") || argument.equals("changes")) + { + result.add(0); result.add(1); - } else if (argument.equals("click") - || argument.equals("clicks") - || argument.equals("interact") - || argument.equals("interaction") - || argument.equals("player-interact") - || argument.equals("player-interaction") - || argument.equals("player-click")) { + + } else if (argument.equals("click") || argument.equals("clicks") || argument.equals("interact") + || argument.equals("interaction") || argument.equals("player-interact") + || argument.equals("player-interaction") || argument.equals("player-click")) + { + result.add(2); - } else if (argument.equals("death") - || argument.equals("deaths") - || argument.equals("entity-death") - || argument.equals("entity-deaths") - || argument.equals("kill") - || argument.equals("kills") - || argument.equals("entity-kill") - || argument.equals("entity-kills")) { + + } else if (argument.equals("death") || argument.equals("deaths") || argument.equals("entity-death") + || argument.equals("entity-deaths") || argument.equals("kill") || argument.equals("kills") + || argument.equals("entity-kill") || argument.equals("entity-kills")) + { + result.add(3); - } else if (argument.equals("container") - || argument.equals("container-change") - || argument.equals("containers") - || argument.equals("chest") - || argument.equals("transaction") - || argument.equals("transactions")) { + + } else if (argument.equals("container") || argument.equals("container-change") + || argument.equals("containers") || argument.equals("chest") + || argument.equals("transaction") || argument.equals("transactions")) + { + result.add(4); - } else if (argument.equals("-container") - || argument.equals("container-") - || argument.equals("remove-container")) { + + } else if (argument.equals("-container") || argument.equals("container-") + || argument.equals("remove-container")) + { + result.add(4); result.add(0); - } else if (argument.equals("+container") - || argument.equals("container+") - || argument.equals("container-add") - || argument.equals("add-container")) { + + } else if (argument.equals("+container") || argument.equals("container+") + || argument.equals("container-add") || argument.equals("add-container")) + { + result.add(4); result.add(1); + } else if (argument.equals("chat") || argument.equals("chats")) { + result.add(6); + } else if (argument.equals("command") || argument.equals("commands")) { + result.add(7); - } else if (argument.equals("logins") - || argument.equals("login") - || argument.equals("+session") - || argument.equals("+sessions") - || argument.equals("session+") - || argument.equals("+connection") - || argument.equals("connection+")) { + + } else if (argument.equals("logins") || argument.equals("login") || argument.equals("+session") + || argument.equals("+sessions") || argument.equals("session+") + || argument.equals("+connection") || argument.equals("connection+")) + { + result.add(8); result.add(1); - } else if (argument.equals("logout") - || argument.equals("logouts") - || argument.equals("-session") - || argument.equals("-sessions") - || argument.equals("session-") - || argument.equals("-connection") - || argument.equals("connection-")) { + + } else if (argument.equals("logout") || argument.equals("logouts") || argument.equals("-session") + || argument.equals("-sessions") || argument.equals("session-") + || argument.equals("-connection") || argument.equals("connection-")) + { + result.add(8); result.add(0); - } else if (argument.equals("session") - || argument.equals("sessions") - || argument.equals("connection") - || argument.equals("connections")) { + + } else if (argument.equals("session") || argument.equals("sessions") + || argument.equals("connection") || argument.equals("connections")) + { + result.add(8); - } else if (argument.equals("username") - || argument.equals("usernames") - || argument.equals("user") - || argument.equals("users") - || argument.equals("name") - || argument.equals("names") - || argument.equals("uuid") - || argument.equals("uuids") - || argument.equals("username-change") - || argument.equals("username-changes") - || argument.equals("name-change") - || argument.equals("name-changes")) { + + } else if (argument.equals("username") || argument.equals("usernames") || argument.equals("user") + || argument.equals("users") || argument.equals("name") || argument.equals("names") + || argument.equals("uuid") || argument.equals("uuids") || argument.equals("username-change") + || argument.equals("username-changes") || argument.equals("name-change") + || argument.equals("name-changes")) + { + result.add(9); + } else if (argument.equals("sign") || argument.equals("signs")) { + result.add(10); - } else if (argument.equals("inv") - || argument.equals("inventory") - || argument.equals("inventories")) { + + } else if (argument.equals("inv") || argument.equals("inventory") + || argument.equals("inventories")) + { + result.add(4); // container result.add(11); // item - } else if (argument.equals("-inv") - || argument.equals("inv-") - || argument.equals("-inventory") - || argument.equals("inventory-") - || argument.equals("-inventories")) { + + } else if (argument.equals("-inv") || argument.equals("inv-") || argument.equals("-inventory") + || argument.equals("inventory-") || argument.equals("-inventories")) + { + result.add(4); result.add(11); result.add(1); - } else if (argument.equals("+inv") - || argument.equals("inv+") - || argument.equals("+inventory") - || argument.equals("inventory+") - || argument.equals("+inventories")) { + + } else if (argument.equals("+inv") || argument.equals("inv+") || argument.equals("+inventory") + || argument.equals("inventory+") || argument.equals("+inventories")) + { + result.add(4); result.add(11); result.add(0); + } else if (argument.equals("item") || argument.equals("items")) { + result.add(11); - } else if (argument.equals("-item") - || argument.equals("item-") - || argument.equals("-items") - || argument.equals("items-") - || argument.equals("drop") - || argument.equals("drops") - || argument.equals("deposit") - || argument.equals("deposits") - || argument.equals("deposited")) { + + } else if (argument.equals("-item") || argument.equals("item-") || argument.equals("-items") + || argument.equals("items-") || argument.equals("drop") || argument.equals("drops") + || argument.equals("deposit") || argument.equals("deposits") + || argument.equals("deposited")) + { + result.add(11); result.add(0); - } else if (argument.equals("+item") - || argument.equals("item+") - || argument.equals("+items") - || argument.equals("items+") - || argument.equals("pickup") - || argument.equals("pickups") - || argument.equals("withdraw") - || argument.equals("withdraws") - || argument.equals("withdrew")) { + + } else if (argument.equals("+item") || argument.equals("item+") || argument.equals("+items") + || argument.equals("items+") || argument.equals("pickup") || argument.equals("pickups") + || argument.equals("withdraw") || argument.equals("withdraws") + || argument.equals("withdrew")) + { + result.add(11); result.add(1); + } else { + result.add(-1); + } + next = 0; + } else { + next = 0; + } + } + count++; + } + return result; + } protected static Location parseCoordinates(Location location, String[] inputArguments, int worldId) { + String[] argumentArray = inputArguments.clone(); int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); - if (argument.equals("position:") - || argument.equals("location:") - || argument.equals("c:") - || argument.equals("coord:") - || argument.equals("coords:") - || argument.equals("cord:") - || argument.equals("cords:") - || argument.equals("coordinate:") - || argument.equals("coordinates:") - || argument.equals("cordinate:") - || argument.equals("cordinates:")) { + if (argument.equals("position:") || argument.equals("location:") || argument.equals("c:") + || argument.equals("coord:") || argument.equals("coords:") || argument.equals("cord:") + || argument.equals("cords:") || argument.equals("coordinate:") + || argument.equals("coordinates:") || argument.equals("cordinate:") + || argument.equals("cordinates:")) + { + next = 2; - } else if (next == 2 - || argument.startsWith("c:") - || argument.startsWith("coord:") - || argument.startsWith("coords:") - || argument.startsWith("cord:") - || argument.startsWith("cords:") - || argument.startsWith("coordinate:") - || argument.startsWith("coordinates:") - || argument.startsWith("cordinate:") - || argument.startsWith("cordinates:")) { + + } else if (next == 2 || argument.startsWith("c:") || argument.startsWith("coord:") + || argument.startsWith("coords:") || argument.startsWith("cord:") + || argument.startsWith("cords:") || argument.startsWith("coordinate:") + || argument.startsWith("coordinates:") || argument.startsWith("cordinate:") + || argument.startsWith("cordinates:")) + { + argument = argument.replaceAll("coordinates:", ""); argument = argument.replaceAll("coordinate:", ""); argument = argument.replaceAll("cordinates:", ""); @@ -271,372 +296,592 @@ public class CommandHandler implements CommandExecutor { argument = argument.replaceAll("cord:", ""); argument = argument.replaceAll("c:", ""); if (argument.contains(",")) { + String[] i2 = argument.split(","); double x = 0.00; double y = 0.00; double z = 0.00; int cCount = 0; for (String coord : i2) { + coord = coord.replaceAll("[^0-9.\\-]", ""); - if (coord.length() > 0 - && !coord.equals(".") - && !coord.equals("-") - && coord.indexOf('.') == coord.lastIndexOf('.')) { + if (coord.length() > 0 && !coord.equals(".") && !coord.equals("-") + && coord.indexOf('.') == coord.lastIndexOf('.')) + { + double parsedCoord = Double.parseDouble(coord); if (cCount == 0) { + x = parsedCoord; + } else if (cCount == 1) { + z = parsedCoord; + } else if (cCount == 2) { + y = z; z = parsedCoord; + } + cCount++; + } + } + if (cCount > 1) { + if (location == null && worldId > 0) { + location = new Location(Bukkit.getWorld(Util.getWorldName(worldId)), 0, 0, 0); + } + if (location != null) { + int worldMaxHeight = location.getWorld().getMaxHeight() - 1; int worldMinHeight = BukkitAdapter.ADAPTER.getMinHeight(location.getWorld()); if (y < worldMinHeight) { + y = Double.valueOf(worldMinHeight); + } + if (y > worldMaxHeight) { + y = Double.valueOf(worldMaxHeight); + } location.setX(x); location.setY(y); location.setZ(z); + } + } + } + next = 0; + } else { + next = 0; + } + } + count++; + } + return location; + } protected static boolean parseCount(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); boolean result = false; int count = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("#count") || argument.equals("#sum")) { + result = true; + } + } + count++; + } + return result; + } - protected static Map parseExcluded( - CommandSender player, String[] inputArguments, List argAction) { + protected static Map parseExcluded(CommandSender player, String[] inputArguments, + List argAction) + { + String[] argumentArray = inputArguments.clone(); Map excluded = new HashMap<>(); int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("e:") || argument.equals("exclude:")) { + next = 5; + } else if (next == 5 || argument.startsWith("e:") || argument.startsWith("exclude:")) { + argument = argument.replaceAll("exclude:", ""); argument = argument.replaceAll("e:", ""); if (argument.contains(",")) { + String[] i2 = argument.split(","); for (String i3 : i2) { + if (!checkTags(i3, excluded)) { + Material i3_material = Util.getType(i3); if (i3_material != null && (i3_material.isBlock() || argAction.contains(4))) { + excluded.put(i3_material, false); + } else { + EntityType i3_entity = Util.getEntityType(i3); if (i3_entity != null) { + excluded.put(i3_entity, false); + } else if (i3_material != null) { + excluded.put(i3_material, false); + } + } + } + } + if (argument.endsWith(",")) { + next = 5; + } else { + next = 0; + } + } else { + if (!checkTags(argument, excluded)) { + Material iMaterial = Util.getType(argument); if (iMaterial != null && (iMaterial.isBlock() || argAction.contains(4))) { + excluded.put(iMaterial, false); + } else { + EntityType iEntity = Util.getEntityType(argument); if (iEntity != null) { + excluded.put(iEntity, false); + } else if (iMaterial != null) { + excluded.put(iMaterial, false); + } + } + } + next = 0; + } + } else { + next = 0; + } + } + count++; + } + return excluded; + } protected static List parseExcludedUsers(CommandSender player, String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); List excluded = new ArrayList<>(); int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("e:") || argument.equals("exclude:")) { + next = 5; + } else if (next == 5 || argument.startsWith("e:") || argument.startsWith("exclude:")) { + argument = argument.replaceAll("exclude:", ""); argument = argument.replaceAll("e:", ""); if (argument.contains(",")) { + String[] i2 = argument.split(","); for (String i3 : i2) { + boolean isBlock = false; if (checkTags(i3)) { + isBlock = true; + } else { + Material i3_material = Util.getType(i3); if (i3_material != null) { + isBlock = true; + } else { + EntityType i3Entity = Util.getEntityType(i3); if (i3Entity != null) { + isBlock = true; + } + } + } + if (!isBlock) { + excluded.add(i3); + } + } + if (argument.endsWith(",")) { + next = 5; + } else { + next = 0; + } + } else { + boolean isBlock = false; if (checkTags(argument)) { + isBlock = true; + } else { + Material iMaterial = Util.getType(argument); if (iMaterial != null) { + isBlock = true; + } else { + EntityType entityType = Util.getEntityType(argument); if (entityType != null) { + isBlock = true; + } + } + } + if (!isBlock) { + excluded.add(argument); + } + next = 0; + } + } else { + next = 0; + } + } + count++; + } + return excluded; + } protected static boolean parseForceGlobal(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); boolean result = false; int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("r:") || argument.equals("radius:")) { + next = 2; + } else if (next == 2 || argument.startsWith("r:") || argument.startsWith("radius:")) { + argument = argument.replaceAll("radius:", ""); argument = argument.replaceAll("r:", ""); - if (argument.equals("#global") - || argument.equals("global") - || argument.equals("off") - || argument.equals("-1") - || argument.equals("none") - || argument.equals("false")) { + if (argument.equals("#global") || argument.equals("global") || argument.equals("off") + || argument.equals("-1") || argument.equals("none") || argument.equals("false")) + { + result = true; + } else if (argument.startsWith("#")) { + int worldId = Util.matchWorld(argument); if (worldId > 0) { + result = true; + } + } + next = 0; + } else { + next = 0; + } + } + count++; + } + return result; + } protected static Location parseLocation(CommandSender user, String[] argumentArray) { + Location location = null; if (user instanceof Player) { + location = ((Player) user).getLocation(); + } else if (user instanceof BlockCommandSender) { + location = ((BlockCommandSender) user).getBlock().getLocation(); + } return parseCoordinates(location, argumentArray, parseWorld(argumentArray, true, true)); + } protected static int parseNoisy(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); int noisy = 0; int count = 0; if (Config.getGlobal().VERBOSE) { + noisy = 1; + } + for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); - if (argument.equals("n") - || argument.equals("noisy") - || argument.equals("v") - || argument.equals("verbose") - || argument.equals("#v") - || argument.equals("#verbose")) { + if (argument.equals("n") || argument.equals("noisy") || argument.equals("v") + || argument.equals("verbose") || argument.equals("#v") || argument.equals("#verbose")) + { + noisy = 1; + } else if (argument.equals("#silent")) { + noisy = 0; + } + } + count++; + } + return noisy; + } protected static int parsePreview(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); int result = 0; int count = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("#preview")) { + result = 1; + } else if (argument.equals("#preview_cancel")) { + result = 2; + } + } + count++; + } + return result; + } protected static Integer[] parseRadius(String[] inputArguments, CommandSender user, Location location) { + String[] argumentArray = inputArguments.clone(); Integer[] radius = null; int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("r:") || argument.equals("radius:")) { + next = 2; + } else if (next == 2 || argument.startsWith("r:") || argument.startsWith("radius:")) { + argument = argument.replaceAll("radius:", ""); argument = argument.replaceAll("r:", ""); if (argument.equals("#worldedit") || argument.equals("#we")) { + if (user.getServer().getPluginManager().getPlugin("WorldEdit") != null) { + Integer[] worldEditResult = WorldEditHandler.runWorldEditCommand(user); if (worldEditResult != null) { + radius = worldEditResult; + } + } - } else if ((argument.startsWith("#") && argument.length() > 1) - || argument.equals("global") - || argument.equals("off") - || argument.equals("-1") - || argument.equals("none") - || argument.equals("false")) { + + } else if ((argument.startsWith("#") && argument.length() > 1) || argument.equals("global") + || argument.equals("off") || argument.equals("-1") || argument.equals("none") + || argument.equals("false")) + { + // radius = -2; } else { + int rcount = 0; int r_x = 0; int r_y = -1; int r_z = 0; - String[] r_dat = new String[] {argument}; + String[] r_dat = new String[] { argument }; boolean validRadius = false; if (argument.contains("x")) { + r_dat = argument.split("x"); + } + for (String value : r_dat) { + String i4 = value.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.length() == value.length() + if (i4.length() > 0 && i4.length() == value.length() && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + double a1 = Double.parseDouble(i4); if (rcount == 0) { // x + r_x = (int) a1; r_z = (int) a1; + } else if (rcount == 1) { // y + r_y = (int) a1; + } else if (rcount == 2) { // z + r_z = (int) a1; + } + validRadius = true; + } + rcount++; + } + if (location != null) { + Integer xmin = location.getBlockX() - r_x; Integer xmax = location.getBlockX() + r_x; Integer ymin = null; @@ -644,61 +889,85 @@ public class CommandHandler implements CommandExecutor { Integer zmin = location.getBlockZ() - r_z; Integer zmax = location.getBlockZ() + r_z; if (r_y > -1) { + ymin = location.getBlockY() - r_y; ymax = location.getBlockY() + r_y; + } + int max = r_x; if (r_y > max) { + max = r_y; + } + if (r_z > max) { + max = r_z; + } + if (validRadius) { - radius = new Integer[] {max, xmin, xmax, ymin, ymax, zmin, zmax, 0}; + + radius = new Integer[] { max, xmin, xmax, ymin, ymax, zmin, zmax, 0 }; + } else { - radius = new Integer[] {-1}; + + radius = new Integer[] { -1 }; + } + } + } + next = 0; + } else { + next = 0; + } + } + count++; + } + return radius; + } - protected static List parseRestricted( - CommandSender player, String[] inputArguments, List argAction) { + protected static List parseRestricted(CommandSender player, String[] inputArguments, + List argAction) + { + String[] argumentArray = inputArguments.clone(); List restricted = new ArrayList<>(); int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); - if (argument.equals("i:") - || argument.equals("include:") - || argument.equals("item:") - || argument.equals("items:") - || argument.equals("b:") - || argument.equals("block:") - || argument.equals("blocks:")) { + if (argument.equals("i:") || argument.equals("include:") || argument.equals("item:") + || argument.equals("items:") || argument.equals("b:") || argument.equals("block:") + || argument.equals("blocks:")) + { + next = 4; - } else if (next == 4 - || argument.startsWith("i:") - || argument.startsWith("include:") - || argument.startsWith("item:") - || argument.startsWith("items:") - || argument.startsWith("b:") - || argument.startsWith("block:") - || argument.startsWith("blocks:")) { + + } else if (next == 4 || argument.startsWith("i:") || argument.startsWith("include:") + || argument.startsWith("item:") || argument.startsWith("items:") || argument.startsWith("b:") + || argument.startsWith("block:") || argument.startsWith("blocks:")) + { + argument = argument.replaceAll("include:", ""); argument = argument.replaceAll("i:", ""); argument = argument.replaceAll("items:", ""); @@ -707,69 +976,111 @@ public class CommandHandler implements CommandExecutor { argument = argument.replaceAll("block:", ""); argument = argument.replaceAll("b:", ""); if (argument.contains(",")) { + String[] i2 = argument.split(","); for (String i3 : i2) { + if (!checkTags(argument, restricted)) { + Material i3_material = Util.getType(i3); if (i3_material != null && (i3_material.isBlock() || argAction.contains(4))) { + restricted.add(i3_material); + } else { + EntityType i3_entity = Util.getEntityType(i3); if (i3_entity != null) { + restricted.add(i3_entity); + } else if (i3_material != null) { + restricted.add(i3_material); + } else { - Chat.sendMessage( - player, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.INVALID_INCLUDE, i3)); + + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.INVALID_INCLUDE, i3)); // Functions.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE // + "- " + Phrase.build(Phrase.MISSING_PARAMETERS, "/co help include")); return null; + } + } + } + } + if (argument.endsWith(",")) { + next = 4; + } else { + next = 0; + } + } else { + if (!checkTags(argument, restricted)) { + Material material = Util.getType(argument); if (material != null && (material.isBlock() || argAction.contains(4))) { + restricted.add(material); + } else { + EntityType entityType = Util.getEntityType(argument); if (entityType != null) { + restricted.add(entityType); + } else if (material != null) { + restricted.add(material); + } else { - Chat.sendMessage( - player, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.INVALID_INCLUDE, argument)); - // Functions.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- + + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.INVALID_INCLUDE, argument)); + // Functions.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + // + "- // " + Phrase.build(Phrase.MISSING_PARAMETERS, "/co help include")); return null; + } + } + } + next = 0; + } + } else { + next = 0; + } + } + count++; + } + return restricted; + } protected static long[] parseTime(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); long timeStart = 0; long timeEnd = 0; @@ -782,14 +1093,19 @@ public class CommandHandler implements CommandExecutor { double m = 0; double s = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("t:") || argument.equals("time:")) { + next = 1; + } else if (next == 1 || argument.startsWith("t:") || argument.startsWith("time:")) { + // time arguments argument = argument.replaceAll("time:", ""); argument = argument.replaceAll("t:", ""); @@ -804,81 +1120,125 @@ public class CommandHandler implements CommandExecutor { int argCount = 0; String[] i2 = argument.split(":"); for (String i3 : i2) { + if (range && argCount > 0 && timeStart == 0 && i3.startsWith("-")) { - timeStart = (long) - (((w * 7 * 24 * 60 * 60) + (d * 24 * 60 * 60) + (h * 60 * 60) + (m * 60) + s)); + + timeStart = (long) (((w * 7 * 24 * 60 * 60) + (d * 24 * 60 * 60) + (h * 60 * 60) + (m * 60) + + s)); w = 0; d = 0; h = 0; m = 0; s = 0; + } if (i3.endsWith("w") && w == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + w = Double.parseDouble(i4); + } + } else if (i3.endsWith("d") && d == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + d = Double.parseDouble(i4); + } + } else if (i3.endsWith("h") && h == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + h = Double.parseDouble(i4); + } + } else if (i3.endsWith("m") && m == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + m = Double.parseDouble(i4); + } + } else if (i3.endsWith("s") && s == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + s = Double.parseDouble(i4); + } + } argCount++; + } + if (timeStart > 0) { + timeEnd = (long) (((w * 7 * 24 * 60 * 60) + (d * 24 * 60 * 60) + (h * 60 * 60) + (m * 60) + s)); + } else { - timeStart = - (long) (((w * 7 * 24 * 60 * 60) + (d * 24 * 60 * 60) + (h * 60 * 60) + (m * 60) + s)); + + timeStart = (long) (((w * 7 * 24 * 60 * 60) + (d * 24 * 60 * 60) + (h * 60 * 60) + (m * 60) + + s)); + } + next = 0; + } else { + next = 0; + } + } + count++; + } if (timeEnd >= timeStart) { - return new long[] {timeEnd, timeStart}; + + return new long[] { timeEnd, timeStart }; + } else { - return new long[] {timeStart, timeEnd}; + + return new long[] { timeStart, timeEnd }; + } + } private static String timeString(BigDecimal input) { + return input.stripTrailingZeros().toPlainString(); + } protected static String parseTimeString(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); String time = ""; int count = 0; @@ -890,14 +1250,19 @@ public class CommandHandler implements CommandExecutor { BigDecimal m = new BigDecimal(0); BigDecimal s = new BigDecimal(0); for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("t:") || argument.equals("time:")) { + next = 1; + } else if (next == 1 || argument.startsWith("t:") || argument.startsWith("time:")) { + // time arguments argument = argument.replaceAll("time:", ""); argument = argument.replaceAll("t:", ""); @@ -912,327 +1277,476 @@ public class CommandHandler implements CommandExecutor { int argCount = 0; String[] i2 = argument.split(":"); for (String i3 : i2) { + if (range && argCount > 0 && !time.contains("-") && i3.startsWith("-")) { + w = new BigDecimal(0); d = new BigDecimal(0); h = new BigDecimal(0); m = new BigDecimal(0); s = new BigDecimal(0); time = time + " -"; + } if (i3.endsWith("w") && w.intValue() == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + w = new BigDecimal(i4); if (range) { + time = time + " " + timeString(w) + "w"; + } else { - time = time + " " - + Phrase.build( - Phrase.TIME_WEEKS, - timeString(w), - (w.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + + time = time + " " + Phrase.build(Phrase.TIME_WEEKS, timeString(w), + (w.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + } + } + } else if (i3.endsWith("d") && d.intValue() == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + d = new BigDecimal(i4); if (range) { + time = time + " " + timeString(d) + "d"; + } else { - time = time + " " - + Phrase.build( - Phrase.TIME_DAYS, - timeString(d), - (d.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + + time = time + " " + Phrase.build(Phrase.TIME_DAYS, timeString(d), + (d.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + } + } + } else if (i3.endsWith("h") && h.intValue() == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + h = new BigDecimal(i4); if (range) { + time = time + " " + timeString(h) + "h"; + } else { - time = time + " " - + Phrase.build( - Phrase.TIME_HOURS, - timeString(h), - (h.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + + time = time + " " + Phrase.build(Phrase.TIME_HOURS, timeString(h), + (h.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + } + } + } else if (i3.endsWith("m") && m.intValue() == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + m = new BigDecimal(i4); if (range) { + time = time + " " + timeString(m) + "m"; + } else { - time = time + " " - + Phrase.build( - Phrase.TIME_MINUTES, - timeString(m), - (m.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + + time = time + " " + Phrase.build(Phrase.TIME_MINUTES, timeString(m), + (m.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + } + } + } else if (i3.endsWith("s") && s.intValue() == 0) { + String i4 = i3.replaceAll("[^0-9.]", ""); - if (i4.length() > 0 - && i4.replaceAll("[^0-9]", "").length() > 0 - && i4.indexOf('.') == i4.lastIndexOf('.')) { + if (i4.length() > 0 && i4.replaceAll("[^0-9]", "").length() > 0 + && i4.indexOf('.') == i4.lastIndexOf('.')) + { + s = new BigDecimal(i4); if (range) { + time = time + " " + timeString(s) + "s"; + } else { - time = time + " " - + Phrase.build( - Phrase.TIME_SECONDS, - timeString(s), - (s.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + + time = time + " " + Phrase.build(Phrase.TIME_SECONDS, timeString(s), + (s.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)); + } + } + } argCount++; + } + next = 0; + } else { + next = 0; + } + } + count++; + } if (time.startsWith(" ")) { + time = time.substring(1); + } return time; + } protected static int parseRows(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); int rows = 0; int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("rows:")) { + next = 1; + } else if (next == 1 || argument.startsWith("rows:")) { + argument = argument.replaceAll("rows:", "").trim(); if (!argument.startsWith("-")) { + String i2 = argument.replaceAll("[^0-9]", ""); if (i2.length() > 0 && i2.length() < 10) { + rows = Integer.parseInt(i2); + } + } next = 0; + } else { + next = 0; + } + } + count++; + } return rows; + } private static void parseUser(List users, String string) { + string = string.trim(); if (string.contains(",")) { + String[] data = string.split(","); for (String user : data) { + validUserCheck(users, user); + } + } else { + validUserCheck(users, string); + } + } protected static List parseUsers(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); List users = new ArrayList<>(); int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (next == 2) { + if (argument.endsWith(",")) { + next = 2; + } else { + next = 0; + } - } else if (argument.equals("p:") - || argument.equals("user:") - || argument.equals("users:") - || argument.equals("u:")) { + + } else if (argument.equals("p:") || argument.equals("user:") || argument.equals("users:") + || argument.equals("u:")) + { + next = 1; - } else if (next == 1 - || argument.startsWith("p:") - || argument.startsWith("user:") - || argument.startsWith("users:") - || argument.startsWith("u:")) { + + } else if (next == 1 || argument.startsWith("p:") || argument.startsWith("user:") + || argument.startsWith("users:") || argument.startsWith("u:")) + { + argument = argument.replaceAll("user:", ""); argument = argument.replaceAll("users:", ""); argument = argument.replaceAll("p:", ""); argument = argument.replaceAll("u:", ""); if (argument.contains(",")) { + String[] i2 = argument.split(","); for (String i3 : i2) { + parseUser(users, i3); + } + if (argument.endsWith(",")) { + next = 1; + } else { + next = 0; + } + } else { + parseUser(users, argument); next = 0; + } + } else if (argument.endsWith(",") || argument.endsWith(":")) { + next = 2; + } else if (argument.contains(":")) { + next = 0; + } else { + parseUser(users, argument); next = 0; + } + } + count++; + } + return users; + } protected static int parseWorld(String[] inputArguments, boolean processWorldEdit, boolean requireLoaded) { + String[] argumentArray = inputArguments.clone(); int world_id = 0; int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim(); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); String inputProcessed = argument.toLowerCase(Locale.ROOT); if (inputProcessed.equals("r:") || inputProcessed.equals("radius:")) { + next = 2; + } else if (next == 2 || inputProcessed.startsWith("r:") || inputProcessed.startsWith("radius:")) { + argument = argument.replaceAll("radius:", "").replaceAll("r:", ""); inputProcessed = argument.toLowerCase(Locale.ROOT); if ((processWorldEdit && (inputProcessed.equals("#worldedit") || inputProcessed.equals("#we"))) - || inputProcessed.equals("#global") - || inputProcessed.equals("global") - || inputProcessed.equals("off") - || inputProcessed.equals("-1") - || inputProcessed.equals("none") - || inputProcessed.equals("false")) { + || inputProcessed.equals("#global") || inputProcessed.equals("global") + || inputProcessed.equals("off") || inputProcessed.equals("-1") + || inputProcessed.equals("none") || inputProcessed.equals("false")) + { + world_id = 0; + } else if (inputProcessed.startsWith("#")) { + world_id = Util.matchWorld(inputProcessed); if (world_id == -1 && !requireLoaded) { + world_id = ConfigHandler.worlds.getOrDefault(argument.replaceFirst("#", ""), -1); + } + } + next = 0; + } else { + next = 0; + } + } + count++; + } + return world_id; + } protected static boolean parseWorldEdit(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); boolean result = false; int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("r:") || argument.equals("radius:")) { + next = 2; + } else if (next == 2 || argument.startsWith("r:") || argument.startsWith("radius:")) { + argument = argument.replaceAll("radius:", ""); argument = argument.replaceAll("r:", ""); if (argument.equals("#worldedit") || argument.equals("#we")) { + result = true; + } + next = 0; + } else { + next = 0; + } + } + count++; + } + return result; + } protected static String parseWorldName(String[] inputArguments, boolean processWorldEdit) { + String[] argumentArray = inputArguments.clone(); String worldName = ""; int count = 0; int next = 0; for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim().toLowerCase(Locale.ROOT); argument = argument.replaceAll("\\\\", ""); argument = argument.replaceAll("'", ""); if (argument.equals("r:") || argument.equals("radius:")) { + next = 2; + } else if (next == 2 || argument.startsWith("r:") || argument.startsWith("radius:")) { + argument = argument.replaceAll("radius:", ""); argument = argument.replaceAll("r:", ""); if ((processWorldEdit && (argument.equals("#worldedit") || argument.equals("#we"))) - || argument.equals("#global") - || argument.equals("global") - || argument.equals("off") - || argument.equals("-1") - || argument.equals("none") - || argument.equals("false")) { + || argument.equals("#global") || argument.equals("global") || argument.equals("off") + || argument.equals("-1") || argument.equals("none") || argument.equals("false")) + { + worldName = ""; + } else if (argument.startsWith("#")) { + worldName = argument.replaceFirst("#", ""); + } + next = 0; + } else { + next = 0; + } + } + count++; + } + return worldName; + } protected static Map> getTags() { + Map> tagMap = new HashMap<>(); tagMap.put("#button", BlockGroup.BUTTONS); tagMap.put("#container", BlockGroup.CONTAINERS); @@ -1241,249 +1755,316 @@ public class CommandHandler implements CommandExecutor { tagMap.put("#pressure_plate", BlockGroup.PRESSURE_PLATES); tagMap.put("#shulker_box", BlockGroup.SHULKER_BOXES); return tagMap; + } protected static boolean checkTags(String argument) { + return getTags().containsKey(argument); + } protected static boolean checkTags(String argument, Map list) { + for (Entry> entry : getTags().entrySet()) { + String tag = entry.getKey(); Set materials = entry.getValue(); if (argument.equals(tag)) { + for (Material block : materials) { + list.put(block, false); + } return true; + } + } return false; + } protected static boolean checkTags(String argument, List list) { + for (Entry> entry : getTags().entrySet()) { + String tag = entry.getKey(); Set materials = entry.getValue(); if (argument.equals(tag)) { + list.addAll(materials); return true; + } + } return false; + } private static void validUserCheck(List users, String user) { - List badUsers = Arrays.asList( - "n", - "noisy", - "v", - "verbose", - "#v", - "#verbose", - "#silent", - "#preview", - "#preview_cancel", - "#count", - "#sum"); + + List badUsers = Arrays.asList("n", "noisy", "v", "verbose", "#v", "#verbose", "#silent", "#preview", + "#preview_cancel", "#count", "#sum"); String check = user.replaceAll("[\\s'\"]", ""); if (check.equals(user) && check.length() > 0) { + if (user.equalsIgnoreCase("#global")) { + user = "#global"; + } + if (!badUsers.contains(user.toLowerCase(Locale.ROOT))) { + users.add(user); + } + } + } @Override public boolean onCommand(CommandSender user, Command command, String commandLabel, String[] argumentArray) { + String commandName = command.getName().toLowerCase(Locale.ROOT); if (commandName.equals("core") || commandName.equals("coreprotect") || commandName.equals("co")) { + int resultc = argumentArray.length; if (resultc > -1) { + String corecommand = "help"; if (resultc > 0) { + corecommand = argumentArray[0].toLowerCase(Locale.ROOT); - } - boolean permission = false; - if (!permission) { - if (user.hasPermission("coreprotect.rollback") - && (corecommand.equals("rollback") - || corecommand.equals("rb") - || corecommand.equals("ro") - || corecommand.equals("apply") - || corecommand.equals("cancel"))) { - permission = true; - } else if (user.hasPermission("coreprotect.restore") - && (corecommand.equals("restore") - || corecommand.equals("rs") - || corecommand.equals("re") - || corecommand.equals("undo") - || corecommand.equals("apply") - || corecommand.equals("cancel"))) { - permission = true; - } else if (user.hasPermission("coreprotect.inspect") - && (corecommand.equals("i") - || corecommand.equals("inspect") - || corecommand.equals("inspector"))) { - permission = true; - } else if (user.hasPermission("coreprotect.help") && corecommand.equals("help")) { - permission = true; - } else if (user.hasPermission("coreprotect.purge") && corecommand.equals("purge")) { - permission = true; - } else if (user.hasPermission("coreprotect.lookup") - && (corecommand.equals("l") - || corecommand.equals("lookup") - || corecommand.equals("page") - || corecommand.equals("near"))) { - permission = true; - } else if (user.hasPermission("coreprotect.lookup.near") && corecommand.equals("near")) { - permission = true; - } else if (user.hasPermission("coreprotect.teleport") - && (corecommand.equals("tp") || corecommand.equals("teleport"))) { - permission = true; - } else if (user.hasPermission("coreprotect.reload") && corecommand.equals("reload")) { - permission = true; - } else if (user.hasPermission("coreprotect.status") - && (corecommand.equals("status") - || corecommand.equals("stats") - || corecommand.equals("version"))) { - permission = true; - } else if (user.hasPermission("coreprotect.consumer") && corecommand.equals("consumer")) { - permission = true; - } else if (user.hasPermission("coreprotect.networking") && corecommand.equals("network-debug")) { - permission = true; - } + } - if (corecommand.equals("rollback") - || corecommand.equals("restore") - || corecommand.equals("rb") - || corecommand.equals("rs") - || corecommand.equals("ro") - || corecommand.equals("re")) { - RollbackRestoreCommand.runCommand(user, command, permission, argumentArray, null, 0, 0); - } else if (corecommand.equals("apply")) { - ApplyCommand.runCommand(user, command, permission, argumentArray); - } else if (corecommand.equals("cancel")) { - CancelCommand.runCommand(user, command, permission, argumentArray); - } else if (corecommand.equals("undo")) { - UndoCommand.runCommand(user, command, permission, argumentArray); - } else if (corecommand.equals("help")) { - HelpCommand.runCommand(user, permission, argumentArray); - } else if (corecommand.equals("purge")) { - PurgeCommand.runCommand(user, permission, argumentArray); - } else if (corecommand.equals("inspect") || corecommand.equals("i")) { - InspectCommand.runCommand(user, permission, argumentArray); - } else if (corecommand.equals("lookup") || corecommand.equals("l") || corecommand.equals("page")) { - LookupCommand.runCommand(user, command, permission, argumentArray); - } else if (corecommand.equals("near")) { - LookupCommand.runCommand(user, command, permission, new String[] {"near", "r:5x5"}); - } else if (corecommand.equals("teleport") || corecommand.equals("tp")) { - TeleportCommand.runCommand(user, permission, argumentArray); - } else if (corecommand.equals("status") - || corecommand.equals("stats") - || corecommand.equals("version")) { - StatusCommand.runCommand(user, permission, argumentArray); - } else if (corecommand.equals("reload")) { - ReloadCommand.runCommand(user, permission, argumentArray); - } else if (corecommand.equals("consumer")) { - ConsumerCommand.runCommand(user, permission, argumentArray); - } else if (corecommand.equals("network-debug")) { - NetworkDebugCommand.runCommand(user, permission, argumentArray); - } else if (corecommand.equals("migrate-db")) { - if (!Util.validDonationKey()) { - Chat.sendMessage( - user, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.DONATION_KEY_REQUIRED)); - } else { - Extensions.runDatabaseMigration(corecommand, user, argumentArray); + boolean permission = false; + if (!permission) { + + if (user.hasPermission("coreprotect.rollback") + && (corecommand.equals("rollback") || corecommand.equals("rb") || corecommand.equals("ro") + || corecommand.equals("apply") || corecommand.equals("cancel"))) + { + + permission = true; + + } else if (user.hasPermission("coreprotect.restore") && (corecommand.equals("restore") + || corecommand.equals("rs") || corecommand.equals("re") || corecommand.equals("undo") + || corecommand.equals("apply") || corecommand.equals("cancel"))) + { + + permission = true; + + } else if (user.hasPermission("coreprotect.inspect") && (corecommand.equals("i") + || corecommand.equals("inspect") || corecommand.equals("inspector"))) + { + + permission = true; + + } else if (user.hasPermission("coreprotect.help") && corecommand.equals("help")) { + + permission = true; + + } else if (user.hasPermission("coreprotect.purge") && corecommand.equals("purge")) { + + permission = true; + + } else if (user.hasPermission("coreprotect.lookup") + && (corecommand.equals("l") || corecommand.equals("lookup") || corecommand.equals("page") + || corecommand.equals("near"))) + { + + permission = true; + + } else if (user.hasPermission("coreprotect.lookup.near") && corecommand.equals("near")) { + + permission = true; + + } else if (user.hasPermission("coreprotect.teleport") + && (corecommand.equals("tp") || corecommand.equals("teleport"))) + { + + permission = true; + + } else if (user.hasPermission("coreprotect.reload") && corecommand.equals("reload")) { + + permission = true; + + } else if (user.hasPermission("coreprotect.status") && (corecommand.equals("status") + || corecommand.equals("stats") || corecommand.equals("version"))) + { + + permission = true; + + } else if (user.hasPermission("coreprotect.consumer") && corecommand.equals("consumer")) { + + permission = true; + + } else if (user.hasPermission("coreprotect.networking") && corecommand.equals("network-debug")) { + + permission = true; + } - } else { - Chat.sendMessage( - user, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.COMMAND_NOT_FOUND, Color.WHITE, "/co " + corecommand)); + } + + if (corecommand.equals("rollback") || corecommand.equals("restore") || corecommand.equals("rb") + || corecommand.equals("rs") || corecommand.equals("ro") || corecommand.equals("re")) + { + + RollbackRestoreCommand.runCommand(user, command, permission, argumentArray, null, 0, 0); + + } else if (corecommand.equals("apply")) { + + ApplyCommand.runCommand(user, command, permission, argumentArray); + + } else if (corecommand.equals("cancel")) { + + CancelCommand.runCommand(user, command, permission, argumentArray); + + } else if (corecommand.equals("undo")) { + + UndoCommand.runCommand(user, command, permission, argumentArray); + + } else if (corecommand.equals("help")) { + + HelpCommand.runCommand(user, permission, argumentArray); + + } else if (corecommand.equals("purge")) { + + PurgeCommand.runCommand(user, permission, argumentArray); + + } else if (corecommand.equals("inspect") || corecommand.equals("i")) { + + InspectCommand.runCommand(user, permission, argumentArray); + + } else if (corecommand.equals("lookup") || corecommand.equals("l") || corecommand.equals("page")) { + + LookupCommand.runCommand(user, command, permission, argumentArray); + + } else if (corecommand.equals("near")) { + + LookupCommand.runCommand(user, command, permission, new String[] { "near", "r:5x5" }); + + } else if (corecommand.equals("teleport") || corecommand.equals("tp")) { + + TeleportCommand.runCommand(user, permission, argumentArray); + + } else if (corecommand.equals("status") || corecommand.equals("stats") + || corecommand.equals("version")) + { + + StatusCommand.runCommand(user, permission, argumentArray); + + } else if (corecommand.equals("reload")) { + + ReloadCommand.runCommand(user, permission, argumentArray); + + } else if (corecommand.equals("consumer")) { + + ConsumerCommand.runCommand(user, permission, argumentArray); + + } else if (corecommand.equals("network-debug")) { + + NetworkDebugCommand.runCommand(user, permission, argumentArray); + + } else if (corecommand.equals("migrate-db")) { + + if (!Util.validDonationKey()) { + + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.DONATION_KEY_REQUIRED)); + + } else { + + Extensions.runDatabaseMigration(corecommand, user, argumentArray); + + } + + } else { + + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.COMMAND_NOT_FOUND, Color.WHITE, "/co " + corecommand)); + + } + } else { - Chat.sendMessage( - user, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.MISSING_PARAMETERS, Color.WHITE, "/co ")); + + Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.MISSING_PARAMETERS, Color.WHITE, "/co ")); + } if (user.isOp() && versionAlert.get(user.getName()) == null) { + String latestVersion = NetworkHandler.latestVersion(); String latestEdgeVersion = NetworkHandler.latestEdgeVersion(); if (latestVersion != null || latestEdgeVersion != null) { + versionAlert.put(user.getName(), true); class updateAlert implements Runnable { + @Override public void run() { + try { + Thread.sleep(5000); - Chat.sendMessage( - user, + Chat.sendMessage(user, Color.WHITE + "----- " + Color.DARK_AQUA - + Phrase.build( - Phrase.UPDATE_HEADER, - "CoreProtect" - + (Util.isCommunityEdition() - ? " " + ConfigHandler.COMMUNITY_EDITION - : "")) + + Phrase.build(Phrase.UPDATE_HEADER, + "CoreProtect" + (Util.isCommunityEdition() + ? " " + ConfigHandler.COMMUNITY_EDITION + : "")) + Color.WHITE + " -----"); if (latestVersion != null) { - Chat.sendMessage( - user, - Color.DARK_AQUA - + Phrase.build( - Phrase.UPDATE_NOTICE, - Color.WHITE, - "CoreProtect CE v" + latestVersion)); - Chat.sendMessage( - user, - Color.DARK_AQUA - + Phrase.build( - Phrase.LINK_DOWNLOAD, - Color.WHITE, - "www.coreprotect.net/download/")); + + Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.UPDATE_NOTICE, + Color.WHITE, "CoreProtect CE v" + latestVersion)); + Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.LINK_DOWNLOAD, + Color.WHITE, "www.coreprotect.net/download/")); + } else { - Chat.sendMessage( - user, - Color.DARK_AQUA - + Phrase.build( - Phrase.UPDATE_NOTICE, - Color.WHITE, - "CoreProtect v" + latestEdgeVersion)); - Chat.sendMessage( - user, - Color.DARK_AQUA - + Phrase.build( - Phrase.LINK_DOWNLOAD, - Color.WHITE, - "www.coreprotect.net/latest/")); + + Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.UPDATE_NOTICE, + Color.WHITE, "CoreProtect v" + latestEdgeVersion)); + Chat.sendMessage(user, Color.DARK_AQUA + Phrase.build(Phrase.LINK_DOWNLOAD, + Color.WHITE, "www.coreprotect.net/latest/")); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } (new Thread(new updateAlert())).start(); + } + } return true; + } return false; + } + } diff --git a/src/main/java/net/coreprotect/command/ConsumerCommand.java b/src/main/java/net/coreprotect/command/ConsumerCommand.java index 4875b3f..e669570 100644 --- a/src/main/java/net/coreprotect/command/ConsumerCommand.java +++ b/src/main/java/net/coreprotect/command/ConsumerCommand.java @@ -12,74 +12,94 @@ import org.bukkit.command.ConsoleCommandSender; public class ConsumerCommand { private ConsumerCommand() { + throw new IllegalStateException("Command class"); + } protected static void runCommand(final CommandSender player, boolean permission, String[] args) { + if (!permission) { - Chat.sendMessage( - player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION)); + + Chat.sendMessage(player, + Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION)); return; + } + if (!(player instanceof ConsoleCommandSender)) { - Chat.sendMessage( - player, + + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.COMMAND_CONSOLE)); return; + } + if (ConfigHandler.converterRunning) { - Chat.sendMessage( - player, + + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.UPGRADE_IN_PROGRESS)); return; + } + if (ConfigHandler.purgeRunning) { - Chat.sendMessage( - player, + + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.PURGE_IN_PROGRESS)); return; + } if (args.length == 2) { + String action = args[1].toLowerCase(Locale.ROOT); boolean pauseCommand = (action.equals("pause") || action.equals("disable") || action.equals("stop")); boolean resumeCommand = (action.equals("resume") || action.equals("enable") || action.equals("start")); if (pauseCommand || resumeCommand) { + if (ConfigHandler.pauseConsumer) { + if (pauseCommand) { - Chat.sendMessage( - player, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.CONSUMER_ERROR, Selector.FIRST)); // already paused + + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.CONSUMER_ERROR, Selector.FIRST)); // already paused + } else { + ConfigHandler.pauseConsumer = false; - Chat.sendMessage( - player, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.CONSUMER_TOGGLED, Selector.SECOND)); // now started + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.CONSUMER_TOGGLED, Selector.SECOND)); // now started + } + } else { + if (resumeCommand) { - Chat.sendMessage( - player, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.CONSUMER_ERROR, Selector.SECOND)); // already running + + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.CONSUMER_ERROR, Selector.SECOND)); // already running + } else { + ConfigHandler.pauseConsumer = true; - Chat.sendMessage( - player, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.CONSUMER_TOGGLED, Selector.FIRST)); // now paused + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.CONSUMER_TOGGLED, Selector.FIRST)); // now paused + } + } + return; + } + } - Chat.sendMessage( - player, - Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " - + Phrase.build(Phrase.MISSING_PARAMETERS, Color.WHITE, "/co consumer ")); + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + + Phrase.build(Phrase.MISSING_PARAMETERS, Color.WHITE, "/co consumer ")); + } + } diff --git a/src/main/java/net/coreprotect/command/HelpCommand.java b/src/main/java/net/coreprotect/command/HelpCommand.java index 7420b90..ace256a 100755 --- a/src/main/java/net/coreprotect/command/HelpCommand.java +++ b/src/main/java/net/coreprotect/command/HelpCommand.java @@ -8,24 +8,28 @@ import net.coreprotect.utility.Color; import org.bukkit.command.CommandSender; public class HelpCommand { + protected static void runCommand(CommandSender player, boolean permission, String[] args) { + int resultc = args.length; if (permission) { + if (resultc > 1) { + String helpcommand_original = args[1]; String helpcommand = args[1].toLowerCase(Locale.ROOT); helpcommand = helpcommand.replaceAll("[^a-zA-Z]", ""); - Chat.sendMessage( - player, - Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.HELP_HEADER, "CoreProtect") - + Color.WHITE + " -----"); + Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA + + Phrase.build(Phrase.HELP_HEADER, "CoreProtect") + Color.WHITE + " -----"); if (helpcommand.equals("help")) { - Chat.sendMessage( - player, + + Chat.sendMessage(player, Color.DARK_AQUA + "/co help " + Color.WHITE + "- " + Phrase.build(Phrase.HELP_LIST)); - } else if (helpcommand.equals("inspect") - || helpcommand.equals("inspector") - || helpcommand.equals("in")) { + + } else if (helpcommand.equals("inspect") || helpcommand.equals("inspector") + || helpcommand.equals("in")) + { + Chat.sendMessage(player, Color.DARK_AQUA + Phrase.build(Phrase.HELP_INSPECT_1)); Chat.sendMessage(player, "* " + Phrase.build(Phrase.HELP_INSPECT_2)); Chat.sendMessage(player, "* " + Phrase.build(Phrase.HELP_INSPECT_3)); @@ -33,258 +37,188 @@ public class HelpCommand { Chat.sendMessage(player, "* " + Phrase.build(Phrase.HELP_INSPECT_5)); Chat.sendMessage(player, "* " + Phrase.build(Phrase.HELP_INSPECT_6)); Chat.sendMessage(player, Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_INSPECT_7)); - } else if (helpcommand.equals("params") - || helpcommand.equals("param") - || helpcommand.equals("parameters") - || helpcommand.equals("parameter")) { - Chat.sendMessage( - player, - Color.DARK_AQUA + "/co lookup " + Color.GREY + " " + Color.WHITE + "- " - + Phrase.build(Phrase.HELP_PARAMS_1, Selector.FIRST)); - Chat.sendMessage( - player, - Color.DARK_AQUA + "| " + Color.GREY + "u: " + Color.WHITE + "- " - + Phrase.build(Phrase.HELP_PARAMS_2, Selector.FIRST)); - Chat.sendMessage( - player, - Color.DARK_AQUA + "| " + Color.GREY + "t: