/* * 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 <http://www.gnu.org/licenses/>. */ package ai.npc.Trandon; import java.util.Set; import ai.npc.AbstractNpcAI; import com.l2jserver.Config; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.events.EventType; import com.l2jserver.gameserver.model.events.ListenerRegisterType; import com.l2jserver.gameserver.model.events.annotations.RegisterEvent; import com.l2jserver.gameserver.model.events.annotations.RegisterType; import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerLogin; import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSubChange; import com.l2jserver.gameserver.model.itemcontainer.Inventory; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.model.variables.PlayerVariables; import com.l2jserver.gameserver.network.clientpackets.RequestAcquireSkill; /** * Trandon AI. * @author malyelfik */ public final class Trandon extends AbstractNpcAI { // NPC private static final int NPC_ID = 33490; // Items private static final int SUB_CERTIFICATE = 10280; private static final int DUAL_CERTIFICATE = 36078; // Misc @formatter:off private static final int[] SUB_SKILL_LEVELS = {65, 70, 75, 80}; private static final int[] DUAL_SKILL_LEVELS = {85, 90, 95, 99}; // @formatter:on private Trandon() { super(Trandon.class.getSimpleName(), "ai/npc"); addStartNpc(NPC_ID); addFirstTalkId(NPC_ID); addTalkId(NPC_ID); } @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { final String[] substrings = event.split(" "); if (substrings.length < 1) { return null; } String htmltext = substrings[0]; switch (htmltext) { case "33490.html": case "33490-01.html": case "33490-02.html": case "33490-03.html": case "33490-04.html": case "33490-05.html": case "33490-06.html": case "33490-07.html": case "33490-08.html": case "33490-09.html": case "33490-10.html": case "33490-11.html": case "33490-19.html": break; case "33490-12.html": { if (player.getRace().equals(Race.ERTHEIA) || hasAllSubCertifications(player)) { htmltext = "33490-15.html"; } else if (!player.isSubClassActive()) { htmltext = "33490-13.html"; } else if (!player.isInventoryUnder90(false) || (player.getWeightPenalty() >= 2)) { htmltext = "33490-14.html"; } break; } case "subCertify": { if ((substrings.length < 2) || !player.isSubClassActive()) { return null; } final int index = Integer.parseInt(substrings[1]); if ((index < 0) || (index > 3)) { return null; } final int level = SUB_SKILL_LEVELS[index]; if (player.getLevel() < level) { htmltext = getHtm(player.getHtmlPrefix(), "33490-16.html").replace("%level%", String.valueOf(level)); } else if (player.getVariables().hasVariable(getSubSkillVariableName(player, level))) { htmltext = "33490-17.html"; } else { htmltext = getHtm(player.getHtmlPrefix(), "33490-18.html"); htmltext = htmltext.replace("%level%", String.valueOf(level)); htmltext = htmltext.replace("%index%", String.valueOf(index)); } break; } case "giveSubCertify": { if ((substrings.length < 2) || !player.isSubClassActive() || player.getRace().equals(Race.ERTHEIA)) { return null; } final int index = Integer.parseInt(substrings[1]); if ((index < 0) || (index > 3)) { return null; } final int level = SUB_SKILL_LEVELS[index]; final PlayerVariables vars = player.getVariables(); if ((player.getLevel() < level) || vars.hasVariable(getSubSkillVariableName(player, level))) { htmltext = null; } else { vars.set(getSubSkillVariableName(player, level), true); giveItems(player, SUB_CERTIFICATE, 1); htmltext = "33490-20.html"; } break; } case "learnSubSkill": { if (player.getRace().equals(Race.ERTHEIA)) { htmltext = "33490-15.html"; } else if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE)) { htmltext = "33490-21.html"; } else { RequestAcquireSkill.showSubSkillList(player); htmltext = null; } break; } case "deleteSubSkill": { if (player.getRace().equals(Race.ERTHEIA)) { htmltext = "33490-15.html"; } else if (player.isSubClassActive()) { htmltext = "33490-21.html"; } else if (player.getAdena() < Config.FEE_DELETE_SUBCLASS_SKILLS) { htmltext = "33490-22.html"; } else if (!hasSubCertificate(player)) { htmltext = "33490-23.html"; } else { htmltext = null; // TODO: Unknown html takeItems(player, SUB_CERTIFICATE, -1); takeItems(player, Inventory.ADENA_ID, Config.FEE_DELETE_SUBCLASS_SKILLS); final PlayerVariables vars = player.getVariables(); for (int i = 1; i <= 3; i++) { for (int lv : SUB_SKILL_LEVELS) { vars.remove("SubSkill-" + i + "-" + lv); } } takeSkills(player, "SubSkillList"); } break; } case "33490-26.html": { // TODO: What happens when you have all dual certificates? if (!player.isDualClassActive()) { htmltext = "33490-24.html"; } else if (!player.isInventoryUnder90(false) || (player.getWeightPenalty() >= 2)) { htmltext = "33490-25.html"; } break; } case "dualCertify": { if ((substrings.length < 2) || !player.isDualClassActive()) { return null; } final int index = Integer.parseInt(substrings[1]); if ((index < 0) || (index > 3)) { return null; } final int level = DUAL_SKILL_LEVELS[index]; final PlayerVariables vars = player.getVariables(); if (vars.hasVariable(getDualSkillVariableName(level))) { htmltext = getHtm(player.getHtmlPrefix(), "33490-27.html"); } else if ((player.getLevel() < level) || (player.getStat().getBaseLevel() < level)) { htmltext = getHtm(player.getHtmlPrefix(), "33490-28.html"); } else { vars.set(getDualSkillVariableName(level), true); giveItems(player, DUAL_CERTIFICATE, 1); htmltext = getHtm(player.getHtmlPrefix(), "33490-29.html"); } htmltext = htmltext.replace("%level%", String.valueOf(level)); break; } case "learnDualSkill": { // TODO: What happens when you have all dual-certificates used? if (player.isSubClassActive()) { htmltext = "33490-30.html"; } else if (!hasQuestItems(player, DUAL_CERTIFICATE)) { htmltext = "33490-31.html"; } else if ((player.getLevel() < DUAL_SKILL_LEVELS[0]) || (player.getStat().getBaseLevel() < DUAL_SKILL_LEVELS[0])) { // This case should not happen htmltext = null; } else { RequestAcquireSkill.showDualSkillList(player); htmltext = null; } break; } case "deleteDualSkill": { if (player.isSubClassActive()) { htmltext = "33490-30.html"; } else if (player.getAdena() < Config.FEE_DELETE_DUALCLASS_SKILLS) { htmltext = "33490-32.html"; } else if (!hasDualCertificate(player)) { htmltext = "33490-33.html"; } else { htmltext = null; // TODO: Unknown html takeItems(player, DUAL_CERTIFICATE, -1); takeItems(player, Inventory.ADENA_ID, Config.FEE_DELETE_DUALCLASS_SKILLS); final PlayerVariables vars = player.getVariables(); for (int lv : DUAL_SKILL_LEVELS) { vars.remove(getDualSkillVariableName(lv)); } takeSkills(player, "DualSkillList"); } break; } default: { htmltext = null; } } return htmltext; } // TODO: Move this to char skills @RegisterEvent(EventType.ON_PLAYER_SUB_CHANGE) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public final void onSubChange(OnPlayerSubChange evt) { final L2PcInstance player = evt.getActiveChar(); if (player.isDualClassActive() || !player.isSubClassActive()) { giveSkills(player, "DualSkillList"); } giveSkills(player, "SubSkillList"); } @RegisterEvent(EventType.ON_PLAYER_LOGIN) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public final void onLogin(OnPlayerLogin evt) { final L2PcInstance player = evt.getActiveChar(); if (player.isDualClassActive() || !player.isSubClassActive()) { giveSkills(player, "DualSkillList"); } giveSkills(player, "SubSkillList"); } /** * Checks if player has all sub certifications for current subclass * @param player * @return */ private final boolean hasAllSubCertifications(L2PcInstance player) { if (!player.isSubClassActive()) { return false; } final PlayerVariables vars = player.getVariables(); for (int lv : SUB_SKILL_LEVELS) { if (!vars.hasVariable(getSubSkillVariableName(player, lv))) { return false; } } return true; } /** * Checks if player has any sub certification * @param player * @return */ private final boolean hasSubCertificate(L2PcInstance player) { final PlayerVariables vars = player.getVariables(); final Set<Integer> subs = player.getSubClasses().keySet(); for (int index : subs) { for (int lv : SUB_SKILL_LEVELS) { if (vars.hasVariable("SubSkill-" + index + "-" + lv)) { return true; } } } return false; } /** * Checks if player has any dual certification * @param player * @return */ private final boolean hasDualCertificate(L2PcInstance player) { final PlayerVariables vars = player.getVariables(); for (int lv : DUAL_SKILL_LEVELS) { if (vars.hasVariable(getDualSkillVariableName(lv))) { return true; } } return false; } private final String getSubSkillVariableName(L2PcInstance player, int level) { return "SubSkill-" + player.getClassIndex() + "-" + level; } private final String getDualSkillVariableName(int level) { return "DualSkill-" + level; } private final void takeSkills(L2PcInstance player, String type) { final PlayerVariables vars = player.getVariables(); final String list = vars.getString(type, ""); if (!list.isEmpty()) { final String[] skills = list.split(";"); for (String skill : skills) { final String[] str = skill.split("-"); final Skill sk = SkillData.getInstance().getSkill(Integer.parseInt(str[0]), Integer.parseInt(str[1])); player.removeSkill(sk); } vars.remove(type); player.sendSkillList(); } } private final void giveSkills(L2PcInstance player, String type) { final String list = player.getVariables().getString(type, ""); if (!list.isEmpty()) { final String[] skills = list.split(";"); for (String skill : skills) { final String[] str = skill.split("-"); final Skill sk = SkillData.getInstance().getSkill(Integer.parseInt(str[0]), Integer.parseInt(str[1])); player.addSkill(sk, false); } } } public static void main(String[] args) { new Trandon(); } }