From 05b45671fcb64b1d3994e8c31b46a24a3aadde1f Mon Sep 17 00:00:00 2001 From: David Cernat Date: Thu, 26 Sep 2013 12:38:18 +0300 Subject: [PATCH] Slight optimization to Midi. --- .../commands/entity/RotateCommand.java | 30 +++++++++---------- .../denizen/utilities/midi/MidiUtil.java | 6 ++-- .../utilities/midi/NoteBlockReceiver.java | 28 +++++++++++------ 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/RotateCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/RotateCommand.java index 3a1e15a638..5a720931e0 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/RotateCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/entity/RotateCommand.java @@ -134,15 +134,18 @@ public void execute(final ScriptEntry scriptEntry) throws CommandExecutionExcept int ticks = 0; int maxTicks = duration.getTicksAsInt(); - // Track how many entities are left to rotate, and cancel - // the task if there are none - int entitiesLeft = entities.size(); + // Track entities that are no longer used, to remove them from + // the regular list Collection unusedEntities = new LinkedList(); @Override public void run() { - if (infinite || ticks < maxTicks) { + if (entities.isEmpty()) { + this.cancel(); + } + + else if (infinite || ticks < maxTicks) { for (dEntity entity : entities) { if (entity.isSpawned() && rotatingEntities.contains(entity.getUUID())) { Rotation.rotate(entity.getBukkitEntity(), @@ -151,24 +154,19 @@ public void run() { } else { rotatingEntities.remove(entity.getUUID()); - entitiesLeft--; unusedEntities.add(entity); } } - if (entitiesLeft == 0) { - this.cancel(); - } - else { - - // Remove any entities that are no longer spawned - if (unusedEntities.size() > 0) { - for (dEntity unusedEntity : unusedEntities) - entities.remove(unusedEntity); - unusedEntities.clear(); + // Remove any entities that are no longer spawned + if (!unusedEntities.isEmpty()) { + for (dEntity unusedEntity : unusedEntities) { + entities.remove(unusedEntity); } - ticks = (int) (ticks + frequency.getTicks()); + unusedEntities.clear(); } + + ticks = (int) (ticks + frequency.getTicks()); } else this.cancel(); } diff --git a/src/main/java/net/aufdemrand/denizen/utilities/midi/MidiUtil.java b/src/main/java/net/aufdemrand/denizen/utilities/midi/MidiUtil.java index ed8017d4c6..c72e0e6705 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/midi/MidiUtil.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/midi/MidiUtil.java @@ -48,8 +48,8 @@ public static void playMidi(File file, float tempo, List entities) // If there is already a midi file being played for one of the entities, // stop playing it for (dEntity entity : entities) { - stopMidi(entity.identify()); - receivers.put(entity.identify(), receiver); + stopMidi(entity.getUUID().toString()); + receivers.put(entity.getUUID().toString(), receiver); } startSequencer(file, tempo, receiver); @@ -80,7 +80,7 @@ public static void stopMidi(String object) { public static void stopMidi(List entities) { for (dEntity entity : entities) { - stopMidi(entity.identify()); + stopMidi(entity.getUUID().toString()); } } diff --git a/src/main/java/net/aufdemrand/denizen/utilities/midi/NoteBlockReceiver.java b/src/main/java/net/aufdemrand/denizen/utilities/midi/NoteBlockReceiver.java index 6d664d2c96..a9d0ac6308 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/midi/NoteBlockReceiver.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/midi/NoteBlockReceiver.java @@ -5,12 +5,13 @@ import javax.sound.midi.Receiver; import javax.sound.midi.ShortMessage; import java.io.IOException; +import java.util.Collection; +import java.util.LinkedList; import java.util.List; import java.util.Map; import net.aufdemrand.denizen.objects.dEntity; import net.aufdemrand.denizen.objects.dLocation; -import net.aufdemrand.denizen.utilities.debugging.dB; import org.bukkit.Sound; @@ -25,20 +26,21 @@ public class NoteBlockReceiver implements Receiver { private static final float VOLUME_RANGE = 10.0f; - private List listeners; + private List entities; private dLocation location; private final Map channelPatches; + private Collection unusedEntities = new LinkedList(); public NoteBlockReceiver(List entities) throws InvalidMidiDataException, IOException { - this.listeners = entities; + this.entities = entities; this.location = null; this.channelPatches = Maps.newHashMap(); } public NoteBlockReceiver(dLocation location) throws InvalidMidiDataException, IOException { - this.listeners = null; + this.entities = null; this.location = location; this.channelPatches = Maps.newHashMap(); } @@ -92,8 +94,8 @@ public void playNote(ShortMessage message) location.getWorld().playSound(location, instrument, volume, pitch); } - else if (listeners != null) { - for (dEntity entity : listeners) { + else if (entities != null && !entities.isEmpty()) { + for (dEntity entity : entities) { if (entity.isSpawned()) { if (entity.isPlayer()) { entity.getPlayer().playSound(entity.getLocation(), instrument, volume, pitch); @@ -103,17 +105,25 @@ else if (listeners != null) { } } else { - dB.echoError("Cannot play midi for unspawned entity " + entity); - this.close(); + unusedEntities.add(entity); } } + + // Remove any entities that are no longer spawned + if (!unusedEntities.isEmpty()) { + for (dEntity unusedEntity : unusedEntities) { + entities.remove(unusedEntity); + } + unusedEntities.clear(); + } } + else this.close(); } @Override public void close() { - if (listeners != null) listeners = null; + if (entities != null) entities = null; if (location != null) location = null; channelPatches.clear(); }