diff --git a/Changelog.txt b/Changelog.txt index 2d58a014a..3a986acf6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,15 @@ Version 2.1.89 + When using WG with mcMMO, mcMMO now examines WG during runtime to determine if its a compatible version or not, see the notes Fixed a bug that could result in Tree Feller failing to remove parts of a tree + Updated Japanese locale (thanks snake) + + NOTES: + https://mcmmo.org/wiki/World_guard - A list of WG flags + It is not necessary to have WG installed, but if you do have WG installed mcMMO hooks into it to provide some additional features. + + Previously mcMMO used to determine if WG was compatible just by checking to see if it was version 7 of WG, however version 7 of WG is not guaranteed to be compatible as necessary classes that mcMMO hooks into were added during its development and some users are still running early dev versions of WG7. + In order to decrease the chance of error, mcMMO now uses reflection when checking to see if WG is compatible in addition to checking its version number, if its not compatible mcMMO will print a message and refrain from hooking into WG. + WG is an optional dependency for mcMMO, and unfortunately before this change if mcMMO thought you were running a compatible version of WG and it turned out you weren't then mcMMO would not function correctly. Version 2.1.88 mcMMO is now more compatible with a plugin named Project Korra diff --git a/pom.xml b/pom.xml index c7402166f..202964971 100755 --- a/pom.xml +++ b/pom.xml @@ -173,7 +173,7 @@ com.sk89q.worldguard worldguard-core - 7.0.0-SNAPSHOT + 7.0.1-SNAPSHOT com.sk89q.worldguard diff --git a/src/main/java/com/gmail/nossr50/commands/admin/PlayerDebug.java b/src/main/java/com/gmail/nossr50/commands/admin/PlayerDebug.java new file mode 100644 index 000000000..9ced7e818 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/commands/admin/PlayerDebug.java @@ -0,0 +1,13 @@ +package com.gmail.nossr50.commands.admin; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +public class PlayerDebug implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + return false; + } +} diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 9186e2206..11ac2d4bc 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -45,6 +45,7 @@ import com.gmail.nossr50.util.scoreboards.ScoreboardManager; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.upgrade.UpgradeManager; import com.gmail.nossr50.worldguard.WorldGuardManager; +import com.gmail.nossr50.worldguard.WorldGuardUtils; import com.google.common.base.Charsets; import net.shatteredlands.shatt.backup.ZipLibrary; import org.bstats.bukkit.Metrics; @@ -309,8 +310,12 @@ public class mcMMO extends JavaPlugin { @Override public void onLoad() { - if(getServer().getPluginManager().getPlugin("WorldGuard") != null) - WorldGuardManager.getInstance().registerFlags(); + if(getServer().getPluginManager().getPlugin("WorldGuard") != null) { + //Make sure WG is compatible before proceeding + if(WorldGuardUtils.isWorldGuardLoaded()) { + WorldGuardManager.getInstance().registerFlags(); + } + } } /** diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java index 03459492e..5e130772c 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java @@ -148,9 +148,8 @@ public final class Woodcutting { * @return True if the tool can sustain the durability loss */ protected static boolean handleDurabilityLoss(Set treeFellerBlocks, ItemStack inHand) { - - if((inHand.getItemMeta().getEnchants().get(Enchantment.DURABILITY) != null && inHand.getItemMeta().getEnchants().get(Enchantment.DURABILITY) >= 1) - || (inHand.getItemMeta() != null && inHand.getItemMeta().isUnbreakable())) { + //Treat the NBT tag for unbreakable and the durability enchant differently + if(inHand.getItemMeta() != null && inHand.getItemMeta().isUnbreakable()) { return true; } diff --git a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java index 896aad675..248753153 100644 --- a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java +++ b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java @@ -24,11 +24,6 @@ public class WorldGuardManager { return instance; } - public WorldGuardManager() - { - - } - public boolean hasMainFlag(Player player) { if(player == null) @@ -37,7 +32,6 @@ public class WorldGuardManager { BukkitPlayer localPlayer = BukkitAdapter.adapt(player); com.sk89q.worldedit.util.Location loc = localPlayer.getLocation(); - //WorldGuardPlugin worldGuard = getWorldGuard(); RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); RegionQuery query = container.createQuery(); @@ -101,8 +95,6 @@ public class WorldGuardManager { FlagRegistry registry = WorldGuard.getInstance().getFlagRegistry(); try { // register our flag with the registry - /*registry.register(WorldGuardFlags.MCMMO_ENABLE_WG_FLAG); - registry.register(WorldGuardFlags.MCMMO_XP_WG_FLAG);*/ registry.register(WorldGuardFlags.MCMMO_ENABLE_WG_FLAG); registry.register(WorldGuardFlags.MCMMO_XP_WG_FLAG); registry.register(WorldGuardFlags.MCMMO_HARDCORE_WG_FLAG); diff --git a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardUtils.java b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardUtils.java index d04ee6c11..e33e1e508 100644 --- a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardUtils.java +++ b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardUtils.java @@ -4,58 +4,122 @@ import com.gmail.nossr50.mcMMO; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import org.bukkit.plugin.Plugin; +import java.util.ArrayList; + import static org.bukkit.Bukkit.getServer; public class WorldGuardUtils { private static WorldGuardPlugin worldGuardPluginRef; private static boolean isLoaded = false; - private static boolean hasWarned = false; + private static boolean detectedIncompatibleWG = false; + private static final ArrayList WGClassList; + + static { + /* + These are the classes mcMMO tries to hook into for WG support, if any of them are missing it is safe to consider WG is not compatible + com.sk89q.worldedit.bukkit.BukkitAdapter + com.sk89q.worldedit.bukkit.BukkitPlayer + com.sk89q.worldguard.WorldGuard + com.sk89q.worldguard.bukkit.WorldGuardPlugin + com.sk89q.worldguard.protection.flags.registry.FlagConflictException + com.sk89q.worldguard.protection.flags.registry.FlagRegistry + com.sk89q.worldguard.protection.regions.RegionContainer + com.sk89q.worldguard.protection.regions.RegionQuery + */ + + WGClassList = new ArrayList<>(); + WGClassList.add("com.sk89q.worldedit.bukkit.BukkitAdapter"); + WGClassList.add("com.sk89q.worldedit.bukkit.BukkitPlayer"); + WGClassList.add("com.sk89q.worldguard.WorldGuard"); + WGClassList.add("com.sk89q.worldguard.bukkit.WorldGuardPlugin"); + WGClassList.add("com.sk89q.worldguard.protection.flags.registry.FlagConflictException"); + WGClassList.add("com.sk89q.worldguard.protection.flags.registry.FlagRegistry"); + WGClassList.add("com.sk89q.worldguard.protection.regions.RegionContainer"); + WGClassList.add("com.sk89q.worldguard.protection.regions.RegionQuery"); + } public static boolean isWorldGuardLoaded() { + if(detectedIncompatibleWG) + return false; + WorldGuardPlugin plugin = getWorldGuard(); - try { - // WorldGuard may not be loaded - if (plugin == null) { - return false; // Maybe you want throw an exception instead - } - } catch (Exception e) { - e.printStackTrace(); - //Silently Fail - //mcMMO.p.getLogger().severe("Failed to detect worldguard."); - return false; - } - - - return true; + return plugin == null; } + /** + * Gets the instance of the WG plugin if its compatible + * Results are cached + * @return the instance of WG plugin, null if its not compatible or isn't present + */ private static WorldGuardPlugin getWorldGuard() { + //WG plugin reference is already cached so just return it if(isLoaded) return worldGuardPluginRef; + //Grab WG if it exists Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard"); - if(plugin instanceof WorldGuardPlugin) - { - if(plugin.getDescription().getVersion().startsWith("7")) + if(plugin == null) { + //WG is not present + detectedIncompatibleWG = true; + mcMMO.p.getLogger().info("WorldGuard was not detected."); + } else { + //Check that its actually of class WorldGuardPlugin + if(plugin instanceof WorldGuardPlugin) { - worldGuardPluginRef = (WorldGuardPlugin) plugin; - - if(worldGuardPluginRef != null) - isLoaded = true; - - } else { - if(!hasWarned) + if(isCompatibleVersion(plugin)) { - mcMMO.p.getLogger().severe("mcMMO only supports WorldGuard version 7! Make sure you have WG 7! This warning will not appear again."); - hasWarned = true; + worldGuardPluginRef = (WorldGuardPlugin) plugin; + isLoaded = true; + } + } else { + //Plugin is not of the expected type + markWGIncompatible(); + } + } + + + return worldGuardPluginRef; + } + + /** + * Checks to make sure the version of WG installed is compatible + * Does this by checking for necessary WG classes via Reflection + * This does not guarantee compatibility, but it should help reduce the chance that mcMMO tries to hook into WG and its not compatible + * @return true if the version of WG appears to be compatible + */ + private static boolean isCompatibleVersion(Plugin plugin) { + //Check that the version of WG is at least version 7.xx + if(!plugin.getDescription().getVersion().startsWith("7")) { + markWGIncompatible(); + } else { + //Use Reflection to check for a class not present in all versions of WG7 + for(String classString : WGClassList) { + try { + Class checkForClass = Class.forName(classString); + detectedIncompatibleWG = false; //In case this was set to true previously + } catch (ClassNotFoundException e) { + mcMMO.p.getLogger().severe("Missing WorldGuard class - "+classString); + markWGIncompatible(); + break; //Break out of the loop } } } - return worldGuardPluginRef; + return detectedIncompatibleWG; + } + + /** + * Mark WG as being incompatible to avoid unnecessary operations + */ + private static void markWGIncompatible() { + mcMMO.p.getLogger().severe("You are using a version of WG that is not compatible with mcMMO, " + + "WG features for mcMMO will be disabled. mcMMO requires you to be using a new version of WG7 " + + "in order for it to use WG features. Not all versions of WG7 are compatible."); + mcMMO.p.getLogger().severe("mcMMO will continue to function normally, but if you wish to use WG support you must use a compatible version."); + detectedIncompatibleWG = true; } }