/* * This file is part of the L2J Mobius project. * * 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; import com.l2jmobius.Config; import com.l2jmobius.commons.util.CommonUtil; import com.l2jmobius.gameserver.enums.CategoryType; import com.l2jmobius.gameserver.enums.Race; import com.l2jmobius.gameserver.model.actor.L2Npc; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.base.ClassId; import com.l2jmobius.gameserver.model.events.EventType; import com.l2jmobius.gameserver.model.events.ListenerRegisterType; import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import com.l2jmobius.gameserver.model.events.annotations.RegisterType; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLevelChanged; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerPressTutorialMark; import com.l2jmobius.gameserver.model.holders.SkillHolder; import com.l2jmobius.gameserver.model.quest.Quest; import com.l2jmobius.gameserver.model.quest.QuestState; import com.l2jmobius.gameserver.model.quest.State; import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.serverpackets.TutorialShowHtml; import com.l2jmobius.gameserver.network.serverpackets.TutorialShowQuestionMark; /** * Abstract class for all Third Class Transfer quests. * @author St3eT */ public abstract class ThirdClassTransferQuest extends Quest { // NPCs private static final int QUARTERMASTER = 33407; private static final int VANGUARD_MEMBER = 33165; private static final int[] VANGUARDS = { 33166, 33167, 33168, 33169, }; // Items private static final int SOLDIER_TAG_HUMAN = 17748; private static final int SOLDIER_TAG_ELF = 17749; private static final int SOLDIER_TAG_DARK_ELF = 17750; private static final int SOLDIER_TAG_ORC = 17751; private static final int SOLDIER_TAG_DWARF = 17752; private static final int SOLDIER_TAG_KAMAEL = 17753; private static final int STEEL_DOOR_COIN = 37045; private static final int SOUL_SHOT_PACK = 22576; private static final int SPIRIT_SHOT_PACK = 22607; // Skills private static final SkillHolder SHOW_SKILL = new SkillHolder(5103, 1); // Misc private final int _minLevel; private final Race _race; public ThirdClassTransferQuest(int questId, int minLevel, Race race) { super(questId); addTalkId(QUARTERMASTER, VANGUARD_MEMBER); addTalkId(VANGUARDS); //@formatter:off registerQuestItems( SOLDIER_TAG_HUMAN, SOLDIER_TAG_ELF, SOLDIER_TAG_DARK_ELF, SOLDIER_TAG_ORC, SOLDIER_TAG_DWARF, SOLDIER_TAG_KAMAEL, 17484, // Cry of Destiny - Gladiator 17485, // Cry of Destiny - Warlord 17486, // Cry of Destiny - Paladin 17487, // Cry of Destiny - Dark Avanger 17488, // Cry of Destiny - Treasure Hunter 17489, // Cry of Destiny - Hawkeye 17490, // Cry of Destiny - Sorcerer 17491, // Cry of Destiny - Necromancer 17492, // Cry of Destiny - Warlock 17493, // Cry of Destiny - Bishop 17494, // Cry of Destiny - Prophet 17495, // Cry of Destiny - Temple Knight 17496, // Cry of Destiny - Swordsinger 17497, // Cry of Destiny - Plains Walker 17498, // Cry of Destiny - Silver Ranger 17499, // Cry of Destiny - Spellsinger 17500, // Cry of Destiny - Elemental Summoner 17501, // Cry of Destiny - Elder 17502, // Cry of Destiny - Shillien Knight 17503, // Cry of Destiny - Bladecancer 17504, // Cry of Destiny - Abyss Walker 17505, // Cry of Destiny - Phantom Ranger 17506, // Cry of Destiny - Spellhower 17507, // Cry of Destiny - Phantom Summoner 17508, // Cry of Destiny - Shillen Elder 17509, // Cry of Destiny - Destroyer 17510, // Cry of Destiny - Tyrant 17511, // Cry of Destiny - Overlord 17512, // Cry of Destiny - Warcryer 17513, // Cry of Destiny - Bounty Hunter 17514, // Cry of Destiny - Warsmith 17515, // Cry of Destiny - Berserker 17516, // Cry of Destiny - Soulbreaker (male) 17516, // Cry of Destiny - Soulbreaker (female) 17517 // Cry of Destiny - Arbalester ); //@formatter:on _minLevel = minLevel; _race = race; } @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { final QuestState st = getQuestState(player, false); if (st == null) { return null; } String htmltext = null; switch (event) { case "33407-02.html": { if (st.isCond(1)) { st.setCond(2, true); htmltext = event; } break; } case "33407-05.html": { if (st.isCond(3)) { st.setCond(4, true); st.unset("vanguard"); takeItems(player, getSoldierTag(player), -1); htmltext = event; } break; } case "33165-02.html": { if (st.isCond(4)) { st.setCond(5, true); htmltext = event; } break; } case "collectTag": { if (st.isCond(2)) { final int bit = 1 << (VANGUARDS[0] - npc.getId()); final int vanguard = st.getInt("vanguard"); if ((vanguard & bit) != bit) { giveItems(player, getSoldierTag(player), 1); st.set("vanguard", vanguard | bit); if (getQuestItemsCount(player, getSoldierTag(player)) == 4) { st.setCond(3, true); htmltext = "vanguard-04.html"; } else { htmltext = "vanguard-02.html"; } } else { htmltext = "vanguard-03.html"; } } break; } case "nextClassInfo": { if ((st.getInt("STARTED_CLASS") != player.getClassId().getId()) && (player.getLevel() >= _minLevel)) { htmltext = npc.getId() + "-10.html"; break; } final ClassId newClassId = player.getClassId().getNextClassIds().stream().findFirst().orElse(null); if (newClassId != null) { htmltext = "class_preview_" + newClassId.toString().toLowerCase() + ".html"; } break; } case "classTransfer": { if ((st.getInt("STARTED_CLASS") != player.getClassId().getId()) && (player.getLevel() >= _minLevel)) { htmltext = npc.getId() + "-10.html"; break; } final ClassId newClassId = player.getClassId().getNextClassIds().stream().findFirst().orElse(null); if (newClassId != null) { final ClassId currentClassId = player.getClassId(); if (!newClassId.childOf(currentClassId)) { break; } addSkillCastDesire(npc, player, SHOW_SKILL.getSkill(), 23); player.sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_YOUR_THIRD_CLASS_TRANSFER_QUEST); player.broadcastSocialAction(3); player.setBaseClass(newClassId); player.setClassId(newClassId.getId()); player.broadcastUserInfo(); giveItems(player, SOUL_SHOT_PACK, 1); giveItems(player, SPIRIT_SHOT_PACK, 1); giveItems(player, STEEL_DOOR_COIN, 87); addExpAndSp(player, 2050000, 0); st.exitQuest(true, true); htmltext = npc.getId() + "-09.html"; } break; } } return htmltext; } /** * @param player * @return */ private int getSoldierTag(L2PcInstance player) { switch (player.getRace()) { case HUMAN: { return SOLDIER_TAG_HUMAN; } case ELF: { return SOLDIER_TAG_ELF; } case DARK_ELF: { return SOLDIER_TAG_DARK_ELF; } case ORC: { return SOLDIER_TAG_ORC; } case DWARF: { return SOLDIER_TAG_DWARF; } case KAMAEL: { return SOLDIER_TAG_KAMAEL; } } return 0; } @Override public String onTalk(L2Npc npc, L2PcInstance player, boolean isSimulated) { String htmltext = getNoQuestMsg(player); final QuestState st = getQuestState(player, true); if (st.getState() == State.STARTED) { switch (npc.getId()) { case QUARTERMASTER: { switch (st.getCond()) { case 1: { htmltext = "33407-01.html"; break; } case 2: { htmltext = "33407-03.html"; break; } case 3: { htmltext = "33407-04.html"; break; } case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: { htmltext = "33407-05.html"; break; } } break; } case VANGUARD_MEMBER: { switch (st.getCond()) { case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: { htmltext = "33165-01.html"; break; } } break; } default: { if (st.isCond(2) && CommonUtil.contains(VANGUARDS, npc.getId())) { htmltext = "vanguard-01.html"; } break; } } } return htmltext; } @RegisterEvent(EventType.ON_PLAYER_PRESS_TUTORIAL_MARK) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void onPlayerPressTutorialMark(OnPlayerPressTutorialMark event) { if (event.getMarkId() == getId()) { final L2PcInstance player = event.getActiveChar(); player.sendPacket(new TutorialShowHtml(getHtm(player.getHtmlPrefix(), "popupInvite.html"))); } } @RegisterEvent(EventType.ON_PLAYER_LEVEL_CHANGED) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void OnPlayerLevelChanged(OnPlayerLevelChanged event) { if (Config.DISABLE_TUTORIAL) { return; } final L2PcInstance player = event.getActiveChar(); final int oldLevel = event.getOldLevel(); final int newLevel = event.getNewLevel(); if ((oldLevel < newLevel) && (newLevel == _minLevel) && (player.getRace() == _race) && (player.isInCategory(CategoryType.THIRD_CLASS_GROUP))) { player.sendPacket(new TutorialShowQuestionMark(getId())); } } @RegisterEvent(EventType.ON_PLAYER_LOGIN) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void OnPlayerLogin(OnPlayerLogin event) { if (Config.DISABLE_TUTORIAL) { return; } final L2PcInstance player = event.getActiveChar(); if ((player.getLevel() >= _minLevel) && (player.getRace() == _race) && (player.isInCategory(CategoryType.THIRD_CLASS_GROUP))) { if (getQuestState(player, true).isCreated()) { player.sendPacket(new TutorialShowQuestionMark(getId())); } } } }