import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
*/
private boolean healthCheck()
{
- Queue<Combatant> removeQueue = new ArrayDeque<Combatant>();
- for(Combatant c : sideA.values())
+ boolean didRemove = false;
+ for(Iterator<Map.Entry<Integer, Combatant>> iter = sideA.entrySet().iterator(); iter.hasNext();)
{
- if(!c.entity.isEntityAlive())
+ Map.Entry<Integer, Combatant> entry = iter.next();
+ if(!entry.getValue().entity.isEntityAlive())
{
- removeQueue.add(c);
+ iter.remove();
+ players.remove(entry.getKey());
+ removeCombatantPostRemove(entry.getValue());
+ didRemove = true;
String category = new String();
- if(c.entityInfo != null)
+ if(entry.getValue().entityInfo != null)
{
- category = c.entityInfo.category;
+ category = entry.getValue().entityInfo.category;
}
- else if(c.entity instanceof EntityPlayer)
+ else if(entry.getValue().entity instanceof EntityPlayer)
{
category = "player";
}
- sendMessageToAllPlayers(PacketBattleMessage.MessageType.DIED, c.entity.getEntityId(), 0, 0, category);
+ sendMessageToAllPlayers(PacketBattleMessage.MessageType.DIED, entry.getValue().entity.getEntityId(), 0, 0, category);
}
}
- for(Combatant c : sideB.values())
+ for(Iterator<Map.Entry<Integer, Combatant>> iter = sideB.entrySet().iterator(); iter.hasNext();)
{
- if(!c.entity.isEntityAlive())
+ Map.Entry<Integer, Combatant> entry = iter.next();
+ if(!entry.getValue().entity.isEntityAlive())
{
- removeQueue.add(c);
+ iter.remove();
+ players.remove(entry.getKey());
+ removeCombatantPostRemove(entry.getValue());
+ didRemove = true;
String category = new String();
- if(c.entityInfo != null)
+ if(entry.getValue().entityInfo != null)
{
- category = c.entityInfo.category;
+ category = entry.getValue().entityInfo.category;
}
- else if(c.entity instanceof EntityPlayer)
+ else if(entry.getValue().entity instanceof EntityPlayer)
{
category = "player";
}
- sendMessageToAllPlayers(PacketBattleMessage.MessageType.DIED, c.entity.getEntityId(), 0, 0, category);
+ sendMessageToAllPlayers(PacketBattleMessage.MessageType.DIED, entry.getValue().entity.getEntityId(), 0, 0, category);
}
}
- boolean didRemove = !removeQueue.isEmpty();
- for(Combatant toRemove = removeQueue.poll(); toRemove != null; toRemove = removeQueue.poll())
- {
- removeCombatant(toRemove);
- }
if(players.isEmpty() || sideA.isEmpty() || sideB.isEmpty())
{
battleEnded = true;
- sendMessageToAllPlayers(PacketBattleMessage.MessageType.ENDED, 0, 0, 0);
}
else if(didRemove)
{
*/
private boolean isCreativeCheck()
{
- Queue<Combatant> removeQueue = new ArrayDeque<Combatant>();
- for(Combatant c : players.values())
+ boolean didRemove = false;
+ for(Iterator<Map.Entry<Integer, Combatant>> iter = players.entrySet().iterator(); iter.hasNext();)
{
- if(c.entity != null && ((EntityPlayer)c.entity).isCreative())
+ Map.Entry<Integer, Combatant> entry = iter.next();
+ if(entry.getValue().entity != null && ((EntityPlayer)entry.getValue().entity).isCreative())
{
- removeQueue.add(c);
+ sendMessageToAllPlayers(PacketBattleMessage.MessageType.BECAME_CREATIVE, entry.getValue().entity.getEntityId(), 0, 0);
+ iter.remove();
+ sideA.remove(entry.getKey());
+ sideB.remove(entry.getKey());
+ playerCount.decrementAndGet();
+ removeCombatantPostRemove(entry.getValue());
+ didRemove = true;
}
}
- boolean didRemove = false;
- for(Combatant toRemove = removeQueue.poll(); toRemove != null; toRemove = removeQueue.poll())
- {
- didRemove = true;
- removeCombatant(toRemove);
- sendMessageToAllPlayers(PacketBattleMessage.MessageType.BECAME_CREATIVE, toRemove.entity.getEntityId(), 0, 0);
- }
if(didRemove)
{
resetUndecidedCount();
if(players.remove(c.entity.getEntityId()) != null)
{
playerCount.decrementAndGet();
+ }
+ removeCombatantPostRemove(c);
+ }
+
+ private void removeCombatantPostRemove(Combatant c)
+ {
+ if(c.entity instanceof EntityPlayer)
+ {
TurnBasedMinecraftMod.NWINSTANCE.sendTo(new PacketBattleMessage(PacketBattleMessage.MessageType.ENDED, 0, 0, 0), (EntityPlayerMP)c.entity);
}
battleManager.addRecentlyLeftBattle(c);
package com.seodisparate.TurnBasedMinecraft.common;
-import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
+import java.util.Iterator;
import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
import org.apache.logging.log4j.Logger;
public BattleManager(Logger logger)
{
this.logger = logger;
- battleMap = new Hashtable<Integer, Battle>();
+ battleMap = new HashMap<Integer, Battle>();
battleUpdater = new BattleUpdater(this);
updaterThread = new Thread(battleUpdater);
updaterThread.start();
if(entityInfo != null && (TurnBasedMinecraftMod.proxy.getConfig().isIgnoreBattleType(entityInfo.category) || entityInfo.ignoreBattle))
{
// attacked entity ignores battle
- for(Battle b : battleMap.values())
+ synchronized(battleMap)
{
- if(b.hasCombatant(event.getSource().getTrueSource().getEntityId()))
+ for(Battle b : battleMap.values())
{
-// logger.debug("Attack Canceled: attacked ignores battle but attacker in battle");
- return true;
+ if(b.hasCombatant(event.getSource().getTrueSource().getEntityId()))
+ {
+ // logger.debug("Attack Canceled: attacked ignores battle but attacker in battle");
+ return true;
+ }
}
}
// logger.debug("Attack Not Canceled: attacked ignores battle");
if(entityInfo != null && (TurnBasedMinecraftMod.proxy.getConfig().isIgnoreBattleType(entityInfo.category) || entityInfo.ignoreBattle))
{
// attacker entity ignores battle
- for(Battle b : battleMap.values())
+ synchronized(battleMap)
{
- if(b.hasCombatant(event.getEntity().getEntityId()))
+ for(Battle b : battleMap.values())
{
-// logger.debug("Attack Canceled: attacker ignores battle but attacked in battle");
- return true;
+ if(b.hasCombatant(event.getEntity().getEntityId()))
+ {
+ // logger.debug("Attack Canceled: attacker ignores battle but attacked in battle");
+ return true;
+ }
}
}
// logger.debug("Attack Not Canceled: attacker ignores battle");
Entity notInBattle = null;
Battle battle = null;
- for(Battle b : battleMap.values())
+ synchronized(battleMap)
{
- if(b.hasCombatant(event.getSource().getTrueSource().getEntityId()))
- {
- if(inBattle != null)
- {
- // both combatants are in battle
-// logger.debug("Attack Canceled: both are in battle");
- return true;
- }
- else
- {
- inBattle = event.getSource().getTrueSource();
- notInBattle = event.getEntity();
- battle = b;
- }
- }
- if(b.hasCombatant(event.getEntity().getEntityId()))
+ for(Battle b : battleMap.values())
{
- if(inBattle != null)
+ if(b.hasCombatant(event.getSource().getTrueSource().getEntityId()))
{
- // both combatants are in battle
-// logger.debug("Attack Canceled: both are in battle");
- return true;
+ if(inBattle != null)
+ {
+ // both combatants are in battle
+ // logger.debug("Attack Canceled: both are in battle");
+ return true;
+ }
+ else
+ {
+ inBattle = event.getSource().getTrueSource();
+ notInBattle = event.getEntity();
+ battle = b;
+ }
}
- else
+ if(b.hasCombatant(event.getEntity().getEntityId()))
{
- inBattle = event.getEntity();
- notInBattle = event.getSource().getTrueSource();
- battle = b;
+ if(inBattle != null)
+ {
+ // both combatants are in battle
+ // logger.debug("Attack Canceled: both are in battle");
+ return true;
+ }
+ else
+ {
+ inBattle = event.getEntity();
+ notInBattle = event.getSource().getTrueSource();
+ battle = b;
+ }
}
}
}
Entity notInBattle = null;
Battle battle = null;
- for(Battle b : battleMap.values())
+ synchronized(battleMap)
{
- if(b.hasCombatant(event.getEntity().getEntityId()))
- {
- if(inBattle != null)
- {
- // both entities already in battle
- return;
- }
- else
- {
- inBattle = event.getEntity();
- notInBattle = event.getTarget();
- battle = b;
- }
- }
- if(b.hasCombatant(event.getTarget().getEntityId()))
+ for(Battle b : battleMap.values())
{
- if(inBattle != null)
+ if(b.hasCombatant(event.getEntity().getEntityId()))
{
- // both entities already in battle
- return;
+ if(inBattle != null)
+ {
+ // both entities already in battle
+ return;
+ }
+ else
+ {
+ inBattle = event.getEntity();
+ notInBattle = event.getTarget();
+ battle = b;
+ }
}
- else
+ if(b.hasCombatant(event.getTarget().getEntityId()))
{
- inBattle = event.getTarget();
- notInBattle = event.getEntity();
- battle = b;
+ if(inBattle != null)
+ {
+ // both entities already in battle
+ return;
+ }
+ else
+ {
+ inBattle = event.getTarget();
+ notInBattle = event.getEntity();
+ battle = b;
+ }
}
}
}
private Battle createBattle(Collection<Entity> sideA, Collection<Entity> sideB)
{
- while(battleMap.containsKey(IDCounter))
+ Battle newBattle = null;
+ synchronized(battleMap)
{
- ++IDCounter;
+ while(battleMap.containsKey(IDCounter))
+ {
+ ++IDCounter;
+ }
+ newBattle = new Battle(this, IDCounter, sideA, sideB, true);
+ battleMap.put(IDCounter, newBattle);
}
- Battle newBattle = new Battle(this, IDCounter, sideA, sideB, true);
- battleMap.put(IDCounter, newBattle);
newBattle.notifyPlayersBattleInfo();
return newBattle;
}
public Battle getBattleByID(int id)
{
- return battleMap.get(id);
+ synchronized(battleMap)
+ {
+ return battleMap.get(id);
+ }
}
public void cleanup()
battleUpdater.setIsRunning(false);
battleUpdater = null;
updaterThread = null;
- battleMap.clear();
+ synchronized(battleMap)
+ {
+ battleMap.clear();
+ }
}
protected void addRecentlyLeftBattle(Combatant c)
protected void updateRecentlyLeftBattle()
{
long current = System.nanoTime();
- Queue<Combatant> removeQueue = new ArrayDeque<Combatant>();
synchronized(recentlyLeftBattle)
{
- for(Combatant c : recentlyLeftBattle.values())
- {
- if(current - c.time > TurnBasedMinecraftMod.proxy.getConfig().getLeaveBattleCooldownNanos())
- {
- removeQueue.add(c);
- }
- }
- for(Combatant c = removeQueue.poll(); c != null; c = removeQueue.poll())
+ for(Iterator<Map.Entry<Integer, Combatant>> iter = recentlyLeftBattle.entrySet().iterator(); iter.hasNext();)
{
- if(c.entity instanceof EntityPlayerMP)
+ Map.Entry<Integer, Combatant> entry = iter.next();
+ if(current - entry.getValue().time > TurnBasedMinecraftMod.proxy.getConfig().getLeaveBattleCooldownNanos())
{
- TurnBasedMinecraftMod.NWINSTANCE.sendTo(new PacketGeneralMessage("Timer ended, you can now attack/be-attacked again."), (EntityPlayerMP)c.entity);
+ iter.remove();
+ if(entry.getValue().entity instanceof EntityPlayerMP)
+ {
+ TurnBasedMinecraftMod.NWINSTANCE.sendTo(new PacketGeneralMessage("Timer ended, you can now attack/be-attacked again."), (EntityPlayerMP)entry.getValue().entity);
+ }
}
- recentlyLeftBattle.remove(c.entity.getEntityId());
}
}
}