/* * 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 net.sf.l2j.gameserver.handler.admincommandhandlers; import java.util.StringTokenizer; import java.util.logging.Logger; import javolution.text.TextBuilder; import net.sf.l2j.Config; import net.sf.l2j.gameserver.datatables.SkillTable; import net.sf.l2j.gameserver.datatables.SkillTreeTable; import net.sf.l2j.gameserver.handler.IAdminCommandHandler; import net.sf.l2j.gameserver.model.L2Object; import net.sf.l2j.gameserver.model.L2Skill; import net.sf.l2j.gameserver.model.L2SkillLearn; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.network.SystemMessageId; import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage; import net.sf.l2j.gameserver.serverpackets.PledgeSkillList; import net.sf.l2j.gameserver.serverpackets.SystemMessage; /** * This class handles following admin commands: * - show_skills * - remove_skills * - skill_list * - skill_index * - add_skill * - remove_skill * - get_skills * - reset_skills * - give_all_skills * - remove_all_skills * - add_clan_skills * * @version $Revision: 1.2.4.7 $ $Date: 2005/04/11 10:06:02 $ */ public class AdminSkill implements IAdminCommandHandler { private static Logger _log = Logger.getLogger(AdminSkill.class.getName()); private static final String[] ADMIN_COMMANDS = { "admin_show_skills", "admin_remove_skills", "admin_skill_list", "admin_skill_index", "admin_add_skill", "admin_remove_skill", "admin_get_skills", "admin_reset_skills", "admin_give_all_skills", "admin_remove_all_skills", "admin_add_clan_skill" }; private static L2Skill[] adminSkills; public boolean useAdminCommand(String command, L2PcInstance activeChar) { if (command.equals("admin_show_skills")) showMainPage(activeChar); else if (command.startsWith("admin_remove_skills")) { try { String val = command.substring(20); removeSkillsPage(activeChar, Integer.parseInt(val)); } catch (StringIndexOutOfBoundsException e){} } else if (command.startsWith("admin_skill_list")) { AdminHelpPage.showHelpPage(activeChar, "skills.htm"); } else if (command.startsWith("admin_skill_index")) { try { String val = command.substring(18); AdminHelpPage.showHelpPage(activeChar, "skills/" + val + ".htm"); } catch (StringIndexOutOfBoundsException e){} } else if (command.startsWith("admin_add_skill")) { try { String val = command.substring(15); adminAddSkill(activeChar, val); } catch (Exception e) { activeChar.sendMessage("Usage: //add_skill "); } } else if (command.startsWith("admin_remove_skill")) { try { String id = command.substring(19); int idval = Integer.parseInt(id); adminRemoveSkill(activeChar, idval); } catch (Exception e) { activeChar.sendMessage("Usage: //remove_skill "); } } else if (command.equals("admin_get_skills")) { adminGetSkills(activeChar); } else if (command.equals("admin_reset_skills")) { adminResetSkills(activeChar); } else if (command.equals("admin_give_all_skills")) { adminGiveAllSkills(activeChar); } else if (command.equals("admin_remove_all_skills")) { if (activeChar.getTarget() instanceof L2PcInstance) { L2PcInstance player = (L2PcInstance)activeChar.getTarget(); for (L2Skill skill : player.getAllSkills()) player.removeSkill(skill); activeChar.sendMessage("You removed all skills from " + player.getName()); player.sendMessage("Admin removed all skills from you."); player.sendSkillList(); } } else if (command.startsWith("admin_add_clan_skill")) { try { String[] val = command.split(" "); adminAddClanSkill(activeChar, Integer.parseInt(val[1]),Integer.parseInt(val[2])); } catch (Exception e) { activeChar.sendMessage("Usage: //add_clan_skill "); } } return true; } /** * This function will give all the skills that the target can learn at his/her level * @param activeChar: the gm char */ private void adminGiveAllSkills(L2PcInstance activeChar) { L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance)target; else { activeChar.sendPacket(new SystemMessage(SystemMessageId.INCORRECT_TARGET)); return; } boolean countUnlearnable = true; int unLearnable = 0; int skillCounter = 0; L2SkillLearn[] skills = SkillTreeTable.getInstance().getAvailableSkills(player, player.getClassId()); while(skills.length > unLearnable) { for (L2SkillLearn s : skills) { L2Skill sk = SkillTable.getInstance().getInfo(s.getId(), s.getLevel()); if (sk == null || !sk.getCanLearn(player.getClassId())) { if(countUnlearnable) unLearnable++; continue; } if(player.getSkillLevel(sk.getId()) == -1) skillCounter++; player.addSkill(sk, true); } countUnlearnable = false; skills = SkillTreeTable.getInstance().getAvailableSkills(player, player.getClassId()); } //Notify player and admin player.sendMessage("A GM gave you " + skillCounter + " skills."); activeChar.sendMessage("You gave " + skillCounter + " skills to " + player.getName()); player.sendSkillList(); } public String[] getAdminCommandList() { return ADMIN_COMMANDS; } private void removeSkillsPage(L2PcInstance activeChar, int page) { //TODO: Externalize HTML L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance)target; else { activeChar.sendPacket(new SystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); return; } L2Skill[] skills = player.getAllSkills(); int MaxSkillsPerPage = 10; int MaxPages = skills.length / MaxSkillsPerPage; if (skills.length > MaxSkillsPerPage * MaxPages) MaxPages++; if (page>MaxPages) page = MaxPages; int SkillsStart = MaxSkillsPerPage*page; int SkillsEnd = skills.length; if (SkillsEnd - SkillsStart > MaxSkillsPerPage) SkillsEnd = SkillsStart + MaxSkillsPerPage; NpcHtmlMessage adminReply = new NpcHtmlMessage(5); TextBuilder replyMSG = new TextBuilder(""); replyMSG.append(""); replyMSG.append(""); replyMSG.append(""); replyMSG.append(""); replyMSG.append("
Character Selection Menu
"); replyMSG.append("

"); replyMSG.append("
Editing " + player.getName() + "
"); replyMSG.append("
Lv: " + player.getLevel() + " " + player.getTemplate().className + "
"); replyMSG.append("
"); replyMSG.append("
Note: Dont forget that modifying players skills can
ruin the game...
"); replyMSG.append("
Click on the skill you wish to remove:
"); replyMSG.append("
"); String pages = "
"; for (int x=0; xPage " + pagenr + ""; } pages += "
"; replyMSG.append(pages); replyMSG.append("
"); replyMSG.append(""); for (int i = SkillsStart; i < SkillsEnd; i++) replyMSG.append(""); replyMSG.append("
Name:Level:Id:
"+skills[i].getName()+""+skills[i].getLevel()+""+skills[i].getId()+"
"); replyMSG.append("
"); replyMSG.append("Remove skill by ID :"); replyMSG.append(""); replyMSG.append(""); replyMSG.append("
Id:
"); replyMSG.append("
"); replyMSG.append("
"); replyMSG.append(""); adminReply.setHtml(replyMSG.toString()); activeChar.sendPacket(adminReply); } private void showMainPage(L2PcInstance activeChar) { L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance)target; else { activeChar.sendPacket(new SystemMessage(SystemMessageId.INCORRECT_TARGET)); return; } NpcHtmlMessage adminReply = new NpcHtmlMessage(5); adminReply.setFile("data/html/admin/charskills.htm"); adminReply.replace("%name%",player.getName()); adminReply.replace("%level%",String.valueOf(player.getLevel())); adminReply.replace("%class%",player.getTemplate().className); activeChar.sendPacket(adminReply); } private void adminGetSkills(L2PcInstance activeChar) { L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance)target; else { activeChar.sendPacket(new SystemMessage(SystemMessageId.INCORRECT_TARGET)); return; } if (player.getName().equals(activeChar.getName())) player.sendPacket(new SystemMessage(SystemMessageId.CANNOT_USE_ON_YOURSELF)); else { L2Skill[] skills = player.getAllSkills(); adminSkills = activeChar.getAllSkills(); for (int i=0;i 391) || (level<1) || (level>3)) { activeChar.sendMessage("Usage: //add_clan_skill "); showMainPage(activeChar); return; } else { L2Skill skill = SkillTable.getInstance().getInfo(id,level); if (skill != null) { String skillname = skill.getName(); SystemMessage sm = new SystemMessage(SystemMessageId.CLAN_SKILL_S1_ADDED); sm.addSkillName(id); player.sendPacket(sm); player.getClan().broadcastToOnlineMembers(sm); player.getClan().addNewSkill(skill); activeChar.sendMessage("You gave the Clan Skill: "+skillname+" to the clan "+player.getClan().getName()+"."); activeChar.getClan().broadcastToOnlineMembers(new PledgeSkillList(activeChar.getClan())); for(L2PcInstance member: activeChar.getClan().getOnlineMembers(0)) { member.sendSkillList(); } showMainPage(activeChar); return; } else { activeChar.sendMessage("Error: there is no such skill."); return; } } } }