테스트

aion-server 4.8

Gitteol
최고관리자 · 1 · 💬 0 클론/새로받기
 4.8 61f661d · 1 commits 새로받기(Pull)
game-server/data/handlers/ai/instance/padmarashkasCave/PadmarashkaAI.java
package ai.instance.padmarashkasCave;

import java.util.List;
import java.util.concurrent.Future;

import com.aionemu.commons.utils.Rnd;
import com.aionemu.gameserver.ai.AIName;
import com.aionemu.gameserver.ai.AIState;
import com.aionemu.gameserver.ai.HpPhases;
import com.aionemu.gameserver.model.EmotionType;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.state.CreatureState;
import com.aionemu.gameserver.network.aion.serverpackets.SM_EMOTION;
import com.aionemu.gameserver.skillengine.SkillEngine;
import com.aionemu.gameserver.skillengine.effect.AbnormalState;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.ThreadPoolManager;

import ai.AggressiveNpcAI;

/**
 * @author Ritsu, Luzien
 */
@AIName("padmarashka")
public class PadmarashkaAI extends AggressiveNpcAI implements HpPhases.PhaseHandler {

	private final HpPhases hpPhases = new HpPhases(95, 50, 25);
	private boolean isStart = false;
	private boolean canThink = false;
	private Future<?> mainSkillTask;

	public PadmarashkaAI(Npc owner) {
		super(owner);
	}

	@Override
	protected void handleSpawned() {
		super.handleSpawned();
		putToSleep();
	}

	@Override
	protected void handleAttack(Creature creature) {
		if (!this.getEffectController().hasAbnormalEffect(19186) && !isStart) {
			wakeUp();
		}
		super.handleAttack(creature);
		hpPhases.tryEnterNextPhase(this);
	}

	@Override
	protected void handleCreatureAggro(Creature creature) {
		if (!this.getEffectController().hasAbnormalEffect(19186) && !isStart) {
			wakeUp();
		}
		super.handleCreatureAggro(creature);
	}

	private void wakeUp() {
		canThink = true;
		isStart = true;
		scheduleSpawnEntrance();
		startMainSkillTask();
	}

	private void startMainSkillTask() {
		mainSkillTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable() {

			@Override
			public void run() {
				SkillEngine.getInstance().getSkill(getOwner(), Rnd.nextInt(2) == 0 ? 20401 : 20093, 48, getTarget()).useNoAnimationSkill();
			}
		}, 10000, 20000);
	}

	@Override
	public void handleHpPhase(int phaseHpPercent) {
		switch (phaseHpPercent) {
			case 95 -> stage1();
			case 50 -> stage2();
			case 25 -> stage3();
		}
	}

	private void scheduleSpawnEntrance() {
		int delay = 60000;
		if (isDead() || !isStart)
			return;
		else {
			getOwner().clearAttackedCount();
			int count = Rnd.get(1, 3);
			for (int i = 0; i < count; i++) {
				int npcId = 282792 + Rnd.nextInt(5);
				attackPlayer((Npc) spawn(npcId, 531.465f + Rnd.get(-5, 5), 316.921f + Rnd.get(-5, 5), 65.351f, (byte) 105));
			}
			scheduleDelayEntrance(delay);
		}
	}

	private void attackPlayer(final Npc npc) {
		ThreadPoolManager.getInstance().schedule(new Runnable() {

			@Override
			public void run() {
				npc.setTarget(getTarget());
				npc.getAi().setStateIfNot(AIState.WALKING);
				npc.setState(CreatureState.ACTIVE, true);
				npc.getMoveController().moveToTargetObject();
				PacketSendUtility.broadcastPacket(npc, new SM_EMOTION(npc, EmotionType.CHANGE_SPEED, 0, npc.getObjectId()));
			}
		}, 1000);
	}

	private void stage1() {
		int delay = 60000;
		if (isDead() || !isStart)
			return;
		else {
			SkillEngine.getInstance().getSkill(getOwner(), 19177, 55, getOwner()).useNoAnimationSkill();
			switch (Rnd.get(1, 10)) {
				case 1:
					spawn(282613, 575.064f, 163.573f, 66.01f, (byte) 0);
					break;
				case 2:
					spawn(282613, 587.361f, 165.187f, 66.01f, (byte) 0);
					break;
				case 3:
					spawn(282613, 577.463f, 155.553f, 66.01f, (byte) 0);
					break;
				case 4:
					spawn(282613, 582.064f, 160.785f, 66.01f, (byte) 0);
					break;
				case 5:
					spawn(282613, 586.160f, 157.214f, 66.01f, (byte) 0);
					break;
				case 6:
					spawn(282613, 571.436f, 150.558f, 66.01f, (byte) 0);
					break;
				case 7:
					spawn(282613, 577.574f, 150.415f, 66.01f, (byte) 0);
					break;
				case 8:
					spawn(282613, 581.354f, 151.640f, 66.01f, (byte) 0);
					break;
				case 9:
					spawn(282613, 589.382f, 149.758f, 66.01f, (byte) 0);
					break;
				case 10:
					spawn(282613, 583.469f, 145.809f, 66.01f, (byte) 0);
					break;

			}
			scheduleDelayStage1(delay);
			if (getPosition().getWorldMapInstance().getNpc(218675) == null) {
				spawn(218675, 573.413f, 179.518f, 66.220f, (byte) 30);
			} else if (getPosition().getWorldMapInstance().getNpc(218676) == null) {
				spawn(218676, 581.827f, 179.587f, 66.250f, (byte) 30);
			}
		}
	}

	private void stage2() {
		int delay = 120000;
		if (isDead() || !isStart)
			return;
		else {
			PacketSendUtility.broadcastToMap(getOwner(), 1401214); // Huge egg is revealed
			switch (Rnd.get(1, 4)) {
				case 1:
					spawn(282614, 510.12497f, 250.17401f, 66.625f, (byte) 0);
					break;
				case 2:
					spawn(282614, 530.1312f, 170.20688f, 65.875f, (byte) 0);
					break;
				case 3:
					spawn(282614, 610.32495f, 210.19055f, 66.125f, (byte) 0);
					break;
				case 4:
					spawn(282614, 590.1816f, 290.31775f, 66.75f, (byte) 0);
					break;
			}
			scheduleDelayStage2(delay);
		}
	}

	private void stage3() { // Spawn Rock
		SkillEngine.getInstance().getSkill(getOwner(), 19179, 55, getOwner()).useNoAnimationSkill();
		PacketSendUtility.broadcastToMap(getOwner(), 1401215); // Cave crumble
		spawn(282140, 520.99585f, 270.23776f, 66.25f, (byte) 0);
		spawn(282140, 506.8137f, 238.60612f, 66.57414f, (byte) 0);
		spawn(282140, 495.94504f, 218.84671f, 67.58238f, (byte) 0);
		spawn(282140, 502.39307f, 196.61835f, 67.5513f, (byte) 0);
		spawn(282140, 510.88928f, 178.31491f, 66.869156f, (byte) 0);
		spawn(282140, 530.8308f, 160.27686f, 65.926926f, (byte) 0);
		spawn(282140, 551.6416f, 145.72856f, 67.93133f, (byte) 0);
		spawn(282140, 567.2481f, 162.51135f, 66.09399f, (byte) 0);
		spawn(282140, 585.17523f, 188.57863f, 66.125f, (byte) 0);
		spawn(282140, 611.51733f, 186.78618f, 66.25f, (byte) 0);
		spawn(282140, 624.74023f, 205.0654f, 66.255615f, (byte) 0);
		spawn(282140, 627.2288f, 228.05437f, 66.3268f, (byte) 0);
		spawn(282140, 619.18396f, 258.662f, 69.37874f, (byte) 0);
		spawn(282140, 604.1967f, 284.47342f, 66.71312f, (byte) 0);
		spawn(282140, 589.62775f, 293.01245f, 66.75f, (byte) 0);
		spawn(282140, 599.13367f, 264.5496f, 66.25f, (byte) 0);
		spawn(282140, 517.9813f, 220.19554f, 66.86278f, (byte) 0);
		spawn(282140, 533.5666f, 194.63768f, 66.125f, (byte) 0);
	}

	private void scheduleDelayStage2(int delay) {
		if (!isStart && !isDead())
			return;
		else {
			ThreadPoolManager.getInstance().schedule(new Runnable() {

				@Override
				public void run() {
					stage2();
				}
			}, delay);
		}
	}

	private void scheduleDelayStage1(int delay) {
		if (!isStart && !isDead())
			return;
		else {
			ThreadPoolManager.getInstance().schedule(new Runnable() {

				@Override
				public void run() {
					stage1();
				}
			}, delay);
		}
	}

	private void scheduleDelayEntrance(int delay) {
		if (!isStart && !isDead())
			return;
		else {
			ThreadPoolManager.getInstance().schedule(new Runnable() {

				@Override
				public void run() {
					scheduleSpawnEntrance();
				}
			}, delay);
		}
	}

	private void putToSleep() {
		SkillEngine.getInstance().getSkill(getOwner(), 19186, 55, getOwner()).useNoAnimationSkill();
		this.getEffectController().setAbnormal(AbnormalState.SLEEP);
		canThink = false;
	}

	private void spawnPadmaProtector() {
		spawn(218670, 533.107f, 247.685f, 66.761f, (byte) 45);
		spawn(218671, 581.092f, 265.049f, 66.843f, (byte) 15);
		spawn(218673, 547.838f, 264.624f, 66.875f, (byte) 45);
		spawn(218674, 595.748f, 248.045f, 66.250f, (byte) 15);
	}

	private void deSpawnNpcs() {
		// Despawn Stage 3
		despawnNpcs(282140);
		// Despawn Stage 2
		despawnNpcs(282614);
		despawnNpcs(282712);
		despawnNpcs(282620);
		// Despawn Stage 1
		despawnNpcs(282613);
		despawnNpcs(218675);
		despawnNpcs(218676);
		despawnNpcs(282715);
		despawnNpcs(282716);
		// Despawn Entrance mobs
		despawnNpcs(282792);
		despawnNpcs(282793);
		despawnNpcs(282794);
		despawnNpcs(282795);
		despawnNpcs(282796);
		// Despawn Padma Protector
		despawnNpcs(218670);
		despawnNpcs(218671);
		despawnNpcs(218673);
		despawnNpcs(218674);
	}

	private void despawnNpcs(int npcId) {
		List<Npc> npcs = getPosition().getWorldMapInstance().getNpcs(npcId);
		for (Npc npc : npcs) {
			if (npc != null) {
				npc.getController().delete();
			}
		}
	}

	private void cancelTask() {
		if (mainSkillTask != null && !mainSkillTask.isDone())
			mainSkillTask.cancel(true);
	}

	@Override
	protected void handleBackHome() {
		super.handleBackHome();
		isStart = false;
		hpPhases.reset();
		cancelTask();
		deSpawnNpcs();
		putToSleep();
		spawnPadmaProtector();
	}

	@Override
	protected void handleDied() {
		super.handleDied();
		cancelTask();
		isStart = false;
		deSpawnNpcs();
	}

	@Override
	protected void handleDespawned() {
		super.handleDespawned();
		cancelTask();
		deSpawnNpcs();
	}

	@Override
	public boolean canThink() {
		return canThink;
	}
}

📎 첨부파일

댓글 작성 권한이 없습니다.
🏆 포인트 랭킹 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