private static final void showTutorialHtml(L2PcInstance player) { final ClassId currentClassId = player.getClassId(); if (getMinLevel(currentClassId.level()) > player.getLevel() && !Config.ALLOW_ENTIRE_TREE) return; String msg = HtmCache.getInstance() .getHtm(player.getHtmlPrefix(), "data/html/classmaster/tutorialtemplate.htm"); msg = msg.replaceAll( "%name%", CharTemplateTable.getInstance().getClassNameById(currentClassId.getId())); final StringBuilder menu = new StringBuilder(100); for (ClassId cid : ClassId.values()) { if (cid == ClassId.inspector && player.getTotalSubClasses() < 2) continue; if (validateClassId(currentClassId, cid)) { StringUtil.append( menu, "<a action=\"link CO", String.valueOf(cid.getId()), "\">", CharTemplateTable.getInstance().getClassNameById(cid.getId()), "</a><br>"); } } msg = msg.replaceAll("%menu%", menu.toString()); msg = msg.replace("%req_items%", getRequiredItems(currentClassId.level() + 1)); player.sendPacket(new TutorialShowHtml(msg)); }
public static void showFishSkillList(L2PcInstance player) { final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableFishingSkills(player); final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.FISHING); int count = 0; for (L2SkillLearn s : skills) { final Skill sk = SkillData.getInstance().getSkill(s.getSkillId(), s.getSkillLevel()); if (sk == null) { continue; } count++; asl.addSkill(s.getSkillId(), s.getSkillLevel(), s.getSkillLevel(), s.getLevelUpSp(), 1); } if (count == 0) { final int minlLevel = SkillTreesData.getInstance() .getMinLevelForNewSkill(player, SkillTreesData.getInstance().getFishingSkillTree()); if (minlLevel > 0) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1); sm.addInt(minlLevel); player.sendPacket(sm); } else { player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN); } } else { player.sendPacket(asl); } }
/** * Return True if a siege is in progress and the L2Character attacker isn't a Defender. * * @param attacker The L2Character that the L2SiegeGuardInstance try to attack */ @Override public boolean isAutoAttackable(L2Character attacker) { // Attackable during siege by all except defenders if (!(attacker instanceof L2Playable)) { return false; } L2PcInstance player = attacker.getActingPlayer(); // Check if siege is in progress if (((_fort != null) && _fort.getZone().isActive()) || ((_castle != null) && _castle.getZone().isActive()) || ((_hall != null) && _hall.getSiegeZone().isActive())) { int activeSiegeId = (_fort != null ? _fort.getResidenceId() : (_castle != null ? _castle.getResidenceId() : (_hall != null ? _hall.getId() : 0))); // Check if player is an enemy of this defender npc if ((player != null) && (((player.getSiegeState() == 2) && !player.isRegisteredOnThisSiegeField(activeSiegeId)) || ((player.getSiegeState() == 1) && !TerritoryWarManager.getInstance().isAllyField(player, activeSiegeId)) || (player.getSiegeState() == 0))) { return true; } } return false; }
@Override public void addDamageHate(L2Character attacker, int damage, int aggro) { if (attacker == null) { return; } if (!(attacker instanceof L2DefenderInstance)) { if ((damage == 0) && (aggro <= 1) && (attacker instanceof L2Playable)) { L2PcInstance player = attacker.getActingPlayer(); // Check if siege is in progress if (((_fort != null) && _fort.getZone().isActive()) || ((_castle != null) && _castle.getZone().isActive()) || ((_hall != null) && _hall.getSiegeZone().isActive())) { int activeSiegeId = (_fort != null ? _fort.getResidenceId() : (_castle != null ? _castle.getResidenceId() : (_hall != null ? _hall.getId() : 0))); if ((player != null) && (((player.getSiegeState() == 2) && player.isRegisteredOnThisSiegeField(activeSiegeId)) || ((player.getSiegeState() == 1) && TerritoryWarManager.getInstance().isAllyField(player, activeSiegeId)))) { return; } } } super.addDamageHate(attacker, damage, aggro); } }
public static final void showQuestionMark(L2PcInstance player) { if (!Config.ALTERNATE_CLASS_MASTER) return; final ClassId classId = player.getClassId(); if (getMinLevel(classId.level()) > player.getLevel()) return; if (!Config.CLASS_MASTER_SETTINGS.isAllowed(classId.level() + 1)) return; player.sendPacket(new TutorialShowQuestionMark(1001)); }
@Override public void onBypassFeedback(L2PcInstance player, String command) { if (command.startsWith("SkillList")) { player.setSkillLearningClassId(player.getClassId()); showSkillList(player, this, player.getClassId()); } else if (command.startsWith("EnchantSkillList")) showEnchantSkillList(player, this, player.getClassId()); else if (command.startsWith("GiveBlessing")) giveBlessingSupport(player); else super.onBypassFeedback(player, command); }
private static void doTeleport(L2PcInstance player, int val) { L2TeleportLocation list = TeleportLocationTable.getInstance().getTemplate(val); if (list != null) { if (player.isAlikeDead()) return; player.teleToLocation(list.getLocX(), list.getLocY(), list.getLocZ(), 20); } else _log.warning("No teleport destination with id:" + val); player.sendPacket(ActionFailed.STATIC_PACKET); }
private static final void recoverClan(L2PcInstance player, int clanId) { if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } final L2Clan clan = player.getClan(); clan.setDissolvingExpiryTime(0); clan.updateClanInDB(); }
@Override public void onAction(L2PcInstance player, boolean interact) { if (player == null || !canTarget(player)) return; // Check if the L2PcInstance already target the L2NpcInstance if (this != player.getTarget()) { // Set the target of the L2PcInstance player player.setTarget(this); // Send a Server->Client packet MyTargetSelected to the L2PcInstance player MyTargetSelected my = new MyTargetSelected(getObjectId(), player.getLevel() - getLevel()); player.sendPacket(my); // Send a Server->Client packet StatusUpdate of the L2NpcInstance to the L2PcInstance to // update its HP bar StatusUpdate su = new StatusUpdate(this); su.addAttribute(StatusUpdate.CUR_HP, (int) getStatus().getCurrentHp()); su.addAttribute(StatusUpdate.MAX_HP, getMaxHp()); player.sendPacket(su); // Send a Server->Client packet ValidateLocation to correct the L2NpcInstance position and // heading on the client player.sendPacket(new ValidateLocation(this)); } else if (interact) { if (isAutoAttackable(player) && Math.abs(player.getZ() - getZ()) < 100) player.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, this); else { // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client // wait another packet player.sendPacket(ActionFailed.STATIC_PACKET); } } }
protected int validateCondition(L2PcInstance player) { if (player.isGM()) return COND_OWNER; if (getCastle() != null && getCastle().getCastleId() > 0) { if (player.getClan() != null) { if (getCastle().getZone().isActive()) return COND_BUSY_BECAUSE_OF_SIEGE; // Busy because of siege else if (getCastle().getOwnerId() == player.getClanId()) // Clan owns castle return COND_OWNER; } } return COND_ALL_FALSE; }
protected boolean checkQuests(L2PcInstance player) { // Noble players can add subbclasses without quests if (player.isNoble()) return true; QuestState qs = player.getQuestState("234_FatesWhisper"); if (qs == null || !qs.isCompleted()) return false; qs = player.getQuestState("235_MimirsElixir"); if (qs == null || !qs.isCompleted()) return false; return true; }
public static final void onTutorialLink(L2PcInstance player, String request) { if (!Config.ALTERNATE_CLASS_MASTER || request == null || !request.startsWith("CO")) return; if (!player.getFloodProtectors().getServerBypass().tryPerformAction("changeclass")) return; try { int val = Integer.parseInt(request.substring(2)); checkAndChangeClass(player, val); } catch (NumberFormatException e) { } player.sendPacket(new TutorialCloseHtml()); }
private static final void renameSubPledge( L2PcInstance player, int pledgeType, String pledgeName) { if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(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 don't exists."); return; } if (!Util.isAlphaNumeric(pledgeName) || 2 > pledgeName.length()) { player.sendPacket(new SystemMessage(SystemMessageId.CLAN_NAME_INCORRECT)); return; } if (pledgeName.length() > 16) { player.sendPacket(new SystemMessage(SystemMessageId.CLAN_NAME_TOO_LONG)); return; } subPledge.setName(pledgeName); clan.updateSubPledgeInDB(subPledge.getId()); clan.broadcastClanStatus(); player.sendMessage("Pledge name changed."); }
private static final void changeClanLeader(L2PcInstance player, String target) { if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } if (player.getName().equalsIgnoreCase(target)) return; /* * Until proper clan leader change support is done, this is a little * exploit fix (leader, while fliying wyvern changes clan leader and the new leader * can ride the wyvern too) * DrHouse */ if (player.isFlying()) { player.sendMessage("Please, stop flying"); return; } final L2Clan clan = player.getClan(); final L2ClanMember member = clan.getClanMember(target); if (member == null) { SystemMessage sm = new SystemMessage(SystemMessageId.S1_DOES_NOT_EXIST); sm.addString(target); player.sendPacket(sm); sm = null; return; } if (!member.isOnline()) { player.sendPacket(new SystemMessage(SystemMessageId.INVITED_USER_NOT_ONLINE)); return; } clan.setNewLeader(member); }
/* * Check new subclass classId for validity * (villagemaster race/type, is not contains in previous subclasses, * is contains 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 (Iterator<PlayerClass> availSub = availSubs.iterator(); availSub.hasNext(); ) { PlayerClass pclass = availSub.next(); if (pclass.ordinal() == classId) { found = true; break; } } return found; }
/* * Returns list of available subclasses * Base class and already used subclasses removed */ 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. * * <p>If the race of your main class is Kamael, you may not subclass any other race If the race * of your main class is NOT Kamael, you may not subclass any Kamael class * * <p>You may not select Overlord and Warsmith class as a subclass. * * <p>You may not select a similar class as the subclass. The occupations classified as similar * classes are as follows: * * <p>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 * * <p>Also, Kamael have a special, hidden 4 subclass, the inspector, which can only be taken if * you have already completed the other two Kamael subclasses */ 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; }
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) { NpcHtmlMessage npcReply = new NpcHtmlMessage(getObjectId()); npcReply.setHtml( "<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>"); npcReply.replace("%objectId%", getObjectId()); player.sendPacket(npcReply); return; } doCast(FrequentSkill.BLESSING_OF_PROTECTION.getSkill()); }
/** * Custom onAction behaviour. Note that super() is not called because guards need extra check to * see if a player should interact or ATTACK them when clicked. */ @Override public void onAction(L2PcInstance player, boolean interact) { if (!canTarget(player)) { player.sendPacket(ActionFailed.STATIC_PACKET); return; } // Check if the L2PcInstance already target the L2NpcInstance if (this != player.getTarget()) { if (Config.DEBUG) { _log.info("new target selected:" + getObjectId()); } // Set the target of the L2PcInstance player player.setTarget(this); } else if (interact) { if (isAutoAttackable(player) && !isAlikeDead()) { if (Math.abs(player.getZ() - getZ()) < 600) // this max heigth difference might need some tweaking { player.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, this); } } if (!isAutoAttackable(player)) { if (!canInteract(player)) { // Notify the L2PcInstance AI with AI_INTENTION_INTERACT player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this); } } } // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait // another packet player.sendPacket(ActionFailed.STATIC_PACKET); }
@Override public void showChatWindow(L2PcInstance player, int val) { String filename = null; if (isInsideRadius(-79884, 86529, 50, true) || isInsideRadius(-78858, 111358, 50, true) || isInsideRadius(-76973, 87136, 50, true) || isInsideRadius(-75850, 111968, 50, true)) { if (val == 0) filename = "data/html/observation/" + getNpcId() + "-Oracle.htm"; else filename = "data/html/observation/" + getNpcId() + "-Oracle-" + val + ".htm"; } else { if (val == 0) filename = "data/html/observation/" + getNpcId() + ".htm"; else filename = "data/html/observation/" + getNpcId() + "-" + val + ".htm"; } NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); html.setFile(player.getHtmlPrefix(), filename); html.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(html); }
@Override public void showChatWindow(L2PcInstance player, int val) { player.sendPacket(ActionFailed.STATIC_PACKET); String filename = "data/html/castlemagician/magician-no.htm"; int condition = validateCondition(player); if (condition > COND_ALL_FALSE) { if (condition == COND_BUSY_BECAUSE_OF_SIEGE) filename = "data/html/castlemagician/magician-busy.htm"; // Busy because of siege else if (condition == COND_OWNER) // Clan owns castle { if (val == 0) filename = "data/html/castlemagician/magician.htm"; else filename = "data/html/castlemagician/magician-" + val + ".htm"; } } NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); html.setFile(player.getHtmlPrefix(), filename); html.replace("%objectId%", String.valueOf(getObjectId())); player.sendPacket(html); }
@Override public boolean doDie(L2Character killer) { if (!super.doDie(killer)) return false; L2PcInstance player = null; if (killer.isPlayer) player = (L2PcInstance) killer; else if (killer.isSummon) player = ((L2Summon) killer).getOwner(); if (player != null) { SystemMessage msg = new SystemMessage(SystemMessageId.RAID_WAS_SUCCESSFUL); broadcastPacket(msg); msg = null; if (player.getParty() != null) { for (L2PcInstance member : player.getParty().getPartyMembers()) { RaidBossPointsManager.addPoints(member, getNpcId(), (getLevel() / 2) + Rnd.get(-5, 5)); } } else RaidBossPointsManager.addPoints(player, getNpcId(), (getLevel() / 2) + Rnd.get(-5, 5)); } return true; }
@Override protected void doAction(L2PcInstance player) { if (isBusy()) return; synchronized (_sync) { if (!hasKey) return; setBusy(true); player.addItem("FourSepulchers", 7260, 1, null, true); setIsInvul(false); hasKey = false; } reduceCurrentHp(getMaxHp() + 1, player); _mausoleum.nextStage(); }
/** * Actions: * * <ul> * <li>Check if the killing object is a player, and then find the party they belong to. * <li>Add a blood offering item to the leader of the party. * <li>Update the party leader's inventory to show the new item addition. * </ul> */ @Override public void doItemDrop(L2Character lastAttacker) { L2PcInstance killingChar = null; if (!(lastAttacker instanceof L2PcInstance)) { return; } killingChar = (L2PcInstance) lastAttacker; L2Party associatedParty = killingChar.getParty(); if (associatedParty == null) { return; } L2PcInstance partyLeader = associatedParty.getLeader(); L2ItemInstance addedOfferings = partyLeader .getInventory() .addItem( "Sign", SevenSignsFestival.FESTIVAL_OFFERING_ID, _bonusMultiplier, partyLeader, this); InventoryUpdate iu = new InventoryUpdate(); if (addedOfferings.getCount() != _bonusMultiplier) { iu.addModifiedItem(addedOfferings); } else { iu.addNewItem(addedOfferings); } partyLeader.sendPacket(iu); super.doItemDrop(lastAttacker); // Normal drop }
public void recoverClan(L2PcInstance player, int clanId) { if (Config.DEBUG) { _log.info( player.getObjectId() + "(" + player.getName() + ") requested recover a clan from " + getObjectId() + "(" + getName() + ")"); } if (!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } L2Clan clan = player.getClan(); clan.setDissolvingExpiryTime(0); clan.updateClanInDB(); clan = null; }
public L2SiegeFlagInstance( L2PcInstance player, int objectId, L2NpcTemplate template, boolean advanced, boolean outPost) { super(objectId, template); setInstanceType(InstanceType.L2SiegeFlagInstance); if (TerritoryWarManager.getInstance().isTWInProgress()) { _clan = player.getClan(); _player = player; _canTalk = false; if (_clan == null) deleteMe(); if (outPost) { _isAdvanced = false; setIsInvul(true); } else { _isAdvanced = advanced; setIsInvul(false); } getStatus(); return; } _clan = player.getClan(); _player = player; _canTalk = true; _siege = SiegeManager.getInstance().getSiege(_player.getX(), _player.getY(), _player.getZ()); if (_siege == null) _siege = FortSiegeManager.getInstance().getSiege(_player.getX(), _player.getY(), _player.getZ()); if (_siege == null) _siege = CHSiegeManager.getInstance().getSiege(player); if (_clan == null || _siege == null) { throw new NullPointerException(getClass().getSimpleName() + ": Initialization failed."); } L2SiegeClan sc = _siege.getAttackerClan(_clan); if (sc == null) throw new NullPointerException(getClass().getSimpleName() + ": Cannot find siege clan."); sc.addFlag(this); _isAdvanced = advanced; getStatus(); setIsInvul(false); }
/** * 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>Your admin needs to add me teachTo informations.<br>NpcId:", String.valueOf(npc.getTemplate().getNpcId()), ", your classId:", String.valueOf(player.getClassId().getId()), "</body></html>"); html.setHtml(sb); player.sendPacket(html); return; } if (!npc.getTemplate().canTeach(classId)) { NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId()); html.setFile("data/html/trainer/" + npc.getTemplate().getNpcId() + "-noskills.htm"); player.sendPacket(html); return; } AcquireSkillList asl = new AcquireSkillList(AcquireSkillList.SkillType.Usual); boolean empty = true; for (L2SkillLearn sl : SkillTreeTable.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 = SkillTreeTable.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 displays PledgeSkillList to the player. * * @param player */ public void showPledgeSkillList(L2PcInstance player) { if (Config.DEBUG) { _log.info("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); } skills = null; if (counts == 0) { NpcHtmlMessage html = new NpcHtmlMessage(1); if (player.getClan().getLevel() < 8) { SystemMessage sm = new SystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN); sm.addNumber(player.getClan().getLevel() + 1); player.sendPacket(sm); sm = null; } else { TextBuilder sb = new TextBuilder(); sb.append("<html><body>"); sb.append("You've learned all skills available for your Clan.<br>"); sb.append("</body></html>"); html.setHtml(sb.toString()); player.sendPacket(html); html = null; sb = null; } } else { player.sendPacket(asl); } asl = null; player.sendPacket(ActionFailed.STATIC_PACKET); }
@Override public void sendInfo(L2PcInstance activeChar) { activeChar.sendPacket(new StaticObject(this)); }
@Override public boolean doDie(L2Character killer) { if (!super.doDie(killer)) { return false; } final L2PcInstance player = killer.getActingPlayer(); if (player != null) { broadcastPacket( SystemMessage.getSystemMessage(SystemMessageId.CONGRATULATIONS_YOUR_RAID_WAS_SUCCESSFUL)); if (player.getParty() != null) { for (L2PcInstance member : player.getParty().getMembers()) { member.setRaidPoints(member.getRaidPoints() + ((getLevel() / 2) + Rnd.get(-5, 5))); if (member.isNoble()) { Hero.getInstance().setRBkilled(member.getObjectId(), getId()); } } } else { player.setRaidPoints(player.getRaidPoints() + ((getLevel() / 2) + Rnd.get(-5, 5))); if (player.isNoble()) { Hero.getInstance().setRBkilled(player.getObjectId(), getId()); } } } RaidBossSpawnManager.getInstance().updateStatus(this, true); return true; }
private final Set<PlayerClass> getAvailableSubClasses(L2PcInstance player) { final PlayerRace npcRace = getVillageMasterRace(); final ClassType npcTeachType = getVillageMasterTeachType(); // 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; PlayerClass currClass = PlayerClass.values()[baseClassId]; /** * 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 = currClass.getAvailableSubclasses(player); if (availSubs != null && !availSubs.isEmpty()) { for (PlayerClass availSub : availSubs) { for (SubClass subClass : player.getSubClasses().values()) if (subClass.getClassId() == availSub.ordinal()) { availSubs.remove(PlayerClass.values()[availSub.ordinal()]); } for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext(); ) { SubClass prevSubClass = subList.next(); int subClassId = prevSubClass.getClassId(); if (subClassId >= 88) { subClassId = ClassId.values()[subClassId].getParent().getId(); } if (availSub.ordinal() == subClassId || availSub.ordinal() == player.getBaseClass()) { availSubs.remove(PlayerClass.values()[availSub.ordinal()]); } } 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); } 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); } } } } currClass = null; return availSubs; }