Crystal Caverns improvements and corrections.

This commit is contained in:
MobiusDevelopment 2019-11-18 01:54:00 +00:00
parent a3b4f76d98
commit 4d04017769
2 changed files with 316 additions and 324 deletions

View File

@ -131,45 +131,44 @@ public class CrystalCaverns extends AbstractInstance
} }
// Items // Items
private static final int WHITE_SEED = 9597; private static final int WHITE_SEED_OF_EVIL_SHARD = 9597;
private static final int BLACK_SEED = 9598; private static final int BLACK_SEED_OF_EVIL_SHARD = 9598;
private static final int CONT_CRYSTAL = 9690; // Contaminated Crystal private static final int CONTAMINATED_CRYSTAL = 9690;
private static final int RED_CORAL = 9692; // Red Coral private static final int RED_CORAL = 9692;
private static final int CRYSTALFOOD = 9693; // Food item for Crystal Golems private static final int CRYSTAL_FRAGMENT = 9693;
private static final int RACE_KEY = 9694; // Race Key for Emerald doors private static final int SECRET_KEY = 9694;
private static final int BOSS_CRYSTAL_1 = 9695; // Clear Crystal private static final int BLUE_CRYSTAL = 9695;
private static final int BOSS_CRYSTAL_2 = 9696; // Clear Crystal private static final int RED_CRYSTAL = 9696;
private static final int BOSS_CRYSTAL_3 = 9697; // Clear Crystal private static final int CLEAR_CRYSTAL = 9697;
// NPCs // NPCs
private static final int ORACLE_GUIDE_1 = 32281; private static final int ORACLE_GUIDE_1 = 32281;
private static final int ORACLE_GUIDE_2 = 32278; private static final int ORACLE_GUIDE_2 = 32278;
private static final int ORACLE_GUIDE_3 = 32280; private static final int ORACLE_GUIDE_3 = 32280;
private static final int ORACLE_GUIDE_4 = 32279; private static final int ORACLE_GUIDE_4 = 32279;
private static final int CRYSTAL_GOLEM = 32328; private static final int CRYSTALLINE_GOLEM = 32328;
private static final int[] DOOR_OPENING_TRAP = private static final int[] DOOR_OPENING_TRAP =
{ {
18378, 18378,
143682, 143680,
142492, 142608,
-11886, -11886,
16384 0
}; };
private static final int GK1 = 22275; private static final int GATEKEEPER_LOHAN = 22275;
private static final int GK2 = 22277; private static final int GATEKEEPER_PROVO = 22277;
private static final int TOURMALINE = 22292; private static final int TOURMALINE = 22292;
private static final int TEROD = 22301; private static final int TEROD = 22301;
private static final int DOLPH = 22299; private static final int DOLPH = 22299;
private static final int WEYLIN = 22298; private static final int WEYLIN = 22298;
private static final int GUARDIAN = 22303; private static final int GUARDIAN_OF_THE_SQUARE = 22303;
private static final int GUARDIAN2 = 22304; private static final int GUARDIAN_OF_THE_EMERALD = 22304;
private static final int TEARS = 25534; private static final int TEARS = 25534;
private static final int TEARS_COPY = 25535; private static final int TEARS_COPY = 25535;
private static final int KECHI = 25532; private static final int KECHI = 25532;
private static final int KECHIGUARD = 25533; private static final int KECHIS_HENCHMAN = 25533;
private static final int BAYLOR = 29099; private static final int BAYLOR = 29099;
private static final int DARNEL = 25531; private static final int DARNEL = 25531;
private static final int ALARMID = 18474; private final static int ALARM = 18474;
// private static final int[] BOSSCR = {9695,9696,9697};
private static final int[] CGMOBS = private static final int[] CGMOBS =
{ {
22311, 22311,
@ -219,7 +218,7 @@ public class CrystalCaverns extends AbstractInstance
private static final Location START_LOC = new Location(143348, 148707, -11972); private static final Location START_LOC = new Location(143348, 148707, -11972);
// Misc // Misc
private static final int TEMPLATE_ID = 10; private static final int TEMPLATE_ID = 10;
private static final boolean debug = false; private static final int MIN_LEVEL = 78;
private static final int DOOR1 = 24220021; private static final int DOOR1 = 24220021;
private static final int DOOR2 = 24220024; private static final int DOOR2 = 24220024;
private static final int DOOR3 = 24220023; private static final int DOOR3 = 24220023;
@ -496,30 +495,24 @@ public class CrystalCaverns extends AbstractInstance
{ {
addStartNpc(ORACLE_GUIDE_1, ORACLE_GUIDE_4); addStartNpc(ORACLE_GUIDE_1, ORACLE_GUIDE_4);
addTalkId(ORACLE_GUIDE_1, ORACLE_GUIDE_3, ORACLE_GUIDE_4, 32275, 32276, 32277); addTalkId(ORACLE_GUIDE_1, ORACLE_GUIDE_3, ORACLE_GUIDE_4, 32275, 32276, 32277);
addFirstTalkId(ORACLE_GUIDE_1, ORACLE_GUIDE_2, ORACLE_GUIDE_4, CRYSTAL_GOLEM, 32274, 32275, 32276, 32277); addFirstTalkId(ORACLE_GUIDE_1, ORACLE_GUIDE_2, ORACLE_GUIDE_4, CRYSTALLINE_GOLEM, 32274, 32275, 32276, 32277);
addKillId(TEARS, GK1, GK2, TEROD, WEYLIN, DOLPH, DARNEL, KECHI, GUARDIAN, GUARDIAN2, TOURMALINE, BAYLOR, ALARMID); addKillId(TEARS, GATEKEEPER_LOHAN, GATEKEEPER_PROVO, TEROD, WEYLIN, DOLPH, DARNEL, KECHI, GUARDIAN_OF_THE_SQUARE, GUARDIAN_OF_THE_EMERALD, TOURMALINE, BAYLOR, ALARM);
addSkillSeeId(BAYLOR, 25534, 32275, 32276, 32277); addSkillSeeId(BAYLOR, 25534, 32275, 32276, 32277);
addTrapActionId(DOOR_OPENING_TRAP[0]); addTrapActionId(DOOR_OPENING_TRAP[0]);
addSpellFinishedId(BAYLOR); addSpellFinishedId(BAYLOR);
addAttackId(TEARS); addAttackId(TEARS);
addKillId(MOBLIST); addKillId(MOBLIST);
addKillId(CGMOBS); addKillId(CGMOBS);
for (int zones : ZONES) addEnterZoneId(ZONES);
{ addExitZoneId(ZONES);
addEnterZoneId(zones);
addExitZoneId(zones);
}
} }
@Override @Override
protected boolean checkConditions(PlayerInstance player) protected boolean checkConditions(PlayerInstance player)
{ {
if (debug || player.canOverrideCond(PlayerCondOverride.INSTANCE_CONDITIONS)) if (player.canOverrideCond(PlayerCondOverride.INSTANCE_CONDITIONS))
{ {
if (debug) return true;
{
return true;
}
} }
final Party party = player.getParty(); final Party party = player.getParty();
@ -535,14 +528,14 @@ public class CrystalCaverns extends AbstractInstance
} }
for (PlayerInstance partyMember : party.getMembers()) for (PlayerInstance partyMember : party.getMembers())
{ {
if (partyMember.getLevel() < 78) if (partyMember.getLevel() < MIN_LEVEL)
{ {
final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY); final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY);
sm.addPcName(partyMember); sm.addPcName(partyMember);
party.broadcastPacket(sm); party.broadcastPacket(sm);
return false; return false;
} }
final ItemInstance item = partyMember.getInventory().getItemByItemId(CONT_CRYSTAL); final ItemInstance item = partyMember.getInventory().getItemByItemId(CONTAMINATED_CRYSTAL);
if (item == null) if (item == null)
{ {
final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_ITEM_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED); final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_ITEM_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED);
@ -557,8 +550,7 @@ public class CrystalCaverns extends AbstractInstance
party.broadcastPacket(sm); party.broadcastPacket(sm);
return false; return false;
} }
final Long reentertime = InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID); if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID))
if (System.currentTimeMillis() < reentertime)
{ {
final SystemMessage sm = new SystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET); final SystemMessage sm = new SystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET);
sm.addPcName(partyMember); sm.addPcName(partyMember);
@ -571,7 +563,7 @@ public class CrystalCaverns extends AbstractInstance
private boolean checkOracleConditions(PlayerInstance player) private boolean checkOracleConditions(PlayerInstance player)
{ {
if (debug) if (player.canOverrideCond(PlayerCondOverride.INSTANCE_CONDITIONS))
{ {
return true; return true;
} }
@ -609,6 +601,11 @@ public class CrystalCaverns extends AbstractInstance
private boolean checkBaylorConditions(PlayerInstance player) private boolean checkBaylorConditions(PlayerInstance player)
{ {
if (player.canOverrideCond(PlayerCondOverride.INSTANCE_CONDITIONS))
{
return true;
}
final Party party = player.getParty(); final Party party = player.getParty();
if (party == null) if (party == null)
{ {
@ -622,9 +619,9 @@ public class CrystalCaverns extends AbstractInstance
} }
for (PlayerInstance partyMember : party.getMembers()) for (PlayerInstance partyMember : party.getMembers())
{ {
final ItemInstance item1 = partyMember.getInventory().getItemByItemId(BOSS_CRYSTAL_1); final ItemInstance item1 = partyMember.getInventory().getItemByItemId(BLUE_CRYSTAL);
final ItemInstance item2 = partyMember.getInventory().getItemByItemId(BOSS_CRYSTAL_2); final ItemInstance item2 = partyMember.getInventory().getItemByItemId(RED_CRYSTAL);
final ItemInstance item3 = partyMember.getInventory().getItemByItemId(BOSS_CRYSTAL_3); final ItemInstance item3 = partyMember.getInventory().getItemByItemId(CLEAR_CRYSTAL);
if ((item1 == null) || (item2 == null) || (item3 == null)) if ((item1 == null) || (item2 == null) || (item3 == null))
{ {
final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_ITEM_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED); final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_ITEM_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED);
@ -698,7 +695,7 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (player.getParty() == null) if (player.getParty() == null)
{ {
// this can happen only if debug is true // This can happen only if gm enters solo.
player.sendMessage("Welcome to Crystal Caverns."); player.sendMessage("Welcome to Crystal Caverns.");
teleportPlayer(player, START_LOC, world.getInstanceId()); teleportPlayer(player, START_LOC, world.getInstanceId());
world.addAllowed(player); world.addAllowed(player);
@ -777,8 +774,8 @@ public class CrystalCaverns extends AbstractInstance
{ {
world.setStatus(2); world.setStatus(2);
world.keyKeepers.add(addSpawn(GK1, 148206, 149486, -12140, 32308, false, 0, false, world.getInstanceId())); world.keyKeepers.add(addSpawn(GATEKEEPER_LOHAN, 148206, 149486, -12140, 32308, false, 0, false, world.getInstanceId()));
world.keyKeepers.add(addSpawn(GK2, 148203, 151093, -12140, 31100, false, 0, false, world.getInstanceId())); world.keyKeepers.add(addSpawn(GATEKEEPER_PROVO, 148203, 151093, -12140, 31100, false, 0, false, world.getInstanceId()));
for (int[] spawn : FIRST_SPAWNS) for (int[] spawn : FIRST_SPAWNS)
{ {
@ -907,17 +904,16 @@ public class CrystalCaverns extends AbstractInstance
final QuestState qs = player.getQuestState(Q00131_BirdInACage.class.getSimpleName()); final QuestState qs = player.getQuestState(Q00131_BirdInACage.class.getSimpleName());
return (qs != null) && !qs.isCompleted() ? "32279-01.htm" : "32279.htm"; return (qs != null) && !qs.isCompleted() ? "32279-01.htm" : "32279.htm";
} }
else if (npc.getId() == CRYSTAL_GOLEM) else if (npc.getId() == CRYSTALLINE_GOLEM)
{ {
player.sendPacket(ActionFailed.STATIC_PACKET); player.sendPacket(ActionFailed.STATIC_PACKET);
} }
return ""; return null;
} }
@Override @Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isSummon) public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isSummon)
{ {
boolean doReturn = true; boolean doReturn = true;
for (WorldObject obj : targets) for (WorldObject obj : targets)
{ {
@ -1007,14 +1003,15 @@ public class CrystalCaverns extends AbstractInstance
if (tmpworld instanceof CCWorld) if (tmpworld instanceof CCWorld)
{ {
final CCWorld world = (CCWorld) tmpworld; final CCWorld world = (CCWorld) tmpworld;
if (caster.getParty() == null) final Party party = caster.getParty();
if ((party == null) && !caster.isGM())
{ {
return super.onSkillSee(npc, caster, skill, targets, isSummon); return super.onSkillSee(npc, caster, skill, targets, isSummon);
} }
else if (((world.dragonScaleStart + DRAGONSCALETIME) <= System.currentTimeMillis()) || (world.dragonScaleNeed <= 0)) else if (((world.dragonScaleStart + DRAGONSCALETIME) <= System.currentTimeMillis()) || (world.dragonScaleNeed <= 0))
{ {
world.dragonScaleStart = System.currentTimeMillis(); world.dragonScaleStart = System.currentTimeMillis();
world.dragonScaleNeed = caster.getParty().getMemberCount() - 1; world.dragonScaleNeed = ((party == null) && caster.isGM()) ? 0 : party != null ? (party.getMemberCount() - 1) : 100;
} }
else else
{ {
@ -1032,76 +1029,73 @@ public class CrystalCaverns extends AbstractInstance
@Override @Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill) public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{ {
if (npc.getId() == TEARS) final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc);
if (tmpworld instanceof CCWorld)
{ {
final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc); final CCWorld world = (CCWorld) tmpworld;
if (tmpworld instanceof CCWorld) if ((world.getStatus() != 4) && (attacker != null))
{ {
final CCWorld world = (CCWorld) tmpworld; // Lucky cheater, the code only kicks his/her ass out of the dungeon
if ((world.getStatus() != 4) && (attacker != null)) teleportPlayer(attacker, new Location(149361, 172327, -945), 0);
world.removeAllowed(attacker);
}
else if (world.tears != npc)
{
return null;
}
else if (!world.copys.isEmpty())
{
boolean notAOE = true;
if ((skill != null) && ((skill.getTargetType() == TargetType.AREA) || (skill.getTargetType() == TargetType.FRONT_AREA) || (skill.getTargetType() == TargetType.BEHIND_AREA) || (skill.getTargetType() == TargetType.AURA) || (skill.getTargetType() == TargetType.FRONT_AURA) || (skill.getTargetType() == TargetType.BEHIND_AURA)))
{ {
// Lucky cheater, the code only kicks his/her ass out of the dungeon notAOE = false;
teleportPlayer(attacker, new Location(149361, 172327, -945), 0);
world.removeAllowed(attacker);
} }
else if (world.tears != npc) if (notAOE)
{ {
return ""; for (Npc copy : world.copys)
}
else if (!world.copys.isEmpty())
{
boolean notAOE = true;
if ((skill != null) && ((skill.getTargetType() == TargetType.AREA) || (skill.getTargetType() == TargetType.FRONT_AREA) || (skill.getTargetType() == TargetType.BEHIND_AREA) || (skill.getTargetType() == TargetType.AURA) || (skill.getTargetType() == TargetType.FRONT_AURA) || (skill.getTargetType() == TargetType.BEHIND_AURA)))
{ {
notAOE = false; copy.onDecay();
} }
if (notAOE) world.copys.clear();
{
for (Npc copy : world.copys)
{
copy.onDecay();
}
world.copys.clear();
}
return "";
} }
return null;
}
final int maxHp = npc.getMaxHp(); final int maxHp = npc.getMaxHp();
final double nowHp = npc.getStatus().getCurrentHp(); final double nowHp = npc.getStatus().getCurrentHp();
final int rand = getRandom(1000); final int rand = getRandom(1000);
if ((nowHp < (maxHp * 0.4)) && (rand < 5)) if ((nowHp < (maxHp * 0.4)) && (rand < 5))
{
final Party party = attacker.getParty();
if (party != null)
{ {
final Party party = attacker.getParty(); for (PlayerInstance partyMember : party.getMembers())
if (party != null)
{ {
for (PlayerInstance partyMember : party.getMembers()) stopAttack(partyMember);
{
stopAttack(partyMember);
}
}
else
{
stopAttack(attacker);
}
final Creature target = npc.getAI().getAttackTarget();
for (int i = 0; i < 10; i++)
{
final Npc copy = addSpawn(TEARS_COPY, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0, false, attacker.getInstanceId());
copy.setRunning();
((Attackable) copy).addDamageHate(target, 0, 99999);
copy.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target);
copy.setCurrentHp(nowHp);
world.copys.add(copy);
} }
} }
else if ((nowHp < (maxHp * 0.15)) && !world.isUsedInvulSkill) else
{ {
if ((rand > 994) || (nowHp < (maxHp * 0.1))) stopAttack(attacker);
{ }
world.isUsedInvulSkill = true; final Creature target = npc.getAI().getAttackTarget();
npc.setIsInvul(true); for (int i = 0; i < 10; i++)
} {
final Npc copy = addSpawn(TEARS_COPY, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0, false, attacker.getInstanceId());
copy.setRunning();
((Attackable) copy).addDamageHate(target, 0, 99999);
copy.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target);
copy.setCurrentHp(nowHp);
world.copys.add(copy);
}
}
else if ((nowHp < (maxHp * 0.15)) && !world.isUsedInvulSkill)
{
if ((rand > 994) || (nowHp < (maxHp * 0.1)))
{
world.isUsedInvulSkill = true;
npc.setIsInvul(true);
} }
} }
} }
@ -1172,15 +1166,15 @@ public class CrystalCaverns extends AbstractInstance
else if (event.equalsIgnoreCase("spawnGuards")) else if (event.equalsIgnoreCase("spawnGuards"))
{ {
world.kechisHenchmanSpawn++; world.kechisHenchmanSpawn++;
world.guards.add(addSpawn(KECHIGUARD, 153622, 149699, -12131, 56890, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153622, 149699, -12131, 56890, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153609, 149622, -12131, 64023, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153609, 149622, -12131, 64023, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153606, 149428, -12131, 64541, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153606, 149428, -12131, 64541, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153601, 149534, -12131, 64901, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153601, 149534, -12131, 64901, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153620, 149354, -12131, 1164, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153620, 149354, -12131, 1164, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153637, 149776, -12131, 61733, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153637, 149776, -12131, 61733, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153638, 149292, -12131, 64071, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153638, 149292, -12131, 64071, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153647, 149857, -12131, 59402, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153647, 149857, -12131, 59402, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153661, 149227, -12131, 65275, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153661, 149227, -12131, 65275, false, 0, true, world.getInstanceId()));
if (world.kechisHenchmanSpawn <= 5) if (world.kechisHenchmanSpawn <= 5)
{ {
startQuestTimer("spawnGuards", SPAWN[world.kechisHenchmanSpawn], npc, null); startQuestTimer("spawnGuards", SPAWN[world.kechisHenchmanSpawn], npc, null);
@ -1294,7 +1288,7 @@ public class CrystalCaverns extends AbstractInstance
final int[] spawnLoc = getRandomEntry(ALARMSPAWN); final int[] spawnLoc = getRandomEntry(ALARMSPAWN);
npc.addSkill(SkillData.getInstance().getSkill(5244, 1)); npc.addSkill(SkillData.getInstance().getSkill(5244, 1));
npc.addSkill(SkillData.getInstance().getSkill(5245, 1)); npc.addSkill(SkillData.getInstance().getSkill(5245, 1));
world._alarm = addSpawn(ALARMID, spawnLoc[0], spawnLoc[1], spawnLoc[2], 10800, false, 0, false, world.getInstanceId()); world._alarm = addSpawn(ALARM, spawnLoc[0], spawnLoc[1], spawnLoc[2], 10800, false, 0, false, world.getInstanceId());
world._alarm.disableCoreAI(true); world._alarm.disableCoreAI(true);
world._alarm.setIsImmobilized(true); world._alarm.setIsImmobilized(true);
world._alarm.broadcastPacket(new CreatureSay(world._alarm.getObjectId(), ChatType.SHOUT, world._alarm.getName(), NpcStringId.AN_ALARM_HAS_BEEN_SET_OFF_EVERYBODY_WILL_BE_IN_DANGER_IF_THEY_ARE_NOT_TAKEN_CARE_OF_IMMEDIATELY)); world._alarm.broadcastPacket(new CreatureSay(world._alarm.getObjectId(), ChatType.SHOUT, world._alarm.getName(), NpcStringId.AN_ALARM_HAS_BEEN_SET_OFF_EVERYBODY_WILL_BE_IN_DANGER_IF_THEY_ARE_NOT_TAKEN_CARE_OF_IMMEDIATELY));
@ -1351,7 +1345,7 @@ public class CrystalCaverns extends AbstractInstance
} }
else if (!event.endsWith("Food")) else if (!event.endsWith("Food"))
{ {
return ""; return null;
} }
else if (event.equalsIgnoreCase("autoFood")) else if (event.equalsIgnoreCase("autoFood"))
{ {
@ -1361,14 +1355,14 @@ public class CrystalCaverns extends AbstractInstance
} }
if ((world.getStatus() != 3) || !world.crystalGolems.containsKey(npc) || (world.crystalGolems.get(npc).foodItem != null) || world.crystalGolems.get(npc).isAtDestination) if ((world.getStatus() != 3) || !world.crystalGolems.containsKey(npc) || (world.crystalGolems.get(npc).foodItem != null) || world.crystalGolems.get(npc).isAtDestination)
{ {
return ""; return null;
} }
final CrystalGolem cryGolem = world.crystalGolems.get(npc); final CrystalGolem cryGolem = world.crystalGolems.get(npc);
int minDist = 300000; int minDist = 300000;
for (ItemInstance object : World.getInstance().getVisibleObjectsInRange(npc, ItemInstance.class, 300)) for (ItemInstance object : World.getInstance().getVisibleObjectsInRange(npc, ItemInstance.class, 300))
{ {
if (object.getId() == CRYSTALFOOD) if (object.getId() == CRYSTAL_FRAGMENT)
{ {
final int dx = npc.getX() - object.getX(); final int dx = npc.getX() - object.getX();
final int dy = npc.getY() - object.getY(); final int dy = npc.getY() - object.getY();
@ -1393,11 +1387,11 @@ public class CrystalCaverns extends AbstractInstance
} }
startQuestTimer("autoFood", 2000, npc, null); startQuestTimer("autoFood", 2000, npc, null);
} }
return ""; return null;
} }
else if (!world.crystalGolems.containsKey(npc) || world.crystalGolems.get(npc).isAtDestination) else if (!world.crystalGolems.containsKey(npc) || world.crystalGolems.get(npc).isAtDestination)
{ {
return ""; return null;
} }
else if (event.equalsIgnoreCase("backFood")) else if (event.equalsIgnoreCase("backFood"))
{ {
@ -1419,7 +1413,7 @@ public class CrystalCaverns extends AbstractInstance
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, cryGolem.oldLoc); npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, cryGolem.oldLoc);
cancelQuestTimers("reachFood"); cancelQuestTimers("reachFood");
startQuestTimer("backFood", 2000, npc, null, true); startQuestTimer("backFood", 2000, npc, null, true);
return ""; return null;
} }
else if (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_ACTIVE) else if (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_ACTIVE)
{ {
@ -1450,7 +1444,7 @@ public class CrystalCaverns extends AbstractInstance
} }
cancelQuestTimers("reachFood"); cancelQuestTimers("reachFood");
} }
return ""; return null;
} }
else if (event.equalsIgnoreCase("getFood")) else if (event.equalsIgnoreCase("getFood"))
{ {
@ -1462,7 +1456,7 @@ public class CrystalCaverns extends AbstractInstance
cancelQuestTimers("getFood"); cancelQuestTimers("getFood");
} }
} }
return ""; return null;
} }
private void giveRewards(PlayerInstance player, int instanceId, int bossCry, boolean isBaylor) private void giveRewards(PlayerInstance player, int instanceId, int bossCry, boolean isBaylor)
@ -1476,36 +1470,36 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (partyMember.getInstanceId() == instanceId) if (partyMember.getInstanceId() == instanceId)
{ {
if (!isBaylor && hasQuestItems(partyMember, CONT_CRYSTAL)) if (!isBaylor && hasQuestItems(partyMember, CONTAMINATED_CRYSTAL))
{ {
takeItems(partyMember, CONT_CRYSTAL, 1); takeItems(partyMember, CONTAMINATED_CRYSTAL, 1);
giveItems(partyMember, bossCry, 1); giveItems(partyMember, bossCry, 1);
} }
if (getRandom(10) < 5) if (getRandom(10) < 5)
{ {
giveItems(partyMember, WHITE_SEED, num); giveItems(partyMember, WHITE_SEED_OF_EVIL_SHARD, num);
} }
else else
{ {
giveItems(partyMember, BLACK_SEED, num); giveItems(partyMember, BLACK_SEED_OF_EVIL_SHARD, num);
} }
} }
} }
} }
else if (player.getInstanceId() == instanceId) else if (player.getInstanceId() == instanceId)
{ {
if (!isBaylor && hasQuestItems(player, CONT_CRYSTAL)) if (!isBaylor && hasQuestItems(player, CONTAMINATED_CRYSTAL))
{ {
takeItems(player, CONT_CRYSTAL, 1); takeItems(player, CONTAMINATED_CRYSTAL, 1);
giveItems(player, bossCry, 1); giveItems(player, bossCry, 1);
} }
if (getRandom(10) < 5) if (getRandom(10) < 5)
{ {
giveItems(player, WHITE_SEED, num); giveItems(player, WHITE_SEED_OF_EVIL_SHARD, num);
} }
else else
{ {
giveItems(player, BLACK_SEED, num); giveItems(player, BLACK_SEED_OF_EVIL_SHARD, num);
} }
} }
@ -1525,15 +1519,15 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (!isDead) if (!isDead)
{ {
return ""; return null;
} }
} }
world.setStatus(3); world.setStatus(3);
world.tears = addSpawn(TEARS, 144298, 154420, -11854, 32767, false, 0, false, world.getInstanceId()); // Tears world.tears = addSpawn(TEARS, 144298, 154420, -11854, 32767, false, 0, false, world.getInstanceId()); // Tears
final CrystalGolem crygolem1 = new CrystalGolem(); final CrystalGolem crygolem1 = new CrystalGolem();
final CrystalGolem crygolem2 = new CrystalGolem(); final CrystalGolem crygolem2 = new CrystalGolem();
world.crystalGolems.put(addSpawn(CRYSTAL_GOLEM, 140547, 151670, -11813, 32767, false, 0, false, world.getInstanceId()), crygolem1); world.crystalGolems.put(addSpawn(CRYSTALLINE_GOLEM, 140547, 151670, -11813, 32767, false, 0, false, world.getInstanceId()), crygolem1);
world.crystalGolems.put(addSpawn(CRYSTAL_GOLEM, 141941, 151684, -11813, 63371, false, 0, false, world.getInstanceId()), crygolem2); world.crystalGolems.put(addSpawn(CRYSTALLINE_GOLEM, 141941, 151684, -11813, 63371, false, 0, false, world.getInstanceId()), crygolem2);
for (Npc crygolem : world.crystalGolems.keySet()) for (Npc crygolem : world.crystalGolems.keySet())
{ {
startQuestTimer("autoFood", 2000, crygolem, null); startQuestTimer("autoFood", 2000, crygolem, null);
@ -1543,16 +1537,16 @@ public class CrystalCaverns extends AbstractInstance
{ {
InstanceManager.getInstance().getInstance(world.getInstanceId()).setDuration(300000); InstanceManager.getInstance().getInstance(world.getInstanceId()).setDuration(300000);
addSpawn(32280, 144312, 154420, -11855, 0, false, 0, false, world.getInstanceId()); addSpawn(32280, 144312, 154420, -11855, 0, false, 0, false, world.getInstanceId());
giveRewards(player, npc.getInstanceId(), BOSS_CRYSTAL_3, false); giveRewards(player, npc.getInstanceId(), CLEAR_CRYSTAL, false);
} }
else if ((world.getStatus() == 2) && world.keyKeepers.contains(npc)) else if ((world.getStatus() == 2) && world.keyKeepers.contains(npc))
{ {
if (npc.getId() == GK1) if (npc.getId() == GATEKEEPER_LOHAN)
{ {
npc.dropItem(player, 9698, 1); npc.dropItem(player, 9698, 1);
runEmeraldSquare(world); runEmeraldSquare(world);
} }
else if (npc.getId() == GK2) else if (npc.getId() == GATEKEEPER_PROVO)
{ {
npc.dropItem(player, 9699, 1); npc.dropItem(player, 9699, 1);
runSteamRooms(world, STEAM1_SPAWNS, 22); runSteamRooms(world, STEAM1_SPAWNS, 22);
@ -1592,7 +1586,7 @@ public class CrystalCaverns extends AbstractInstance
} }
else else
{ {
return ""; return null;
} }
} }
else if (world.getStatus() == 4) else if (world.getStatus() == 4)
@ -1625,7 +1619,8 @@ public class CrystalCaverns extends AbstractInstance
{ {
world.setStatus(8); world.setStatus(8);
// first door opener trap // first door opener trap
addTrap(DOOR_OPENING_TRAP[0], DOOR_OPENING_TRAP[1], DOOR_OPENING_TRAP[2], DOOR_OPENING_TRAP[3], DOOR_OPENING_TRAP[4], null, world.getInstanceId()); Npc trap = addTrap(DOOR_OPENING_TRAP[0], DOOR_OPENING_TRAP[1], DOOR_OPENING_TRAP[2], DOOR_OPENING_TRAP[3], DOOR_OPENING_TRAP[4], null, world.getInstanceId());
trap.broadcastSay(ChatType.NPC_SHOUT, NpcStringId.YOU_HAVE_FINALLY_COME_HERE_BUT_YOU_WILL_NOT_BE_ABLE_TO_FIND_THE_SECRET_ROOM);
} }
} }
else if (world.getStatus() == 8) else if (world.getStatus() == 8)
@ -1697,12 +1692,12 @@ public class CrystalCaverns extends AbstractInstance
world.openDoor(DOOR4); world.openDoor(DOOR4);
final Npc kechi = addSpawn(KECHI, 154069, 149525, -12158, 51165, false, 0, false, world.getInstanceId()); final Npc kechi = addSpawn(KECHI, 154069, 149525, -12158, 51165, false, 0, false, world.getInstanceId());
startQuestTimer("checkKechiAttack", 1000, kechi, null); startQuestTimer("checkKechiAttack", 1000, kechi, null);
return ""; return null;
} }
default: default:
{ {
LOGGER.warning("CrystalCavern-SteamCorridor: status " + world.getStatus() + " error. OracleOrder not found in " + world.getInstanceId()); LOGGER.warning("CrystalCavern-SteamCorridor: status " + world.getStatus() + " error. OracleOrder not found in " + world.getInstanceId());
return ""; return null;
} }
} }
runSteamOracles(world, oracleOrder); runSteamOracles(world, oracleOrder);
@ -1714,26 +1709,25 @@ public class CrystalCaverns extends AbstractInstance
int bossCry; int bossCry;
if (npc.getId() == KECHI) if (npc.getId() == KECHI)
{ {
bossCry = BOSS_CRYSTAL_2; bossCry = RED_CRYSTAL;
cancelQuestTimers("spawnGuards"); cancelQuestTimers("spawnGuards");
addSpawn(32280, 154077, 149527, -12159, 0, false, 0, false, world.getInstanceId()); addSpawn(32280, 154077, 149527, -12159, 0, false, 0, false, world.getInstanceId());
} }
else if (npc.getId() == DARNEL) else if (npc.getId() == DARNEL)
{ {
bossCry = BOSS_CRYSTAL_1; bossCry = BLUE_CRYSTAL;
addSpawn(32280, 152761, 145950, -12588, 0, false, 0, false, world.getInstanceId()); addSpawn(32280, 152761, 145950, -12588, 0, false, 0, false, world.getInstanceId());
} }
else else
{ {
// something is wrong // something is wrong
return ""; return null;
} }
giveRewards(player, npc.getInstanceId(), bossCry, false); giveRewards(player, npc.getInstanceId(), bossCry, false);
} }
if (npc.getId() == ALARMID) if (npc.getId() == ALARM)
{ {
world._alarm = null; world._alarm = null;
if (world._baylor != null) if (world._baylor != null)
{ {
world._baylor.removeSkill(5244); world._baylor.removeSkill(5244);
@ -1756,7 +1750,7 @@ public class CrystalCaverns extends AbstractInstance
giveRewards(player, npc.getInstanceId(), -1, true); giveRewards(player, npc.getInstanceId(), -1, true);
} }
} }
return ""; return null;
} }
@Override @Override
@ -1776,10 +1770,10 @@ public class CrystalCaverns extends AbstractInstance
if (world.getTemplateId() == TEMPLATE_ID) if (world.getTemplateId() == TEMPLATE_ID)
{ {
onEnterInstance(player, world, false); onEnterInstance(player, world, false);
return ""; return null;
} }
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANCE_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON); player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANCE_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON);
return ""; return null;
} }
if (checkConditions(player)) if (checkConditions(player))
@ -1801,14 +1795,14 @@ public class CrystalCaverns extends AbstractInstance
} }
} }
return ""; return null;
} }
final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc); final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc);
if (tmpworld instanceof CCWorld) if (tmpworld instanceof CCWorld)
{ {
final CCWorld world = (CCWorld) tmpworld; final CCWorld world = (CCWorld) tmpworld;
if (npcId == CRYSTAL_GOLEM) if (npcId == CRYSTALLINE_GOLEM)
{ {
} }
else if ((npc.getId() >= 32275) && (npc.getId() <= 32277) && world.OracleTriggered[npc.getId() - 32275]) else if ((npc.getId() >= 32275) && (npc.getId() <= 32277) && world.OracleTriggered[npc.getId() - 32275])
@ -1919,7 +1913,7 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (!checkOracleConditions(player)) if (!checkOracleConditions(player))
{ {
return ""; return null;
} }
else if (party != null) else if (party != null)
{ {
@ -1950,14 +1944,14 @@ public class CrystalCaverns extends AbstractInstance
for (PlayerInstance partyMember : party.getMembers()) for (PlayerInstance partyMember : party.getMembers())
{ {
// int rnd = getRandom(100); // int rnd = getRandom(100);
// partyMember.destroyItemByItemId("Quest", (rnd < 33 ? BOSS_CRYSTAL_1:(rnd < 67 ? BOSS_CRYSTAL_2:BOSS_CRYSTAL_3)), 1, partyMember, true); Crystals are no longer beign cunsumed while entering to Baylor Lair. // partyMember.destroyItemByItemId("Quest", (rnd < 33 ? BLUE_CRYSTAL:(rnd < 67 ? RED_CRYSTAL:CLEAR_CRYSTAL)), 1, partyMember, true); Crystals are no longer beign cunsumed while entering to Baylor Lair.
world._raiders.add(partyMember); world._raiders.add(partyMember);
} }
} }
} }
else else
{ {
return ""; return null;
} }
world.setStatus(30); world.setStatus(30);
final long time = world.endTime - System.currentTimeMillis(); final long time = world.endTime - System.currentTimeMillis();
@ -1972,10 +1966,12 @@ public class CrystalCaverns extends AbstractInstance
final int x = (int) (radius * Math.cos((i * 2 * Math.PI) / members)); final int x = (int) (radius * Math.cos((i * 2 * Math.PI) / members));
final int y = (int) (radius * Math.sin((i++ * 2 * Math.PI) / members)); final int y = (int) (radius * Math.sin((i++ * 2 * Math.PI) / members));
p.teleToLocation(new Location(153571 + x, 142075 + y, -12737)); p.teleToLocation(new Location(153571 + x, 142075 + y, -12737));
p.setInstanceId(world.getInstanceId());
final Summon pet = p.getSummon(); final Summon pet = p.getSummon();
if (pet != null) if (pet != null)
{ {
pet.teleToLocation(new Location(153571 + x, 142075 + y, -12737), true); pet.teleToLocation(new Location(153571 + x, 142075 + y, -12737), true);
pet.setInstanceId(world.getInstanceId());
pet.broadcastPacket(new ValidateLocation(pet)); pet.broadcastPacket(new ValidateLocation(pet));
} }
p.setIsParalyzed(true); p.setIsParalyzed(true);
@ -1988,7 +1984,7 @@ public class CrystalCaverns extends AbstractInstance
teleportPlayer(player, new Location(153522, 144212, -9747), npc.getInstanceId()); teleportPlayer(player, new Location(153522, 144212, -9747), npc.getInstanceId());
} }
} }
return ""; return null;
} }
@Override @Override
@ -2058,19 +2054,19 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (door.isOpen()) if (door.isOpen())
{ {
return ""; return null;
} }
if (!hasQuestItems((PlayerInstance) creature, RACE_KEY)) if (!hasQuestItems((PlayerInstance) creature, SECRET_KEY))
{ {
return ""; return null;
} }
if (world.roomsStatus[zone.getId() - 20104] == 0) if (world.roomsStatus[zone.getId() - 20104] == 0)
{ {
runEmeraldRooms(world, spawns, room); runEmeraldRooms(world, spawns, room);
} }
door.openMe(); door.openMe();
takeItems((PlayerInstance) creature, RACE_KEY, 1); takeItems((PlayerInstance) creature, SECRET_KEY, 1);
world.openedDoors.put(door, (PlayerInstance) creature); world.openedDoors.put(door, (PlayerInstance) creature);
break; break;
} }

View File

@ -131,45 +131,44 @@ public class CrystalCaverns extends AbstractInstance
} }
// Items // Items
private static final int WHITE_SEED = 9597; private static final int WHITE_SEED_OF_EVIL_SHARD = 9597;
private static final int BLACK_SEED = 9598; private static final int BLACK_SEED_OF_EVIL_SHARD = 9598;
private static final int CONT_CRYSTAL = 9690; // Contaminated Crystal private static final int CONTAMINATED_CRYSTAL = 9690;
private static final int RED_CORAL = 9692; // Red Coral private static final int RED_CORAL = 9692;
private static final int CRYSTALFOOD = 9693; // Food item for Crystal Golems private static final int CRYSTAL_FRAGMENT = 9693;
private static final int RACE_KEY = 9694; // Race Key for Emerald doors private static final int SECRET_KEY = 9694;
private static final int BOSS_CRYSTAL_1 = 9695; // Clear Crystal private static final int BLUE_CRYSTAL = 9695;
private static final int BOSS_CRYSTAL_2 = 9696; // Clear Crystal private static final int RED_CRYSTAL = 9696;
private static final int BOSS_CRYSTAL_3 = 9697; // Clear Crystal private static final int CLEAR_CRYSTAL = 9697;
// NPCs // NPCs
private static final int ORACLE_GUIDE_1 = 32281; private static final int ORACLE_GUIDE_1 = 32281;
private static final int ORACLE_GUIDE_2 = 32278; private static final int ORACLE_GUIDE_2 = 32278;
private static final int ORACLE_GUIDE_3 = 32280; private static final int ORACLE_GUIDE_3 = 32280;
private static final int ORACLE_GUIDE_4 = 32279; private static final int ORACLE_GUIDE_4 = 32279;
private static final int CRYSTAL_GOLEM = 32328; private static final int CRYSTALLINE_GOLEM = 32328;
private static final int[] DOOR_OPENING_TRAP = private static final int[] DOOR_OPENING_TRAP =
{ {
18378, 18378,
143682, 143680,
142492, 142608,
-11886, -11886,
16384 0
}; };
private static final int GK1 = 22275; private static final int GATEKEEPER_LOHAN = 22275;
private static final int GK2 = 22277; private static final int GATEKEEPER_PROVO = 22277;
private static final int TOURMALINE = 22292; private static final int TOURMALINE = 22292;
private static final int TEROD = 22301; private static final int TEROD = 22301;
private static final int DOLPH = 22299; private static final int DOLPH = 22299;
private static final int WEYLIN = 22298; private static final int WEYLIN = 22298;
private static final int GUARDIAN = 22303; private static final int GUARDIAN_OF_THE_SQUARE = 22303;
private static final int GUARDIAN2 = 22304; private static final int GUARDIAN_OF_THE_EMERALD = 22304;
private static final int TEARS = 25534; private static final int TEARS = 25534;
private static final int TEARS_COPY = 25535; private static final int TEARS_COPY = 25535;
private static final int KECHI = 25532; private static final int KECHI = 25532;
private static final int KECHIGUARD = 25533; private static final int KECHIS_HENCHMAN = 25533;
private static final int BAYLOR = 29099; private static final int BAYLOR = 29099;
private static final int DARNEL = 25531; private static final int DARNEL = 25531;
private static final int ALARMID = 18474; private final static int ALARM = 18474;
// private static final int[] BOSSCR = {9695,9696,9697};
private static final int[] CGMOBS = private static final int[] CGMOBS =
{ {
22311, 22311,
@ -219,7 +218,7 @@ public class CrystalCaverns extends AbstractInstance
private static final Location START_LOC = new Location(143348, 148707, -11972); private static final Location START_LOC = new Location(143348, 148707, -11972);
// Misc // Misc
private static final int TEMPLATE_ID = 10; private static final int TEMPLATE_ID = 10;
private static final boolean debug = false; private static final int MIN_LEVEL = 78;
private static final int DOOR1 = 24220021; private static final int DOOR1 = 24220021;
private static final int DOOR2 = 24220024; private static final int DOOR2 = 24220024;
private static final int DOOR3 = 24220023; private static final int DOOR3 = 24220023;
@ -496,30 +495,24 @@ public class CrystalCaverns extends AbstractInstance
{ {
addStartNpc(ORACLE_GUIDE_1, ORACLE_GUIDE_4); addStartNpc(ORACLE_GUIDE_1, ORACLE_GUIDE_4);
addTalkId(ORACLE_GUIDE_1, ORACLE_GUIDE_3, ORACLE_GUIDE_4, 32275, 32276, 32277); addTalkId(ORACLE_GUIDE_1, ORACLE_GUIDE_3, ORACLE_GUIDE_4, 32275, 32276, 32277);
addFirstTalkId(ORACLE_GUIDE_1, ORACLE_GUIDE_2, ORACLE_GUIDE_4, CRYSTAL_GOLEM, 32274, 32275, 32276, 32277); addFirstTalkId(ORACLE_GUIDE_1, ORACLE_GUIDE_2, ORACLE_GUIDE_4, CRYSTALLINE_GOLEM, 32274, 32275, 32276, 32277);
addKillId(TEARS, GK1, GK2, TEROD, WEYLIN, DOLPH, DARNEL, KECHI, GUARDIAN, GUARDIAN2, TOURMALINE, BAYLOR, ALARMID); addKillId(TEARS, GATEKEEPER_LOHAN, GATEKEEPER_PROVO, TEROD, WEYLIN, DOLPH, DARNEL, KECHI, GUARDIAN_OF_THE_SQUARE, GUARDIAN_OF_THE_EMERALD, TOURMALINE, BAYLOR, ALARM);
addSkillSeeId(BAYLOR, 25534, 32275, 32276, 32277); addSkillSeeId(BAYLOR, 25534, 32275, 32276, 32277);
addTrapActionId(DOOR_OPENING_TRAP[0]); addTrapActionId(DOOR_OPENING_TRAP[0]);
addSpellFinishedId(BAYLOR); addSpellFinishedId(BAYLOR);
addAttackId(TEARS); addAttackId(TEARS);
addKillId(MOBLIST); addKillId(MOBLIST);
addKillId(CGMOBS); addKillId(CGMOBS);
for (int zones : ZONES) addEnterZoneId(ZONES);
{ addExitZoneId(ZONES);
addEnterZoneId(zones);
addExitZoneId(zones);
}
} }
@Override @Override
protected boolean checkConditions(PlayerInstance player) protected boolean checkConditions(PlayerInstance player)
{ {
if (debug || player.canOverrideCond(PlayerCondOverride.INSTANCE_CONDITIONS)) if (player.canOverrideCond(PlayerCondOverride.INSTANCE_CONDITIONS))
{ {
if (debug) return true;
{
return true;
}
} }
final Party party = player.getParty(); final Party party = player.getParty();
@ -535,14 +528,14 @@ public class CrystalCaverns extends AbstractInstance
} }
for (PlayerInstance partyMember : party.getMembers()) for (PlayerInstance partyMember : party.getMembers())
{ {
if (partyMember.getLevel() < 78) if (partyMember.getLevel() < MIN_LEVEL)
{ {
final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY); final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY);
sm.addPcName(partyMember); sm.addPcName(partyMember);
party.broadcastPacket(sm); party.broadcastPacket(sm);
return false; return false;
} }
final ItemInstance item = partyMember.getInventory().getItemByItemId(CONT_CRYSTAL); final ItemInstance item = partyMember.getInventory().getItemByItemId(CONTAMINATED_CRYSTAL);
if (item == null) if (item == null)
{ {
final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_ITEM_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED); final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_ITEM_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED);
@ -557,8 +550,7 @@ public class CrystalCaverns extends AbstractInstance
party.broadcastPacket(sm); party.broadcastPacket(sm);
return false; return false;
} }
final Long reentertime = InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID); if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID))
if (System.currentTimeMillis() < reentertime)
{ {
final SystemMessage sm = new SystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET); final SystemMessage sm = new SystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET);
sm.addPcName(partyMember); sm.addPcName(partyMember);
@ -571,7 +563,7 @@ public class CrystalCaverns extends AbstractInstance
private boolean checkOracleConditions(PlayerInstance player) private boolean checkOracleConditions(PlayerInstance player)
{ {
if (debug) if (player.canOverrideCond(PlayerCondOverride.INSTANCE_CONDITIONS))
{ {
return true; return true;
} }
@ -609,6 +601,11 @@ public class CrystalCaverns extends AbstractInstance
private boolean checkBaylorConditions(PlayerInstance player) private boolean checkBaylorConditions(PlayerInstance player)
{ {
if (player.canOverrideCond(PlayerCondOverride.INSTANCE_CONDITIONS))
{
return true;
}
final Party party = player.getParty(); final Party party = player.getParty();
if (party == null) if (party == null)
{ {
@ -622,9 +619,9 @@ public class CrystalCaverns extends AbstractInstance
} }
for (PlayerInstance partyMember : party.getMembers()) for (PlayerInstance partyMember : party.getMembers())
{ {
final ItemInstance item1 = partyMember.getInventory().getItemByItemId(BOSS_CRYSTAL_1); final ItemInstance item1 = partyMember.getInventory().getItemByItemId(BLUE_CRYSTAL);
final ItemInstance item2 = partyMember.getInventory().getItemByItemId(BOSS_CRYSTAL_2); final ItemInstance item2 = partyMember.getInventory().getItemByItemId(RED_CRYSTAL);
final ItemInstance item3 = partyMember.getInventory().getItemByItemId(BOSS_CRYSTAL_3); final ItemInstance item3 = partyMember.getInventory().getItemByItemId(CLEAR_CRYSTAL);
if ((item1 == null) || (item2 == null) || (item3 == null)) if ((item1 == null) || (item2 == null) || (item3 == null))
{ {
final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_ITEM_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED); final SystemMessage sm = new SystemMessage(SystemMessageId.C1_S_ITEM_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED);
@ -698,7 +695,7 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (player.getParty() == null) if (player.getParty() == null)
{ {
// this can happen only if debug is true // This can happen only if gm enters solo.
player.sendMessage("Welcome to Crystal Caverns."); player.sendMessage("Welcome to Crystal Caverns.");
teleportPlayer(player, START_LOC, world.getInstanceId()); teleportPlayer(player, START_LOC, world.getInstanceId());
world.addAllowed(player); world.addAllowed(player);
@ -777,8 +774,8 @@ public class CrystalCaverns extends AbstractInstance
{ {
world.setStatus(2); world.setStatus(2);
world.keyKeepers.add(addSpawn(GK1, 148206, 149486, -12140, 32308, false, 0, false, world.getInstanceId())); world.keyKeepers.add(addSpawn(GATEKEEPER_LOHAN, 148206, 149486, -12140, 32308, false, 0, false, world.getInstanceId()));
world.keyKeepers.add(addSpawn(GK2, 148203, 151093, -12140, 31100, false, 0, false, world.getInstanceId())); world.keyKeepers.add(addSpawn(GATEKEEPER_PROVO, 148203, 151093, -12140, 31100, false, 0, false, world.getInstanceId()));
for (int[] spawn : FIRST_SPAWNS) for (int[] spawn : FIRST_SPAWNS)
{ {
@ -907,17 +904,16 @@ public class CrystalCaverns extends AbstractInstance
final QuestState qs = player.getQuestState(Q00131_BirdInACage.class.getSimpleName()); final QuestState qs = player.getQuestState(Q00131_BirdInACage.class.getSimpleName());
return (qs != null) && !qs.isCompleted() ? "32279-01.htm" : "32279.htm"; return (qs != null) && !qs.isCompleted() ? "32279-01.htm" : "32279.htm";
} }
else if (npc.getId() == CRYSTAL_GOLEM) else if (npc.getId() == CRYSTALLINE_GOLEM)
{ {
player.sendPacket(ActionFailed.STATIC_PACKET); player.sendPacket(ActionFailed.STATIC_PACKET);
} }
return ""; return null;
} }
@Override @Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isSummon) public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isSummon)
{ {
boolean doReturn = true; boolean doReturn = true;
for (WorldObject obj : targets) for (WorldObject obj : targets)
{ {
@ -1007,14 +1003,15 @@ public class CrystalCaverns extends AbstractInstance
if (tmpworld instanceof CCWorld) if (tmpworld instanceof CCWorld)
{ {
final CCWorld world = (CCWorld) tmpworld; final CCWorld world = (CCWorld) tmpworld;
if (caster.getParty() == null) final Party party = caster.getParty();
if ((party == null) && !caster.isGM())
{ {
return super.onSkillSee(npc, caster, skill, targets, isSummon); return super.onSkillSee(npc, caster, skill, targets, isSummon);
} }
else if (((world.dragonScaleStart + DRAGONSCALETIME) <= System.currentTimeMillis()) || (world.dragonScaleNeed <= 0)) else if (((world.dragonScaleStart + DRAGONSCALETIME) <= System.currentTimeMillis()) || (world.dragonScaleNeed <= 0))
{ {
world.dragonScaleStart = System.currentTimeMillis(); world.dragonScaleStart = System.currentTimeMillis();
world.dragonScaleNeed = caster.getParty().getMemberCount() - 1; world.dragonScaleNeed = ((party == null) && caster.isGM()) ? 0 : party != null ? (party.getMemberCount() - 1) : 100;
} }
else else
{ {
@ -1032,76 +1029,73 @@ public class CrystalCaverns extends AbstractInstance
@Override @Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill) public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{ {
if (npc.getId() == TEARS) final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc);
if (tmpworld instanceof CCWorld)
{ {
final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc); final CCWorld world = (CCWorld) tmpworld;
if (tmpworld instanceof CCWorld) if ((world.getStatus() != 4) && (attacker != null))
{ {
final CCWorld world = (CCWorld) tmpworld; // Lucky cheater, the code only kicks his/her ass out of the dungeon
if ((world.getStatus() != 4) && (attacker != null)) teleportPlayer(attacker, new Location(149361, 172327, -945), 0);
world.removeAllowed(attacker);
}
else if (world.tears != npc)
{
return null;
}
else if (!world.copys.isEmpty())
{
boolean notAOE = true;
if ((skill != null) && ((skill.getTargetType() == TargetType.AREA) || (skill.getTargetType() == TargetType.FRONT_AREA) || (skill.getTargetType() == TargetType.BEHIND_AREA) || (skill.getTargetType() == TargetType.AURA) || (skill.getTargetType() == TargetType.FRONT_AURA) || (skill.getTargetType() == TargetType.BEHIND_AURA)))
{ {
// Lucky cheater, the code only kicks his/her ass out of the dungeon notAOE = false;
teleportPlayer(attacker, new Location(149361, 172327, -945), 0);
world.removeAllowed(attacker);
} }
else if (world.tears != npc) if (notAOE)
{ {
return ""; for (Npc copy : world.copys)
}
else if (!world.copys.isEmpty())
{
boolean notAOE = true;
if ((skill != null) && ((skill.getTargetType() == TargetType.AREA) || (skill.getTargetType() == TargetType.FRONT_AREA) || (skill.getTargetType() == TargetType.BEHIND_AREA) || (skill.getTargetType() == TargetType.AURA) || (skill.getTargetType() == TargetType.FRONT_AURA) || (skill.getTargetType() == TargetType.BEHIND_AURA)))
{ {
notAOE = false; copy.onDecay();
} }
if (notAOE) world.copys.clear();
{
for (Npc copy : world.copys)
{
copy.onDecay();
}
world.copys.clear();
}
return "";
} }
return null;
}
final int maxHp = npc.getMaxHp(); final int maxHp = npc.getMaxHp();
final double nowHp = npc.getStatus().getCurrentHp(); final double nowHp = npc.getStatus().getCurrentHp();
final int rand = getRandom(1000); final int rand = getRandom(1000);
if ((nowHp < (maxHp * 0.4)) && (rand < 5)) if ((nowHp < (maxHp * 0.4)) && (rand < 5))
{
final Party party = attacker.getParty();
if (party != null)
{ {
final Party party = attacker.getParty(); for (PlayerInstance partyMember : party.getMembers())
if (party != null)
{ {
for (PlayerInstance partyMember : party.getMembers()) stopAttack(partyMember);
{
stopAttack(partyMember);
}
}
else
{
stopAttack(attacker);
}
final Creature target = npc.getAI().getAttackTarget();
for (int i = 0; i < 10; i++)
{
final Npc copy = addSpawn(TEARS_COPY, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0, false, attacker.getInstanceId());
copy.setRunning();
((Attackable) copy).addDamageHate(target, 0, 99999);
copy.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target);
copy.setCurrentHp(nowHp);
world.copys.add(copy);
} }
} }
else if ((nowHp < (maxHp * 0.15)) && !world.isUsedInvulSkill) else
{ {
if ((rand > 994) || (nowHp < (maxHp * 0.1))) stopAttack(attacker);
{ }
world.isUsedInvulSkill = true; final Creature target = npc.getAI().getAttackTarget();
npc.setIsInvul(true); for (int i = 0; i < 10; i++)
} {
final Npc copy = addSpawn(TEARS_COPY, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0, false, attacker.getInstanceId());
copy.setRunning();
((Attackable) copy).addDamageHate(target, 0, 99999);
copy.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target);
copy.setCurrentHp(nowHp);
world.copys.add(copy);
}
}
else if ((nowHp < (maxHp * 0.15)) && !world.isUsedInvulSkill)
{
if ((rand > 994) || (nowHp < (maxHp * 0.1)))
{
world.isUsedInvulSkill = true;
npc.setIsInvul(true);
} }
} }
} }
@ -1172,15 +1166,15 @@ public class CrystalCaverns extends AbstractInstance
else if (event.equalsIgnoreCase("spawnGuards")) else if (event.equalsIgnoreCase("spawnGuards"))
{ {
world.kechisHenchmanSpawn++; world.kechisHenchmanSpawn++;
world.guards.add(addSpawn(KECHIGUARD, 153622, 149699, -12131, 56890, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153622, 149699, -12131, 56890, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153609, 149622, -12131, 64023, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153609, 149622, -12131, 64023, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153606, 149428, -12131, 64541, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153606, 149428, -12131, 64541, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153601, 149534, -12131, 64901, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153601, 149534, -12131, 64901, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153620, 149354, -12131, 1164, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153620, 149354, -12131, 1164, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153637, 149776, -12131, 61733, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153637, 149776, -12131, 61733, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153638, 149292, -12131, 64071, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153638, 149292, -12131, 64071, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153647, 149857, -12131, 59402, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153647, 149857, -12131, 59402, false, 0, true, world.getInstanceId()));
world.guards.add(addSpawn(KECHIGUARD, 153661, 149227, -12131, 65275, false, 0, false, world.getInstanceId())); world.guards.add(addSpawn(KECHIS_HENCHMAN, 153661, 149227, -12131, 65275, false, 0, true, world.getInstanceId()));
if (world.kechisHenchmanSpawn <= 5) if (world.kechisHenchmanSpawn <= 5)
{ {
startQuestTimer("spawnGuards", SPAWN[world.kechisHenchmanSpawn], npc, null); startQuestTimer("spawnGuards", SPAWN[world.kechisHenchmanSpawn], npc, null);
@ -1294,7 +1288,7 @@ public class CrystalCaverns extends AbstractInstance
final int[] spawnLoc = getRandomEntry(ALARMSPAWN); final int[] spawnLoc = getRandomEntry(ALARMSPAWN);
npc.addSkill(SkillData.getInstance().getSkill(5244, 1)); npc.addSkill(SkillData.getInstance().getSkill(5244, 1));
npc.addSkill(SkillData.getInstance().getSkill(5245, 1)); npc.addSkill(SkillData.getInstance().getSkill(5245, 1));
world._alarm = addSpawn(ALARMID, spawnLoc[0], spawnLoc[1], spawnLoc[2], 10800, false, 0, false, world.getInstanceId()); world._alarm = addSpawn(ALARM, spawnLoc[0], spawnLoc[1], spawnLoc[2], 10800, false, 0, false, world.getInstanceId());
world._alarm.disableCoreAI(true); world._alarm.disableCoreAI(true);
world._alarm.setIsImmobilized(true); world._alarm.setIsImmobilized(true);
world._alarm.broadcastPacket(new CreatureSay(world._alarm.getObjectId(), ChatType.SHOUT, world._alarm.getName(), NpcStringId.AN_ALARM_HAS_BEEN_SET_OFF_EVERYBODY_WILL_BE_IN_DANGER_IF_THEY_ARE_NOT_TAKEN_CARE_OF_IMMEDIATELY)); world._alarm.broadcastPacket(new CreatureSay(world._alarm.getObjectId(), ChatType.SHOUT, world._alarm.getName(), NpcStringId.AN_ALARM_HAS_BEEN_SET_OFF_EVERYBODY_WILL_BE_IN_DANGER_IF_THEY_ARE_NOT_TAKEN_CARE_OF_IMMEDIATELY));
@ -1351,7 +1345,7 @@ public class CrystalCaverns extends AbstractInstance
} }
else if (!event.endsWith("Food")) else if (!event.endsWith("Food"))
{ {
return ""; return null;
} }
else if (event.equalsIgnoreCase("autoFood")) else if (event.equalsIgnoreCase("autoFood"))
{ {
@ -1361,14 +1355,14 @@ public class CrystalCaverns extends AbstractInstance
} }
if ((world.getStatus() != 3) || !world.crystalGolems.containsKey(npc) || (world.crystalGolems.get(npc).foodItem != null) || world.crystalGolems.get(npc).isAtDestination) if ((world.getStatus() != 3) || !world.crystalGolems.containsKey(npc) || (world.crystalGolems.get(npc).foodItem != null) || world.crystalGolems.get(npc).isAtDestination)
{ {
return ""; return null;
} }
final CrystalGolem cryGolem = world.crystalGolems.get(npc); final CrystalGolem cryGolem = world.crystalGolems.get(npc);
int minDist = 300000; int minDist = 300000;
for (ItemInstance object : World.getInstance().getVisibleObjectsInRange(npc, ItemInstance.class, 300)) for (ItemInstance object : World.getInstance().getVisibleObjectsInRange(npc, ItemInstance.class, 300))
{ {
if (object.getId() == CRYSTALFOOD) if (object.getId() == CRYSTAL_FRAGMENT)
{ {
final int dx = npc.getX() - object.getX(); final int dx = npc.getX() - object.getX();
final int dy = npc.getY() - object.getY(); final int dy = npc.getY() - object.getY();
@ -1393,11 +1387,11 @@ public class CrystalCaverns extends AbstractInstance
} }
startQuestTimer("autoFood", 2000, npc, null); startQuestTimer("autoFood", 2000, npc, null);
} }
return ""; return null;
} }
else if (!world.crystalGolems.containsKey(npc) || world.crystalGolems.get(npc).isAtDestination) else if (!world.crystalGolems.containsKey(npc) || world.crystalGolems.get(npc).isAtDestination)
{ {
return ""; return null;
} }
else if (event.equalsIgnoreCase("backFood")) else if (event.equalsIgnoreCase("backFood"))
{ {
@ -1419,7 +1413,7 @@ public class CrystalCaverns extends AbstractInstance
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, cryGolem.oldLoc); npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, cryGolem.oldLoc);
cancelQuestTimers("reachFood"); cancelQuestTimers("reachFood");
startQuestTimer("backFood", 2000, npc, null, true); startQuestTimer("backFood", 2000, npc, null, true);
return ""; return null;
} }
else if (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_ACTIVE) else if (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_ACTIVE)
{ {
@ -1450,7 +1444,7 @@ public class CrystalCaverns extends AbstractInstance
} }
cancelQuestTimers("reachFood"); cancelQuestTimers("reachFood");
} }
return ""; return null;
} }
else if (event.equalsIgnoreCase("getFood")) else if (event.equalsIgnoreCase("getFood"))
{ {
@ -1462,7 +1456,7 @@ public class CrystalCaverns extends AbstractInstance
cancelQuestTimers("getFood"); cancelQuestTimers("getFood");
} }
} }
return ""; return null;
} }
private void giveRewards(PlayerInstance player, int instanceId, int bossCry, boolean isBaylor) private void giveRewards(PlayerInstance player, int instanceId, int bossCry, boolean isBaylor)
@ -1476,36 +1470,36 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (partyMember.getInstanceId() == instanceId) if (partyMember.getInstanceId() == instanceId)
{ {
if (!isBaylor && hasQuestItems(partyMember, CONT_CRYSTAL)) if (!isBaylor && hasQuestItems(partyMember, CONTAMINATED_CRYSTAL))
{ {
takeItems(partyMember, CONT_CRYSTAL, 1); takeItems(partyMember, CONTAMINATED_CRYSTAL, 1);
giveItems(partyMember, bossCry, 1); giveItems(partyMember, bossCry, 1);
} }
if (getRandom(10) < 5) if (getRandom(10) < 5)
{ {
giveItems(partyMember, WHITE_SEED, num); giveItems(partyMember, WHITE_SEED_OF_EVIL_SHARD, num);
} }
else else
{ {
giveItems(partyMember, BLACK_SEED, num); giveItems(partyMember, BLACK_SEED_OF_EVIL_SHARD, num);
} }
} }
} }
} }
else if (player.getInstanceId() == instanceId) else if (player.getInstanceId() == instanceId)
{ {
if (!isBaylor && hasQuestItems(player, CONT_CRYSTAL)) if (!isBaylor && hasQuestItems(player, CONTAMINATED_CRYSTAL))
{ {
takeItems(player, CONT_CRYSTAL, 1); takeItems(player, CONTAMINATED_CRYSTAL, 1);
giveItems(player, bossCry, 1); giveItems(player, bossCry, 1);
} }
if (getRandom(10) < 5) if (getRandom(10) < 5)
{ {
giveItems(player, WHITE_SEED, num); giveItems(player, WHITE_SEED_OF_EVIL_SHARD, num);
} }
else else
{ {
giveItems(player, BLACK_SEED, num); giveItems(player, BLACK_SEED_OF_EVIL_SHARD, num);
} }
} }
@ -1525,15 +1519,15 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (!isDead) if (!isDead)
{ {
return ""; return null;
} }
} }
world.setStatus(3); world.setStatus(3);
world.tears = addSpawn(TEARS, 144298, 154420, -11854, 32767, false, 0, false, world.getInstanceId()); // Tears world.tears = addSpawn(TEARS, 144298, 154420, -11854, 32767, false, 0, false, world.getInstanceId()); // Tears
final CrystalGolem crygolem1 = new CrystalGolem(); final CrystalGolem crygolem1 = new CrystalGolem();
final CrystalGolem crygolem2 = new CrystalGolem(); final CrystalGolem crygolem2 = new CrystalGolem();
world.crystalGolems.put(addSpawn(CRYSTAL_GOLEM, 140547, 151670, -11813, 32767, false, 0, false, world.getInstanceId()), crygolem1); world.crystalGolems.put(addSpawn(CRYSTALLINE_GOLEM, 140547, 151670, -11813, 32767, false, 0, false, world.getInstanceId()), crygolem1);
world.crystalGolems.put(addSpawn(CRYSTAL_GOLEM, 141941, 151684, -11813, 63371, false, 0, false, world.getInstanceId()), crygolem2); world.crystalGolems.put(addSpawn(CRYSTALLINE_GOLEM, 141941, 151684, -11813, 63371, false, 0, false, world.getInstanceId()), crygolem2);
for (Npc crygolem : world.crystalGolems.keySet()) for (Npc crygolem : world.crystalGolems.keySet())
{ {
startQuestTimer("autoFood", 2000, crygolem, null); startQuestTimer("autoFood", 2000, crygolem, null);
@ -1543,16 +1537,16 @@ public class CrystalCaverns extends AbstractInstance
{ {
InstanceManager.getInstance().getInstance(world.getInstanceId()).setDuration(300000); InstanceManager.getInstance().getInstance(world.getInstanceId()).setDuration(300000);
addSpawn(32280, 144312, 154420, -11855, 0, false, 0, false, world.getInstanceId()); addSpawn(32280, 144312, 154420, -11855, 0, false, 0, false, world.getInstanceId());
giveRewards(player, npc.getInstanceId(), BOSS_CRYSTAL_3, false); giveRewards(player, npc.getInstanceId(), CLEAR_CRYSTAL, false);
} }
else if ((world.getStatus() == 2) && world.keyKeepers.contains(npc)) else if ((world.getStatus() == 2) && world.keyKeepers.contains(npc))
{ {
if (npc.getId() == GK1) if (npc.getId() == GATEKEEPER_LOHAN)
{ {
npc.dropItem(player, 9698, 1); npc.dropItem(player, 9698, 1);
runEmeraldSquare(world); runEmeraldSquare(world);
} }
else if (npc.getId() == GK2) else if (npc.getId() == GATEKEEPER_PROVO)
{ {
npc.dropItem(player, 9699, 1); npc.dropItem(player, 9699, 1);
runSteamRooms(world, STEAM1_SPAWNS, 22); runSteamRooms(world, STEAM1_SPAWNS, 22);
@ -1592,7 +1586,7 @@ public class CrystalCaverns extends AbstractInstance
} }
else else
{ {
return ""; return null;
} }
} }
else if (world.getStatus() == 4) else if (world.getStatus() == 4)
@ -1625,7 +1619,8 @@ public class CrystalCaverns extends AbstractInstance
{ {
world.setStatus(8); world.setStatus(8);
// first door opener trap // first door opener trap
addTrap(DOOR_OPENING_TRAP[0], DOOR_OPENING_TRAP[1], DOOR_OPENING_TRAP[2], DOOR_OPENING_TRAP[3], DOOR_OPENING_TRAP[4], null, world.getInstanceId()); Npc trap = addTrap(DOOR_OPENING_TRAP[0], DOOR_OPENING_TRAP[1], DOOR_OPENING_TRAP[2], DOOR_OPENING_TRAP[3], DOOR_OPENING_TRAP[4], null, world.getInstanceId());
trap.broadcastSay(ChatType.NPC_SHOUT, NpcStringId.YOU_HAVE_FINALLY_COME_HERE_BUT_YOU_WILL_NOT_BE_ABLE_TO_FIND_THE_SECRET_ROOM);
} }
} }
else if (world.getStatus() == 8) else if (world.getStatus() == 8)
@ -1697,12 +1692,12 @@ public class CrystalCaverns extends AbstractInstance
world.openDoor(DOOR4); world.openDoor(DOOR4);
final Npc kechi = addSpawn(KECHI, 154069, 149525, -12158, 51165, false, 0, false, world.getInstanceId()); final Npc kechi = addSpawn(KECHI, 154069, 149525, -12158, 51165, false, 0, false, world.getInstanceId());
startQuestTimer("checkKechiAttack", 1000, kechi, null); startQuestTimer("checkKechiAttack", 1000, kechi, null);
return ""; return null;
} }
default: default:
{ {
LOGGER.warning("CrystalCavern-SteamCorridor: status " + world.getStatus() + " error. OracleOrder not found in " + world.getInstanceId()); LOGGER.warning("CrystalCavern-SteamCorridor: status " + world.getStatus() + " error. OracleOrder not found in " + world.getInstanceId());
return ""; return null;
} }
} }
runSteamOracles(world, oracleOrder); runSteamOracles(world, oracleOrder);
@ -1714,26 +1709,25 @@ public class CrystalCaverns extends AbstractInstance
int bossCry; int bossCry;
if (npc.getId() == KECHI) if (npc.getId() == KECHI)
{ {
bossCry = BOSS_CRYSTAL_2; bossCry = RED_CRYSTAL;
cancelQuestTimers("spawnGuards"); cancelQuestTimers("spawnGuards");
addSpawn(32280, 154077, 149527, -12159, 0, false, 0, false, world.getInstanceId()); addSpawn(32280, 154077, 149527, -12159, 0, false, 0, false, world.getInstanceId());
} }
else if (npc.getId() == DARNEL) else if (npc.getId() == DARNEL)
{ {
bossCry = BOSS_CRYSTAL_1; bossCry = BLUE_CRYSTAL;
addSpawn(32280, 152761, 145950, -12588, 0, false, 0, false, world.getInstanceId()); addSpawn(32280, 152761, 145950, -12588, 0, false, 0, false, world.getInstanceId());
} }
else else
{ {
// something is wrong // something is wrong
return ""; return null;
} }
giveRewards(player, npc.getInstanceId(), bossCry, false); giveRewards(player, npc.getInstanceId(), bossCry, false);
} }
if (npc.getId() == ALARMID) if (npc.getId() == ALARM)
{ {
world._alarm = null; world._alarm = null;
if (world._baylor != null) if (world._baylor != null)
{ {
world._baylor.removeSkill(5244); world._baylor.removeSkill(5244);
@ -1756,7 +1750,7 @@ public class CrystalCaverns extends AbstractInstance
giveRewards(player, npc.getInstanceId(), -1, true); giveRewards(player, npc.getInstanceId(), -1, true);
} }
} }
return ""; return null;
} }
@Override @Override
@ -1776,10 +1770,10 @@ public class CrystalCaverns extends AbstractInstance
if (world.getTemplateId() == TEMPLATE_ID) if (world.getTemplateId() == TEMPLATE_ID)
{ {
onEnterInstance(player, world, false); onEnterInstance(player, world, false);
return ""; return null;
} }
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANCE_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON); player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANCE_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON);
return ""; return null;
} }
if (checkConditions(player)) if (checkConditions(player))
@ -1801,14 +1795,14 @@ public class CrystalCaverns extends AbstractInstance
} }
} }
return ""; return null;
} }
final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc); final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc);
if (tmpworld instanceof CCWorld) if (tmpworld instanceof CCWorld)
{ {
final CCWorld world = (CCWorld) tmpworld; final CCWorld world = (CCWorld) tmpworld;
if (npcId == CRYSTAL_GOLEM) if (npcId == CRYSTALLINE_GOLEM)
{ {
} }
else if ((npc.getId() >= 32275) && (npc.getId() <= 32277) && world.OracleTriggered[npc.getId() - 32275]) else if ((npc.getId() >= 32275) && (npc.getId() <= 32277) && world.OracleTriggered[npc.getId() - 32275])
@ -1919,7 +1913,7 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (!checkOracleConditions(player)) if (!checkOracleConditions(player))
{ {
return ""; return null;
} }
else if (party != null) else if (party != null)
{ {
@ -1950,14 +1944,14 @@ public class CrystalCaverns extends AbstractInstance
for (PlayerInstance partyMember : party.getMembers()) for (PlayerInstance partyMember : party.getMembers())
{ {
// int rnd = getRandom(100); // int rnd = getRandom(100);
// partyMember.destroyItemByItemId("Quest", (rnd < 33 ? BOSS_CRYSTAL_1:(rnd < 67 ? BOSS_CRYSTAL_2:BOSS_CRYSTAL_3)), 1, partyMember, true); Crystals are no longer beign cunsumed while entering to Baylor Lair. // partyMember.destroyItemByItemId("Quest", (rnd < 33 ? BLUE_CRYSTAL:(rnd < 67 ? RED_CRYSTAL:CLEAR_CRYSTAL)), 1, partyMember, true); Crystals are no longer beign cunsumed while entering to Baylor Lair.
world._raiders.add(partyMember); world._raiders.add(partyMember);
} }
} }
} }
else else
{ {
return ""; return null;
} }
world.setStatus(30); world.setStatus(30);
final long time = world.endTime - System.currentTimeMillis(); final long time = world.endTime - System.currentTimeMillis();
@ -1972,10 +1966,12 @@ public class CrystalCaverns extends AbstractInstance
final int x = (int) (radius * Math.cos((i * 2 * Math.PI) / members)); final int x = (int) (radius * Math.cos((i * 2 * Math.PI) / members));
final int y = (int) (radius * Math.sin((i++ * 2 * Math.PI) / members)); final int y = (int) (radius * Math.sin((i++ * 2 * Math.PI) / members));
p.teleToLocation(new Location(153571 + x, 142075 + y, -12737)); p.teleToLocation(new Location(153571 + x, 142075 + y, -12737));
p.setInstanceId(world.getInstanceId());
final Summon pet = p.getSummon(); final Summon pet = p.getSummon();
if (pet != null) if (pet != null)
{ {
pet.teleToLocation(new Location(153571 + x, 142075 + y, -12737), true); pet.teleToLocation(new Location(153571 + x, 142075 + y, -12737), true);
pet.setInstanceId(world.getInstanceId());
pet.broadcastPacket(new ValidateLocation(pet)); pet.broadcastPacket(new ValidateLocation(pet));
} }
p.setIsParalyzed(true); p.setIsParalyzed(true);
@ -1988,7 +1984,7 @@ public class CrystalCaverns extends AbstractInstance
teleportPlayer(player, new Location(153522, 144212, -9747), npc.getInstanceId()); teleportPlayer(player, new Location(153522, 144212, -9747), npc.getInstanceId());
} }
} }
return ""; return null;
} }
@Override @Override
@ -2058,19 +2054,19 @@ public class CrystalCaverns extends AbstractInstance
{ {
if (door.isOpen()) if (door.isOpen())
{ {
return ""; return null;
} }
if (!hasQuestItems((PlayerInstance) creature, RACE_KEY)) if (!hasQuestItems((PlayerInstance) creature, SECRET_KEY))
{ {
return ""; return null;
} }
if (world.roomsStatus[zone.getId() - 20104] == 0) if (world.roomsStatus[zone.getId() - 20104] == 0)
{ {
runEmeraldRooms(world, spawns, room); runEmeraldRooms(world, spawns, room);
} }
door.openMe(); door.openMe();
takeItems((PlayerInstance) creature, RACE_KEY, 1); takeItems((PlayerInstance) creature, SECRET_KEY, 1);
world.openedDoors.put(door, (PlayerInstance) creature); world.openedDoors.put(door, (PlayerInstance) creature);
break; break;
} }