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;
}