| 
		
	
	
	
		
	Сообщений: 32 
	Тем: 5 
	Зарегистрирован: Sep 2009
	
 Репутация: 
57 
	
	
		Мб я не все выложу и мб у некоторых этих модов нет.
Разные цвета имен рассы:
			Открыть спойлер Спойлер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_DE);
 }
 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);
 }
 }
 }
 
Ставить в l2pcinstance.java
Мод на ПвП цвета, возможно зделать даже до 20 левелов цветов ника. 
			Открыть спойлер Спойлер	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_AMOUNT1);
 }
 else if (_pvpKills >= Config.PVP_AMOUNT2 && _pvpKills < Config.PVP_AMOUNT3)
 {
 _appearance.setNameColor(Config.COLOR_FOR_AMOUNT2);
 _appearance.setTitleColor(Config.TITLE_COLOR_FOR_AMOUNT2);
 }
 else if (_pvpKills >= Config.PVP_AMOUNT3 && _pvpKills < Config.PVP_AMOUNT4)
 {
 _appearance.setNameColor(Config.COLOR_FOR_AMOUNT3);
 _appearance.setTitleColor(Config.TITLE_COLOR_FOR_AMOUNT3);
 }
 
 else if (_pvpKills >= Config.PVP_AMOUNT4 && _pvpKills < Config.PVP_AMOUNT5)
 {
 _appearance.setNameColor(Config.COLOR_FOR_AMOUNT4);
 _appearance.setTitleColor(Config.TITLE_COLOR_FOR_AMOUNT4);
 }
 else if (_pvpKills >= Config.PVP_AMOUNT5)
 {
 _appearance.setNameColor(Config.COLOR_FOR_AMOUNT5);
 _appearance.setTitleColor(Config.TITLE_COLOR_FOR_AMOUNT5);
 }
 if (oldNickColor != _appearance.getNameColor() || oldTitleColor != _appearance.getTitleColor())
 return true;
 }
 return false;
 }
 
 
Тема актуальна, по мере возможности буду вылаживать всякие моды...   
Если вы хотите какойто мод пишем суда, я выложу:p
	 
	
	
	
		
	Сообщений: 4 
	Тем: 0 
	Зарегистрирован: Oct 2009
	
 Репутация: 
0 
	
	
		и где ты вылаживаешь еще моды?
	 
	
	
	
		
	Сообщений: 32 
	Тем: 5 
	Зарегистрирован: Sep 2009
	
 Репутация: 
57 
	
	
		Если не работает сертификация, модик    
			Открыть спойлер Спойлер### 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.L2SubClassCertification;
 import net.sf.l2j.gameserver.model.L2TransformSkillLearn;
 import net.sf.l2j.gameserver.network.SystemMessageId;
 import net.sf.l2j.gameserver.network.serverpackets.AcquireSkillList;
 @@ -24,6 +25,7 @@
 import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
 +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.CertificationRemovalPrice);
 +					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.L2SubClassCertification;
 import net.sf.l2j.gameserver.model.L2TransformSkillLearn;
 import net.sf.l2j.gameserver.model.actor.L2Npc;
 import net.sf.l2j.gameserver.model.actor.instance.L2FishermanInstance;
 @@ -39,6 +40,7 @@
 import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 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().getAvailableSpecialSkills(player);
 -
 -				for (L2SkillLearn s : skillsc)
 +				if (trainer instanceof L2TransformManagerInstance) // subclass certification skills
 {
 -					L2Skill sk = SkillTable.getInstance().getInfo(s.getId(),s.getLevel());
 -
 -					if (sk == null || sk != skill)
 -						continue;
 -
 -					counts++;
 -					costid = s.getIdCost();
 -					costcount = s.getCostCount();
 -					_requiredSp = s.getSpCost();
 +					_requiredSp = 0;
 +					costid = L2SubClassCertification.getCertificateForSkill(skill.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().getAvailableSpecialSkills(player);
 +
 +					for (L2SkillLearn s : skillsc)
 +					{
 +						L2Skill sk = SkillTable.getInstance().getInfo(s.getId(),s.getLevel());
 +
 +						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.L2PcInstance;
 +
 +/**
 + *
 + * @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.getName());
 +
 +	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.L2PcInstance;
 +import net.sf.l2j.gameserver.model.itemcontainer.PcInventory;
 +import net.sf.l2j.gameserver.model.itemcontainer.PcWarehouse;
 +import net.sf.l2j.gameserver.network.SystemMessageId;
 +import net.sf.l2j.gameserver.network.serverpackets.AcquireSkillList;
 +import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
 +import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 +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.Special);
 +
 +				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("SubClassCertification", 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(player, 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(player);
 +
 +		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.CertificateEnchanterAbility:
 +				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.TransformSealbookDivineEnchanter:
 +				itemName = "Transform Sealbook - Divine Enchanter";
 +				break;
 +			case L2SubClassCertification.TransformSealbookDivineHealer:
 +				itemName = "Transform Sealbook - Divine Healer";
 +				break;
 +			case L2SubClassCertification.TransformSealbookDivineKnight:
 +				itemName = "Transform Sealbook - Divine Knight";
 +				break;
 +			case L2SubClassCertification.TransformSealbookDivineRogue:
 +				itemName = "Transform Sealbook - Divine Rogue";
 +				break;
 +			case L2SubClassCertification.TransformSealbookDivineSummoner:
 +				itemName = "Transform Sealbook - Divine Summoner";
 +				break;
 +			case L2SubClassCertification.TransformSealbookDivineWarrior:
 +				itemName = "Transform Sealbook - Divine Warrior";
 +				break;
 +			case L2SubClassCertification.TransformSealbookDivineWizard:
 +				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.L2SubClassCertification;
 import net.sf.l2j.gameserver.model.L2TransformSkillLearn;
 import net.sf.l2j.gameserver.model.actor.L2Npc;
 import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
 @@ -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(skillId);
 +				asi.addRequirement(1, certificateId, 1, 0);
 +				sendPacket(asi);
 +				return;
 +			}
 +
 int costid = 0;
 int costcount = 0;
 L2SkillLearn[] skillsc = SkillTreeTable.getInstance().getAvailableSpecialSkills(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.CastleManager;
 import net.sf.l2j.gameserver.instancemanager.FortManager;
 import net.sf.l2j.gameserver.instancemanager.FortSiegeManager;
 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.L2SubClassCertification;
 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.AcquireSkillList;
 import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.network.serverpackets.ExBrExtraUserInfo;
 +import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
 +import net.sf.l2j.gameserver.network.serverpackets.ItemList;
 import net.sf.l2j.gameserver.network.serverpackets.MagicSkillLaunched;
 import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
 import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 import net.sf.l2j.gameserver.network.serverpackets.UserInfo;
 import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
 +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(player);
 +                	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(itemId),
 +                                        "</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(requestedCertificateId), "<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
 
 
делаем файл .patch и суем в эклипс, либо тупо удаляем все плюсики...:p
	 
	
	
	
		
	Сообщений: 19 
	Тем: 3 
	Зарегистрирован: Oct 2008
	
 Репутация: 
0 
	
	
		Извеняюсь, может пишу не по теме, подскажите как добавить ещё одну валюту. если я не ошибаюсь то править надо в ядре ????!!!!!!
	 
	
	
	
		
	Сообщений: 169 
	Тем: 6 
	Зарегистрирован: Sep 2009
	
 Репутация: 
41 
	
	
		да нет, тупо добавляешь ее дроп всем мобам и пишешь для нее мультиселлы =)
	 
	
	
	
		
	Сообщений: 19 
	Тем: 3 
	Зарегистрирован: Oct 2008
	
 Репутация: 
0 
	
	
		ладно, (как я и предпологал). ну тогда может подскажет кто, как сделать допустим offline trade за новую валюту и аукцион CH????
	 
	
	
	
		
	Сообщений: 169 
	Тем: 6 
	Зарегистрирован: Sep 2009
	
 Репутация: 
41 
	
	
		мне кажется можно в .dat файлах изменить название (адены) и картинку ее
	 
	
	
	
		
	Сообщений: 19 
	Тем: 3 
	Зарегистрирован: Oct 2008
	
 Репутация: 
0 
	
	
		лады, будим крыжить... мож кто наверняк знает ???
	 
	
	
	
		
	Сообщений: 13 
	Тем: 4 
	Зарегистрирован: Sep 2009
	
 Репутация: 
0 
	
	
		Дориан грей.. а не могли бы ВЫ поподробней рассказать, как запихнуть данный мод (сертификацию) на сервер?
	 
	
	
	
		
	Сообщений: 6,450 
	Тем: 262 
	Зарегистрирован: Nov 2007
	
 Репутация: 
44,165 |