@Override public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { // Extract objects from ScriptEntry List<dLocation> locations = (List<dLocation>) scriptEntry.getObject("location"); List<dPlayer> targets = (List<dPlayer>) scriptEntry.getObject("targets"); Effect effect = (Effect) scriptEntry.getObject("effect"); Particle particleEffect = (Particle) scriptEntry.getObject("particleeffect"); Element iconcrack = scriptEntry.getElement("iconcrack"); Element iconcrack_data = scriptEntry.getElement("iconcrack_data"); Element iconcrack_type = scriptEntry.getElement("iconcrack_type"); Element radius = scriptEntry.getElement("radius"); Element data = scriptEntry.getElement("data"); Element qty = scriptEntry.getElement("qty"); dLocation offset = scriptEntry.getdObject("offset"); // Report to dB dB.report( scriptEntry, getName(), (effect != null ? aH.debugObj("effect", effect.getName()) : particleEffect != null ? aH.debugObj("special effect", particleEffect.getName()) : iconcrack_type.debug() + iconcrack.debug() + (iconcrack_data != null ? iconcrack_data.debug() : "")) + aH.debugObj("locations", locations.toString()) + (targets != null ? aH.debugObj("targets", targets.toString()) : "") + radius.debug() + data.debug() + qty.debug() + offset.debug()); for (dLocation location : locations) { // Slightly increase the location's Y so effects don't seem to come out of the ground location.add(0, 1, 0); // Play the Bukkit effect the number of times specified if (effect != null) { for (int n = 0; n < qty.asInt(); n++) { if (targets != null) { for (dPlayer player : targets) { if (player.isValid() && player.isOnline()) { effect.playFor(player.getPlayerEntity(), location, data.asInt()); } } } else { effect.play(location, data.asInt(), radius.asInt()); } } } // Play a ParticleEffect else if (particleEffect != null) { float osX = (float) offset.getX(); float osY = (float) offset.getY(); float osZ = (float) offset.getZ(); List<Player> players = new ArrayList<Player>(); if (targets == null) { float rad = radius.asFloat(); for (Player player : location.getWorld().getPlayers()) { if (player.getLocation().distanceSquared(location) < rad * rad) { players.add(player); } } } else { for (dPlayer player : targets) { if (player.isValid() && player.isOnline()) { players.add(player.getPlayerEntity()); } } } for (Player player : players) { particleEffect.playFor(player, location, qty.asInt(), offset.toVector(), data.asFloat()); } } // Play an iconcrack (item break) effect else { float osX = (float) offset.getX(); float osY = (float) offset.getY(); float osZ = (float) offset.getZ(); List<Player> players = new ArrayList<Player>(); if (targets == null) { float rad = radius.asFloat(); for (Player player : location.getWorld().getPlayers()) { if (player.getLocation().distanceSquared(location) < rad * rad) { players.add(player); } } } else { for (dPlayer player : targets) { if (player.isValid() && player.isOnline()) { players.add(player.getPlayerEntity()); } } } // TODO: better this all if (iconcrack_type.asString().equalsIgnoreCase("iconcrack")) { ItemStack itemStack = new ItemStack(iconcrack.asInt(), iconcrack_data != null ? iconcrack_data.asInt() : 0); Particle particle = NMSHandler.getInstance().getParticleHelper().getParticle("ITEM_CRACK"); for (Player player : players) { particle.playFor( player, location, qty.asInt(), offset.toVector(), data.asFloat(), itemStack); } } else if (iconcrack_type.asString().equalsIgnoreCase("blockcrack")) { MaterialData materialData = new MaterialData( iconcrack.asInt(), (byte) (iconcrack_data != null ? iconcrack_data.asInt() : 0)); Particle particle = NMSHandler.getInstance().getParticleHelper().getParticle("BLOCK_CRACK"); for (Player player : players) { particle.playFor( player, location, qty.asInt(), offset.toVector(), data.asFloat(), materialData); } } else { // blockdust MaterialData materialData = new MaterialData( iconcrack.asInt(), (byte) (iconcrack_data != null ? iconcrack_data.asInt() : 0)); Particle particle = NMSHandler.getInstance().getParticleHelper().getParticle("BLOCK_DUST"); for (Player player : players) { particle.playFor( player, location, qty.asInt(), offset.toVector(), data.asFloat(), materialData); } } } } }