/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.petah.spring.bai.group; import com.springrts.ai.oo.AIFloat3; import com.springrts.ai.oo.clb.Unit; import com.springrts.ai.oo.clb.WeaponDef; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.petah.common.util.profiler.Profiler; import org.petah.spring.bai.AIReturnCode; import org.petah.spring.bai.cache.CachedUnit; import org.petah.spring.bai.delegate.AIDelegate; import org.petah.spring.bai.listener.DamageEventListener; import org.petah.spring.bai.listener.UnitEventListener; import org.petah.spring.bai.listener.UpdateEventListener; import org.petah.spring.bai.tasks.Task; /** * * @author Petah */ public abstract class GroupManager implements UnitEventListener, DamageEventListener, UpdateEventListener { // Properties protected AIDelegate aiDelegate; private Map<String, UnitGroup> groups = new ConcurrentHashMap<String, UnitGroup>(); // Constructors public GroupManager(AIDelegate aiDelegate) { Profiler.start(getClass(), "GroupManager()"); this.aiDelegate = aiDelegate; initGroups(); // aiDelegate.getAIEventHandler().addUnitEventListener(this); // aiDelegate.getAIEventHandler().addDamageEventListener(this); // aiDelegate.getAIEventHandler().addUpdateEventListener(this); Profiler.stop(getClass(), "GroupManager()"); } // Abstract methods public abstract void initGroups(); public abstract void groupUnit(CachedUnit unit); // Private methods private int addUnit(Unit unit) { CachedUnit cachedUnit = aiDelegate.getCachedUnit(unit.getUnitId()); if (cachedUnit == null) { return AIReturnCode.UNIT_NOT_CACHED; } groupUnit(cachedUnit); return AIReturnCode.NORMAL; } private int removeUnit(Unit unit) { for (UnitGroup group : groups.values()) { group.removeUnit(unit.getUnitId()); } return AIReturnCode.NORMAL; } // Public methods public void addGroup(UnitGroup group, Task... initialTasks) { for (Task task : initialTasks) { group.addTask(task); } addGroup(group); } public void addGroup(UnitGroup group) { groups.put(group.getName().toLowerCase(), group); } public void update(int frame) { // Use an iterator to get the key (group name) for profiling Iterator<String> i = groups.keySet().iterator(); while (i.hasNext()) { String groupName = i.next(); UnitGroup group = groups.get(groupName); Profiler.start(GroupManager.class, aiDelegate.getPrefix() + groupName + ".update()"); group.update(frame); Profiler.stop(GroupManager.class, aiDelegate.getPrefix() + groupName + ".update()"); } } public UnitGroup getGroup(String name) { name = name.toLowerCase(); return groups.get(name); } // Getters public Map<String, UnitGroup> getGroups() { return groups; } // Implemented methods public void unitCaptured(Unit unit, int oldTeamId, int newTeamId) { addUnit(unit); } public void unitCreated(Unit unit, Unit builder) { addUnit(unit); } public void unitFinished(Unit unit) { addUnit(unit); } public void unitGiven(Unit unit, int oldTeamId, int newTeamId) { addUnit(unit); } public void enemyDamaged(Unit enemy, Unit attacker, float damage, AIFloat3 dir, WeaponDef weaponDef, boolean paralyzer) { } public void enemyDestroyed(Unit enemy, Unit attacker) { } public void unitDamaged(Unit unit, Unit attacker, float damage, AIFloat3 dir, WeaponDef weaponDef, boolean paralyzer) { } public void unitDestroyed(Unit unit, Unit attacker) { removeUnit(unit); } }