package instance; import java.util.concurrent.Future; import com.aionemu.gameserver.instance.handlers.GeneralInstanceHandler; import com.aionemu.gameserver.instance.handlers.InstanceID; import com.aionemu.gameserver.model.Race; 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.teleport.TeleportService; 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(301270000) public class LinkgateFoundryInstance extends GeneralInstanceHandler { private Future timeCheckTask; private byte timeInMin = -1; private byte secretLabEntranceCount = 0; private Race instanceRace; public LinkgateFoundryInstance(WorldMapInstance instance) { super(instance); } @Override public void onEnterInstance(Player player) { if (instanceRace == null) { instanceRace = player.getRace(); spawn(instanceRace == Race.ELYOS ? 206361 : 206362, 348.00464f, 252.13882f, 311.36136f, (byte) 10); } } @Override public void onDie(Npc npc) { switch (npc.getNpcId()) { case 233898, 234990, 234991 -> spawn(instanceRace == Race.ELYOS ? 702338 : 702389, 246.74345f, 258.35843f, 312.32327f, (byte) 10); } } @Override public void handleUseItemFinish(Player player, Npc npc) { switch (npc.getNpcId()) { case 804578: sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDLDF4_Re_01_Time_01()); // 20 min startTimeCheck(); npc.getController().die(); // not a static door in client data o.O break; case 234193: npc.getController().die(); break; case 804629: TeleportService.teleportTo(player, 301270000, 228.37f, 262.7f, 313, (byte) 120); break; case 702592: TeleportService.teleportTo(player, 301270000, 211.32f, 260, 314, (byte) 0, TeleportAnimation.FADE_OUT_BEAM); break; case 702590: TeleportService.teleportTo(player, 301270000, 257.11f, 323, 271, (byte) 60, TeleportAnimation.FADE_OUT_BEAM); npc.getController().delete(); secretLabEntranceCount++; if (secretLabEntranceCount < 3) { spawn(234992, 244.1839f, 322.5356f, 270.9474f, (byte) 0); } else sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDLDF4_Re_01_secret_room_03()); break; } } private void startTimeCheck() { timeCheckTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { switch (++timeInMin) { case 5 -> sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDLDF4_Re_01_Time_02()); case 10 -> sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDLDF4_Re_01_Time_03()); case 15 -> sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDLDF4_Re_01_Time_04()); case 17 -> sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDLDF4_Re_01_Time_05()); case 19 -> sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDLDF4_Re_01_Time_06()); case 20 -> { sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDLDF4_Re_01_Time_07()); instance.forEachNpc(npc -> { if (npc.getNpcId() != 233898 && npc.getNpcId() != 234990 && npc.getNpcId() != 234991 // belsagos does not despawn && npc.getNpcId() != 702339 && npc.getNpcId() != 804629 // teleport device does not despawn && npc.getNpcId() != 702590 && npc.getNpcId() != 702591 && npc.getNpcId() != 234992) { // secret lab portal & chest do not despawn npc.getController().delete(); } }); if (timeCheckTask != null && !timeCheckTask.isDone()) { timeCheckTask.cancel(true); } } } }, 0, 60000); } @Override public void onEnterZone(Player player, ZoneInstance zone) { if (zone.getAreaTemplate().getZoneName() == ZoneName.get("IDLDF4RE_01_ITEMUSEAREA_BOSS_301270000")) { if (timeCheckTask != null && !timeCheckTask.isDone()) { timeCheckTask.cancel(true); } } } @Override public void onInstanceDestroy() { if (timeCheckTask != null && !timeCheckTask.isDone()) { timeCheckTask.cancel(true); } } }