/* * Copyright (C) 2004-2015 L2J DataPack * * This file is part of L2J DataPack. * * L2J DataPack is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * L2J DataPack is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package quests.Q00511_AwlUnderFoot; import java.util.HashMap; import java.util.Map; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.enums.QuestSound; import com.l2jserver.gameserver.instancemanager.InstanceManager; import com.l2jserver.gameserver.model.L2Party; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.L2Playable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2RaidBossInstance; import com.l2jserver.gameserver.model.entity.Fort; import com.l2jserver.gameserver.model.entity.Instance; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.instancezone.InstanceWorld; import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.model.quest.State; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.util.Util; /** * Awl Under Foot (511) * @author Gigiikun */ public final class Q00511_AwlUnderFoot extends Quest { protected class FAUWorld extends InstanceWorld { } public static class FortDungeon { private final int INSTANCEID; private long _reEnterTime = 0; public FortDungeon(int iId) { INSTANCEID = iId; } public int getInstanceId() { return INSTANCEID; } public long getReEnterTime() { return _reEnterTime; } public void setReEnterTime(long time) { _reEnterTime = time; } } private class spawnRaid implements Runnable { private final FAUWorld _world; public spawnRaid(FAUWorld world) { _world = world; } @Override public void run() { try { int spawnId; if (_world.getStatus() == 0) { spawnId = RAIDS1[getRandom(RAIDS1.length)]; } else if (_world.getStatus() == 1) { spawnId = RAIDS2[getRandom(RAIDS2.length)]; } else { spawnId = RAIDS3[getRandom(RAIDS3.length)]; } L2Npc raid = addSpawn(spawnId, 53319, 245814, -6576, 0, false, 0, false, _world.getInstanceId()); if (raid instanceof L2RaidBossInstance) { ((L2RaidBossInstance) raid).setUseRaidCurse(false); } } catch (Exception e) { _log.warning("Fortress AwlUnderFoot Raid Spawn error: " + e); } } } private static final boolean debug = false; private static final long REENTERTIME = 14400000; private static final long RAID_SPAWN_DELAY = 120000; private final Map _fortDungeons = new HashMap<>(21); // QUEST ITEMS private static final int DL_MARK = 9797; // REWARDS private static final int KNIGHT_EPALUETTE = 9912; // MONSTER TO KILL -- Only last 3 Raids (lvl ordered) give DL_MARK protected static final int[] RAIDS1 = { 25572, 25575, 25578 }; protected static final int[] RAIDS2 = { 25579, 25582, 25585, 25588 }; protected static final int[] RAIDS3 = { 25589, 25592, 25593 }; // Skill private static final SkillHolder RAID_CURSE = new SkillHolder(5456, 1); public Q00511_AwlUnderFoot() { super(511, Q00511_AwlUnderFoot.class.getSimpleName(), "instances"); _fortDungeons.put(35666, new FortDungeon(22)); _fortDungeons.put(35698, new FortDungeon(23)); _fortDungeons.put(35735, new FortDungeon(24)); _fortDungeons.put(35767, new FortDungeon(25)); _fortDungeons.put(35804, new FortDungeon(26)); _fortDungeons.put(35835, new FortDungeon(27)); _fortDungeons.put(35867, new FortDungeon(28)); _fortDungeons.put(35904, new FortDungeon(29)); _fortDungeons.put(35936, new FortDungeon(30)); _fortDungeons.put(35974, new FortDungeon(31)); _fortDungeons.put(36011, new FortDungeon(32)); _fortDungeons.put(36043, new FortDungeon(33)); _fortDungeons.put(36081, new FortDungeon(34)); _fortDungeons.put(36118, new FortDungeon(35)); _fortDungeons.put(36149, new FortDungeon(36)); _fortDungeons.put(36181, new FortDungeon(37)); _fortDungeons.put(36219, new FortDungeon(38)); _fortDungeons.put(36257, new FortDungeon(39)); _fortDungeons.put(36294, new FortDungeon(40)); _fortDungeons.put(36326, new FortDungeon(41)); _fortDungeons.put(36364, new FortDungeon(42)); for (int i : _fortDungeons.keySet()) { addStartNpc(i); addTalkId(i); } addKillId(RAIDS1); addKillId(RAIDS2); addKillId(RAIDS3); for (int i = 25572; i <= 25595; i++) { addAttackId(i); } } private String checkConditions(L2PcInstance player) { if (debug) { return null; } L2Party party = player.getParty(); if (party == null) { return "FortressWarden-03.htm"; } if (party.getLeader() != player) { return getHtm(player.getHtmlPrefix(), "FortressWarden-04.htm").replace("%leader%", party.getLeader().getName()); } for (L2PcInstance partyMember : party.getMembers()) { final QuestState st = getQuestState(partyMember, false); if ((st == null) || (st.getInt("cond") < 1)) { return getHtm(player.getHtmlPrefix(), "FortressWarden-05.htm").replace("%player%", partyMember.getName()); } if (!Util.checkIfInRange(1000, player, partyMember, true)) { return getHtm(player.getHtmlPrefix(), "FortressWarden-06.htm").replace("%player%", partyMember.getName()); } } return null; } private String checkFortCondition(L2PcInstance player, L2Npc npc, boolean isEnter) { Fort fortress = npc.getFort(); FortDungeon dungeon = _fortDungeons.get(npc.getId()); if ((player == null) || (fortress == null) || (dungeon == null)) { return "FortressWarden-01.htm"; } if ((player.getClan() == null) || (player.getClan().getFortId() != fortress.getResidenceId())) { return "FortressWarden-01.htm"; } else if (fortress.getFortState() == 0) { return "FortressWarden-02a.htm"; } else if (fortress.getFortState() == 2) { return "FortressWarden-02b.htm"; } else if (isEnter && (dungeon.getReEnterTime() > System.currentTimeMillis())) { return "FortressWarden-07.htm"; } L2Party party = player.getParty(); if (party == null) { return "FortressWarden-03.htm"; } for (L2PcInstance partyMember : party.getMembers()) { if ((partyMember.getClan() == null) || (partyMember.getClan().getFortId() == 0) || (partyMember.getClan().getFortId() != fortress.getResidenceId())) { return getHtm(player.getHtmlPrefix(), "FortressWarden-05.htm").replace("%player%", partyMember.getName()); } } return null; } protected String enterInstance(L2PcInstance player, String template, int[] coords, FortDungeon dungeon, String ret) { // check for existing instances for this player InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player); // existing instance if (world != null) { if (!(world instanceof FAUWorld)) { player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANT_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON); return ""; } teleportPlayer(player, coords, world.getInstanceId()); return ""; } // New instance if (ret != null) { return ret; } ret = checkConditions(player); if (ret != null) { return ret; } L2Party party = player.getParty(); int instanceId = InstanceManager.getInstance().createDynamicInstance(template); Instance ins = InstanceManager.getInstance().getInstance(instanceId); ins.setSpawnLoc(new Location(player)); world = new FAUWorld(); world.setInstanceId(instanceId); world.setTemplateId(dungeon.getInstanceId()); world.setStatus(0); dungeon.setReEnterTime(System.currentTimeMillis() + REENTERTIME); InstanceManager.getInstance().addWorld(world); _log.info("Fortress AwlUnderFoot started " + template + " Instance: " + instanceId + " created by player: " + player.getName()); ThreadPoolManager.getInstance().scheduleGeneral(new spawnRaid((FAUWorld) world), RAID_SPAWN_DELAY); // teleport players if (player.getParty() == null) { teleportPlayer(player, coords, instanceId); world.addAllowed(player.getObjectId()); } else { for (L2PcInstance partyMember : party.getMembers()) { teleportPlayer(partyMember, coords, instanceId); world.addAllowed(partyMember.getObjectId()); getQuestState(partyMember, true); } } return getHtm(player.getHtmlPrefix(), "FortressWarden-08.htm").replace("%clan%", player.getClan().getName()); } @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { String htmltext = event; if (event.equalsIgnoreCase("enter")) { int[] tele = new int[3]; tele[0] = 53322; tele[1] = 246380; tele[2] = -6580; return enterInstance(player, "fortdungeon.xml", tele, _fortDungeons.get(npc.getId()), checkFortCondition(player, npc, true)); } QuestState st = getQuestState(player, true); if (event.equalsIgnoreCase("FortressWarden-10.htm")) { if (st.isCond(0)) { st.startQuest(); } } else if (event.equalsIgnoreCase("FortressWarden-15.htm")) { st.exitQuest(true, true); } return htmltext; } @Override public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isSummon) { L2Playable attacker = (isSummon ? player.getSummon() : player); if ((attacker.getLevel() - npc.getLevel()) >= 9) { if ((attacker.getBuffCount() > 0) || (attacker.getDanceCount() > 0)) { npc.setTarget(attacker); npc.doSimultaneousCast(RAID_CURSE.getSkill()); } else if (player.getParty() != null) { for (L2PcInstance pmember : player.getParty().getMembers()) { if ((pmember.getBuffCount() > 0) || (pmember.getDanceCount() > 0)) { npc.setTarget(pmember); npc.doSimultaneousCast(RAID_CURSE.getSkill()); } } } } return super.onAttack(npc, player, damage, isSummon); } @Override public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon) { InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); if (tmpworld instanceof FAUWorld) { FAUWorld world = (FAUWorld) tmpworld; if (Util.contains(RAIDS3, npc.getId())) { if (player.getParty() != null) { for (L2PcInstance pl : player.getParty().getMembers()) { rewardPlayer(pl); } } else { rewardPlayer(player); } Instance instanceObj = InstanceManager.getInstance().getInstance(world.getInstanceId()); instanceObj.setDuration(360000); instanceObj.removeNpcs(); } else { world.incStatus(); ThreadPoolManager.getInstance().scheduleGeneral(new spawnRaid(world), RAID_SPAWN_DELAY); } } return null; } @Override public String onTalk(L2Npc npc, L2PcInstance player) { String htmltext = Quest.getNoQuestMsg(player); final QuestState st = getQuestState(player, true); String ret = checkFortCondition(player, npc, false); if (ret != null) { return ret; } else if (st != null) { int npcId = npc.getId(); int cond = 0; if (st.getState() == State.CREATED) { st.set("cond", "0"); } else { cond = st.getInt("cond"); } if (_fortDungeons.containsKey(npcId) && (cond == 0)) { if (player.getLevel() >= 60) { htmltext = "FortressWarden-09.htm"; } else { htmltext = "FortressWarden-00.htm"; st.exitQuest(true); } } else if (_fortDungeons.containsKey(npcId) && (cond > 0) && (st.getState() == State.STARTED)) { long count = st.getQuestItemsCount(DL_MARK); if ((cond == 1) && (count > 0)) { htmltext = "FortressWarden-14.htm"; st.takeItems(DL_MARK, -1); st.rewardItems(KNIGHT_EPALUETTE, count); } else if ((cond == 1) && (count == 0)) { htmltext = "FortressWarden-10.htm"; } } } return htmltext; } private void rewardPlayer(L2PcInstance player) { QuestState st = getQuestState(player, false); if (st.isCond(1)) { st.giveItems(DL_MARK, 140); st.playSound(QuestSound.ITEMSOUND_QUEST_ITEMGET); } } private void teleportPlayer(L2PcInstance player, int[] coords, int instanceId) { player.setInstanceId(instanceId); player.teleToLocation(coords[0], coords[1], coords[2]); } }