فهرست منبع

BETA: Unhardcoding Avant-Garde AI.
* Minor packets rework/cleanup.
* Replacing Javolution in AcquireSkillList with Java implementation.
* AcquireSkillType enum to uppercase.
* Making some method from Quest static.

Zoey76 12 سال پیش
والد
کامیت
2c12a4c7d4
16فایلهای تغییر یافته به همراه175 افزوده شده و 538 حذف شده
  1. 8 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/SkillTreesData.java
  2. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Object.java
  3. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CastleMagicianInstance.java
  4. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2FishermanInstance.java
  5. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2FortSupportCaptainInstance.java
  6. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2NpcInstance.java
  7. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TrainerHealersInstance.java
  8. 0 368
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TransformManagerInstance.java
  9. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterInstance.java
  10. 14 9
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/base/AcquireSkillType.java
  11. 46 44
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/quest/Quest.java
  12. 14 23
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/quest/QuestState.java
  13. 53 29
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkill.java
  14. 22 43
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkillInfo.java
  15. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AcquireSkillInfo.java
  16. 9 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AcquireSkillList.java

+ 8 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/SkillTreesData.java

@@ -840,28 +840,28 @@ public final class SkillTreesData extends DocumentParser
 		L2SkillLearn sl = null;
 		switch (skillType)
 		{
-			case Class:
+			case CLASS:
 				sl = getClassSkill(id, lvl, player.getLearningClass());
 				break;
-			case Transform:
+			case TRANSFORM:
 				sl = getTransformSkill(id, lvl);
 				break;
-			case Fishing:
+			case FISHING:
 				sl = getFishingSkill(id, lvl);
 				break;
-			case Pledge:
+			case PLEDGE:
 				sl = getPledgeSkill(id, lvl);
 				break;
-			case SubPledge:
+			case SUBPLEDGE:
 				sl = getSubPledgeSkill(id, lvl);
 				break;
-			case Transfer:
+			case TRANSFER:
 				sl = getTransferSkill(id, lvl, player.getClassId());
 				break;
-			case SubClass:
+			case SUBCLASS:
 				sl = getSubClassSkill(id, lvl);
 				break;
-			case Collect:
+			case COLLECT:
 				sl = getCollectSkill(id, lvl);
 				break;
 		}

+ 0 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Object.java

@@ -161,7 +161,6 @@ public abstract class L2Object
 		L2TeleporterInstance(L2Npc),
 		L2TrainerInstance(L2NpcInstance),
 		L2TrainerHealersInstance(L2TrainerInstance),
-		L2TransformManagerInstance(L2MerchantInstance),
 		L2VillageMasterInstance(L2NpcInstance),
 		L2WyvernManagerInstance(L2NpcInstance),
 		// Doormens

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CastleMagicianInstance.java

@@ -364,7 +364,7 @@ public class L2CastleMagicianInstance extends L2NpcInstance implements L2SquadTr
 			if (player.isClanLeader())
 			{
 				final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableSubPledgeSkills(player.getClan());
-				final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.SubPledge);
+				final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.SUBPLEDGE);
 				int count = 0;
 				
 				for (L2SkillLearn s : skills)

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2FishermanInstance.java

@@ -71,7 +71,7 @@ public final class L2FishermanInstance extends L2MerchantInstance
 	public static void showFishSkillList(L2PcInstance player)
 	{
 		final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableFishingSkills(player);
-		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.Fishing);
+		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.FISHING);
 		
 		int count = 0;
 		

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2FortSupportCaptainInstance.java

@@ -150,7 +150,7 @@ public class L2FortSupportCaptainInstance extends L2MerchantInstance implements
 			if (player.isClanLeader())
 			{
 				final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableSubPledgeSkills(player.getClan());
-				final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.SubPledge);
+				final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.SUBPLEDGE);
 				int count = 0;
 				
 				for (L2SkillLearn s : skills)

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2NpcInstance.java

@@ -80,7 +80,7 @@ public class L2NpcInstance extends L2Npc
 		if (npcId == 32611) // Tolonis (Officer)
 		{
 			final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableCollectSkills(player);
-			final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.Collect);
+			final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.COLLECT);
 			
 			int counts = 0;
 			for (L2SkillLearn s : skills)
@@ -132,7 +132,7 @@ public class L2NpcInstance extends L2Npc
 		
 		// Normal skills, No LearnedByFS, no AutoGet skills.
 		final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableSkills(player, classId, false, false);
-		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.Class);
+		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.CLASS);
 		int count = 0;
 		player.setLearningClass(classId);
 		for (L2SkillLearn s : skills)

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TrainerHealersInstance.java

@@ -143,7 +143,7 @@ public final class L2TrainerHealersInstance extends L2TrainerInstance
 	public static void showTransferSkillList(L2PcInstance player)
 	{
 		final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableTransferSkills(player);
-		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.Transfer);
+		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.TRANSFER);
 		int count = 0;
 		
 		for (L2SkillLearn s : skills)

+ 0 - 368
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TransformManagerInstance.java

@@ -1,368 +0,0 @@
-/*
- * Copyright (C) 2004-2013 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server 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.
- * 
- * L2J Server 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 com.l2jserver.gameserver.model.actor.instance;
-
-import java.util.List;
-
-import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.MultiSell;
-import com.l2jserver.gameserver.datatables.SkillTable;
-import com.l2jserver.gameserver.datatables.SkillTreesData;
-import com.l2jserver.gameserver.instancemanager.QuestManager;
-import com.l2jserver.gameserver.model.L2SkillLearn;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
-import com.l2jserver.gameserver.model.base.AcquireSkillType;
-import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
-import com.l2jserver.gameserver.model.quest.QuestState;
-import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList;
-import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
-import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
-import com.l2jserver.gameserver.util.Util;
-
-/**
- * This class manage the Transformation Master:<br>
- * Sub-Class Certification system, skill learning and certification cancelling.<br>
- * Transformation skill learning and transformation buying.
- * @author Zoey76
- */
-public final class L2TransformManagerInstance extends L2MerchantInstance
-{
-	private static final String htmlFolder = "data/html/masterTransformation/";
-	
-	public static final String[] _questVarNames =
-	{
-		"EmergentAbility65-",
-		"EmergentAbility70-",
-		"ClassAbility75-",
-		"ClassAbility80-"
-	};
-	
-	private static final int[] _itemsIds =
-	{
-		10280,
-		10281,
-		10282,
-		10283,
-		10284,
-		10285,
-		10286,
-		10287,
-		10288,
-		10289,
-		10290,
-		10291,
-		10292,
-		10293,
-		10294,
-		10612
-	};
-	
-	public L2TransformManagerInstance(int objectId, L2NpcTemplate template)
-	{
-		super(objectId, template);
-		setInstanceType(InstanceType.L2TransformManagerInstance);
-	}
-	
-	@Override
-	public String getHtmlPath(int npcId, int val)
-	{
-		return htmlFolder + "master_transformation001.htm";
-	}
-	
-	@Override
-	public void onBypassFeedback(L2PcInstance player, String command)
-	{
-		if (command.startsWith("LearnTransformationSkill"))
-		{
-			if (canTransform(player))
-			{
-				showTransformSkillList(player);
-			}
-			else
-			{
-				final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-				html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation003.htm");
-				player.sendPacket(html);
-			}
-			return;
-		}
-		else if (command.startsWith("BuyTransformationItems"))
-		{
-			if (canTransform(player))
-			{
-				MultiSell.getInstance().separateAndSend(32323001, player, this, false);
-			}
-			else
-			{
-				NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-				html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation004.htm");
-				player.sendPacket(html);
-			}
-			return;
-		}
-		else if (command.startsWith("LearnSubClassSkill"))
-		{
-			if (!canTransform(player))
-			{
-				NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-				html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation004.htm");
-				player.sendPacket(html);
-				return;
-			}
-			if (player.isSubClassActive())
-			{
-				NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-				html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation008.htm");
-				player.sendPacket(html);
-			}
-			else
-			{
-				boolean hasItems = false;
-				for (int i : _itemsIds)
-				{
-					if (player.getInventory().getItemByItemId(i) != null)
-					{
-						hasItems = true;
-						break;
-					}
-				}
-				if (hasItems)
-				{
-					showSubClassSkillList(player);
-				}
-				else
-				{
-					final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-					html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation008.htm");
-					player.sendPacket(html);
-				}
-			}
-			return;
-		}
-		else if (command.startsWith("CancelCertification"))
-		{
-			final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-			if (player.getSubClasses().size() == 0)
-			{
-				html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation007.htm");
-			}
-			else if (player.isSubClassActive())
-			{
-				html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation008.htm");
-			}
-			else if (player.getAdena() < Config.FEE_DELETE_SUBCLASS_SKILLS)
-			{
-				html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation008no.htm");
-			}
-			else
-			{
-				QuestState st = player.getQuestState("SubClassSkills");
-				if (st == null)
-				{
-					st = QuestManager.getInstance().getQuest("SubClassSkills").newQuestState(player);
-				}
-				
-				int activeCertifications = 0;
-				for (String varName : _questVarNames)
-				{
-					for (int i = 1; i <= Config.MAX_SUBCLASS; i++)
-					{
-						String qvar = st.getGlobalQuestVar(varName + i);
-						if (!qvar.isEmpty() && (qvar.endsWith(";") || !qvar.equals("0")))
-						{
-							activeCertifications++;
-						}
-					}
-				}
-				if (activeCertifications == 0)
-				{
-					html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation010no.htm");
-				}
-				else
-				{
-					for (String varName : _questVarNames)
-					{
-						for (int i = 1; i <= Config.MAX_SUBCLASS; i++)
-						{
-							final String qvarName = varName + i;
-							final String qvar = st.getGlobalQuestVar(qvarName);
-							if (qvar.endsWith(";"))
-							{
-								final String skillIdVar = qvar.replace(";", "");
-								if (Util.isDigit(skillIdVar))
-								{
-									int skillId = Integer.parseInt(skillIdVar);
-									final L2Skill sk = SkillTable.getInstance().getInfo(skillId, 1);
-									if (sk != null)
-									{
-										player.removeSkill(sk);
-										st.saveGlobalQuestVar(qvarName, "0");
-									}
-								}
-								else
-								{
-									_log.warning("Invalid Sub-Class Skill Id: " + skillIdVar + " for player " + player.getName() + "!");
-								}
-							}
-							else if (!qvar.isEmpty() && !qvar.equals("0"))
-							{
-								if (Util.isDigit(qvar))
-								{
-									final int itemObjId = Integer.parseInt(qvar);
-									L2ItemInstance itemInstance = player.getInventory().getItemByObjectId(itemObjId);
-									if (itemInstance != null)
-									{
-										player.destroyItem("CancelCertification", itemObjId, 1, player, false);
-									}
-									else
-									{
-										itemInstance = player.getWarehouse().getItemByObjectId(itemObjId);
-										if (itemInstance != null)
-										{
-											_log.warning("Somehow " + player.getName() + " put a certification book into warehouse!");
-											player.getWarehouse().destroyItem("CancelCertification", itemInstance, 1, player, false);
-										}
-										else
-										{
-											_log.warning("Somehow " + player.getName() + " deleted a certification book!");
-										}
-									}
-									st.saveGlobalQuestVar(qvarName, "0");
-								}
-								else
-								{
-									_log.warning("Invalid item object Id: " + qvar + " for player " + player.getName() + "!");
-								}
-							}
-						}
-					}
-					
-					player.reduceAdena("Cleanse", Config.FEE_DELETE_SUBCLASS_SKILLS, this, true);
-					html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation009no.htm");
-					player.sendSkillList();
-				}
-				
-				// Let's consume all certification books, even those not present in database.
-				L2ItemInstance itemInstance = null;
-				for (int itemId : _itemsIds)
-				{
-					itemInstance = player.getInventory().getItemByItemId(itemId);
-					if (itemInstance != null)
-					{
-						_log.warning(getClass().getName() + ": player " + player + " had 'extra' certification skill books while cancelling sub-class certifications!");
-						player.destroyItem("CancelCertificationExtraBooks", itemInstance, this, false);
-					}
-				}
-			}
-			player.sendPacket(html);
-			return;
-		}
-		super.onBypassFeedback(player, command);
-	}
-	
-	// Transformations:
-	/**
-	 * @param player the player to verify.
-	 * @return {code true} if {code player} meets the required conditions to learn a transformation.
-	 */
-	public static boolean canTransform(L2PcInstance player)
-	{
-		if (Config.ALLOW_TRANSFORM_WITHOUT_QUEST)
-		{
-			return true;
-		}
-		final QuestState st = player.getQuestState("Q00136_MoreThanMeetsTheEye");
-		if ((st != null) && st.isCompleted())
-		{
-			return true;
-		}
-		return false;
-	}
-	
-	/**
-	 * This displays Transformation Skill List to the player.
-	 * @param player the active character.
-	 */
-	public static void showTransformSkillList(L2PcInstance player)
-	{
-		final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableTransformSkills(player);
-		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.Transform);
-		int counts = 0;
-		
-		for (L2SkillLearn s : skills)
-		{
-			if (SkillTable.getInstance().getInfo(s.getSkillId(), s.getSkillLevel()) != null)
-			{
-				counts++;
-				asl.addSkill(s.getSkillId(), s.getSkillLevel(), s.getSkillLevel(), s.getLevelUpSp(), 0);
-			}
-		}
-		
-		if (counts == 0)
-		{
-			final int minlevel = SkillTreesData.getInstance().getMinLevelForNewSkill(player, SkillTreesData.getInstance().getTransformSkillTree());
-			if (minlevel > 0)
-			{
-				// No more skills to learn, come back when you level.
-				final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1);
-				sm.addNumber(minlevel);
-				player.sendPacket(sm);
-			}
-			else
-			{
-				player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
-			}
-		}
-		else
-		{
-			player.sendPacket(asl);
-		}
-	}
-	
-	// SubClass:
-	/**
-	 * This displays Sub-Class Skill List to the player.
-	 * @param player the active character.
-	 */
-	public static void showSubClassSkillList(L2PcInstance player)
-	{
-		final List<L2SkillLearn> subClassSkills = SkillTreesData.getInstance().getAvailableSubClassSkills(player);
-		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.SubClass);
-		int count = 0;
-		
-		for (L2SkillLearn s : subClassSkills)
-		{
-			if (SkillTable.getInstance().getInfo(s.getSkillId(), s.getSkillLevel()) != null)
-			{
-				count++;
-				asl.addSkill(s.getSkillId(), s.getSkillLevel(), s.getSkillLevel(), 0, 0);
-			}
-		}
-		if (count > 0)
-		{
-			player.sendPacket(asl);
-		}
-		else
-		{
-			player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
-		}
-	}
-}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterInstance.java

@@ -1182,7 +1182,7 @@ public class L2VillageMasterInstance extends L2NpcInstance
 		}
 		
 		final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailablePledgeSkills(player.getClan());
-		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.Pledge);
+		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.PLEDGE);
 		int counts = 0;
 		
 		for (L2SkillLearn s : skills)

+ 14 - 9
L2J_Server_BETA/java/com/l2jserver/gameserver/model/base/AcquireSkillType.java

@@ -19,17 +19,22 @@
 package com.l2jserver.gameserver.model.base;
 
 /**
- * Enumerate containing learning skill types.
+ * Learning skill types.
  * @author Zoey76
  */
 public enum AcquireSkillType
 {
-	Class,
-	Fishing,
-	Pledge,
-	SubPledge,
-	Transform,
-	Transfer,
-	SubClass,
-	Collect
+	CLASS,
+	FISHING,
+	PLEDGE,
+	SUBPLEDGE,
+	TRANSFORM,
+	TRANSFER,
+	SUBCLASS,
+	COLLECT;
+	
+	public static AcquireSkillType getAcquireSkillType(int id)
+	{
+		return values()[id];
+	}
 }

+ 46 - 44
L2J_Server_BETA/java/com/l2jserver/gameserver/model/quest/Quest.java

@@ -59,6 +59,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
+import com.l2jserver.gameserver.model.base.AcquireSkillType;
 import com.l2jserver.gameserver.model.entity.Instance;
 import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.interfaces.IL2Procedure;
@@ -836,9 +837,10 @@ public class Quest extends ManagedScript
 	}
 	
 	/**
-	 * @param npc
-	 * @param player
-	 * @param skill
+	 * Notify the quest engine that an skill info has been acquired.
+	 * @param npc the NPC
+	 * @param player the player
+	 * @param skill the skill
 	 */
 	public final void notifyAcquireSkillInfo(L2Npc npc, L2PcInstance player, L2Skill skill)
 	{
@@ -855,16 +857,18 @@ public class Quest extends ManagedScript
 	}
 	
 	/**
-	 * @param npc
-	 * @param player
-	 * @param skill
+	 * Notify the quest engine that an skill has been acquired.
+	 * @param npc the NPC
+	 * @param player the player
+	 * @param skill the skill
+	 * @param type the skill learn type
 	 */
-	public final void notifyAcquireSkill(L2Npc npc, L2PcInstance player, L2Skill skill)
+	public final void notifyAcquireSkill(L2Npc npc, L2PcInstance player, L2Skill skill, AcquireSkillType type)
 	{
 		String res = null;
 		try
 		{
-			res = onAcquireSkill(npc, player, skill);
+			res = onAcquireSkill(npc, player, skill, type);
 		}
 		catch (Exception e)
 		{
@@ -1309,8 +1313,7 @@ public class Quest extends ManagedScript
 	}
 	
 	/**
-	 * This function is called whenever a player request a skill info.<br>
-	 * TODO: Re-implement, since Skill Trees rework it's support was removed.
+	 * This function is called whenever a player request a skill info.
 	 * @param npc this parameter contains a reference to the exact instance of the NPC that the player requested the skill info.
 	 * @param player this parameter contains a reference to the exact instance of the player who requested the skill info.
 	 * @param skill this parameter contains a reference to the skill that the player requested its info.
@@ -1327,9 +1330,10 @@ public class Quest extends ManagedScript
 	 * @param npc this parameter contains a reference to the exact instance of the NPC that the player requested the skill.
 	 * @param player this parameter contains a reference to the exact instance of the player who requested the skill.
 	 * @param skill this parameter contains a reference to the skill that the player requested.
+	 * @param type the skill learn type
 	 * @return
 	 */
-	public String onAcquireSkill(L2Npc npc, L2PcInstance player, L2Skill skill)
+	public String onAcquireSkill(L2Npc npc, L2PcInstance player, L2Skill skill, AcquireSkillType type)
 	{
 		return null;
 	}
@@ -2623,7 +2627,7 @@ public class Quest extends ManagedScript
 	 * @param cha
 	 * @return instance of newly spawned npc
 	 */
-	public L2Npc addSpawn(int npcId, L2Character cha)
+	public static L2Npc addSpawn(int npcId, L2Character cha)
 	{
 		return addSpawn(npcId, cha.getX(), cha.getY(), cha.getZ(), cha.getHeading(), false, 0, false, 0);
 	}
@@ -2635,7 +2639,7 @@ public class Quest extends ManagedScript
 	 * @param isSummonSpawn
 	 * @return instance of newly spawned npc with summon animation
 	 */
-	public L2Npc addSpawn(int npcId, L2Character cha, boolean isSummonSpawn)
+	public static L2Npc addSpawn(int npcId, L2Character cha, boolean isSummonSpawn)
 	{
 		return addSpawn(npcId, cha.getX(), cha.getY(), cha.getZ(), cha.getHeading(), false, 0, isSummonSpawn, 0);
 	}
@@ -2650,7 +2654,7 @@ public class Quest extends ManagedScript
 	 * @param despawnDelay
 	 * @return
 	 */
-	public L2Npc addSpawn(int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay)
+	public static L2Npc addSpawn(int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay)
 	{
 		return addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay, false, 0);
 	}
@@ -2662,7 +2666,7 @@ public class Quest extends ManagedScript
 	 * @param despawnDelay
 	 * @return
 	 */
-	public L2Npc addSpawn(int npcId, Location loc, boolean randomOffSet, long despawnDelay)
+	public static L2Npc addSpawn(int npcId, Location loc, boolean randomOffSet, long despawnDelay)
 	{
 		return addSpawn(npcId, loc.getX(), loc.getY(), loc.getZ(), loc.getHeading(), randomOffSet, despawnDelay, false, 0);
 	}
@@ -2678,7 +2682,7 @@ public class Quest extends ManagedScript
 	 * @param isSummonSpawn
 	 * @return
 	 */
-	public L2Npc addSpawn(int npcId, int x, int y, int z, int heading, boolean randomOffset, long despawnDelay, boolean isSummonSpawn)
+	public static L2Npc addSpawn(int npcId, int x, int y, int z, int heading, boolean randomOffset, long despawnDelay, boolean isSummonSpawn)
 	{
 		return addSpawn(npcId, x, y, z, heading, randomOffset, despawnDelay, isSummonSpawn, 0);
 	}
@@ -2691,7 +2695,7 @@ public class Quest extends ManagedScript
 	 * @param isSummonSpawn
 	 * @return
 	 */
-	public L2Npc addSpawn(int npcId, Location loc, boolean randomOffset, long despawnDelay, boolean isSummonSpawn)
+	public static L2Npc addSpawn(int npcId, Location loc, boolean randomOffset, long despawnDelay, boolean isSummonSpawn)
 	{
 		return addSpawn(npcId, loc.getX(), loc.getY(), loc.getZ(), loc.getHeading(), randomOffset, despawnDelay, isSummonSpawn, 0);
 	}
@@ -2705,7 +2709,7 @@ public class Quest extends ManagedScript
 	 * @param instanceId
 	 * @return
 	 */
-	public L2Npc addSpawn(int npcId, Location loc, boolean randomOffset, long despawnDelay, boolean isSummonSpawn, int instanceId)
+	public static L2Npc addSpawn(int npcId, Location loc, boolean randomOffset, long despawnDelay, boolean isSummonSpawn, int instanceId)
 	{
 		return addSpawn(npcId, loc.getX(), loc.getY(), loc.getZ(), loc.getHeading(), randomOffset, despawnDelay, isSummonSpawn, instanceId);
 	}
@@ -2722,7 +2726,7 @@ public class Quest extends ManagedScript
 	 * @param instanceId
 	 * @return
 	 */
-	public L2Npc addSpawn(int npcId, int x, int y, int z, int heading, boolean randomOffset, long despawnDelay, boolean isSummonSpawn, int instanceId)
+	public static L2Npc addSpawn(int npcId, int x, int y, int z, int heading, boolean randomOffset, long despawnDelay, boolean isSummonSpawn, int instanceId)
 	{
 		L2Npc result = null;
 		try
@@ -2975,7 +2979,7 @@ public class Quest extends ManagedScript
 	 * @param itemId the Id of the item whose amount to get
 	 * @return the amount of the specified item in player's inventory
 	 */
-	public long getQuestItemsCount(L2PcInstance player, int itemId)
+	public static long getQuestItemsCount(L2PcInstance player, int itemId)
 	{
 		return player.getInventory().getInventoryItemCount(itemId, -1);
 	}
@@ -3017,7 +3021,7 @@ public class Quest extends ManagedScript
 	 * @param itemId the Id of the item to check for
 	 * @return {@code true} if the item exists in player's inventory, {@code false} otherwise
 	 */
-	public boolean hasQuestItems(L2PcInstance player, int itemId)
+	public static boolean hasQuestItems(L2PcInstance player, int itemId)
 	{
 		return player.getInventory().getItemByItemId(itemId) != null;
 	}
@@ -3028,7 +3032,7 @@ public class Quest extends ManagedScript
 	 * @param itemIds a list of item Ids to check for
 	 * @return {@code true} if all items exist in player's inventory, {@code false} otherwise
 	 */
-	public boolean hasQuestItems(L2PcInstance player, int... itemIds)
+	public static boolean hasQuestItems(L2PcInstance player, int... itemIds)
 	{
 		final PcInventory inv = player.getInventory();
 		for (int itemId : itemIds)
@@ -3066,9 +3070,9 @@ public class Quest extends ManagedScript
 	 * @param itemId the Id of the item whose enchantment level to get
 	 * @return the enchantment level of the item or 0 if the item was not found
 	 */
-	public int getEnchantLevel(L2PcInstance player, int itemId)
+	public static int getEnchantLevel(L2PcInstance player, int itemId)
 	{
-		L2ItemInstance enchantedItem = player.getInventory().getItemByItemId(itemId);
+		final L2ItemInstance enchantedItem = player.getInventory().getItemByItemId(itemId);
 		if (enchantedItem == null)
 		{
 			return 0;
@@ -3100,15 +3104,14 @@ public class Quest extends ManagedScript
 	 * @param itemId the Id of the item to give
 	 * @param count the amount of items to give
 	 */
-	public void rewardItems(L2PcInstance player, int itemId, long count)
+	public static void rewardItems(L2PcInstance player, int itemId, long count)
 	{
 		if (count <= 0)
 		{
 			return;
 		}
 		
-		L2ItemInstance _tmpItem = ItemTable.getInstance().createDummyItem(itemId);
-		
+		final L2ItemInstance _tmpItem = ItemTable.getInstance().createDummyItem(itemId);
 		if (_tmpItem == null)
 		{
 			return;
@@ -3171,7 +3174,7 @@ public class Quest extends ManagedScript
 	 * @param item the item obtain by the player
 	 * @param count the item count
 	 */
-	private void sendItemGetMessage(L2PcInstance player, L2ItemInstance item, long count)
+	private static void sendItemGetMessage(L2PcInstance player, L2ItemInstance item, long count)
 	{
 		// If item for reward is gold, send message of gold reward to client
 		if (item.getItemId() == PcInventory.ADENA_ID)
@@ -3230,7 +3233,7 @@ public class Quest extends ManagedScript
 	 * @param count
 	 * @param enchantlevel
 	 */
-	public void giveItems(L2PcInstance player, int itemId, long count, int enchantlevel)
+	public static void giveItems(L2PcInstance player, int itemId, long count, int enchantlevel)
 	{
 		if (count <= 0)
 		{
@@ -3244,7 +3247,7 @@ public class Quest extends ManagedScript
 		}
 		
 		// Add items to player's inventory
-		L2ItemInstance item = player.getInventory().addItem("Quest", itemId, count, player, player.getTarget());
+		final L2ItemInstance item = player.getInventory().addItem("Quest", itemId, count, player, player.getTarget());
 		if (item == null)
 		{
 			return;
@@ -3266,7 +3269,7 @@ public class Quest extends ManagedScript
 	 * @param attributeId
 	 * @param attributeLevel
 	 */
-	public void giveItems(L2PcInstance player, int itemId, long count, byte attributeId, int attributeLevel)
+	public static void giveItems(L2PcInstance player, int itemId, long count, byte attributeId, int attributeLevel)
 	{
 		if (count <= 0)
 		{
@@ -3274,8 +3277,7 @@ public class Quest extends ManagedScript
 		}
 		
 		// Add items to player's inventory
-		L2ItemInstance item = player.getInventory().addItem("Quest", itemId, count, player, player.getTarget());
-		
+		final L2ItemInstance item = player.getInventory().addItem("Quest", itemId, count, player, player.getTarget());
 		if (item == null)
 		{
 			return;
@@ -3323,7 +3325,7 @@ public class Quest extends ManagedScript
 	 * @param sound
 	 * @return
 	 */
-	public boolean dropQuestItems(L2PcInstance player, int itemId, int minCount, int maxCount, long neededCount, int dropChance, boolean sound)
+	public static boolean dropQuestItems(L2PcInstance player, int itemId, int minCount, int maxCount, long neededCount, int dropChance, boolean sound)
 	{
 		dropChance *= Config.RATE_QUEST_DROP / ((player.getParty() != null) ? player.getParty().getMemberCount() : 1);
 		long currentCount = getQuestItemsCount(player, itemId);
@@ -3394,10 +3396,10 @@ public class Quest extends ManagedScript
 	 * @param amount the amount to take
 	 * @return {@code true} if any items were taken, {@code false} otherwise
 	 */
-	public boolean takeItems(L2PcInstance player, int itemId, long amount)
+	public static boolean takeItems(L2PcInstance player, int itemId, long amount)
 	{
 		// Get object item from player's inventory list
-		L2ItemInstance item = player.getInventory().getItemByItemId(itemId);
+		final L2ItemInstance item = player.getInventory().getItemByItemId(itemId);
 		if (item == null)
 		{
 			return false;
@@ -3412,7 +3414,7 @@ public class Quest extends ManagedScript
 		// Destroy the quantity of items wanted
 		if (item.isEquipped())
 		{
-			L2ItemInstance[] unequiped = player.getInventory().unEquipItemInBodySlotAndRecord(item.getItem().getBodyPart());
+			final L2ItemInstance[] unequiped = player.getInventory().unEquipItemInBodySlotAndRecord(item.getItem().getBodyPart());
 			InventoryUpdate iu = new InventoryUpdate();
 			for (L2ItemInstance itm : unequiped)
 			{
@@ -3430,7 +3432,7 @@ public class Quest extends ManagedScript
 	 * @param holder
 	 * @return {@code true} if any items were taken, {@code false} otherwise
 	 */
-	protected boolean takeItems(L2PcInstance player, ItemHolder holder)
+	protected static boolean takeItems(L2PcInstance player, ItemHolder holder)
 	{
 		return takeItems(player, holder.getId(), holder.getCount());
 	}
@@ -3442,7 +3444,7 @@ public class Quest extends ManagedScript
 	 * @param itemIds a list or an array of Ids of the items to take
 	 * @return {@code true} if all items were taken, {@code false} otherwise
 	 */
-	public boolean takeItems(L2PcInstance player, int amount, int... itemIds)
+	public static boolean takeItems(L2PcInstance player, int amount, int... itemIds)
 	{
 		boolean check = true;
 		if (itemIds != null)
@@ -3469,7 +3471,7 @@ public class Quest extends ManagedScript
 	 * @param player the player whom to send the packet
 	 * @param sound the name of the sound to play
 	 */
-	public void playSound(L2PcInstance player, String sound)
+	public static void playSound(L2PcInstance player, String sound)
 	{
 		player.sendPacket(QuestSound.getSound(sound));
 	}
@@ -3479,7 +3481,7 @@ public class Quest extends ManagedScript
 	 * @param player the player whom to send the packet
 	 * @param sound the {@link QuestSound} object of the sound to play
 	 */
-	public void playSound(L2PcInstance player, QuestSound sound)
+	public static void playSound(L2PcInstance player, QuestSound sound)
 	{
 		player.sendPacket(sound.getPacket());
 	}
@@ -3490,7 +3492,7 @@ public class Quest extends ManagedScript
 	 * @param exp the amount of EXP to give to the player
 	 * @param sp the amount of SP to give to the player
 	 */
-	public void addExpAndSp(L2PcInstance player, long exp, int sp)
+	public static void addExpAndSp(L2PcInstance player, long exp, int sp)
 	{
 		player.addExpAndSp((long) player.calcStat(Stats.EXPSP_RATE, exp * Config.RATE_QUEST_REWARD_XP, null, null), (int) player.calcStat(Stats.EXPSP_RATE, sp * Config.RATE_QUEST_REWARD_SP, null, null));
 	}
@@ -3533,7 +3535,7 @@ public class Quest extends ManagedScript
 	 * @param slot the location in the player's inventory to check
 	 * @return the Id of the item equipped in the specified inventory slot or 0 if the slot is empty or item is {@code null}.
 	 */
-	public int getItemEquipped(L2PcInstance player, int slot)
+	public static int getItemEquipped(L2PcInstance player, int slot)
 	{
 		return player.getInventory().getPaperdollItemId(slot);
 	}
@@ -3541,7 +3543,7 @@ public class Quest extends ManagedScript
 	/**
 	 * @return the number of ticks from the {@link com.l2jserver.gameserver.GameTimeController}.
 	 */
-	public int getGameTicks()
+	public static int getGameTicks()
 	{
 		return GameTimeController.getInstance().getGameTicks();
 	}

+ 14 - 23
L2J_Server_BETA/java/com/l2jserver/gameserver/model/quest/QuestState.java

@@ -613,7 +613,7 @@ public final class QuestState
 	 */
 	public long getQuestItemsCount(int itemId)
 	{
-		return getQuest().getQuestItemsCount(getPlayer(), itemId);
+		return Quest.getQuestItemsCount(getPlayer(), itemId);
 	}
 	
 	/**
@@ -622,7 +622,7 @@ public final class QuestState
 	 */
 	public boolean hasQuestItems(int itemId)
 	{
-		return getQuest().hasQuestItems(getPlayer(), itemId);
+		return Quest.hasQuestItems(getPlayer(), itemId);
 	}
 	
 	/**
@@ -631,7 +631,7 @@ public final class QuestState
 	 */
 	public boolean hasQuestItems(int... itemIds)
 	{
-		return getQuest().hasQuestItems(getPlayer(), itemIds);
+		return Quest.hasQuestItems(getPlayer(), itemIds);
 	}
 	
 	/**
@@ -641,7 +641,7 @@ public final class QuestState
 	 */
 	public int getEnchantLevel(int itemId)
 	{
-		return getQuest().getEnchantLevel(getPlayer(), itemId);
+		return Quest.getEnchantLevel(getPlayer(), itemId);
 	}
 	
 	/**
@@ -661,7 +661,7 @@ public final class QuestState
 	 */
 	public void rewardItems(int itemId, long count)
 	{
-		getQuest().rewardItems(getPlayer(), itemId, count);
+		Quest.rewardItems(getPlayer(), itemId, count);
 	}
 	
 	/**
@@ -681,12 +681,12 @@ public final class QuestState
 	
 	public void giveItems(int itemId, long count, int enchantlevel)
 	{
-		getQuest().giveItems(getPlayer(), itemId, count, enchantlevel);
+		Quest.giveItems(getPlayer(), itemId, count, enchantlevel);
 	}
 	
 	public void giveItems(int itemId, long count, byte attributeId, int attributeLevel)
 	{
-		getQuest().giveItems(getPlayer(), itemId, count, attributeId, attributeLevel);
+		Quest.giveItems(getPlayer(), itemId, count, attributeId, attributeLevel);
 	}
 	
 	/**
@@ -705,7 +705,7 @@ public final class QuestState
 	
 	public boolean dropQuestItems(int itemId, int minCount, int maxCount, long neededCount, int dropChance, boolean sound)
 	{
-		return getQuest().dropQuestItems(getPlayer(), itemId, minCount, maxCount, neededCount, dropChance, sound);
+		return Quest.dropQuestItems(getPlayer(), itemId, minCount, maxCount, neededCount, dropChance, sound);
 	}
 	
 	// TODO: More radar functions need to be added when the radar class is complete.
@@ -739,7 +739,7 @@ public final class QuestState
 	 */
 	public void takeItems(int itemId, long count)
 	{
-		getQuest().takeItems(getPlayer(), itemId, count);
+		Quest.takeItems(getPlayer(), itemId, count);
 	}
 	
 	/**
@@ -748,7 +748,7 @@ public final class QuestState
 	 */
 	public void playSound(String sound)
 	{
-		getQuest().playSound(getPlayer(), sound);
+		Quest.playSound(getPlayer(), sound);
 	}
 	
 	/**
@@ -757,7 +757,7 @@ public final class QuestState
 	 */
 	public void playSound(QuestSound sound)
 	{
-		getQuest().playSound(getPlayer(), sound);
+		Quest.playSound(getPlayer(), sound);
 	}
 	
 	/**
@@ -767,7 +767,7 @@ public final class QuestState
 	 */
 	public void addExpAndSp(int exp, int sp)
 	{
-		getQuest().addExpAndSp(getPlayer(), exp, sp);
+		Quest.addExpAndSp(getPlayer(), exp, sp);
 	}
 	
 	/**
@@ -776,16 +776,7 @@ public final class QuestState
 	 */
 	public int getItemEquipped(int loc)
 	{
-		return getQuest().getItemEquipped(getPlayer(), loc);
-	}
-	
-	/**
-	 * Return the number of ticks from the GameTimeController
-	 * @return int
-	 */
-	public int getGameTicks()
-	{
-		return getQuest().getGameTicks();
+		return Quest.getItemEquipped(getPlayer(), loc);
 	}
 	
 	/**
@@ -993,7 +984,7 @@ public final class QuestState
 	 */
 	public L2Npc addSpawn(int npcId, int x, int y, int z, int heading, boolean randomOffset, int despawnDelay, boolean isSummonSpawn)
 	{
-		return getQuest().addSpawn(npcId, x, y, z, heading, randomOffset, despawnDelay, isSummonSpawn);
+		return Quest.addSpawn(npcId, x, y, z, heading, randomOffset, despawnDelay, isSummonSpawn);
 	}
 	
 	/**

+ 53 - 29
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkill.java

@@ -30,13 +30,13 @@ import com.l2jserver.gameserver.model.actor.instance.L2FishermanInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2TrainerHealersInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2TransformManagerInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2VillageMasterInstance;
 import com.l2jserver.gameserver.model.base.AcquireSkillType;
 import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.quest.Quest.QuestEventType;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -48,15 +48,23 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.util.Util;
 
 /**
+ * Request Acquire Skill client packet implementation.
  * @author Zoey76
  */
 public final class RequestAcquireSkill extends L2GameClientPacket
 {
 	private static final String _C__7C_REQUESTACQUIRESKILL = "[C] 7C RequestAcquireSkill";
+	private static final String[] QUEST_VAR_NAMES =
+	{
+		"EmergentAbility65-",
+		"EmergentAbility70-",
+		"ClassAbility75-",
+		"ClassAbility80-"
+	};
 	
 	private int _id;
 	private int _level;
-	private int _skillType;
+	private AcquireSkillType _skillType;
 	private int _subType;
 	
 	@Override
@@ -64,8 +72,8 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 	{
 		_id = readD();
 		_level = readD();
-		_skillType = readD();
-		if (_skillType == AcquireSkillType.SubPledge.ordinal())
+		_skillType = AcquireSkillType.getAcquireSkillType(readD());
+		if (_skillType == AcquireSkillType.SUBPLEDGE)
 		{
 			_subType = readD();
 		}
@@ -107,8 +115,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 		
 		// Hack check. Doesn't apply to all Skill Types
 		final int prevSkillLevel = activeChar.getSkillLevel(_id);
-		final AcquireSkillType skillType = AcquireSkillType.values()[_skillType];
-		if ((prevSkillLevel > 0) && !((skillType == AcquireSkillType.Transfer) || (skillType == AcquireSkillType.SubPledge)))
+		if ((prevSkillLevel > 0) && !((_skillType == AcquireSkillType.TRANSFER) || (_skillType == AcquireSkillType.SUBPLEDGE)))
 		{
 			if (prevSkillLevel == _level)
 			{
@@ -124,15 +131,15 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 			}
 		}
 		
-		final L2SkillLearn s = SkillTreesData.getInstance().getSkillLearn(skillType, _id, _level, activeChar);
+		final L2SkillLearn s = SkillTreesData.getInstance().getSkillLearn(_skillType, _id, _level, activeChar);
 		if (s == null)
 		{
 			return;
 		}
 		
-		switch (skillType)
+		switch (_skillType)
 		{
-			case Class:
+			case CLASS:
 			{
 				if (checkPlayerSkill(activeChar, trainer, s))
 				{
@@ -140,10 +147,10 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 				}
 				break;
 			}
-			case Transform:
+			case TRANSFORM:
 			{
 				// Hack check.
-				if (!L2TransformManagerInstance.canTransform(activeChar))
+				if (!canTransform(activeChar))
 				{
 					activeChar.sendPacket(SystemMessageId.NOT_COMPLETED_QUEST_FOR_SKILL_ACQUISITION);
 					Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " is requesting skill Id: " + _id + " level " + _level + " without required quests!", 0);
@@ -156,7 +163,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 				}
 				break;
 			}
-			case Fishing:
+			case FISHING:
 			{
 				if (checkPlayerSkill(activeChar, trainer, s))
 				{
@@ -164,7 +171,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 				}
 				break;
 			}
-			case Pledge:
+			case PLEDGE:
 			{
 				if (!activeChar.isClanLeader())
 				{
@@ -215,7 +222,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 				}
 				break;
 			}
-			case SubPledge:
+			case SUBPLEDGE:
 			{
 				if (!activeChar.isClanLeader())
 				{
@@ -275,7 +282,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 				}
 				break;
 			}
-			case Transfer:
+			case TRANSFER:
 			{
 				if (checkPlayerSkill(activeChar, trainer, s))
 				{
@@ -283,7 +290,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 				}
 				break;
 			}
-			case SubClass:
+			case SUBCLASS:
 			{
 				// Hack check.
 				if (activeChar.isSubClassActive())
@@ -308,7 +315,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 					}
 				}
 				
-				for (String varName : L2TransformManagerInstance._questVarNames)
+				for (String varName : QUEST_VAR_NAMES)
 				{
 					for (int i = 1; i <= Config.MAX_SUBCLASS; i++)
 					{
@@ -353,7 +360,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 				showSkillList(trainer, activeChar);
 				break;
 			}
-			case Collect:
+			case COLLECT:
 			{
 				if (checkPlayerSkill(activeChar, trainer, s))
 				{
@@ -491,16 +498,26 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 		{
 			player.sendPacket(new ExStorageMaxCount(player));
 		}
+		// Notify scripts of the skill learn.
+		for (Quest quest : trainer.getTemplate().getEventQuests(QuestEventType.ON_SKILL_LEARN))
+		{
+			quest.notifyAcquireSkill(trainer, player, skill, _skillType);
+		}
 	}
 	
 	/**
 	 * Wrapper for returning the skill list to the player after it's done with current skill.
-	 * @param trainer the Npc which the {@code player} is interacting.
-	 * @param player the active character.
+	 * @param trainer the Npc which the {@code player} is interacting
+	 * @param player the active character
 	 */
 	private void showSkillList(L2Npc trainer, L2PcInstance player)
 	{
-		if ((trainer instanceof L2TrainerHealersInstance) && (_skillType == AcquireSkillType.Transfer.ordinal()))
+		if ((_skillType == AcquireSkillType.TRANSFORM) || (_skillType == AcquireSkillType.SUBCLASS))
+		{
+			// Managed in Datapack.
+			return;
+		}
+		if ((trainer instanceof L2TrainerHealersInstance) && (_skillType == AcquireSkillType.TRANSFER))
 		{
 			L2TrainerHealersInstance.showTransferSkillList(player);
 		}
@@ -508,20 +525,27 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 		{
 			L2FishermanInstance.showFishSkillList(player);
 		}
-		else if ((trainer instanceof L2TransformManagerInstance) && (_skillType == AcquireSkillType.Transform.ordinal()))
-		{
-			L2TransformManagerInstance.showTransformSkillList(player);
-		}
-		else if ((trainer instanceof L2TransformManagerInstance) && (_skillType == AcquireSkillType.SubClass.ordinal()))
-		{
-			L2TransformManagerInstance.showSubClassSkillList(player);
-		}
 		else
 		{
 			L2NpcInstance.showSkillList(player, trainer, player.getLearningClass());
 		}
 	}
 	
+	/**
+	 * Verify if the player can transform.
+	 * @param player the player to verify
+	 * @return {@code true} if the player meets the required conditions to learn a transformation, {@code false} otherwise
+	 */
+	public static boolean canTransform(L2PcInstance player)
+	{
+		if (Config.ALLOW_TRANSFORM_WITHOUT_QUEST)
+		{
+			return true;
+		}
+		final QuestState st = player.getQuestState("Q00136_MoreThanMeetsTheEye");
+		return (st != null) && st.isCompleted();
+	}
+	
 	@Override
 	public String getType()
 	{

+ 22 - 43
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkillInfo.java

@@ -30,6 +30,7 @@ import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.network.serverpackets.AcquireSkillInfo;
 
 /**
+ * Request Acquire Skill Info client packet implementation.
  * @author Zoey76
  */
 public final class RequestAcquireSkillInfo extends L2GameClientPacket
@@ -38,14 +39,14 @@ public final class RequestAcquireSkillInfo extends L2GameClientPacket
 	
 	private int _id;
 	private int _level;
-	private int _skillType;
+	private AcquireSkillType _skillType;
 	
 	@Override
 	protected void readImpl()
 	{
 		_id = readD();
 		_level = readD();
-		_skillType = readD();
+		_skillType = AcquireSkillType.getAcquireSkillType(readD());
 	}
 	
 	@Override
@@ -83,8 +84,7 @@ public final class RequestAcquireSkillInfo extends L2GameClientPacket
 		
 		// Hack check. Doesn't apply to all Skill Types
 		final int prevSkillLevel = activeChar.getSkillLevel(_id);
-		final AcquireSkillType skillType = AcquireSkillType.values()[_skillType];
-		if ((prevSkillLevel > 0) && !((skillType == AcquireSkillType.Transfer) || (skillType == AcquireSkillType.SubPledge)))
+		if ((prevSkillLevel > 0) && !((_skillType == AcquireSkillType.TRANSFER) || (_skillType == AcquireSkillType.SUBPLEDGE)))
 		{
 			if (prevSkillLevel == _level)
 			{
@@ -96,69 +96,48 @@ public final class RequestAcquireSkillInfo extends L2GameClientPacket
 			}
 		}
 		
-		final L2SkillLearn s = SkillTreesData.getInstance().getSkillLearn(skillType, _id, _level, activeChar);
+		final L2SkillLearn s = SkillTreesData.getInstance().getSkillLearn(_skillType, _id, _level, activeChar);
 		if (s == null)
 		{
 			return;
 		}
 		
-		switch (skillType)
+		switch (_skillType)
 		{
-			case Class:
+			case TRANSFORM:
+			case FISHING:
+			case SUBCLASS:
+			case COLLECT:
+			case TRANSFER:
+			{
+				sendPacket(new AcquireSkillInfo(_skillType, s));
+				break;
+			}
+			case CLASS:
 			{
 				if (trainer.getTemplate().canTeach(activeChar.getLearningClass()))
 				{
 					final int customSp = s.getCalculatedLevelUpSp(activeChar.getClassId(), activeChar.getLearningClass());
-					sendPacket(new AcquireSkillInfo(skillType, s, customSp));
+					sendPacket(new AcquireSkillInfo(_skillType, s, customSp));
 				}
 				break;
 			}
-			case Transform:
-			{
-				sendPacket(new AcquireSkillInfo(skillType, s));
-				break;
-			}
-			case Fishing:
-			{
-				sendPacket(new AcquireSkillInfo(skillType, s));
-				break;
-			}
-			case Pledge:
+			case PLEDGE:
 			{
 				if (!activeChar.isClanLeader())
 				{
 					return;
 				}
-				sendPacket(new AcquireSkillInfo(skillType, s));
+				sendPacket(new AcquireSkillInfo(_skillType, s));
 				break;
 			}
-			case SubPledge:
+			case SUBPLEDGE:
 			{
-				if (!activeChar.isClanLeader())
-				{
-					return;
-				}
-				
-				if (!(trainer instanceof L2SquadTrainer))
+				if (!activeChar.isClanLeader() || !(trainer instanceof L2SquadTrainer))
 				{
 					return;
 				}
-				sendPacket(new AcquireSkillInfo(skillType, s));
-				break;
-			}
-			case SubClass:
-			{
-				sendPacket(new AcquireSkillInfo(skillType, s));
-				break;
-			}
-			case Collect:
-			{
-				sendPacket(new AcquireSkillInfo(skillType, s));
-				break;
-			}
-			case Transfer:
-			{
-				sendPacket(new AcquireSkillInfo(skillType, s));
+				sendPacket(new AcquireSkillInfo(_skillType, s));
 				break;
 			}
 		}

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AcquireSkillInfo.java

@@ -28,6 +28,7 @@ import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 
 /**
+ * Acquire Skill Info server packet implementation.
  * @author Zoey76
  */
 public class AcquireSkillInfo extends L2GameServerPacket
@@ -75,7 +76,7 @@ public class AcquireSkillInfo extends L2GameServerPacket
 		_spCost = skillLearn.getLevelUpSp();
 		_type = skillType;
 		_reqs = new ArrayList<>();
-		if ((skillType != AcquireSkillType.Pledge) || Config.LIFE_CRYSTAL_NEEDED)
+		if ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED)
 		{
 			for (ItemHolder item : skillLearn.getRequiredItems())
 			{

+ 9 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AcquireSkillList.java

@@ -18,13 +18,17 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-import javolution.util.FastList;
+import java.util.ArrayList;
+import java.util.List;
 
 import com.l2jserver.gameserver.model.base.AcquireSkillType;
 
+/**
+ * Acquire Skill List server packet implementation.
+ */
 public final class AcquireSkillList extends L2GameServerPacket
 {
-	private final FastList<Skill> _skills;
+	private final List<Skill> _skills;
 	private final AcquireSkillType _skillType;
 	
 	/**
@@ -51,7 +55,7 @@ public final class AcquireSkillList extends L2GameServerPacket
 	public AcquireSkillList(AcquireSkillType type)
 	{
 		_skillType = type;
-		_skills = new FastList<>();
+		_skills = new ArrayList<>();
 	}
 	
 	public void addSkill(int id, int nextLevel, int maxLevel, int spCost, int requirements)
@@ -62,7 +66,7 @@ public final class AcquireSkillList extends L2GameServerPacket
 	@Override
 	protected void writeImpl()
 	{
-		if (_skills == null)
+		if (_skills.isEmpty())
 		{
 			return;
 		}
@@ -78,7 +82,7 @@ public final class AcquireSkillList extends L2GameServerPacket
 			writeD(temp.maxLevel);
 			writeD(temp.spCost);
 			writeD(temp.requirements);
-			if (_skillType == AcquireSkillType.SubPledge)
+			if (_skillType == AcquireSkillType.SUBPLEDGE)
 			{
 				writeD(0); // TODO: ?
 			}