|
Тех-документация Статьи по редактированию, компиляции и настройки ява серверов Lineage 2 |
Ссылки сообщества |
Изображения и альбомы |
Пользователи |
К странице... |
Опции темы |
11.10.2009, 08:50 | #1 |
Пользователь
|
Модификация ядра\Некоторые моды
Мб я не все выложу и мб у некоторых этих модов нет.
Разные цвета имен рассы: [SPOILER]public void setRaceColor() { if (Config.RACE_COLOR_SYSTEM_ENABLED) { /** Updates name color of each race **/ if ((getRace() == Race.DarkElf) && (_appearance.getNameColor() == 0xFFFFFF) && (_appearance.getTitleColor() == 0xFFFF77)) { _appearance.setNameColor(Config.NICK_COLOR_FOR_DE) ; _appearance.setTitleColor(Config.TITLE_COLOR_FOR_D E); } if ((getRace() == Race.Elf) && (_appearance.getNameColor() == 0xFFFFFF) && (_appearance.getTitleColor() == 0xFFFF77)) { _appearance.setNameColor(Config.NICK_COLOR_FOR_E); _appearance.setTitleColor(Config.TITLE_COLOR_FOR_E ); } if ((getRace() == Race.Human) && (_appearance.getNameColor() == 0xFFFFFF) && (_appearance.getTitleColor() == 0xFFFF77)) { _appearance.setNameColor(Config.NICK_COLOR_FOR_H); _appearance.setTitleColor(Config.TITLE_COLOR_FOR_H ); } if ((getRace() == Race.Orc) && (_appearance.getNameColor() == 0xFFFFFF) && (_appearance.getTitleColor() == 0xFFFF77)) { _appearance.setNameColor(Config.NICK_COLOR_FOR_O); _appearance.setTitleColor(Config.TITLE_COLOR_FOR_O ); } if ((getRace() == Race.Dwarf) && (_appearance.getNameColor() == 0xFFFFFF) && (_appearance.getTitleColor() == 0xFFFF77)) { _appearance.setNameColor(Config.NICK_COLOR_FOR_D); _appearance.setTitleColor(Config.TITLE_COLOR_FOR_D ); } if ((getRace() == Race.Kamael) && (_appearance.getNameColor() == 0xFFFFFF) && (_appearance.getTitleColor() == 0xFFFF77)) { _appearance.setNameColor(Config.NICK_COLOR_FOR_K); _appearance.setTitleColor(Config.TITLE_COLOR_FOR_K ); } } }[/SPOILER] Ставить в l2pcinstance.java Мод на ПвП цвета, возможно зделать даже до 20 левелов цветов ника. [SPOILER] public boolean setPvpColor() { if (Config.PVP_COLOR_SYSTEM_ENABLED && _pvpKills >= Config.PVP_AMOUNT1 && !isGM()) { int oldNickColor = _appearance.getNameColor(); int oldTitleColor = _appearance.getTitleColor(); if (_pvpKills >= Config.PVP_AMOUNT1 && _pvpKills < Config.PVP_AMOUNT2) { _appearance.setNameColor(Config.COLOR_FOR_AMOUNT1) ; _appearance.setTitleColor(Config.TITLE_COLOR_FOR_A MOUNT1); } else if (_pvpKills >= Config.PVP_AMOUNT2 && _pvpKills < Config.PVP_AMOUNT3) { _appearance.setNameColor(Config.COLOR_FOR_AMOUNT2) ; _appearance.setTitleColor(Config.TITLE_COLOR_FOR_A MOUNT2); } else if (_pvpKills >= Config.PVP_AMOUNT3 && _pvpKills < Config.PVP_AMOUNT4) { _appearance.setNameColor(Config.COLOR_FOR_AMOUNT3) ; _appearance.setTitleColor(Config.TITLE_COLOR_FOR_A MOUNT3); } else if (_pvpKills >= Config.PVP_AMOUNT4 && _pvpKills < Config.PVP_AMOUNT5) { _appearance.setNameColor(Config.COLOR_FOR_AMOUNT4) ; _appearance.setTitleColor(Config.TITLE_COLOR_FOR_A MOUNT4); } else if (_pvpKills >= Config.PVP_AMOUNT5) { _appearance.setNameColor(Config.COLOR_FOR_AMOUNT5) ; _appearance.setTitleColor(Config.TITLE_COLOR_FOR_A MOUNT5); } if (oldNickColor != _appearance.getNameColor() || oldTitleColor != _appearance.getTitleColor()) return true; } return false; } [/SPOILER] Тема актуальна, по мере возможности буду вылаживать всякие моды... Если вы хотите какойто мод пишем суда, я выложу |
11.10.2009, 15:31 | #2 |
Пользователь
|
Re: Модификация ядра\Некоторые моды
и где ты вылаживаешь еще моды?
|
11.10.2009, 16:46 | #3 |
Пользователь
|
Re: Модификация ядра\Некоторые моды
Если не работает сертификация, модик
[SPOILER]### Eclipse Workspace Patch 1.0 #P L2_GameServer Index: java/net/sf/l2j/gameserver/model/actor/instance/L2TransformManagerInstance.java ================================================== ================= --- java/net/sf/l2j/gameserver/model/actor/instance/L2TransformManagerInstance.java (revision 3281) +++ java/net/sf/l2j/gameserver/model/actor/instance/L2TransformManagerInstance.java (working copy) @@ -17,6 +17,7 @@ import net.sf.l2j.gameserver.datatables.SkillTable; import net.sf.l2j.gameserver.datatables.SkillTreeTable; import net.sf.l2j.gameserver.model.L2Skill; +import net.sf.l2j.gameserver.model.L2SubClassCertificatio n; import net.sf.l2j.gameserver.model.L2TransformSkillLearn; import net.sf.l2j.gameserver.network.SystemMessageId; import net.sf.l2j.gameserver.network.serverpackets.Acquir eSkillList; @@ -24,6 +25,7 @@ import net.sf.l2j.gameserver.network.serverpackets.NpcHtm lMessage; import net.sf.l2j.gameserver.network.serverpackets.System Message; import net.sf.l2j.gameserver.templates.chars.L2NpcTemplat e; +import net.sf.l2j.gameserver.util.StringUtil; public class L2TransformManagerInstance extends L2MerchantInstance { @@ -57,12 +59,57 @@ player.setSkillLearningClassId(player.getClassId() ); showTransformSkillList(player); } + else if (command.startsWith("SubClassCertification")) + { + String [] splittedCommand = command.split(" "); + int cmdChoice = Integer.parseInt(splittedCommand[1]); + + if ( player.isSubClassActive() ) + { + player.sendMessage("Before remove certification skills you must switch to your main class."); + return; + } + + if (cmdChoice == 1) // Learn skills + showSubClassCertificationSkillList(player); + else if (cmdChoice == 2) // remove certification + { + if (player.getAdena() < L2SubClassCertification.CertificationRemovalPrice) + { + SystemMessage message = new SystemMessage(SystemMessageId.NOT_ENOUGH_REQUIRED_ ITEMS); + message.addItemName(57); + message.addItemNumber(L2SubClassCertification.Cert ificationRemovalPrice); + player.sendPacket(message); + message = null; + return; + } + + L2SubClassCertification.RemoveCertificationSkills( player); + player.sendMessage("Certification skills succesfully removed."); + } + } else { super.onBypassFeedback(player, command); } } + public void showSubClassCertificationSkillList(L2PcInstance player) + { + AcquireSkillList asl = L2SubClassCertification.getCertificationSkillList( player); + if (asl != null) + { + player.sendPacket(asl); + player.sendPacket(ActionFailed.STATIC_PACKET); + } + else + { + NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); + html.setHtml("<html><head><body>You've learned all skills.</body></html>"); + player.sendPacket(html); + } + } + /** * this displays TransformationSkillList to the player. * @param player @@ -104,7 +151,6 @@ "</body></html>" ); player.sendPacket(html); - } } else Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestAquireSkill.java ================================================== ================= --- java/net/sf/l2j/gameserver/network/clientpackets/RequestAquireSkill.java (revision 3281) +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestAquireSkill.java (working copy) @@ -25,6 +25,7 @@ import net.sf.l2j.gameserver.model.L2ShortCut; import net.sf.l2j.gameserver.model.L2Skill; import net.sf.l2j.gameserver.model.L2SkillLearn; +import net.sf.l2j.gameserver.model.L2SubClassCertificatio n; import net.sf.l2j.gameserver.model.L2TransformSkillLearn; import net.sf.l2j.gameserver.model.actor.L2Npc; import net.sf.l2j.gameserver.model.actor.instance.L2Fishe rmanInstance; @@ -39,6 +40,7 @@ import net.sf.l2j.gameserver.network.serverpackets.Status Update; import net.sf.l2j.gameserver.network.serverpackets.System Message; import net.sf.l2j.gameserver.util.IllegalPlayerAction; +import net.sf.l2j.gameserver.util.StringUtil; import net.sf.l2j.gameserver.util.Util; /** @@ -343,29 +345,37 @@ { int costid = 0; int costcount = 0; - // Skill Learn bug Fix - L2SkillLearn[] skillsc = SkillTreeTable.getInstance().getAvailableSpecialSk ills(player); - - for (L2SkillLearn s : skillsc) + if (trainer instanceof L2TransformManagerInstance) // subclass certification skills { - L2Skill sk = SkillTable.getInstance().getInfo(s.getId(),s.getLe vel()); - - if (sk == null || sk != skill) - continue; - - counts++; - costid = s.getIdCost(); - costcount = s.getCostCount(); - _requiredSp = s.getSpCost(); + _requiredSp = 0; + costid = L2SubClassCertification.getCertificateForSkill(ski ll.getId()); + costcount = 1; } - - if (counts == 0) + else { - player.sendMessage("You are trying to learn skill that u can't.."); - Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to learn skill that he can't!!!", IllegalPlayerAction.PUNISH_KICK); - return; + // Skill Learn bug Fix + L2SkillLearn[] skillsc = SkillTreeTable.getInstance().getAvailableSpecialSk ills(player); + + for (L2SkillLearn s : skillsc) + { + L2Skill sk = SkillTable.getInstance().getInfo(s.getId(),s.getLe vel()); + + if (sk == null || sk != skill) + continue; + + counts++; + costid = s.getIdCost(); + costcount = s.getCostCount(); + _requiredSp = s.getSpCost(); + } + + if (counts == 0) + { + player.sendMessage("You are trying to learn skill that u can't.."); + Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to learn skill that he can't!!!", IllegalPlayerAction.PUNISH_KICK); + return; + } } - if (player.getSp() >= _requiredSp) { if (!player.destroyItemByItemId("Consume", costid, costcount, trainer, false)) @@ -434,7 +444,12 @@ if (trainer instanceof L2FishermanInstance) ((L2FishermanInstance) trainer).showSkillList(player); else if (trainer instanceof L2TransformManagerInstance) - ((L2TransformManagerInstance) trainer).showTransformSkillList(player); + { + if (_skillType == 0) + ((L2TransformManagerInstance) trainer).showTransformSkillList(player); + else if (_skillType == 6) + ((L2TransformManagerInstance) trainer).showSubClassCertificationSkillList(player ); + } else trainer.showSkillList(player, player.getSkillLearningClassId()); Index: java/net/sf/l2j/gameserver/model/L2SubClassSkillsInfo.java ================================================== ================= --- java/net/sf/l2j/gameserver/model/L2SubClassSkillsInfo.java (revision 0) +++ java/net/sf/l2j/gameserver/model/L2SubClassSkillsInfo.java (revision 0) @@ -0,0 +1,177 @@ +/* + * 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 net.sf.l2j.gameserver.model; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import net.sf.l2j.L2DatabaseFactory; +import net.sf.l2j.gameserver.model.actor.instance.L2PcIns tance; + +/** + * + * @author John + */ +public class L2SubClassSkillsInfo +{ + private static final String SELECT_SUBCLASS_SKILLS_INFO = + "select * from character_subclass_certification where characterId=? and subIndex=?"; + private static final String UPDATE_SUBCLASS_SKILLS_INFO = + "update character_subclass_certification set cert_65=?, cert_70=?, cert_75=?, cert_80=? where characterId=? and subIndex=?"; + private static final String ADD_SUBCLASS_SKILLS_INFO = + "insert into character_subclass_certification (cert_65, cert_70, cert_75, cert_80, characterId, subIndex) values (?,?,?,?,?,?)"; + private static final String CLEAR_SUBCLASS_SKILLS_INFO = + "update character_subclass_certification set cert_65=false, cert_70=false, cert_75=false, cert_80=false where characterId=?"; + + public boolean cert_65 = false; + public boolean cert_70 = false; + public boolean cert_75 = false; + public boolean cert_80 = false; + + private static final Logger _log = Logger.getLogger(L2SubClassSkillsInfo.class.getNam e()); + + public static L2SubClassSkillsInfo LoadFromDatabase(L2PcInstance player) + { + L2SubClassSkillsInfo result = new L2SubClassSkillsInfo(); + Connection connection = null; + try + { + connection = L2DatabaseFactory.getInstance().getConnection(); + if (connection != null) + { + PreparedStatement statement = connection.prepareStatement(SELECT_SUBCLASS_SKILLS _INFO); + statement.setInt(1, player.getCharId()); + statement.setInt(2, player.getClassIndex()); + ResultSet resultSet = statement.executeQuery(); + if (resultSet.next()) + { + result.cert_65 = resultSet.getBoolean("cert_65"); + result.cert_70 = resultSet.getBoolean("cert_70"); + result.cert_75 = resultSet.getBoolean("cert_75"); + result.cert_80 = resultSet.getBoolean("cert_80"); + } + else + InsertToDatabase(player, result); + statement.close(); + } + } + catch (SQLException e) + { + if(_log.isLoggable(Level.SEVERE)) + _log.log(Level.SEVERE, "SQL exception while getting connection to the database", e); + } + finally + { + try + { + if (connection != null) + connection.close(); + } + catch (SQLException e) + { + if(_log.isLoggable(Level.SEVERE)) + _log.log(Level.SEVERE, "Internal server error during connection closing", e); + } + } + return result; + } + + public static void ClearSubClassSkillsInfo(L2PcInstance player) + { + Connection connection = null; + try + { + connection = L2DatabaseFactory.getInstance().getConnection(); + if (connection != null) + { + PreparedStatement statement = connection.prepareStatement(CLEAR_SUBCLASS_SKILLS_ INFO); + statement.setInt(1, player.getCharId()); + statement.execute(); + statement.close(); + } + } + catch (SQLException e) + { + if(_log.isLoggable(Level.SEVERE)) + _log.log(Level.SEVERE, "SQL exception while getting connection to the database", e); + } + finally + { + try + { + if (connection != null) + connection.close(); + } + catch (SQLException e) + { + if(_log.isLoggable(Level.SEVERE)) + _log.log(Level.SEVERE, "Internal server error during connection closing", e); + } + } + } + + public static void InsertToDatabase(L2PcInstance player, L2SubClassSkillsInfo info) + { + AddUpdateSkillsInfo(player, info, ADD_SUBCLASS_SKILLS_INFO); + } + + public static void UpdateSkillsInfoForPlayer(L2PcInstance player, L2SubClassSkillsInfo info) + { + AddUpdateSkillsInfo(player, info, UPDATE_SUBCLASS_SKILLS_INFO); + } + + private static void AddUpdateSkillsInfo(L2PcInstance player, L2SubClassSkillsInfo info, String sqlQuery) + { + Connection connection = null; + try + { + connection = L2DatabaseFactory.getInstance().getConnection(); + if (connection != null) + { + PreparedStatement statement = connection.prepareStatement(sqlQuery); + statement.setBoolean(1, info.cert_65); + statement.setBoolean(2, info.cert_70); + statement.setBoolean(3, info.cert_75); + statement.setBoolean(4, info.cert_80); + statement.setInt(5, player.getCharId()); + statement.setInt(6, player.getClassIndex()); + statement.execute(); + statement.close(); + } + } + catch (SQLException e) + { + if(_log.isLoggable(Level.SEVERE)) + _log.log(Level.SEVERE, "SQL exception while getting connection to the database", e); + } + finally + { + try + { + if (connection != null) + connection.close(); + } + catch (SQLException e) + { + if(_log.isLoggable(Level.SEVERE)) + _log.log(Level.SEVERE, "Internal server error during connection closing", e); + } + } + } +} \ No newline at end of file Index: java/net/sf/l2j/gameserver/model/L2SubClassCertification.java ================================================== ================= --- java/net/sf/l2j/gameserver/model/L2SubClassCertification.java (revision 0) +++ java/net/sf/l2j/gameserver/model/L2SubClassCertification.java (revision 0) @@ -0,0 +1,467 @@ +/* + * 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 net.sf.l2j.gameserver.model; + +import java.util.ArrayList; + +import javolution.util.FastList; +import net.sf.l2j.gameserver.datatables.SkillTable; +import net.sf.l2j.gameserver.datatables.SkillTreeTable; +import net.sf.l2j.gameserver.model.actor.instance.L2PcIns tance; +import net.sf.l2j.gameserver.model.itemcontainer.PcInvent ory; +import net.sf.l2j.gameserver.model.itemcontainer.PcWareho use; +import net.sf.l2j.gameserver.network.SystemMessageId; +import net.sf.l2j.gameserver.network.serverpackets.Acquir eSkillList; +import net.sf.l2j.gameserver.network.serverpackets.Invent oryUpdate; +import net.sf.l2j.gameserver.network.serverpackets.System Message; +import net.sf.l2j.gameserver.util.StringUtil; + +/** + * + * @author Visor + */ +public class L2SubClassCertification +{ + public final static int CertificateEmergentAbility = 10280; + public final static int CertificateMasterAbility = 10612; + + public final static int CertificateWarriorAbility = 10281; + public final static int CertificateKnightAbility = 10282; + public final static int CertificateRogueAbility = 10283; + public final static int CertificateWizardAbility = 10284; + public final static int CertificateHealerAbility = 10285; + public final static int CertificateSummonerAbility = 10286; + public final static int CertificateEnchanterAbility = 10287; + + public final static int TransformSealbookDivineWarrior = 10289; + public final static int TransformSealbookDivineKnight = 10288; + public final static int TransformSealbookDivineRogue = 10290; + public final static int TransformSealbookDivineWizard = 10292; + public final static int TransformSealbookDivineHealer = 10291; + public final static int TransformSealbookDivineSummoner = 10294; + public final static int TransformSealbookDivineEnchanter = 10293; + + public final static int CertificationRemovalPrice = 10000000; + + private final static int EmergentAbilityAttackId = 631; + private final static int EmergentAbilityDefenseId = 632; + private final static int EmergentAbilityEmpowerId = 633; + private final static int EmergentAbilityMagicDefenseId = 634; + + private final static int MasterAbilityAttackId = 637; + private final static int MasterAbilityEmpowerId = 638; + private final static int MasterAbilityCastingId = 639; + private final static int MasterAbilityFocusId = 640; + private final static int MasterAbilityDefenseId = 799; + private final static int MasterAbilityMagicDefenseId = 800; + + private final static int KnightAbilityBoostHPId = 641; + private final static int KnightAbilityDefenseId = 652; + private final static int KnightAbilityResistCriticalId = 804; // NOTDONE + + private final static int EnchanterAbilityBoostManaId = 642; + private final static int EnchanterAbilityManaRecycleId = 647; + private final static int EnchanterAbilityBarrierId = 655; + + private final static int SummonerAbilityBoostHPMPId = 643; + private final static int SummonerAbilityResistAttributeId = 1489; + private final static int SummonerAbilitySpiritId = 1491; + + private final static int RogueAbilityEvasionId = 644; + private final static int RogueAbilityLongShotId = 645; + private final static int RogueAbilityCriticalChanceId = 653; + + private final static int WizardAbilityManaGainId = 646; + private final static int WizardAbilityManaStealId = 654; // TODO: Add vampiric effect + private final static int WizardAbilityAntimagicId = 802; + + private final static int HealerAbilityPrayerId = 648; + private final static int HealerAbilityHealId = 1490; + private final static int HealerAbilityDivineProtectionId = 803; + + private final static int WarriorAbilityResistTraitId = 650; + private final static int WarriorAbilityHasteId = 651; + private final static int WarriorAbilityBoostCPId = 801; + + private final static int TransformDivineWarriorId = 656; + private final static int TransformDivineKnightId = 657; + private final static int TransformDivineRogueId = 658; + private final static int TransformDivineWizardId = 659; + private final static int TransformDivineSummonerId = 660; + private final static int TransformDivineHealerId = 661; + private final static int TransformDivineEnchanterId = 662; + + private static int[][] skills = new int[][] { + // Skill id - certificate id - minimum required subclass level - maximum skill level + + { EmergentAbilityAttackId, CertificateEmergentAbility, 65, 6 }, + { EmergentAbilityDefenseId, CertificateEmergentAbility, 65, 6 }, + { EmergentAbilityEmpowerId, CertificateEmergentAbility, 65, 6 }, + { EmergentAbilityMagicDefenseId, CertificateEmergentAbility, 65, 6 }, + + { MasterAbilityAttackId, CertificateMasterAbility, 75, 3 }, + { MasterAbilityEmpowerId, CertificateMasterAbility, 75, 3 }, + { MasterAbilityCastingId, CertificateMasterAbility, 75, 3 }, + { MasterAbilityFocusId, CertificateMasterAbility, 75, 3 }, + { MasterAbilityDefenseId, CertificateMasterAbility, 75, 3 }, + { MasterAbilityMagicDefenseId, CertificateMasterAbility, 75, 3 }, + + { KnightAbilityBoostHPId, CertificateKnightAbility, 75, 1 }, + { KnightAbilityDefenseId, CertificateKnightAbility, 75, 1 }, + { KnightAbilityResistCriticalId, CertificateKnightAbility, 75, 1 }, + + { EnchanterAbilityBoostManaId, CertificateEnchanterAbility, 75, 1 }, + { EnchanterAbilityManaRecycleId, CertificateEnchanterAbility, 75, 1 }, + { EnchanterAbilityBarrierId, CertificateEnchanterAbility, 75, 1 }, + + { SummonerAbilityBoostHPMPId, CertificateSummonerAbility, 75, 1 }, + { SummonerAbilityResistAttributeId, CertificateSummonerAbility, 75, 1 }, + { SummonerAbilitySpiritId, CertificateSummonerAbility, 75, 1 }, + + { RogueAbilityEvasionId, CertificateRogueAbility, 75, 1 }, + { RogueAbilityLongShotId, CertificateRogueAbility, 75, 1 }, + { RogueAbilityCriticalChanceId, CertificateRogueAbility, 75, 1 }, + + { WizardAbilityManaGainId, CertificateWizardAbility, 75, 1 }, + { WizardAbilityManaStealId, CertificateWizardAbility, 75, 1 }, + { WizardAbilityAntimagicId, CertificateWizardAbility, 75, 1 }, + + { HealerAbilityPrayerId, CertificateHealerAbility, 75, 1 }, + { HealerAbilityHealId, CertificateHealerAbility, 75, 1 }, + { HealerAbilityDivineProtectionId, CertificateHealerAbility, 75, 1 }, + + { WarriorAbilityResistTraitId, CertificateWarriorAbility, 75, 1 }, + { WarriorAbilityHasteId, CertificateWarriorAbility, 75, 1 }, + { WarriorAbilityBoostCPId, CertificateWarriorAbility, 75, 1 }, + + { TransformDivineWarriorId, TransformSealbookDivineWarrior, 80, 1 }, + { TransformDivineKnightId, TransformSealbookDivineKnight, 80, 1 }, + { TransformDivineRogueId, TransformSealbookDivineRogue, 80, 1 }, + { TransformDivineWizardId, TransformSealbookDivineWizard, 80, 1 }, + { TransformDivineSummonerId, TransformSealbookDivineSummoner, 80, 1 }, + { TransformDivineHealerId, TransformSealbookDivineHealer, 80, 1 }, + { TransformDivineEnchanterId, TransformSealbookDivineEnchanter, 80, 1 } + }; + + private static int[][] classes = new int[][] { + // ClassId - Special skill certificate (75) - Ultimate skill certificate ( Divine transformation ) (80) + + // ---------------------------------------------- Warriors -------------------------------------------------- + // Gladiator + { 2, CertificateWarriorAbility, TransformSealbookDivineWarrior }, { 88, CertificateWarriorAbility, TransformSealbookDivineWarrior }, + // Warlord + { 3, CertificateWarriorAbility, TransformSealbookDivineWarrior }, { 89, CertificateWarriorAbility, TransformSealbookDivineWarrior }, + // Bounty Hunter + { 55, CertificateWarriorAbility, TransformSealbookDivineWarrior }, { 117, CertificateWarriorAbility, TransformSealbookDivineWarrior }, + // Tyrant + { 48, CertificateWarriorAbility, TransformSealbookDivineWarrior }, { 114, CertificateWarriorAbility, TransformSealbookDivineWarrior }, + // Destroyer + { 46, CertificateWarriorAbility, TransformSealbookDivineWarrior }, { 113, CertificateWarriorAbility, TransformSealbookDivineWarrior }, + // Soul Breaker + { 128, CertificateWarriorAbility, TransformSealbookDivineWarrior }, { 132, CertificateWarriorAbility, TransformSealbookDivineWarrior }, + // Soul Breaker + { 129, CertificateWarriorAbility, TransformSealbookDivineWarrior }, { 133, CertificateWarriorAbility, TransformSealbookDivineWarrior }, + // Berserker + { 127, CertificateWarriorAbility, TransformSealbookDivineWarrior }, { 131, CertificateWarriorAbility, TransformSealbookDivineWarrior }, + + // ---------------------------------------------- Knights --------------------------------------------------- + // Paladin + { 5, CertificateKnightAbility, TransformSealbookDivineKnight }, { 90, CertificateKnightAbility, TransformSealbookDivineKnight }, + // Dark Avenger + { 6, CertificateKnightAbility, TransformSealbookDivineKnight }, { 91, CertificateKnightAbility, TransformSealbookDivineKnight }, + // Temple Knight + { 20, CertificateKnightAbility, TransformSealbookDivineKnight }, { 99, CertificateKnightAbility, TransformSealbookDivineKnight }, + // Shillien Knight + { 33, CertificateKnightAbility, TransformSealbookDivineKnight }, { 106, CertificateKnightAbility, TransformSealbookDivineKnight }, + + // ----------------------------------------------- Rogues ---------------------------------------------------- + // Hawkeye + { 9, CertificateRogueAbility, TransformSealbookDivineRogue }, { 92, CertificateRogueAbility, TransformSealbookDivineRogue }, + // Silver Ranger + { 24, CertificateRogueAbility, TransformSealbookDivineRogue }, { 102, CertificateRogueAbility, TransformSealbookDivineRogue }, + // Phantom Ranger + { 37, CertificateRogueAbility, TransformSealbookDivineRogue }, { 109, CertificateRogueAbility, TransformSealbookDivineRogue }, + // Treasure Hunter + { 8, CertificateRogueAbility, TransformSealbookDivineRogue }, { 93, CertificateRogueAbility, TransformSealbookDivineRogue }, + // Plains Walker + { 23, CertificateRogueAbility, TransformSealbookDivineRogue }, { 101, CertificateRogueAbility, TransformSealbookDivineRogue }, + // Abyss Walker + { 36, CertificateRogueAbility, TransformSealbookDivineRogue }, { 108, CertificateRogueAbility, TransformSealbookDivineRogue }, + // Arbalester + { 130, CertificateRogueAbility, TransformSealbookDivineRogue }, { 134, CertificateRogueAbility, TransformSealbookDivineRogue }, + + // ------------------------------------------------ Wizards --------------------------------------------------- + // Sorcecer + { 12, CertificateWizardAbility, TransformSealbookDivineWizard },{ 94, CertificateWizardAbility, TransformSealbookDivineWizard }, + // Spellsinger + { 27, CertificateWizardAbility, TransformSealbookDivineWizard },{ 103, CertificateWizardAbility, TransformSealbookDivineWizard }, + // Spellhowler + { 40, CertificateWizardAbility, TransformSealbookDivineWizard },{ 110, CertificateWizardAbility, TransformSealbookDivineWizard }, + // Necromancer + { 13, CertificateWizardAbility, TransformSealbookDivineWizard },{ 95, CertificateWizardAbility, TransformSealbookDivineWizard }, + + // ------------------------------------------------ Healers ---------------------------------------------------- + // Shillien Elder + { 43, CertificateHealerAbility, TransformSealbookDivineHealer },{ 112, CertificateHealerAbility, TransformSealbookDivineHealer }, + // Elven Elder + { 30, CertificateHealerAbility, TransformSealbookDivineHealer },{ 105, CertificateHealerAbility, TransformSealbookDivineHealer }, + // Bishop + { 16, CertificateHealerAbility, TransformSealbookDivineHealer },{ 97, CertificateHealerAbility, TransformSealbookDivineHealer }, + + // ------------------------------------------------ Summoners --------------------------------------------------- + // Warlock + { 14, CertificateSummonerAbility, TransformSealbookDivineSummoner },{ 96, CertificateSummonerAbility, TransformSealbookDivineSummoner }, + // Elemental Summoner + { 28, CertificateSummonerAbility, TransformSealbookDivineSummoner },{ 104, CertificateSummonerAbility, TransformSealbookDivineSummoner }, + // Phantom Summoner + { 41, CertificateSummonerAbility, TransformSealbookDivineSummoner },{ 111, CertificateSummonerAbility, TransformSealbookDivineSummoner }, + + // ------------------------------------------------ Enchanters -------------------------------------------------- + // Prophet + { 17, CertificateEnchanterAbility, TransformSealbookDivineEnchanter }, { 98, CertificateEnchanterAbility, TransformSealbookDivineEnchanter }, + // Warcryer + { 52, CertificateEnchanterAbility, TransformSealbookDivineEnchanter }, { 116, CertificateEnchanterAbility, TransformSealbookDivineEnchanter }, + // Inspector + { 135, CertificateEnchanterAbility, TransformSealbookDivineEnchanter }, { 136, CertificateEnchanterAbility, TransformSealbookDivineEnchanter }, + // Sword Singer + { 21, CertificateEnchanterAbility, TransformSealbookDivineEnchanter }, { 100, CertificateEnchanterAbility, TransformSealbookDivineEnchanter }, + // Bladedancer + { 34, CertificateEnchanterAbility, TransformSealbookDivineEnchanter }, { 107, CertificateEnchanterAbility, TransformSealbookDivineEnchanter } + }; + + private static FastList<Integer> allSkillsId = null; + + public static AcquireSkillList getCertificationSkillList(L2PcInstance player) + { + AcquireSkillList skillList = null; + + boolean emergentCertificateFlag = false, masterCertificateFlag = false; + for(int [] current : skills) + { + if (player.getInventory().getItemByItemId(current[1]) != null) + { + if (skillList == null) + skillList = new AcquireSkillList(AcquireSkillList.SkillType.Specia l); + + if (current[1] == CertificateEmergentAbility) + { + if (!emergentCertificateFlag) + emergentCertificateFlag = true; + int currentSkillLevel = player.getSkillLevel(current[0]); + if (currentSkillLevel < 0) + currentSkillLevel = 0; + skillList.addSkill(current[0], currentSkillLevel + 1, current[3], 0, 0); + } + else if (current[1] == CertificateMasterAbility) + { + if (!masterCertificateFlag) + masterCertificateFlag = true; + int currentSkillLevel = player.getSkillLevel(current[0]); + if (currentSkillLevel < 0) + currentSkillLevel = 0; + skillList.addSkill(current[0], currentSkillLevel + 1, current[3], 0, 0); + } + else if (current[1] >= 10288 && current[1] <= 10294) // Divine transformation certificate + { + int currentSkillLevel = player.getSkillLevel(current[0]); + if (currentSkillLevel < 0) + currentSkillLevel = 0; + skillList.addSkill(current[0], currentSkillLevel + 1, current[3], 0, 0); + } + else if (player.getSkillLevel(current[0]) < 0) + skillList.addSkill(current[0], 1, current[3], 0, 0); + } + } + return skillList; + } + + public static void GiveCertificate(L2PcInstance player, int certificateId) + { + L2ItemInstance newCertificate = player.getInventory().addItem("SubClassCertificati on", certificateId, 1, player, null); + + InventoryUpdate inventoryUpdate = new InventoryUpdate(); + inventoryUpdate.addItem(newCertificate); + player.sendPacket(inventoryUpdate); + + L2SubClassSkillsInfo skillsInfo = L2SubClassSkillsInfo.LoadFromDatabase(player); + + if (certificateId == CertificateEmergentAbility) + { + if (!skillsInfo.cert_65) + skillsInfo.cert_65 = true; + else if (!skillsInfo.cert_70) + skillsInfo.cert_70 = true; + } + else if (certificateId >= 10288 && certificateId <= 10294) + skillsInfo.cert_80 = true; + else + skillsInfo.cert_75 = true; + + L2SubClassSkillsInfo.UpdateSkillsInfoForPlayer(pla yer, skillsInfo); + } + + public static int getCertificateForSkill(int skillId) + { + for(int [] current : skills) + if (current[0] == skillId) + return current[1]; + + return -1; + } + + public static void RemoveCertificationSkills(L2PcInstance player) + { + PcInventory inventory = player.getInventory(); + L2ItemInstance adena = inventory.getAdenaInstance(); + + if (allSkillsId == null) + { + allSkillsId = new FastList<Integer>(); + for(int [] current : skills) + allSkillsId.add(current[0]); + } + + SkillTable skillTable = SkillTable.getInstance(); + for(L2Skill current : player.getAllSkills()) + { + int currentSkillId = current.getId(); + if (allSkillsId.contains(currentSkillId)) + { + L2Skill skill = skillTable.getInfo(currentSkillId, current.getLevel()); + player.removeSkill(skill); + } + } + + L2SubClassSkillsInfo.ClearSubClassSkillsInfo(playe r); + + adena.setCount(adena.getCount() - CertificationRemovalPrice); + + SystemMessage message = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED); + message.addItemName(adena.getItemId()); + message.addItemNumber(CertificationRemovalPrice); + player.sendPacket(message); + message = null; + + player.sendSkillList(); + + InventoryUpdate inventoryUpdate = new InventoryUpdate(); + inventoryUpdate.addModifiedItem(adena); + player.sendPacket(inventoryUpdate); + } + + public static ArrayList<Integer> GetAllowedCertificates(L2PcInstance player) + { + ArrayList<Integer> result = new ArrayList<Integer>(0); + L2SubClassSkillsInfo skillsInfo = L2SubClassSkillsInfo.LoadFromDatabase(player); + + if (!player.isSubClassActive()) + { + result.add(-1); + return result; + } + + int playerLevel = player.getLevel(); + + if (playerLevel < 65) + { + result.add(-2); + return result; + } + + // Emergent ability not depends on the class + if (( !skillsInfo.cert_65 ) || ( !skillsInfo.cert_70 ) ) + result.add(CertificateEmergentAbility); + + int playerClassId = player.getClassId().getId(); + + if (playerLevel >= 75) // We must add certificate for master ability + { + // and certificate for skills that depends on the class + if (!skillsInfo.cert_75) + result.add(CertificateMasterAbility); + + for (int[] current : classes) + if (playerClassId == current[0]) + { + if (!result.contains(current[1]) && !skillsInfo.cert_75) + result.add(current[1]); + + // if subclass is 80 lvl adding divine transformation book + if (playerLevel >= 80 && !result.contains(current[2]) && !skillsInfo.cert_80) + result.add(current[2]); + break; + } + } + + return result; + } + + public static String GetCertificateItemName(int itemId) + { + String itemName = "Wrong item id"; + switch(itemId) + { + case L2SubClassCertification.CertificateEmergentAbility : + itemName = "Certificate - Emergent Ability"; + break; + case L2SubClassCertification.CertificateMasterAbility: + itemName = "Certificate - Master Ability"; + break; + case L2SubClassCertification.CertificateEnchanterAbilit y: + itemName = "Certificate - Enchanter Ability"; + break; + case L2SubClassCertification.CertificateHealerAbility: + itemName = "Certificate - Healer Ability"; + break; + case L2SubClassCertification.CertificateKnightAbility: + itemName = "Certificate - Knight Ability"; + break; + case L2SubClassCertification.CertificateRogueAbility: + itemName = "Certificate - Rogue Ability"; + break; + case L2SubClassCertification.CertificateSummonerAbility : + itemName = "Certificate - Summoner Ability"; + break; + case L2SubClassCertification.CertificateWarriorAbility: + itemName = "Certificate - Warrior Ability"; + break; + case L2SubClassCertification.CertificateWizardAbility: + itemName = "Certificate - Wizard Ability"; + break; + case L2SubClassCertification.TransformSealbookDivineEnc hanter: + itemName = "Transform Sealbook - Divine Enchanter"; + break; + case L2SubClassCertification.TransformSealbookDivineHea ler: + itemName = "Transform Sealbook - Divine Healer"; + break; + case L2SubClassCertification.TransformSealbookDivineKni ght: + itemName = "Transform Sealbook - Divine Knight"; + break; + case L2SubClassCertification.TransformSealbookDivineRog ue: + itemName = "Transform Sealbook - Divine Rogue"; + break; + case L2SubClassCertification.TransformSealbookDivineSum moner: + itemName = "Transform Sealbook - Divine Summoner"; + break; + case L2SubClassCertification.TransformSealbookDivineWar rior: + itemName = "Transform Sealbook - Divine Warrior"; + break; + case L2SubClassCertification.TransformSealbookDivineWiz ard: + itemName = "Transform Sealbook - Divine Wizard"; + break; + } + return itemName; + } +} \ No newline at end of file Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestAquireSkillInfo.java ================================================== ================= --- java/net/sf/l2j/gameserver/network/clientpackets/RequestAquireSkillInfo.java (revision 3281) +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestAquireSkillInfo.java (working copy) @@ -23,6 +23,7 @@ import net.sf.l2j.gameserver.model.L2PledgeSkillLearn; import net.sf.l2j.gameserver.model.L2Skill; import net.sf.l2j.gameserver.model.L2SkillLearn; +import net.sf.l2j.gameserver.model.L2SubClassCertificatio n; import net.sf.l2j.gameserver.model.L2TransformSkillLearn; import net.sf.l2j.gameserver.model.actor.L2Npc; import net.sf.l2j.gameserver.model.actor.instance.L2NpcIn stance; @@ -168,6 +169,16 @@ } else if (_skillType == 6) { + if (trainer instanceof L2TransformManagerInstance) // subclass certification skill info + { + int skillId = skill.getId(); + AcquireSkillInfo asi = new AcquireSkillInfo(skillId, skill.getLevel(), 0, 6); + int certificateId = L2SubClassCertification.getCertificateForSkill(ski llId); + asi.addRequirement(1, certificateId, 1, 0); + sendPacket(asi); + return; + } + int costid = 0; int costcount = 0; L2SkillLearn[] skillsc = SkillTreeTable.getInstance().getAvailableSpecialSk ills(activeChar); Index: java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java ================================================== ================= --- java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java (revision 3281) +++ java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java (working copy) @@ -14,20 +14,25 @@ */ package net.sf.l2j.gameserver.model.actor.instance; +import java.util.ArrayList; import java.util.Iterator; import java.util.Set; import net.sf.l2j.Config; import net.sf.l2j.gameserver.datatables.CharTemplateTable ; import net.sf.l2j.gameserver.datatables.ClanTable; +import net.sf.l2j.gameserver.datatables.ItemTable; import net.sf.l2j.gameserver.datatables.SkillTreeTable; import net.sf.l2j.gameserver.instancemanager.CastleManage r; import net.sf.l2j.gameserver.instancemanager.FortManager; import net.sf.l2j.gameserver.instancemanager.FortSiegeMan ager; import net.sf.l2j.gameserver.instancemanager.SiegeManager ; +import net.sf.l2j.gameserver.lib.Log; import net.sf.l2j.gameserver.model.L2Clan; import net.sf.l2j.gameserver.model.L2ClanMember; +import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.L2PledgeSkillLearn; +import net.sf.l2j.gameserver.model.L2SubClassCertificatio n; import net.sf.l2j.gameserver.model.L2Clan.SubPledge; import net.sf.l2j.gameserver.model.base.ClassId; import net.sf.l2j.gameserver.model.base.ClassType; @@ -42,12 +47,15 @@ import net.sf.l2j.gameserver.network.serverpackets.Acquir eSkillList; import net.sf.l2j.gameserver.network.serverpackets.Action Failed; import net.sf.l2j.gameserver.network.serverpackets.ExBrEx traUserInfo; +import net.sf.l2j.gameserver.network.serverpackets.Invent oryUpdate; +import net.sf.l2j.gameserver.network.serverpackets.ItemLi st; import net.sf.l2j.gameserver.network.serverpackets.MagicS killLaunched; import net.sf.l2j.gameserver.network.serverpackets.MagicS killUse; import net.sf.l2j.gameserver.network.serverpackets.NpcHtm lMessage; import net.sf.l2j.gameserver.network.serverpackets.System Message; import net.sf.l2j.gameserver.network.serverpackets.UserIn fo; import net.sf.l2j.gameserver.templates.chars.L2NpcTemplat e; +import net.sf.l2j.gameserver.templates.item.L2Item; import net.sf.l2j.gameserver.util.StringUtil; import net.sf.l2j.gameserver.util.Util; @@ -71,6 +79,8 @@ @Override public void onBypassFeedback(L2PcInstance player, String command) { + Log.add(command, ""); + String[] commandStr = command.split(" "); String actualCommand = commandStr[0]; // Get actual command @@ -499,6 +509,79 @@ player.sendPacket(html); } + else if (actualCommand.startsWith("SubClassCertification") ) + { + final StringBuilder content = StringUtil.startAppend(1000, "<html><body>"); + NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); + int cmdChoice = Integer.valueOf(commandStr[1]); + + switch (cmdChoice) + { + case 1: // SubClass skills certification - Initial + ArrayList<Integer> certificatesList = L2SubClassCertification.GetAllowedCertificates(pla yer); + if (certificatesList.isEmpty()) + StringUtil.append(content, "You already have all possible certifications"); + else + { + int errorCode = certificatesList.get(0); + if ( errorCode < 0) // an error happens + { + switch(errorCode) + { + case -1: + StringUtil.append(content, "You must switch to appropriative subclass to receive the certificate"); + break; + case -2: + StringUtil.append(content, "Your subclass must be at least 65 level to certification process"); + break; + } + } + else + { + StringUtil.append(content, "SubClass skills certification:<br>What kind of certificate you want to receive?<br>"); + for(int i = 0; i < certificatesList.size(); i++) + { + int itemId = certificatesList.get(i); + StringUtil.append(content, + "<a action=\"bypass -h npc_", + String.valueOf(getObjectId()), + "_SubClassCertification 2 ", + String.valueOf(itemId), + "\">", + L2SubClassCertification.GetCertificateItemName(ite mId), + "</a><br>"); + } + } + } + break; + case 2: // Add selected item to inventory + { + int requestedCertificateId = Integer.valueOf(commandStr[2]); + + L2SubClassCertification.GiveCertificate(player, requestedCertificateId); + + StringUtil.append(content, + "You get item: ", L2SubClassCertification.GetCertificateItemName(req uestedCertificateId), "<br>" ); + + StringUtil.append(content, + "<a action=\"bypass -h npc_", + String.valueOf(getObjectId()), + "_SubClassCertification 1", + "\">", + "Back", + "</a><br>"); + } + break; + } + + content.append("</body></html>"); + + // 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 [/SPOILER] делаем файл .patch и суем в эклипс, либо тупо удаляем все плюсики... |
20.10.2009, 23:55 | #4 |
Пользователь
|
Re: Модификация ядра\Некоторые моды
Извеняюсь, может пишу не по теме, подскажите как добавить ещё одну валюту. если я не ошибаюсь то править надо в ядре ????!!!!!!
|
21.10.2009, 08:02 | #5 |
Пользователь
|
Re: Модификация ядра\Некоторые моды
да нет, тупо добавляешь ее дроп всем мобам и пишешь для нее мультиселлы =)
|
FXAntiXrist |
Посмотреть профиль |
Найти ещё сообщения от FXAntiXrist |
22.10.2009, 07:46 | #6 |
Пользователь
|
Re: Модификация ядра\Некоторые моды
ладно, (как я и предпологал). ну тогда может подскажет кто, как сделать допустим offline trade за новую валюту и аукцион CH????
|
22.10.2009, 07:55 | #7 |
Пользователь
|
Re: Модификация ядра\Некоторые моды
мне кажется можно в .dat файлах изменить название (адены) и картинку ее
|
FXAntiXrist |
Посмотреть профиль |
Найти ещё сообщения от FXAntiXrist |
22.10.2009, 08:26 | #8 |
Пользователь
|
Re: Модификация ядра\Некоторые моды
лады, будим крыжить... мож кто наверняк знает ???
|
26.11.2009, 22:27 | #9 |
Пользователь
|
Re: Модификация ядра\Некоторые моды
Дориан грей.. а не могли бы ВЫ поподробней рассказать, как запихнуть данный мод (сертификацию) на сервер?
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|