package instance; import static com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE.STR_MSG_IDStation_Doping_01_AD; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import com.aionemu.gameserver.ai.NpcAI; import com.aionemu.gameserver.ai.manager.WalkManager; import com.aionemu.gameserver.instance.handlers.GeneralInstanceHandler; import com.aionemu.gameserver.instance.handlers.InstanceID; import com.aionemu.gameserver.model.EmotionType; import com.aionemu.gameserver.model.gameobjects.Npc; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.gameobjects.state.CreatureState; import com.aionemu.gameserver.network.aion.serverpackets.SM_ATTACK_STATUS; import com.aionemu.gameserver.network.aion.serverpackets.SM_ATTACK_STATUS.LOG; import com.aionemu.gameserver.network.aion.serverpackets.SM_EMOTION; import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE; import com.aionemu.gameserver.services.abyss.AbyssPointsService; import com.aionemu.gameserver.skillengine.SkillEngine; import com.aionemu.gameserver.utils.PacketSendUtility; 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 xTz */ @InstanceID(300240000) public class AturamSkyFortressInstance extends GeneralInstanceHandler { private final AtomicBoolean msgIsSent = new AtomicBoolean(); private final AtomicInteger officerKilled = new AtomicInteger(); private final AtomicInteger chiefKilled = new AtomicInteger(); private final AtomicInteger generators = new AtomicInteger(); private boolean isInstanceDestroyed; public AturamSkyFortressInstance(WorldMapInstance instance) { super(instance); } @Override public void onDie(Npc npc) { if (isInstanceDestroyed) { return; } switch (npc.getNpcId()) { case 702651: spawn(282281, 524.1896f, 489.7742f, 649.916f, (byte) 34); break; case 700982: spawn(282279, 467.7094f, 465.6622f, 647.93896f, (byte) 40); break; case 700983: spawn(282278, 449.5576f, 420.7812f, 652.9143f, (byte) 89); instance.setDoorState(68, true); break; case 702650: spawn(282277, 572.8088f, 459.4094f, 647.93896f, (byte) 15); break; case 702652: spawn(282280, 581.1f, 401.3544f, 648.6401f, (byte) 9); break; case 217373: spawn(730375, 374.85f, 424.32f, 653.52f, (byte) 0); break; case 701043: npc.getController().delete(); deleteAliveNpcs(701030); sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_HugenNM_00()); break; case 217371: spawn(730374, npc.getX(), npc.getY(), npc.getZ(), (byte) 0); break; case 217370: int killed1 = officerKilled.incrementAndGet(); if (killed1 == 4) { instance.setDoorState(174, true); sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_3FDoor_311()); startOfficerWalkerEvent(); } else if (killed1 == 8) { instance.setDoorState(175, true); startMarbataWalkerEvent(); } npc.getController().delete(); break; case 217656: int killed2 = chiefKilled.incrementAndGet(); if (killed2 == 1) { startOfficerWalkerEvent(); } else if (killed2 == 2) { instance.setDoorState(178, true); instance.setDoorState(308, false); // reopen side windows ThreadPoolManager.getInstance().schedule(() -> instance.setDoorState(307, true), 10000); // close side windows } npc.getController().delete(); break; case 217382: instance.setDoorState(307, false); // reopen side windows instance.setDoorState(230, true); Player player = npc.getAggroList().getMostPlayerDamage(); if (player != null) { AbyssPointsService.addAp(player, 540); } sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_3FDoor_322()); break; case 218577: spawn(217382, 258.3894f, 796.7554f, 901.6453f, (byte) 80); break; case 701029: Npc boss = instance.getNpc(217371); int used = generators.incrementAndGet(); if (boss != null) { if (used == 1) { sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_HugenNM_01()); } else if (used == 2) { boss.getEffectController().removeEffect(19406); SkillEngine.getInstance().getSkill(boss, 19407, 1, boss).useNoAnimationSkill(); sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_HugenNM_02()); } else if (used == 3) { boss.getEffectController().removeEffect(19407); SkillEngine.getInstance().getSkill(boss, 19408, 1, boss).useNoAnimationSkill(); sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_HugenNM_03()); } else if (used == 4) { boss.getEffectController().removeEffect(19408); SkillEngine.getInstance().getSkill(boss, 18117, 1, boss).useNoAnimationSkill(); sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_HugenNM_04()); } } npc.getController().delete(); break; case 217369: case 217368: case 217655: npc.getController().delete(); break; } } private void startMarbataWalkerEvent() { sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_3FDoor_311()); startWalk((Npc) spawn(218577, 193.45583f, 802.1455f, 900.7575f, (byte) 103), "3002400009"); startWalk((Npc) spawn(217655, 198.34431f, 801.4107f, 900.66125f, (byte) 110), "30024000010"); startWalk((Npc) spawn(217655, 197.13315f, 798.7863f, 900.6499f, (byte) 110), "30024000011"); } private void startWalk(final Npc npc, final String walkId) { ThreadPoolManager.getInstance().schedule(() -> { if (!isInstanceDestroyed) { npc.getSpawn().setWalkerId(walkId); WalkManager.startWalking((NpcAI) npc.getAi()); npc.setState(CreatureState.ACTIVE, true); PacketSendUtility.broadcastPacket(npc, new SM_EMOTION(npc, EmotionType.CHANGE_SPEED, 0, npc.getObjectId())); } }, 2000); } private void startOfficerWalkerEvent() { startWalk((Npc) spawn(217655, 146.53816f, 713.5974f, 901.0108f, (byte) 111), "3002400003"); startWalk((Npc) spawn(217655, 144.84991f, 720.9318f, 901.0604f, (byte) 96), "3002400004"); startWalk((Npc) spawn(217655, 146.19899f, 709.60455f, 901.0078f, (byte) 110), "3002400005"); startWalk((Npc) spawn(217656, 144.11845f, 716.8327f, 901.046f, (byte) 100), "3002400006"); startWalk((Npc) spawn(217369, 144.96825f, 712.83344f, 901.0133f, (byte) 110), "3002400007"); startWalk((Npc) spawn(217369, 144.75804f, 718.4293f, 901.05493f, (byte) 80), "3002400008"); } @Override public void onInstanceCreate() { instance.setDoorState(177, true); Npc npc = instance.getNpc(217371); if (npc != null) { SkillEngine.getInstance().getSkill(npc, 19406, 1, npc).useNoAnimationSkill(); } } @Override public void onInstanceDestroy() { isInstanceDestroyed = true; } @Override public void handleUseItemFinish(Player player, Npc npc) { switch (npc.getNpcId()) { case 730398: player.getLifeStats().increaseHp(SM_ATTACK_STATUS.TYPE.HP, 5205, npc); player.getLifeStats().increaseMp(SM_ATTACK_STATUS.TYPE.MP, 5205, 0, LOG.REGULAR); sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_Doping_02()); npc.getController().delete(); break; case 730397: SkillEngine.getInstance().getSkill(npc, 19520, 51, player).useNoAnimationSkill(); sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDStation_Doping_01()); break; case 730410: instance.setDoorState(90, true); break; case 731533: SkillEngine.getInstance().getSkill(player, 21807, 1, player).useNoAnimationSkill(); break; case 731534: SkillEngine.getInstance().getSkill(player, 21808, 1, player).useNoAnimationSkill(); break; } } @Override public void onEnterZone(Player player, ZoneInstance zone) { if (zone.getAreaTemplate().getZoneName() == ZoneName.get("SKY_FORTRESS_WAREHOUSE_ZONE_300240000")) { // wtf is that? Notify only one player ? if (msgIsSent.compareAndSet(false, true)) { PacketSendUtility.sendPacket(player, STR_MSG_IDStation_Doping_01_AD()); } } } @Override public void onPlayMovieEnd(Player player, int movieId) { if (movieId == 471) ThreadPoolManager.getInstance().schedule(() -> instance.setDoorState(308, true), 10000); // close side windows } }