테스트

aion-server 4.8

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

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

import com.aionemu.commons.utils.Rnd;
import com.aionemu.gameserver.ai.AIState;
import com.aionemu.gameserver.instance.handlers.GeneralInstanceHandler;
import com.aionemu.gameserver.instance.handlers.InstanceID;
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.player.Player;
import com.aionemu.gameserver.model.gameobjects.state.CreatureState;
import com.aionemu.gameserver.network.aion.serverpackets.SM_EMOTION;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.world.WorldMapInstance;
import com.aionemu.gameserver.world.zone.ZoneInstance;
import com.aionemu.gameserver.world.zone.ZoneName;

/**
 * @author Cheatkiller
 */
@InstanceID(300510000)
public class TiamatStrongHoldInstance extends GeneralInstanceHandler {

	private final AtomicInteger drakans = new AtomicInteger();
	private final AtomicBoolean startSuramaEvent = new AtomicBoolean();
	private boolean isInstanceDestroyed;

	public TiamatStrongHoldInstance(WorldMapInstance instance) {
		super(instance);
	}

	@Override
	public void onDie(Npc npc) {
		if (isInstanceDestroyed) {
			return;
		}
		switch (npc.getNpcId()) {
			case 730612:
				firstWave();
				break;
			case 219373:// ex 219421
			case 219369:// ex 219417
			case 219411:// ex 219459
			case 219370:// ex 219418
				int killedDrakans = drakans.incrementAndGet();
				if (killedDrakans == 5)
					secondWave();
				else if (killedDrakans == 12)
					thirdWave();
				break;
			case 219352: // ex 219400
				sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
				spawn(283177, 1175.65f, 1069.08f, 498.52f, (byte) 0); // ex 283913
				spawn(701501, 1075.4409f, 1078.5071f, 787.685f, (byte) 16);
				instance.setDoorState(48, true);
				spawnKahrun();
				break;
			case 219357:// ex 219405
				sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
				spawn(701501, 1077.1716f, 1058.1995f, 787.685f, (byte) 61);
				instance.setDoorState(37, true);
				break;
			case 219358:// ex 219406
				sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
				spawn(701541, 677.35785f, 1069.5361f, 499.86716f, (byte) 0);
				spawn(701527, 1073.948f, 1068.8732f, 787.685f, (byte) 61);
				spawn(730622, 652.4821f, 1069.0302f, 498.7787f, (byte) 0, 82);
				spawn(283178, 679.88f, 1068.88f, 504.2f, (byte) 119);// ex 283916
				spawnExitIfCleared();
				break;
			case 219353:// ex 219401
				sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
				spawn(701501, 1071.5909f, 1040.6797f, 787.685f, (byte) 23);
				instance.setDoorState(711, true);
				break;
			case 219354:// ex 219402
				sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
				spawn(283179, 1030.03f, 301.83f, 411f, (byte) 26);// ex 283914
				spawn(701501, 1086.274f, 1098.3997f, 787.685f, (byte) 90);
				spawn(730622, 1029.792f, 267.0502f, 409.7982f, (byte) 0, 83);
				spawnExitIfCleared();
				break;
			case 219355:// ex 219403
				sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
				spawn(701501, 1063.5973f, 1092.7402f, 787.685f, (byte) 107);
				instance.setDoorState(51, true);
				instance.setDoorState(54, true);
				instance.setDoorState(78, true);
				instance.setDoorState(11, true);
				instance.setDoorState(79, true);
				break;
			case 219356:// ex 219404
				sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
				spawn(701501, 1099.8691f, 1047.1895f, 787.685f, (byte) 64);
				spawn(730622, 644.4221f, 1319.6221f, 488.7422f, (byte) 0, 15);
				spawn(800438, 665.63409f, 1319.7051f, 487.9f, (byte) 61);
				spawn(283180, 629.1f, 1319.5f, 501.2f, (byte) 0);// ex 283915
				spawnExitIfCleared();
				break;
		}
	}

	private void firstWave() {
		ThreadPoolManager.getInstance().schedule(() -> {
			attackPlayer((Npc) spawn(219373, 1505.09f, 1068.54f, 491.38f, (byte) 0));
			attackPlayer((Npc) spawn(219369, 1510.54f, 1058.04f, 491.5f, (byte) 0));
			attackPlayer((Npc) spawn(219411, 1517.38f, 1063.5f, 491.52f, (byte) 0));
			attackPlayer((Npc) spawn(219411, 1516.81f, 1073.6f, 491.52f, (byte) 0));
			attackPlayer((Npc) spawn(219369, 1510.41f, 1078.8f, 491.52f, (byte) 0));
		}, 5000);
	}

	private void secondWave() {
		attackPlayer((Npc) spawn(219370, 1426.08f, 1068.41f, 491.38f, (byte) 0));
		attackPlayer((Npc) spawn(219369, 1430.3f, 1061.13f, 491.5f, (byte) 0));
		attackPlayer((Npc) spawn(219411, 1428.5f, 1056.6f, 491.52f, (byte) 0));
		attackPlayer((Npc) spawn(219411, 1439.49f, 1058.5f, 491.4f, (byte) 0));
		attackPlayer((Npc) spawn(219369, 1430.3f, 1075.49f, 491.52f, (byte) 0));
		attackPlayer((Npc) spawn(219411, 1439.4f, 1078.6f, 491.4f, (byte) 0));
		attackPlayer((Npc) spawn(219411, 1428.5f, 1080.9f, 491.46f, (byte) 0));
	}

	private void thirdWave() {
		attackPlayer((Npc) spawn(219370, 1296.1f, 1068.3f, 491.38f, (byte) 0));
		attackPlayer((Npc) spawn(219411, 1290.9f, 1059.13f, 491.5f, (byte) 0));
		attackPlayer((Npc) spawn(219369, 1300.6f, 1056.4f, 491.52f, (byte) 0));
		attackPlayer((Npc) spawn(219411, 1302.78f, 1053.55f, 491.4f, (byte) 0));
		attackPlayer((Npc) spawn(219411, 1290.94f, 1077.8f, 491.52f, (byte) 0));
		attackPlayer((Npc) spawn(219369, 1300.6f, 1080.3f, 491.4f, (byte) 0));
		attackPlayer((Npc) spawn(219411, 1302.78f, 1082.8f, 491.5f, (byte) 0));
	}

	private void attackPlayer(final Npc npc) {
		ThreadPoolManager.getInstance().schedule(() -> {
			if (!isInstanceDestroyed) {
				for (Player player : instance.getPlayersInside()) {
					npc.setTarget(player);
					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()));
				}
			}
		}, 2000);
	}

	private void spawnKahrun() {
		ThreadPoolManager.getInstance().schedule(() -> {
			moveToForward((Npc) spawn(800463, 1201.272f, 1074.5463f, 491f, (byte) 61), 1039.5f, 1075.9f, 497.3f, false);
			moveToForward((Npc) spawn(800463, 1201.272f, 1072.5137f, 491f, (byte) 61), 1130, 1072, 497.3f, false);
			moveToForward((Npc) spawn(800463, 1192.8656f, 1071.1085f, 491f, (byte) 61), 1112, 1070, 497, false);
			moveToForward((Npc) spawn(800463, 1201.272f, 1064.1759f, 491f, (byte) 61), 1039, 1061, 497.3f, false);
			moveToForward((Npc) spawn(800463, 1208.4175f, 1071.1797f, 491f, (byte) 61), 1133, 1072.5f, 497.3f, false);
			moveToForward((Npc) spawn(800463, 1192.8656f, 1068.3411f, 491f, (byte) 61), 1114, 1067, 496.7f, false);
			moveToForward((Npc) spawn(800463, 1208.4175f, 1068.3979f, 491f, (byte) 61), 1133.32f, 1066.47f, 497.3f, false);
			moveToForward((Npc) spawn(800463, 1201.272f, 1066.2085f, 491f, (byte) 61), 1128.8f, 1067, 497.3f, false);
			moveToForward((Npc) spawn(800380, 1190.323f, 1068.1558f, 491.03488f, (byte) 61), 1108, 1066, 497.3f, false);
			moveToForward((Npc) spawn(800374, 1188.4259f, 1066.4757f, 491.55029f, (byte) 61), 1094, 1064, 497.4f, true);
			moveToForward((Npc) spawn(800374, 1188.2158f, 1074.2047f, 491.55029f, (byte) 61), 1092.5f, 1074.6f, 497.4f, true);
			moveToForward((Npc) spawn(800376, 1190.3859f, 1071.6548f, 491.03488f, (byte) 61), 1109, 1073, 497.2f, false);
			moveToForward((Npc) spawn(800461, 1184.7582f, 1068.6f, 491.03488f, (byte) 61), 1111, 1068.6f, 497.33f, false);
			moveToForward((Npc) spawn(800460, 1184.7358f, 1070.77f, 491.03488f, (byte) 61), 1111, 1071, 497, false);
			moveToForward((Npc) spawn(800347, 1178.0425f, 1072.28f, 491.02545f, (byte) 61), 1106, 1072, 497.2f, false);
			moveToForward((Npc) spawn(800336, 1178.0559f, 1069.6f, 491.02545f, (byte) 61), 1104, 1069, 497, true);
		}, 7000);
	}

	private void moveToForward(final Npc npc, float x, float y, float z, boolean despawn) {
		npc.getAi().setStateIfNot(AIState.WALKING);
		npc.setState(CreatureState.ACTIVE, true);
		npc.getMoveController().moveToPoint(x, y, z);
		PacketSendUtility.broadcastPacket(npc, new SM_EMOTION(npc, EmotionType.CHANGE_SPEED, 0, npc.getObjectId()));
		if (despawn) {
			ThreadPoolManager.getInstance().schedule(() -> {
				if (npc.getNpcId() == 800336) {
					spawn(800338, 1104, 1069f, 497, (byte) 61);
					Npc kahrun = getNpc(800338);
					PacketSendUtility.broadcastMessage(kahrun, 1500599, 1000);
					PacketSendUtility.broadcastMessage(kahrun, 1500600, 5000);
				}
				npc.getController().delete();
			}, 13000);
		}
	}

	private void spawnColonels() {
		switch (Rnd.nextInt(4)) {
			case 0:
				spawn(219364, 763.4179f, 1445.6504f, 495.6519f, (byte) 90);
				spawn(219395, 893.7009f, 1445.4846f, 495.6421f, (byte) 90);
				spawn(219395, 893.3f, 1190.71f, 495.6f, (byte) 30);
				spawn(219395, 762.6f, 1192.1f, 495.6f, (byte) 30);
				break;
			case 1:
				spawn(219395, 763.4179f, 1445.6504f, 495.6519f, (byte) 90);
				spawn(219364, 893.7009f, 1445.4846f, 495.6421f, (byte) 90);
				spawn(219395, 893.3f, 1190.71f, 495.6f, (byte) 30);
				spawn(219395, 762.6f, 1192.1f, 495.6f, (byte) 30);
				break;
			case 2:
				spawn(219395, 763.4179f, 1445.6504f, 495.6519f, (byte) 90);
				spawn(219395, 893.7009f, 1445.4846f, 495.6421f, (byte) 90);
				spawn(219364, 893.3f, 1190.71f, 495.6f, (byte) 30);
				spawn(219395, 762.6f, 1192.1f, 495.6f, (byte) 30);
				break;
			case 3:
				spawn(219395, 763.4179f, 1445.6504f, 495.6519f, (byte) 90);
				spawn(219395, 893.7009f, 1445.4846f, 495.6421f, (byte) 90);
				spawn(219395, 893.3f, 1190.71f, 495.6f, (byte) 30);
				spawn(219364, 762.6f, 1192.1f, 495.6f, (byte) 30);
				break;
		}
	}

	private void spawnExitIfCleared() {
		if (instance.getNpcs(219354, 219356, 219358).stream().allMatch(Creature::isDead)) {
			spawn(800464, 1119.7076f, 1071.1401f, 496.8615f, (byte) 119);
			spawn(800465, 1119.7421f, 1068.4998f, 496.8616f, (byte) 3);
			spawn(730629, 1121.3807f, 1069.8124f, 500.3319f, (byte) 0, 555);
		}
	}

	@Override
	public void onEnterZone(Player player, ZoneInstance zone) {
		if (zone.getAreaTemplate().getZoneName() == ZoneName.get("LAKSYAKA_LEGION_HQ_300510000")) {
			if (startSuramaEvent.compareAndSet(false, true)) {
				spawn(800433, 725.93f, 1319.9f, 490.7f, (byte) 61);
			}
		} else if (zone.getAreaTemplate().getZoneName() == ZoneName.get("GLORIOUS_NEXUS_300510000")) {
			player.getEffectController().removeEffect(300);
		}
	}

	@Override
	public void handleUseItemFinish(Player player, Npc npc) {
		if (npc.getNpcId() == 701494)
			instance.setDoorState(22, true);
	}

	@Override
	public void onInstanceCreate() {
		instance.setDoorState(610, true);
		// instance.setDoorState(20, true);
		instance.setDoorState(706, true);
		spawnColonels();
	}

	@Override
	public void onInstanceDestroy() {
		isInstanceDestroyed = true;
	}

	@Override
	public boolean isBoss(Npc npc) {
		return switch (npc.getNpcId()) {
			case 219352, 219353, 219354, 219355, 219356, 219357, 219358 -> true;
			default -> false;
		};
	}
}

📎 첨부파일

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