Browse Source

Don't modify the list we are iterating over

nossr50 6 years ago
parent
commit
3cfd3b0109
1 changed files with 31 additions and 5 deletions
  1. 31 5
      src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java

+ 31 - 5
src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java

@@ -11,25 +11,29 @@ import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
 import org.bukkit.scheduler.BukkitRunnable;
 
+import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Map.Entry;
 
 public class BleedTimerTask extends BukkitRunnable {
     private final static int MAX_BLEED_TICKS = 100; //The cap has been raised :)
     private static Map<LivingEntity, Integer> bleedList = new HashMap<LivingEntity, Integer>();
     private static Map<LivingEntity, Integer> bleedDamage = new HashMap<LivingEntity, Integer>();
     private static Map<LivingEntity, LivingEntity> attackerMap = new HashMap<>();
+    private static ArrayList<LivingEntity> cleanupList = new ArrayList<>();
+    private static ArrayList<LivingEntity> lowerList = new ArrayList<>();
 
     @Override
     public void run() {
+        lowerBleedTicks(); //Lower bleed ticks
+        cleanEntities(); //Remove unwanted entities
+
         for(LivingEntity target : bleedList.keySet())
         {
             //mcMMO.p.getServer().broadcastMessage("Entity "+target.getName()+" has "+bleedList.get(target)+" ticks of bleed left");
 
             if (bleedList.get(target) <= 0 || !target.isValid()) {
-                remove(target);
+                cleanupList.add(target);
                 continue;
             }
 
@@ -45,7 +49,7 @@ public class BleedTimerTask extends BukkitRunnable {
                 Player player = (Player) target;
 
                 if (!player.isOnline()) {
-                    remove(target);
+                    cleanupList.add(target);
                     continue;
                 }
 
@@ -68,9 +72,31 @@ public class BleedTimerTask extends BukkitRunnable {
         }
     }
 
+    private void lowerBleedTicks() {
+        for(LivingEntity lower : lowerList)
+        {
+            if(bleedList.containsKey(lower))
+                bleedList.put(lower, bleedList.get(lower) - 1);
+        }
+
+        lowerList.clear();
+    }
+
+    private void cleanEntities() {
+        for(LivingEntity cleanTarget : cleanupList)
+        {
+            if(bleedList.containsKey(cleanTarget))
+            {
+                remove(cleanTarget);
+            }
+        }
+
+        cleanupList.clear(); //Reset List
+    }
+
     private void lowerBleedDurationTicks(LivingEntity target) {
         if(bleedList.get(target) != null)
-            bleedList.put(target, bleedList.get(target) - 1);
+            lowerList.add(target);
     }
 
     /**