package ai; import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.ai.AIState; import com.aionemu.gameserver.ai.AttackIntention; import com.aionemu.gameserver.ai.NpcAI; import com.aionemu.gameserver.ai.event.AIEventType; import com.aionemu.gameserver.ai.handler.*; import com.aionemu.gameserver.ai.manager.SkillAttackManager; import com.aionemu.gameserver.dataholders.DataManager; import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.Npc; import com.aionemu.gameserver.model.gameobjects.VisibleObject; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.skill.NpcSkillEntry; /** * @author ATracer */ @AIName("general") public class GeneralNpcAI extends NpcAI { public GeneralNpcAI(Npc owner) { super(owner); } @Override public void think() { ThinkEventHandler.onThink(this); } @Override protected void handleAttack(Creature creature) { AttackEventHandler.onAttack(this, creature); } @Override protected boolean handleCreatureNeedsSupport(Creature creature) { return AggroEventHandler.onCreatureNeedsSupport(this, creature); } @Override protected void handleCreatureNotSee(Creature creature) { if (creature.equals(getTarget())) { getOwner().getController().abortCast(); onGeneralEvent(AIEventType.TARGET_TOOFAR); } } @Override protected void handleDialogStart(Player player) { TalkEventHandler.onTalk(this, player); } @Override protected void handleDialogFinish(Player creature) { TalkEventHandler.onFinishTalk(this, creature); } @Override protected void handleFinishAttack() { AttackEventHandler.onFinishAttack(this); } @Override protected void handleAttackComplete() { AttackEventHandler.onAttackComplete(this); } @Override protected void handleNotAtHome() { ReturningEventHandler.onNotAtHome(this); } @Override protected void handleBackHome() { ReturningEventHandler.onBackHome(this); } @Override protected void handleTargetTooFar() { TargetEventHandler.onTargetTooFar(this); } @Override protected void handleTargetGiveup() { TargetEventHandler.onTargetGiveup(this); } @Override protected void handleTargetChanged(Creature creature) { super.handleTargetChanged(creature); TargetEventHandler.onTargetChange(this, creature); } @Override protected void handleMoveArrived() { super.handleMoveArrived(); MoveEventHandler.onMoveArrived(this); } @Override public void handleCreatureDetected(Creature creature) { getOwner().getPosition().getWorldMapInstance().getInstanceHandler().onCreatureDetected(getOwner(), creature); } @Override protected boolean canHandleEvent(AIEventType eventType) { switch (eventType) { case CREATURE_NEEDS_SUPPORT: return (getState() == AIState.IDLE || getState() == AIState.WALKING) && DataManager.TRIBE_RELATIONS_DATA.hasSupportRelations( getOwner().getTribe()); } return super.canHandleEvent(eventType); } @Override public AttackIntention chooseAttackIntention() { VisibleObject currentTarget = getTarget(); Creature mostHated = getAggroList().getMostHated(); if (mostHated == null || mostHated.isDead()) return AttackIntention.FINISH_ATTACK; if (currentTarget == null) onCreatureEvent(AIEventType.TARGET_CHANGED, mostHated); if (chooseSkillAttack(getOwner().getObjectTemplate().getAttackRange() == 0)) return AttackIntention.SKILL_ATTACK; return AttackIntention.SIMPLE_ATTACK; } protected final boolean chooseSkillAttack(boolean alwaysRandomSkill) { NpcSkillEntry skill = alwaysRandomSkill ? getOwner().getSkillList().getRandomSkill() : SkillAttackManager.chooseNextSkill(this); if (skill != null) { getOwner().getGameStats().setLastSkill(skill); if (skill.equals(getOwner().getQueuedSkills().peek())) getOwner().getQueuedSkills().poll(); return true; } return false; } }