/* * 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 silentium.gameserver.model.actor.instance; import java.util.List; import silentium.commons.utils.StringUtil; import silentium.gameserver.data.xml.SkillTreeData; import silentium.gameserver.model.L2Effect; import silentium.gameserver.model.L2EnchantSkillData; import silentium.gameserver.model.L2EnchantSkillLearn; import silentium.gameserver.model.L2Skill; import silentium.gameserver.model.L2SkillLearn; import silentium.gameserver.model.actor.L2Npc; import silentium.gameserver.model.actor.status.FolkStatus; import silentium.gameserver.model.base.ClassId; import silentium.gameserver.network.SystemMessageId; import silentium.gameserver.network.serverpackets.AcquireSkillList; import silentium.gameserver.network.serverpackets.ActionFailed; import silentium.gameserver.network.serverpackets.ExEnchantSkillList; import silentium.gameserver.network.serverpackets.NpcHtmlMessage; import silentium.gameserver.network.serverpackets.SystemMessage; import silentium.gameserver.skills.effects.EffectBuff; import silentium.gameserver.skills.effects.EffectDebuff; import silentium.gameserver.tables.SkillTable; import silentium.gameserver.tables.SkillTable.FrequentSkill; import silentium.gameserver.templates.chars.L2NpcTemplate; public class L2NpcInstance extends L2Npc { public L2NpcInstance(int objectId, L2NpcTemplate template) { super(objectId, template); } @Override public FolkStatus getStatus() { return (FolkStatus) super.getStatus(); } @Override public void initCharStatus() { setStatus(new FolkStatus(this)); } @Override public void addEffect(L2Effect newEffect) { if (newEffect instanceof EffectDebuff || newEffect instanceof EffectBuff) super.addEffect(newEffect); else if (newEffect != null) newEffect.stopEffectTask(); } public List<ClassId> getClassesToTeach() { return getTemplate().getTeachInfo(); } /** * This method displays SkillList to the player. * * @param player * The player who requested the method. * @param npc * The L2Npc linked to the request. * @param classId * The classId asked. Used to sort available skill list. */ public static void showSkillList(L2PcInstance player, L2Npc npc, ClassId classId) { if (((L2NpcInstance) npc).getClassesToTeach() == null) { NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId()); final String sb = StringUtil.concat("<html><body>I cannot teach you. My class list is empty.<br>Ask admin to fix it. Need add my npcid and classes to skill_learn.sql.<br>NpcId:", String.valueOf(npc.getTemplate().getNpcId()), ", Your classId:", String.valueOf(player.getClassId().getId()), "<br></body></html>"); html.setHtml(sb); player.sendPacket(html); return; } if (!npc.getTemplate().canTeach(classId)) { NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId()); html.setHtml("<html><body>I cannot teach you any skills.<br>You must find your current class teachers.</body></html>"); player.sendPacket(html); return; } AcquireSkillList asl = new AcquireSkillList(AcquireSkillList.SkillType.Usual); boolean empty = true; for (L2SkillLearn sl : SkillTreeData.getInstance().getAvailableSkills(player, classId)) { L2Skill sk = SkillTable.getInstance().getInfo(sl.getId(), sl.getLevel()); if (sk == null) continue; asl.addSkill(sl.getId(), sl.getLevel(), sl.getLevel(), sl.getSpCost(), 0); empty = false; } if (empty) { int minlevel = SkillTreeData.getInstance().getMinLevelForNewSkill(player, classId); if (minlevel > 0) player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1).addNumber(minlevel)); else player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN); } else player.sendPacket(asl); player.sendPacket(ActionFailed.STATIC_PACKET); } /** * This method displays EnchantSkillList to the player. * * @param player * The player who requested the method. * @param npc * The L2Npc linked to the request. * @param classId * The classId asked. Used to sort available enchant skill list. */ public static void showEnchantSkillList(L2PcInstance player, L2Npc npc, ClassId classId) { if (((L2NpcInstance) npc).getClassesToTeach() == null) { NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId()); final String sb = StringUtil.concat("<html><body>I cannot teach you. My class list is empty.<br>Ask admin to fix it. Need add my npcid and classes to skill_learn.sql.<br>NpcId:", String.valueOf(npc.getTemplate().getNpcId()), ", Your classId:", String.valueOf(player.getClassId().getId()), "<br></body></html>"); html.setHtml(sb); player.sendPacket(html); return; } if (!npc.getTemplate().canTeach(classId)) { NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId()); html.setHtml("<html><body>I cannot teach you any skills.<br>You must find your current class teachers. </body></html>"); player.sendPacket(html); return; } if (player.getClassId().level() < 3) { NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId()); html.setHtml("<html><body> You must have 3rd class change quest completed.</body></html>"); player.sendPacket(html); return; } ExEnchantSkillList esl = new ExEnchantSkillList(); boolean empty = true; List<L2EnchantSkillLearn> esll = SkillTreeData.getInstance().getAvailableEnchantSkills(player); for (L2EnchantSkillLearn skill : esll) { L2Skill sk = SkillTable.getInstance().getInfo(skill.getId(), skill.getLevel()); if (sk == null) continue; L2EnchantSkillData data = SkillTreeData.getInstance().getEnchantSkillData(skill.getEnchant()); if (data == null) continue; esl.addSkill(skill.getId(), skill.getLevel(), data.getCostSp(), data.getCostExp()); empty = false; } if (empty) { player.sendPacket(SystemMessageId.THERE_IS_NO_SKILL_THAT_ENABLES_ENCHANT); if (player.getLevel() < 74) player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1).addNumber(74)); else player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN); } else player.sendPacket(esl); player.sendPacket(ActionFailed.STATIC_PACKET); } public void giveBlessingSupport(L2PcInstance player) { if (player == null) return; // Select the player setTarget(player); // If the player is too high level, display a message and return if (player.getLevel() > 39 || player.getClassId().level() >= 2) { String content = "<html><body>Newbie Guide:<br>I'm sorry, but you are not eligible to receive the protection blessing.<br1>It can only be bestowed on <font color=\"LEVEL\">characters below level 39 who have not made a seccond transfer.</font></body></html>"; insertObjectIdAndShowChatWindow(player, content); return; } doCast(FrequentSkill.BLESSING_OF_PROTECTION.getSkill()); } @Override public void onBypassFeedback(L2PcInstance player, String command) { if (command.startsWith("SkillList")) { player.setSkillLearningClassId(player.getClassId()); showSkillList(player, player.getCurrentFolkNPC(), player.getClassId()); } else if (command.startsWith("EnchantSkillList")) showEnchantSkillList(player, player.getCurrentFolkNPC(), player.getClassId()); else if (command.startsWith("GiveBlessing")) giveBlessingSupport(player); else super.onBypassFeedback(player, command); } }