Модификация ядра\Некоторые моды - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Тех-документация

Тех-документация Статьи по редактированию, компиляции и настройки ява серверов Lineage 2

Ответ
Опции темы
Непрочитано 11.10.2009, 08:50   #1
Аватар для DorianGrey
Пользователь

Автор темы (Топик Стартер) Модификация ядра\Некоторые моды

Мб я не все выложу и мб у некоторых этих модов нет.

Разные цвета имен рассы:
[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]

Тема актуальна, по мере возможности буду вылаживать всякие моды...

Если вы хотите какойто мод пишем суда, я выложу
DorianGrey вне форума Отправить сообщение для DorianGrey с помощью ICQ Отправить сообщение для DorianGrey с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 11.10.2009, 15:31   #2
Аватар для TheFosT
Пользователь

По умолчанию Re: Модификация ядра\Некоторые моды

и где ты вылаживаешь еще моды?
TheFosT вне форума Ответить с цитированием
Непрочитано 11.10.2009, 16:46   #3
Аватар для DorianGrey
Пользователь

Автор темы (Топик Стартер) 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 и суем в эклипс, либо тупо удаляем все плюсики...
DorianGrey вне форума Отправить сообщение для DorianGrey с помощью ICQ Отправить сообщение для DorianGrey с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 20.10.2009, 23:55   #4
Аватар для StyleEG
Пользователь

По умолчанию Re: Модификация ядра\Некоторые моды

Извеняюсь, может пишу не по теме, подскажите как добавить ещё одну валюту. если я не ошибаюсь то править надо в ядре ????!!!!!!
StyleEG вне форума Ответить с цитированием
Непрочитано 21.10.2009, 08:02   #5
Аватар для FXAntiXrist
Пользователь

По умолчанию Re: Модификация ядра\Некоторые моды

да нет, тупо добавляешь ее дроп всем мобам и пишешь для нее мультиселлы =)
__________________
FXAntiXrist вне форума Ответить с цитированием
Непрочитано 22.10.2009, 07:46   #6
Аватар для StyleEG
Пользователь

По умолчанию Re: Модификация ядра\Некоторые моды

ладно, (как я и предпологал). ну тогда может подскажет кто, как сделать допустим offline trade за новую валюту и аукцион CH????
StyleEG вне форума Ответить с цитированием
Непрочитано 22.10.2009, 07:55   #7
Аватар для FXAntiXrist
Пользователь

По умолчанию Re: Модификация ядра\Некоторые моды

мне кажется можно в .dat файлах изменить название (адены) и картинку ее
__________________
FXAntiXrist вне форума Ответить с цитированием
Непрочитано 22.10.2009, 08:26   #8
Аватар для StyleEG
Пользователь

По умолчанию Re: Модификация ядра\Некоторые моды

лады, будим крыжить... мож кто наверняк знает ???
StyleEG вне форума Ответить с цитированием
Непрочитано 26.11.2009, 22:27   #9
Пользователь

По умолчанию Re: Модификация ядра\Некоторые моды

Дориан грей.. а не могли бы ВЫ поподробней рассказать, как запихнуть данный мод (сертификацию) на сервер?
GanGreLL вне форума Ответить с цитированием
Непрочитано 27.11.2009, 07:12   #10
Аватар для PROGRAMMATOR
Администратор

По умолчанию Re: Модификация ядра\Некоторые моды

http://zone-game.info/apply_patch_and_diff.html
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR вне форума Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 23:19. Часовой пояс GMT +3.

Вверх