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 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(); } }