테스트

aion-server 4.8

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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;

import com.aionemu.gameserver.instance.handlers.GeneralInstanceHandler;
import com.aionemu.gameserver.instance.handlers.InstanceID;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Gatherable;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.instance.InstanceProgressionType;
import com.aionemu.gameserver.model.instance.instancescore.DarkPoetaScore;
import com.aionemu.gameserver.model.team.TemporaryPlayerTeam;
import com.aionemu.gameserver.network.aion.instanceinfo.DarkPoetaScoreWriter;
import com.aionemu.gameserver.network.aion.serverpackets.SM_INSTANCE_SCORE;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.services.teleport.TeleportService;
import com.aionemu.gameserver.skillengine.model.Skill;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.PositionUtil;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.utils.stats.AbyssRankEnum;
import com.aionemu.gameserver.world.WorldMapInstance;

/**
 * @author Hilgert, xTz, Tiger, Ritsu, Estrayl
 */
@InstanceID(300040000)
public class DarkPoetaInstance extends GeneralInstanceHandler {

	private final List<Integer> excludedNpcs = new ArrayList<>();
	private final AtomicInteger killedGenerators = new AtomicInteger();
	private DarkPoetaScore instanceReward;
	private Future<?> instanceTimer;
	private long startTime;

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

	@Override
	public void onDie(Npc npc) {
		Creature master = npc.getMaster();
		if (master instanceof Player)
			return;

		int npcId = npc.getNpcId();
		int points = calculatePointsReward(npc);
		if (instanceReward.getInstanceProgressionType().isStartProgress() && !excludedNpcs.contains(npcId)) {
			instanceReward.addNpcKill();
			instanceReward.addPoints(points);
			sendPacket(npc, points);
		}
		switch (npcId) {
			case 214895: // Main Power Generator
			case 214896: // Auxiliary Power Generator
			case 214897: // Emergency Generator
				if (killedGenerators.incrementAndGet() == 3)
					spawn(214904, 275.34537f, 323.02072f, 130.9302f, (byte) 52);
				break;
			case 214904: // Brigade General Anuhart
				instanceReward.setInstanceProgressionType(InstanceProgressionType.END_PROGRESS);
				instanceReward.setRank(checkRank(instanceReward.getPoints()));
				sendPacket(null, 0);
				break;
			case 215280: // Tahabata Pyrelord
			case 215281: // Calindi Flamelord
			case 215282: // Vanuka Infernus
			case 215283: // Asaratu Bloodshade
			case 215284: // Chramati Firetail
				spawn(730211, 1171.9467f, 1223.2805f, 145.43983f, (byte) 16); // Exit
				break;
		}
	}

	private int getTime() {
		int current = (int) (System.currentTimeMillis() - startTime);
		return switch (instanceReward.getInstanceProgressionType()) {
			case PREPARING -> 120000 - current;
			case START_PROGRESS, END_PROGRESS -> 14400000 - current;
			default -> 0;
		};
	}

	private void sendPacket(Npc npc, int points) {
		if (npc != null)
			PacketSendUtility.broadcastToMap(instance, SM_SYSTEM_MESSAGE.STR_MSG_GET_SCORE(npc.getObjectTemplate().getL10n(), points));
		PacketSendUtility.broadcastToMap(instance, new SM_INSTANCE_SCORE(instance.getMapId(), new DarkPoetaScoreWriter(instanceReward), getTime()));
	}

	private int checkRank(int totalPoints) {
		int timeRemain = getTime();
		int rank = 8;
		if (timeRemain > 7200000 && totalPoints >= 17817) {
			spawn(215280, 1189f, 1244f, 141f, (byte) 76);
			rank = 1;
		} else if (timeRemain > 5400000 && totalPoints >= 15219) {
			spawn(215281, 1189f, 1244f, 141f, (byte) 76);
			rank = 2;
		} else if (timeRemain > 3600000 && totalPoints > 10913) {
			spawn(215282, 1189f, 1244f, 141f, (byte) 76);
			rank = 3;
		} else if (timeRemain > 1800000 && totalPoints > 6656) {
			spawn(215283, 1189f, 1244f, 141f, (byte) 76);
			rank = 4;
		} else if (timeRemain > 1) {
			spawn(215284, 1189f, 1244f, 141f, (byte) 76);
			rank = 5;
		}
		schedulePortalDespawn((Npc) spawn(700478, 298.24423f, 316.21954f, 133.29759f, (byte) 56));
		return rank;
	}

	private void schedulePortalDespawn(Npc portal) {
		ThreadPoolManager.getInstance().schedule(() -> portal.getController().delete(), 180000);
	}

	private int calculatePointsReward(Npc npc) {
		int pointsReward = 0;

		// Usually calculated by npcRank
		switch (npc.getObjectTemplate().getRating()) {
			case HERO:
				switch (npc.getObjectTemplate().getHpGauge()) {
					case 21:
						pointsReward = 786;
						break;
					default:
						pointsReward = 300;
				}
				break;
			default:
				if (npc.getObjectTemplate().getRace() == null) {
					break;
				}

				switch (npc.getObjectTemplate().getRace().getRaceId()) {
					case 22: // UNDEAD
						pointsReward = 12;
						break;
					case 9: // BROWNIE
						pointsReward = 18;
						break;
					case 6: // LIZARDMAN
						pointsReward = 24;
						break;
					case 8: // NAGA
					case 18: // DRAGON
					case 24: // MAGICALnpc
						pointsReward = 30;
						break;
					default:
						if (npc.getNpcId() != 281178)
							pointsReward = 11;
						break;
				}
		}

		// Special npcs
		switch (npc.getNpcId()) {
			// Drana
			case 700520:
				pointsReward = 52;
				break;
			// Walls
			case 700517:
			case 700518:
			case 700556:
			case 700558:
				pointsReward = 156;
				break;
			// Mutated Fungie
			case 214885:
				pointsReward = 21;
				break;
			// Named1
			case 214841:
				pointsReward = -209;
				break;
			case 281116:
				pointsReward = 1241;
				break;
			case 215431:
				pointsReward = 208;
				break;
			// Named2
			case 215429:
			case 215430:
				pointsReward = 190;
				break;
			case 214842:
			case 215432:
				pointsReward = 357;
				break;
			// Named3
			case 214871:
			case 215386:
			case 215428:
				pointsReward = 204;
				break;
			// Marabata
			case 214849:
			case 214850:
			case 214851:
				pointsReward = 319;
				break;
			// Generators
			case 214895:
			case 214896:
				pointsReward = 377;
				break;
			case 214897:
				pointsReward = 330;
				break;
			// Atmach
			case 214843:
				pointsReward = 456;
				break;
			// Boss
			case 214864:
			case 214880:
			case 214894:
			case 215387:
			case 215388:
			case 215389:
				pointsReward = 789;
				break;
			case 214904:
				pointsReward = 954;
				break;
		}
		TemporaryPlayerTeam<?> team = (TemporaryPlayerTeam<?>) instance.getRegisteredTeam();
		if (team != null) {
			if (team.getLeaderObject().getAbyssRank().getRank().getId() >= AbyssRankEnum.STAR1_OFFICER.getId())
				pointsReward = Math.round(pointsReward * 1.1f);
		}
		return pointsReward;
	}

	private void onStart(boolean manually) {
		instanceReward.setInstanceProgressionType(InstanceProgressionType.START_PROGRESS);
		startTime = System.currentTimeMillis();
		sendPacket(null, 0);
		if (!manually)
			instance.forEachDoor(d -> d.setOpen(true));
	}

	@Override
	public void onEnterInstance(final Player player) {
		sendPacket(null, 0);
	}

	@Override
	public void onOpenDoor(int doorId) {
		if (doorId == 33) {
			if (instanceTimer != null && !instanceTimer.isCancelled())
				instanceTimer.cancel(true);
			onStart(true);
		}
	}

	@Override
	public void onInstanceDestroy() {
		if (instanceTimer != null)
			instanceTimer.cancel(false);
	}

	@Override
	public void onInstanceCreate() {
		excludedNpcs.addAll(Arrays.asList(700439, 700440, 700441, 700442, 700443, 700444, 700445, 700446, 700447, 281178));
		instanceReward = new DarkPoetaScore();
		instanceReward.setInstanceProgressionType(InstanceProgressionType.PREPARING);
		startTime = System.currentTimeMillis();
		instanceTimer = ThreadPoolManager.getInstance().schedule(() -> onStart(false), 121000);
	}

	@Override
	public void onGather(Player player, Gatherable gatherable) {
		instanceReward.addGather();
		sendPacket(null, 1);
	}

	@Override
	public void leaveInstance(Player player) {
		if (instanceReward.getInstanceProgressionType().isEndProgress())
			TeleportService.moveToInstanceExit(player, mapId, player.getRace());
	}

	@Override
	public void onEndCastSkill(Skill skill) {
		if (skill.getSkillId() != 18130) // Kobold Bomb Effect
			return;
		Npc camouflageStoneWall = getNpc(700516);
		if (camouflageStoneWall != null && PositionUtil.isInRange(skill.getEffector(), camouflageStoneWall, 10))
			camouflageStoneWall.getController().die();
	}
}

📎 첨부파일

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