@Override
  public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException {

    ParticleHelper particleHelper = NMSHandler.getInstance().getParticleHelper();

    // Iterate through arguments
    for (aH.Argument arg : aH.interpret(scriptEntry.getArguments())) {

      if (!scriptEntry.hasObject("location") && arg.matchesArgumentList(dLocation.class)) {

        scriptEntry.addObject("location", arg.asType(dList.class).filter(dLocation.class));
      } else if (!scriptEntry.hasObject("effect")
          && !scriptEntry.hasObject("particleeffect")
          && !scriptEntry.hasObject("iconcrack")) {

        if (particleHelper.hasParticle(arg.getValue())) {
          scriptEntry.addObject("particleeffect", particleHelper.getParticle(arg.getValue()));
        } else if (arg.matches("random")) {
          // Get another effect if "RANDOM" is used
          if (CoreUtilities.getRandom().nextDouble() < 0.5) {
            // Make sure the new effect is not an invisible effect
            List<Particle> visible = particleHelper.getVisibleParticles();
            scriptEntry.addObject(
                "particleeffect", visible.get(CoreUtilities.getRandom().nextInt(visible.size())));
          } else {
            List<Effect> visual = particleHelper.getVisualEffects();
            scriptEntry.addObject(
                "effect", visual.get(CoreUtilities.getRandom().nextInt(visual.size())));
          }
        } else if (arg.startsWith("iconcrack_")) {
          // Allow iconcrack_[id],[data] for item break effects (ex: iconcrack_1)
          String shrunk = arg.getValue().substring("iconcrack_".length());
          String[] split = shrunk.split(",");
          Element typeId = new Element(split[0]);
          if (typeId.isInt()
              && typeId.asInt() > 0
              && Material.getMaterial(typeId.asInt()) != null) {
            scriptEntry.addObject("iconcrack", typeId);
          } else {
            dB.echoError("Invalid iconcrack_[id]. Must be a valid Material ID, besides 0.");
          }
          Element dataId = new Element(split.length <= 1 ? "0" : split[1]);
          scriptEntry.addObject("iconcrack_data", dataId);
          scriptEntry.addObject("iconcrack_type", new Element("iconcrack"));
        } else if (arg.startsWith("blockcrack_")) {
          String shrunk = arg.getValue().substring("blockcrack_".length());
          Element typeId = new Element(shrunk);
          if (typeId.isInt()
              && typeId.asInt() > 0
              && Material.getMaterial(typeId.asInt()) != null) {
            scriptEntry.addObject("iconcrack", typeId);
          } else {
            dB.echoError("Invalid blockcrack_[id]. Must be a valid Material ID, besides 0.");
          }
          scriptEntry.addObject("iconcrack_type", new Element("blockcrack"));
        } else if (arg.startsWith("blockdust_")) {
          String shrunk = arg.getValue().substring("blockdust_".length());
          Element typeId = new Element(shrunk);
          if (typeId.isInt()
              && typeId.asInt() > 0
              && Material.getMaterial(typeId.asInt()) != null) {
            scriptEntry.addObject("iconcrack", typeId);
          } else {
            dB.echoError("Invalid blockdust_[id]. Must be a valid Material ID, besides 0.");
          }
          scriptEntry.addObject("iconcrack_type", new Element("blockdust"));
        } else if (particleHelper.hasEffect(arg.getValue())) {
          scriptEntry.addObject("effect", particleHelper.getEffect(arg.getValue()));
        }
      } else if (!scriptEntry.hasObject("radius")
          && arg.matchesPrimitive(aH.PrimitiveType.Double)
          && arg.matchesPrefix("visibility", "v", "radius", "r")) {

        scriptEntry.addObject("radius", arg.asElement());
      } else if (!scriptEntry.hasObject("data")
          && arg.matchesPrimitive(aH.PrimitiveType.Double)
          && arg.matchesPrefix("data", "d")) {

        scriptEntry.addObject("data", arg.asElement());
      } else if (!scriptEntry.hasObject("qty")
          && arg.matchesPrimitive(aH.PrimitiveType.Integer)
          && arg.matchesPrefix("qty", "q", "quantity")) {

        scriptEntry.addObject("qty", arg.asElement());
      } else if (!scriptEntry.hasObject("offset")
          && arg.matchesPrimitive(aH.PrimitiveType.Double)
          && arg.matchesPrefix("offset", "o")) {

        double offset = arg.asElement().asDouble();
        scriptEntry.addObject("offset", new dLocation(null, offset, offset, offset));
      } else if (!scriptEntry.hasObject("offset")
          && arg.matchesArgumentType(dLocation.class)
          && arg.matchesPrefix("offset", "o")) {

        scriptEntry.addObject("offset", arg.asType(dLocation.class));
      } else if (!scriptEntry.hasObject("targets")
          && arg.matchesArgumentList(dPlayer.class)
          && arg.matchesPrefix("targets", "target", "t")) {

        scriptEntry.addObject("targets", arg.asType(dList.class).filter(dPlayer.class));
      } else {
        arg.reportUnhandled();
      }
    }

    // Use default values if necessary
    scriptEntry.defaultObject(
        "location",
        ((BukkitScriptEntryData) scriptEntry.entryData).hasNPC()
                && ((BukkitScriptEntryData) scriptEntry.entryData).getNPC().isSpawned()
            ? Arrays.asList(((BukkitScriptEntryData) scriptEntry.entryData).getNPC().getLocation())
            : null,
        ((BukkitScriptEntryData) scriptEntry.entryData).hasPlayer()
                && ((BukkitScriptEntryData) scriptEntry.entryData).getPlayer().isOnline()
            ? Arrays.asList(
                ((BukkitScriptEntryData) scriptEntry.entryData).getPlayer().getLocation())
            : null);
    scriptEntry.defaultObject("data", new Element(0));
    scriptEntry.defaultObject("radius", new Element(15));
    scriptEntry.defaultObject("qty", new Element(1));
    scriptEntry.defaultObject("offset", new dLocation(null, 0.5, 0.5, 0.5));

    // Check to make sure required arguments have been filled

    if (!scriptEntry.hasObject("effect")
        && !scriptEntry.hasObject("particleeffect")
        && !scriptEntry.hasObject("iconcrack")) {
      throw new InvalidArgumentsException("Missing effect argument!");
    }

    if (!scriptEntry.hasObject("location")) {
      throw new InvalidArgumentsException("Missing location argument!");
    }
  }