/* * 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.Iterator; import java.util.Set; import silentium.commons.utils.StringUtil; import silentium.gameserver.configs.ClansConfig; import silentium.gameserver.configs.PlayersConfig; import silentium.gameserver.data.html.StaticHtmPath; import silentium.gameserver.data.xml.CharTemplateData; import silentium.gameserver.data.xml.SkillTreeData; import silentium.gameserver.instancemanager.SiegeManager; import silentium.gameserver.model.L2Clan; import silentium.gameserver.model.L2Clan.SubPledge; import silentium.gameserver.model.L2ClanMember; import silentium.gameserver.model.L2PledgeSkillLearn; import silentium.gameserver.model.L2Skill; import silentium.gameserver.model.actor.L2Character; import silentium.gameserver.model.base.ClassId; import silentium.gameserver.model.base.PlayerClass; import silentium.gameserver.model.base.SubClass; import silentium.gameserver.model.quest.QuestState; import silentium.gameserver.network.SystemMessageId; import silentium.gameserver.network.serverpackets.AcquireSkillList; import silentium.gameserver.network.serverpackets.ActionFailed; import silentium.gameserver.network.serverpackets.MagicSkillUse; import silentium.gameserver.network.serverpackets.NpcHtmlMessage; import silentium.gameserver.network.serverpackets.SystemMessage; import silentium.gameserver.network.serverpackets.UserInfo; import silentium.gameserver.tables.ClanTable; import silentium.gameserver.tables.SkillTable; import silentium.gameserver.templates.chars.L2NpcTemplate; import silentium.gameserver.utils.Util; /** * The generic villagemaster. Some childs instances depends of it for race/classe restriction. */ public class L2VillageMasterInstance extends L2NpcInstance { public L2VillageMasterInstance(int objectId, L2NpcTemplate template) { super(objectId, template); } @Override public String getHtmlPath(int npcId, int val) { String pom = ""; if (val == 0) pom = "" + npcId; else pom = npcId + "-" + val; return StaticHtmPath.VillageMasterHtmPath + pom + ".htm"; } @Override public void onBypassFeedback(L2PcInstance player, String command) { String[] commandStr = command.split(" "); String actualCommand = commandStr[0]; 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.isEmpty()) return; ClanTable.getInstance().createClan(player, cmdParams); } else if (actualCommand.equalsIgnoreCase("create_academy")) { if (cmdParams.isEmpty()) return; createSubPledge(player, cmdParams, null, L2Clan.SUBUNIT_ACADEMY, 5); } else if (actualCommand.equalsIgnoreCase("rename_pledge")) { if (cmdParams.isEmpty() || cmdParams2.isEmpty()) return; renameSubPledge(player, Integer.valueOf(cmdParams), cmdParams2); } else if (actualCommand.equalsIgnoreCase("create_royal")) { if (cmdParams.isEmpty()) return; createSubPledge(player, cmdParams, cmdParams2, L2Clan.SUBUNIT_ROYAL1, 6); } else if (actualCommand.equalsIgnoreCase("create_knight")) { if (cmdParams.isEmpty()) return; createSubPledge(player, cmdParams, cmdParams2, L2Clan.SUBUNIT_KNIGHT1, 7); } else if (actualCommand.equalsIgnoreCase("assign_subpl_leader")) { if (cmdParams.isEmpty()) return; assignSubPledgeLeader(player, cmdParams, cmdParams2); } else if (actualCommand.equalsIgnoreCase("create_ally")) { if (cmdParams.isEmpty()) return; if (player.getClan() == null) player.sendPacket(SystemMessageId.ONLY_CLAN_LEADER_CREATE_ALLIANCE); else player.getClan().createAlly(player, cmdParams); } else if (actualCommand.equalsIgnoreCase("dissolve_ally")) { player.getClan().dissolveAlly(player); } else if (actualCommand.equalsIgnoreCase("dissolve_clan")) { dissolveClan(player, player.getClanId()); } else if (actualCommand.equalsIgnoreCase("change_clan_leader")) { if (cmdParams.isEmpty()) return; changeClanLeader(player, cmdParams); } else if (actualCommand.equalsIgnoreCase("recover_clan")) { recoverClan(player, player.getClanId()); } else if (actualCommand.equalsIgnoreCase("increase_clan_level")) { if (player.getClan().levelUpClan(player)) player.broadcastPacket(new MagicSkillUse(player, player, 5103, 1, 0, 0)); } else if (actualCommand.equalsIgnoreCase("learn_clan_skills")) { showPledgeSkillList(player); } else if (command.startsWith("Subclass")) { // Subclasses may not be changed while a skill is in use. if (player.isCastingNow() || player.isAllSkillsDisabled()) { player.sendPacket(SystemMessageId.SUBCLASS_NO_CHANGE_OR_CREATE_WHILE_SKILL_IN_USE); return; } NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); int cmdChoice = 0; int paramOne = 0; int paramTwo = 0; try { cmdChoice = Integer.parseInt(command.substring(9, 10).trim()); int endIndex = command.indexOf(' ', 11); if (endIndex == -1) endIndex = command.length(); paramOne = Integer.parseInt(command.substring(11, endIndex).trim()); if (command.length() > endIndex) paramTwo = Integer.parseInt(command.substring(endIndex).trim()); } catch (Exception NumberFormatException) { } switch (cmdChoice) { case 0: // Subclass change menu html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass.htm", player); break; case 1: // Add Subclass - Initial // Subclasses may not be added while a summon is active. if (player.getPet() != null) { player.sendPacket(SystemMessageId.CANT_SUBCLASS_WITH_SUMMONED_SERVITOR); return; } // Subclasses may not be added while you are over your weight limit. if (!player.isInventoryUnder80(true) || player.getWeightPenalty() > 0) { player.sendPacket(SystemMessageId.NOT_SUBCLASS_WHILE_OVERWEIGHT); return; } // Avoid giving player an option to add a new sub class, if they have three already. if (player.getTotalSubClasses() >= 3) { html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_Fail.htm", player); break; } html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_Add.htm", player); final StringBuilder content1 = StringUtil.startAppend(200); Set<PlayerClass> subsAvailable = getAvailableSubClasses(player); if (subsAvailable != null && !subsAvailable.isEmpty()) { for (PlayerClass subClass : subsAvailable) StringUtil.append(content1, "<a action=\"bypass -h npc_%objectId%_Subclass 4 ", String.valueOf(subClass.ordinal()), "\" msg=\"1268;", formatClassForDisplay(subClass), "\">", formatClassForDisplay(subClass), "</a><br>"); } else { player.sendMessage("There are no sub classes available at this time."); return; } html.replace("%list%", content1.toString()); break; case 2: // Change Class - Initial // Subclasses may not be changed while a summon is active. if (player.getPet() != null) { player.sendPacket(SystemMessageId.CANT_SUBCLASS_WITH_SUMMONED_SERVITOR); return; } // Subclasses may not be changed while a you are over your weight limit. if (!player.isInventoryUnder80(true) || player.getWeightPenalty() > 0) { player.sendPacket(SystemMessageId.NOT_SUBCLASS_WHILE_OVERWEIGHT); return; } if (player.getSubClasses().isEmpty()) html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_ChangeNo.htm", player); else { final StringBuilder content2 = StringUtil.startAppend(200); if (checkVillageMaster(player.getBaseClass())) StringUtil.append(content2, "<a action=\"bypass -h npc_%objectId%_Subclass 5 0\">", CharTemplateData.getInstance().getClassNameById(player.getBaseClass()), "</a><br>"); for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();) { SubClass subClass = subList.next(); if (checkVillageMaster(subClass.getClassDefinition())) StringUtil.append(content2, "<a action=\"bypass -h npc_%objectId%_Subclass 5 ", String.valueOf(subClass.getClassIndex()), "\">", formatClassForDisplay(subClass.getClassDefinition()), "</a><br>"); } if (content2.length() > 0) { html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_Change.htm", player); html.replace("%list%", content2.toString()); } else html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_ChangeNotFound.htm", player); } break; case 3: // Change/Cancel Subclass - Initial if (player.getSubClasses() == null || player.getSubClasses().isEmpty()) { html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_ModifyEmpty.htm", player); break; } // custom value if (player.getTotalSubClasses() > 3) { html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_ModifyCustom.htm", player); final StringBuilder content3 = StringUtil.startAppend(200); int classIndex = 1; for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();) { SubClass subClass = subList.next(); StringUtil.append(content3, "Sub-class ", String.valueOf(classIndex++), "<br>", "<a action=\"bypass -h npc_%objectId%_Subclass 6 ", String.valueOf(subClass.getClassIndex()), "\">", CharTemplateData.getInstance().getClassNameById(subClass.getClassId()), "</a><br>"); } html.replace("%list%", content3.toString()); } else { // retail html contain only 3 subclasses html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_Modify.htm", player); if (player.getSubClasses().containsKey(1)) html.replace("%sub1%", CharTemplateData.getInstance().getClassNameById(player.getSubClasses().get(1).getClassId())); else html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 1\">%sub1%</a><br>", ""); if (player.getSubClasses().containsKey(2)) html.replace("%sub2%", CharTemplateData.getInstance().getClassNameById(player.getSubClasses().get(2).getClassId())); else html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 2\">%sub2%</a><br>", ""); if (player.getSubClasses().containsKey(3)) html.replace("%sub3%", CharTemplateData.getInstance().getClassNameById(player.getSubClasses().get(3).getClassId())); else html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 3\">%sub3%</a><br>", ""); } break; case 4: // Add Subclass - Action (Subclass 4 x[x]) if (!player.getFloodProtectors().getSubclass().tryPerformAction("addSubclass")) return; boolean allowAddition = true; if (player.getTotalSubClasses() >= 3) allowAddition = false; if (player.getLevel() < 75) allowAddition = false; if (allowAddition) { if (!player.getSubClasses().isEmpty()) { for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();) { SubClass subClass = subList.next(); if (subClass.getLevel() < 75) { 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 (allowAddition && !PlayersConfig.ALT_GAME_SUBCLASS_WITHOUT_QUESTS) allowAddition = checkQuests(player); if (allowAddition && isValidNewSubClass(player, paramOne)) { if (!player.addSubClass(paramOne, player.getTotalSubClasses() + 1)) return; player.setActiveClass(player.getTotalSubClasses()); html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_AddOk.htm", player); player.sendPacket(SystemMessageId.ADD_NEW_SUBCLASS); // Subclass added. } else html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_Fail.htm", player); break; case 5: // Change Class - Action if (!player.getFloodProtectors().getSubclass().tryPerformAction("changeSubclass")) return; if (player.getClassIndex() == paramOne) { html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_Current.htm", player); break; } if (paramOne == 0) { if (!checkVillageMaster(player.getBaseClass())) return; } else { try { if (!checkVillageMaster(player.getSubClasses().get(paramOne).getClassDefinition())) return; } catch (NullPointerException e) { return; } } player.setActiveClass(paramOne); player.sendPacket(SystemMessageId.SUBCLASS_TRANSFER_COMPLETED); // Transfer completed. return; case 6: // Change/Cancel Subclass - Choice // validity check if (paramOne < 1 || paramOne > 3) return; subsAvailable = getAvailableSubClasses(player); // another validity check if (subsAvailable == null || subsAvailable.isEmpty()) { player.sendMessage("There are no sub classes available at this time."); return; } final StringBuilder content6 = StringUtil.startAppend(200); for (PlayerClass subClass : subsAvailable) StringUtil.append(content6, "<a action=\"bypass -h npc_%objectId%_Subclass 7 ", String.valueOf(paramOne), " ", String.valueOf(subClass.ordinal()), "\" msg=\"1445;", "\">", formatClassForDisplay(subClass), "</a><br>"); switch (paramOne) { case 1: html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_ModifyChoice1.htm", player); break; case 2: html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_ModifyChoice2.htm", player); break; case 3: html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_ModifyChoice3.htm", player); break; default: html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_ModifyChoice.htm", player); } html.replace("%list%", content6.toString()); break; case 7: // Change Subclass - Action if (!player.getFloodProtectors().getSubclass().tryPerformAction("changeSubclass")) return; if (!isValidNewSubClass(player, paramTwo)) return; if (player.modifySubClass(paramOne, paramTwo)) { player.abortCast(); player.stopAllEffectsExceptThoseThatLastThroughDeath(); // all effects from old subclass stopped! player.stopCubics(); player.setActiveClass(paramOne); html.setFile(StaticHtmPath.VillageMasterHtmPath + "SubClass_ModifyOk.htm", player); player.sendPacket(SystemMessageId.ADD_NEW_SUBCLASS); // Subclass added. } else { 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; } html.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(html); } else { // this class dont know any other commands, let forward the command to the parent class super.onBypassFeedback(player, command); } } protected boolean checkQuests(L2PcInstance player) { // Noble players can add subbclasses without quests if (player.isNoble()) return true; QuestState qs = player.getQuestState("Q234_FatesWhisper"); if (qs == null || !qs.isCompleted()) return false; qs = player.getQuestState("Q235_MimirsElixir"); if (qs == null || !qs.isCompleted()) return false; return true; } private final Set<PlayerClass> getAvailableSubClasses(L2PcInstance player) { // get player base class final int currentBaseId = player.getBaseClass(); final ClassId baseCID = ClassId.values()[currentBaseId]; // we need 2nd occupation ID final int baseClassId; if (baseCID.level() > 2) baseClassId = baseCID.getParent().ordinal(); else baseClassId = currentBaseId; /** * 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<PlayerClass> availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player); if (availSubs != null && !availSubs.isEmpty()) { for (Iterator<PlayerClass> availSub = availSubs.iterator(); availSub.hasNext();) { PlayerClass pclass = availSub.next(); // check for the village master if (!checkVillageMaster(pclass)) { availSub.remove(); continue; } // scan for already used subclasses int availClassId = pclass.ordinal(); ClassId cid = ClassId.values()[availClassId]; for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();) { SubClass prevSubClass = subList.next(); ClassId subClassId = ClassId.values()[prevSubClass.getClassId()]; if (subClassId.equalsOrChildOf(cid)) { availSub.remove(); break; } } } } return availSubs; } /* * Check new subclass classId for validity (villagemaster race/type is not contains in previous subclasses, but in allowed subclasses) Base * class not added into allowed subclasses. */ private final boolean isValidNewSubClass(L2PcInstance player, int classId) { if (!checkVillageMaster(classId)) return false; final ClassId cid = ClassId.values()[classId]; for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();) { SubClass sub = subList.next(); ClassId subClassId = ClassId.values()[sub.getClassId()]; if (subClassId.equalsOrChildOf(cid)) return false; } // get player base class final int currentBaseId = player.getBaseClass(); final ClassId baseCID = ClassId.values()[currentBaseId]; // we need 2nd occupation ID final int baseClassId; if (baseCID.level() > 2) baseClassId = baseCID.getParent().ordinal(); else baseClassId = currentBaseId; Set<PlayerClass> availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player); if (availSubs == null || availSubs.isEmpty()) return false; boolean found = false; for (PlayerClass pclass : availSubs) { if (pclass.ordinal() == classId) { found = true; break; } } return found; } protected boolean checkVillageMasterRace(PlayerClass pclass) { return true; } protected boolean checkVillageMasterTeachType(PlayerClass pclass) { return true; } /* * Returns true if this classId allowed for master */ public final boolean checkVillageMaster(int classId) { return checkVillageMaster(PlayerClass.values()[classId]); } /* * Returns true if this PlayerClass is allowed for master */ public final boolean checkVillageMaster(PlayerClass pclass) { return checkVillageMasterRace(pclass) && checkVillageMasterTeachType(pclass); } private static 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 static final Iterator<SubClass> iterSubClasses(L2PcInstance player) { return player.getSubClasses().values().iterator(); } private static final void dissolveClan(L2PcInstance player, int clanId) { if (!player.isClanLeader()) { player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT); return; } final L2Clan clan = player.getClan(); if (clan.getAllyId() != 0) { player.sendPacket(SystemMessageId.CANNOT_DISPERSE_THE_CLANS_IN_ALLY); return; } if (clan.isAtWar()) { player.sendPacket(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_WAR); return; } if (clan.hasCastle() || clan.hasHideout()) { player.sendPacket(SystemMessageId.CANNOT_DISSOLVE_WHILE_OWNING_CLAN_HALL_OR_CASTLE); return; } if (SiegeManager.checkIsRegistered(clan)) { player.sendPacket(SystemMessageId.CANNOT_DISSOLVE_CAUSE_CLAN_WILL_PARTICIPATE_IN_CASTLE_SIEGE); return; } if (player.isInsideZone(L2Character.ZONE_SIEGE)) { player.sendPacket(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE); return; } if (clan.getDissolvingExpiryTime() > System.currentTimeMillis()) { player.sendPacket(SystemMessageId.DISSOLUTION_IN_PROGRESS); return; } if (ClansConfig.ALT_CLAN_DISSOLVE_DAYS > 0) { clan.setDissolvingExpiryTime(System.currentTimeMillis() + ClansConfig.ALT_CLAN_DISSOLVE_DAYS * 86400000L); // 24*60*60*1000 // = // 86400000 clan.updateClanInDB(); ClanTable.getInstance().scheduleRemoveClan(clan.getClanId()); } else ClanTable.getInstance().destroyClan(clan.getClanId()); // The clan leader should take the XP penalty of a full death. player.deathPenalty(false); } private static final void recoverClan(L2PcInstance player, int clanId) { if (!player.isClanLeader()) { player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT); return; } final L2Clan clan = player.getClan(); clan.setDissolvingExpiryTime(0); clan.updateClanInDB(); } private static final void changeClanLeader(L2PcInstance player, String target) { if (!player.isClanLeader()) { player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT); return; } if (player.getName().equalsIgnoreCase(target)) return; // little exploit fix if (player.isFlying()) { player.sendMessage("You must dismount the wyvern to change the clan leader."); return; } final L2Clan clan = player.getClan(); final L2ClanMember member = clan.getClanMember(target); if (member == null) { player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_DOES_NOT_EXIST).addString(target)); return; } if (!member.isOnline()) { player.sendPacket(SystemMessageId.INVITED_USER_NOT_ONLINE); return; } clan.setNewLeader(member); } private static final void createSubPledge(L2PcInstance player, String clanName, String leaderName, int pledgeType, int minClanLvl) { if (!player.isClanLeader()) { player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT); return; } final L2Clan clan = player.getClan(); if (clan.getLevel() < minClanLvl) { if (pledgeType == L2Clan.SUBUNIT_ACADEMY) player.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_CRITERIA_IN_ORDER_TO_CREATE_A_CLAN_ACADEMY); else player.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_CRITERIA_IN_ORDER_TO_CREATE_A_MILITARY_UNIT); return; } if (!Util.isAlphaNumeric(clanName)) { player.sendPacket(SystemMessageId.CLAN_NAME_INVALID); return; } if (clanName.length() < 2 || clanName.length() > 16) { player.sendPacket(SystemMessageId.CLAN_NAME_LENGTH_INCORRECT); return; } for (L2Clan tempClan : ClanTable.getInstance().getClans()) { if (tempClan.getSubPledge(clanName) != null) { if (pledgeType == L2Clan.SUBUNIT_ACADEMY) player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_ALREADY_EXISTS).addString(clanName)); else player.sendPacket(SystemMessageId.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(SystemMessageId.CAPTAIN_OF_ORDER_OF_KNIGHTS_CANNOT_BE_APPOINTED); else if (pledgeType >= L2Clan.SUBUNIT_ROYAL1) player.sendPacket(SystemMessageId.CAPTAIN_OF_ROYAL_GUARD_CANNOT_BE_APPOINTED); return; } } final int leaderId = pledgeType != L2Clan.SUBUNIT_ACADEMY ? clan.getClanMember(leaderName).getObjectId() : 0; if (clan.createSubPledge(player, pledgeType, leaderId, clanName) == null) return; SystemMessage sm; if (pledgeType == L2Clan.SUBUNIT_ACADEMY) { sm = SystemMessage.getSystemMessage(SystemMessageId.THE_S1S_CLAN_ACADEMY_HAS_BEEN_CREATED); sm.addString(player.getClan().getName()); } else if (pledgeType >= L2Clan.SUBUNIT_KNIGHT1) { sm = SystemMessage.getSystemMessage(SystemMessageId.THE_KNIGHTS_OF_S1_HAVE_BEEN_CREATED); sm.addString(player.getClan().getName()); } else if (pledgeType >= L2Clan.SUBUNIT_ROYAL1) { sm = SystemMessage.getSystemMessage(SystemMessageId.THE_ROYAL_GUARD_OF_S1_HAVE_BEEN_CREATED); sm.addString(player.getClan().getName()); } else sm = SystemMessage.getSystemMessage(SystemMessageId.CLAN_CREATED); player.sendPacket(sm); if (pledgeType != L2Clan.SUBUNIT_ACADEMY) { final L2ClanMember leaderSubPledge = clan.getClanMember(leaderName); final L2PcInstance leaderPlayer = leaderSubPledge.getPlayerInstance(); if (leaderPlayer != null) { leaderPlayer.setPledgeClass(leaderSubPledge.calculatePledgeClass(leaderPlayer)); leaderPlayer.sendPacket(new UserInfo(leaderPlayer)); } } } private static final void renameSubPledge(L2PcInstance player, int pledgeType, String pledgeName) { if (!player.isClanLeader()) { player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT); return; } final L2Clan clan = player.getClan(); final SubPledge subPledge = player.getClan().getSubPledge(pledgeType); if (subPledge == null) { player.sendMessage("Pledge doesn't exist."); return; } if (!Util.isAlphaNumeric(pledgeName)) { player.sendPacket(SystemMessageId.CLAN_NAME_INVALID); return; } if (pledgeName.length() < 2 || pledgeName.length() > 16) { player.sendPacket(SystemMessageId.CLAN_NAME_LENGTH_INCORRECT); return; } subPledge.setName(pledgeName); clan.updateSubPledgeInDB(subPledge.getId()); clan.broadcastClanStatus(); player.sendMessage("Pledge name have been changed to: " + pledgeName); } private static final void assignSubPledgeLeader(L2PcInstance player, String clanName, String leaderName) { if (!player.isClanLeader()) { player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT); return; } if (leaderName.length() > 16) { player.sendPacket(SystemMessageId.NAMING_CHARNAME_UP_TO_16CHARS); return; } if (player.getName().equals(leaderName)) { player.sendPacket(SystemMessageId.CAPTAIN_OF_ROYAL_GUARD_CANNOT_BE_APPOINTED); return; } final L2Clan clan = player.getClan(); final SubPledge subPledge = player.getClan().getSubPledge(clanName); if (null == subPledge || subPledge.getId() == L2Clan.SUBUNIT_ACADEMY) { player.sendPacket(SystemMessageId.CLAN_NAME_INVALID); return; } if (clan.getClanMember(leaderName) == null || (clan.getClanMember(leaderName).getPledgeType() != 0)) { if (subPledge.getId() >= L2Clan.SUBUNIT_KNIGHT1) player.sendPacket(SystemMessageId.CAPTAIN_OF_ORDER_OF_KNIGHTS_CANNOT_BE_APPOINTED); else if (subPledge.getId() >= L2Clan.SUBUNIT_ROYAL1) player.sendPacket(SystemMessageId.CAPTAIN_OF_ROYAL_GUARD_CANNOT_BE_APPOINTED); return; } subPledge.setLeaderId(clan.getClanMember(leaderName).getObjectId()); clan.updateSubPledgeInDB(subPledge.getId()); final L2ClanMember leaderSubPledge = clan.getClanMember(leaderName); final L2PcInstance leaderPlayer = leaderSubPledge.getPlayerInstance(); if (leaderPlayer != null) { leaderPlayer.setPledgeClass(leaderSubPledge.calculatePledgeClass(leaderPlayer)); leaderPlayer.sendPacket(new UserInfo(leaderPlayer)); } clan.broadcastClanStatus(); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_BEEN_SELECTED_AS_CAPTAIN_OF_S2); sm.addString(leaderName); sm.addString(clanName); clan.broadcastToOnlineMembers(sm); } /** * this displays PledgeSkillList to the player. * * @param player */ public static final void showPledgeSkillList(L2PcInstance player) { if (player.getClan() == null || !player.isClanLeader()) { NpcHtmlMessage html = new NpcHtmlMessage(1); html.setFile(StaticHtmPath.VillageMasterHtmPath + "NotClanLeader.htm", player); player.sendPacket(html); player.sendPacket(ActionFailed.STATIC_PACKET); return; } AcquireSkillList asl = new AcquireSkillList(AcquireSkillList.SkillType.Clan); boolean empty = true; for (L2PledgeSkillLearn psl : SkillTreeData.getInstance().getAvailablePledgeSkills(player)) { L2Skill sk = SkillTable.getInstance().getInfo(psl.getId(), psl.getLevel()); if (sk == null) continue; asl.addSkill(psl.getId(), psl.getLevel(), psl.getLevel(), psl.getRepCost(), 0); empty = false; } if (empty) { if (player.getClan().getLevel() < 8) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1); sm.addNumber(Math.max(player.getClan().getLevel() + 1, 5)); player.sendPacket(sm); } else { NpcHtmlMessage html = new NpcHtmlMessage(1); html.setFile(StaticHtmPath.VillageMasterHtmPath + "NoMoreSkills.htm", player); player.sendPacket(html); } } else player.sendPacket(asl); player.sendPacket(ActionFailed.STATIC_PACKET); } }