Search in sources :

Example 6 with ScriptQueue

use of com.denizenscript.denizencore.scripts.queues.ScriptQueue in project Denizen-For-Bukkit by DenizenScript.

the class CommandScriptContainer method runAllowedHelpProcedure.

public boolean runAllowedHelpProcedure(PlayerTag player, NPCTag npc, Map<String, ObjectTag> context) {
    List<ScriptEntry> entries = getEntries(new BukkitScriptEntryData(player, npc), "allowed help");
    ScriptQueue queue = new InstantQueue(getName());
    queue.addEntries(entries);
    if (context != null) {
        ContextSource.SimpleMap src = new ContextSource.SimpleMap();
        src.contexts = context;
        queue.setContextSource(src);
    }
    queue.start();
    return queue.determinations != null && queue.determinations.size() > 0 && queue.determinations.get(0).equalsIgnoreCase("true");
}
Also used : BukkitScriptEntryData(com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData) ContextSource(com.denizenscript.denizencore.scripts.queues.ContextSource) ScriptEntry(com.denizenscript.denizencore.scripts.ScriptEntry) InstantQueue(com.denizenscript.denizencore.scripts.queues.core.InstantQueue) ScriptQueue(com.denizenscript.denizencore.scripts.queues.ScriptQueue)

Example 7 with ScriptQueue

use of com.denizenscript.denizencore.scripts.queues.ScriptQueue in project Denizen-For-Bukkit by DenizenScript.

the class CommandScriptContainer method runTabCompleteProcedure.

public List<String> runTabCompleteProcedure(PlayerTag player, NPCTag npc, Map<String, ObjectTag> context, String[] originalArguments) {
    BukkitTagContext tagContext = new BukkitTagContext(player, npc, new ScriptTag(this));
    ContextSource contextSrc = null;
    if (context != null) {
        ContextSource.SimpleMap src = new ContextSource.SimpleMap();
        src.contexts = context;
        tagContext.contextSource = src;
        contextSrc = src;
    }
    List<String> list = new ArrayList<>();
    if (tabCompletionTaggables != null) {
        int argCount = Math.max(originalArguments.length, 1);
        String taggable = tabCompletionTaggables.get(argCount);
        if (taggable == null) {
            taggable = tabCompletionTaggables.get(-1);
        }
        if (taggable != null) {
            String argLow = originalArguments.length == 0 ? "" : CoreUtilities.toLowerCase(originalArguments[originalArguments.length - 1]);
            for (String value : ListTag.getListFor(TagManager.tagObject(taggable, tagContext), tagContext)) {
                if (CoreUtilities.toLowerCase(value).startsWith(argLow)) {
                    list.add(value);
                }
            }
        }
    }
    if (hasProcStyleTabComplete) {
        List<ScriptEntry> entries = getEntries(new BukkitScriptEntryData(player, npc), "tab complete");
        ScriptQueue queue = new InstantQueue(getName());
        queue.addEntries(entries);
        if (contextSrc != null) {
            queue.setContextSource(contextSrc);
        }
        queue.start();
        if (queue.determinations != null && queue.determinations.size() > 0) {
            list.addAll(ListTag.getListFor(queue.determinations.getObject(0), tagContext));
        }
    }
    return list;
}
Also used : ArrayList(java.util.ArrayList) ScriptEntry(com.denizenscript.denizencore.scripts.ScriptEntry) BukkitTagContext(com.denizenscript.denizen.tags.BukkitTagContext) BukkitScriptEntryData(com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData) ScriptTag(com.denizenscript.denizencore.objects.core.ScriptTag) ContextSource(com.denizenscript.denizencore.scripts.queues.ContextSource) InstantQueue(com.denizenscript.denizencore.scripts.queues.core.InstantQueue) ScriptQueue(com.denizenscript.denizencore.scripts.queues.ScriptQueue)

Example 8 with ScriptQueue

use of com.denizenscript.denizencore.scripts.queues.ScriptQueue in project Denizen-For-Bukkit by DenizenScript.

the class Debug method echoError.

public static void echoError(ScriptEntry source, String addedContext, String message, boolean reformat) {
    message = cleanTextForDebugOutput(message);
    if (errorDuplicatePrevention) {
        if (!com.denizenscript.denizencore.utilities.debugging.Debug.verbose) {
            finalOutputDebugText("Error within error (??!!!! SOMETHING WENT SUPER WRONG!): " + message, source, reformat);
        }
        return;
    }
    errorDuplicatePrevention = true;
    ScriptQueue sourceQueue = CommandExecutor.currentQueue;
    if (source != null && source.queue != null) {
        sourceQueue = source.queue;
    }
    ScriptTag sourceScript = null;
    if (source != null) {
        sourceScript = source.getScript();
    }
    if (throwErrorEvent) {
        throwErrorEvent = false;
        boolean cancel = ScriptGeneratesErrorScriptEvent.instance.handle(message, sourceQueue, sourceScript, source == null ? -1 : source.internal.lineNumber);
        throwErrorEvent = true;
        if (cancel) {
            errorDuplicatePrevention = false;
            return;
        }
    }
    if (!showDebug) {
        errorDuplicatePrevention = false;
        return;
    }
    StringBuilder headerBuilder = new StringBuilder();
    headerBuilder.append(ERROR_HEADER_START);
    if (sourceScript != null) {
        headerBuilder.append(" in script '").append(ChatColor.AQUA).append(sourceScript.getName()).append(ChatColor.RED).append("'");
    }
    if (sourceQueue != null) {
        headerBuilder.append(" in queue '").append(sourceQueue.debugId).append(ChatColor.RED).append("'");
    }
    if (source != null) {
        headerBuilder.append(" while executing command '").append(ChatColor.AQUA).append(source.getCommandName()).append(ChatColor.RED).append("'");
        if (sourceScript != null) {
            headerBuilder.append(" in file '").append(ChatColor.AQUA).append(sourceScript.getContainer().getRelativeFileName()).append(ChatColor.RED).append("' on line '").append(ChatColor.AQUA).append(source.internal.lineNumber).append(ChatColor.RED).append("'");
        }
        BukkitScriptEntryData data = Utilities.getEntryData(source);
        if (data.hasPlayer()) {
            headerBuilder.append(" with player '").append(ChatColor.AQUA).append(data.getPlayer().getName()).append(ChatColor.RED).append("'");
        }
        if (data.hasNPC()) {
            headerBuilder.append(" with NPC '").append(ChatColor.AQUA).append(data.getNPC().debuggable()).append(ChatColor.RED).append("'");
        }
    }
    if (addedContext != null) {
        headerBuilder.append("\n<FORCE_ALIGN>").append(addedContext);
    }
    headerBuilder.append(ERROR_HEADER_END);
    String header = headerBuilder.toString();
    boolean showDebugSuffix = sourceScript != null && !sourceScript.getContainer().shouldDebug();
    String headerRef = header;
    if (header.equals(lastErrorHeader)) {
        header = ADDITIONAL_ERROR_HEADER;
        showDebugSuffix = false;
    }
    finalOutputDebugText(header + message + (showDebugSuffix ? ENABLE_DEBUG_MESSAGE : ""), sourceQueue, reformat);
    errorDuplicatePrevention = false;
    if (com.denizenscript.denizencore.utilities.debugging.Debug.verbose && depthCorrectError == 0) {
        depthCorrectError++;
        try {
            throw new RuntimeException("Verbose info for above error");
        } catch (Throwable e) {
            echoError(source, e);
        }
        depthCorrectError--;
    }
    lastErrorHeader = headerRef;
}
Also used : BukkitScriptEntryData(com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData) ScriptTag(com.denizenscript.denizencore.objects.core.ScriptTag) ScriptQueue(com.denizenscript.denizencore.scripts.queues.ScriptQueue)

Example 9 with ScriptQueue

use of com.denizenscript.denizencore.scripts.queues.ScriptQueue in project Denizen-For-Bukkit by DenizenScript.

the class CommandScriptContainer method runCommandScript.

public ScriptQueue runCommandScript(PlayerTag player, NPCTag npc, Map<String, ObjectTag> context) {
    ScriptQueue queue = new InstantQueue(getName());
    queue.addEntries(getBaseEntries(new BukkitScriptEntryData(player, npc)));
    if (context != null) {
        ContextSource.SimpleMap src = new ContextSource.SimpleMap();
        src.contexts = context;
        queue.setContextSource(src);
    }
    queue.start();
    return queue;
}
Also used : BukkitScriptEntryData(com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData) ContextSource(com.denizenscript.denizencore.scripts.queues.ContextSource) InstantQueue(com.denizenscript.denizencore.scripts.queues.core.InstantQueue) ScriptQueue(com.denizenscript.denizencore.scripts.queues.ScriptQueue)

Example 10 with ScriptQueue

use of com.denizenscript.denizencore.scripts.queues.ScriptQueue in project Denizen-For-Bukkit by DenizenScript.

the class ShootCommand method execute.

@Override
public void execute(final ScriptEntry scriptEntry) {
    EntityTag originEntity = scriptEntry.getObjectTag("origin_entity");
    LocationTag originLocation = scriptEntry.hasObject("origin_location") ? (LocationTag) scriptEntry.getObject("origin_location") : new LocationTag(originEntity.getEyeLocation().add(originEntity.getEyeLocation().getDirection()));
    boolean no_rotate = scriptEntry.hasObject("no_rotate") && scriptEntry.getElement("no_rotate").asBoolean();
    // If there is no destination set, but there is a shooter, get a point
    // in front of the shooter and set it as the destination
    final LocationTag destination = scriptEntry.hasObject("destination") ? (LocationTag) scriptEntry.getObject("destination") : (originEntity != null ? new LocationTag(originEntity.getEyeLocation().clone().add(originEntity.getEyeLocation().clone().getDirection().multiply(30))) : (originLocation != null ? new LocationTag(originLocation.clone().add(originLocation.getDirection().multiply(30))) : null));
    // TODO: Same as PUSH -- is this the place to do this?
    if (destination == null) {
        Debug.echoError("No destination specified!");
        return;
    }
    final List<EntityTag> entities = (List<EntityTag>) scriptEntry.getObject("entities");
    final ScriptTag script = scriptEntry.getObjectTag("script");
    final ElementTag subPath = scriptEntry.getElement("path");
    final ListTag definitions = scriptEntry.getObjectTag("definitions");
    EntityTag shooter = scriptEntry.getObjectTag("shooter");
    ElementTag height = scriptEntry.getElement("height");
    ElementTag gravity = scriptEntry.getElement("gravity");
    ElementTag speed = scriptEntry.getElement("speed");
    ElementTag spread = scriptEntry.getElement("spread");
    LocationTag lead = scriptEntry.getObjectTag("lead");
    if (scriptEntry.dbCallShouldDebug()) {
        Debug.report(scriptEntry, getName(), originEntity, originLocation, db("entities", entities), destination, height, gravity, speed, script, subPath, shooter, spread, lead, (no_rotate ? db("no_rotate", "true") : ""), definitions);
    }
    final ListTag entityList = new ListTag();
    if (!no_rotate) {
        originLocation = new LocationTag(NMSHandler.getEntityHelper().faceLocation(originLocation, destination));
    }
    for (EntityTag entity : entities) {
        if (!entity.isSpawned() || !no_rotate) {
            entity.spawnAt(originLocation);
        }
        entityList.addObject(entity);
        if (entity.isProjectile()) {
            if (shooter != null || originEntity != null) {
                entity.setShooter(shooter != null ? shooter : originEntity);
            }
            if (script != null || scriptEntry.shouldWaitFor()) {
                arrows.put(entity.getUUID(), null);
            }
        }
    }
    scriptEntry.addObject("shot_entities", entityList);
    if (entityList.size() == 1) {
        scriptEntry.addObject("shot_entity", entityList.getObject(0));
    }
    if (spread == null) {
        Position.mount(Conversion.convertEntities(entities));
    }
    final EntityTag lastEntity = entities.get(entities.size() - 1);
    if (speed == null) {
        if (gravity == null) {
            gravity = new ElementTag(lastEntity.getEntityType().getGravity());
        }
        Vector v1 = lastEntity.getLocation().toVector();
        Vector v2 = destination.toVector();
        Vector v3 = Velocity.calculate(v1, v2, gravity.asDouble(), height.asDouble());
        lastEntity.setVelocity(v3);
    } else if (lead == null) {
        Vector relative = destination.clone().subtract(originLocation).toVector();
        lastEntity.setVelocity(relative.normalize().multiply(speed.asDouble()));
    } else {
        double g = 20;
        double v = speed.asDouble();
        Vector relative = destination.clone().subtract(originLocation).toVector();
        double testAng = Velocity.launchAngle(originLocation, destination.toVector(), v, relative.getY(), g);
        double hangTime = Velocity.hangtime(testAng, v, relative.getY(), g);
        Vector to = destination.clone().add(lead.clone().multiply(hangTime)).toVector();
        relative = to.clone().subtract(originLocation.toVector());
        double dist = Math.sqrt(relative.getX() * relative.getX() + relative.getZ() * relative.getZ());
        if (dist == 0) {
            dist = 0.1d;
        }
        testAng = Velocity.launchAngle(originLocation, to, v, relative.getY(), g);
        relative.setY(Math.tan(testAng) * dist);
        relative = relative.normalize();
        v = v + (1.188 * Math.pow(hangTime, 2));
        relative = relative.multiply(v / 20.0d);
        lastEntity.setVelocity(relative);
    }
    if (spread != null) {
        Vector base = lastEntity.getVelocity().clone();
        float sf = spread.asFloat();
        for (EntityTag entity : entities) {
            Vector newvel = Velocity.spread(base, (CoreUtilities.getRandom().nextDouble() > 0.5f ? 1 : -1) * Math.toRadians(CoreUtilities.getRandom().nextDouble() * sf), (CoreUtilities.getRandom().nextDouble() > 0.5f ? 1 : -1) * Math.toRadians(CoreUtilities.getRandom().nextDouble() * sf));
            entity.setVelocity(newvel);
        }
    }
    final LocationTag start = new LocationTag(lastEntity.getLocation());
    // A task used to trigger a script if the entity is no longer
    // being shot, when the script argument is used
    BukkitRunnable task = new BukkitRunnable() {

        boolean flying = true;

        LocationTag lastLocation = null;

        Vector lastVelocity = null;

        public void run() {
            // If the entity is no longer spawned, stop the task
            if (!lastEntity.isSpawned()) {
                if (Debug.verbose) {
                    Debug.log("Shoot ended because entity not spawned");
                }
                flying = false;
            } else // the air, stop the task
            if (lastLocation != null && lastVelocity != null && !(lastEntity.getBukkitEntity() instanceof Projectile)) {
                if (lastLocation.getWorld() != lastEntity.getBukkitEntity().getWorld() || (lastLocation.distanceSquared(lastEntity.getBukkitEntity().getLocation()) < 0.1 && lastVelocity.distanceSquared(lastEntity.getBukkitEntity().getVelocity()) < 0.1)) {
                    if (Debug.verbose) {
                        Debug.log("Shoot ended because distances short - locations: " + (lastLocation.distanceSquared(lastEntity.getBukkitEntity().getLocation())) + ", velocity: " + (lastVelocity.distanceSquared(lastEntity.getBukkitEntity().getVelocity()) < 0.1));
                    }
                    flying = false;
                }
            }
            if (!arrows.containsKey(lastEntity.getUUID()) || arrows.get(lastEntity.getUUID()) != null) {
                if (Debug.verbose) {
                    Debug.log("Shoot ended because uuid was updated (hit entity?)");
                }
                flying = false;
            }
            // are met
            if (!flying) {
                this.cancel();
                ListTag hitEntities = new ListTag();
                for (EntityTag entity : entities) {
                    if (arrows.containsKey(entity.getUUID())) {
                        EntityTag hit = arrows.get(entity.getUUID());
                        arrows.remove(entity.getUUID());
                        if (hit != null) {
                            hitEntities.addObject(hit);
                        }
                    }
                }
                if (lastLocation == null) {
                    lastLocation = start;
                }
                scriptEntry.addObject("location", new LocationTag(lastLocation));
                scriptEntry.addObject("hit_entities", hitEntities);
                if (script != null) {
                    Consumer<ScriptQueue> configure = (queue) -> {
                        queue.addDefinition("location", new LocationTag(lastLocation));
                        queue.addDefinition("shot_entities", entityList);
                        queue.addDefinition("last_entity", lastEntity);
                        queue.addDefinition("hit_entities", hitEntities);
                    };
                    ScriptUtilities.createAndStartQueue(script.getContainer(), subPath == null ? null : subPath.asString(), scriptEntry.entryData, null, configure, null, null, definitions, scriptEntry);
                }
                scriptEntry.setFinished(true);
            } else {
                // Record its position in case the entity dies
                lastLocation = lastEntity.getLocation();
                lastVelocity = lastEntity.getVelocity();
            }
        }
    };
    if (script != null || scriptEntry.shouldWaitFor()) {
        task.runTaskTimer(Denizen.getInstance(), 1, 2);
    }
}
Also used : Utilities(com.denizenscript.denizen.utilities.Utilities) LocationTag(com.denizenscript.denizen.objects.LocationTag) NMSHandler(com.denizenscript.denizen.nms.NMSHandler) Projectile(org.bukkit.entity.Projectile) HashMap(java.util.HashMap) Debug(com.denizenscript.denizencore.utilities.debugging.Debug) InvalidArgumentsException(com.denizenscript.denizencore.exceptions.InvalidArgumentsException) Holdable(com.denizenscript.denizencore.scripts.commands.Holdable) EventHandler(org.bukkit.event.EventHandler) ScriptQueue(com.denizenscript.denizencore.scripts.queues.ScriptQueue) Map(java.util.Map) ScriptEntry(com.denizenscript.denizencore.scripts.ScriptEntry) ElementTag(com.denizenscript.denizencore.objects.core.ElementTag) EntityDamageByEntityEvent(org.bukkit.event.entity.EntityDamageByEntityEvent) Bukkit(org.bukkit.Bukkit) Listener(org.bukkit.event.Listener) ListTag(com.denizenscript.denizencore.objects.core.ListTag) Velocity(com.denizenscript.denizen.utilities.entity.Velocity) Entity(org.bukkit.entity.Entity) BukkitRunnable(org.bukkit.scheduler.BukkitRunnable) UUID(java.util.UUID) Position(com.denizenscript.denizen.utilities.entity.Position) Denizen(com.denizenscript.denizen.Denizen) Vector(org.bukkit.util.Vector) Consumer(java.util.function.Consumer) List(java.util.List) ScriptUtilities(com.denizenscript.denizencore.utilities.ScriptUtilities) EventPriority(org.bukkit.event.EventPriority) EntityTag(com.denizenscript.denizen.objects.EntityTag) com.denizenscript.denizencore.objects(com.denizenscript.denizencore.objects) ScriptTag(com.denizenscript.denizencore.objects.core.ScriptTag) AbstractCommand(com.denizenscript.denizencore.scripts.commands.AbstractCommand) CoreUtilities(com.denizenscript.denizencore.utilities.CoreUtilities) Conversion(com.denizenscript.denizen.utilities.Conversion) TaskScriptContainer(com.denizenscript.denizencore.scripts.containers.core.TaskScriptContainer) ProjectileHitEvent(org.bukkit.event.entity.ProjectileHitEvent) BukkitRunnable(org.bukkit.scheduler.BukkitRunnable) ListTag(com.denizenscript.denizencore.objects.core.ListTag) Projectile(org.bukkit.entity.Projectile) LocationTag(com.denizenscript.denizen.objects.LocationTag) ScriptTag(com.denizenscript.denizencore.objects.core.ScriptTag) EntityTag(com.denizenscript.denizen.objects.EntityTag) List(java.util.List) ElementTag(com.denizenscript.denizencore.objects.core.ElementTag) Vector(org.bukkit.util.Vector) ScriptQueue(com.denizenscript.denizencore.scripts.queues.ScriptQueue)

Aggregations

ScriptQueue (com.denizenscript.denizencore.scripts.queues.ScriptQueue)10 ScriptEntry (com.denizenscript.denizencore.scripts.ScriptEntry)8 BukkitScriptEntryData (com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData)6 ContextSource (com.denizenscript.denizencore.scripts.queues.ContextSource)5 InstantQueue (com.denizenscript.denizencore.scripts.queues.core.InstantQueue)5 ScriptTag (com.denizenscript.denizencore.objects.core.ScriptTag)4 EntityTag (com.denizenscript.denizen.objects.EntityTag)3 BukkitTagContext (com.denizenscript.denizen.tags.BukkitTagContext)3 Utilities (com.denizenscript.denizen.utilities.Utilities)3 InvalidArgumentsException (com.denizenscript.denizencore.exceptions.InvalidArgumentsException)3 ElementTag (com.denizenscript.denizencore.objects.core.ElementTag)3 AbstractCommand (com.denizenscript.denizencore.scripts.commands.AbstractCommand)3 TaskScriptContainer (com.denizenscript.denizencore.scripts.containers.core.TaskScriptContainer)3 ScriptUtilities (com.denizenscript.denizencore.utilities.ScriptUtilities)3 Consumer (java.util.function.Consumer)3 Denizen (com.denizenscript.denizen.Denizen)2 NMSHandler (com.denizenscript.denizen.nms.NMSHandler)2 LocationTag (com.denizenscript.denizen.objects.LocationTag)2 Conversion (com.denizenscript.denizen.utilities.Conversion)2 Debug (com.denizenscript.denizen.utilities.debugging.Debug)2