411 lines
11 KiB
Java
411 lines
11 KiB
Java
/*
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
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()));
|
|
}
|
|
}
|
|
}
|
|
} |