@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!"); } }