/** * Called on Appearing packet received (player finished teleporting) * * @param playerInstance */ public static void onTeleported(L2PcInstance playerInstance) { if (!isStarted() || (playerInstance == null) || !isPlayerParticipant(playerInstance.getObjectId())) { return; } if (playerInstance.isMageClass()) { if ((Config.TVT_EVENT_MAGE_BUFFS != null) && !Config.TVT_EVENT_MAGE_BUFFS.isEmpty()) { for (Entry<Integer, Integer> e : Config.TVT_EVENT_MAGE_BUFFS.entrySet()) { final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue()); if (skill != null) { skill.applyEffects(playerInstance, playerInstance); } } } } else { if ((Config.TVT_EVENT_FIGHTER_BUFFS != null) && !Config.TVT_EVENT_FIGHTER_BUFFS.isEmpty()) { for (Entry<Integer, Integer> e : Config.TVT_EVENT_FIGHTER_BUFFS.entrySet()) { final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue()); if (skill != null) { skill.applyEffects(playerInstance, playerInstance); } } } } }
/** * Nornil's Garden instance zone. * * @author Gnacik * @version 2010-10-15 Based on official server Naia */ public final class NornilsGarden extends AbstractInstance { class NornilsWorld extends InstanceWorld { L2Npc first_npc = null; boolean spawned_1 = false; boolean spawned_2 = false; boolean spawned_3 = false; boolean spawned_4 = false; } // NPCs private static final int _garden_guard = 32330; private static final int[] _final_gates = {32260, 32261, 32262}; // Skills private static final Skill skill1 = SkillData.getInstance().getSkill(4322, 1); private static final Skill skill2 = SkillData.getInstance().getSkill(4327, 1); private static final Skill skill3 = SkillData.getInstance().getSkill(4329, 1); private static final Skill skill4 = SkillData.getInstance().getSkill(4324, 1); // Locations private static final Location SPAWN_PPL = new Location(-111184, 74540, -12430); private static final Location EXIT_PPL = new Location(-74058, 52040, -3680); // Misc private static final int TEMPLATE_ID = 11; private static final int DURATION_TIME = 70; private static final int EMPTY_DESTROY_TIME = 5; private static final int INSTANCE_LVL_MIN = 18; private static final int INSTANCE_LVL_MAX = 22; private static final int[][] _auto_gates = { // Warriors gate {20110, 16200001}, // Midway gate {20111, 16200004}, // Gate {20112, 16200013} }; private static final int _herb_jar = 18478; // @formatter:off private static final int[][] _gatekeepers = { {18352, 9703, 0}, // Kamael Guard {18353, 9704, 0}, // Guardian of Records {18354, 9705, 0}, // Guardian of Observation {18355, 9706, 0}, // Spicula's Guard {18356, 9707, 16200024}, // Harkilgamed's Gatekeeper {18357, 9708, 16200025}, // Rodenpicula's Gatekeeper {18358, 9713, 0}, // Guardian of Secrets {18359, 9709, 16200023}, // Arviterre's Guardian {18360, 9710, 0}, // Katenar's Gatekeeper {18361, 9711, 0}, // Guardian of Prediction {25528, 9712, 0} // Tiberias }; private static final int[][] HP_HERBS_DROPLIST = { // itemId, count, chance {8602, 1, 10}, {8601, 2, 40}, {8600, 3, 70} }; private static final int[][] _group_1 = { {18363, -109899, 74431, -12528, 16488}, {18483, -109701, 74501, -12528, 24576}, {18483, -109892, 74886, -12528, 0}, {18363, -109703, 74879, -12528, 49336} }; private static final int[][] _group_2 = { {18363, -110393, 78276, -12848, 49152}, {18363, -110561, 78276, -12848, 49152}, {18362, -110414, 78495, -12905, 48112}, {18362, -110545, 78489, -12903, 48939}, {18483, -110474, 78601, -12915, 49488}, {18362, -110474, 78884, -12915, 49338}, {18483, -110389, 79131, -12915, 48539}, {18483, -110551, 79134, -12915, 49151} }; private static final int[][] _group_3 = { {18483, -107798, 80721, -12912, 0}, {18483, -107798, 80546, -12912, 0}, {18347, -108033, 80644, -12912, 0}, {18363, -108520, 80647, -12912, 0}, {18483, -108740, 80752, -12912, 0}, {18363, -109016, 80642, -12912, 0}, {18483, -108740, 80546, -12912, 0} }; private static final int[][] _group_4 = { {18362, -110082, 83998, -12928, 0}, {18362, -110082, 84210, -12928, 0}, {18363, -109963, 84102, -12896, 0}, {18347, -109322, 84102, -12880, 0}, {18362, -109131, 84097, -12880, 0}, {18483, -108932, 84101, -12880, 0}, {18483, -109313, 84488, -12880, 0}, {18362, -109122, 84490, -12880, 0}, {18347, -108939, 84489, -12880, 0} }; private static final int[][] MP_HERBS_DROPLIST = { // itemId, count, chance {8605, 1, 10}, {8604, 2, 40}, {8603, 3, 70} }; // @formatter:on private static final void dropHerb(L2Npc mob, L2PcInstance player, int[][] drop) { final int chance = getRandom(100); for (int[] element : drop) { if (chance < element[2]) { mob.dropItem(player, element[0], element[1]); } } } private static final void giveBuffs(L2Character ch) { if (skill1 != null) { skill1.applyEffects(ch, ch); } if (skill2 != null) { skill2.applyEffects(ch, ch); } if (skill3 != null) { skill3.applyEffects(ch, ch); } if (skill4 != null) { skill4.applyEffects(ch, ch); } } public NornilsGarden() { super(NornilsGarden.class.getSimpleName()); addStartNpc(_garden_guard); addFirstTalkId(_garden_guard); addTalkId(_garden_guard); for (int i[] : _gatekeepers) { addKillId(i[0]); } for (int i[] : _auto_gates) { addEnterZoneId(i[0]); } addTalkId(_final_gates); addAttackId(_herb_jar); addAttackId(18362); // first garden guard } @Override public final void teleportPlayer(L2PcInstance player, Location loc, int instanceId) { giveBuffs(player); final L2Summon pet = player.getPet(); if (pet != null) { giveBuffs(pet); } player .getServitors() .values() .forEach( s -> { giveBuffs(s); }); super.teleportPlayer(player, loc, instanceId); } private void exitInstance(L2PcInstance player) { final InstanceWorld inst = InstanceManager.getInstance().getWorld(player.getInstanceId()); if (inst instanceof NornilsWorld) { final NornilsWorld world = ((NornilsWorld) inst); world.removeAllowed(player.getObjectId()); teleportPlayer(player, EXIT_PPL, 0); } } private final synchronized String enterInstance(L2Npc npc, L2PcInstance player) { InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player); if (world != null) { if (!(world instanceof NornilsWorld) || (world.getTemplateId() != TEMPLATE_ID)) { player.sendPacket( SystemMessageId .YOU_HAVE_ENTERED_ANOTHER_INSTANT_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON); return null; } // check for level difference again on reenter if ((player.getLevel() > INSTANCE_LVL_MAX) || (player.getLevel() < INSTANCE_LVL_MIN)) { final SystemMessage sm = SystemMessage.getSystemMessage( SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY); sm.addPcName(player); player.sendPacket(sm); return null; } // check what instance still exist final Instance inst = InstanceManager.getInstance().getInstance(world.getInstanceId()); if (inst != null) { teleportPlayer(player, SPAWN_PPL, world.getInstanceId()); } return null; } // Creating new instance final String result = checkConditions(npc, player); if (!(result.equalsIgnoreCase("ok"))) { return result; } final int instanceId = InstanceManager.getInstance().createDynamicInstance("NornilsGarden.xml"); final Instance inst = InstanceManager.getInstance().getInstance(instanceId); inst.setName(InstanceManager.getInstance().getInstanceIdName(TEMPLATE_ID)); inst.setExitLoc(new Location(player)); inst.setAllowSummon(false); inst.setDuration(DURATION_TIME * 60000); inst.setEmptyDestroyTime(EMPTY_DESTROY_TIME * 60000); world = new NornilsWorld(); world.setInstanceId(instanceId); world.setTemplateId(TEMPLATE_ID); InstanceManager.getInstance().addWorld(world); _log.info( "Nornils Garden: started, Instance: " + instanceId + " created by player: " + player.getName()); prepareInstance((NornilsWorld) world); // and finally teleport party into instance final L2Party party = player.getParty(); if (party != null) { for (L2PcInstance partyMember : party.getMembers()) { world.addAllowed(partyMember.getObjectId()); teleportPlayer(partyMember, SPAWN_PPL, instanceId); } } return null; } private void prepareInstance(NornilsWorld world) { world.first_npc = addSpawn(18362, -109702, 74696, -12528, 49568, false, 0, false, world.getInstanceId()); final L2DoorInstance door = getDoor(16200010, world.getInstanceId()); if (door != null) { door.setTargetable(false); door.setMeshIndex(2); } } private void spawn1(L2Npc npc) { final InstanceWorld inst = InstanceManager.getInstance().getWorld(npc.getInstanceId()); if (inst instanceof NornilsWorld) { final NornilsWorld world = ((NornilsWorld) inst); if (npc.equals(world.first_npc) && !world.spawned_1) { world.spawned_1 = true; for (int mob[] : _group_1) { addSpawn(mob[0], mob[1], mob[2], mob[3], mob[4], false, 0, false, world.getInstanceId()); } } } } private void spawn2(L2Npc npc) { final InstanceWorld inst = InstanceManager.getInstance().getWorld(npc.getInstanceId()); if (inst instanceof NornilsWorld) { final NornilsWorld world = ((NornilsWorld) inst); if (!world.spawned_2) { world.spawned_2 = true; for (int mob[] : _group_2) { addSpawn(mob[0], mob[1], mob[2], mob[3], mob[4], false, 0, false, world.getInstanceId()); } } } } private void spawn3(L2Character cha) { final InstanceWorld inst = InstanceManager.getInstance().getWorld(cha.getInstanceId()); if (inst instanceof NornilsWorld) { final NornilsWorld world = ((NornilsWorld) inst); if (!world.spawned_3) { world.spawned_3 = true; for (int mob[] : _group_3) { addSpawn(mob[0], mob[1], mob[2], mob[3], mob[4], false, 0, false, world.getInstanceId()); } } } } private void spawn4(L2Character cha) { final InstanceWorld inst = InstanceManager.getInstance().getWorld(cha.getInstanceId()); if (inst instanceof NornilsWorld) { final NornilsWorld world = ((NornilsWorld) inst); if (!world.spawned_4) { world.spawned_4 = true; for (int mob[] : _group_4) { addSpawn(mob[0], mob[1], mob[2], mob[3], mob[4], false, 0, false, world.getInstanceId()); } } } } private void openDoor(QuestState st, L2PcInstance player, int doorId) { st.unset("correct"); final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(player.getInstanceId()); if (tmpworld instanceof NornilsWorld) { openDoor(doorId, tmpworld.getInstanceId()); } } private static final String checkConditions(L2Npc npc, L2PcInstance player) { final L2Party party = player.getParty(); // player must be in party if (party == null) { player.sendPacket(SystemMessageId.YOU_ARE_NOT_CURRENTLY_IN_A_PARTY_SO_YOU_CANNOT_ENTER); return "32330-05.html"; } // ...and be party leader if (party.getLeader() != player) { player.sendPacket(SystemMessageId.ONLY_A_PARTY_LEADER_CAN_MAKE_THE_REQUEST_TO_ENTER); return "32330-08.html"; } boolean _kamael = false; // for each party member for (L2PcInstance partyMember : party.getMembers()) { // player level must be in range if (partyMember.getLevel() > INSTANCE_LVL_MAX) { final SystemMessage sm = SystemMessage.getSystemMessage( SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY); sm.addPcName(partyMember); player.sendPacket(sm); return "32330-06.html"; } if (partyMember.getLevel() < INSTANCE_LVL_MIN) { final SystemMessage sm = SystemMessage.getSystemMessage( SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY); sm.addPcName(partyMember); player.sendPacket(sm); return "32330-07.html"; } if (partyMember.getClassId().level() != 0) { final SystemMessage sm = SystemMessage.getSystemMessage( SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY); sm.addPcName(partyMember); player.sendPacket(sm); return "32330-06.html"; } // player must be near party leader if (!partyMember.isInsideRadius(player, 500, true, true)) { final SystemMessage sm = SystemMessage.getSystemMessage( SystemMessageId .C1_IS_IN_A_LOCATION_WHICH_CANNOT_BE_ENTERED_THEREFORE_IT_CANNOT_BE_PROCESSED); sm.addPcName(partyMember); player.sendPacket(sm); return "32330-08.html"; } if (partyMember.getRace().ordinal() == 5) { _kamael = true; } } if (!_kamael) { return "32330-08.html"; } return "ok"; } @Override public String onEnterZone(L2Character character, L2ZoneType zone) { if ((character instanceof L2PcInstance) && !character.isDead() && !character.isTeleporting() && ((L2PcInstance) character).isOnline()) { final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(character.getInstanceId()); if (tmpworld instanceof NornilsWorld) { for (int _auto[] : _auto_gates) { if (zone.getId() == _auto[0]) { openDoor(_auto[1], tmpworld.getInstanceId()); } if (zone.getId() == 20111) { spawn3(character); } else if (zone.getId() == 20112) { spawn4(character); } } } } return super.onEnterZone(character, zone); } @Override public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { String htmltext = event; final QuestState st = getQuestState(player, false); if (st == null) { return getNoQuestMsg(player); } if ((npc.getId() == _garden_guard) && event.equalsIgnoreCase("enter_instance")) { try { htmltext = enterInstance(npc, player); } catch (Exception e) { } } else if ((npc.getId() == 32258) && event.equalsIgnoreCase("exit")) { try { exitInstance(player); } catch (Exception e) { } } else if (Util.contains(_final_gates, npc.getId())) { if (event.equalsIgnoreCase("32260-02.html") || event.equalsIgnoreCase("32261-02.html") || event.equalsIgnoreCase("32262-02.html")) { st.unset("correct"); } else if (Util.isDigit(event)) { int correct = st.getInt("correct"); correct++; st.set("correct", String.valueOf(correct)); htmltext = npc.getId() + "-0" + String.valueOf(correct + 2) + ".html"; } else if (event.equalsIgnoreCase("check")) { final int correct = st.getInt("correct"); if ((npc.getId() == 32260) && (correct == 3)) { openDoor(st, player, 16200014); } else if ((npc.getId() == 32261) && (correct == 3)) { openDoor(st, player, 16200015); } else if ((npc.getId() == 32262) && (correct == 4)) { openDoor(st, player, 16200016); } else { return npc.getId() + "-00.html"; } } } return htmltext; } @Override public final String onTalk(L2Npc npc, L2PcInstance player) { if (Util.contains(_final_gates, npc.getId())) { return npc.getId() + "-01.html"; } return null; } @Override public final String onFirstTalk(L2Npc npc, L2PcInstance player) { getQuestState(player, true); return npc.getId() + ".html"; } @Override public final String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon) { if ((npc.getId() == _herb_jar) && !npc.isDead()) { dropHerb(npc, attacker, HP_HERBS_DROPLIST); dropHerb(npc, attacker, MP_HERBS_DROPLIST); npc.doDie(attacker); } else if ((npc.getId() == 18362) && (npc.getInstanceId() > 0)) { spawn1(npc); } return null; } @Override public final String onKill(L2Npc npc, L2PcInstance player, boolean isSummon) { final QuestState st = getQuestState(player, false); if (st == null) { return null; } for (int _gk[] : _gatekeepers) { if (npc.getId() == _gk[0]) { // Drop key npc.dropItem(player, _gk[1], 1); // Check if gatekeeper should open bridge, and open it if (_gk[2] > 0) { final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(player.getInstanceId()); if (tmpworld instanceof NornilsWorld) { openDoor(_gk[2], tmpworld.getInstanceId()); } } } if (npc.getId() == 18355) { spawn2(npc); } } return super.onKill(npc, player, isSummon); } @Override public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance) {} }