diff --git a/main/pom.xml b/main/pom.xml index d7526cdd4..f260bdd70 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -58,9 +58,9 @@ provided - net.aufdemrand + com.denizenscript denizen - 1.0.2-SNAPSHOT + 1.1.0-SNAPSHOT provided diff --git a/main/src/main/java/me/blackvein/quests/DenizenTrigger.java b/main/src/main/java/me/blackvein/quests/DenizenTrigger.java index aeb644896..63095a411 100644 --- a/main/src/main/java/me/blackvein/quests/DenizenTrigger.java +++ b/main/src/main/java/me/blackvein/quests/DenizenTrigger.java @@ -12,20 +12,18 @@ package me.blackvein.quests; -import net.aufdemrand.denizen.BukkitScriptEntryData; -import net.aufdemrand.denizen.objects.dPlayer; -import net.aufdemrand.denizencore.scripts.ScriptRegistry; -import net.aufdemrand.denizencore.scripts.containers.core.TaskScriptContainer; - public class DenizenTrigger { + private Quests plugin; + + public DenizenTrigger(Quests plugin) { + this.plugin = plugin; + } protected boolean runDenizenScript(String scriptName, Quester quester) { if (scriptName == null) { return false; } - if (ScriptRegistry.containsScript(scriptName)) { - TaskScriptContainer task_script = ScriptRegistry.getScriptContainerAs(scriptName, TaskScriptContainer.class); - BukkitScriptEntryData entryData = new BukkitScriptEntryData(dPlayer.mirrorBukkitPlayer(quester.getPlayer()), null); - task_script.runTaskScript(entryData, null); + if (plugin.getDependencies().getDenizenAPI().containsScript(scriptName)) { + plugin.getDependencies().getDenizenAPI().runTaskScript(scriptName, quester.getPlayer()); } return true; } diff --git a/main/src/main/java/me/blackvein/quests/Dependencies.java b/main/src/main/java/me/blackvein/quests/Dependencies.java index 35ed1c6d4..17227be51 100644 --- a/main/src/main/java/me/blackvein/quests/Dependencies.java +++ b/main/src/main/java/me/blackvein/quests/Dependencies.java @@ -14,9 +14,9 @@ package me.blackvein.quests; import org.bukkit.plugin.RegisteredServiceProvider; +import me.blackvein.quests.util.DenizenAPI; import me.blackvein.quests.util.WorldGuardAPI; import me.clip.placeholderapi.PlaceholderAPIPlugin; -import net.aufdemrand.denizen.Denizen; import net.citizensnpcs.api.CitizensPlugin; import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.permission.Permission; @@ -42,7 +42,7 @@ public class Dependencies { private static PhatLoots phatLoots = null; private static PlaceholderAPIPlugin placeholder = null; private static CitizensPlugin citizens = null; - private static Denizen denizen = null; + private static DenizenAPI denizenApi = null; private static CitizensBooksAPI citizensBooks = null; private static DungeonsXL dungeons = null; private static PartiesAPI parties = null; @@ -87,8 +87,8 @@ public class Dependencies { citizens = null; } - public Denizen getDenizen() { - return denizen; + public DenizenAPI getDenizenAPI() { + return denizenApi; } public CitizensBooksAPI getCitizensBooksApi() { @@ -126,7 +126,7 @@ public class Dependencies { worldGuardApi = new WorldGuardAPI(plugin.getServer().getPluginManager().getPlugin("WorldGuard")); } if (isPluginAvailable("Denizen")) { - denizen = (Denizen) plugin.getServer().getPluginManager().getPlugin("Denizen"); + denizenApi = new DenizenAPI(); } if (isPluginAvailable("mcMMO")) { try { diff --git a/main/src/main/java/me/blackvein/quests/Quests.java b/main/src/main/java/me/blackvein/quests/Quests.java index 7894da272..74377b61e 100644 --- a/main/src/main/java/me/blackvein/quests/Quests.java +++ b/main/src/main/java/me/blackvein/quests/Quests.java @@ -96,7 +96,7 @@ import me.blackvein.quests.util.Lang; import me.blackvein.quests.util.LocaleQuery; import me.blackvein.quests.util.MiscUtil; import me.clip.placeholderapi.PlaceholderAPI; -import net.aufdemrand.denizencore.scripts.ScriptRegistry; + import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; @@ -1984,8 +1984,8 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener List npcAmountsToKill = new LinkedList(); // Denizen script load if (config.contains("quests." + questKey + ".stages.ordered." + s2 + ".script-to-run")) { - if (ScriptRegistry.containsScript(config.getString("quests." + questKey + ".stages.ordered." + s2 + ".script-to-run"))) { - trigger = new DenizenTrigger(); + if (getDependencies().getDenizenAPI().containsScript(config.getString("quests." + questKey + ".stages.ordered." + s2 + ".script-to-run"))) { + trigger = new DenizenTrigger(this); oStage.script = config.getString("quests." + questKey + ".stages.ordered." + s2 + ".script-to-run"); } else { stageFailed("script-to-run: in Stage " + s2 + " of Quest " + quest.getName() + " is not a Denizen script!"); diff --git a/main/src/main/java/me/blackvein/quests/util/DenizenAPI.java b/main/src/main/java/me/blackvein/quests/util/DenizenAPI.java new file mode 100644 index 000000000..6188f0e0c --- /dev/null +++ b/main/src/main/java/me/blackvein/quests/util/DenizenAPI.java @@ -0,0 +1,210 @@ +package me.blackvein.quests.util; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; + +import javax.annotation.Nullable; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import com.denizenscript.denizen.BukkitScriptEntryData; +import com.denizenscript.denizen.objects.NPCTag; +import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizencore.scripts.ScriptRegistry; +import com.denizenscript.denizencore.scripts.containers.core.TaskScriptContainer; + +import net.citizensnpcs.api.npc.NPC; + +public class DenizenAPI { + private Object denizen = null; + private Class scriptRegistry = null; + private Method containsScriptGetMethod = null; + private Method _getScriptNamesGetMethod = null; + private Class scriptContainer = null; + private Class taskScriptContainer = null; + private Method getScriptContainerAsGetMethod = null; + private Class dPlayer = null; + private Class dNPC = null; + private Method mirrorBukkitPlayerGetMethod = null; + private Method mirrorCitizensNPCGetMethod = null; + private Class scriptEntryData = null; + private Class bukkitScriptEntryData = null; + public boolean isLegacyVersion = false; + + public boolean isEnabled() { + return denizen != null; + } + + public DenizenAPI() { + try { + denizen = Class.forName("com.denizenscript.denizen.Denizen"); + // Denizen 1.1.0+ + } catch (Exception e) { + try { + //denizen = Class.forName("net.aufdemrand.denizen.Denizen"); + scriptRegistry = Class.forName("net.aufdemrand.denizencore.scripts.ScriptRegistry"); + scriptContainer = Class.forName("net.aufdemrand.denizencore.scripts.containers.ScriptContainer"); + taskScriptContainer = Class.forName("net.aufdemrand.denizencore.scripts.containers.core.TaskScriptContainer"); + dPlayer = Class.forName("net.aufdemrand.denizen.objects.dPlayer"); + dNPC = Class.forName("net.aufdemrand.denizen.objects.dNPC"); + scriptEntryData = Class.forName("net.aufdemrand.denizencore.scripts.ScriptEntryData"); + bukkitScriptEntryData = Class.forName("net.aufdemrand.denizen.BukkitScriptEntryData"); + // Denizen <1.1.0 + } catch (Exception e2) { + // Fail silently + } + } + } + + private void initialize() { + if (!isLegacyVersion) { + isLegacyVersion = true; + if (denizen == null) { + try { + containsScriptGetMethod = scriptRegistry.getMethod("containsScript", String.class); + _getScriptNamesGetMethod = scriptRegistry.getMethod("_getScriptNames"); + getScriptContainerAsGetMethod = scriptRegistry.getMethod("getScriptContainerAs", String.class, taskScriptContainer.getClass()); + mirrorBukkitPlayerGetMethod = dPlayer.getMethod("mirrorBukkitPlayer", OfflinePlayer.class); + mirrorCitizensNPCGetMethod = dNPC.getMethod("mirrorCitizensNPC", NPC.class); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests failed to bind to Denizen, integration will not work!", e); + return; + } + } + } + } + + @Nullable + public boolean containsScript(String input) { + if (denizen != null) { + // Denizen 1.1.0+ + return ScriptRegistry.containsScript(input); + } else { + // Denizen <1.1.0 + initialize(); + if (scriptRegistry == null || containsScriptGetMethod == null) return false; + boolean script = false; + try { + script = (boolean)containsScriptGetMethod.invoke(scriptRegistry, input); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests encountered an error invoking Denizen ScriptRegistry#containsScript", e); + } + return script; + } + } + + @Nullable + public String getScriptContainerName(String input) { + if (denizen != null) { + return ScriptRegistry.getScriptContainer(input).getName(); + } else { + initialize(); + if (scriptRegistry == null || scriptContainer == null) return null; + String name = null; + Object instance; + try { + Constructor constructor = scriptRegistry.getConstructor(YamlConfiguration.class, String.class); + instance = constructor.newInstance(null, input); + name = (String)instance.getClass().getMethod("getName").invoke(scriptContainer); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests encountered an error invoking Denizen ScriptContainer#getName", e); + } + return name; + } + } + + @SuppressWarnings("unchecked") + @Nullable + public Set _getScriptNames() { + if (denizen != null) { + return ScriptRegistry._getScriptNames(); + } else { + initialize(); + if (scriptRegistry == null || _getScriptNamesGetMethod == null) return null; + Set names = null; + try { + names = (Set)_getScriptNamesGetMethod.invoke(scriptRegistry); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests encountered an error invoking Denizen ScriptRegistry#_getScriptNames", e); + } + return names; + } + } + + @Nullable + public Object getScriptContainerAs(String scriptName) { + if (denizen != null) { + return ScriptRegistry.getScriptContainerAs(scriptName, TaskScriptContainer.class); + } else { + initialize(); + if (scriptRegistry == null || taskScriptContainer == null) return null; + Object container = null; + try { + container = getScriptContainerAsGetMethod.invoke(scriptRegistry, scriptName, taskScriptContainer); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests encountered an error invoking Denizen #getScriptContainerAs", e); + } + return container; + } + } + + @Nullable + public Object mirrorBukkitPlayer(Player player) { + if (denizen != null) { + return PlayerTag.mirrorBukkitPlayer(player); + } else { + initialize(); + if (dPlayer == null || mirrorBukkitPlayerGetMethod == null) return null; + Object dp = null; + try { + dp = mirrorBukkitPlayerGetMethod.invoke(dPlayer, player); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests encountered an error invoking Denizen dPlayer#mirrorBukkitPlayer", e); + } + return dp; + } + } + + @Nullable + public Object mirrorCitizensNPC(NPC npc) { + if (denizen != null) { + return NPCTag.mirrorCitizensNPC(npc); + } else { + initialize(); + if (dNPC == null || mirrorCitizensNPCGetMethod == null) return null; + Object dp = null; + try { + dp = mirrorCitizensNPCGetMethod.invoke(dNPC, npc); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests encountered an error invoking Denizen dNPC#mirrorCitizensNPC", e); + } + return dp; + } + } + + @Nullable + public void runTaskScript(String scriptName, Player player) { + if (denizen != null) { + TaskScriptContainer taskScript = ScriptRegistry.getScriptContainerAs(scriptName, TaskScriptContainer.class); + BukkitScriptEntryData entryData = new BukkitScriptEntryData(PlayerTag.mirrorBukkitPlayer(player), null); + taskScript.runTaskScript(entryData, null); + } else { + initialize(); + if (scriptRegistry == null || bukkitScriptEntryData == null || scriptEntryData == null) return; + try { + Constructor constructor = bukkitScriptEntryData.getConstructors()[0]; + Object tsc = getScriptContainerAs(scriptName); + Method runTaskScript = tsc.getClass().getMethod("runTaskScript", scriptEntryData, Map.class); + runTaskScript.invoke(tsc, constructor.newInstance(mirrorBukkitPlayer(player), null), null); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests encountered an error invoking Denizen TaskScriptContainer#runTaskScript", e); + } + } + } +} \ No newline at end of file diff --git a/main/src/main/java/me/blackvein/quests/util/WorldGuardAPI.java b/main/src/main/java/me/blackvein/quests/util/WorldGuardAPI.java index de05a902f..4664aa2c2 100644 --- a/main/src/main/java/me/blackvein/quests/util/WorldGuardAPI.java +++ b/main/src/main/java/me/blackvein/quests/util/WorldGuardAPI.java @@ -17,8 +17,7 @@ import java.util.logging.Level; import javax.annotation.Nullable; -import me.blackvein.quests.Quests; - +import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -33,7 +32,6 @@ import com.sk89q.worldguard.protection.managers.RegionManager; * @author NathanWolf */ public class WorldGuardAPI { - private Quests plugin; private Object worldGuard = null; private WorldGuardPlugin worldGuardPlugin = null; private Object regionContainer = null; @@ -74,8 +72,8 @@ public class WorldGuardAPI { private void initialize() { if (!initialized) { initialized = true; - // Super hacky reflection to deal with differences in WorldGuard 6 and 7+ if (worldGuard != null) { + // WorldGuard 7+ try { Method getPlatFormMethod = worldGuard.getClass().getMethod("getPlatform"); Object platform = getPlatFormMethod.invoke(worldGuard); @@ -85,25 +83,25 @@ public class WorldGuardAPI { Class worldEditAdapterClass = Class.forName("com.sk89q.worldedit.bukkit.BukkitAdapter"); worldAdaptMethod = worldEditAdapterClass.getMethod("adapt", World.class); regionContainerGetMethod = regionContainer.getClass().getMethod("get", worldEditWorldClass); - } catch (Exception ex) { - plugin.getLogger().log(Level.WARNING, "Failed to bind to WorldGuard, integration will not work!", ex); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests failed to bind to WorldGuard, integration will not work!", e); regionContainer = null; return; } } else { + // WorldGuard <7 regionContainer = worldGuardPlugin.getRegionContainer(); try { regionContainerGetMethod = regionContainer.getClass().getMethod("get", World.class); - - } catch (Exception ex) { - plugin.getLogger().log(Level.WARNING, "Failed to bind to WorldGuard, integration will not work!", ex); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests failed to bind to WorldGuard, integration will not work!", e); regionContainer = null; return; } } if (regionContainer == null) { - plugin.getLogger().warning("Failed to find RegionContainer, WorldGuard integration will not function!"); + Bukkit.getLogger().warning("Quests failed to find RegionContainer, WorldGuard integration will not function!"); } } } @@ -115,13 +113,15 @@ public class WorldGuardAPI { RegionManager regionManager = null; try { if (worldAdaptMethod != null) { + // WorldGuard 7+ Object worldEditWorld = worldAdaptMethod.invoke(null, world); regionManager = (RegionManager)regionContainerGetMethod.invoke(regionContainer, worldEditWorld); } else { + // WorldGuard <7 regionManager = (RegionManager)regionContainerGetMethod.invoke(regionContainer, world); } - } catch (Exception ex) { - plugin.getLogger().log(Level.WARNING, "An error occurred looking up a WorldGuard RegionManager", ex); + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, "Quests encountered an error getting WorldGuard RegionManager", e); } return regionManager; }