package instance;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import com.aionemu.commons.utils.Rnd;
import com.aionemu.gameserver.ai.AIState;
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.Creature;
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_EMOTION;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
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 Cheatkiller
*/
@InstanceID(300510000)
public class TiamatStrongHoldInstance extends GeneralInstanceHandler {
private final AtomicInteger drakans = new AtomicInteger();
private final AtomicBoolean startSuramaEvent = new AtomicBoolean();
private boolean isInstanceDestroyed;
public TiamatStrongHoldInstance(WorldMapInstance instance) {
super(instance);
}
@Override
public void onDie(Npc npc) {
if (isInstanceDestroyed) {
return;
}
switch (npc.getNpcId()) {
case 730612:
firstWave();
break;
case 219373:// ex 219421
case 219369:// ex 219417
case 219411:// ex 219459
case 219370:// ex 219418
int killedDrakans = drakans.incrementAndGet();
if (killedDrakans == 5)
secondWave();
else if (killedDrakans == 12)
thirdWave();
break;
case 219352: // ex 219400
sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
spawn(283177, 1175.65f, 1069.08f, 498.52f, (byte) 0); // ex 283913
spawn(701501, 1075.4409f, 1078.5071f, 787.685f, (byte) 16);
instance.setDoorState(48, true);
spawnKahrun();
break;
case 219357:// ex 219405
sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
spawn(701501, 1077.1716f, 1058.1995f, 787.685f, (byte) 61);
instance.setDoorState(37, true);
break;
case 219358:// ex 219406
sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
spawn(701541, 677.35785f, 1069.5361f, 499.86716f, (byte) 0);
spawn(701527, 1073.948f, 1068.8732f, 787.685f, (byte) 61);
spawn(730622, 652.4821f, 1069.0302f, 498.7787f, (byte) 0, 82);
spawn(283178, 679.88f, 1068.88f, 504.2f, (byte) 119);// ex 283916
spawnExitIfCleared();
break;
case 219353:// ex 219401
sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
spawn(701501, 1071.5909f, 1040.6797f, 787.685f, (byte) 23);
instance.setDoorState(711, true);
break;
case 219354:// ex 219402
sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
spawn(283179, 1030.03f, 301.83f, 411f, (byte) 26);// ex 283914
spawn(701501, 1086.274f, 1098.3997f, 787.685f, (byte) 90);
spawn(730622, 1029.792f, 267.0502f, 409.7982f, (byte) 0, 83);
spawnExitIfCleared();
break;
case 219355:// ex 219403
sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
spawn(701501, 1063.5973f, 1092.7402f, 787.685f, (byte) 107);
instance.setDoorState(51, true);
instance.setDoorState(54, true);
instance.setDoorState(78, true);
instance.setDoorState(11, true);
instance.setDoorState(79, true);
break;
case 219356:// ex 219404
sendMsg(SM_SYSTEM_MESSAGE.STR_IDTIAMAT_TIAMAT_REWARD_SPAWN());
spawn(701501, 1099.8691f, 1047.1895f, 787.685f, (byte) 64);
spawn(730622, 644.4221f, 1319.6221f, 488.7422f, (byte) 0, 15);
spawn(800438, 665.63409f, 1319.7051f, 487.9f, (byte) 61);
spawn(283180, 629.1f, 1319.5f, 501.2f, (byte) 0);// ex 283915
spawnExitIfCleared();
break;
}
}
private void firstWave() {
ThreadPoolManager.getInstance().schedule(() -> {
attackPlayer((Npc) spawn(219373, 1505.09f, 1068.54f, 491.38f, (byte) 0));
attackPlayer((Npc) spawn(219369, 1510.54f, 1058.04f, 491.5f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1517.38f, 1063.5f, 491.52f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1516.81f, 1073.6f, 491.52f, (byte) 0));
attackPlayer((Npc) spawn(219369, 1510.41f, 1078.8f, 491.52f, (byte) 0));
}, 5000);
}
private void secondWave() {
attackPlayer((Npc) spawn(219370, 1426.08f, 1068.41f, 491.38f, (byte) 0));
attackPlayer((Npc) spawn(219369, 1430.3f, 1061.13f, 491.5f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1428.5f, 1056.6f, 491.52f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1439.49f, 1058.5f, 491.4f, (byte) 0));
attackPlayer((Npc) spawn(219369, 1430.3f, 1075.49f, 491.52f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1439.4f, 1078.6f, 491.4f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1428.5f, 1080.9f, 491.46f, (byte) 0));
}
private void thirdWave() {
attackPlayer((Npc) spawn(219370, 1296.1f, 1068.3f, 491.38f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1290.9f, 1059.13f, 491.5f, (byte) 0));
attackPlayer((Npc) spawn(219369, 1300.6f, 1056.4f, 491.52f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1302.78f, 1053.55f, 491.4f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1290.94f, 1077.8f, 491.52f, (byte) 0));
attackPlayer((Npc) spawn(219369, 1300.6f, 1080.3f, 491.4f, (byte) 0));
attackPlayer((Npc) spawn(219411, 1302.78f, 1082.8f, 491.5f, (byte) 0));
}
private void attackPlayer(final Npc npc) {
ThreadPoolManager.getInstance().schedule(() -> {
if (!isInstanceDestroyed) {
for (Player player : instance.getPlayersInside()) {
npc.setTarget(player);
npc.getAi().setStateIfNot(AIState.WALKING);
npc.setState(CreatureState.ACTIVE, true);
npc.getMoveController().moveToTargetObject();
PacketSendUtility.broadcastPacket(npc, new SM_EMOTION(npc, EmotionType.CHANGE_SPEED, 0, npc.getObjectId()));
}
}
}, 2000);
}
private void spawnKahrun() {
ThreadPoolManager.getInstance().schedule(() -> {
moveToForward((Npc) spawn(800463, 1201.272f, 1074.5463f, 491f, (byte) 61), 1039.5f, 1075.9f, 497.3f, false);
moveToForward((Npc) spawn(800463, 1201.272f, 1072.5137f, 491f, (byte) 61), 1130, 1072, 497.3f, false);
moveToForward((Npc) spawn(800463, 1192.8656f, 1071.1085f, 491f, (byte) 61), 1112, 1070, 497, false);
moveToForward((Npc) spawn(800463, 1201.272f, 1064.1759f, 491f, (byte) 61), 1039, 1061, 497.3f, false);
moveToForward((Npc) spawn(800463, 1208.4175f, 1071.1797f, 491f, (byte) 61), 1133, 1072.5f, 497.3f, false);
moveToForward((Npc) spawn(800463, 1192.8656f, 1068.3411f, 491f, (byte) 61), 1114, 1067, 496.7f, false);
moveToForward((Npc) spawn(800463, 1208.4175f, 1068.3979f, 491f, (byte) 61), 1133.32f, 1066.47f, 497.3f, false);
moveToForward((Npc) spawn(800463, 1201.272f, 1066.2085f, 491f, (byte) 61), 1128.8f, 1067, 497.3f, false);
moveToForward((Npc) spawn(800380, 1190.323f, 1068.1558f, 491.03488f, (byte) 61), 1108, 1066, 497.3f, false);
moveToForward((Npc) spawn(800374, 1188.4259f, 1066.4757f, 491.55029f, (byte) 61), 1094, 1064, 497.4f, true);
moveToForward((Npc) spawn(800374, 1188.2158f, 1074.2047f, 491.55029f, (byte) 61), 1092.5f, 1074.6f, 497.4f, true);
moveToForward((Npc) spawn(800376, 1190.3859f, 1071.6548f, 491.03488f, (byte) 61), 1109, 1073, 497.2f, false);
moveToForward((Npc) spawn(800461, 1184.7582f, 1068.6f, 491.03488f, (byte) 61), 1111, 1068.6f, 497.33f, false);
moveToForward((Npc) spawn(800460, 1184.7358f, 1070.77f, 491.03488f, (byte) 61), 1111, 1071, 497, false);
moveToForward((Npc) spawn(800347, 1178.0425f, 1072.28f, 491.02545f, (byte) 61), 1106, 1072, 497.2f, false);
moveToForward((Npc) spawn(800336, 1178.0559f, 1069.6f, 491.02545f, (byte) 61), 1104, 1069, 497, true);
}, 7000);
}
private void moveToForward(final Npc npc, float x, float y, float z, boolean despawn) {
npc.getAi().setStateIfNot(AIState.WALKING);
npc.setState(CreatureState.ACTIVE, true);
npc.getMoveController().moveToPoint(x, y, z);
PacketSendUtility.broadcastPacket(npc, new SM_EMOTION(npc, EmotionType.CHANGE_SPEED, 0, npc.getObjectId()));
if (despawn) {
ThreadPoolManager.getInstance().schedule(() -> {
if (npc.getNpcId() == 800336) {
spawn(800338, 1104, 1069f, 497, (byte) 61);
Npc kahrun = getNpc(800338);
PacketSendUtility.broadcastMessage(kahrun, 1500599, 1000);
PacketSendUtility.broadcastMessage(kahrun, 1500600, 5000);
}
npc.getController().delete();
}, 13000);
}
}
private void spawnColonels() {
switch (Rnd.nextInt(4)) {
case 0:
spawn(219364, 763.4179f, 1445.6504f, 495.6519f, (byte) 90);
spawn(219395, 893.7009f, 1445.4846f, 495.6421f, (byte) 90);
spawn(219395, 893.3f, 1190.71f, 495.6f, (byte) 30);
spawn(219395, 762.6f, 1192.1f, 495.6f, (byte) 30);
break;
case 1:
spawn(219395, 763.4179f, 1445.6504f, 495.6519f, (byte) 90);
spawn(219364, 893.7009f, 1445.4846f, 495.6421f, (byte) 90);
spawn(219395, 893.3f, 1190.71f, 495.6f, (byte) 30);
spawn(219395, 762.6f, 1192.1f, 495.6f, (byte) 30);
break;
case 2:
spawn(219395, 763.4179f, 1445.6504f, 495.6519f, (byte) 90);
spawn(219395, 893.7009f, 1445.4846f, 495.6421f, (byte) 90);
spawn(219364, 893.3f, 1190.71f, 495.6f, (byte) 30);
spawn(219395, 762.6f, 1192.1f, 495.6f, (byte) 30);
break;
case 3:
spawn(219395, 763.4179f, 1445.6504f, 495.6519f, (byte) 90);
spawn(219395, 893.7009f, 1445.4846f, 495.6421f, (byte) 90);
spawn(219395, 893.3f, 1190.71f, 495.6f, (byte) 30);
spawn(219364, 762.6f, 1192.1f, 495.6f, (byte) 30);
break;
}
}
private void spawnExitIfCleared() {
if (instance.getNpcs(219354, 219356, 219358).stream().allMatch(Creature::isDead)) {
spawn(800464, 1119.7076f, 1071.1401f, 496.8615f, (byte) 119);
spawn(800465, 1119.7421f, 1068.4998f, 496.8616f, (byte) 3);
spawn(730629, 1121.3807f, 1069.8124f, 500.3319f, (byte) 0, 555);
}
}
@Override
public void onEnterZone(Player player, ZoneInstance zone) {
if (zone.getAreaTemplate().getZoneName() == ZoneName.get("LAKSYAKA_LEGION_HQ_300510000")) {
if (startSuramaEvent.compareAndSet(false, true)) {
spawn(800433, 725.93f, 1319.9f, 490.7f, (byte) 61);
}
} else if (zone.getAreaTemplate().getZoneName() == ZoneName.get("GLORIOUS_NEXUS_300510000")) {
player.getEffectController().removeEffect(300);
}
}
@Override
public void handleUseItemFinish(Player player, Npc npc) {
if (npc.getNpcId() == 701494)
instance.setDoorState(22, true);
}
@Override
public void onInstanceCreate() {
instance.setDoorState(610, true);
// instance.setDoorState(20, true);
instance.setDoorState(706, true);
spawnColonels();
}
@Override
public void onInstanceDestroy() {
isInstanceDestroyed = true;
}
@Override
public boolean isBoss(Npc npc) {
return switch (npc.getNpcId()) {
case 219352, 219353, 219354, 219355, 219356, 219357, 219358 -> true;
default -> false;
};
}
}