/* * This program 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. * * This program 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.StringTokenizer; import com.l2jserver.gameserver.SevenSigns; import com.l2jserver.gameserver.instancemanager.TerritoryWarManager; import com.l2jserver.gameserver.instancemanager.TerritoryWarManager.TerritoryNPCSpawn; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.L2Skill; 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.network.serverpackets.ExShowScreenMessage; import com.l2jserver.gameserver.util.Util; import com.l2jserver.util.L2FastMap; import com.l2jserver.util.Rnd; public class TerritoryWarSuperClass extends Quest { private static L2FastMap _forTheSakeScripts = new L2FastMap(); private static L2FastMap _protectTheScripts = new L2FastMap(); private static L2FastMap _killTheScripts = new L2FastMap(); public static String qn = "TerritoryWarSuperClass"; // "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 String[] Text = {}; // "Protect the ..." quests variables public int[] NPC_IDS; // "Kill The ..." public int[] CLASS_IDS; public int RANDOM_MIN; public int RANDOM_MAX; // 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); } // Used to register NPCs "Protect the ..." quests public void registerAttackIds() { for (int mobid : NPC_IDS) addAttackId(mobid); } @Override public String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet) { if (Util.contains(targets, npc)) { if (skill.getId() == 845) { if (TerritoryWarManager.getInstance().getHQForClan(caster.getClan()) != npc) { return super.onSkillSee(npc, caster, skill, targets, isPet); } 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, isPet); } TerritoryWard ward = TerritoryWarManager.getInstance().getTerritoryWard(caster); if (ward == null) return super.onSkillSee(npc, caster, skill, targets, isPet); if ((caster.getSiegeSide() - 80) == ward.getOwnerCastleId()) { for(TerritoryNPCSpawn wardSpawn : TerritoryWarManager.getInstance().getTerritory(ward.getOwnerCastleId()).getOwnedWard()) if (wardSpawn.getNpcId() == 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, isPet); } public int getTerritoryIdForThisNPCId(int npcid) { return 0; } @Override public String onAttack(L2Npc npc,L2PcInstance player, int damage, boolean isPet) { if (npc.getCurrentHp() == npc.getMaxHp() && Util.contains(NPC_IDS, npc.getNpcId())) { int territoryId = getTerritoryIdForThisNPCId(npc.getNpcId()); if (territoryId >= 81 && territoryId <= 89) for(L2PcInstance pl : L2World.getInstance().getAllPlayers().values()) if (pl.getSiegeSide() == territoryId) { QuestState st = pl.getQuestState(getName()); if (st == null) st = newQuestState(pl); if (st.getState() != State.STARTED) { st.set("cond","1"); st.setStateAndNotSave(State.STARTED); } } } return super.onAttack(npc, player, damage, isPet); } @Override public String onKill (L2Npc npc, L2PcInstance killer, boolean isPet) { if (npc.getNpcId() == CATAPULT_ID) { TerritoryWarManager.getInstance().territoryCatapultDestroyed(TERRITORY_ID - 80); TerritoryWarManager.getInstance().giveTWPoint(killer, TERRITORY_ID, 4); TerritoryWarManager.getInstance().announceToParticipants(new ExShowScreenMessage(Text[0],10000), 135000, 13500); handleBecomeMercenaryQuest(killer,true); } else if (Util.contains(LEADER_IDS, npc.getNpcId())) TerritoryWarManager.getInstance().giveTWPoint(killer, TERRITORY_ID, 3); if (killer.getSiegeSide() != TERRITORY_ID && TerritoryWarManager.getInstance().getTerritory(killer.getSiegeSide() - 80) != null) TerritoryWarManager.getInstance().getTerritory(killer.getSiegeSide() - 80).getQuestDone()[0]++; return super.onKill(npc,killer,isPet); } @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { if (npc != null || player != null) return null; StringTokenizer st = new StringTokenizer(event, " "); event = st.nextToken(); // Get actual command if (event.equalsIgnoreCase("setNextTWDate")) { Calendar startTWDate = Calendar.getInstance(); startTWDate.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); startTWDate.set(Calendar.HOUR_OF_DAY, 20); startTWDate.set(Calendar.MINUTE, 0); startTWDate.set(Calendar.SECOND, 0); if (startTWDate.getTimeInMillis() < System.currentTimeMillis()) startTWDate.add(Calendar.DAY_OF_MONTH, 7); if (!SevenSigns.getInstance().isDateInSealValidPeriod(startTWDate)) startTWDate.add(Calendar.DAY_OF_MONTH, 7); saveGlobalQuestVar("nextTWStartDate", String.valueOf(startTWDate.getTimeInMillis())); TerritoryWarManager.getInstance().setTWStartTimeInMillis(startTWDate.getTimeInMillis()); _log.info("Next TerritoryWarTime: " + startTWDate.getTime()); } else if (event.equalsIgnoreCase("setTWDate") && st.hasMoreTokens()) { Calendar startTWDate = Calendar.getInstance(); startTWDate.setTimeInMillis(Long.parseLong(st.nextToken())); saveGlobalQuestVar("nextTWStartDate", String.valueOf(startTWDate.getTimeInMillis())); TerritoryWarManager.getInstance().setTWStartTimeInMillis(startTWDate.getTimeInMillis()); } return null; } private void handleKillTheQuest(L2PcInstance player) { QuestState st = player.getQuestState(getName()); int kill = 1; int max = 10; if (st == null) st = newQuestState(player); if (st.getState() != State.COMPLETED) { if (st.getState() != State.STARTED) { st.setState(State.STARTED); st.set("cond","1"); st.set("kill", "1"); max = Rnd.get(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); st.addExpAndSp(534000, 51000); st.set("doneDate", String.valueOf(Calendar.getInstance().get(Calendar.DAY_OF_YEAR))); st.setState(State.COMPLETED); st.exitQuest(true); player.sendPacket(new ExShowScreenMessage(Text[1],10000)); } else { st.set("kill", String.valueOf(kill)); player.sendPacket(new ExShowScreenMessage(Text[0].replace("MAX", String.valueOf(max)).replace("KILL", String.valueOf(kill)),10000)); } } else if (st.getInt("doneDate") != Calendar.getInstance().get(Calendar.DAY_OF_YEAR)) { st.setState(State.STARTED); st.set("cond","1"); st.set("kill", "1"); max = Rnd.get(RANDOM_MIN, RANDOM_MAX); st.set("max", String.valueOf(max)); player.sendPacket(new ExShowScreenMessage(Text[0].replace("MAX", String.valueOf(max)).replace("KILL", String.valueOf(kill)),10000)); } else if (player.isGM()) { // just for test player.sendMessage("Cleaning " + getName() + " Territory War quest by force!"); st.setState(State.STARTED); st.set("cond","1"); st.set("kill", "1"); max = Rnd.get(RANDOM_MIN, RANDOM_MAX); st.set("max", String.valueOf(max)); player.sendPacket(new ExShowScreenMessage(Text[0].replace("MAX", String.valueOf(max)).replace("KILL", String.valueOf(kill)),10000)); } } private void handleBecomeMercenaryQuest(L2PcInstance player, boolean catapult) { QuestState _state = player.getQuestState("147_PathtoBecominganEliteMercenary"); if(_state != null && _state.getState() == State.STARTED) { int _cond = _state.getInt("cond"); if (catapult) { if (_cond == 2) _state.set("cond", "4"); else if (_cond == 1) _state.set("cond", "3"); } else { if (_cond == 1 || _cond == 3) { // Get int _kills = _state.getInt("kills"); // Increase _kills++; // Save _state.set("kills", String.valueOf(_kills)); // Check if (_kills >= 10) { if (_cond == 1) _state.set("cond", "2"); else if (_cond == 3) _state.set("cond", "4"); } } } } } private void handleStepsForHonor(L2PcInstance player) { int kills = 0; int cond = 0; // Additional Handle for Quest QuestState _sfh = player.getQuestState("176_StepsForHonor"); if (_sfh != null && _sfh.getState() == State.STARTED) { cond = _sfh.getInt("cond"); if ( cond == 1 || cond == 3 || cond == 5 || cond == 7) { // Get kills kills = _sfh.getInt("kills"); // Increase kills++; // Save _sfh.set("kills", String.valueOf(kills)); // Check if (cond == 1 && kills >= 9) { _sfh.set("cond", "2"); _sfh.set("kills", "0"); } else if (cond == 3 && kills >= 18) { _sfh.set("cond", "4"); _sfh.set("kills", "0"); } else if (cond == 5 && kills >= 27) { _sfh.set("cond", "6"); _sfh.set("kills", "0"); } else if (cond == 7 && kills >= 36) { _sfh.set("cond", "8"); _sfh.unset("kills"); } } } } @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().getPartyMembers()) { 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.set("cond","1"); st.setStateAndNotSave(State.STARTED); // 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 void setOnEnterWorld(boolean val) { super.setOnEnterWorld(val); for(L2PcInstance player: L2World.getInstance().getAllPlayers().values()) if (player.getSiegeSide() > 0) { TerritoryWarSuperClass territoryQuest = _forTheSakeScripts.get(player.getSiegeSide()); if (territoryQuest == null) continue; QuestState st = player.getQuestState(territoryQuest.getName()); if (st == null) st = territoryQuest.newQuestState(player); if (val) { st.set("cond","1"); st.setStateAndNotSave(State.STARTED); // 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.setStateAndNotSave(State.COMPLETED); st.exitQuest(false); for(Quest q : _protectTheScripts.values()) if (player.getQuestState(q.getName()) != null) { player.getQuestState(q.getName()).setStateAndNotSave(State.COMPLETED); player.getQuestState(q.getName()).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); } } } } 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 Calendar startTWDate = Calendar.getInstance(); if (loadGlobalQuestVar("nextTWStartDate").equalsIgnoreCase("")) { startTWDate.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); startTWDate.set(Calendar.HOUR_OF_DAY, 20); startTWDate.set(Calendar.MINUTE, 0); startTWDate.set(Calendar.SECOND, 0); if (startTWDate.getTimeInMillis() < System.currentTimeMillis()) startTWDate.add(Calendar.DAY_OF_MONTH, 7); if (!SevenSigns.getInstance().isDateInSealValidPeriod(startTWDate)) startTWDate.add(Calendar.DAY_OF_MONTH, 7); saveGlobalQuestVar("nextTWStartDate", String.valueOf(startTWDate.getTimeInMillis())); } else { startTWDate.setTimeInMillis(Long.parseLong(loadGlobalQuestVar("nextTWStartDate"))); if (startTWDate.getTimeInMillis() < System.currentTimeMillis() && SevenSigns.getInstance().isSealValidationPeriod() && SevenSigns.getInstance().getMilliToPeriodChange() > 172800000) { startTWDate.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); startTWDate.set(Calendar.HOUR_OF_DAY, 20); startTWDate.set(Calendar.MINUTE, 0); startTWDate.set(Calendar.SECOND, 0); if (startTWDate.getTimeInMillis() < System.currentTimeMillis()) startTWDate.add(Calendar.DAY_OF_MONTH, 7); if (!SevenSigns.getInstance().isDateInSealValidPeriod(startTWDate)) startTWDate.add(Calendar.DAY_OF_MONTH, 7); saveGlobalQuestVar("nextTWStartDate", String.valueOf(startTWDate.getTimeInMillis())); } } TerritoryWarManager.getInstance().setTWStartTimeInMillis(startTWDate.getTimeInMillis()); _log.info("Next TerritoryWarTime: " + startTWDate.getTime()); } } public static void main(String[] args) { // initialize superclass new TerritoryWarSuperClass(-1,qn,"Territory_War"); // initialize subclasses // "For The Sake" quests TerritoryWarSuperClass gludio = new TheTerritoryGludio(); _forTheSakeScripts.put(gludio.TERRITORY_ID, gludio); TerritoryWarSuperClass dion = new TheTerritoryDion(); _forTheSakeScripts.put(dion.TERRITORY_ID, dion); TerritoryWarSuperClass giran = new TheTerritoryGiran(); _forTheSakeScripts.put(giran.TERRITORY_ID, giran); TerritoryWarSuperClass oren = new TheTerritoryOren(); _forTheSakeScripts.put(oren.TERRITORY_ID, oren); TerritoryWarSuperClass aden = new TheTerritoryAden(); _forTheSakeScripts.put(aden.TERRITORY_ID, aden); TerritoryWarSuperClass innadril = new TheTerritoryInnadril(); _forTheSakeScripts.put(innadril.TERRITORY_ID, innadril); TerritoryWarSuperClass goddard = new TheTerritoryGoddard(); _forTheSakeScripts.put(goddard.TERRITORY_ID, goddard); TerritoryWarSuperClass rune = new TheTerritoryRune(); _forTheSakeScripts.put(rune.TERRITORY_ID, rune); TerritoryWarSuperClass schuttgart = new TheTerritorySchuttgart(); _forTheSakeScripts.put(schuttgart.TERRITORY_ID, schuttgart); // "Protect the" quests TerritoryWarSuperClass catapult = new ProtectTheCatapult(); _protectTheScripts.put(catapult.getQuestIntId(), catapult); TerritoryWarSuperClass military = new ProtectTheMilitary(); _protectTheScripts.put(military.getQuestIntId(), military); TerritoryWarSuperClass religious = new ProtectTheReligious(); _protectTheScripts.put(religious.getQuestIntId(), religious); TerritoryWarSuperClass supplies = new ProtectTheSupplies(); _protectTheScripts.put(supplies.getQuestIntId(), supplies); TerritoryWarSuperClass economic = new ProtectTheEconomic(); _protectTheScripts.put(economic.getQuestIntId(), economic); // "Kill the" quests TerritoryWarSuperClass knights = new KillTheKnights(); for (int i : knights.CLASS_IDS) _killTheScripts.put(i, knights); TerritoryWarSuperClass warriors = new KillTheWarriors(); for (int i : warriors.CLASS_IDS) _killTheScripts.put(i, warriors); TerritoryWarSuperClass wizards = new KillTheWizards(); for (int i : wizards.CLASS_IDS) _killTheScripts.put(i, wizards); TerritoryWarSuperClass priests = new KillThePriests(); for (int i : priests.CLASS_IDS) _killTheScripts.put(i, priests); TerritoryWarSuperClass keys = new KillTheKeyTargets(); for (int i : keys.CLASS_IDS) _killTheScripts.put(i, keys); } }