package instance; import static com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE.STR_REBIRTH_MASSAGE_ME; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; 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.gameobjects.Item; import com.aionemu.gameserver.model.gameobjects.Npc; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.templates.spawns.SpawnTemplate; import com.aionemu.gameserver.network.aion.serverpackets.SM_PLAY_MOVIE; import com.aionemu.gameserver.services.player.PlayerReviveService; import com.aionemu.gameserver.services.teleport.TeleportService; import com.aionemu.gameserver.skillengine.SkillEngine; import com.aionemu.gameserver.spawnengine.SpawnEngine; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.PositionUtil; import com.aionemu.gameserver.utils.ThreadPoolManager; import com.aionemu.gameserver.world.WorldMapInstance; import com.aionemu.gameserver.world.zone.ZoneInstance; /** * @author xTz, Gigi, Pad */ @InstanceID(300230000) public class KromedesTrialInstance extends GeneralInstanceHandler { private final AtomicBoolean isBossSpawned = new AtomicBoolean(); private final List sentMovies = new ArrayList<>(); private int skillId; private boolean isPlayerInManor; public KromedesTrialInstance(WorldMapInstance instance) { super(instance); } @Override public void onEnterInstance(Player player) { skillId = player.getRace() == Race.ASMODIANS ? 19270 : 19220; sendMovie(player, 453); SkillEngine.getInstance().applyEffectDirectly(skillId, player, player); } @Override public void onEnterZone(Player player, ZoneInstance zone) { switch (zone.getAreaTemplate().getZoneName().toString()) { case "MANOR_ENTRANCE_300230000": sendMovie(player, 462); break; case "KALIGA_LIBRARY_300230000": PacketSendUtility.sendMonologue(player, 1111370); // The door to the Kaliga Treasury should be around here somewhere.... break; case "KALIGA_TREASURY_300230000": if (isBossSpawned.compareAndSet(false, true)) { Npc wyr = instance.getNpc(217002); Npc angerr = instance.getNpc(217000); Npc hamam = instance.getNpc(216982); if (isDead(wyr) && isDead(angerr) && isDead(hamam)) { spawn(217005, 669.214f, 774.387f, 216.88f, (byte) 60); spawn(217001, 663.8805f, 779.1967f, 216.26213f, (byte) 60); spawn(217003, 663.0468f, 774.6116f, 216.26215f, (byte) 60); spawn(217004, 663.0468f, 770.03815f, 216.26212f, (byte) 60); } else { spawn(217006, 669.214f, 774.387f, 216.88f, (byte) 60); } } break; } } @Override public void onPlayMovieEnd(Player player, int movieId) { if (movieId == 454) { Npc magasPotion = instance.getNpc(730308); if (magasPotion != null && PositionUtil.isInRange(player, magasPotion, 20)) { int relicKeyId = 185000109; player.getInventory().decreaseByItemId(relicKeyId, player.getInventory().getItemCountByItemId(relicKeyId)); TeleportService.teleportTo(player, instance, 687.56116f, 681.68225f, 200.28648f, (byte) 30); } } } @Override public void onDie(Npc npc) { switch (npc.getNpcId()) { case 216968: // Divine Hisen isPlayerInManor = true; break; case 282093: // Mana Relic removeKaligaBuff(19248); scheduleRespawn(npc); npc.getController().delete(); break; case 282095: // Strength Relic removeKaligaBuff(19247); scheduleRespawn(npc); npc.getController().delete(); break; } } @Override public boolean onReviveEvent(Player player) { PlayerReviveService.revive(player, 25, 25, true, 0); player.getGameStats().updateStatsAndSpeedVisually(); PacketSendUtility.sendPacket(player, STR_REBIRTH_MASSAGE_ME()); if (!isPlayerInManor) TeleportService.teleportTo(player, instance, 248, 244, 189); else TeleportService.teleportTo(player, instance, 686, 676, 201); SkillEngine.getInstance().applyEffectDirectly(skillId, player, player); return true; } private void removeKaligaBuff(int skillId) { Npc kaliga = instance.getNpc(217006); if (kaliga != null && !kaliga.isDead()) { kaliga.getEffectController().removeEffect(skillId); } } private void scheduleRespawn(Npc npc) { ThreadPoolManager.getInstance().schedule(() -> { Npc kaliga = instance.getNpc(217006); if (kaliga != null && !kaliga.isDead()) { SpawnTemplate npcST = npc.getSpawn(); SpawnTemplate newST = SpawnEngine.newSingleTimeSpawn(npcST.getWorldId(), npc.getNpcId(), npcST.getX(), npcST.getY(), npcST.getZ(), npcST.getHeading()); newST.setStaticId(npcST.getStaticId()); SpawnEngine.spawnObject(newST, instance.getInstanceId()); } }, 10000); } private boolean isDead(Npc npc) { return npc == null || npc.isDead(); } private void sendMovie(Player player, int movieId) { if (!sentMovies.contains(movieId)) { sentMovies.add(movieId); PacketSendUtility.sendPacket(player, new SM_PLAY_MOVIE(false, 0, 0, movieId, true)); } } @Override protected boolean isRestrictedToInstance(Item item) { return switch (item.getItemId()) { case 185000098, 185000099, 185000100, 185000109 -> true; // Temple Vault Door Key, Dungeon Grate Key, Dungeon Door Key, Relic Key default -> super.isRestrictedToInstance(item); }; } }