package ai;
import com.aionemu.gameserver.ai.AIName;
import com.aionemu.gameserver.ai.AIState;
import com.aionemu.gameserver.ai.event.AIEventType;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.utils.PositionUtil;
import com.aionemu.gameserver.world.geo.GeoService;
/**
* @author Rolandas, Neon
*/
@AIName("simple_abyssguard")
public class AbyssGuardSimpleAI extends AggressiveNpcAI {
public AbyssGuardSimpleAI(Npc owner) {
super(owner);
}
@Override
protected boolean canHandleEvent(AIEventType eventType) {
switch (eventType) {
case CREATURE_MOVED:
return getState() != AIState.FIGHT;
}
return super.canHandleEvent(eventType);
}
@Override
protected void handleCreatureSee(Creature creature) {
if (creature instanceof Npc)
checkAggro(((Npc) creature)); // custom checkAggro for npc vs npc
else
super.handleCreatureSee(creature); // calls CreatureEventHandler.checkAggro
}
@Override
protected void handleCreatureMoved(Creature creature) {
if (creature instanceof Npc)
checkAggro(((Npc) creature)); // custom checkAggro for npc vs npc
else
super.handleCreatureMoved(creature); // calls CreatureEventHandler.checkAggro
}
@Override
protected boolean handleGuardAgainstAttacker(Creature attacker) {
return false;
}
private void checkAggro(Npc npc) {
if (isInState(AIState.FIGHT))
return;
if (isInState(AIState.RETURNING))
return;
Npc owner = getOwner();
if (npc.isDead() || !owner.canSee(npc))
return;
if (!owner.isEnemy(npc) || npc.getLevel() < 2)
return;
// ignore npcs which are under attack
if (npc.getTarget() != null)
return;
if (!owner.getPosition().isMapRegionActive())
return;
if (PositionUtil.isInRange(owner, npc, owner.getAggroRange()) && GeoService.getInstance().canSee(owner, npc))
onCreatureEvent(AIEventType.CREATURE_AGGRO, npc);
}
}