import server.life.MapleMonster; //导入方法依赖的package包/类
/**
* Automagically finds a new controller for the given monster from the chars
* on the map...
*
* @param monster
*/
public final void updateMonsterController(final MapleMonster monster) {
if (!monster.isAlive() || monster.getLinkCID() > 0 || monster.getStats().isEscort()) {
return;
}
if (monster.getController() != null) {
if (monster.getController().getMap() != this || monster.getController().getTruePosition().distanceSq(monster.getTruePosition()) > monster.getRange()) {
monster.getController().stopControllingMonster(monster);
} else { // Everything is fine :)
return;
}
}
int mincontrolled = -1;
MapleCharacter newController = null;
charactersLock.readLock().lock();
try {
final Iterator ltr = characters.iterator();
MapleCharacter chr;
while (ltr.hasNext()) {
chr = ltr.next();
if (!chr.isHidden() && !chr.isClone() && (chr.getControlledSize() < mincontrolled || mincontrolled == -1) && chr.getTruePosition().distanceSq(monster.getTruePosition()) <= monster.getRange()) {
mincontrolled = chr.getControlledSize();
newController = chr;
}
}
} finally {
charactersLock.readLock().unlock();
}
if (newController != null) {
if (monster.isFirstAttack()) {
newController.controlMonster(monster, true);
monster.setControllerHasAggro(true);
} else {
newController.controlMonster(monster, false);
}
}
}