테스트

aion-server 4.8

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

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

import com.aionemu.commons.utils.Rnd;
import com.aionemu.gameserver.instance.handlers.GeneralInstanceHandler;
import com.aionemu.gameserver.instance.handlers.InstanceID;
import com.aionemu.gameserver.model.animations.TeleportAnimation;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.services.instance.InstanceService;
import com.aionemu.gameserver.services.player.PlayerReviveService;
import com.aionemu.gameserver.services.teleport.TeleportService;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.world.WorldMapInstance;

/**
 * @author Yeats
 * @see <a href="https://www.youtube.com/watch?v=eSLV-H5hups">Ophidan Bridge</a>
 */
@InstanceID(300590000)
public class OphidanBridgeInstance extends GeneralInstanceHandler {

	private final AtomicBoolean isNormalMode = new AtomicBoolean(); // instance starts always in hardmode
	private final AtomicBoolean used = new AtomicBoolean();
	private byte bossKills = 0;
	private byte endBossKills = 0;
	private Future<?> task;

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

	@Override
	public void onInstanceDestroy() {
		if (task != null && !task.isCancelled()) {
			task.cancel(true);
		}
	}

	@Override
	public void onDie(Npc npc) {
		super.onDie(npc);
		switch (npc.getNpcId()) {
			case 235764: // Escapee Asachin, triggers normal mode
				isNormalMode.set(true);
				break;
			case 235775:
			case 235774:
			case 235773:
			case 235772:
				if (!isNormalMode.get()) {
					deleteAliveNpcs(235764);
				}
				bossKills++;
				if (bossKills == 3) {
					spawn(701644, 436.99045f, 496.55634f, 605.95203f, (byte) 2);// Bridge Control
					if (!isNormalMode.get()) {
						spawnRandomBosses();
					} else {
						spawn(235768, 323.016f, 489.295f, 607.645f, (byte) 0); // Spirited Velkur
					}
				}
				break;
			case 235759:
			case 235763:
			case 235767:
			case 235768:
			case 235769:
			case 235770:
			case 235771:
				endBossKills++;
				if (endBossKills == (isNormalMode.get() ? 1 : 2)) {
					spawn(730868, 315.85f, 488.65f, 607.6435f, (byte) 0); // Ophidan Bridge exit
				} else {
					scheduleEnrage();
				}
				break;
			case 235786: // Steel Wall
				npc.getController().delete();
				break;
		}
	}

	private void scheduleEnrage() {
		task = ThreadPoolManager.getInstance().schedule(() -> {
			if (endBossKills < 2)
				spawn(856059, 322.4960f, 488.3117f, 656.4463f, (byte) 50);
		}, 10000);
	}

	private void spawnRandomBosses() {
		int npcId = 235759 + (Rnd.get(0, 2) * 4);
		spawn(npcId, 325.1554f, 483.4476f, 607.6434f, (byte) 0);
		switch (npcId) {
			case 235759 -> spawn(235769, 323.016f, 489.295f, 607.645f, (byte) 0); // Velkur Aethercaster
			case 235763 -> spawn(235770, 323.016f, 489.295f, 607.645f, (byte) 0); // Velkur Aetherpriest
			case 235767 -> spawn(235771, 323.016f, 489.295f, 607.645f, (byte) 0); // Velkur Aetherknife
		}
	}

	@Override
	public void handleUseItemFinish(Player player, Npc npc) {
		switch (npc.getNpcId()) {
			case 701644:
				if (used.compareAndSet(false, true)) {
					npc.getController().delete();
					spawn(731544, 436.36f, 496.45f, 604.8871f, (byte) 2, 7);
				}
				break;
			case 731544:
				TeleportService.teleportTo(player, player.getWorldId(), 369.532f, 491.7861f, 605.696f, (byte) 60, TeleportAnimation.FADE_OUT_BEAM);
				break;
			case 730868:
				InstanceService.moveToExitPoint(player);
				break;
		}
	}

	@Override
	public boolean onReviveEvent(Player player) {
		PlayerReviveService.revive(player, 25, 25, true, 0);
		PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_REBIRTH_MASSAGE_ME());
		player.getGameStats().updateStatsAndSpeedVisually();
		TeleportService.teleportTo(player, instance, 755.21f, 559.292f, 572.9508f, (byte) 86);
		return true;
	}
}

📎 첨부파일

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