/*
* 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 custom.SubClassSkills;
import java.util.Map;
import javolution.util.FastMap;
import com.l2jserver.Config;
import com.l2jserver.gameserver.datatables.SkillTable;
import com.l2jserver.gameserver.model.L2ItemInstance;
import com.l2jserver.gameserver.model.L2Skill;
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.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.AcquireSkillInfo;
import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.gameserver.util.Util;
/**
* @authors Gigiikun (python), Nyaran (java)
*/
public class SubClassSkills extends Quest
{
private static final String qn = "SubClassSkills";
private static final int NPC = 32323;
private static final int[] SKILLITEMS =
{
10280, 10281, 10282, 10283, 10284, 10285, 10286, 10287, 10288, 10289, 10290, 10291, 10292, 10293, 10294, 10612
};
private static final Map SUBSKILLS = new FastMap();
private static final Map QUESTVARSITEMS = new FastMap();
public SubClassSkills(int id, String name, String descr)
{
super(id, name, descr);
addStartNpc(NPC);
addTalkId(NPC);
addAcquireSkillId(NPC);
SUBSKILLS.put(10280, new int[] {631,632,633,634}); // Common
SUBSKILLS.put(10612, new int[] {637,638,639,640,799,800}); // Enhanced
SUBSKILLS.put(10281, new int[] {801,650,651}); // Warriors
SUBSKILLS.put(10282, new int[] {804,641,652}); // Knights
SUBSKILLS.put(10283, new int[] {644,645,653}); // Rogues
SUBSKILLS.put(10284, new int[] {802,646,654}); // Wizards
SUBSKILLS.put(10285, new int[] {803,648,1490}); // Healers
SUBSKILLS.put(10286, new int[] {643,1489,1491}); // Summoners
SUBSKILLS.put(10287, new int[] {642,647,655}); // Enchanters
SUBSKILLS.put(10289, new int[] {656}); // Warriors
SUBSKILLS.put(10288, new int[] {657}); // Knights
SUBSKILLS.put(10290, new int[] {658}); // Rogues
SUBSKILLS.put(10292, new int[] {659}); // Wizards
SUBSKILLS.put(10291, new int[] {661}); // Healers
SUBSKILLS.put(10294, new int[] {660}); // Summoners
SUBSKILLS.put(10293, new int[] {662}); // Enchanters
QUESTVARSITEMS.put("EmergentAbility65-", new int[] {10280});
QUESTVARSITEMS.put("EmergentAbility70-", new int[] {10280});
QUESTVARSITEMS.put("ClassAbility75-", new int[] {10612, 10281, 10282, 10283, 10284, 10285, 10286, 10287});
QUESTVARSITEMS.put("ClassAbility80-", new int[] {10288, 10289, 10290, 10291, 10292, 10293, 10294});
}
@Override
public String onAcquireSkillList(L2Npc npc, L2PcInstance player)
{
AcquireSkillList asl = new AcquireSkillList(AcquireSkillList.SkillType.unk4);
L2Skill[] oldSkills = player.getAllSkills();
int count = 0;
for (int i : SKILLITEMS)
{
for (int j : SUBSKILLS.get(i))
{
int minLevel = 0;
int maxLevel = SkillTable.getInstance().getMaxLevel(j);
for (L2Skill oldsk : oldSkills)
{
if (oldsk.getId() == j)
minLevel = oldsk.getLevel();
}
if (minLevel < maxLevel)
{
count += 1;
asl.addSkill(j, minLevel + 1, maxLevel, 0, 0);
}
}
}
player.sendPacket(asl);
if (count == 0)
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.NO_MORE_SKILLS_TO_LEARN));
return "";
}
@Override
public String onAcquireSkill(L2Npc npc, L2PcInstance player, L2Skill skill)
{
if (player.isSubClassActive())
{
player.sendMessage("You are trying to learn skill that u can't..");
Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to learn skill that he can't!!!", Config.DEFAULT_PUNISH);
return "false";
}
QuestState st = player.getQuestState(qn);
for (int i : SKILLITEMS)
{
if (Util.contains(SUBSKILLS.get(i), skill.getId()))
{
for (String var : QUESTVARSITEMS.keySet())
{
if (Util.contains(QUESTVARSITEMS.get(var), i))
{
for (int j = 0; j < Config.MAX_SUBCLASS; j++)
{
String qvar = st.getGlobalQuestVar(var + String.valueOf(j + 1));
if (qvar != "" && qvar != "0" && !qvar.endsWith(";"))
{
L2ItemInstance Item = player.getInventory().getItemByObjectId(Integer.parseInt(qvar));
if (Item != null && Item.getItemId() == i)
{
player.destroyItem(qn, Integer.parseInt(qvar), 1, player, false);
st.saveGlobalQuestVar(var + String.valueOf(j + 1), String.valueOf(skill.getId()) + ";");
return "true";
}
}
}
}
}
}
}
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ITEM_MISSING_TO_LEARN_SKILL));
return "false";
}
@Override
public String onAcquireSkillInfo(L2Npc npc, L2PcInstance player, L2Skill skill)
{
AcquireSkillInfo asi = new AcquireSkillInfo(skill.getId(), skill.getLevel(), 0, 5);
for (int i : SKILLITEMS)
{
if (Util.contains(SUBSKILLS.get(i), skill.getId()))
asi.addRequirement(99, i, 1, 50);
}
player.sendPacket(asi);
return "";
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
String htmltext = event;
QuestState st = player.getQuestState(qn);
if (event.equals("learn"))
{
htmltext = "";
QuestState st2 = player.getQuestState("136_MoreThanMeetsTheEye");
if (player.isSubClassActive())
htmltext = "8005-04.htm";
else if (st2 == null || st2.getState() != State.COMPLETED)
htmltext = "8005-03.htm";
else
{
int j = 0;
for (int i : SKILLITEMS)
j += st.getQuestItemsCount(i);
if (j > 0)
this.onAcquireSkillList(npc, player);
else
htmltext = "8005-04.htm";
}
}
else if (event.equals("cancel"))
if (st.getQuestItemsCount(57) < 10000000)
htmltext = "8005-07.htm";
else if (player.getSubClasses().size() == 0)
htmltext = "8005-03.htm";
else if (player.isSubClassActive())
htmltext = "8005-04.htm";
else
{
int activeCertifications = 0;
for (String var : QUESTVARSITEMS.keySet())
{
for (int i = 0; i < Config.MAX_SUBCLASS; i++)
{
String qvar = st.getGlobalQuestVar(var + String.valueOf(i + 1));
if (qvar.endsWith(";"))
activeCertifications += 1;
else if (qvar != "" && qvar != "0")
activeCertifications += 1;
}
}
if (activeCertifications == 0)
htmltext = "8005-08.htm";
else
{
for (String var : QUESTVARSITEMS.keySet())
{
for (int i = 0; i < Config.MAX_SUBCLASS; i++)
{
String qvar = st.getGlobalQuestVar(var + String.valueOf(i + 1));
if (qvar.endsWith(";"))
{
L2Skill skill = SkillTable.getInstance().getInfo(Integer.parseInt(qvar.replace(";", "")), 1);
if (skill != null)
{
qvar = st.getGlobalQuestVar(var + String.valueOf(i + 1));
player.removeSkill(skill, true);
st.saveGlobalQuestVar(var + String.valueOf(i + 1), "0");
}
}
else if (qvar != "" && qvar != "0")
{
L2ItemInstance Item = player.getInventory().getItemByObjectId(Integer.parseInt(qvar));
if (Item != null)
player.destroyItem(qn, Integer.parseInt(qvar), 1, player, false);
else
{
Item = player.getWarehouse().getItemByObjectId(Integer.parseInt(qvar));
if (Item != null)
{
_log.warning("Somehow " + player.getName() + " put certification book into warehouse!");
player.getWarehouse().destroyItem(qn, Item, 1, player, false);
}
else
_log.warning("Somehow " + player.getName() + " his/her delete certification book!");
}
st.saveGlobalQuestVar(var + String.valueOf(i + 1), "0");
}
}
}
st.takeItems(57, 10000000);
htmltext = "8005-09.htm";
player.sendSkillList();
}
}
return htmltext;
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
String htmltext = getNoQuestMsg(player);
QuestState st = player.getQuestState(qn);
int npcId = npc.getNpcId();
if (npcId == NPC)
{
st.set("cond", "0");
st.setState(State.STARTED);
htmltext = "8005-01.htm";
}
return htmltext;
}
public static void main(String args[])
{
new SubClassSkills(-1, qn, "custom");
}
}