테스트

aion-server 4.8

Gitteol
최고관리자 · 1 · 💬 0 클론/새로받기
 4.8 61f661d · 1 commits 새로받기(Pull)
game-server/src/com/aionemu/gameserver/ai/manager/SimpleAttackManager.java
package com.aionemu.gameserver.ai.manager;

import com.aionemu.gameserver.ai.AILogger;
import com.aionemu.gameserver.ai.AIState;
import com.aionemu.gameserver.ai.NpcAI;
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.model.gameobjects.VisibleObject;
import com.aionemu.gameserver.utils.PositionUtil;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.world.geo.GeoService;

/**
 * @author ATracer
 */
public class SimpleAttackManager {

	/**
	 * @param npcAI
	 * @param delay
	 */
	public static void performAttack(NpcAI npcAI, int delay) {
		if (npcAI.isLogging()) {
			AILogger.info(npcAI, "performAttack");
		}
		if (npcAI.getOwner().getGameStats().isNextAttackScheduled()) {
			if (npcAI.isLogging()) {
				AILogger.info(npcAI, "Attack already scheduled");
			}
			scheduleCheckedAttackAction(npcAI, delay);
			return;
		}

		npcAI.getOwner().getGameStats().setNextAttackTime(System.currentTimeMillis() + delay);
		if (delay > 0) {
			ThreadPoolManager.getInstance().schedule(() -> attackAction(npcAI), delay);
		} else {
			attackAction(npcAI);
		}
	}

	/**
	 * @param npcAI
	 * @param delay
	 */
	private static void scheduleCheckedAttackAction(NpcAI npcAI, int delay) {
		if (delay < 2000) {
			delay = 2000;
		}
		if (npcAI.isLogging()) {
			AILogger.info(npcAI, "Scheduling checked attack " + delay);
		}
		ThreadPoolManager.getInstance().schedule(new SimpleCheckedAttackAction(npcAI), delay);
	}

	public static boolean isTargetInAttackRange(Npc npc) {
		VisibleObject target = npc.getTarget();
		if (!(target instanceof Creature))
			return false;
		return PositionUtil.isInAttackRange(npc, (Creature) target, npc.getGameStats().getAttackRange().getCurrent() / 1000f);
	}

	/**
	 * @param npcAI
	 */
	protected static void attackAction(final NpcAI npcAI) {
		if (!npcAI.isInState(AIState.FIGHT)) {
			return;
		}
		if (npcAI.isLogging()) {
			AILogger.info(npcAI, "attackAction");
		}
		Npc npc = npcAI.getOwner();
		Creature target;
		if (npc.getTarget() instanceof Creature && !(target = (Creature) npc.getTarget()).isDead()) {
			Creature mostHated = npc.getAggroList().getMostHated();
			if (mostHated != null && !mostHated.isDead() && !target.equals(mostHated)) {
				npcAI.onCreatureEvent(AIEventType.TARGET_CHANGED, mostHated);
			} else if (!npc.canSee(target)) {
				npc.getController().abortCast();
				npcAI.onGeneralEvent(AIEventType.TARGET_TOOFAR);
			} else if (!isTargetInAttackRange(npc)) {
				npcAI.onGeneralEvent(AIEventType.TARGET_TOOFAR);
			} else if (!GeoService.getInstance().canSee(npc, target)) { // delete geo check when we've implemented a pathfinding system
				npc.getController().cancelCurrentSkill(null);
				if (((System.currentTimeMillis() - npc.getMoveController().getLastMoveUpdate()) > 15000)
					&& npc.getGameStats().getLastAttackedTimeDelta() > 15) {
					npcAI.onGeneralEvent(AIEventType.TARGET_GIVEUP);
				} else {
					npcAI.onGeneralEvent(AIEventType.ATTACK_COMPLETE);
				}
			} else {
				if (npc.isSpawned() && !npc.isDead() && !npc.getLifeStats().isAboutToDie() && npc.canAttack()) {
					npc.getPosition().setH(PositionUtil.getHeadingTowards(npc, target));
					npc.getController().attackTarget(target, 0, true);
				}
				npcAI.onGeneralEvent(AIEventType.ATTACK_COMPLETE);
			}
		} else {
			npcAI.onGeneralEvent(AIEventType.TARGET_GIVEUP);
		}
	}

	private final static class SimpleCheckedAttackAction implements Runnable {

		private NpcAI npcAI;

		SimpleCheckedAttackAction(NpcAI npcAI) {
			this.npcAI = npcAI;
		}

		@Override
		public void run() {
			if (!npcAI.getOwner().getGameStats().isNextAttackScheduled()) {
				attackAction(npcAI);
			} else {
				if (npcAI.isLogging()) {
					AILogger.info(npcAI, "Scheduled checked attacked confirmed");
				}
			}
			npcAI = null;
		}

	}

}

📎 첨부파일

댓글 작성 권한이 없습니다.
🏆 포인트 랭킹 TOP 10
순위 닉네임 포인트
1 no_profile 타키야겐지쪽지보내기 자기소개 아이디로 검색 전체게시물 102,949
2 no_profile 동가리쪽지보내기 자기소개 아이디로 검색 전체게시물 63,733
3 no_profile 라프텔쪽지보내기 자기소개 아이디로 검색 전체게시물 51,771
4 no_profile 불멸의행복쪽지보내기 자기소개 아이디로 검색 전체게시물 36,923
5 서번트쪽지보내기 자기소개 아이디로 검색 전체게시물 35,011
6 no_profile 닥터스쪽지보내기 자기소개 아이디로 검색 전체게시물 29,470
7 no_profile 검은고양이쪽지보내기 자기소개 아이디로 검색 전체게시물 29,077
8 no_profile Revolution쪽지보내기 자기소개 아이디로 검색 전체게시물 28,199
9 no_profile 보거스쪽지보내기 자기소개 아이디로 검색 전체게시물 26,731
10 no_profile 호롤롤로쪽지보내기 자기소개 아이디로 검색 전체게시물 17,020
알림 0