/* * 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 2, 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. * * http://www.gnu.org/copyleft/gpl.html */ package net.sf.l2j.gameserver.model.actor.instance; import java.util.Iterator; import java.util.Set; import javolution.text.TextBuilder; import net.sf.l2j.Config; import net.sf.l2j.gameserver.Olympiad; import net.sf.l2j.gameserver.datatables.CharTemplateTable; import net.sf.l2j.gameserver.datatables.ClanTable; import net.sf.l2j.gameserver.datatables.SkillTreeTable; import net.sf.l2j.gameserver.instancemanager.CastleManager; import net.sf.l2j.gameserver.instancemanager.SiegeManager; import net.sf.l2j.gameserver.model.L2Clan; import net.sf.l2j.gameserver.model.L2ClanMember; import net.sf.l2j.gameserver.model.L2PledgeSkillLearn; import net.sf.l2j.gameserver.model.L2Clan.SubPledge; import net.sf.l2j.gameserver.model.base.ClassType; import net.sf.l2j.gameserver.model.base.PlayerClass; import net.sf.l2j.gameserver.model.base.PlayerRace; import net.sf.l2j.gameserver.model.base.SubClass; import net.sf.l2j.gameserver.model.entity.Castle; import net.sf.l2j.gameserver.model.quest.QuestState; import net.sf.l2j.gameserver.serverpackets.ActionFailed; import net.sf.l2j.gameserver.serverpackets.AquireSkillList; import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage; import net.sf.l2j.gameserver.serverpackets.SystemMessage; import net.sf.l2j.gameserver.templates.L2NpcTemplate; import net.sf.l2j.gameserver.util.Util; /** * This class ... * * @version $Revision: 1.4.2.3.2.8 $ $Date: 2005/03/29 23:15:15 $ */ public final class L2VillageMasterInstance extends L2FolkInstance { //private static Logger _log = Logger.getLogger(L2VillageMasterInstance.class.getName()); /** * @param template */ public L2VillageMasterInstance(int objectId, L2NpcTemplate template) { super(objectId, template); } public void onBypassFeedback(L2PcInstance player, String command) { if (!isInsideRadius(player, INTERACTION_DISTANCE, false, false)) return; player.sendPacket(new ActionFailed()); String[] commandStr = command.split(" "); String actualCommand = commandStr[0]; // Get actual command String cmdParams = ""; String cmdParams2 = ""; if (commandStr.length >= 2) cmdParams = commandStr[1]; if (commandStr.length >= 3) cmdParams2 = commandStr[2]; if (actualCommand.equalsIgnoreCase("create_clan")) { if (cmdParams.equals("")) return; ClanTable.getInstance().createClan(player, cmdParams); } else if (actualCommand.equalsIgnoreCase("create_academy")) { if (cmdParams.equals("")) return; createSubPledge(player, cmdParams, null, L2Clan.SUBUNIT_ACADEMY, 5); } else if (actualCommand.equalsIgnoreCase("create_royal")) { if (cmdParams.equals("")) return; createSubPledge(player, cmdParams, cmdParams2, L2Clan.SUBUNIT_ROYAL1, 6); } else if (actualCommand.equalsIgnoreCase("create_knight")) { if (cmdParams.equals("")) return; createSubPledge(player, cmdParams, cmdParams2, L2Clan.SUBUNIT_KNIGHT1, 7); } else if (actualCommand.equalsIgnoreCase("assign_subpl_leader")) { if (cmdParams.equals("")) return; assignSubPledgeLeader(player, cmdParams, cmdParams2); } else if (actualCommand.equalsIgnoreCase("create_ally")) { if (cmdParams.equals("")) return; if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessage.ONLY_CLAN_LEADER_CREATE_ALLIANCE)); return; } player.getClan().createAlly(player, cmdParams); } else if (actualCommand.equalsIgnoreCase("dissolve_ally")) { if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessage.FEATURE_ONLY_FOR_ALLIANCE_LEADER)); return; } player.getClan().dissolveAlly(player); } else if (actualCommand.equalsIgnoreCase("dissolve_clan")) { dissolveClan(player, player.getClanId()); } else if (actualCommand.equalsIgnoreCase("change_clan_leader")) { if (cmdParams.equals("")) return; changeClanLeader(player, cmdParams); } else if (actualCommand.equalsIgnoreCase("recover_clan")) { recoverClan(player, player.getClanId()); } else if (actualCommand.equalsIgnoreCase("increase_clan_level")) { if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessage.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } player.getClan().levelUpClan(player); } else if (actualCommand.equalsIgnoreCase("learn_clan_skills")) { showPledgeSkillList(player); } else if (command.startsWith("Subclass")) { int cmdChoice = Integer.parseInt(command.substring(9, 10).trim()); // Subclasses may not be changed while a skill is in use. if (player.isCastingNow() || player.isAllSkillsDisabled()) { player.sendPacket(new SystemMessage(1295)); return; } TextBuilder content = new TextBuilder(""); NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); Set subsAvailable; int paramOne = 0; int paramTwo = 0; try { int endIndex = command.length(); if (command.length() > 13) { endIndex = 13; paramTwo = Integer.parseInt(command.substring(13).trim()); } paramOne = Integer.parseInt(command.substring(11, endIndex).trim()); } catch (Exception NumberFormatException) { } switch (cmdChoice) { case 1: // Add Subclass - Initial // Avoid giving player an option to add a new sub class, if they have three already. if (player.getTotalSubClasses() == 3) { player.sendMessage("You can now only change one of your current sub classes."); return; } subsAvailable = getAvailableSubClasses(player); if (subsAvailable != null && !subsAvailable.isEmpty()) { content.append("Add Subclass:
Which sub class do you wish to add?
"); for (PlayerClass subClass : subsAvailable) content.append("" + formatClassForDisplay(subClass) + "
"); } else { player.sendMessage("There are no sub classes available at this time."); return; } break; case 2: // Change Class - Initial content.append("Change Subclass:
"); final int baseClassId = player.getBaseClass(); if (player.getSubClasses().isEmpty()) { content.append("You can't change sub classes when you don't have a sub class to begin with.
" + "Add subclass."); } else { content.append("Which class would you like to switch to?
"); if (baseClassId == player.getActiveClass()) content.append(CharTemplateTable.getClassNameById(baseClassId) + " (Base Class)

"); else content.append("" + CharTemplateTable.getClassNameById(baseClassId) + " " + "(Base Class)

"); for (Iterator subList = iterSubClasses(player); subList.hasNext();) { SubClass subClass = subList.next(); int subClassId = subClass.getClassId(); if (subClassId == player.getActiveClass()) content.append(CharTemplateTable.getClassNameById(subClassId) + "
"); else content.append("" + CharTemplateTable.getClassNameById(subClassId) + "
"); } } break; case 3: // Change/Cancel Subclass - Initial content.append("Change Subclass:
Which of the following sub classes would you like to change?
"); int classIndex = 1; for (Iterator subList = iterSubClasses(player); subList.hasNext();) { SubClass subClass = subList.next(); content.append("Sub-class " + classIndex + ""); content.append("" + CharTemplateTable.getClassNameById(subClass.getClassId()) + "
"); classIndex++; } content.append("
If you change a sub class, you'll start at level 40 after the 2nd class transfer."); break; case 4: // Add Subclass - Action (Subclass 4 x[x]) boolean allowAddition = true; /* * If the character is less than level 75 on any of their previously chosen * classes then disallow them to change to their most recently added sub-class choice. */ if (player.getLevel() < 75) { player.sendMessage("You may not add a new sub class before you are level 75 on your previous class."); allowAddition = false; } if (Olympiad.getInstance().isRegisteredInComp(player) || player.getOlympiadGameId() > 0) { player.sendPacket(new SystemMessage( SystemMessage.YOU_HAVE_ALREADY_BEEN_REGISTERED_IN_A_WAITING_LIST_OF_AN_EVENT)); return; } if (allowAddition) { if (!player.getSubClasses().isEmpty()) { for (Iterator subList = iterSubClasses(player); subList.hasNext();) { SubClass subClass = subList.next(); if (subClass.getLevel() < 75) { player.sendMessage("You may not add a new sub class before you are level 75 on your previous sub class."); allowAddition = false; break; } } } } /* * If quest checking is enabled, verify if the character has completed the Mimir's Elixir (Path to Subclass) * and Fate's Whisper (A Grade Weapon) quests by checking for instances of their unique reward items. * * If they both exist, remove both unique items and continue with adding the sub-class. */ if (!Config.ALT_GAME_SUBCLASS_WITHOUT_QUESTS) { QuestState qs = player.getQuestState("235_MimirsElixir"); if(qs == null || !qs.isCompleted()) { player.sendMessage("You must have completed the Mimir's Elixir quest to continue adding your sub class."); return; } qs = player.getQuestState("234_FatesWhisper"); if(qs == null || !qs.isCompleted()) { player.sendMessage("You must have completed the Fate's Whisper quest to continue adding your sub class."); return; } } ////////////////// \\\\\\\\\\\\\\\\\\ if (allowAddition) { String className = CharTemplateTable.getClassNameById(paramOne); if (!player.addSubClass(paramOne, player.getTotalSubClasses() + 1)) { player.sendMessage("The sub class could not be added."); return; } player.setActiveClass(player.getTotalSubClasses()); content.append("Add Subclass:
The sub class of " + className + " has been added."); player.sendPacket(new SystemMessage(1308)); // Transfer to new class. } else { html.setFile("data/html/villagemaster/SubClass_Fail.htm"); } break; case 5: // Change Class - Action /* * If the character is less than level 75 on any of their previously chosen * classes then disallow them to change to their most recently added sub-class choice. * * Note: paramOne = classIndex */ if (Olympiad.getInstance().isRegisteredInComp(player) || player.getOlympiadGameId() > 0) { player.sendPacket(new SystemMessage( SystemMessage.YOU_HAVE_ALREADY_BEEN_REGISTERED_IN_A_WAITING_LIST_OF_AN_EVENT)); return; } player.setActiveClass(paramOne); content.append("Change Subclass:
Your active sub class is now a " + CharTemplateTable.getClassNameById(player.getActiveClass()) + "."); player.sendPacket(new SystemMessage(1270)); // Transfer completed. break; case 6: // Change/Cancel Subclass - Choice content.append("Please choose a sub class to change to. If the one you are looking for is not here, " + "please seek out the appropriate master for that class.
" + "Warning! All classes and skills for this class will be removed.

"); subsAvailable = getAvailableSubClasses(player); if (!subsAvailable.isEmpty()) { for (PlayerClass subClass : subsAvailable) content.append("" + formatClassForDisplay(subClass) + "
"); } else { player.sendMessage("There are no sub classes available at this time."); return; } break; case 7: // Change Subclass - Action /* * Warning: the information about this subclass will be removed from the * subclass list even if false! */ if (player.modifySubClass(paramOne, paramTwo)) { player.setActiveClass(paramOne); content.append("Change Subclass:
Your sub class has been changed to " + CharTemplateTable.getClassNameById(paramTwo) + "."); player.sendPacket(new SystemMessage(1269)); // Subclass added. } else { /* * This isn't good! modifySubClass() removed subclass from memory * we must update _classIndex! Else IndexOutOfBoundsException can turn * up some place down the line along with other seemingly unrelated * problems. */ player.setActiveClass(0); // Also updates _classIndex plus switching _classid to baseclass. player.sendMessage("The sub class could not be added, you have been reverted to your base class."); return; } break; } content.append(""); // If the content is greater than for a basic blank page, // then assume no external HTML file was assigned. if (content.length() > 26) html.setHtml(content.toString()); player.sendPacket(html); } else { // this class dont know any other commands, let forward // the command to the parent class super.onBypassFeedback(player, command); } } public String getHtmlPath(int npcId, int val) { String pom = ""; if (val == 0) pom = "" + npcId; else pom = npcId + "-" + val; return "data/html/villagemaster/" + pom + ".htm"; } public void onAction(L2PcInstance player) { if (Config.DEBUG) _log.fine("Village Master activated"); player.setLastFolkNPC(this); super.onAction(player); } //Private stuff public void dissolveClan(L2PcInstance player, int clanId) { if (Config.DEBUG) _log.fine(player.getObjectId() + "(" + player.getName() + ") requested dissolve a clan from " + getObjectId() + "(" + getName() + ")"); if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessage.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } L2Clan clan = player.getClan(); if (clan.getAllyId() != 0) { player.sendPacket(new SystemMessage(SystemMessage.CANNOT_DISPERSE_THE_CLANS_IN_ALLY)); return; } if (clan.isAtWar() != 0) { player.sendPacket(new SystemMessage(SystemMessage.CANNOT_DISSOLVE_WHILE_IN_WAR)); return; } if (clan.getHasCastle() !=0 || clan.getHasHideout() != 0) { player.sendPacket(new SystemMessage(SystemMessage.CANNOT_DISSOLVE_WHILE_OWNING_CLAN_HALL_OR_CASTLE)); return; } for (Castle castle : CastleManager.getInstance().getCastles()) { if (SiegeManager.getInstance().checkIsRegistered(clan, castle.getCastleId())) { player.sendPacket(new SystemMessage(SystemMessage.CANNOT_DISSOLVE_CAUSE_CLAN_WILL_PARTICIPATE_IN_CASTLE_SIEGE)); return; } } if (SiegeManager.getInstance().checkIfInZone(player)) { player.sendPacket(new SystemMessage(SystemMessage.CANNOT_DISSOLVE_WHILE_IN_SIEGE)); return; } if (clan.getDissolvingExpiryTime() > System.currentTimeMillis()) { player.sendPacket(new SystemMessage(SystemMessage.DISSOLUTION_IN_PROGRESS)); return; } clan.setDissolvingExpiryTime(System.currentTimeMillis() + Config.ALT_CLAN_DISSOLVE_DAYS * 86400000); //24*60*60*1000 = 86400000 clan.updateClanInDB(); ClanTable.getInstance().scheduleRemoveClan(clan.getClanId()); // The clan leader should take the XP penalty of a full death. player.deathPenalty(false); } public void recoverClan(L2PcInstance player, int clanId) { if (Config.DEBUG) _log.fine(player.getObjectId() + "(" + player.getName() + ") requested recover a clan from " + getObjectId() + "(" + getName() + ")"); if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessage.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } L2Clan clan = player.getClan(); clan.setDissolvingExpiryTime(0); clan.updateClanInDB(); } public void changeClanLeader(L2PcInstance player, String target) { if (Config.DEBUG) _log.fine(player.getObjectId() + "(" + player.getName() + ") requested change a clan leader from " + getObjectId() + "(" + getName() + ")"); if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessage.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } if (player.getName().equalsIgnoreCase(target)) { return; } L2Clan clan = player.getClan(); L2ClanMember member = clan.getClanMember(target); if (member == null) { SystemMessage sm = new SystemMessage(SystemMessage.S1_DOES_NOT_EXIST); sm.addString(target); player.sendPacket(sm); sm = null; return; } if (!member.isOnline()) { player.sendPacket(new SystemMessage(SystemMessage.INVITED_USER_NOT_ONLINE)); return; } clan.setNewLeader(member); } public void createSubPledge(L2PcInstance player, String clanName, String leaderName, int pledgeType, int minClanLvl) { //if (Config.DEBUG) _log.fine(player.getObjectId() + "(" + player.getName() + ") requested sub clan creation from " + getObjectId() + "(" + getName() + ")"); if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessage.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } L2Clan clan = player.getClan(); if (clan.getLevel() < minClanLvl) { if (pledgeType == L2Clan.SUBUNIT_ACADEMY) { player.sendPacket(new SystemMessage(SystemMessage.YOU_DO_NOT_MEET_CRITERIA_IN_ORDER_TO_CREATE_A_CLAN_ACADEMY)); } else { player.sendPacket(new SystemMessage(SystemMessage.YOU_DO_NOT_MEET_CRITERIA_IN_ORDER_TO_CREATE_A_MILITARY_UNIT)); } return; } if (!Util.isAlphaNumeric(clanName) || 2 > clanName.length()) { player.sendPacket(new SystemMessage(SystemMessage.CLAN_NAME_INCORRECT)); return; } if (clanName.length() > 16) { player.sendPacket(new SystemMessage(SystemMessage.CLAN_NAME_TOO_LONG)); return; } for (L2Clan tempClan : ClanTable.getInstance().getClans()) { if (tempClan.getSubPledge(clanName) != null) { if (pledgeType == L2Clan.SUBUNIT_ACADEMY) { SystemMessage sm = new SystemMessage(SystemMessage.S1_ALREADY_EXISTS); sm.addString(clanName); player.sendPacket(sm); sm = null; } else { player.sendPacket(new SystemMessage(SystemMessage.ANOTHER_MILITARY_UNIT_IS_ALREADY_USING_THAT_NAME)); } return; } } if (pledgeType != L2Clan.SUBUNIT_ACADEMY) if (clan.getClanMember(leaderName) == null || clan.getClanMember(leaderName).getPledgeType() != 0) { if (pledgeType >= L2Clan.SUBUNIT_KNIGHT1) { player.sendPacket(new SystemMessage(SystemMessage.CAPTAIN_OF_ORDER_OF_KNIGHTS_CANNOT_BE_APPOINTED)); } else if (pledgeType >= L2Clan.SUBUNIT_ROYAL1) { player.sendPacket(new SystemMessage(SystemMessage.CAPTAIN_OF_ROYAL_GUARD_CANNOT_BE_APPOINTED)); } return; } if (clan.createSubPledge(pledgeType, leaderName, clanName) == null) { if (pledgeType == L2Clan.SUBUNIT_ACADEMY) { player.sendPacket(new SystemMessage(SystemMessage.CLAN_HAS_ALREADY_ESTABLISHED_A_CLAN_ACADEMY)); } else player.sendMessage("You can't create any more sub-units of this type"); return; } SystemMessage sm; if (pledgeType == L2Clan.SUBUNIT_ACADEMY) { sm = new SystemMessage(SystemMessage.THE_S1S_CLAN_ACADEMY_HAS_BEEN_CREATED); sm.addString(player.getClan().getName()); } else if (pledgeType >= L2Clan.SUBUNIT_KNIGHT1) { sm = new SystemMessage(SystemMessage.THE_KNIGHTS_OF_S1_HAVE_BEEN_CREATED); sm.addString(player.getClan().getName()); } else if (pledgeType >= L2Clan.SUBUNIT_ROYAL1) { sm = new SystemMessage(SystemMessage.THE_ROYAL_GUARD_OF_S1_HAVE_BEEN_CREATED); sm.addString(player.getClan().getName()); } else sm = new SystemMessage(SystemMessage.CLAN_CREATED); player.sendPacket(sm); } public void assignSubPledgeLeader(L2PcInstance player, String clanName, String leaderName) { if (Config.DEBUG) _log.fine(player.getObjectId() + "(" + player.getName() + ") requested to assign sub clan" + clanName + "leader " + "(" + leaderName + ")"); if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessage.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } if (leaderName.length() > 16) { player.sendPacket(new SystemMessage(SystemMessage.NAMING_CHARNAME_UP_TO_16CHARS)); return; } L2Clan clan = player.getClan(); SubPledge subPledge = player.getClan().getSubPledge(clanName); if (null == subPledge) { player.sendPacket(new SystemMessage(SystemMessage.CLAN_NAME_INCORRECT)); return; } if (subPledge.getId() == L2Clan.SUBUNIT_ACADEMY) { player.sendPacket(new SystemMessage(SystemMessage.CLAN_NAME_INCORRECT)); return; } if (null == clan.getClanMember(leaderName) || 0 != clan.getClanMember(leaderName).getPledgeType()) { if (subPledge.getId() >= L2Clan.SUBUNIT_KNIGHT1) { player.sendPacket(new SystemMessage(SystemMessage.CAPTAIN_OF_ORDER_OF_KNIGHTS_CANNOT_BE_APPOINTED)); } else if (subPledge.getId() >= L2Clan.SUBUNIT_ROYAL1) { player.sendPacket(new SystemMessage(SystemMessage.CAPTAIN_OF_ROYAL_GUARD_CANNOT_BE_APPOINTED)); } return; } subPledge.setLeaderName(leaderName); clan.updateSubPledgeInDB(subPledge.getId()); clan.broadcastClanStatus(); SystemMessage sm = new SystemMessage(SystemMessage.S1_HAS_BEEN_SELECTED_AS_CAPTAIN_OF_S2); sm.addString(leaderName); sm.addString(clanName); clan.broadcastToOnlineMembers(sm); sm = null; } private final Set getAvailableSubClasses(L2PcInstance player) { int charClassId = player.getClassId().ordinal(); if (charClassId >= 88) charClassId = player.getClassId().getParent().ordinal(); final PlayerRace npcRace = getVillageMasterRace(); final ClassType npcTeachType = getVillageMasterTeachType(); PlayerClass currClass = PlayerClass.values()[charClassId]; /** * If the race of your main class is Elf or Dark Elf, * you may not select each class as a subclass to the other class, * and you may not select Overlord and Warsmith class as a subclass. * * You may not select a similar class as the subclass. * The occupations classified as similar classes are as follows: * * Treasure Hunter, Plainswalker and Abyss Walker * Hawkeye, Silver Ranger and Phantom Ranger * Paladin, Dark Avenger, Temple Knight and Shillien Knight * Warlocks, Elemental Summoner and Phantom Summoner * Elder and Shillien Elder * Swordsinger and Bladedancer * Sorcerer, Spellsinger and Spellhowler * */ Set availSubs = currClass.getAvailableSubclasses(); if (availSubs != null) { for (PlayerClass availSub : availSubs) { for (Iterator subList = iterSubClasses(player); subList.hasNext();) { SubClass prevSubClass = subList.next(); if (availSub.ordinal() == prevSubClass.getClassId() || availSub.ordinal() == player.getBaseClass()) availSubs.remove(PlayerClass.values()[availSub.ordinal()]); } // Start L2Advantage Remove class/race check // if ((npcRace == PlayerRace.Human || npcRace == PlayerRace.LightElf)) //{ // If the master is human or light elf, ensure that fighter-type // masters only teach fighter classes, and priest-type masters // only teach priest classes etc. // if (!availSub.isOfType(npcTeachType)) availSubs.remove(availSub); // Remove any non-human or light elf classes. // else if (!availSub.isOfRace(PlayerRace.Human) // && !availSub.isOfRace(PlayerRace.LightElf)) availSubs.remove(availSub); //} //else //{ // If the master is not human and not light elf, // then remove any classes not of the same race as the master. // if ((npcRace != PlayerRace.Human && npcRace != PlayerRace.LightElf) // && !availSub.isOfRace(npcRace)) availSubs.remove(availSub); //} // End L2Advantage Remove class/race check } } return availSubs; } /** * this displays PledgeSkillList to the player. * @param player */ public void showPledgeSkillList(L2PcInstance player) { if (Config.DEBUG) _log.fine("PledgeSkillList activated on: "+getObjectId()); if(player.getClan() == null) return; L2PledgeSkillLearn[] skills = SkillTreeTable.getInstance().getAvailablePledgeSkills(player); AquireSkillList asl = new AquireSkillList(AquireSkillList.skillType.Clan); int counts = 0; for (L2PledgeSkillLearn s: skills) { int cost = s.getRepCost(); counts++; asl.addSkill(s.getId(), s.getLevel(), s.getLevel(), cost, 0); } if (counts == 0) { NpcHtmlMessage html = new NpcHtmlMessage(1); if (player.getClan().getLevel() < 8) { SystemMessage sm = new SystemMessage(607); sm.addNumber(player.getClan().getLevel()+1); player.sendPacket(sm); } else { TextBuilder sb = new TextBuilder(); sb.append(""); sb.append("You've learned all skills available for your Clan.
"); sb.append(""); html.setHtml(sb.toString()); player.sendPacket(html); } } else { player.sendPacket(asl); } player.sendPacket(new ActionFailed()); } private final String formatClassForDisplay(PlayerClass className) { String classNameStr = className.toString(); char[] charArray = classNameStr.toCharArray(); for (int i = 1; i < charArray.length; i++) if (Character.isUpperCase(charArray[i])) classNameStr = classNameStr.substring(0, i) + " " + classNameStr.substring(i); return classNameStr; } private final PlayerRace getVillageMasterRace() { String npcClass = getTemplate().getStatsSet().getString("jClass").toLowerCase(); if (npcClass.indexOf("human") > -1) return PlayerRace.Human; if (npcClass.indexOf("darkelf") > -1) return PlayerRace.DarkElf; if (npcClass.indexOf("elf") > -1) return PlayerRace.LightElf; if (npcClass.indexOf("orc") > -1) return PlayerRace.Orc; return PlayerRace.Dwarf; } private final ClassType getVillageMasterTeachType() { String npcClass = getTemplate().getStatsSet().getString("jClass"); if (npcClass.indexOf("sanctuary") > -1 || npcClass.indexOf("clergyman") > -1) return ClassType.Priest; if (npcClass.indexOf("mageguild") > -1 || npcClass.indexOf("patriarch") > -1) return ClassType.Mystic; return ClassType.Fighter; } private Iterator iterSubClasses(L2PcInstance player) { return player.getSubClasses().values().iterator(); } }