package instance;
import java.util.concurrent.atomic.AtomicBoolean;
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.Race;
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.services.teleport.TeleportService;
import com.aionemu.gameserver.skillengine.SkillEngine;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.world.WorldMapInstance;
/**
* According to the version 4.8 the instance was simplified and shortened. The starting point of this
* instance was set to the area behind Zantaraz and everything prior to that was removed. Similar
* to the harder version called Occupied Rentus Base, a minigame was added, which if successfully
* completed allows to open a chest with additional loot after defeating Brigade General Vasharti.
*
* August 7th, 2016
*
* @author xTz, Estrayl
*/
@InstanceID(300280000)
public class RentusBaseInstance extends GeneralInstanceHandler {
private final AtomicBoolean isRaceKnown = new AtomicBoolean();
private final AtomicBoolean isXastaEventStarted = new AtomicBoolean();
public RentusBaseInstance(WorldMapInstance instance) {
super(instance);
}
@Override
public void onDie(final Npc npc) {
super.onDie(npc);
switch (npc.getNpcId()) {
case 217315: // Umatha the Crazed
if (isDeadNpc(217316)) {
instance.setDoorState(145, true);
deleteAliveNpcs(701156);
}
break;
case 217316: // Ambusher Kiriana
if (isDeadNpc(217315)) {
instance.setDoorState(145, true);
deleteAliveNpcs(701156);
}
break;
case 217311: // Kuhara
spawn(219215, 141.54f, 255.06f, 213f, (byte) 25);
instance.setDoorState(43, false);
instance.setDoorState(150, true);
npc.getController().delete();
break;
case 217317: // Archmagus Upadi
instance.setDoorState(70, true);
break;
case 217313: // Brigade General Vasharti
deleteAliveNpcs(799669);
instance.setDoorState(70, true);
spawn(730520, 193.6f, 436.5f, 262f, (byte) 86); // rentus base exit
spawn(833047, 195.48f, 413.87f, 260.97f, (byte) 27); // rentus supplies storage box
Npc ariana = (Npc) spawn(799670, 183.736f, 391.392f, 260.571f, (byte) 26);
PacketSendUtility.broadcastMessage(ariana, 1500417, 5000);
PacketSendUtility.broadcastMessage(ariana, 1500418, 8000);
PacketSendUtility.broadcastMessage(ariana, 1500419, 11000);
spawnEndEvent(800227, "3002800003", 2000);
spawnEndEvent(800227, "3002800004", 2000);
spawnEndEvent(800228, "3002800007", 4000);
spawnEndEvent(800227, "3002800005", 6000);
spawnEndEvent(800228, "3002800006", 8000);
spawnEndEvent(800229, "3002800008", 10000);
spawnEndEvent(800229, "3002800009", 10000);
spawnEndEvent(800230, "30028000010", 12000);
spawnEndEvent(800230, "30028000011", 12000);
break;
case 282394:
spawn(282395, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading());
npc.getController().delete();
break;
case 283000:
case 283001:
npc.getController().delete();
break;
case 236283:
spawn(236284, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading());
npc.getController().delete();
break;
}
}
@Override
public void onAggro(Npc npc) {
switch (npc.getNpcId()) {
case 217311: // Kuhara
instance.setDoorState(43, true);
PacketSendUtility.broadcastMessage(npc, 1500393);
break;
case 217313: // Vasharti
instance.setDoorState(70, false);
break;
}
}
private void spawnEndEvent(int npcId, String walkern, int time) {
sp(npcId, 193.39548f, 435.56158f, 260.57135f, (byte) 86, time, walkern);
}
@Override
public void handleUseItemFinish(Player player, Npc npc) {
switch (npc.getNpcId()) {
case 702677:
case 702678:
case 702679:
case 702680:
case 702681:
case 702682:
TeleportService.teleportTo(player, npc.getWorldId(), npc.getInstanceId(), npc.getX(), npc.getY(), npc.getZ(), npc.getHeading());
SkillEngine.getInstance().applyEffectDirectly(21806, npc, player);
npc.getController().delete();
break;
case 702683:
case 702684:
case 702685:
case 702686:
case 702687:
case 702688:
TeleportService.teleportTo(player, npc.getWorldId(), npc.getInstanceId(), npc.getX(), npc.getY(), npc.getZ(), npc.getHeading());
SkillEngine.getInstance().applyEffectDirectly(21805, npc, player);
npc.getController().delete();
break;
case 701097:
npc.getController().delete();
break;
case 701100:
if (instance.getNpc(799543) == null)
spawn(799543, 511.227f, 613.762f, 158.179f, (byte) 0);
break;
}
}
private void sp(final int npcId, final float x, final float y, final float z, final byte h, final int time, final String walkern) {
final Npc npc = (Npc) spawn(npcId, x, y, z, h);
ThreadPoolManager.getInstance().schedule(() -> {
npc.getSpawn().setWalkerId(walkern);
WalkManager.startWalking((NpcAI) npc.getAi());
npc.setState(CreatureState.WALK_MODE, true);
PacketSendUtility.broadcastPacket(npc, new SM_EMOTION(npc, EmotionType.CHANGE_SPEED, 0, npc.getObjectId()));
}, time);
}
private boolean isDeadNpc(int npcId) {
return (getNpc(npcId) == null || getNpc(npcId).isDead());
}
@Override
public void onCreatureDetected(Npc detector, Creature detected) {
if (detected instanceof Player) {
if (detector.getNpcId() == 856056 && isXastaEventStarted.compareAndSet(false, true)) {
sp(236271, 521.33f, 499.49f, 179.946f, (byte) 27, 2000, "300620000_Xasta_Path");
detector.getController().delete();
sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDYUN_RASTA_SPAWN_01());
sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDYUN_RASTA_SPAWN_02(), 2000);
}
}
}
@Override
public void onSpecialEvent(Npc npc) {
if (npc.getNpcId() == 236271) {
if (npc.getLifeStats().getHpPercentage() <= 50)
spawn(217310, 354.53f, 596.26f, 148.298f, (byte) 100);
else
spawn(217309, 354.53f, 596.26f, 148.298f, (byte) 100);
Npc drakanBarricade = getNpc(856015);
if (drakanBarricade != null)
drakanBarricade.getController().die(npc);
npc.getController().delete();
}
}
@Override
public void onEnterInstance(Player player) {
if (isRaceKnown.compareAndSet(false, true)) {
if (player.getRace() == Race.ELYOS) {
for (int npcId = 702677; npcId <= 702682; npcId++) {
Npc npc = getNpc(npcId);
spawn(npcId + 6, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), npc.getSpawn().getStaticId());
npc.getController().delete();
}
}
}
}
@Override
public boolean isBoss(Npc npc) {
return switch (npc.getNpcId()) {
case 217309, 217310, 217311, 217315, 217316, 217317, 217313 -> true;
default -> false;
};
}
}