/* * 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.TerritoryWarScripts; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import quests.Q00147_PathtoBecominganEliteMercenary.Q00147_PathtoBecominganEliteMercenary; import quests.Q00148_PathtoBecominganExaltedMercenary.Q00148_PathtoBecominganExaltedMercenary; import quests.Q00176_StepsForHonor.Q00176_StepsForHonor; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.instancemanager.GlobalVariablesManager; import com.l2jserver.gameserver.instancemanager.TerritoryWarManager; import com.l2jserver.gameserver.instancemanager.TerritoryWarManager.TerritoryNPCSpawn; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.TerritoryWard; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; 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.model.skills.Skill; import com.l2jserver.gameserver.network.NpcStringId; import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage; import com.l2jserver.gameserver.util.Util; /** * Territory War quests superclass. * @author Gigiikun */ public class TerritoryWarSuperClass extends Quest { private static Map _forTheSakeScripts = new HashMap<>(); private static Map _protectTheScripts = new HashMap<>(); private static Map _killTheScripts = new HashMap<>(); // "For the Sake of the Territory ..." quests variables public int CATAPULT_ID; public int TERRITORY_ID; public int[] LEADER_IDS; public int[] GUARD_IDS; public NpcStringId[] npcString = {}; // "Protect the ..." quests variables public int[] NPC_IDS; // "Kill The ..." public int[] CLASS_IDS; public int RANDOM_MIN; public int RANDOM_MAX; public TerritoryWarSuperClass(int questId, String name, String descr) { super(questId, name, descr); if (questId < 0) { // Outpost and Ward handled by the Super Class script addSkillSeeId(36590); // Calculate next TW date final Calendar cal = Calendar.getInstance(); final long nextSiegeDate = GlobalVariablesManager.getInstance().getLong(TerritoryWarManager.GLOBAL_VARIABLE, 0); if (nextSiegeDate > System.currentTimeMillis()) { cal.setTimeInMillis(nextSiegeDate); } else { // Let's check if territory war date was in the past if (cal.before(Calendar.getInstance())) { cal.setTimeInMillis(System.currentTimeMillis()); } boolean hasOwnedCastle = CastleManager.getInstance().hasOwnedCastle(); cal.set(Calendar.DAY_OF_WEEK, hasOwnedCastle ? Calendar.SATURDAY : Calendar.SUNDAY); cal.set(Calendar.HOUR_OF_DAY, hasOwnedCastle ? 20 : 22); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); if (cal.before(Calendar.getInstance())) { cal.add(Calendar.WEEK_OF_YEAR, 2); } GlobalVariablesManager.getInstance().set(TerritoryWarManager.GLOBAL_VARIABLE, cal.getTimeInMillis()); } TerritoryWarManager.getInstance().setTWStartTimeInMillis(cal.getTimeInMillis()); _log.info(getClass().getSimpleName() + ": Siege date: " + cal.getTime()); } } public int getTerritoryIdForThisNPCId(int npcid) { return 0; } private void handleKillTheQuest(L2PcInstance player) { QuestState st = getQuestState(player, false); int kill = 1; int max = 10; if (st == null) { st = newQuestState(player); } if (!st.isCompleted()) { if (!st.isStarted()) { st.setState(State.STARTED); st.setCond(1); st.set("kill", "1"); max = getRandom(RANDOM_MIN, RANDOM_MAX); st.set("max", String.valueOf(max)); } else { kill = st.getInt("kill") + 1; max = st.getInt("max"); } if (kill >= max) { TerritoryWarManager.getInstance().giveTWQuestPoint(player); addExpAndSp(player, 534000, 51000); st.set("doneDate", String.valueOf(Calendar.getInstance().get(Calendar.DAY_OF_YEAR))); st.exitQuest(true); player.sendPacket(new ExShowScreenMessage(npcString[1], 2, 10000)); } else { st.set("kill", String.valueOf(kill)); ExShowScreenMessage message = new ExShowScreenMessage(npcString[0], 2, 10000); message.addStringParameter(String.valueOf(max)); message.addStringParameter(String.valueOf(kill)); player.sendPacket(message); } } else if (st.getInt("doneDate") != Calendar.getInstance().get(Calendar.DAY_OF_YEAR)) { st.setState(State.STARTED); st.setCond(1); st.set("kill", "1"); max = getRandom(RANDOM_MIN, RANDOM_MAX); st.set("max", String.valueOf(max)); ExShowScreenMessage message = new ExShowScreenMessage(npcString[0], 2, 10000); message.addStringParameter(String.valueOf(max)); message.addStringParameter(String.valueOf(kill)); player.sendPacket(message); } else if (player.isGM()) { // just for test player.sendMessage("Cleaning " + getName() + " Territory War quest by force!"); st.setState(State.STARTED); st.setCond(1); st.set("kill", "1"); max = getRandom(RANDOM_MIN, RANDOM_MAX); st.set("max", String.valueOf(max)); ExShowScreenMessage message = new ExShowScreenMessage(npcString[0], 2, 10000); message.addStringParameter(String.valueOf(max)); message.addStringParameter(String.valueOf(kill)); player.sendPacket(message); } } @Override public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isSummon) { if ((npc.getCurrentHp() == npc.getMaxHp()) && Util.contains(NPC_IDS, npc.getId())) { int territoryId = getTerritoryIdForThisNPCId(npc.getId()); if ((territoryId >= 81) && (territoryId <= 89)) { for (L2PcInstance pl : L2World.getInstance().getPlayers()) { if (pl.getSiegeSide() == territoryId) { QuestState st = pl.getQuestState(getName()); if (st == null) { st = newQuestState(pl); } if (!st.isStarted()) { st.setState(State.STARTED, false); st.setCond(1); } } } } } return super.onAttack(npc, player, damage, isSummon); } @Override public String onDeath(L2Character killer, L2Character victim, QuestState qs) { if ((killer == victim) || !(victim instanceof L2PcInstance) || (victim.getLevel() < 61)) { return ""; } L2PcInstance actingPlayer = killer.getActingPlayer(); if ((actingPlayer != null) && (qs.getPlayer() != null)) { if (actingPlayer.getParty() != null) { for (L2PcInstance pl : actingPlayer.getParty().getMembers()) { if ((pl.getSiegeSide() == qs.getPlayer().getSiegeSide()) || (pl.getSiegeSide() == 0) || !Util.checkIfInRange(2000, killer, pl, false)) { continue; } if (pl == actingPlayer) { handleStepsForHonor(actingPlayer); handleBecomeMercenaryQuest(actingPlayer, false); } handleKillTheQuest(pl); } } else if ((actingPlayer.getSiegeSide() != qs.getPlayer().getSiegeSide()) && (actingPlayer.getSiegeSide() > 0)) { handleKillTheQuest(actingPlayer); handleStepsForHonor(actingPlayer); handleBecomeMercenaryQuest(actingPlayer, false); } TerritoryWarManager.getInstance().giveTWPoint(actingPlayer, qs.getPlayer().getSiegeSide(), 1); } return ""; } @Override public String onEnterWorld(L2PcInstance player) { int territoryId = TerritoryWarManager.getInstance().getRegisteredTerritoryId(player); if (territoryId > 0) { // register Territory Quest TerritoryWarSuperClass territoryQuest = _forTheSakeScripts.get(territoryId); QuestState st = player.getQuestState(territoryQuest.getName()); if (st == null) { st = territoryQuest.newQuestState(player); } st.setState(State.STARTED, false); st.setCond(1); // register player on Death if (player.getLevel() >= 61) { TerritoryWarSuperClass killthe = _killTheScripts.get(player.getClassId().getId()); if (killthe != null) { st = player.getQuestState(killthe.getName()); if (st == null) { st = killthe.newQuestState(player); } player.addNotifyQuestOfDeath(st); } else { _log.warning("TerritoryWar: Missing Kill the quest for player " + player.getName() + " whose class id: " + player.getClassId().getId()); } } } return null; } @Override public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { TerritoryWarManager manager = TerritoryWarManager.getInstance(); if (npc.getId() == CATAPULT_ID) { manager.territoryCatapultDestroyed(TERRITORY_ID - 80); manager.giveTWPoint(killer, TERRITORY_ID, 4); manager.announceToParticipants(new ExShowScreenMessage(npcString[0], 2, 10000), 135000, 13500); handleBecomeMercenaryQuest(killer, true); } else if (Util.contains(LEADER_IDS, npc.getId())) { manager.giveTWPoint(killer, TERRITORY_ID, 3); } if ((killer.getSiegeSide() != TERRITORY_ID) && (TerritoryWarManager.getInstance().getTerritory(killer.getSiegeSide() - 80) != null)) { manager.getTerritory(killer.getSiegeSide() - 80).getQuestDone()[0]++; } return super.onKill(npc, killer, isSummon); } @Override public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isSummon) { if (Util.contains(targets, npc)) { if (skill.getId() == 845) { if (TerritoryWarManager.getInstance().getHQForClan(caster.getClan()) != npc) { return super.onSkillSee(npc, caster, skill, targets, isSummon); } npc.deleteMe(); TerritoryWarManager.getInstance().setHQForClan(caster.getClan(), null); } else if (skill.getId() == 847) { if (TerritoryWarManager.getInstance().getHQForTerritory(caster.getSiegeSide()) != npc) { return super.onSkillSee(npc, caster, skill, targets, isSummon); } TerritoryWard ward = TerritoryWarManager.getInstance().getTerritoryWard(caster); if (ward == null) { return super.onSkillSee(npc, caster, skill, targets, isSummon); } if ((caster.getSiegeSide() - 80) == ward.getOwnerCastleId()) { for (TerritoryNPCSpawn wardSpawn : TerritoryWarManager.getInstance().getTerritory(ward.getOwnerCastleId()).getOwnedWard()) { if (wardSpawn.getId() == ward.getTerritoryId()) { wardSpawn.setNPC(wardSpawn.getNpc().getSpawn().doSpawn()); ward.unSpawnMe(); ward.setNpc(wardSpawn.getNpc()); } } } else { ward.unSpawnMe(); ward.setNpc(TerritoryWarManager.getInstance().addTerritoryWard(ward.getTerritoryId(), caster.getSiegeSide() - 80, ward.getOwnerCastleId(), true)); ward.setOwnerCastleId(caster.getSiegeSide() - 80); TerritoryWarManager.getInstance().getTerritory(caster.getSiegeSide() - 80).getQuestDone()[1]++; } } } return super.onSkillSee(npc, caster, skill, targets, isSummon); } // Used to register NPCs "For the Sake of the Territory ..." quests public void registerKillIds() { addKillId(CATAPULT_ID); for (int mobid : LEADER_IDS) { addKillId(mobid); } for (int mobid : GUARD_IDS) { addKillId(mobid); } } @Override public void setOnEnterWorld(boolean val) { super.setOnEnterWorld(val); for (L2PcInstance player : L2World.getInstance().getPlayers()) { if (player.getSiegeSide() > 0) { TerritoryWarSuperClass territoryQuest = _forTheSakeScripts.get(player.getSiegeSide()); if (territoryQuest == null) { continue; } QuestState st = player.hasQuestState(territoryQuest.getName()) ? player.getQuestState(territoryQuest.getName()) : territoryQuest.newQuestState(player); if (val) { st.setState(State.STARTED, false); st.setCond(1); // register player on Death if (player.getLevel() >= 61) { TerritoryWarSuperClass killthe = _killTheScripts.get(player.getClassId().getId()); if (killthe != null) { st = player.getQuestState(killthe.getName()); if (st == null) { st = killthe.newQuestState(player); } player.addNotifyQuestOfDeath(st); } else { _log.warning("TerritoryWar: Missing Kill the quest for player " + player.getName() + " whose class id: " + player.getClassId().getId()); } } } else { st.exitQuest(false); for (Quest q : _protectTheScripts.values()) { st = player.getQuestState(q.getName()); if (st != null) { st.exitQuest(false); } } // unregister player on Death TerritoryWarSuperClass killthe = _killTheScripts.get(player.getClassIndex()); if (killthe != null) { st = player.getQuestState(killthe.getName()); if (st != null) { player.removeNotifyQuestOfDeath(st); } } } } } } private static void handleBecomeMercenaryQuest(L2PcInstance player, boolean catapult) { int enemyCount = 10, catapultCount = 1; QuestState st = player.getQuestState(Q00147_PathtoBecominganEliteMercenary.class.getSimpleName()); if ((st != null) && st.isCompleted()) { st = player.getQuestState(Q00148_PathtoBecominganExaltedMercenary.class.getSimpleName()); enemyCount = 30; catapultCount = 2; } if ((st != null) && st.isStarted()) { final int cond = st.getCond(); if (catapult) { if ((cond == 1) || (cond == 2)) { final int count = st.getInt("catapult") + 1; st.set("catapult", String.valueOf(count)); if (count >= catapultCount) { st.setCond((cond == 1) ? 3 : 4); } } } else if ((cond == 1) || (cond == 3)) { final int kills = st.getInt("kills") + 1; st.set("kills", Integer.toString(kills)); if (kills >= enemyCount) { st.setCond((cond == 1) ? 2 : 4); } } } } private static void handleStepsForHonor(L2PcInstance player) { final QuestState _sfh = player.getQuestState(Q00176_StepsForHonor.class.getSimpleName()); if ((_sfh != null) && _sfh.isStarted()) { final int cond = _sfh.getCond(); if ((cond == 1) || (cond == 3) || (cond == 5) || (cond == 7)) { final int kills = _sfh.getInt("kills") + 1; _sfh.set("kills", kills); if ((cond == 1) && (kills >= 9)) { _sfh.setCond(2); _sfh.set("kills", "0"); } else if ((cond == 3) && (kills >= 18)) { _sfh.setCond(4); _sfh.set("kills", "0"); } else if ((cond == 5) && (kills >= 27)) { _sfh.setCond(6); _sfh.set("kills", "0"); } else if ((cond == 7) && (kills >= 36)) { _sfh.setCond(8); _sfh.unset("kills"); } } } } public static void main(String[] args) { // initialize superclass new TerritoryWarSuperClass(-1, TerritoryWarSuperClass.class.getSimpleName(), "Territory War Superclass"); // initialize subclasses // "For The Sake" quests TerritoryWarSuperClass gludio = new Q00717_ForTheSakeOfTheTerritoryGludio(); _forTheSakeScripts.put(gludio.TERRITORY_ID, gludio); TerritoryWarSuperClass dion = new Q00718_ForTheSakeOfTheTerritoryDion(); _forTheSakeScripts.put(dion.TERRITORY_ID, dion); TerritoryWarSuperClass giran = new Q00719_ForTheSakeOfTheTerritoryGiran(); _forTheSakeScripts.put(giran.TERRITORY_ID, giran); TerritoryWarSuperClass oren = new Q00720_ForTheSakeOfTheTerritoryOren(); _forTheSakeScripts.put(oren.TERRITORY_ID, oren); TerritoryWarSuperClass aden = new Q00721_ForTheSakeOfTheTerritoryAden(); _forTheSakeScripts.put(aden.TERRITORY_ID, aden); TerritoryWarSuperClass innadril = new Q00722_ForTheSakeOfTheTerritoryInnadril(); _forTheSakeScripts.put(innadril.TERRITORY_ID, innadril); TerritoryWarSuperClass goddard = new Q00723_ForTheSakeOfTheTerritoryGoddard(); _forTheSakeScripts.put(goddard.TERRITORY_ID, goddard); TerritoryWarSuperClass rune = new Q00724_ForTheSakeOfTheTerritoryRune(); _forTheSakeScripts.put(rune.TERRITORY_ID, rune); TerritoryWarSuperClass schuttgart = new Q00725_ForTheSakeOfTheTerritorySchuttgart(); _forTheSakeScripts.put(schuttgart.TERRITORY_ID, schuttgart); // "Protect the" quests TerritoryWarSuperClass catapult = new Q00729_ProtectTheTerritoryCatapult(); _protectTheScripts.put(catapult.getId(), catapult); TerritoryWarSuperClass supplies = new Q00730_ProtectTheSuppliesSafe(); _protectTheScripts.put(supplies.getId(), supplies); TerritoryWarSuperClass military = new Q00731_ProtectTheMilitaryAssociationLeader(); _protectTheScripts.put(military.getId(), military); TerritoryWarSuperClass religious = new Q00732_ProtectTheReligiousAssociationLeader(); _protectTheScripts.put(religious.getId(), religious); TerritoryWarSuperClass economic = new Q00733_ProtectTheEconomicAssociationLeader(); _protectTheScripts.put(economic.getId(), economic); // "Kill" quests TerritoryWarSuperClass knights = new Q00734_PierceThroughAShield(); for (int i : knights.CLASS_IDS) { _killTheScripts.put(i, knights); } TerritoryWarSuperClass warriors = new Q00735_MakeSpearsDull(); for (int i : warriors.CLASS_IDS) { _killTheScripts.put(i, warriors); } TerritoryWarSuperClass wizards = new Q00736_WeakenTheMagic(); for (int i : wizards.CLASS_IDS) { _killTheScripts.put(i, wizards); } TerritoryWarSuperClass priests = new Q00737_DenyBlessings(); for (int i : priests.CLASS_IDS) { _killTheScripts.put(i, priests); } TerritoryWarSuperClass keys = new Q00738_DestroyKeyTargets(); for (int i : keys.CLASS_IDS) { _killTheScripts.put(i, keys); } } }