diff --git a/src/main/java/net/aufdemrand/denizen/exceptions/ScriptEntryCreationException.java b/src/main/java/net/aufdemrand/denizen/exceptions/ScriptEntryCreationException.java index aadd8f9d4b..e569dee934 100644 --- a/src/main/java/net/aufdemrand/denizen/exceptions/ScriptEntryCreationException.java +++ b/src/main/java/net/aufdemrand/denizen/exceptions/ScriptEntryCreationException.java @@ -4,7 +4,7 @@ public class ScriptEntryCreationException extends Exception { - private static final long serialVersionUID = 3159123423457792068L; + private static final long serialVersionUID = 315955523457792068L; public ScriptEntryCreationException(String msg) { super(msg); diff --git a/src/main/java/net/aufdemrand/denizen/npc/actions/ActionHandler.java b/src/main/java/net/aufdemrand/denizen/npc/actions/ActionHandler.java index 63aeac980c..efb9a80e5c 100644 --- a/src/main/java/net/aufdemrand/denizen/npc/actions/ActionHandler.java +++ b/src/main/java/net/aufdemrand/denizen/npc/actions/ActionHandler.java @@ -4,9 +4,10 @@ import net.aufdemrand.denizen.objects.dNPC; import net.aufdemrand.denizen.objects.dPlayer; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.containers.core.AssignmentScriptContainer; import net.aufdemrand.denizen.objects.aH; +import net.aufdemrand.denizen.scripts.queues.core.InstantQueue; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizen.utilities.debugging.dB.DebugElement; @@ -41,7 +42,7 @@ public boolean doAction(String actionName, dNPC npc, dPlayer player, AssignmentS dB.echoDebug(DebugElement.Header, "Building action 'On " + actionName.toUpperCase() + "' for " + npc.toString()); - ScriptQueue queue = ScriptQueue._getInstantQueue(ScriptQueue._getNextId()).addEntries(script); + ScriptQueue queue = InstantQueue.getQueue(null).addEntries(script); queue.start(); // TODO: Read queue context to see if the event behind action should be cancelled. diff --git a/src/main/java/net/aufdemrand/denizen/objects/ObjectFetcher.java b/src/main/java/net/aufdemrand/denizen/objects/ObjectFetcher.java index 2012fe2b1b..9377d516aa 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/ObjectFetcher.java +++ b/src/main/java/net/aufdemrand/denizen/objects/ObjectFetcher.java @@ -7,8 +7,8 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) -public @interface ObjectFetcher { +public @interface ObjectFetcher { String value(); } diff --git a/src/main/java/net/aufdemrand/denizen/objects/aH.java b/src/main/java/net/aufdemrand/denizen/objects/aH.java index 82ebbda8dc..e7b3c2a59f 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/aH.java +++ b/src/main/java/net/aufdemrand/denizen/objects/aH.java @@ -1,6 +1,6 @@ package net.aufdemrand.denizen.objects; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.ScriptRegistry; import net.aufdemrand.denizen.utilities.debugging.dB; import org.bukkit.ChatColor; @@ -474,12 +474,6 @@ public static dNPC getNPCFrom(String arg) { return dNPC.valueOf(aH.getStringFrom(arg)); } - @Deprecated - public static ScriptQueue getQueueFrom(String arg) { - arg = arg.replace("queue:", ""); - return ScriptQueue._getQueue(getStringFrom(arg).toUpperCase()); - } - public static String getStringFrom(String arg) { String[] parts = arg.split(":", 2); return parts.length >=2 ? parts[1] : arg; diff --git a/src/main/java/net/aufdemrand/denizen/objects/dCuboid.java b/src/main/java/net/aufdemrand/denizen/objects/dCuboid.java index 7f33f5263c..c63ff787da 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dCuboid.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dCuboid.java @@ -1,18 +1,9 @@ package net.aufdemrand.denizen.objects; -import net.aufdemrand.denizen.scripts.ScriptQueue; -import net.aufdemrand.denizen.scripts.containers.core.TaskScriptContainer; import net.aufdemrand.denizen.tags.Attribute; import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.debugging.dB; -import net.aufdemrand.denizen.utilities.depends.Depends; -import net.aufdemrand.denizen.utilities.depends.WorldGuardUtilities; -import net.aufdemrand.denizen.utilities.entity.Rotation; -import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.Sign; import java.util.*; import java.util.regex.Matcher; diff --git a/src/main/java/net/aufdemrand/denizen/scripts/ScriptEngine.java b/src/main/java/net/aufdemrand/denizen/scripts/ScriptEngine.java index 09b426760f..d20a97542c 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/ScriptEngine.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/ScriptEngine.java @@ -2,6 +2,7 @@ import net.aufdemrand.denizen.Denizen; import net.aufdemrand.denizen.scripts.commands.CommandExecuter; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.requirements.RequirementChecker; import net.aufdemrand.denizen.utilities.debugging.dB; @@ -50,7 +51,7 @@ public void revolve(ScriptQueue scriptQueue) { // Set as last entry executed scriptQueue.setLastEntryExecuted(scriptEntry); - if (scriptEntry.isInstant() || scriptQueue.ticks == 0 && !scriptQueue.hasInjectedItems) { + if (scriptEntry.isInstant() && !scriptQueue.hasInjectedItems) { // Remove from execution list scriptEntry = scriptQueue.getNext(); } diff --git a/src/main/java/net/aufdemrand/denizen/scripts/ScriptEntry.java b/src/main/java/net/aufdemrand/denizen/scripts/ScriptEntry.java index c97a163b0f..f1cc179642 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/ScriptEntry.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/ScriptEntry.java @@ -3,6 +3,7 @@ import net.aufdemrand.denizen.exceptions.ScriptEntryCreationException; import net.aufdemrand.denizen.objects.*; import net.aufdemrand.denizen.scripts.containers.ScriptContainer; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import java.util.*; diff --git a/src/main/java/net/aufdemrand/denizen/scripts/ScriptQueue.java b/src/main/java/net/aufdemrand/denizen/scripts/ScriptQueue.java deleted file mode 100644 index c11e36d357..0000000000 --- a/src/main/java/net/aufdemrand/denizen/scripts/ScriptQueue.java +++ /dev/null @@ -1,337 +0,0 @@ -package net.aufdemrand.denizen.scripts; - -import net.aufdemrand.denizen.Settings; -import net.aufdemrand.denizen.utilities.DenizenAPI; -import net.aufdemrand.denizen.objects.Duration; -import net.aufdemrand.denizen.utilities.debugging.dB; -import org.bukkit.Bukkit; -import org.bukkit.event.Listener; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - - -public class ScriptQueue implements Listener { - - protected static int totalQueues = 0; - - /** - * Returns the number of queues created in the current instance - * as well as the number of currently active queues. - * - * @return stats - */ - public static String _getStats() { - return "Total number of queues created: '" - + totalQueues - + "', currently active queues: '" - + _queues.size() + "'."; - } - - - /** - * Gets a random UUID for use in creating a 'nameless' queue. - * - * @return String value of a random UUID - */ - public static String _getNextId() { - return UUID.randomUUID().toString(); - } - - // Contains all currently active queues, keyed by a String id. - public static Map _queues = new ConcurrentHashMap(8, 0.9f, 1); - - - /** - * Returns a collection of all active queues. - * - * @return a collection of ScriptQueues - */ - public static Collection _getQueues() { - return _queues.values(); - } - - - /** - *

Gets a ScriptQueue instance. If a queue already exists with the - * given id, it will return that instance as opposed to creating a - * new one. IDs are case insensitive. If having an easy-to-recall - * ID is not necessary, use the static method _getNextId() which - * will return a random UUID.

- * - *

New ScriptQueues will need further information before they - * can start(), including

- * @param id unique id of the queue - * @return - */ - public static ScriptQueue _getQueue(String id) { - // Get id if not specified. - if (id == null) id = String.valueOf(_getNextId()); - ScriptQueue scriptQueue; - // Does the queue already exist? - if (_queueExists(id)) - scriptQueue = _queues.get(id.toUpperCase()); - // If not, create a new one. - else { - scriptQueue = new ScriptQueue(id, - Duration.valueOf(Settings.ScriptQueueSpeed()).getTicksAsInt()); - } - // Return the queue - return scriptQueue; - } - - - public static ScriptQueue _getInstantQueue(String id) { - // Get id if not specified. - if (id == null) id = String.valueOf(_getNextId()); - ScriptQueue scriptQueue; - // Does the queue already exist? - if (_queueExists(id)) - scriptQueue = _queues.get(id.toUpperCase()); - // If not, create a new one. - else { - scriptQueue = new ScriptQueue(id, 0); - } - return scriptQueue; - } - - - public static boolean _queueExists(String id) { - return _queues.containsKey(id.toUpperCase()); - } - - - // Name of the queue -- this identifies the ScriptQueue when using _getQueue - // or a dScript Queue:xxx argument, whereas xxx = id - public String id; - - // Keep track of Bukit's Scheduler taskId for the engine, for when it times out. - protected int taskId; - - //The speed of the engine, the # of ticks between each revolution. - protected int ticks; - - // List of ScriptEntries in the queue - List scriptEntries = new ArrayList(); - - // If this number is larger than getCurrentTimeMillis, the queues will delay execution - protected long delayTime = 0; - - // The delay in ticks - protected long delayTicks = 0; - - // ScriptQueues can have a bit of context, keyed by a String Id. All that can be accessed by either getContext() - // or a dScript replaceable tag - private ConcurrentHashMap context = new ConcurrentHashMap(8, 0.9f, 1); - - public String getContext(String key) { - return context.get(key.toLowerCase()); - } - - public boolean hasContext(String key) { - return context.containsKey(key.toLowerCase()); - } - - public void addContext(String key, String value) { - context.put(key.toLowerCase(), value); - } - - public ConcurrentHashMap getAllContext() { - return context; - } - - protected ScriptEntry lastEntryExecuted = null; - - - public void setLastEntryExecuted(ScriptEntry entry) { - lastEntryExecuted = entry; - } - - public Duration getSpeed() { - return Duration.valueOf(ticks + "t"); - } - - public ScriptEntry getLastEntryExecuted() { - return lastEntryExecuted; - } - - - public void clear() { - scriptEntries.clear(); - } - - - protected boolean paused = false; - - - protected ScriptQueue(String id, int ticks) { - this.id = id.toUpperCase(); - _queues.put(id.toUpperCase(), this); - totalQueues++; - this.ticks = ticks; - } - - - public void setPaused(boolean paused) { - this.paused = paused; - } - - public boolean isPaused() { - return paused; - } - - - public void setSpeed(int ticks) { - this.ticks = ticks; - } - - - public void delayFor(long delayTicks) { - this.delayTicks = delayTicks; - } - - - public void delayUntil(long delayTime) { - this.delayTime = delayTime; - } - - boolean is_stopping = false; - - public void stop() { - if (!is_stopping) { - is_stopping = true; - List entries = lastEntryExecuted.getScript() - .getContainer().getEntries(lastEntryExecuted.getPlayer(), lastEntryExecuted.getNPC(), "on queue completes"); - if (!entries.isEmpty()) { - scriptEntries.addAll(entries); - dB.log("Finishing up queue " + id + "..."); - } - else { - _queues.remove(id); - dB.echoDebug("Completing queue " + id + "..."); - Bukkit.getServer().getScheduler().cancelTask(taskId); - } - } else { - _queues.remove(id); - dB.echoDebug("Completing queue " + id + "..."); - Bukkit.getServer().getScheduler().cancelTask(taskId); - } - } - - - private boolean isStarted = false; - - - public void start() { - // If already started, no need to restart. - if (isStarted) return; - - // Start the queue - dB.echoDebug("Starting queue " + id + ". (Speed=" + ticks + "tpr)"); - isStarted = true; - - // If not an instant queue, set a bukkit repeating task with the speed - if (ticks > 0) - taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(DenizenAPI.getCurrentInstance(), new Runnable() { - @Override - public void run() { - // Turn the engine - revolve(); - } - }, delayTicks, ticks); - // If the ticks are 0, this is an 'instant queue' - else - { - // If it's delayed, schedule it for later - if (delayTime > System.currentTimeMillis()) - { - Bukkit.getScheduler().scheduleSyncDelayedTask(DenizenAPI.getCurrentInstance(), - new Runnable() { - @Override - public void run() { - // revolve - while (isStarted) revolve(); - } - }, delayTicks + 1); - } - else while (isStarted) revolve(); - } - } - - - private void revolve() { - // If entries queued up are empty, deconstruct the queue. - if (scriptEntries.isEmpty()) - { - stop(); - isStarted = false; - return; - } - // Check if this Queue isn't paused - if (paused) return; - // If it's delayed, schedule it for later - if (delayTime > System.currentTimeMillis()) return; - - // Criteria met for a successful 'revolution' of this queue... - DenizenAPI.getCurrentInstance().getScriptEngine().revolve(this); - if (scriptEntries.isEmpty()) - { - stop(); - isStarted = false; - } - } - - - public ScriptEntry getNext() { - if (!scriptEntries.isEmpty()) { - ScriptEntry entry = scriptEntries.get(0); - scriptEntries.remove(0); - return entry; - } - else return null; - } - - - public ScriptQueue addEntries(List entries) { - scriptEntries.addAll(entries); - return this; - } - - protected boolean hasInjectedItems = false; - - public ScriptQueue injectEntries(List entries, int position) { - if (position > scriptEntries.size() || position < 0) position = 1; - if (scriptEntries.size() == 0) position = 0; - scriptEntries.addAll(position, entries); - hasInjectedItems = true; - return this; - } - - - public boolean removeEntry(int position) { - if (scriptEntries.size() < position) return false; - scriptEntries.remove(position); - return true; - } - - - public ScriptEntry getEntry(int position) { - if (scriptEntries.size() < position) return null; - return scriptEntries.get(position); - } - - - public ScriptQueue injectEntry(ScriptEntry entry, int position) { - if (position > scriptEntries.size() || position < 0) position = 1; - if (scriptEntries.size() == 0) position = 0; - scriptEntries.add(position, entry); - hasInjectedItems = true; - return this; - } - - - public int getQueueSize() { - return scriptEntries.size(); - } - -} diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/ForEachCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/ForEachCommand.java index f7310f04f2..85bd60fa16 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/ForEachCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/ForEachCommand.java @@ -4,7 +4,7 @@ import net.aufdemrand.denizen.exceptions.InvalidArgumentsException; import net.aufdemrand.denizen.objects.*; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.ScriptRegistry; import net.aufdemrand.denizen.scripts.commands.AbstractCommand; import net.aufdemrand.denizen.scripts.containers.core.TaskScriptContainer; diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/QueueCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/QueueCommand.java index a8cfd73efd..23d683800b 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/QueueCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/QueueCommand.java @@ -6,10 +6,11 @@ import net.aufdemrand.denizen.exceptions.CommandExecutionException; import net.aufdemrand.denizen.exceptions.InvalidArgumentsException; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.commands.AbstractCommand; import net.aufdemrand.denizen.objects.Duration; import net.aufdemrand.denizen.objects.aH; +import net.aufdemrand.denizen.scripts.queues.core.TimedQueue; import net.aufdemrand.denizen.utilities.debugging.dB; @@ -43,7 +44,7 @@ else if (aH.matchesValueArg("DELAY", arg, aH.ArgumentType.Duration)) { queues.clear(); for (String queueName : aH.getListFrom(arg)) { try { - queues.add(aH.getQueueFrom(queueName)); + queues.add(ScriptQueue._getExistingQueue(queueName)); } catch (Exception e) { // must be null, don't add } @@ -90,17 +91,20 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { case PAUSE: for (ScriptQueue queue : queues) - queue.setPaused(true); + if (queue instanceof TimedQueue) + ((TimedQueue) queue).setPaused(true); return; case RESUME: for (ScriptQueue queue : queues) - queue.setPaused(false); + if (queue instanceof TimedQueue) + ((TimedQueue) queue).setPaused(false); return; case DELAY: for (ScriptQueue queue : queues) - queue.delayFor(delay.getTicks()); + if (queue instanceof TimedQueue) + ((TimedQueue) queue).delayFor(delay); return; } diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RandomCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RandomCommand.java index 267d0694bb..a22ffc95bf 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RandomCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RandomCommand.java @@ -3,7 +3,7 @@ import net.aufdemrand.denizen.exceptions.CommandExecutionException; import net.aufdemrand.denizen.exceptions.InvalidArgumentsException; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.commands.AbstractCommand; import net.aufdemrand.denizen.utilities.Utilities; import net.aufdemrand.denizen.objects.aH; diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RunCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RunCommand.java index d73af5e2e8..5e82865b59 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RunCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RunCommand.java @@ -4,16 +4,12 @@ import net.aufdemrand.denizen.exceptions.InvalidArgumentsException; import net.aufdemrand.denizen.objects.*; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; -import net.aufdemrand.denizen.scripts.ScriptRegistry; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.commands.AbstractCommand; -import net.aufdemrand.denizen.scripts.containers.core.TaskScriptContainer; -import net.aufdemrand.denizen.utilities.debugging.dB; -import net.aufdemrand.denizen.utilities.debugging.dB.Messages; +import net.aufdemrand.denizen.scripts.queues.core.InstantQueue; +import net.aufdemrand.denizen.scripts.queues.core.TimedQueue; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * Runs a task script in a new ScriptQueue. @@ -126,12 +122,12 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { // Build the queue ScriptQueue queue; if (scriptEntry.hasObject("instant")) - queue = ScriptQueue._getInstantQueue(id).addEntries(entries); - else queue = ScriptQueue._getQueue(id).addEntries(entries); + queue = InstantQueue.getQueue(id).addEntries(entries); + else queue = TimedQueue.getQueue(id).addEntries(entries); // Set any delay if (scriptEntry.hasObject("delay")) - queue.delayFor(((Duration) scriptEntry.getObject("delay")).getTicks()); + queue.delayUntil(((Duration) scriptEntry.getObject("delay")).getTicks()); // Set any definitions if (scriptEntry.hasObject("definitions")) { diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RuntaskCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RuntaskCommand.java index 80c005bf90..ad600d7fae 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RuntaskCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/RuntaskCommand.java @@ -7,12 +7,14 @@ import net.aufdemrand.denizen.exceptions.InvalidArgumentsException; import net.aufdemrand.denizen.objects.dScript; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.ScriptRegistry; import net.aufdemrand.denizen.scripts.commands.AbstractCommand; import net.aufdemrand.denizen.scripts.containers.core.TaskScriptContainer; import net.aufdemrand.denizen.objects.Duration; import net.aufdemrand.denizen.objects.aH; +import net.aufdemrand.denizen.scripts.queues.core.InstantQueue; +import net.aufdemrand.denizen.scripts.queues.core.TimedQueue; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizen.utilities.debugging.dB.Messages; @@ -66,7 +68,7 @@ public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException Boolean instant = false; dScript script = null; Duration delay = null; - ScriptQueue queue = scriptEntry.getResidingQueue(); + String queue = scriptEntry.getResidingQueue().id; // Iterate through Arguments to extract needed information for (String arg : scriptEntry.getArguments()) { @@ -81,7 +83,7 @@ else if (aH.matchesValueArg("DELAY", arg, aH.ArgumentType.Duration)) { } // Use a specific queue else if (aH.matchesQueue(arg)) { - queue = aH.getQueueFrom(arg); + queue = aH.getStringFrom(arg); } // TODO: Remove this argument for version 1.0 else if (aH.matchesValueArg("SPEED", arg, aH.ArgumentType.Duration)) { @@ -92,12 +94,12 @@ else if (aH.matchesValueArg("SPEED", arg, aH.ArgumentType.Duration)) { } // Gets a new, randomly named queue else if (aH.matchesArg("QUEUE", arg)) { - queue = ScriptQueue._getQueue(ScriptQueue._getNextId()); + queue = ScriptQueue._getNextId(); instant = false; } // Run the script instantly. else if (aH.matchesArg("INSTANT, INSTANTLY", arg)) { - queue = ScriptQueue._getQueue(ScriptQueue._getNextId()); + queue = ScriptQueue._getNextId(); instant = true; } // Build context map if specified @@ -117,7 +119,7 @@ else if (ScriptRegistry.containsScript(aH.getStringFrom(arg))) { if (script == null) throw new InvalidArgumentsException("Must define a SCRIPT to be run."); // If not queue, and delayed, throw an exception... this cannot happen. - if (queue == scriptEntry.getResidingQueue() && delay != null) + if (queue == scriptEntry.getResidingQueue().id && delay != null) throw new InvalidArgumentsException("Cannot delay an INJECTED task script! Use 'QUEUE'."); // Put important objects inside the scriptEntry to be sent to execute() @@ -132,10 +134,19 @@ else if (ScriptRegistry.containsScript(aH.getStringFrom(arg))) { @Override public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { + Boolean instant = (Boolean) scriptEntry.getObject("instant"); + + ScriptQueue queue; + String id = (String) scriptEntry.getObject("queue"); + + if (ScriptQueue._queueExists(id)) + queue = ScriptQueue._getExistingQueue(id); + else if (instant) + queue = InstantQueue.getQueue(id); + else queue = TimedQueue.getQueue(id); + Map context = (HashMap) scriptEntry.getObject("context"); dScript script = (dScript) scriptEntry.getObject("script"); - ScriptQueue queue = (ScriptQueue) scriptEntry.getObject("queue"); - Boolean instant = (Boolean) scriptEntry.getObject("instant"); Duration delay = (Duration) scriptEntry.getObject("delay"); // Debug output @@ -143,8 +154,7 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { script.debug() + (delay != null ? delay.debug() : "") + aH.debugObj("Instant", instant.toString()) - + aH.debugObj("Queue", queue.id) - + (instant == false ? aH.debugObj("Speed", queue.getSpeed()) : "" ) + + aH.debugObj("Queue", id) + (context != null ? aH.debugObj("Context", context.toString()) : "") + (scriptEntry.getPlayer() != null ? aH.debugObj("Player", scriptEntry.getPlayer().getName()) : "") diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/WaitCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/WaitCommand.java index 11f9209f65..db7c0197c8 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/WaitCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/WaitCommand.java @@ -3,14 +3,15 @@ import net.aufdemrand.denizen.exceptions.CommandExecutionException; import net.aufdemrand.denizen.exceptions.InvalidArgumentsException; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.commands.AbstractCommand; import net.aufdemrand.denizen.objects.Duration; import net.aufdemrand.denizen.objects.aH; +import net.aufdemrand.denizen.scripts.queues.core.Delayable; +import net.aufdemrand.denizen.scripts.queues.core.TimedQueue; import net.aufdemrand.denizen.utilities.debugging.dB; /** - * Instructs the NPC to follow a player. * * @author aufdemrand * @@ -33,7 +34,7 @@ public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException // Specify queue if (aH.matchesQueue(arg)) - queue = aH.getQueueFrom(arg); + queue = ScriptQueue._getExistingQueue(arg); } scriptEntry.addObject("queue", queue); @@ -50,8 +51,12 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { // TODO: dBugger output // Tell the queue to delay - dB.echoDebug("Delaying " + delay); - queue.delayUntil(System.currentTimeMillis() + delay.getMillis()); + if (queue instanceof Delayable) { + ((Delayable) queue).delayFor(delay); + dB.echoDebug("Delaying " + delay.identify()); + } + + else dB.echoError("This type of queue is not able to be delayed!"); } } \ No newline at end of file diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/_templateCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/_templateCommand.java index ffc7675108..72969801b3 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/_templateCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/_templateCommand.java @@ -59,7 +59,7 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { // Fetch required objects // Element required_integer = (Element) scriptEntry.getObject("required_integer"); - // dLocation required_location = (dLocation) scriptEntry.getObject("required_lcoation"); + // dLocation required_location = (dLocation) scriptEntry.getObject("required_location"); // Debug the execution diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/TaskScriptContainer.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/TaskScriptContainer.java index bbec7481e4..31743cc9ba 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/TaskScriptContainer.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/TaskScriptContainer.java @@ -5,12 +5,13 @@ import net.aufdemrand.denizen.objects.dPlayer; import net.aufdemrand.denizen.scripts.ScriptBuilder; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.containers.ScriptContainer; import net.aufdemrand.denizen.objects.Duration; +import net.aufdemrand.denizen.scripts.queues.core.InstantQueue; +import net.aufdemrand.denizen.scripts.queues.core.TimedQueue; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; import java.util.Collections; import java.util.HashMap; @@ -47,12 +48,15 @@ public ScriptQueue runTaskScript(dPlayer player, dNPC npc, Map c } public ScriptQueue runTaskScript(String queueId, dPlayer player, dNPC npc, Map context) { - ScriptQueue queue = ScriptQueue._getQueue(queueId); + ScriptQueue queue; + if (getSpeed().getSeconds() == 0) + queue = InstantQueue.getQueue(queueId); + else queue = TimedQueue.getQueue(queueId).setSpeed(getSpeed().getTicks()); + List listOfEntries = getBaseEntries(player, npc); if (context != null) ScriptBuilder.addObjectToEntries(listOfEntries, "context", context); queue.addEntries(listOfEntries); - queue.setSpeed(getSpeed().getTicksAsInt()); queue.start(); return queue; } @@ -71,25 +75,26 @@ public Map getContextMap() { } public ScriptQueue runTaskScriptWithDelay(String queueId, dPlayer player, dNPC npc, Map context, Duration delay) { - ScriptQueue queue = ScriptQueue._getQueue(queueId); + ScriptQueue queue; + if (getSpeed().getSeconds() == 0) + queue = InstantQueue.getQueue(queueId); + else queue = TimedQueue.getQueue(queueId).setSpeed(getSpeed().getTicks()); + List listOfEntries = getBaseEntries(player, npc); if (context != null) ScriptBuilder.addObjectToEntries(listOfEntries, "context", context); queue.addEntries(listOfEntries); - queue.setSpeed(getSpeed().getTicksAsInt()); - queue.delayFor(delay.getTicks()); queue.delayUntil(System.currentTimeMillis() + (long) (delay.getSeconds() * 1000)); queue.start(); return queue; } public ScriptQueue injectTaskScript(String queueId, dPlayer player, dNPC npc, Map context) { - ScriptQueue queue = ScriptQueue._getQueue(queueId); + ScriptQueue queue = ScriptQueue._getExistingQueue(queueId); List listOfEntries = getBaseEntries(player, npc); if (context != null) ScriptBuilder.addObjectToEntries(listOfEntries, "context", context); queue.injectEntries(listOfEntries, 0); - queue.setSpeed(getSpeed().getTicksAsInt()); queue.start(); return queue; } diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java index c01c377b76..cf189708aa 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java @@ -4,8 +4,9 @@ import net.aufdemrand.denizen.objects.*; import net.aufdemrand.denizen.scripts.ScriptBuilder; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.commands.core.DetermineCommand; +import net.aufdemrand.denizen.scripts.queues.core.InstantQueue; import net.aufdemrand.denizen.tags.TagManager; import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.debugging.dB; @@ -124,7 +125,7 @@ public static String doEvents(List eventNames, dNPC npc, Player player, // Add the reqId to each of the entries ScriptBuilder.addObjectToEntries(entries, "ReqId", id); - ScriptQueue._getInstantQueue(ScriptQueue._getNextId()).addEntries(entries).start(); + InstantQueue.getQueue(null).addEntries(entries).start(); if (DetermineCommand.hasOutcome(id)) determination = DetermineCommand.getOutcome(id); diff --git a/src/main/java/net/aufdemrand/denizen/scripts/queues/ScriptQueue.java b/src/main/java/net/aufdemrand/denizen/scripts/queues/ScriptQueue.java new file mode 100644 index 0000000000..19da294c8f --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/scripts/queues/ScriptQueue.java @@ -0,0 +1,444 @@ +package net.aufdemrand.denizen.scripts.queues; + +import net.aufdemrand.denizen.objects.Duration; +import net.aufdemrand.denizen.objects.dObject; +import net.aufdemrand.denizen.scripts.ScriptEntry; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizen.utilities.debugging.dB; +import org.bukkit.Bukkit; + +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * ScriptQueues hold/control ScriptEntries while being sent + * to the CommandExecuter + * + * @version 1.0 + * @author Jeremy Schroeder, David Cernat + */ + +public abstract class ScriptQueue { + + + protected static long total_queues = 0; + + + /** + * Returns the number of queues created in the current instance + * as well as the number of currently active queues. + * + * @return stats + */ + public static String _getStats() { + return "Total number of queues created: " + + total_queues + + ", currently active queues: " + + _queues.size() + "."; + } + + + /** + * Gets an existing queue. Cast to the correct QueueType to + * access further methods. + * + * @param id the id of the queue + * @return a ScriptQueue instance, or null + */ + public static ScriptQueue _getExistingQueue(String id) { + if (!_queueExists(id)) return null; + else return _queues.get(id.toUpperCase()); + } + + /** + * Gets a random UUID for use in creating a 'nameless' queue. + * + * @return String value of a random UUID + */ + public static String _getNextId() { + return UUID.randomUUID().toString(); + } + + + /** + * Checks the type of an existing queue with the type given. + * + * @param queue id of the queue + * @param type class of the queue type + * @return true if they match, false if the queue + * doesn't exist or does not match + */ + public static boolean _matchesType(String queue, Class type) { + if (_queueExists(queue.toUpperCase())) + return _queues.get(queue.toUpperCase()).getClass() == type; + else return false; + } + + + // Contains all currently active queues, keyed by a String id. + protected static Map _queues = + new ConcurrentHashMap(8, 0.9f, 1); + + + /** + * Returns a collection of all active queues. + * + * @return a collection of ScriptQueues + */ + public static Collection _getQueues() { + return _queues.values(); + } + + + /** + * Checks if a queue exists with the given id. + * + * @param id the String ID of the queue to check. + * @return true if it exists. + */ + public static boolean _queueExists(String id) { + return _queues.containsKey(id.toUpperCase()); + } + + + + ///////////////////// + // Public instance fields + ///////////////////// + + + // Name of the queue -- this identifies + // the ScriptQueue when using _getQueue() + public String id; + + + + ///////////////////// + // Private instance fields and constructors + ///////////////////// + + + // List of ScriptEntries in the queue + private List + script_entries = new ArrayList(); + + + // The last script entry that was executed + // in this queue. + private ScriptEntry lastEntryExecuted = null; + + + // If this number is larger than Java's + // getCurrentTimeMillis(), the queue will + // delay execution of the next ScriptEntry + private long delay_time = 0; + + + // ScriptQueues can have a bit of context, + // keyed by a String Id. Denizen's + // 'Definitions' system uses this context. + private Map + context = new ConcurrentHashMap(8, 0.9f, 1); + + + /** + * Creates a ScriptQueue instance. Users of + * the API should instead use the static members + * of classes that extend ScriptQueue. + * + * @param id the name of the ScriptQueue + */ + protected ScriptQueue(String id) { + // Remember the 'id' + this.id = id.toUpperCase(); + // Save the instance to the _queues static map + _queues.put(id.toUpperCase(), this); + // Increment the stats + total_queues++; + } + + + + ///////////////////// + // Public instance setters and getters + ///////////////////// + + + /** + * Gets a piece of context from the queue. Denizen's + * CommandExecuter will fetch this information + * by using the %definition_name% format, similar + * to 'replaceable tags' + * + * @param definition The name of the context + * @return The value of the context, or null + */ + public String getContext(String definition) { + return context.get(definition.toLowerCase()); + } + + + /** + * Checks for a piece of context. + * + * @param definition The name of the context + * @return true if the definition exists. + */ + public boolean hasContext(String definition) { + return context.containsKey(definition.toLowerCase()); + } + + + /** + * Adds a new piece of context to the queue. This + * can be done with dScript as well by using the + * 'define' command. + * + * @param definition the name of the context + * @param value the value of the definition + */ + public void addContext(String definition, String value) { + context.put(definition.toLowerCase(), value); + } + + + /** + * Returns a Map of all the current context + * stored in the queue, keyed by 'definition id' + * + * @return all current context, empty if none. + */ + public Map getAllContext() { + return context; + } + + + /** + * The last entry that was executed. Note: any + * replaceable tags/etc. are already replaced + * in this ScriptEntry. + * + * @return + */ + public ScriptEntry getLastEntryExecuted() { + return lastEntryExecuted; + } + + + /** + * Clears the script queue. + * + * Use the 'queue clear' command in dScript to + * access this method. + */ + public void clear() { + script_entries.clear(); + } + + + /** + * Will delay the start of the queue until Java's + * System.currentTimeMillis() is less than the + * delayTime. + * + * @param delayTime the time to start the queue, in + * System.currentTimeMilis() format. + */ + public void delayUntil(long delayTime) { + delay_time = delayTime; + } + + + + /////////////////// + // Public 'functional' methods + ////////////////// + + + /** + * Starts the script queue. + * + */ + protected abstract void onStart(); + + + protected boolean is_started; + + + public void start() { + if (is_started) return; + + // Set as started, and check for a valid delay_time. + is_started = true; + boolean is_delayed = false; + if (delay_time > System.currentTimeMillis()) + is_delayed = true; + + dB.echoDebug("Starting queue '" + id + "'"); + // If it's delayed, schedule it for later + + if (is_delayed) { + Bukkit.getScheduler().scheduleSyncDelayedTask(DenizenAPI.getCurrentInstance(), + new Runnable() { + @Override + public void run() { onStart(); /* Start the engine */ } + + // Take the delay time, find out how many milliseconds away + // it is, turn it into seconds, then divide by 20 for ticks. + }, (delay_time - System.currentTimeMillis()) / 1000 / 20); + } + else + // If it's not, start the engine now! + onStart(); + + if (is_delayed) { + dB.echoDebug("...but delaying execution for '" + + new Duration((delay_time - System.currentTimeMillis()) / 1000 / 20).identify() + "'."); + } + + } + + + /** + * Stops the script_queue and breaks it down. + * + */ + protected abstract void onStop(); + + + protected boolean is_stopping = false; + + + public void stop() { + + // If this is the first time this has been called, check the + // ScriptContainer event 'on queue completes' which may have + // a few more script entries to run. + + if (!is_stopping) { + is_stopping = true; + + // Get the entries + List entries = + lastEntryExecuted.getScript().getContainer() + .getEntries(lastEntryExecuted.getPlayer(), + lastEntryExecuted.getNPC(), "on queue completes"); + // Add the 'finishing' entries back into the queue (if not empty) + if (!entries.isEmpty()) { + script_entries.addAll(entries); + dB.log("Finishing up queue " + id + "..."); + } else /* if empty, just stop the queue like normal */ { + _queues.remove(id); + dB.echoDebug("Completing queue " + id + "..."); + is_started = false; + onStop(); + } + } + + // Else, just complete the queue. + // 1) Remove the id from active queue list + // 2) Cancel the corresponding task_id + else { + _queues.remove(id); + dB.echoDebug("Completing queue " + id + "..."); + is_started = false; + onStop(); + } + } + + + + //////////////////// + // Internal methods and fields + //////////////////// + + + /** + * Sets the last entry executed by the ScriptEngine. + * + * @param entry the ScriptEntry last executed. + */ + public void setLastEntryExecuted(ScriptEntry entry) { + lastEntryExecuted = entry; + } + + + protected abstract boolean shouldRevolve(); + + + protected void revolve() { + // If entries queued up are empty, deconstruct the queue. + if (script_entries.isEmpty()) { + stop(); + return; + } + + if (!shouldRevolve()) return; + + // Criteria met for a successful 'revolution' of this queue, + // so send the next script entry to the ScriptEngine. + DenizenAPI.getCurrentInstance().getScriptEngine().revolve(this); + + if (script_entries.isEmpty()) { + stop(); + } + } + + + public ScriptEntry getNext() { + if (!script_entries.isEmpty()) { + ScriptEntry entry = script_entries.get(0); + script_entries.remove(0); + return entry; + } + else return null; + } + + + public ScriptQueue addEntries(List entries) { + script_entries.addAll(entries); + return this; + } + + + public boolean hasInjectedItems = false; + + + public ScriptQueue injectEntries(List entries, int position) { + if (position > script_entries.size() || position < 0) position = 1; + if (script_entries.size() == 0) position = 0; + script_entries.addAll(position, entries); + hasInjectedItems = true; + return this; + } + + + public boolean removeEntry(int position) { + if (script_entries.size() < position) return false; + script_entries.remove(position); + return true; + } + + + public ScriptEntry getEntry(int position) { + if (script_entries.size() < position) return null; + return script_entries.get(position); + } + + + public ScriptQueue injectEntry(ScriptEntry entry, int position) { + if (position > script_entries.size() || position < 0) position = 1; + if (script_entries.size() == 0) position = 0; + script_entries.add(position, entry); + hasInjectedItems = true; + return this; + } + + + public int getQueueSize() { + return script_entries.size(); + } + + +} diff --git a/src/main/java/net/aufdemrand/denizen/scripts/queues/core/Delayable.java b/src/main/java/net/aufdemrand/denizen/scripts/queues/core/Delayable.java new file mode 100644 index 0000000000..23e9af8a14 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/scripts/queues/core/Delayable.java @@ -0,0 +1,14 @@ +package net.aufdemrand.denizen.scripts.queues.core; + +import net.aufdemrand.denizen.objects.Duration; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; + +public interface Delayable { + + public ScriptQueue setPaused(boolean paused); + + public boolean isPaused(); + + public void delayFor(Duration duration); + +} diff --git a/src/main/java/net/aufdemrand/denizen/scripts/queues/core/InstantQueue.java b/src/main/java/net/aufdemrand/denizen/scripts/queues/core/InstantQueue.java new file mode 100644 index 0000000000..0065c873e0 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/scripts/queues/core/InstantQueue.java @@ -0,0 +1,72 @@ +package net.aufdemrand.denizen.scripts.queues.core; + + +import net.aufdemrand.denizen.Settings; +import net.aufdemrand.denizen.objects.Duration; +import net.aufdemrand.denizen.scripts.ScriptEntry; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizen.utilities.debugging.dB; +import org.bukkit.Bukkit; + +import java.util.List; + +public class InstantQueue extends ScriptQueue { + + /** + * Gets an InstantQueue instance. + * + * If a queue already exists with the given id, it will return that instance, + * which may be currently running, unless the type of Queue is not an InstantQueue. + * If a queue does not exist, a new stopped queue is created instead. + * + * IDs are case insensitive. If having an easy-to-recall ID is not necessary, just + * pass along null as the id, and it will use ScriptQueue's static method _getNextId() + * which will return a random UUID. + * + * The default speed node will be automatically read from the configuration, + * and new ScriptQueues may need further information before they + * can start(), including entries, delays, loops, and possibly context. + * + * @param id unique id of the queue + * @return a ScriptQueue + */ + public static InstantQueue getQueue(String id) { + // Get id if not specified. + if (id == null) id = String.valueOf(_getNextId()); + InstantQueue scriptQueue; + // Does the queue already exist? + if (_queueExists(id)) + scriptQueue = (InstantQueue) _queues.get(id.toUpperCase()); + // If not, create a new one. + else { + scriptQueue = new InstantQueue(id); + } + return scriptQueue; + } + + + ///////////////////// + // Private instance fields and constructors + ///////////////////// + + public InstantQueue(String id) { + super(id); + } + + @Override + public void onStart() { + while (is_started) revolve(); + } + + public void onStop() { + // Nothing to do here! + } + + @Override + protected boolean shouldRevolve() { + // Instant queues aren't picky! + return true; + } + +} diff --git a/src/main/java/net/aufdemrand/denizen/scripts/queues/core/TimedQueue.java b/src/main/java/net/aufdemrand/denizen/scripts/queues/core/TimedQueue.java new file mode 100644 index 0000000000..aeaaf7e93b --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/scripts/queues/core/TimedQueue.java @@ -0,0 +1,154 @@ +package net.aufdemrand.denizen.scripts.queues.core; + +import net.aufdemrand.denizen.Settings; +import net.aufdemrand.denizen.objects.Duration; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import org.bukkit.Bukkit; + +public class TimedQueue extends ScriptQueue implements Delayable { + + /** + * Gets a TimedQueue instance. + * + * If a queue already exists with the given id, it will return that instance, + * which may be currently running, unless the type of queue is not a TimedQueue. + * If a queue does not exist, a new stopped queue is created instead. + * + * IDs are case insensitive. If having an easy-to-recall ID is not necessary, just + * pass along null as the id, and it will use ScriptQueue's static method _getNextId() + * which will return a random UUID. + * + * The speed node will be automatically read from the configuration, + * and new ScriptQueues may need further information before they + * can start(), including entries, delays, loops, and possibly context. + * + * @param id unique id of the queue + * @return a TimedQueue + */ + public static TimedQueue getQueue(String id) { + // Get id if not specified. + if (id == null) id = String.valueOf(_getNextId()); + TimedQueue scriptQueue; + // Does the queue already exist? Get it if it does. + if (_queueExists(id)) + scriptQueue = (TimedQueue) ScriptQueue._queues.get(id.toUpperCase()); + // If not, create a new one. + else { + scriptQueue = new TimedQueue(id, + Duration.valueOf(Settings.ScriptQueueSpeed())); + } + // Return the queue + return scriptQueue; + } + + + ///////////////////// + // Private instance fields and constructors + ///////////////////// + + // Keep track of Bukkit's Scheduler taskId + // for the engine, used when it times out. + private int task_id; + + // The speed of the engine, the # of ticks + // between each revolution. Use setSpeed() + // to change this. + private long ticks; + + // ScriptQueues can be paused mid-rotation. + // The next entry will be held up until + // un-paused. + protected boolean paused = false; + + // The delay in ticks can put off the + // start of a queue + protected long delay_ticks = 0; + + @Override + public void delayFor(Duration duration) { + delay_ticks = System.currentTimeMillis() + duration.getMillis(); + } + + + public TimedQueue(String id, Duration timing) { + super(id); + } + + + + ///////////////////// + // Public instance setters and getters + ///////////////////// + + /** + * Gets the speed of the queue. This is the + * time in between each revolution. ' + * + * @return a Duration of the speed. + */ + public Duration getSpeed() { + return new Duration(ticks); + } + + /** + * Pauses the queue. Paused queues will check + * to be re-resumed every 'rotation', defined + * by the speed of the queue. + * + * @param paused + */ + @Override + public TimedQueue setPaused(boolean paused) { + this.paused = paused; + return this; + } + + /** + * Checks if the queue is currently paused. + * + * @return true if paused. + */ + @Override + public boolean isPaused() { + return paused; + } + + /** + * Sets the speed of a queue. Uses bukkit's 'ticks', which is + * 20 ticks per second. + * + * @param ticks the number of ticks between each rotation. + */ + public TimedQueue setSpeed(long ticks) { + this.ticks = ticks; + return this; + } + + @Override + protected void onStart() { + task_id = Bukkit.getScheduler().scheduleSyncRepeatingTask(DenizenAPI.getCurrentInstance(), + new Runnable() { + @Override public void run() { revolve(); } + }, 0, ticks == 0 ? 1 : ticks); + } + + @Override + protected void onStop() { + Bukkit.getScheduler().cancelTask(task_id); + } + + @Override + protected boolean shouldRevolve() { + // Check if this Queue isn't paused + if (paused) return false; + + // If it's delayed, schedule it for later + if (delay_ticks > System.currentTimeMillis()) return false; + + return true; + } + + + +} diff --git a/src/main/java/net/aufdemrand/denizen/scripts/requirements/RequirementsMode.java b/src/main/java/net/aufdemrand/denizen/scripts/requirements/RequirementsMode.java index 2fa0b1a1c6..5847d84ff8 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/requirements/RequirementsMode.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/requirements/RequirementsMode.java @@ -3,13 +3,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -/** - * Created with IntelliJ IDEA. - * User: Press - * Date: 1/16/13 - * Time: 6:48 PM - * To change this template use File | Settings | File Templates. - */ public class RequirementsMode { diff --git a/src/main/java/net/aufdemrand/denizen/scripts/triggers/AbstractTrigger.java b/src/main/java/net/aufdemrand/denizen/scripts/triggers/AbstractTrigger.java index c77e2ad820..177367fdb5 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/triggers/AbstractTrigger.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/triggers/AbstractTrigger.java @@ -1,21 +1,19 @@ package net.aufdemrand.denizen.scripts.triggers; -import net.aufdemrand.denizen.Denizen; import net.aufdemrand.denizen.interfaces.RegistrationableInstance; import net.aufdemrand.denizen.objects.dNPC; import net.aufdemrand.denizen.npc.traits.TriggerTrait; import net.aufdemrand.denizen.objects.dPlayer; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.containers.core.InteractScriptContainer; +import net.aufdemrand.denizen.scripts.queues.core.TimedQueue; import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizen.utilities.debugging.dB.DebugElement; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; -import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.entity.Player; import java.util.HashSet; import java.util.Iterator; @@ -95,7 +93,7 @@ public boolean parse(dNPC npc, dPlayer player, InteractScriptContainer script, S if (entries.isEmpty()) return false; dB.echoDebug(DebugElement.Header, "Parsing " + name + " trigger: " + npc.getName() + "/" + player.getName()); - ScriptQueue._getQueue(ScriptQueue._getNextId()).addEntries(entries).start(); + TimedQueue.getQueue(ScriptQueue._getNextId()).addEntries(entries).start(); return true; } diff --git a/src/main/java/net/aufdemrand/denizen/tags/core/ProcedureScriptTag.java b/src/main/java/net/aufdemrand/denizen/tags/core/ProcedureScriptTag.java index 9b2b0fcd12..31daed8079 100644 --- a/src/main/java/net/aufdemrand/denizen/tags/core/ProcedureScriptTag.java +++ b/src/main/java/net/aufdemrand/denizen/tags/core/ProcedureScriptTag.java @@ -5,8 +5,9 @@ import net.aufdemrand.denizen.objects.dScript; import net.aufdemrand.denizen.scripts.ScriptBuilder; import net.aufdemrand.denizen.scripts.ScriptEntry; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.scripts.commands.core.DetermineCommand; +import net.aufdemrand.denizen.scripts.queues.core.InstantQueue; import net.aufdemrand.denizen.utilities.debugging.dB; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -44,7 +45,7 @@ public void procedureTag(ReplaceableTagEvent event) { // Add the reqId to each of the entries for referencing ScriptBuilder.addObjectToEntries(entries, "ReqId", id); - ScriptQueue._getInstantQueue(ScriptQueue._getNextId()).addEntries(entries).start(); + InstantQueue.getQueue(ScriptQueue._getNextId()).addEntries(entries).start(); if (DetermineCommand.hasOutcome(id)) { event.setReplaced(DetermineCommand.getOutcome(id)); diff --git a/src/main/java/net/aufdemrand/denizen/tags/core/UtilTags.java b/src/main/java/net/aufdemrand/denizen/tags/core/UtilTags.java index 03b86bf8cc..790d458158 100644 --- a/src/main/java/net/aufdemrand/denizen/tags/core/UtilTags.java +++ b/src/main/java/net/aufdemrand/denizen/tags/core/UtilTags.java @@ -10,7 +10,7 @@ import net.aufdemrand.denizen.events.ReplaceableTagEvent; import net.aufdemrand.denizen.flags.FlagManager; import net.aufdemrand.denizen.objects.*; -import net.aufdemrand.denizen.scripts.ScriptQueue; +import net.aufdemrand.denizen.scripts.queues.ScriptQueue; import net.aufdemrand.denizen.tags.Attribute; import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.Utilities; @@ -58,10 +58,6 @@ public void queueTags(ReplaceableTagEvent event) { event.setReplaced(new Element(event.getScriptEntry().getResidingQueue().getQueueSize()) .getAttribute(attribute.fulfill(1))); - if (attribute.startsWith("speed")) - event.setReplaced(event.getScriptEntry().getResidingQueue().getSpeed() - .getAttribute(attribute.fulfill(1))); - if (attribute.startsWith("definitions")) event.setReplaced(new Element(event.getScriptEntry().getResidingQueue().getAllContext().toString()) .getAttribute(attribute.fulfill(1)));