]> git.seodisparate.com - TurnBasedMinecraftMod/commitdiff
Fix bug where two sounds play at once, fixes
authorStephen Seo <seo.disparate@gmail.com>
Thu, 27 Sep 2018 07:44:28 +0000 (16:44 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 27 Sep 2018 07:46:17 +0000 (16:46 +0900)
Mod should also now resume other previously playing sounds/music after
battle has ended.

Also prevents possible concurrent modification exception when new
Entities are added to Battle server-side.

src/main/java/com/seodisparate/TurnBasedMinecraft/client/BattleMusic.java
src/main/java/com/seodisparate/TurnBasedMinecraft/client/ClientProxy.java
src/main/java/com/seodisparate/TurnBasedMinecraft/common/Battle.java
src/main/java/com/seodisparate/TurnBasedMinecraft/common/CommonProxy.java

index b448dfb6bea819cc45833170f21033003a24969f..c8ae1784df3ccd79b4f1d5a11758360c99f9d23a 100644 (file)
@@ -30,6 +30,7 @@ public class BattleMusic
     private Sequencer sequencer;
     private Clip clip;
     private boolean playingIsSilly;
+    private boolean isPlaying;
     
     public BattleMusic(Logger logger)
     {
@@ -37,6 +38,7 @@ public class BattleMusic
         this.logger = logger;
         battleMusic = new ArrayList<File>();
         sillyMusic = new ArrayList<File>();
+        isPlaying = false;
         
         try {
             sequencer = MidiSystem.getSequencer();
@@ -159,6 +161,7 @@ public class BattleMusic
         play(nextBattle, volume);
         pickNextBattle();
         playingIsSilly = false;
+        isPlaying = true;
     }
     
     public void playSilly(float volume)
@@ -174,6 +177,7 @@ public class BattleMusic
         play(nextSilly, volume);
         pickNextSilly();
         playingIsSilly = true;
+        isPlaying = true;
     }
     
     private void play(File next, float volume)
@@ -237,7 +241,7 @@ public class BattleMusic
         }
     }
     
-    public void stopMusic()
+    public void stopMusic(boolean resumeMCSounds)
     {
         if(sequencer.isRunning())
         {
@@ -248,6 +252,13 @@ public class BattleMusic
             clip.stop();
             clip.close();
         }
+        if(resumeMCSounds)
+        {
+            Minecraft.getMinecraft().addScheduledTask(() -> {
+                Minecraft.getMinecraft().getSoundHandler().resumeSounds();
+            });
+        }
+        isPlaying = false;
     }
     
     public boolean isPlayingSilly()
@@ -257,6 +268,6 @@ public class BattleMusic
     
     public boolean isPlaying()
     {
-        return sequencer.isRunning() || clip.isActive();
+        return isPlaying || sequencer.isRunning() || clip.isActive();
     }
 }
index 84eb76f256afc43870085a7c296cc8b13ad82dd7..4ab8298bd41bb5b1caa35e6a2041eb01b14fc531 100644 (file)
@@ -75,7 +75,7 @@ public class ClientProxy extends CommonProxy
             Minecraft.getMinecraft().displayGuiScreen(null);
             Minecraft.getMinecraft().setIngameFocus();
         });
-        stopMusic();
+        stopMusic(true);
     }
 
     @Override
@@ -103,9 +103,9 @@ public class ClientProxy extends CommonProxy
     }
 
     @Override
-    public void stopMusic()
+    public void stopMusic(boolean resumeMCSounds)
     {
-        battleMusic.stopMusic();
+        battleMusic.stopMusic(resumeMCSounds);
     }
 
     /**
@@ -120,7 +120,7 @@ public class ClientProxy extends CommonProxy
             {
                 if(battleMusic.isPlayingSilly())
                 {
-                    stopMusic();
+                    stopMusic(false);
                     playBattleMusic();
                 }
             }
@@ -135,7 +135,7 @@ public class ClientProxy extends CommonProxy
             {
                 if(!battleMusic.isPlayingSilly())
                 {
-                    stopMusic();
+                    stopMusic(false);
                     playSillyMusic();
                 }
             }
index f69aa1c11d439d3b58eca02c09b600d7fd08a584..b1338a60d13f01e5fc88c0e42c672744c06207ff 100644 (file)
@@ -36,6 +36,8 @@ public class Battle
     private Map<Integer, Combatant> sideB;
     private Map<Integer, Combatant> players;
     private PriorityQueue<Combatant> turnOrderQueue;
+    private Queue<Combatant> sideAEntryQueue;
+    private Queue<Combatant> sideBEntryQueue;
     
     private State state;
     private AtomicInteger playerCount;
@@ -123,6 +125,8 @@ public class Battle
         this.sideB = new Hashtable<Integer, Combatant>();
         players = new Hashtable<Integer, Combatant>();
         turnOrderQueue = new PriorityQueue<Combatant>(new Combatant.CombatantComparator());
+        sideAEntryQueue = new ArrayDeque<Combatant>();
+        sideBEntryQueue = new ArrayDeque<Combatant>();
         playerCount = new AtomicInteger(0);
         undecidedCount = new AtomicInteger(0);
         if(sideA != null)
@@ -254,7 +258,17 @@ public class Battle
         Combatant newCombatant = new Combatant(e, entityInfo);
         newCombatant.isSideA = true;
         newCombatant.battleID = getId();
-        sideA.put(e.getEntityId(), newCombatant);
+        if(isServer)
+        {
+            synchronized(sideAEntryQueue)
+            {
+                sideAEntryQueue.add(newCombatant);
+            }
+        }
+        else
+        {
+            sideA.put(e.getEntityId(), newCombatant);
+        }
         if(e instanceof EntityPlayer)
         {
             newCombatant.recalcSpeedOnCompare = true;
@@ -293,7 +307,17 @@ public class Battle
         Combatant newCombatant = new Combatant(e, entityInfo);
         newCombatant.isSideA = false;
         newCombatant.battleID = getId();
-        sideB.put(e.getEntityId(), newCombatant);
+        if(isServer)
+        {
+            synchronized(sideBEntryQueue)
+            {
+                sideBEntryQueue.add(newCombatant);
+            }
+        }
+        else
+        {
+            sideB.put(e.getEntityId(), newCombatant);
+        }
         if(e instanceof EntityPlayer)
         {
             newCombatant.recalcSpeedOnCompare = true;
@@ -583,7 +607,11 @@ public class Battle
      */
     public boolean update()
     {
-        if(battleEnded)
+        if(!isServer)
+        {
+            return false;
+        }
+        else if(battleEnded)
         {
             return true;
         }
@@ -599,6 +627,20 @@ public class Battle
         {
             return true;
         }
+        synchronized(sideAEntryQueue)
+        {
+            for(Combatant c = sideAEntryQueue.poll(); c != null; c = sideAEntryQueue.poll())
+            {
+                sideA.put(c.entity.getEntityId(), c);
+            }
+        }
+        synchronized(sideBEntryQueue)
+        {
+            for(Combatant c = sideBEntryQueue.poll(); c != null; c = sideBEntryQueue.poll())
+            {
+                sideB.put(c.entity.getEntityId(), c);
+            }
+        }
         if(TurnBasedMinecraftMod.config.isFreezeCombatantsEnabled())
         {
             enforceFreezePositions();
index 1e70778d824a98990be80c11b5b00cc414c1b102..6800cc52ff41727d4eeb57f20039974b945b5a6c 100644 (file)
@@ -52,7 +52,7 @@ public class CommonProxy
     
     public void playSillyMusic() {}
     
-    public void stopMusic() {}
+    public void stopMusic(boolean resumeMCSounds) {}
     
     public void typeEnteredBattle(String type) {}