Browse Source

BETA: Code refactoring:
* Proper getters and setters for L2NpcTemplate.
* Formatting settings for enums.
* Cleanup and typo fixing.
* JavaDocs added.

Zoey76 13 năm trước cách đây
mục cha
commit
93d7ed062d
49 tập tin đã thay đổi với 1129 bổ sung1022 xóa
  1. 4 4
      L2J_Server_BETA/.settings/org.eclipse.jdt.core.prefs
  2. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/MonsterRace.java
  3. 110 103
      L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2AttackableAI.java
  4. 14 7
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/CharSummonTable.java
  5. 145 79
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcTable.java
  6. 8 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/SpawnTable.java
  7. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/RaidBossSpawnManager.java
  8. 4 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2GroupSpawn.java
  9. 1 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Skill.java
  10. 8 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Spawn.java
  11. 51 54
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Attackable.java
  12. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Decoy.java
  13. 24 24
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Npc.java
  14. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Summon.java
  15. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Trap.java
  16. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2BirthdayCakeInstance.java
  17. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CastleChamberlainInstance.java
  18. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ChestInstance.java
  19. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2DecoyInstance.java
  20. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2DoormenInstance.java
  21. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2FortDoormenInstance.java
  22. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2FortManagerInstance.java
  23. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2MonsterInstance.java
  24. 6 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2NpcInstance.java
  25. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  26. 13 12
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java
  27. 8 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2RaceManagerInstance.java
  28. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2SepulcherMonsterInstance.java
  29. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2SummonInstance.java
  30. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TeleporterInstance.java
  31. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2XmassTreeInstance.java
  32. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/NpcStat.java
  33. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/PetStat.java
  34. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/PlayableStat.java
  35. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestChangePetName.java
  36. 9 9
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java
  37. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ConfirmDlg.java
  38. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExPartyPetWindowAdd.java
  39. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExPartyPetWindowUpdate.java
  40. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/MonRaceInfo.java
  41. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PetInfo.java
  42. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/SellList.java
  43. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ServerObjectInfo.java
  44. 6 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/SystemMessage.java
  45. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java
  46. 14 15
      L2J_Server_BETA/java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java
  47. 23 14
      L2J_Server_BETA/java/com/l2jserver/gameserver/skills/l2skills/L2SkillSpawn.java
  48. 8 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/skills/l2skills/L2SkillSummon.java
  49. 620 601
      L2J_Server_BETA/java/com/l2jserver/gameserver/templates/chars/L2NpcTemplate.java

+ 4 - 4
L2J_Server_BETA/.settings/org.eclipse.jdt.core.prefs

@@ -1,4 +1,4 @@
-#Wed Oct 05 17:11:24 UYST 2011
+#Sat Oct 15 19:54:02 UYST 2011
 eclipse.preferences.version=1
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
@@ -97,7 +97,7 @@ org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=48
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0
@@ -105,7 +105,7 @@ org.eclipse.jdt.core.formatter.alignment_for_assignment=0
 org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0
 org.eclipse.jdt.core.formatter.alignment_for_compact_if=0
 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=48
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49
 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=48
 org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
@@ -114,7 +114,7 @@ org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0
 org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
 org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
 org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=48
 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/MonsterRace.java

@@ -59,7 +59,7 @@ public class MonsterRace
 			{
 				for (int j = i - 1; j >= 0; j--)
 				{
-					if (_monsters[j].getTemplate().npcId == (id + random))
+					if (_monsters[j].getTemplate().getNpcId() == (id + random))
 					{
 						random = Rnd.get(24);
 						continue;
@@ -70,7 +70,7 @@ public class MonsterRace
 			try
 			{
 				L2NpcTemplate template = NpcTable.getInstance().getTemplate(id + random);
-				_constructor = Class.forName("com.l2jserver.gameserver.model.actor.instance." + template.type + "Instance").getConstructors()[0];
+				_constructor = Class.forName("com.l2jserver.gameserver.model.actor.instance." + template.getType() + "Instance").getConstructors()[0];
 				int objectId = IdFactory.getInstance().getNextId();
 				_monsters[i] = (L2Npc) _constructor.newInstance(objectId, template);
 			}

+ 110 - 103
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -22,6 +22,8 @@ import java.util.Collection;
 import java.util.concurrent.Future;
 import java.util.logging.Level;
 
+import javolution.util.FastList;
+
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GameTimeController;
 import com.l2jserver.gameserver.GeoData;
@@ -92,7 +94,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 	public L2AttackableAI(L2Character.AIAccessor accessor)
 	{
 		super(accessor);
-		_skillrender = NpcTable.getInstance().getTemplate(getActiveChar().getTemplate().npcId);
+		_skillrender = NpcTable.getInstance().getTemplate(getActiveChar().getTemplate().getNpcId());
 		//_selfAnalysis.init();
 		_attackTimeout = Integer.MAX_VALUE;
 		_globalAggro = -10; // 10 seconds timeout of ATTACK after respawn
@@ -103,7 +105,6 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 	{
 		// Launch actions corresponding to the Event Think
 		onEvtThink();
-		
 	}
 	
 	/**
@@ -172,8 +173,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		// Check if the target is a L2PcInstance
 		if (target instanceof L2PcInstance)
 		{
+			final L2PcInstance player = target.getActingPlayer();
 			// Don't take the aggro if the GM has the access level below or equal to GM_DONT_TAKE_AGGRO
-			if (((L2PcInstance) target).isGM() && !((L2PcInstance) target).getAccessLevel().canTakeAggro())
+			if (player.isGM() && !player.getAccessLevel().canTakeAggro())
 				return false;
 			
 			// TODO: Ideally, autoattack condition should be called from the AI script.  In that case,
@@ -182,18 +184,18 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			// from this location.  (Fulminus)
 			
 			// Check if player is an ally (comparing mem addr)
-			if ("varka_silenos_clan".equals(me.getFactionId()) && ((L2PcInstance) target).isAlliedWithVarka())
+			if ("varka_silenos_clan".equals(me.getFactionId()) && player.isAlliedWithVarka())
 				return false;
-			if ("ketra_orc_clan".equals(me.getFactionId()) && ((L2PcInstance) target).isAlliedWithKetra())
+			if ("ketra_orc_clan".equals(me.getFactionId()) && player.isAlliedWithKetra())
 				return false;
 			// check if the target is within the grace period for JUST getting up from fake death
-			if (((L2PcInstance) target).isRecentFakeDeath())
+			if (player.isRecentFakeDeath())
 				return false;
 			
-			if (target.isInParty() && target.getParty().isInDimensionalRift())
+			if (player.isInParty() && player.getParty().isInDimensionalRift())
 			{
-				byte riftType = target.getParty().getDimensionalRift().getType();
-				byte riftRoom = target.getParty().getDimensionalRift().getCurrentRoom();
+				byte riftType = player.getParty().getDimensionalRift().getType();
+				byte riftRoom = player.getParty().getDimensionalRift().getCurrentRoom();
 				
 				if (me instanceof L2RiftInvaderInstance && !DimensionalRiftManager.getInstance().getRoom(riftType, riftRoom).checkIfInZone(me.getX(), me.getY(), me.getZ()))
 					return false;
@@ -389,11 +391,13 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		
 		if (lastBuffTick + 30 < GameTimeController.getGameTicks())
 		{
-			if (_skillrender.hasBuffSkill())
-				for (L2Skill sk : _skillrender._buffskills)
-					if (cast(sk))
-						break;
-			
+			for (L2Skill sk : _skillrender.getBuffSkills())
+			{
+				if (cast(sk))
+				{
+					break;
+				}
+			}
 			lastBuffTick = GameTimeController.getGameTicks();
 		}
 		
@@ -572,10 +576,13 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			}
 			else if (Rnd.nextInt(RANDOM_WALK_RATE) == 0)
 			{
-				if (_skillrender.hasBuffSkill())
-					for (L2Skill sk : _skillrender._buffskills)
-						if (cast(sk))
-							return;
+				for (L2Skill sk : _skillrender.getBuffSkills())
+				{
+					if (cast(sk))
+					{
+						return;
+					}
+				}
 			}
 		}
 		// Order to the L2MonsterInstance to random walk (1/100)
@@ -584,10 +591,13 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			int x1, y1, z1;
 			final int range = Config.MAX_DRIFT_RANGE;
 			
-			if (_skillrender.hasBuffSkill())
-				for (L2Skill sk : _skillrender._buffskills)
-					if (cast(sk))
-						return;
+			for (L2Skill sk : _skillrender.getBuffSkills())
+			{
+				if (cast(sk))
+				{
+					return;
+				}
+			}
 			
 			// If NPC with random coord in territory
 			if (npc.getSpawn().getLocx() == 0 && npc.getSpawn().getLocy() == 0)
@@ -773,7 +783,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 
 		final int combinedCollision = collision + mostHate.getTemplate().getCollisionRadius();
 
-		if (_skillrender.hasSuicideSkill() && (int) ((npc.getCurrentHp() / npc.getMaxHp()) * 100) < 30)
+		if (!_skillrender.getSuicideSkills().isEmpty() && (int) ((npc.getCurrentHp() / npc.getMaxHp()) * 100) < 30)
 		{
 			final L2Skill skill = _skillrender.getSuicideSkills().get(Rnd.nextInt(_skillrender.getSuicideSkills().size()));	
 			if (Util.checkIfInRange(skill.getSkillRadius(), getActiveChar(), mostHate, false) && Rnd.get(100) < Rnd.get(npc.getMinSkillChance(), npc.getMaxSkillChance()))
@@ -909,18 +919,18 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			}
 		}
 
-		if (_skillrender.hasSkill())
+		if (!_skillrender.getGeneralskills().isEmpty())
 		{
 			//-------------------------------------------------------------------------------
 			//Heal Condition
-			if (_skillrender.hasHealSkill() && _skillrender._healskills != null)
+			if (!_skillrender.getHealSkills().isEmpty())
 			{
 				double percentage = npc.getCurrentHp() / npc.getMaxHp() * 100;
 				if (npc.isMinion())
 				{
 					L2Character leader = npc.getLeader();
 					if (leader != null && !leader.isDead() && Rnd.get(100) > (leader.getCurrentHp() / leader.getMaxHp() * 100))
-						for (L2Skill sk : _skillrender._healskills)
+						for (L2Skill sk : _skillrender.getHealSkills())
 						{
 							if (sk.getTargetType() == L2TargetType.TARGET_SELF)
 								continue;
@@ -944,7 +954,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 						}
 				}
 				if (Rnd.get(100) < (100 - percentage) / 3)
-					for (L2Skill sk : _skillrender._healskills)
+					for (L2Skill sk : _skillrender.getHealSkills())
 					{
 						if ((sk.getMpConsume() >= npc.getCurrentMp() || npc.isSkillDisabled(sk) || (sk.isMagic() && npc.isMuted())) || (!sk.isMagic() && npc.isPhysicalMuted()))
 						{
@@ -955,7 +965,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 						npc.doCast(sk);
 						return;
 					}
-				for (L2Skill sk : _skillrender._healskills)
+				for (L2Skill sk : _skillrender.getHealSkills())
 				{
 					if ((sk.getMpConsume() >= npc.getCurrentMp() || npc.isSkillDisabled(sk) || (sk.isMagic() && npc.isMuted())) || (!sk.isMagic() && npc.isPhysicalMuted()))
 					{
@@ -992,13 +1002,13 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			}
 			//-------------------------------------------------------------------------------
 			//Res Skill Condition
-			if (_skillrender.hasResSkill())
+			if (!_skillrender.getResSkills().isEmpty())
 			{
 				if (npc.isMinion())
 				{
 					L2Character leader = npc.getLeader();
 					if (leader != null && leader.isDead())
-						for (L2Skill sk : _skillrender._resskills)
+						for (L2Skill sk : _skillrender.getResSkills())
 						{
 							if (sk.getTargetType() == L2TargetType.TARGET_SELF)
 								continue;
@@ -1020,7 +1030,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 							}
 						}
 				}
-				for (L2Skill sk : _skillrender._resskills)
+				for (L2Skill sk : _skillrender.getResSkills())
 				{
 					if ((sk.getMpConsume() >= npc.getCurrentMp() || npc.isSkillDisabled(sk) || (sk.isMagic() && npc.isMuted())) || (!sk.isMagic() && npc.isPhysicalMuted()))
 					{
@@ -1080,16 +1090,16 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		setTimepass(0);
 		//--------------------------------------------------------------------------------
 		//Skill Use
-		if (_skillrender.hasSkill())
+		if (!_skillrender.getGeneralskills().isEmpty())
 		{
 			if (Rnd.get(100) < Rnd.get(npc.getMinSkillChance(), npc.getMaxSkillChance()))
 			{
-				L2Skill skills = _skillrender._generalskills.get(Rnd.nextInt(_skillrender._generalskills.size()));
+				L2Skill skills = _skillrender.getGeneralskills().get(Rnd.nextInt(_skillrender.getGeneralskills().size()));
 				if (cast(skills))
 				{
 					return;
 				}
-				for (L2Skill sk : _skillrender._generalskills)
+				for (L2Skill sk : _skillrender.getGeneralskills())
 				{
 					if (cast(sk))
 					{
@@ -1098,34 +1108,35 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 			}
 			
-			//--------------------------------------------------------------------------------
-			//Long/Short Range skill Usage
+			// --------------------------------------------------------------------------------
+			// Long/Short Range skill Usage
 			if (npc.hasLSkill() || npc.hasSSkill())
 			{
+				final FastList<L2Skill> shortRangeSkills = shortRangeSkillRender();
 				if (npc.hasSSkill() && dist2 <= 150 && Rnd.get(100) <= npc.getSSkillChance())
 				{
-					sSkillRender();
-					if (_skillrender._Srangeskills != null)
+					if (cast(shortRangeSkills.get(Rnd.nextInt(shortRangeSkills.size()))))
+					{
+						return;
+					}
+					for (L2Skill sk : shortRangeSkills)
 					{
-						L2Skill skills = _skillrender._Srangeskills.get(Rnd.nextInt(_skillrender._Srangeskills.size()));
-						if (cast(skills))
+						if (cast(sk))
+						{
 							return;
-						for (L2Skill sk : _skillrender._Srangeskills)
-							if (cast(sk))
-								return;
+						}
 					}
 				}
+				
+				final FastList<L2Skill> longRangeSkills = longRangeSkillRender();
 				if (npc.hasLSkill() && dist2 > 150 && Rnd.get(100) <= npc.getLSkillChance())
 				{
-					lSkillRender();
-					if (_skillrender._Lrangeskills != null)
+					for (L2Skill sk : longRangeSkills)
 					{
-						L2Skill skills = _skillrender._Lrangeskills.get(Rnd.nextInt(_skillrender._Lrangeskills.size()));
-						if (cast(skills))
+						if (cast(sk))
+						{
 							return;
-						for (L2Skill sk : _skillrender._Lrangeskills)
-							if (cast(sk))
-								return;
+						}
 					}
 				}
 			}
@@ -1162,9 +1173,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			{
 				case -1:
 				{
-					if (_skillrender._generalskills != null)
+					if (_skillrender.getGeneralskills() != null)
 					{
-						for (L2Skill sk : _skillrender._generalskills)
+						for (L2Skill sk : _skillrender.getGeneralskills())
 						{
 							if (cast(sk))
 							{
@@ -1176,30 +1187,24 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 				case 1:
 				{
-					if (_skillrender.hasAtkSkill())
+					for (L2Skill sk : _skillrender.getAtkSkills())
 					{
-						for (L2Skill sk : _skillrender._atkskills)
+						if (cast(sk))
 						{
-							if (cast(sk))
-							{
-								return;
-							}
+							return;
 						}
 					}
 					break;
 				}
 				default:
 				{
-					if (_skillrender._generalskills != null)
+					for (L2Skill sk : _skillrender.getGeneralskills())
 					{
-						for (L2Skill sk : _skillrender._generalskills)
+						if (sk.getId() == getActiveChar().getPrimarySkillId())
 						{
-							if (sk.getId() == getActiveChar().getPrimarySkillId())
+							if (cast(sk))
 							{
-								if (cast(sk))
-								{
-									return;
-								}
+								return;
 							}
 						}
 					}
@@ -1748,14 +1753,14 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			}
 			
 			//Check if activeChar has any skill
-			if (_skillrender.hasSkill())
+			if (!_skillrender.getGeneralskills().isEmpty())
 			{
 				//-------------------------------------------------------------
 				//Try to stop the target or disable the target as priority
 				int random = Rnd.get(100);
-				if (_skillrender.hasImmobiliseSkill() && !getAttackTarget().isImmobilized() && random < 2)
+				if (!_skillrender.getImmobiliseSkills().isEmpty() && !getAttackTarget().isImmobilized() && random < 2)
 				{
-					for (L2Skill sk : _skillrender._immobiliseskills)
+					for (L2Skill sk : _skillrender.getImmobiliseSkills())
 					{
 						if (sk.getMpConsume() >= npc.getCurrentMp() || npc.isSkillDisabled(sk) || (sk.getCastRange() + npc.getTemplate().getCollisionRadius() + getAttackTarget().getTemplate().getCollisionRadius() <= dist2 && !canAura(sk)) || (sk.isMagic() && npc.isMuted()) || (!sk.isMagic() && npc.isPhysicalMuted()))
 						{
@@ -1776,9 +1781,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 				//-------------------------------------------------------------
 				//Same as Above, but with Mute/FEAR etc....
-				if (_skillrender.hasCOTSkill() && random < 5)
+				if (!_skillrender.getCostOverTimeSkills().isEmpty() && random < 5)
 				{
-					for (L2Skill sk : _skillrender._cotskills)
+					for (L2Skill sk : _skillrender.getCostOverTimeSkills())
 					{
 						if (sk.getMpConsume() >= npc.getCurrentMp() || npc.isSkillDisabled(sk) || (sk.getCastRange() + npc.getTemplate().getCollisionRadius() + getAttackTarget().getTemplate().getCollisionRadius() <= dist2 && !canAura(sk)) || (sk.isMagic() && npc.isMuted()) || (!sk.isMagic() && npc.isPhysicalMuted()))
 						{
@@ -1798,9 +1803,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 					}
 				}
 				//-------------------------------------------------------------
-				if (_skillrender.hasDebuffSkill() && random < 8)
+				if (!_skillrender.getDebuffSkills().isEmpty() && random < 8)
 				{
-					for (L2Skill sk : _skillrender._debuffskills)
+					for (L2Skill sk : _skillrender.getDebuffSkills())
 					{
 						if (sk.getMpConsume() >= npc.getCurrentMp() || npc.isSkillDisabled(sk) || (sk.getCastRange() + npc.getTemplate().getCollisionRadius() + getAttackTarget().getTemplate().getCollisionRadius() <= dist2 && !canAura(sk)) || (sk.isMagic() && npc.isMuted()) || (!sk.isMagic() && npc.isPhysicalMuted()))
 						{
@@ -1821,9 +1826,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 				//-------------------------------------------------------------
 				//Some side effect skill like CANCEL or NEGATE
-				if (_skillrender.hasNegativeSkill() && random < 9)
+				if (!_skillrender.getNegativeSkills().isEmpty() && random < 9)
 				{
-					for (L2Skill sk : _skillrender._negativeskills)
+					for (L2Skill sk : _skillrender.getNegativeSkills())
 					{
 						if (sk.getMpConsume() >= npc.getCurrentMp() || npc.isSkillDisabled(sk) || (sk.getCastRange() + npc.getTemplate().getCollisionRadius() + getAttackTarget().getTemplate().getCollisionRadius() <= dist2 && !canAura(sk)) || (sk.isMagic() && npc.isMuted()) || (!sk.isMagic() && npc.isPhysicalMuted()))
 						{
@@ -1844,10 +1849,10 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 				//-------------------------------------------------------------
 				//Start ATK SKILL when nothing can be done
-				if (_skillrender.hasAtkSkill() && (npc.isMovementDisabled()
+				if (!_skillrender.getAtkSkills().isEmpty() && (npc.isMovementDisabled()
 						|| npc.getAiType() == AIType.MAGE || npc.getAiType() == AIType.HEALER))
 				{
-					for (L2Skill sk : _skillrender._atkskills)
+					for (L2Skill sk : _skillrender.getAtkSkills())
 					{
 						if (sk.getMpConsume() >= npc.getCurrentMp() || npc.isSkillDisabled(sk) || (sk.getCastRange() + npc.getTemplate().getCollisionRadius() + getAttackTarget().getTemplate().getCollisionRadius() <= dist2 && !canAura(sk)) || (sk.isMagic() && npc.isMuted()) || (!sk.isMagic() && npc.isPhysicalMuted()))
 						{
@@ -1864,32 +1869,28 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 					}
 				}
 				//-------------------------------------------------------------
-				//if there is no ATK skill to use, then try Universal skill
+				// if there is no ATK skill to use, then try Universal skill
 				/*
-				if(_skillrender.hasUniversalSkill())
+				for(L2Skill sk:_skillrender.getUniversalSkills())
 				{
-					for(L2Skill sk:_skillrender._universalskills)
+					if(sk.getMpConsume()>=_actor.getCurrentMp()
+							|| _actor.isSkillDisabled(sk.getId())
+							||(sk.getCastRange()+ _actor.getTemplate().getCollisionRadius() + getAttackTarget().getTemplate().getCollisionRadius() <= dist2 && !canAura(sk))
+							||(sk.isMagic()&&_actor.isMuted())
+							||(!sk.isMagic()&&_actor.isPhysicalMuted()))
 					{
-						if(sk.getMpConsume()>=_actor.getCurrentMp()
-								|| _actor.isSkillDisabled(sk.getId())
-								||(sk.getCastRange()+ _actor.getTemplate().getCollisionRadius() + getAttackTarget().getTemplate().getCollisionRadius() <= dist2 && !canAura(sk))
-								||(sk.isMagic()&&_actor.isMuted())
-								||(!sk.isMagic()&&_actor.isPhysicalMuted()))
-						{
-							continue;
-						}
-						if(!GeoData.getInstance().canSeeTarget(_actor,getAttackTarget()))
-							continue;
-						clientStopMoving(null);
-						L2Object target = getAttackTarget();
-						//_actor.setTarget(_actor);
-						_actor.doCast(sk);
-						//_actor.setTarget(target);
-						return;
+						continue;
 					}
+					if(!GeoData.getInstance().canSeeTarget(_actor,getAttackTarget()))
+						continue;
+					clientStopMoving(null);
+					L2Object target = getAttackTarget();
+					//_actor.setTarget(_actor);
+					_actor.doCast(sk);
+					//_actor.setTarget(target);
+					return;
 				}
-
-				 */
+				*/
 			}
 			//timepass = timepass + 1;
 			if (npc.isMovementDisabled())
@@ -2357,16 +2358,22 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		}
 	}
 	
-	private void lSkillRender()
+	private FastList<L2Skill> longRangeSkillRender()
 	{
-		if (_skillrender._Lrangeskills == null)
-			_skillrender._Lrangeskills = getActiveChar().getLrangeSkill();
+		if (_skillrender.getLongRangeSkills().isEmpty())
+		{
+			return getActiveChar().getLongRangeSkill();
+		}
+		return _skillrender.getLongRangeSkills();
 	}
 	
-	private void sSkillRender()
+	private FastList<L2Skill> shortRangeSkillRender()
 	{
-		if (_skillrender._Srangeskills == null)
-			_skillrender._Srangeskills = getActiveChar().getSrangeSkill();
+		if (_skillrender.getShortRangeSkills().isEmpty())
+		{
+			return getActiveChar().getShortRangeSkill();
+		}
+		return _skillrender.getShortRangeSkills();
 	}
 	
 	/**

+ 14 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/CharSummonTable.java

@@ -204,15 +204,22 @@ public class CharSummonTable
 					return;
 				}
 				
-				if (summonTemplate.type.equalsIgnoreCase("L2SiegeSummon"))
-					summon = new L2SiegeSummonInstance(IdFactory.getInstance().getNextId(), summonTemplate, activeChar, skill);
-				/* TODO: Confirm L2Merchant 
-				else if (summonTemplate.type.equalsIgnoreCase("L2MerchantSummon"))
-					summon = new L2MerchantSummonInstance(IdFactory.getInstance().getNextId(), summonTemplate, activeChar, skill);*/
+				final int id = IdFactory.getInstance().getNextId();
+				if (summonTemplate.isType("L2SiegeSummon"))
+				{
+					summon = new L2SiegeSummonInstance(id, summonTemplate, activeChar, skill);
+				}
+				else if (summonTemplate.isType("L2MerchantSummon"))
+				{
+					// TODO: Confirm L2Merchant summon = new L2MerchantSummonInstance(id, summonTemplate, activeChar, skill);
+					summon = new L2SummonInstance(id, summonTemplate, activeChar, skill);
+				}
 				else
-					summon = new L2SummonInstance(IdFactory.getInstance().getNextId(), summonTemplate, activeChar, skill);
+				{
+					summon = new L2SummonInstance(id, summonTemplate, activeChar, skill);
+				}
 				
-				summon.setName(summonTemplate.name);
+				summon.setName(summonTemplate.getName());
 				summon.setTitle(activeChar.getName());
 				summon.setExpPenalty(skill.getExpPenalty());
 				

+ 145 - 79
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcTable.java

@@ -46,7 +46,7 @@ public class NpcTable
 {
 	private static Logger _log = Logger.getLogger(NpcTable.class.getName());
 	
-	private final TIntObjectHashMap<L2NpcTemplate> _npcs;
+	private final TIntObjectHashMap<L2NpcTemplate> _npcs = new TIntObjectHashMap<L2NpcTemplate>();
 	
 	public static NpcTable getInstance()
 	{
@@ -55,8 +55,7 @@ public class NpcTable
 	
 	private NpcTable()
 	{
-		_npcs = new TIntObjectHashMap<L2NpcTemplate>();
-		
+		_npcs.clear();
 		restoreNpcData();
 	}
 	
@@ -68,9 +67,13 @@ public class NpcTable
 		loadNpcsSkillLearn(0);
 		loadMinions(0);
 		loadNpcsAI(0);
-		loadNpcsElement(0);	
+		loadNpcsElement(0);
 	}
-
+	
+	/**
+	 * @param NpcData
+	 * @throws Exception
+	 */
 	private void fillNpcTable(ResultSet NpcData) throws Exception
 	{
 		StatsSet npcDat = new StatsSet();
@@ -83,7 +86,7 @@ public class NpcTable
 		npcDat.set("idTemplate", idTemp);
 		int level = NpcData.getInt("level");
 		npcDat.set("level", level);
-		npcDat.set("jClass", NpcData.getString("class"));
+		npcDat.set("client_class", NpcData.getString("class"));
 		
 		npcDat.set("baseShldDef", 0);
 		npcDat.set("baseShldRate", 0);
@@ -91,7 +94,6 @@ public class NpcTable
 		
 		npcDat.set("name", NpcData.getString("name"));
 		npcDat.set("serverSideName", NpcData.getBoolean("serverSideName"));
-		//npcDat.set("name", "");
 		npcDat.set("title", NpcData.getString("title"));
 		npcDat.set("serverSideTitle", NpcData.getBoolean("serverSideTitle"));
 		npcDat.set("collision_radius", NpcData.getDouble("collision_radius"));
@@ -113,18 +115,18 @@ public class NpcTable
 		npcDat.set("show_name", NpcData.getBoolean("show_name"));
 		
 		// constants, until we have stats in DB
-		npcDat.safeSet("baseSTR", NpcData.getInt("str"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: "+NpcData.getInt("idTemplate"));
-		npcDat.safeSet("baseCON", NpcData.getInt("con"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: "+NpcData.getInt("idTemplate"));
-		npcDat.safeSet("baseDEX", NpcData.getInt("dex"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: "+NpcData.getInt("idTemplate"));
-		npcDat.safeSet("baseINT", NpcData.getInt("int"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: "+NpcData.getInt("idTemplate"));
-		npcDat.safeSet("baseWIT", NpcData.getInt("wit"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: "+NpcData.getInt("idTemplate"));
-		npcDat.safeSet("baseMEN", NpcData.getInt("men"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: "+NpcData.getInt("idTemplate"));
+		npcDat.safeSet("baseSTR", NpcData.getInt("str"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: " + NpcData.getInt("idTemplate"));
+		npcDat.safeSet("baseCON", NpcData.getInt("con"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: " + NpcData.getInt("idTemplate"));
+		npcDat.safeSet("baseDEX", NpcData.getInt("dex"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: " + NpcData.getInt("idTemplate"));
+		npcDat.safeSet("baseINT", NpcData.getInt("int"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: " + NpcData.getInt("idTemplate"));
+		npcDat.safeSet("baseWIT", NpcData.getInt("wit"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: " + NpcData.getInt("idTemplate"));
+		npcDat.safeSet("baseMEN", NpcData.getInt("men"), 0, BaseStats.MAX_STAT_VALUE, "Loading npc template id: " + NpcData.getInt("idTemplate"));
 		
 		npcDat.set("baseHpMax", NpcData.getDouble("hp"));
 		npcDat.set("baseCpMax", 0);
 		npcDat.set("baseMpMax", NpcData.getDouble("mp"));
 		npcDat.set("baseHpReg", NpcData.getFloat("hpreg") > 0 ? NpcData.getFloat("hpreg") : 1.5 + ((level - 1) / 10.0));
-		npcDat.set("baseMpReg", NpcData.getFloat("mpreg") > 0 ? NpcData.getFloat("mpreg") : 0.9 + 0.3 * ((level - 1) / 10.0));
+		npcDat.set("baseMpReg", NpcData.getFloat("mpreg") > 0 ? NpcData.getFloat("mpreg") : 0.9 + (0.3 * ((level - 1) / 10.0)));
 		npcDat.set("basePAtk", NpcData.getInt("patk"));
 		npcDat.set("basePDef", NpcData.getInt("pdef"));
 		npcDat.set("baseMAtk", NpcData.getInt("matk"));
@@ -143,6 +145,9 @@ public class NpcTable
 		_npcs.put(id, new L2NpcTemplate(npcDat));
 	}
 	
+	/**
+	 * @param id of the NPC to reload.
+	 */
 	public void reloadNpc(int id)
 	{
 		try
@@ -150,28 +155,23 @@ public class NpcTable
 			// save a copy of the old data
 			L2NpcTemplate old = getTemplate(id);
 			
-			TIntObjectHashMap<L2Skill> skills = new TIntObjectHashMap<L2Skill>();
-			List<L2MinionData> minions = new FastList<L2MinionData>();
-			Map<QuestEventType, Quest[]> quests = new FastMap<QuestEventType, Quest[]>();
-			ClassId[] classIds = null;
-			FastList<L2DropCategory> categories = new FastList<L2DropCategory>();
+			TIntObjectHashMap<L2Skill> skills = new TIntObjectHashMap<>();
+			List<L2MinionData> minions = new FastList<>();
+			Map<QuestEventType, Quest[]> quests = new FastMap<>();
+			List<ClassId> classIds = new FastList<>();
+			FastList<L2DropCategory> categories = new FastList<>();
 			
 			if (old != null)
 			{
-				if (old.getSkills() != null)
-					skills.putAll(old.getSkills());
-				
-				if (old.getDropData() != null)
-					categories.addAll(old.getDropData());
-				
-				if (old.getTeachInfo() != null)
-					classIds = old.getTeachInfo().clone();
-				
-				if (old.getMinionData() != null)
-					minions.addAll(old.getMinionData());
+				skills.putAll(old.getSkills());
+				categories.addAll(old.getDropData());
+				classIds.addAll(old.getTeachInfo());
+				minions.addAll(old.getMinionData());
 				
 				if (!old.getEventQuests().isEmpty())
+				{
 					quests.putAll(old.getEventQuests());
+				}
 			}
 			
 			loadNpcs(id);
@@ -185,22 +185,27 @@ public class NpcTable
 			// restore additional data from saved copy
 			L2NpcTemplate created = getTemplate(id);
 			
-			if (old != null && created != null)
+			if ((old != null) && (created != null))
 			{
 				if (!skills.isEmpty())
 				{
 					for (L2Skill skill : skills.values(new L2Skill[0]))
+					{
 						created.addSkill(skill);
+					}
 				}
-				if (classIds != null)
+				
+				for (ClassId classId : classIds)
 				{
-					for (ClassId classId : classIds)
-						created.addTeachInfo(classId);
+					created.addTeachInfo(classId);
 				}
+				
 				if (!minions.isEmpty())
 				{
 					for (L2MinionData minion : minions)
+					{
 						created.addRaidData(minion);
+					}
 				}
 				
 				if (!quests.isEmpty())
@@ -215,12 +220,17 @@ public class NpcTable
 		}
 	}
 	
-	// just wrapper
+	/**
+	 * Just wrapper.
+	 */
 	public void reloadAllNpc()
 	{
 		restoreNpcData();
 	}
 	
+	/**
+	 * @param npc
+	 */
 	public void saveNpc(StatsSet npc)
 	{
 		Map<String, Object> set = npc.getSet();
@@ -253,7 +263,6 @@ public class NpcTable
 			}
 		}
 		
-		
 		Connection con = null;
 		try
 		{
@@ -292,73 +301,103 @@ public class NpcTable
 		}
 	}
 	
-	public void replaceTemplate(L2NpcTemplate npc)
-	{
-		_npcs.put(npc.npcId, npc);
-	}
-	
+	/**
+	 * @param id the template Id to get.
+	 * @return the template for the given id.
+	 */
 	public L2NpcTemplate getTemplate(int id)
 	{
 		return _npcs.get(id);
 	}
 	
+	/**
+	 * @param name of the template to get.
+	 * @return the template for the given name.
+	 */
 	public L2NpcTemplate getTemplateByName(String name)
 	{
 		for (L2NpcTemplate npcTemplate : _npcs.valueCollection())
-			if (npcTemplate.name.equalsIgnoreCase(name))
+		{
+			if (npcTemplate.getName().equalsIgnoreCase(name))
+			{
 				return npcTemplate;
-		
+			}
+		}
 		return null;
 	}
 	
-	public L2NpcTemplate[] getAllOfLevel(int lvl)
+	/**
+	 * @param lvl of all the templates to get.
+	 * @return the template list for the given level.
+	 */
+	public List<L2NpcTemplate> getAllOfLevel(int lvl)
 	{
-		List<L2NpcTemplate> list = new FastList<L2NpcTemplate>();
-		
+		final List<L2NpcTemplate> list = new FastList<>();
 		for (L2NpcTemplate t : _npcs.valueCollection())
-			if (t.level == lvl)
+		{
+			if (t.getLevel() == lvl)
+			{
 				list.add(t);
-		
-		return list.toArray(new L2NpcTemplate[list.size()]);
+			}
+		}
+		return list;
 	}
 	
-	public L2NpcTemplate[] getAllMonstersOfLevel(int lvl)
+	/**
+	 * @param lvl of all the monster templates to get.
+	 * @return the template list for the given level.
+	 */
+	public List<L2NpcTemplate> getAllMonstersOfLevel(int lvl)
 	{
-		List<L2NpcTemplate> list = new FastList<L2NpcTemplate>();
-		
+		final List<L2NpcTemplate> list = new FastList<>();
 		for (L2NpcTemplate t : _npcs.valueCollection())
-			if (t.level == lvl && "L2Monster".equals(t.type))
+		{
+			if ((t.getLevel() == lvl) && t.isType("L2Monster"))
+			{
 				list.add(t);
-		
-		return list.toArray(new L2NpcTemplate[list.size()]);
+			}
+		}
+		return list;
 	}
 	
-	public L2NpcTemplate[] getAllNpcStartingWith(String letter)
+	/**
+	 * @param letter of all the NPC templates which its name start with.
+	 * @return the template list for the given letter.
+	 */
+	public List<L2NpcTemplate> getAllNpcStartingWith(String letter)
 	{
-		List<L2NpcTemplate> list = new FastList<L2NpcTemplate>();
-		
+		final List<L2NpcTemplate> list = new FastList<>();
 		for (L2NpcTemplate t : _npcs.valueCollection())
-			if (t.name.startsWith(letter) && "L2Npc".equals((t).type))
+		{
+			if (t.getName().startsWith(letter) && t.isType("L2Npc"))
+			{
 				list.add(t);
-		
-		return list.toArray(new L2NpcTemplate[list.size()]);
+			}
+		}
+		return list;
 	}
 	
 	/**
-	 * @param classType
-	 * @return
+	 * @param classType of all the templates to get.
+	 * @return the template list for the given class type.
 	 */
-	public L2NpcTemplate[] getAllNpcOfClassType(String classType)
+	public List<L2NpcTemplate> getAllNpcOfClassType(String classType)
 	{
-		List<L2NpcTemplate> list = new FastList<L2NpcTemplate>();
-		
+		final List<L2NpcTemplate> list = new FastList<>();
 		for (L2NpcTemplate t : _npcs.valueCollection())
-			if (classType.equals(t.type))
+		{
+			if (t.isType(classType))
+			{
 				list.add(t);
-		
-		return list.toArray(new L2NpcTemplate[list.size()]);
+			}
+		}
+		return list;
 	}
 	
+	/**
+	 * Id equals to zero or lesser means all.
+	 * @param id of the NPC to load.
+	 */
 	public void loadNpcs(int id)
 	{
 		Connection con = null;
@@ -424,10 +463,13 @@ public class NpcTable
 		}
 	}
 	
+	/**
+	 * Id equals to zero or lesser means all.
+	 * @param id of the NPC to load it's skills.
+	 */
 	public void loadNpcsSkills(int id)
 	{
 		Connection con = null;
-		
 		try
 		{
 			con = L2DatabaseFactory.getInstance().getConnection();
@@ -464,7 +506,7 @@ public class NpcTable
 				int skillId = rset.getInt("skillid");
 				int level = rset.getInt("level");
 				
-				if (npcDat.race == null && skillId == 4416)
+				if ((npcDat.getRace() == null) && (skillId == L2Skill.SKILL_NPC_RACE))
 				{
 					npcDat.setRace(level);
 					continue;
@@ -473,7 +515,9 @@ public class NpcTable
 				npcSkill = SkillTable.getInstance().getInfo(skillId, level);
 				
 				if (npcSkill == null)
+				{
 					continue;
+				}
 				cont++;
 				npcDat.addSkill(npcSkill);
 			}
@@ -508,7 +552,7 @@ public class NpcTable
 					int skillId = rset.getInt("skillid");
 					int level = rset.getInt("level");
 					
-					if (npcDat.race == null && skillId == 4416)
+					if ((npcDat.getRace() == null) && (skillId == L2Skill.SKILL_NPC_RACE))
 					{
 						npcDat.setRace(level);
 						continue;
@@ -517,7 +561,9 @@ public class NpcTable
 					npcSkill = SkillTable.getInstance().getInfo(skillId, level);
 					
 					if (npcSkill == null)
+					{
 						continue;
+					}
 					
 					cCont++;
 					npcDat.addSkill(npcSkill);
@@ -539,6 +585,10 @@ public class NpcTable
 		}
 	}
 	
+	/**
+	 * Id equals to zero or lesser means all.
+	 * @param id of the NPC to load it's drops.
+	 */
 	public void loadNpcsDrop(int id)
 	{
 		Connection con = null;
@@ -584,7 +634,7 @@ public class NpcTable
 				
 				if (ItemTable.getInstance().getTemplate(dropDat.getItemId()) == null)
 				{
-					_log.warning("Drop data for undefined item template! NpcId: " + mobId+" itemId: "+dropDat.getItemId());
+					_log.warning("Drop data for undefined item template! NpcId: " + mobId + " itemId: " + dropDat.getItemId());
 					continue;
 				}
 				cont++;
@@ -607,7 +657,7 @@ public class NpcTable
 				}
 				
 				rset = statement.executeQuery();
-			
+				
 				while (rset.next())
 				{
 					int mobId = rset.getInt("mobId");
@@ -626,7 +676,7 @@ public class NpcTable
 					
 					if (ItemTable.getInstance().getTemplate(dropDat.getItemId()) == null)
 					{
-						_log.warning("Custom drop data for undefined item template! NpcId: " + mobId+" itemId: "+dropDat.getItemId());
+						_log.warning("Custom drop data for undefined item template! NpcId: " + mobId + " itemId: " + dropDat.getItemId());
 						continue;
 					}
 					
@@ -648,6 +698,10 @@ public class NpcTable
 		}
 	}
 	
+	/**
+	 * Id equals to zero or lesser means all.
+	 * @param id of the NPC to load it's skill learn list.
+	 */
 	private void loadNpcsSkillLearn(int id)
 	{
 		Connection con = null;
@@ -700,6 +754,10 @@ public class NpcTable
 		}
 	}
 	
+	/**
+	 * Id equals to zero or lesser means all.
+	 * @param id of the NPC to load it's minions.
+	 */
 	public void loadMinions(int id)
 	{
 		Connection con = null;
@@ -755,6 +813,10 @@ public class NpcTable
 		}
 	}
 	
+	/**
+	 * Id equals to zero or lesser means all.
+	 * @param id of the NPC to load it's AI data.
+	 */
 	public void loadNpcsAI(int id)
 	{
 		Connection con = null;
@@ -777,7 +839,7 @@ public class NpcTable
 			
 			L2NpcAIData npcAIDat = null;
 			L2NpcTemplate npcDat = null;
-		
+			
 			int cont = 0;
 			int cCont = 0;
 			
@@ -884,6 +946,10 @@ public class NpcTable
 		}
 	}
 	
+	/**
+	 * Id equals to zero or lesser means all.
+	 * @param id of the NPC to load it's element data.
+	 */
 	public void loadNpcsElement(int id)
 	{
 		Connection con = null;
@@ -916,7 +982,7 @@ public class NpcTable
 					_log.severe("NPCElementals: Elementals Error with id : " + npc_id);
 					continue;
 				}
-				switch(rset.getByte("elemAtkType"))
+				switch (rset.getByte("elemAtkType"))
 				{
 					case Elementals.FIRE:
 						npcDat.setBaseFire(rset.getInt("elemAtkValue"));
@@ -965,7 +1031,7 @@ public class NpcTable
 				}
 				
 				rset = statement.executeQuery();
-		
+				
 				while (rset.next())
 				{
 					int npc_id = rset.getInt("npc_id");
@@ -975,7 +1041,7 @@ public class NpcTable
 						_log.severe("NPCElementals: Custom Elementals Error with id : " + npc_id);
 						continue;
 					}
-					switch(rset.getByte("elemAtkType"))
+					switch (rset.getByte("elemAtkType"))
 					{
 						case Elementals.FIRE:
 							npcDat.setBaseFire(rset.getInt("elemAtkValue"));

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

@@ -78,15 +78,15 @@ public class SpawnTable
 				template1 = NpcTable.getInstance().getTemplate(rset.getInt("npc_templateid"));
 				if (template1 != null)
 				{
-					if (template1.type.equalsIgnoreCase("L2SiegeGuard"))
+					if (template1.isType("L2SiegeGuard"))
 					{
 						// Don't spawn
 					}
-					else if (template1.type.equalsIgnoreCase("L2RaidBoss"))
+					else if (template1.isType("L2RaidBoss"))
 					{
 						// Don't spawn raidboss
 					}
-					else if (!Config.ALLOW_CLASS_MASTERS && template1.type.equals("L2ClassMaster"))
+					else if (!Config.ALLOW_CLASS_MASTERS && template1.isType("L2ClassMaster"))
 					{
 						// Dont' spawn class masters
 					}
@@ -156,15 +156,15 @@ public class SpawnTable
 					template1 = NpcTable.getInstance().getTemplate(rset.getInt("npc_templateid"));
 					if (template1 != null)
 					{
-						if (template1.type.equalsIgnoreCase("L2SiegeGuard"))
+						if (template1.isType("L2SiegeGuard"))
 						{
 							// Don't spawn
 						}
-						else if (template1.type.equalsIgnoreCase("L2RaidBoss"))
+						else if (template1.isType("L2RaidBoss"))
 						{
 							// Don't spawn raidboss
 						}
-						else if (!Config.ALLOW_CLASS_MASTERS && template1.type.equals("L2ClassMaster"))
+						else if (!Config.ALLOW_CLASS_MASTERS && template1.isType("L2ClassMaster"))
 						{
 							// Dont' spawn class masters
 						}
@@ -337,9 +337,9 @@ public class SpawnTable
 				else
 				{
 					if(showposition && _npc != null)
-						activeChar.sendMessage(index + " - " + spawn.getTemplate().name + " (" + spawn + "): " + _npc.getX() + " "+ _npc.getY() + " " + _npc.getZ());
+						activeChar.sendMessage(index + " - " + spawn.getTemplate().getName() + " (" + spawn + "): " + _npc.getX() + " "+ _npc.getY() + " " + _npc.getZ());
 					else
-						activeChar.sendMessage(index + " - " + spawn.getTemplate().name + " (" + spawn + "): " + spawn.getLocx() + " "+ spawn.getLocy() + " " + spawn.getLocz());
+						activeChar.sendMessage(index + " - " + spawn.getTemplate().getName() + " (" + spawn + "): " + spawn.getLocx() + " "+ spawn.getLocy() + " " + spawn.getLocz());
 				}
 			}
 		}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/RaidBossSpawnManager.java

@@ -450,7 +450,7 @@ public class RaidBossSpawnManager
 		L2NpcTemplate template = NpcTable.getInstance().getTemplate(bossId);
 		if (template == null)
 			return null;
-		if (!template.type.equalsIgnoreCase("L2RaidBoss"))
+		if (!template.isType("L2RaidBoss"))
 			return null;
 		return template;
 	}

+ 4 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2GroupSpawn.java

@@ -49,8 +49,7 @@ public class L2GroupSpawn extends L2Spawn
 		
 		try
 		{
-			if (_template.type.equalsIgnoreCase("L2Pet") ||
-					_template.type.equalsIgnoreCase("L2Minion"))
+			if (_template.isType("L2Pet") || _template.isType("L2Minion"))
 				return null;
 			
 			Object[] parameters = {IdFactory.getInstance().getNextId(), _template};
@@ -92,9 +91,9 @@ public class L2GroupSpawn extends L2Spawn
 			mob.onSpawn();
 			
 			if (Config.DEBUG)
-				_log.finest("spawned Mob ID: "+_template.npcId+" ,at: "
-						+mob.getX()+" x, "+mob.getY()+" y, "+mob.getZ()+" z");
-			
+			{
+				_log.finest("Spawned Mob Id: " + _template.getNpcId() + " ,at: X: " + mob.getX() + " Y: " + mob.getY() + " Z: " + mob.getZ());
+			}
 			return mob;
 			
 		}

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

@@ -75,6 +75,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	public static final int SKILL_CRYSTALLIZE = 248;
 	public static final int SKILL_DIVINE_INSPIRATION = 1405;
 	public static final int SKILL_CLAN_LUCK = 390;
+	public static final int SKILL_NPC_RACE = 4416;
 	
 	public static final boolean geoEnabled = Config.GEODATA > 0;
 	

+ 8 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Spawn.java

@@ -163,7 +163,7 @@ public class L2Spawn
 		
 		// Create the generic constructor of L2NpcInstance managed by this L2Spawn
 		Class<?>[] parameters = {int.class, Class.forName("com.l2jserver.gameserver.templates.chars.L2NpcTemplate")};
-		_constructor = Class.forName("com.l2jserver.gameserver.model.actor.instance." + _template.type + "Instance").getConstructor(parameters);
+		_constructor = Class.forName("com.l2jserver.gameserver.model.actor.instance." + _template.getType() + "Instance").getConstructor(parameters);
 	}
 	
 	/**
@@ -211,7 +211,7 @@ public class L2Spawn
 	 */
 	public int getNpcid()
 	{
-		return _template.npcId;
+		return _template.getNpcId();
 	}
 	
 	/**
@@ -444,10 +444,7 @@ public class L2Spawn
 		try
 		{
 			// Check if the L2Spawn is not a L2Pet or L2Minion or L2Decoy spawn
-			if (_template.type.equalsIgnoreCase("L2Pet")
-					|| _template.type.equalsIgnoreCase("L2Decoy")
-					|| _template.type.equalsIgnoreCase("L2Trap")
-					|| _template.type.equalsIgnoreCase("L2EffectPoint"))
+			if (_template.isType("L2Pet") || _template.isType("L2Decoy") || _template.isType("L2Trap") || _template.isType("L2EffectPoint"))
 			{
 				_currentCount++;
 				
@@ -472,7 +469,7 @@ public class L2Spawn
 		}
 		catch (Exception e)
 		{
-			_log.log(Level.WARNING, "NPC "+_template.npcId+" class not found", e);
+			_log.log(Level.WARNING, "NPC " + _template.getNpcId() + " class not found", e);
 		}
 		return mob;
 	}
@@ -538,7 +535,7 @@ public class L2Spawn
 			if
 			(
 					mob instanceof L2MonsterInstance
-					&& !getTemplate().isQuestMonster
+					&& !getTemplate().isQuestMonster()
 					&& !mob.isRaid()
 					&& !((L2MonsterInstance)mob).isRaidMinion()
 					&& Config.L2JMOD_CHAMPION_FREQUENCY > 0
@@ -565,8 +562,9 @@ public class L2Spawn
 		_lastSpawn = mob;
 		
 		if (Config.DEBUG)
-			_log.finest("spawned Mob ID: "+_template.npcId+" ,at: "+mob.getX()+" x, "+mob.getY()+" y, "+mob.getZ()+" z");
-		
+		{
+			_log.finest("Spawned Mob Id: " + _template.getNpcId() + " , at: X: " + mob.getX() + " Y: " + mob.getY() + " Z: " + mob.getZ());
+		}
 		// Increase the current number of L2NpcInstance managed by this L2Spawn
 		_currentCount++;
 		return mob;

+ 51 - 54
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Attackable.java

@@ -1607,68 +1607,65 @@ public class L2Attackable extends L2Npc
 		CursedWeaponsManager.getInstance().checkDrop(this, player);
 		
 		// now throw all categorized drops and handle spoil.
-		if (npcTemplate.getDropData() != null)
+		for (L2DropCategory cat : npcTemplate.getDropData())
 		{
-			for (L2DropCategory cat : npcTemplate.getDropData())
+			RewardItem item = null;
+			if (cat.isSweep())
 			{
-				RewardItem item = null;
-				if (cat.isSweep())
+				// according to sh1ny, seeded mobs CAN be spoiled and swept.
+				if (isSpoil()/* && !isSeeded() */)
 				{
-					// according to sh1ny, seeded mobs CAN be spoiled and swept.
-					if (isSpoil()/* && !isSeeded() */)
+					FastList<RewardItem> sweepList = new FastList<RewardItem>();
+					
+					for (L2DropData drop : cat.getAllDrops())
 					{
-						FastList<RewardItem> sweepList = new FastList<RewardItem>();
+						item = calculateRewardItem(player, drop, levelModifier, true);
+						if (item == null)
+							continue;
 						
-						for (L2DropData drop : cat.getAllDrops())
-						{
-							item = calculateRewardItem(player, drop, levelModifier, true);
-							if (item == null)
-								continue;
-							
-							if (Config.DEBUG)
-								_log.fine("Item id to spoil: " + item.getItemId() + " amount: " + item.getCount());
-							sweepList.add(item);
-						}
-						// Set the table _sweepItems of this L2Attackable
-						if (!sweepList.isEmpty())
-							_sweepItems = sweepList.toArray(new RewardItem[sweepList.size()]);
+						if (Config.DEBUG)
+							_log.fine("Item id to spoil: " + item.getItemId() + " amount: " + item.getCount());
+						sweepList.add(item);
 					}
+					// Set the table _sweepItems of this L2Attackable
+					if (!sweepList.isEmpty())
+						_sweepItems = sweepList.toArray(new RewardItem[sweepList.size()]);
+				}
+			}
+			else
+			{
+				if (isSeeded())
+				{
+					L2DropData drop = cat.dropSeedAllowedDropsOnly();
+					
+					if (drop == null)
+						continue;
+					
+					item = calculateRewardItem(player, drop, levelModifier, false);
 				}
 				else
+					item = calculateCategorizedRewardItem(player, cat, levelModifier);
+				
+				if (item != null)
 				{
-					if (isSeeded())
-					{
-						L2DropData drop = cat.dropSeedAllowedDropsOnly();
-						
-						if (drop == null)
-							continue;
-						
-						item = calculateRewardItem(player, drop, levelModifier, false);
-					}
-					else
-						item = calculateCategorizedRewardItem(player, cat, levelModifier);
+					if (Config.DEBUG)
+						_log.fine("Item id to drop: " + item.getItemId() + " amount: " + item.getCount());
 					
-					if (item != null)
-					{
-						if (Config.DEBUG)
-							_log.fine("Item id to drop: " + item.getItemId() + " amount: " + item.getCount());
+					// Check if the autoLoot mode is active
+					if (isFlying() || (!isRaid() && Config.AUTO_LOOT) || (isRaid() && Config.AUTO_LOOT_RAIDS))
+						player.doAutoLoot(this, item); // Give the item(s) to the L2PcInstance that has killed the L2Attackable
+					else
+						dropItem(player, item); // drop the item on the ground
 						
-						// Check if the autoLoot mode is active
-						if (isFlying() || (!isRaid() && Config.AUTO_LOOT) || (isRaid() && Config.AUTO_LOOT_RAIDS))
-							player.doAutoLoot(this, item); // Give the item(s) to the L2PcInstance that has killed the L2Attackable
-						else
-							dropItem(player, item); // drop the item on the ground
-							
-						// Broadcast message if RaidBoss was defeated
-						if (isRaid() && !isRaidMinion())
-						{
-							SystemMessage sm;
-							sm = SystemMessage.getSystemMessage(SystemMessageId.C1_DIED_DROPPED_S3_S2);
-							sm.addCharName(this);
-							sm.addItemName(item.getItemId());
-							sm.addItemNumber(item.getCount());
-							broadcastPacket(sm);
-						}
+					// Broadcast message if RaidBoss was defeated
+					if (isRaid() && !isRaidMinion())
+					{
+						SystemMessage sm;
+						sm = SystemMessage.getSystemMessage(SystemMessageId.C1_DIED_DROPPED_S3_S2);
+						sm.addCharName(this);
+						sm.addItemName(item.getItemId());
+						sm.addItemNumber(item.getCount());
+						broadcastPacket(sm);
 					}
 				}
 			}
@@ -1696,9 +1693,9 @@ public class L2Attackable extends L2Npc
 		}
 		
 		//Instant Item Drop :>
-		if (getTemplate().dropherbgroup > 0)
+		if (getTemplate().getDropHerbGroup() > 0)
 		{
-			for (L2DropCategory cat : HerbDropTable.getInstance().getHerbDroplist(getTemplate().dropherbgroup))
+			for (L2DropCategory cat : HerbDropTable.getInstance().getHerbDroplist(getTemplate().getDropHerbGroup()))
 			{
 				RewardItem item = calculateCategorizedHerbItem(player, cat);
 				if (item != null)
@@ -2386,7 +2383,7 @@ public class L2Attackable extends L2Npc
 		if (damage <= 0)
 			return 0;
 		
-		final float divider = getTemplate().baseVitalityDivider;
+		final float divider = getTemplate().getBaseVitalityDivider();
 		if (divider == 0)
 			return 0;
 		

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

@@ -103,13 +103,13 @@ public abstract class L2Decoy extends L2Character
 	
 	public final int getNpcId()
 	{
-		return getTemplate().npcId;
+		return getTemplate().getNpcId();
 	}
 	
 	@Override
 	public int getLevel()
 	{
-		return getTemplate().level;
+		return getTemplate().getLevel();
 	}
 	
 	public void deleteMe(L2PcInstance owner)

+ 24 - 24
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Npc.java

@@ -294,7 +294,7 @@ public class L2Npc extends L2Character
 		return true;
 	}
 	
-	public FastList<L2Skill> getLrangeSkill()
+	public FastList<L2Skill> getLongRangeSkill()
 	{
 		FastList<L2Skill> skilldata = new FastList<L2Skill>();
 		boolean hasLrange = false;
@@ -325,9 +325,9 @@ public class L2Npc extends L2Character
 			}
 			case 1:
 			{
-				if (getTemplate()._universalskills != null)
+				if (getTemplate().getUniversalSkills() != null)
 				{
-					for (L2Skill sk : getTemplate()._universalskills)
+					for (L2Skill sk : getTemplate().getUniversalSkills())
 					{
 						if (sk.getCastRange() >= 200)
 						{
@@ -354,7 +354,7 @@ public class L2Npc extends L2Character
 		return (hasLrange ? skilldata : null);
 	}
 	
-	public FastList<L2Skill> getSrangeSkill()
+	public FastList<L2Skill> getShortRangeSkill()
 	{
 		FastList<L2Skill> skilldata = new FastList<L2Skill>();
 		boolean hasSrange = false;
@@ -385,9 +385,9 @@ public class L2Npc extends L2Character
 			}
 			case 1:
 			{
-				if (getTemplate()._universalskills != null)
+				if (getTemplate().getUniversalSkills() != null)
 				{
-					for (L2Skill sk : getTemplate()._universalskills)
+					for (L2Skill sk : getTemplate().getUniversalSkills())
 					{
 						if (sk.getCastRange() <= 200)
 						{
@@ -511,9 +511,9 @@ public class L2Npc extends L2Character
 		initCharStatusUpdateValues();
 		
 		// initialize the "current" equipment
-		_currentLHandId = getTemplate().lhand;
-		_currentRHandId = getTemplate().rhand;
-		_currentEnchant = Config.ENABLE_RANDOM_ENCHANT_EFFECT ? Rnd.get(4, 21) : getTemplate().enchantEffect;
+		_currentLHandId = getTemplate().getLeftHand();
+		_currentRHandId = getTemplate().getRightHand();
+		_currentEnchant = Config.ENABLE_RANDOM_ENCHANT_EFFECT ? Rnd.get(4, 21) : getTemplate().getEnchantEffect();
 		// initialize the "current" collisions
 		_currentCollisionHeight = getTemplate().getfCollisionHeight();
 		_currentCollisionRadius = getTemplate().getfCollisionRadius();
@@ -525,7 +525,7 @@ public class L2Npc extends L2Character
 		}
 		
 		// Set the name of the L2Character
-		setName(template.name);
+		setName(template.getName());
 	}
 	
 	@Override
@@ -576,7 +576,7 @@ public class L2Npc extends L2Character
 	 */
 	public int getNpcId()
 	{
-		return getTemplate().npcId;
+		return getTemplate().getNpcId();
 	}
 	
 	@Override
@@ -602,7 +602,7 @@ public class L2Npc extends L2Character
 	@Override
 	public final int getLevel()
 	{
-		return getTemplate().level;
+		return getTemplate().getLevel();
 	}
 	
 	/**
@@ -618,7 +618,7 @@ public class L2Npc extends L2Character
 	 */
 	public int getAggroRange()
 	{
-		return getTemplate().aggroRange;
+		return getTemplate().getAggroRange();
 	}
 	
 	/**
@@ -968,13 +968,13 @@ public class L2Npc extends L2Character
 	public L2Weapon getActiveWeaponItem()
 	{
 		// Get the weapon identifier equiped in the right hand of the L2NpcInstance
-		int weaponId = getTemplate().rhand;
+		int weaponId = getTemplate().getRightHand();
 		
 		if (weaponId < 1)
 			return null;
 		
 		// Get the weapon item equiped in the right hand of the L2NpcInstance
-		L2Item item = ItemTable.getInstance().getTemplate(getTemplate().rhand);
+		L2Item item = ItemTable.getInstance().getTemplate(getTemplate().getRightHand());
 		
 		if (!(item instanceof L2Weapon))
 			return null;
@@ -999,13 +999,13 @@ public class L2Npc extends L2Character
 	public L2Weapon getSecondaryWeaponItem()
 	{
 		// Get the weapon identifier equiped in the right hand of the L2NpcInstance
-		int weaponId = getTemplate().lhand;
+		int weaponId = getTemplate().getLeftHand();
 		
 		if (weaponId < 1)
 			return null;
 		
 		// Get the weapon item equiped in the right hand of the L2NpcInstance
-		L2Item item = ItemTable.getInstance().getTemplate(getTemplate().lhand);
+		L2Item item = ItemTable.getInstance().getTemplate(getTemplate().getLeftHand());
 		
 		if (!(item instanceof L2Weapon))
 			return null;
@@ -1144,10 +1144,10 @@ public class L2Npc extends L2Character
 			}
 		}
 		
-		if ("L2Auctioneer".equals(getTemplate().type) && val == 0)
+		if (getTemplate().isType("L2Auctioneer") && (val == 0))
 			return;
 		
-		int npcId = getTemplate().npcId;
+		int npcId = getTemplate().getNpcId();
 		
 		/* For use with Seven Signs implementation */
 		String filename = SevenSigns.SEVEN_SIGNS_HTML_PATH;
@@ -1331,7 +1331,7 @@ public class L2Npc extends L2Character
 	 */
 	public int getExpReward()
 	{
-		return (int) (getTemplate().rewardExp * Config.RATE_XP);
+		return (int) (getTemplate().getRewardExp() * Config.RATE_XP);
 	}
 	
 	/**
@@ -1339,7 +1339,7 @@ public class L2Npc extends L2Character
 	 */
 	public int getSpReward()
 	{
-		return (int) (getTemplate().rewardSp * Config.RATE_SP);
+		return (int) (getTemplate().getRewardSp() * Config.RATE_SP);
 	}
 	
 	/**
@@ -1368,8 +1368,8 @@ public class L2Npc extends L2Character
 		
 		// normally this wouldn't really be needed, but for those few exceptions,
 		// we do need to reset the weapons back to the initial template weapon.
-		_currentLHandId = getTemplate().lhand;
-		_currentRHandId = getTemplate().rhand;
+		_currentLHandId = getTemplate().getLeftHand();
+		_currentRHandId = getTemplate().getRightHand();
 		_currentCollisionHeight = getTemplate().getfCollisionHeight();
 		_currentCollisionRadius = getTemplate().getfCollisionRadius();
 		DecayTaskManager.getInstance().addDecayTask(this);
@@ -1494,7 +1494,7 @@ public class L2Npc extends L2Character
 	@Override
 	public String toString()
 	{
-		return getClass().getSimpleName() + ":" + getTemplate().name + "(" + getNpcId() + ")" + "[" + getObjectId() + "]";
+		return getClass().getSimpleName() + ":" + getName() + "(" + getNpcId() + ")" + "[" + getObjectId() + "]";
 	}
 	
 	public boolean isDecayed()

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

@@ -272,7 +272,7 @@ public abstract class L2Summon extends L2Playable
 	
 	public final int getNpcId()
 	{
-		return getTemplate().npcId;
+		return getTemplate().getNpcId();
 	}
 	
 	public int getMaxLoad()

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Trap.java

@@ -55,7 +55,7 @@ public class L2Trap extends L2Character
 	{
 		super(objectId, template);
 		setInstanceType(InstanceType.L2Trap);
-		setName(template.name);
+		setName(template.getName());
 		setIsInvul(false);
 		
 		_isTriggered = false;
@@ -120,7 +120,7 @@ public class L2Trap extends L2Character
 	 */
 	public final int getNpcId()
 	{
-		return getTemplate().npcId;
+		return getTemplate().getNpcId();
 	}
 	
 	/**
@@ -183,7 +183,7 @@ public class L2Trap extends L2Character
 	@Override
 	public int getLevel()
 	{
-		return getTemplate().level;
+		return getTemplate().getLevel();
 	}
 	
 	/**

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

@@ -40,9 +40,9 @@ public class L2BirthdayCakeInstance extends L2Npc
 	{
 		super(objectId, template);
 		
-		if (template.npcId == BIRTHDAY_CAKE_24)
+		if (template.getNpcId() == BIRTHDAY_CAKE_24)
 			_skill = SkillTable.getInstance().getInfo(22035, 1);
-		else if (template.npcId == BIRTHDAY_CAKE)
+		else if (template.getNpcId() == BIRTHDAY_CAKE)
 			_skill = SkillTable.getInstance().getInfo(22250, 1);
 		
 		_masterId = masterId;

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

@@ -333,7 +333,7 @@ public class L2CastleChamberlainInstance extends L2MerchantInstance
 					}
 					
 					NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-					html.setFile(player.getHtmlPrefix(), "data/html/chamberlain/" + getTemplate().npcId	+ "-d.htm");
+					html.setFile(player.getHtmlPrefix(), "data/html/chamberlain/" + getTemplate().getNpcId() + "-d.htm");
 					html.replace("%objectId%", String.valueOf(getObjectId()));
 					html.replace("%npcname%", getName());
 					player.sendPacket(html);

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ChestInstance.java

@@ -73,7 +73,7 @@ public final class L2ChestInstance extends L2MonsterInstance
 	@Override
 	public void doItemDrop(L2NpcTemplate npcTemplate, L2Character lastAttacker)
 	{
-		int id = getTemplate().npcId;
+		int id = getTemplate().getNpcId();
 		
 		if (!_specialDrop)
 		{
@@ -101,21 +101,21 @@ public final class L2ChestInstance extends L2MonsterInstance
 		int trapSkillId = 0;
 		int rnd = Rnd.get(120);
 		
-		if (getTemplate().level >= 61)
+		if (getTemplate().getLevel() >= 61)
 		{
 			if (rnd >= 90) trapSkillId = 4139;//explosion
 			else if (rnd >= 50) trapSkillId = 4118;//area paralysys
 			else if (rnd >= 20) trapSkillId = 1167;//poison cloud
 			else trapSkillId = 223;//sting
 		}
-		else if (getTemplate().level >= 41)
+		else if (getTemplate().getLevel() >= 41)
 		{
 			if (rnd >= 90) trapSkillId = 4139;//explosion
 			else if (rnd >= 60) trapSkillId = 96;//bleed
 			else if (rnd >= 20) trapSkillId = 1167;//poison cloud
 			else trapSkillId = 4118;//area paralysys
 		}
-		else if (getTemplate().level >= 21)
+		else if (getTemplate().getLevel() >= 21)
 		{
 			if (rnd >= 80) trapSkillId = 4139;//explosion
 			else if (rnd >= 50) trapSkillId = 96;//bleed
@@ -138,7 +138,7 @@ public final class L2ChestInstance extends L2MonsterInstance
 	private boolean handleCast(L2Character player, int skillId)
 	{
 		int skillLevel = 1;
-		byte lvl = getTemplate().level;
+		byte lvl = getTemplate().getLevel();
 		if (lvl > 20 && lvl <= 40) skillLevel = 3;
 		else if (lvl > 40 && lvl <= 60) skillLevel = 5;
 		else if (lvl > 60) skillLevel = 6;

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

@@ -48,7 +48,7 @@ public class L2DecoyInstance extends L2Decoy
 		}
 		_timeRemaining = _totalLifeTime;
 		int delay = 1000;
-		int skilllevel = getTemplate().idTemplate - 13070;
+		int skilllevel = getTemplate().getIdTemplate() - 13070;
 		_DecoyLifeTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new DecoyLifetime(getOwner(), this), delay, delay);
 		_HateSpam = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new HateSpam(this, SkillTable.getInstance().getInfo(5272, skilllevel)), 2000, 5000);
 	}

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2DoormenInstance.java

@@ -87,9 +87,9 @@ public class L2DoormenInstance extends L2NpcInstance
 		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
 		
 		if (!isOwnerClan(player))
-			html.setFile(player.getHtmlPrefix(), "data/html/doormen/"+ getTemplate().npcId + "-no.htm");
+			html.setFile(player.getHtmlPrefix(), "data/html/doormen/" + getTemplate().getNpcId() + "-no.htm");
 		else
-			html.setFile(player.getHtmlPrefix(), "data/html/doormen/"+ getTemplate().npcId + ".htm");
+			html.setFile(player.getHtmlPrefix(), "data/html/doormen/" + getTemplate().getNpcId() + ".htm");
 		
 		html.replace("%objectId%", String.valueOf(getObjectId()));
 		player.sendPacket(html);
@@ -122,7 +122,7 @@ public class L2DoormenInstance extends L2NpcInstance
 		player.sendPacket(ActionFailed.STATIC_PACKET);
 		
 		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-		html.setFile(player.getHtmlPrefix(), "data/html/doormen/"+ getTemplate().npcId + "-busy.htm");
+		html.setFile(player.getHtmlPrefix(), "data/html/doormen/" + getTemplate().getNpcId() + "-busy.htm");
 		player.sendPacket(html);
 	}
 	

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2FortDoormenInstance.java

@@ -37,11 +37,11 @@ public class L2FortDoormenInstance extends L2DoormenInstance
 		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
 		
 		if (!isOwnerClan(player))
-			html.setFile(player.getHtmlPrefix(), "data/html/doormen/"+ getTemplate().npcId + "-no.htm");
+			html.setFile(player.getHtmlPrefix(), "data/html/doormen/" + getTemplate().getNpcId() + "-no.htm");
 		else if (isUnderSiege())
-			html.setFile(player.getHtmlPrefix(), "data/html/doormen/"+ getTemplate().npcId + "-busy.htm");
+			html.setFile(player.getHtmlPrefix(), "data/html/doormen/" + getTemplate().getNpcId() + "-busy.htm");
 		else
-			html.setFile(player.getHtmlPrefix(), "data/html/doormen/"+ getTemplate().npcId + ".htm");
+			html.setFile(player.getHtmlPrefix(), "data/html/doormen/" + getTemplate().getNpcId() + ".htm");
 		
 		html.replace("%objectId%", String.valueOf(getObjectId()));
 		player.sendPacket(html);

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

@@ -203,7 +203,7 @@ public class L2FortManagerInstance extends L2MerchantInstance
 					else
 					{
 						NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
-						html.setFile(player.getHtmlPrefix(), "data/html/fortress/" + getTemplate().npcId	+ "-d.htm");
+						html.setFile(player.getHtmlPrefix(), "data/html/fortress/" + getTemplate().getNpcId() + "-d.htm");
 						html.replace("%objectId%", String.valueOf(getObjectId()));
 						html.replace("%npcname%", getName());
 						player.sendPacket(html);

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

@@ -93,7 +93,7 @@ public class L2MonsterInstance extends L2Attackable
 	@Override
 	public boolean isAggressive()
 	{
-		return (getTemplate().aggroRange > 0) && !isEventMob;
+		return (getTemplate().getAggroRange() > 0) && !isEventMob;
 	}
 	
 	@Override

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

@@ -14,6 +14,8 @@
  */
 package com.l2jserver.gameserver.model.actor.instance;
 
+import java.util.List;
+
 import javolution.util.FastList;
 import javolution.util.FastMap;
 
@@ -36,7 +38,7 @@ import com.l2jserver.util.StringUtil;
 
 public class L2NpcInstance extends L2Npc
 {
-	private final ClassId[] _classesToTeach;
+	private final List<ClassId> _classesToTeach;
 	
 	public L2NpcInstance(int objectId, L2NpcTemplate template)
 	{
@@ -67,10 +69,10 @@ public class L2NpcInstance extends L2Npc
 				super.addEffect(newEffect);
 			else
 				newEffect.stopEffectTask();
-		}		
+		}
 	}
 	
-	public ClassId[] getClassesToTeach()
+	public List<ClassId> getClassesToTeach()
 	{
 		return _classesToTeach;
 	}
@@ -88,7 +90,7 @@ public class L2NpcInstance extends L2Npc
 			_log.fine("SkillList activated on: "+npc.getObjectId());
 		}
 		
-		final int npcId = npc.getTemplate().npcId;
+		final int npcId = npc.getTemplate().getNpcId();
 		
 		if (npcId == 32611) //Tolonis (Officer)
 		{

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

@@ -6670,7 +6670,7 @@ public final class L2PcInstance extends L2Playable
 			return false;
 		
 		stopAllToggles();
-		Ride mount = new Ride(this, true, pet.getTemplate().npcId);
+		Ride mount = new Ride(this, true, pet.getTemplate().getNpcId());
 		setMount(pet.getNpcId(), pet.getLevel(), mount.getMountType());
 		setMountObjectID(pet.getControlObjectId());
 		clearPetData();

+ 13 - 12
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java

@@ -103,7 +103,7 @@ public class L2PetInstance extends L2Summon
 	public final L2PetLevelData getPetLevelData()
 	{
 		if (_leveldata == null)
-			_leveldata = PetDataTable.getInstance().getPetLevelData(getTemplate().npcId, getStat().getLevel());
+			_leveldata = PetDataTable.getInstance().getPetLevelData(getTemplate().getNpcId(), getStat().getLevel());
 		
 		return _leveldata;
 	}
@@ -111,7 +111,7 @@ public class L2PetInstance extends L2Summon
 	public final L2PetData getPetData()
 	{
 		if (_data == null)
-			_data = PetDataTable.getInstance().getPetData(getTemplate().npcId);
+			_data = PetDataTable.getInstance().getPetData(getTemplate().getNpcId());
 		
 		return _data;
 	}
@@ -158,7 +158,7 @@ public class L2PetInstance extends L2Summon
 					if (getCurrentFed() == 0)
 					{
 						// Owl Monk remove PK
-						if(getTemplate().npcId == 16050 && getOwner() != null)
+						if(getTemplate().getNpcId() == 16050 && getOwner() != null)
 						{
 							getOwner().setPkKills(Math.max(0, getOwner().getPkKills()-Rnd.get(1,6)));
 						}
@@ -268,7 +268,7 @@ public class L2PetInstance extends L2Summon
 	 */
 	public L2PetInstance(int objectId, L2NpcTemplate template, L2PcInstance owner, L2ItemInstance control)
 	{
-		this(objectId, template, owner, control, (byte) (template.idTemplate == 12564 ? owner.getLevel() : template.level));
+		this(objectId, template, owner, control, (byte) (template.getIdTemplate() == 12564 ? owner.getLevel() : template.getLevel()));
 	}
 	
 	/**
@@ -286,12 +286,12 @@ public class L2PetInstance extends L2Summon
 		
 		_controlObjectId = control.getObjectId();
 		
-		getStat().setLevel((byte)Math.max(level, PetDataTable.getInstance().getPetMinLevel(template.npcId)));
+		getStat().setLevel((byte)Math.max(level, PetDataTable.getInstance().getPetMinLevel(template.getNpcId())));
 		
 		_inventory = new PetInventory(this);
 		_inventory.restore();
 		
-		int npcId = template.npcId;
+		int npcId = template.getNpcId();
 		_mountable = PetDataTable.isMountable(npcId);
 		getPetData();
 		getPetLevelData();
@@ -821,22 +821,23 @@ public class L2PetInstance extends L2Summon
 			PreparedStatement statement = con.prepareStatement("SELECT item_obj_id, name, level, curHp, curMp, exp, sp, fed FROM pets WHERE item_obj_id=?");
 			statement.setInt(1, control.getObjectId());
 			ResultSet rset = statement.executeQuery();
+			final int id = IdFactory.getInstance().getNextId();
 			if (!rset.next())
 			{
-				if (template.type.compareToIgnoreCase("L2BabyPet")==0)
-					pet = new L2BabyPetInstance(IdFactory.getInstance().getNextId(), template, owner, control);
+				if (template.isType("L2BabyPet"))
+					pet = new L2BabyPetInstance(id, template, owner, control);
 				else
-					pet = new L2PetInstance(IdFactory.getInstance().getNextId(), template, owner, control);
+					pet = new L2PetInstance(id, template, owner, control);
 				
 				rset.close();
 				statement.close();
 				return pet;
 			}
 			
-			if (template.type.compareToIgnoreCase("L2BabyPet")==0)
-				pet = new L2BabyPetInstance(IdFactory.getInstance().getNextId(), template, owner, control, rset.getByte("level"));
+			if (template.isType("L2BabyPet"))
+				pet = new L2BabyPetInstance(id, template, owner, control, rset.getByte("level"));
 			else
-				pet = new L2PetInstance(IdFactory.getInstance().getNextId(), template, owner, control, rset.getByte("level"));
+				pet = new L2PetInstance(id, template, owner, control, rset.getByte("level"));
 			
 			pet._respawned = true;
 			pet.setName(rset.getString("name"));

+ 8 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2RaceManagerInstance.java

@@ -310,7 +310,7 @@ public class L2RaceManagerInstance extends L2Npc
 	public void showOdds(L2PcInstance player)
 	{
 		if (_state == ACCEPTING_BETS) return;
-		int npcId = getTemplate().npcId;
+		int npcId = getTemplate().getNpcId();
 		String filename, search;
 		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
 		filename = getHtmlPath(npcId, 5);
@@ -319,7 +319,7 @@ public class L2RaceManagerInstance extends L2Npc
 		{
 			int n = i + 1;
 			search = "Mob" + n;
-			html.replace(search, MonsterRace.getInstance().getMonsters()[i].getTemplate().name);
+			html.replace(search, MonsterRace.getInstance().getMonsters()[i].getTemplate().getName());
 		}
 		html.replace("1race", String.valueOf(_raceNumber));
 		html.replace("%objectId%", String.valueOf(getObjectId()));
@@ -329,7 +329,7 @@ public class L2RaceManagerInstance extends L2Npc
 	
 	public void showMonsterInfo(L2PcInstance player)
 	{
-		int npcId = getTemplate().npcId;
+		int npcId = getTemplate().getNpcId();
 		String filename, search;
 		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
 		filename = getHtmlPath(npcId, 6);
@@ -338,7 +338,7 @@ public class L2RaceManagerInstance extends L2Npc
 		{
 			int n = i + 1;
 			search = "Mob" + n;
-			html.replace(search, MonsterRace.getInstance().getMonsters()[i].getTemplate().name);
+			html.replace(search, MonsterRace.getInstance().getMonsters()[i].getTemplate().getName());
 		}
 		html.replace("%objectId%", String.valueOf(getObjectId()));
 		player.sendPacket(html);
@@ -348,7 +348,7 @@ public class L2RaceManagerInstance extends L2Npc
 	public void showBuyTicket(L2PcInstance player, int val)
 	{
 		if (_state != ACCEPTING_BETS) return;
-		int npcId = getTemplate().npcId;
+		int npcId = getTemplate().getNpcId();
 		SystemMessage sm;
 		String filename, search, replace;
 		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
@@ -360,7 +360,7 @@ public class L2RaceManagerInstance extends L2Npc
 			{
 				int n = i + 1;
 				search = "Mob" + n;
-				html.replace(search, MonsterRace.getInstance().getMonsters()[i].getTemplate().name);
+				html.replace(search, MonsterRace.getInstance().getMonsters()[i].getTemplate().getName());
 			}
 			search = "No1";
 			if (val == 0) html.replace(search, "");
@@ -377,7 +377,7 @@ public class L2RaceManagerInstance extends L2Npc
 			html.setFile(player.getHtmlPrefix(), filename);
 			html.replace("0place", "" + player.getRace(0));
 			search = "Mob1";
-			replace = MonsterRace.getInstance().getMonsters()[player.getRace(0) - 1].getTemplate().name;
+			replace = MonsterRace.getInstance().getMonsters()[player.getRace(0) - 1].getTemplate().getName();
 			html.replace(search, replace);
 			search = "0adena";
 			if (val == 10) html.replace(search, "");
@@ -394,7 +394,7 @@ public class L2RaceManagerInstance extends L2Npc
 			html.setFile(player.getHtmlPrefix(), filename);
 			html.replace("0place", "" + player.getRace(0));
 			search = "Mob1";
-			replace = MonsterRace.getInstance().getMonsters()[player.getRace(0) - 1].getTemplate().name;
+			replace = MonsterRace.getInstance().getMonsters()[player.getRace(0) - 1].getTemplate().getName();
 			html.replace(search, replace);
 			search = "0adena";
 			int price = _cost[player.getRace(1) - 1];

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

@@ -44,7 +44,7 @@ public class L2SepulcherMonsterInstance extends L2MonsterInstance
 		super(objectId, template);
 		setInstanceType(InstanceType.L2SepulcherMonsterInstance);
 		setShowSummonAnimation(true);
-		switch (template.npcId)
+		switch (template.getNpcId())
 		{
 			case 25339:
 			case 25342:

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2SummonInstance.java

@@ -123,7 +123,7 @@ public class L2SummonInstance extends L2Summon
 	@Override
 	public final int getLevel()
 	{
-		return (getTemplate() != null ? getTemplate().level : 0);
+		return (getTemplate() != null ? getTemplate().getLevel() : 0);
 	}
 	
 	@Override
@@ -229,7 +229,7 @@ public class L2SummonInstance extends L2Summon
 			return false;
 		
 		if (Config.DEBUG)
-			_log.warning("L2SummonInstance: " + getTemplate().name + " (" + getOwner().getName() + ") has been killed.");
+			_log.warning("L2SummonInstance: " + getTemplate().getName() + " (" + getOwner().getName() + ") has been killed.");
 		
 		if (_summonLifeTask != null)
 		{
@@ -512,7 +512,7 @@ public class L2SummonInstance extends L2Summon
 		public void run()
 		{
 			if (Config.DEBUG)
-				log.warning("L2SummonInstance: " + _summon.getTemplate().name + " (" + _activeChar.getName() + ") run task.");
+				log.warning("L2SummonInstance: " + _summon.getTemplate().getName() + " (" + _activeChar.getName() + ") run task.");
 			
 			try
 			{
@@ -566,7 +566,7 @@ public class L2SummonInstance extends L2Summon
 	public void unSummon(L2PcInstance owner)
 	{
 		if (Config.DEBUG)
-			_log.warning("L2SummonInstance: " + getTemplate().name + " (" + owner.getName() + ") unsummoned.");
+			_log.warning("L2SummonInstance: " + getTemplate().getName() + " (" + owner.getName() + ") unsummoned.");
 		
 		if (_summonLifeTask != null)
 		{
@@ -590,7 +590,7 @@ public class L2SummonInstance extends L2Summon
 	public boolean destroyItemByItemId(String process, int itemId, long count, L2Object reference, boolean sendMessage)
 	{
 		if (Config.DEBUG)
-			_log.warning("L2SummonInstance: " + getTemplate().name + " (" + getOwner().getName() + ") consume.");
+			_log.warning("L2SummonInstance: " + getTemplate().getName() + " (" + getOwner().getName() + ") consume.");
 		
 		return getOwner().destroyItemByItemId(process, itemId, count, reference, sendMessage);
 	}

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

@@ -163,9 +163,9 @@ public final class L2TeleporterInstance extends L2Npc
 		
 		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
 		
-		String filename = "data/html/teleporter/free/" + getTemplate().npcId + ".htm";
+		String filename = "data/html/teleporter/free/" + getTemplate().getNpcId() + ".htm";
 		if (!HtmCache.getInstance().isLoadable(filename))
-			filename = "data/html/teleporter/" + getTemplate().npcId + "-1.htm";
+			filename = "data/html/teleporter/" + getTemplate().getNpcId() + "-1.htm";
 		
 		html.setFile(player.getHtmlPrefix(), filename);
 		html.replace("%objectId%", String.valueOf(getObjectId()));

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

@@ -71,7 +71,7 @@ public class L2XmassTreeInstance extends L2Npc
 	{
 		super(objectId, template);
 		setInstanceType(InstanceType.L2XmassTreeInstance);
-		if (template.npcId == SPECIAL_TREE_ID)
+		if (template.getNpcId() == SPECIAL_TREE_ID)
 			_aiTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new XmassAI(this,SkillTable.getInstance().getInfo(2139, 1)), 3000, 3000);
 	}
 	

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/NpcStat.java

@@ -27,7 +27,7 @@ public class NpcStat extends CharStat
 	@Override
 	public byte getLevel()
 	{
-		return getActiveChar().getTemplate().level;
+		return getActiveChar().getTemplate().getLevel();
 	}
 	
 	@Override

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/PetStat.java

@@ -106,9 +106,9 @@ public class PetStat extends SummonStat
 	@Override
 	public void setLevel(byte value)
 	{
-		getActiveChar().setPetData(PetDataTable.getInstance().getPetLevelData(getActiveChar().getTemplate().npcId, value));
+		getActiveChar().setPetData(PetDataTable.getInstance().getPetLevelData(getActiveChar().getTemplate().getNpcId(), value));
 		if (getActiveChar().getPetLevelData() == null)
-			throw new IllegalArgumentException("No pet data for npc: "+getActiveChar().getTemplate().npcId+" level: "+value);
+			throw new IllegalArgumentException("No pet data for npc: " + getActiveChar().getTemplate().getNpcId() + " level: " + value);
 		getActiveChar().stopFeed();
 		super.setLevel(value);
 		

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/PlayableStat.java

@@ -52,7 +52,7 @@ public class PlayableStat extends CharStat
 		if (getActiveChar() instanceof L2PetInstance)
 		{
 			// get minimum level from L2NpcTemplate
-			minimumLevel = (byte)PetDataTable.getInstance().getPetMinLevel(((L2PetInstance)getActiveChar()).getTemplate().npcId);
+			minimumLevel = (byte) PetDataTable.getInstance().getPetMinLevel(((L2PetInstance) getActiveChar()).getTemplate().getNpcId());
 		}
 		
 		byte level = minimumLevel; // minimum level
@@ -81,7 +81,7 @@ public class PlayableStat extends CharStat
 		if (getActiveChar() instanceof L2PetInstance)
 		{
 			// get minimum level from L2NpcTemplate
-			minimumLevel = (byte)PetDataTable.getInstance().getPetMinLevel(((L2PetInstance)getActiveChar()).getTemplate().npcId);
+			minimumLevel = (byte) PetDataTable.getInstance().getPetMinLevel(((L2PetInstance) getActiveChar()).getTemplate().getNpcId());
 		}
 		byte level = minimumLevel;
 		

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestChangePetName.java

@@ -56,7 +56,7 @@ public final class RequestChangePetName extends L2GameClientPacket
 			activeChar.sendPacket(SystemMessageId.NAMING_YOU_CANNOT_SET_NAME_OF_THE_PET);
 			return;
 		}
-		else if (PetNameTable.getInstance().doesPetNameExist(_name, pet.getTemplate().npcId))
+		else if (PetNameTable.getInstance().doesPetNameExist(_name, pet.getTemplate().getNpcId()))
 		{
 			activeChar.sendPacket(SystemMessageId.NAMING_ALREADY_IN_USE_BY_ANOTHER_PET);
 			return;

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

@@ -93,20 +93,20 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 		{
 			super(cha);
 			_npc = cha;
-			_idTemplate = cha.getTemplate().idTemplate; // On every subclass
+			_idTemplate = cha.getTemplate().getIdTemplate(); // On every subclass
 			_rhand = cha.getRightHandItem(); // On every subclass
 			_lhand = cha.getLeftHandItem(); // On every subclass
 			_enchantEffect = cha.getEnchantEffect();
 			_collisionHeight = cha.getCollisionHeight();// On every subclass
 			_collisionRadius = cha.getCollisionRadius();// On every subclass
 			_isAttackable = cha.isAutoAttackable(attacker);
-			if (cha.getTemplate().serverSideName)
+			if (cha.getTemplate().isServerSideName())
 				_name = cha.getName();// On every subclass
 			
 			if (Config.L2JMOD_CHAMPION_ENABLE && cha.isChampion())
 				_title = (Config.L2JMOD_CHAMP_TITLE); // On every subclass
-			else if (cha.getTemplate().serverSideTitle)
-				_title = cha.getTemplate().title; // On every subclass
+			else if (cha.getTemplate().isServerSideTitle())
+				_title = cha.getTemplate().getTitle(); // On every subclass
 			else
 				_title = cha.getTitle(); // On every subclass
 			
@@ -208,13 +208,13 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			super(cha);
 			
 			_trap = cha;
-			_idTemplate = cha.getTemplate().idTemplate;
+			_idTemplate = cha.getTemplate().getIdTemplate();
 			_isAttackable = cha.isAutoAttackable(attacker);
 			_rhand = 0;
 			_lhand = 0;
 			_collisionHeight = _trap.getTemplate().getfCollisionHeight();
 			_collisionRadius = _trap.getTemplate().getfCollisionRadius();
-			if (cha.getTemplate().serverSideName)
+			if (cha.getTemplate().isServerSideName())
 				_name = cha.getName();
 			_title = cha.getOwner() != null ? cha.getOwner().getName() : "";
 			_runSpd = _trap.getRunSpeed();
@@ -302,7 +302,7 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			if (_summon.isShowSummonAnimation())
 				_val = 2; //override for spawn
 			
-			int npcId = cha.getTemplate().npcId;
+			int npcId = cha.getTemplate().getNpcId();
 			
 			if (npcId == 16041 || npcId == 16042)
 			{
@@ -328,10 +328,10 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			_rhand = cha.getWeapon();
 			_lhand = 0;
 			_chest = cha.getArmor();
-			_enchantEffect = cha.getTemplate().enchantEffect;
+			_enchantEffect = cha.getTemplate().getEnchantEffect();
 			_name = cha.getName();
 			_title = cha.getOwner() != null ? ((!cha.getOwner().isOnline()) ? "" : cha.getOwner().getName()) : ""; // when owner online, summon will show in title owner name
-			_idTemplate = cha.getTemplate().idTemplate;
+			_idTemplate = cha.getTemplate().getIdTemplate();
 			_collisionHeight = cha.getTemplate().getfCollisionHeight();
 			_collisionRadius = cha.getTemplate().getfCollisionRadius();
 			_invisible = cha.getOwner() != null ? cha.getOwner().getAppearance().getInvisible() : false;

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

@@ -113,8 +113,8 @@ public class ConfirmDlg extends L2GameServerPacket
 	public ConfirmDlg addNpcName(L2NpcTemplate tpl)
 	{
 		if (tpl.isCustom())
-			return addString(tpl.name);
-		return addNpcName(tpl.npcId);
+			return addString(tpl.getName());
+		return addNpcName(tpl.getNpcId());
 	}
 	
 	public ConfirmDlg addNpcName(int id)

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

@@ -48,7 +48,7 @@ public final class ExPartyPetWindowAdd extends L2GameServerPacket
 		writeC(0xfe);
 		writeH(0x18);
 		writeD(_summon.getObjectId());
-		writeD(_summon.getTemplate().idTemplate + 1000000);
+		writeD(_summon.getTemplate().getIdTemplate() + 1000000);
 		writeD(_summon.getSummonType());
 		writeD(_summon.getOwner().getObjectId());
 		writeS(_summon.getName());

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

@@ -47,7 +47,7 @@ public class ExPartyPetWindowUpdate extends L2GameServerPacket
 		writeC(0xfe);
 		writeH(0x19);
 		writeD(_summon.getObjectId());
-		writeD(_summon.getTemplate().idTemplate + 1000000);
+		writeD(_summon.getTemplate().getIdTemplate() + 1000000);
 		writeD(_summon.getSummonType());
 		writeD(_summon.getOwner().getObjectId());
 		writeS(_summon.getName());

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

@@ -69,7 +69,7 @@ public class MonRaceInfo extends L2GameServerPacket
 		{
 			//_log.info("MOnster "+(i+1)+" npcid "+_monsters[i].getNpcTemplate().getNpcId());
 			writeD(_monsters[i].getObjectId());                         //npcObjectID
-			writeD(_monsters[i].getTemplate().npcId+1000000);   //npcID
+			writeD(_monsters[i].getTemplate().getNpcId()+1000000);   //npcID
 			writeD(14107);                                              //origin X
 			writeD(181875 + (58 * (7-i)));                                  //origin Y
 			writeD(-3566);                                              //origin Z

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

@@ -81,7 +81,7 @@ public class PetInfo extends L2GameServerPacket
 		writeC(0xb2);
 		writeD(_summon.getSummonType());
 		writeD(_summon.getObjectId());
-		writeD(_summon.getTemplate().idTemplate+1000000);
+		writeD(_summon.getTemplate().getIdTemplate()+1000000);
 		writeD(0);    // 1=attackable
 		
 		writeD(_x);
@@ -119,7 +119,7 @@ public class PetInfo extends L2GameServerPacket
 		}
 		else
 		{
-			writeS(_summon.getTemplate().serverSideName ? _summon.getName() : ""); // Summon name.
+			writeS(_summon.getTemplate().isServerSideName() ? _summon.getName() : ""); // Summon name.
 		}
 		writeD(-1); // High Five NPCString ID
 		writeS(_summon.getTitle()); // owner name

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

@@ -78,7 +78,7 @@ public class SellList extends L2GameServerPacket
 	{
 		writeC(0x06);
 		writeQ(_money);
-		writeD(_lease == null ? 0x00 : 1000000 + _lease.getTemplate().npcId);
+		writeD(_lease == null ? 0x00 : 1000000 + _lease.getTemplate().getNpcId());
 		writeH(_selllist.size());
 		
 		for (L2ItemInstance item : _selllist)

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

@@ -34,7 +34,7 @@ public final class ServerObjectInfo extends L2GameServerPacket
 	public ServerObjectInfo(L2Npc activeChar, L2Character actor)
 	{
 		_activeChar = activeChar;
-		_idTemplate = _activeChar.getTemplate().idTemplate;
+		_idTemplate = _activeChar.getTemplate().getIdTemplate();
 		_isAttackable = _activeChar.isAutoAttackable(actor);
 		_collisionHeight = _activeChar.getCollisionHeight();
 		_collisionRadius = _activeChar.getCollisionRadius();
@@ -42,7 +42,7 @@ public final class ServerObjectInfo extends L2GameServerPacket
 		_y = _activeChar.getY();
 		_z = _activeChar.getZ();
 		_heading = _activeChar.getHeading();
-		_name = _activeChar.getTemplate().serverSideName ? _activeChar.getTemplate().name : "";
+		_name = _activeChar.getTemplate().isServerSideName() ? _activeChar.getTemplate().getName() : "";
 	}
 	
 	/**

+ 6 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/SystemMessage.java

@@ -204,8 +204,8 @@ public final class SystemMessage extends L2GameServerPacket
 	{
 		if (cha instanceof L2Npc)
 		{
-			if (((L2Npc)cha).getTemplate().serverSideName)
-				return addString(((L2Npc)cha).getTemplate().name);
+			if (((L2Npc)cha).getTemplate().isServerSideName())
+				return addString(((L2Npc)cha).getTemplate().getName());
 			return addNpcName((L2Npc)cha);
 		}
 		else if (cha instanceof L2PcInstance)
@@ -214,8 +214,8 @@ public final class SystemMessage extends L2GameServerPacket
 		}
 		else if (cha instanceof L2Summon)
 		{
-			if (((L2Summon)cha).getTemplate().serverSideName)
-				return addString(((L2Summon)cha).getTemplate().name);
+			if (((L2Summon)cha).getTemplate().isServerSideName())
+				return addString(((L2Summon)cha).getTemplate().getName());
 			return addNpcName((L2Summon)cha);
 		}
 		return addString(cha.getName());
@@ -240,8 +240,8 @@ public final class SystemMessage extends L2GameServerPacket
 	public final SystemMessage addNpcName(final L2NpcTemplate template)
 	{
 		if (template.isCustom())
-			return addString(template.name);
-		return addNpcName(template.npcId);
+			return addString(template.getName());
+		return addNpcName(template.getNpcId());
 	}
 	
 	public final SystemMessage addNpcName(final int id)

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

@@ -312,7 +312,7 @@ public final class UserInfo extends L2GameServerPacket
 		{
 			L2NpcTemplate polyObj = NpcTable.getInstance().getTemplate(_activeChar.getPoly().getPolyId());
 			if(polyObj != null)
-				title += " - " + polyObj.name;
+				title += " - " + polyObj.getName();
 		}
 		writeS(title);
 		

+ 14 - 15
L2J_Server_BETA/java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java

@@ -116,16 +116,14 @@ public class FaenorInterface implements EngineInterface
 		{
 			int maxCategory = -1;
 			
-			if (npc.getDropData() != null)
-				for (L2DropCategory cat : npc.getDropData())
-				{
-					if (maxCategory < cat.getCategoryType())
-						maxCategory = cat.getCategoryType();
-				}
+			for (L2DropCategory cat : npc.getDropData())
+			{
+				if (maxCategory < cat.getCategoryType())
+					maxCategory = cat.getCategoryType();
+			}
 			maxCategory++;
 			npc.addDropData(drop, maxCategory);
 		}
-		
 	}
 	
 	/**
@@ -146,16 +144,17 @@ public class FaenorInterface implements EngineInterface
 		{
 			return null;
 		}
-		List<L2DropData> questDrops = new FastList<L2DropData>();
-		if (npc.getDropData() != null)
-			for (L2DropCategory cat : npc.getDropData())
-				for (L2DropData drop : cat.getAllDrops())
+		List<L2DropData> questDrops = new FastList<>();
+		for (L2DropCategory cat : npc.getDropData())
+		{
+			for (L2DropData drop : cat.getAllDrops())
+			{
+				if (drop.getQuestID() != null)
 				{
-					if (drop.getQuestID() != null)
-					{
-						questDrops.add(drop);
-					}
+					questDrops.add(drop);
 				}
+			}
+		}
 		return questDrops;
 	}
 	

+ 23 - 14
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/l2skills/L2SkillSpawn.java

@@ -60,7 +60,6 @@ public class L2SkillSpawn extends L2Skill
 			return;
 		}
 		
-		L2Npc npc;
 		final L2NpcTemplate template = NpcTable.getInstance().getTemplate(_npcId);
 		if (template == null)
 		{
@@ -68,21 +67,31 @@ public class L2SkillSpawn extends L2Skill
 			return;
 		}
 		
-		if (template.type.equalsIgnoreCase("L2XmassTree"))
-			npc = new L2XmassTreeInstance(IdFactory.getInstance().getNextId(), template);
-		else if (template.type.equalsIgnoreCase("L2BirthdayCake"))
-			npc = new L2BirthdayCakeInstance(IdFactory.getInstance().getNextId(), template, caster.getObjectId());
-		else if (template.type.equalsIgnoreCase("L2Totem"))
-			npc = new L2TotemInstance(IdFactory.getInstance().getNextId(), template, _skillToCast);
-		/*
-		 * TODO
-		 * else if (template.type.equalsIgnoreCase("L2WeddingCake"))
-		 * npc = new L2WeddingCakeInstance(IdFactory.getInstance().getNextId(), template);
-		 */
+		final int id = IdFactory.getInstance().getNextId();
+		final L2Npc npc;
+		if (template.isType("L2XmassTree"))
+		{
+			npc = new L2XmassTreeInstance(id, template);
+		}
+		else if (template.isType("L2BirthdayCake"))
+		{
+			npc = new L2BirthdayCakeInstance(id, template, caster.getObjectId());
+		}
+		else if (template.isType("L2Totem"))
+		{
+			npc = new L2TotemInstance(id, template, _skillToCast);
+		}
+		else if (template.isType("L2WeddingCake"))
+		{
+			 // TODO: npc = new L2WeddingCakeInstance(id, template);
+			npc = new L2NpcInstance(id, template);
+		}
 		else
-			npc = new L2NpcInstance(IdFactory.getInstance().getNextId(), template);
+		{
+			npc = new L2NpcInstance(id, template);
+		}
 		
-		npc.setName(template.name);
+		npc.setName(template.getName());
 		npc.setTitle(caster.getName());
 		npc.setHeading(-1);
 		npc.setShowSummonAnimation(_summonSpawn);

+ 8 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/l2skills/L2SkillSummon.java

@@ -228,14 +228,16 @@ public class L2SkillSummon extends L2Skill
 			_log.warning("Summon attempt for nonexisting NPC ID:"+_npcId+", skill ID:"+this.getId());
 			return; // npcID doesn't exist
 		}
-		if (summonTemplate.type.equalsIgnoreCase("L2SiegeSummon"))
-			summon = new L2SiegeSummonInstance(IdFactory.getInstance().getNextId(), summonTemplate, activeChar, this);
-		else if (summonTemplate.type.equalsIgnoreCase("L2MerchantSummon"))
-			summon = new L2MerchantSummonInstance(IdFactory.getInstance().getNextId(), summonTemplate, activeChar, this);
+		
+		final int id = IdFactory.getInstance().getNextId();
+		if (summonTemplate.isType("L2SiegeSummon"))
+			summon = new L2SiegeSummonInstance(id, summonTemplate, activeChar, this);
+		else if (summonTemplate.isType("L2MerchantSummon"))
+			summon = new L2MerchantSummonInstance(id, summonTemplate, activeChar, this);
 		else
-			summon = new L2SummonInstance(IdFactory.getInstance().getNextId(), summonTemplate, activeChar, this);
+			summon = new L2SummonInstance(id, summonTemplate, activeChar, this);
 		
-		summon.setName(summonTemplate.name);
+		summon.setName(summonTemplate.getName());
 		summon.setTitle(activeChar.getName());
 		summon.setExpPenalty(_expPenalty);
 		summon.setSharedElementals(_inheritElementals);

+ 620 - 601
L2J_Server_BETA/java/com/l2jserver/gameserver/templates/chars/L2NpcTemplate.java

@@ -36,95 +36,83 @@ import com.l2jserver.gameserver.model.quest.Quest.QuestEventType;
 import com.l2jserver.gameserver.templates.StatsSet;
 
 /**
- * This cl contains all generic data of a L2Spawn object.<BR><BR>
- *
- * <B><U> Data</U> :</B><BR><BR>
- * <li>npcId, type, name, sex</li>
- * <li>rewardExp, rewardSp</li>
- * <li>aggroRange, factionId, factionRange</li>
- * <li>rhand, lhand</li>
- * <li>isUndead</li>
- * <li>_drops</li>
- * <li>_minions</li>
- * <li>_teachInfo</li>
- * <li>_skills</li>
- * <li>_questsStart</li><BR><BR>
- *
- * @version $Revision: 1.1.2.4 $ $Date: 2005/04/02 15:57:51 $
+ * @author Zoey76
  */
 public final class L2NpcTemplate extends L2CharTemplate
 {
-	protected static final Logger _log = Logger.getLogger(Quest.class.getName());
-	
-	public final int npcId;
-	public final int idTemplate;
-	public final String type;
-	public final String name;
-	public final boolean serverSideName;
-	public final String title;
-	public final boolean serverSideTitle;
-	public final String sex;
-	public final byte level;
-	public final int rewardExp;
-	public final int rewardSp;
-	public final int aggroRange;
-	public final int rhand;
-	public final int lhand;
-	public final int enchantEffect;
-	public Race race;
-	public final String jClass;
-	public final int dropherbgroup;
-	public boolean isQuestMonster; // doesn't include all mobs that are involved in
-	// quests, just plain quest monsters for preventing champion spawn
-	public final float baseVitalityDivider;
-	
-	//Skill AI
-	public FastList<L2Skill> _buffskills;
-	public FastList<L2Skill> _negativeskills;
-	public FastList<L2Skill> _debuffskills;
-	public FastList<L2Skill> _atkskills;
-	public FastList<L2Skill> _rootskills;
-	public FastList<L2Skill> _stunskills;
-	public FastList<L2Skill> _sleepskills;
-	public FastList<L2Skill> _paralyzeskills;
-	public FastList<L2Skill> _fossilskills;
-	public FastList<L2Skill> _floatskills;
-	public FastList<L2Skill> _immobiliseskills;
-	public FastList<L2Skill> _healskills;
-	public FastList<L2Skill> _resskills;
-	public FastList<L2Skill> _dotskills;
-	public FastList<L2Skill> _cotskills;
-	public FastList<L2Skill> _universalskills;
-	public FastList<L2Skill> _manaskills;
-	public FastList<L2Skill> _Lrangeskills;
-	public FastList<L2Skill> _Srangeskills;
-	public FastList<L2Skill> _generalskills;
-	private FastList<L2Skill> _suicideSkills;
-	
-	private boolean _hasbuffskills;
-	private boolean _hasnegativeskills;
-	private boolean _hasdebuffskills;
-	private boolean _hasatkskills;
-	private boolean _hasrootskills;
-	private boolean _hasstunskills;
-	private boolean _hassleepskills;
-	private boolean _hasparalyzeskills;
-	private boolean _hasfossilskills;
-	private boolean _hasfloatskills;
-	private boolean _hasimmobiliseskills;
-	private boolean _hashealskills;
-	private boolean _hasresskills;
-	private boolean _hasdotskills;
-	private boolean _hascotskills;
-	private boolean _hasuniversalskills;
-	private boolean _hasmanaskills;
-	private boolean _hasLrangeskills;
-	private boolean _hasSrangeskills;
-	private boolean _hasgeneralskills;
-	private boolean _hasSuicideSkills;
+	private static final Logger _log = Logger.getLogger(L2NpcTemplate.class.getName());
+	
+	private final int _npcId;
+	private final int _idTemplate;
+	private final String _type;
+	private final String _name;
+	private final boolean _serverSideName;
+	private final String _title;
+	private final boolean _serverSideTitle;
+	private final String _sex;
+	private final byte _level;
+	private final int _rewardExp;
+	private final int _rewardSp;
+	private final int _aggroRange;
+	private final int _rHand;
+	private final int _lHand;
+	private final int _enchantEffect;
+	
+	private Race _race;
+	private final String _clientClass;
+	
+	private final int _dropHerbGroup;
+	private final boolean _isCustom;
+	/**
+	 * Doesn't include all mobs that are involved in quests, just plain quest monsters for preventing champion spawn.
+	 */
+	private final boolean _isQuestMonster;
+	private final float _baseVitalityDivider;
+	
+	// Skill AI
+	private final FastList<L2Skill> _buffSkills = new FastList<>();
+	private final FastList<L2Skill> _negativeSkills = new FastList<>();
+	private final FastList<L2Skill> _debuffSkills = new FastList<>();
+	private final FastList<L2Skill> _atkSkills = new FastList<>();
+	private final FastList<L2Skill> _rootSkills = new FastList<>();
+	private final FastList<L2Skill> _stunskills = new FastList<>();
+	private final FastList<L2Skill> _sleepSkills = new FastList<>();
+	private final FastList<L2Skill> _paralyzeSkills = new FastList<>();
+	private final FastList<L2Skill> _fossilSkills = new FastList<>();
+	private final FastList<L2Skill> _floatSkills = new FastList<>();
+	private final FastList<L2Skill> _immobilizeSkills = new FastList<>();
+	private final FastList<L2Skill> _healSkills = new FastList<>();
+	private final FastList<L2Skill> _resSkills = new FastList<>();
+	private final FastList<L2Skill> _dotSkills = new FastList<>();
+	private final FastList<L2Skill> _cotSkills = new FastList<>();
+	private final FastList<L2Skill> _universalSkills = new FastList<>();
+	private final FastList<L2Skill> _manaSkills = new FastList<>();
+	private final FastList<L2Skill> _longRangeSkills = new FastList<>();
+	private final FastList<L2Skill> _shortRangeSkills = new FastList<>();
+	private final FastList<L2Skill> _generalSkills = new FastList<>();
+	private final FastList<L2Skill> _suicideSkills = new FastList<>();
 	
 	private L2NpcAIData _AIdataStatic = new L2NpcAIData();
 	
+	/**
+	 * The table containing all Item that can be dropped by L2NpcInstance using this L2NpcTemplate
+	 */
+	private final FastList<L2DropCategory> _categories = new FastList<>();
+	
+	/**
+	 * The table containing all Minions that must be spawn with the L2NpcInstance using this L2NpcTemplate
+	 */
+	private final List<L2MinionData> _minions = new FastList<>();
+	
+	private final List<ClassId> _teachInfo = new FastList<>();
+	
+	private final TIntObjectHashMap<L2Skill> _skills = new TIntObjectHashMap<>();
+	
+	/**
+	 * Contains a list of quests for each event type (questStart, questAttack, questKill, etc).
+	 */
+	private final Map<QuestEventType, Quest[]> _questEvents = new FastMap<>();
+	
 	public static enum AIType
 	{
 		FIGHTER,
@@ -165,158 +153,289 @@ public final class L2NpcTemplate extends L2CharTemplate
 		NONE
 	}
 	
-	//private final StatsSet _npcStatsSet;
-	
-	/** The table containing all Item that can be dropped by L2NpcInstance using this L2NpcTemplate*/
-	private FastList<L2DropCategory> _categories = null;
-	
-	/** The table containing all Minions that must be spawn with the L2NpcInstance using this L2NpcTemplate*/
-	private List<L2MinionData> _minions = null;
+	public static boolean isAssignableTo(Class<?> sub, Class<?> clazz)
+	{
+		// If clazz represents an interface
+		if (clazz.isInterface())
+		{
+			// check if obj implements the clazz interface
+			Class<?>[] interfaces = sub.getInterfaces();
+			for (Class<?> interface1 : interfaces)
+			{
+				if (clazz.getName().equals(interface1.getName()))
+				{
+					return true;
+				}
+			}
+		}
+		else
+		{
+			do
+			{
+				if (sub.getName().equals(clazz.getName()))
+				{
+					return true;
+				}
+				
+				sub = sub.getSuperclass();
+			}
+			while (sub != null);
+		}
+		return false;
+	}
 	
-	private List<ClassId> _teachInfo;
-	private TIntObjectHashMap<L2Skill> _skills;
-	//private Map<Stats, Double> _vulnerabilities;
-	// contains a list of quests for each event type (questStart, questAttack, questKill, etc)
-	private Map<Quest.QuestEventType, Quest[]> _questEvents;
+	/**
+	 * Checks if obj can be assigned to the Class represented by clazz.<br>
+	 * This is true if, and only if, obj is the same class represented by clazz, or a subclass of it or obj implements the interface represented by clazz.
+	 * @param obj
+	 * @param clazz
+	 * @return
+	 */
+	public static boolean isAssignableTo(Object obj, Class<?> clazz)
+	{
+		return L2NpcTemplate.isAssignableTo(obj.getClass(), clazz);
+	}
 	
 	/**
-	 * Constructor of L2Character.<BR><BR>
-	 * 
+	 * Constructor of L2Character.
 	 * @param set The StatsSet object to transfer data to the method
-	 * 
 	 */
 	public L2NpcTemplate(StatsSet set)
 	{
 		super(set);
-		npcId = set.getInteger("npcId");
-		idTemplate = set.getInteger("idTemplate");
-		type = set.getString("type");
-		name = set.getString("name");
-		serverSideName = set.getBool("serverSideName");
-		title = set.getString("title");
-		if (title.equalsIgnoreCase("Quest Monster"))
-			isQuestMonster = true;
-		else
-			isQuestMonster = false;
-		serverSideTitle = set.getBool("serverSideTitle");
-		sex = set.getString("sex");
-		level = set.getByte("level");
-		rewardExp = set.getInteger("rewardExp");
-		rewardSp = set.getInteger("rewardSp");
-		aggroRange = set.getInteger("aggroRange");
-		rhand = set.getInteger("rhand");
-		lhand = set.getInteger("lhand");
-		enchantEffect = set.getInteger("enchant");
-		race = null;
-		int herbGroup = set.getInteger("dropHerbGroup");
-		if (herbGroup > 0 && HerbDropTable.getInstance().getHerbDroplist(herbGroup) == null)
+		_npcId = set.getInteger("npcId");
+		_idTemplate = set.getInteger("idTemplate");
+		_type = set.getString("type");
+		_name = set.getString("name");
+		_serverSideName = set.getBool("serverSideName");
+		_title = set.getString("title");
+		_isQuestMonster = getTitle().equalsIgnoreCase("Quest Monster");
+		_serverSideTitle = set.getBool("serverSideTitle");
+		_sex = set.getString("sex");
+		_level = set.getByte("level");
+		_rewardExp = set.getInteger("rewardExp");
+		_rewardSp = set.getInteger("rewardSp");
+		_aggroRange = set.getInteger("aggroRange");
+		_rHand = set.getInteger("rhand");
+		_lHand = set.getInteger("lhand");
+		_enchantEffect = set.getInteger("enchant");
+		_race = null;
+		final int herbGroup = set.getInteger("dropHerbGroup");
+		if ((herbGroup > 0) && (HerbDropTable.getInstance().getHerbDroplist(herbGroup) == null))
 		{
-			_log.warning("Missing Herb Drop Group for npcId: " + npcId);
-			dropherbgroup = 0;
+			_log.warning("Missing Herb Drop Group for npcId: " + getNpcId());
+			_dropHerbGroup = 0;
 		}
 		else
-			dropherbgroup = herbGroup;
+		{
+			_dropHerbGroup = herbGroup;
+		}
+		
+		_clientClass = set.getString("client_class");
 		
-		//_npcStatsSet = set;
-		_teachInfo = null;
-		jClass = set.getString("jClass");
+		// TODO: Could be loaded from db.
+		_baseVitalityDivider = (getLevel() > 0) && (getRewardExp() > 0) ? (getBaseHpMax() * 9 * getLevel() * getLevel()) / (100 * getRewardExp()) : 0;
 		
-		// can be loaded from db
-		baseVitalityDivider = level > 0 && rewardExp > 0 ? getBaseHpMax() * 9 * level * level /(100 * rewardExp) : 0;
+		_isCustom = _npcId != _idTemplate;
 	}
 	
-	public void addTeachInfo(ClassId classId)
+	public void addAtkSkill(L2Skill skill)
 	{
-		if (_teachInfo == null)
-			_teachInfo = new FastList<ClassId>();
-		_teachInfo.add(classId);
+		_atkSkills.add(skill);
 	}
 	
-	public ClassId[] getTeachInfo()
+	public void addBuffSkill(L2Skill skill)
 	{
-		if (_teachInfo == null)
-			return null;
-		return _teachInfo.toArray(new ClassId[_teachInfo.size()]);
+		_buffSkills.add(skill);
 	}
 	
-	public boolean canTeach(ClassId classId)
+	public void addCOTSkill(L2Skill skill)
 	{
-		if (_teachInfo == null)
-			return false;
-		
-		// If the player is on a third class, fetch the class teacher
-		// information for its parent class.
-		if (classId.level() == 3)
-			return _teachInfo.contains(classId.getParent());
-		
-		return _teachInfo.contains(classId);
+		_cotSkills.add(skill);
+	}
+	
+	public void addDebuffSkill(L2Skill skill)
+	{
+		_debuffSkills.add(skill);
+	}
+	
+	public void addDOTSkill(L2Skill skill)
+	{
+		_dotSkills.add(skill);
 	}
 	
-	// add a drop to a given category.  If the category does not exist, create it.
+	/**
+	 * Add a drop to a given category.<br>
+	 * If the category does not exist, create it.
+	 * @param drop
+	 * @param categoryType
+	 */
 	public void addDropData(L2DropData drop, int categoryType)
 	{
 		if (drop.isQuestDrop())
 		{
-			//			if (_questDrops == null)
-			//				_questDrops = new FastList<L2DropData>(0);
-			//			_questDrops.add(drop);
+			// if (_questDrops == null)
+			// _questDrops = new FastList<L2DropData>(0);
+			// _questDrops.add(drop);
 		}
 		else
 		{
-			if (_categories == null)
-				_categories = new FastList<L2DropCategory>();
-			// if the category doesn't already exist, create it first
+			// If the category doesn't already exist, create it first
 			synchronized (_categories)
 			{
 				boolean catExists = false;
 				for (L2DropCategory cat : _categories)
-					// if the category exists, add the drop to this category.
+				{
+					// If the category exists, add the drop to this category.
 					if (cat.getCategoryType() == categoryType)
 					{
-						cat.addDropData(drop, type.equalsIgnoreCase("L2RaidBoss") || type.equalsIgnoreCase("L2GrandBoss"));
+						cat.addDropData(drop, isType("L2RaidBoss") || isType("L2GrandBoss"));
 						catExists = true;
 						break;
 					}
-				// if the category doesn't exit, create it and add the drop
+				}
+				// If the category doesn't exit, create it and add the drop
 				if (!catExists)
 				{
-					L2DropCategory cat = new L2DropCategory(categoryType);
-					cat.addDropData(drop, type.equalsIgnoreCase("L2RaidBoss") || type.equalsIgnoreCase("L2GrandBoss"));
+					final L2DropCategory cat = new L2DropCategory(categoryType);
+					cat.addDropData(drop, isType("L2RaidBoss") || isType("L2GrandBoss"));
 					_categories.add(cat);
 				}
 			}
 		}
 	}
 	
+	public void addFloatSkill(L2Skill skill)
+	{
+		_floatSkills.add(skill);
+	}
+	
+	public void addFossilSkill(L2Skill skill)
+	{
+		_fossilSkills.add(skill);
+	}
+	
+	public void addGeneralSkill(L2Skill skill)
+	{
+		getGeneralskills().add(skill);
+	}
+	
+	public void addHealSkill(L2Skill skill)
+	{
+		_healSkills.add(skill);
+	}
+	
+	public void addImmobiliseSkill(L2Skill skill)
+	{
+		_immobilizeSkills.add(skill);
+	}
+	
+	public void addManaHealSkill(L2Skill skill)
+	{
+		_manaSkills.add(skill);
+	}
+	
+	public void addNegativeSkill(L2Skill skill)
+	{
+		_negativeSkills.add(skill);
+	}
+	
+	public void addParalyzeSkill(L2Skill skill)
+	{
+		_paralyzeSkills.add(skill);
+	}
+	
+	public void addQuestEvent(Quest.QuestEventType EventType, Quest q)
+	{
+		if (_questEvents.get(EventType) == null)
+		{
+			_questEvents.put(EventType, new Quest[]
+			{
+				q
+			});
+		}
+		else
+		{
+			Quest[] _quests = _questEvents.get(EventType);
+			int len = _quests.length;
+			
+			// if only one registration per npc is allowed for this event type
+			// then only register this NPC if not already registered for the specified event.
+			// if a quest allows multiple registrations, then register regardless of count
+			// In all cases, check if this new registration is replacing an older copy of the SAME quest
+			// Finally, check quest class hierarchy: a parent class should never replace a child class.
+			// a child class should always replace a parent class.
+			if (!EventType.isMultipleRegistrationAllowed())
+			{
+				// if it is the same quest (i.e. reload) or the existing is a superclass of the new one, replace the existing.
+				if (_quests[0].getName().equals(q.getName()) || L2NpcTemplate.isAssignableTo(q, _quests[0].getClass()))
+				{
+					_quests[0] = q;
+				}
+				else
+				{
+					_log.warning("Quest event not allowed in multiple quests.  Skipped addition of Event Type \"" + EventType + "\" for NPC \"" + _name + "\" and quest \"" + q.getName() + "\".");
+				}
+			}
+			else
+			{
+				// be ready to add a new quest to a new copy of the list, with larger size than previously.
+				Quest[] tmp = new Quest[len + 1];
+				
+				// loop through the existing quests and copy them to the new list. While doing so, also
+				// check if this new quest happens to be just a replacement for a previously loaded quest.
+				// Replace existing if the new quest is the same (reload) or a child of the existing quest.
+				// Do nothing if the new quest is a superclass of an existing quest.
+				// Add the new quest in the end of the list otherwise.
+				for (int i = 0; i < len; i++)
+				{
+					if (_quests[i].getName().equals(q.getName()) || L2NpcTemplate.isAssignableTo(q, _quests[i].getClass()))
+					{
+						_quests[i] = q;
+						return;
+					}
+					else if (L2NpcTemplate.isAssignableTo(_quests[i], q.getClass()))
+					{
+						return;
+					}
+					tmp[i] = _quests[i];
+				}
+				tmp[len] = q;
+				_questEvents.put(EventType, tmp);
+			}
+		}
+	}
+	
 	public void addRaidData(L2MinionData minion)
 	{
-		if (_minions == null)
-			_minions = new FastList<L2MinionData>();
 		_minions.add(minion);
 	}
 	
-	/*public void addVulnerability(Stats id, double vuln)
+	public void addRangeSkill(L2Skill skill)
 	{
-		if (_vulnerabilities == null)
-			_vulnerabilities = new FastMap<Stats, Double>();
-		_vulnerabilities.put(id, new Double(vuln));
+		if ((skill.getCastRange() <= 150) && (skill.getCastRange() > 0))
+		{
+			_shortRangeSkills.add(skill);
+		}
+		else if (skill.getCastRange() > 150)
+		{
+			_longRangeSkills.add(skill);
+		}
 	}
 	
-	public double getVulnerability(Stats id)
+	public void addResSkill(L2Skill skill)
 	{
-		if (_vulnerabilities == null || _vulnerabilities.get(id) == null)
-			return 1;
-		return _vulnerabilities.get(id);
-	}*/
+		_resSkills.add(skill);
+	}
 	
+	public void addRootSkill(L2Skill skill)
+	{
+		_rootSkills.add(skill);
+	}
 	
 	public void addSkill(L2Skill skill)
 	{
-		
-		if (_skills == null)
-			_skills = new TIntObjectHashMap<L2Skill>();
-		
-		if(!skill.isPassive())
+		if (!skill.isPassive())
 		{
 			if (skill.isSuicideAttack())
 			{
@@ -325,7 +444,7 @@ public final class L2NpcTemplate extends L2CharTemplate
 			else
 			{
 				addGeneralSkill(skill);
-				switch(skill.getSkillType())
+				switch (skill.getSkillType())
 				{
 					case BUFF:
 						addBuffSkill(skill);
@@ -369,11 +488,11 @@ public final class L2NpcTemplate extends L2CharTemplate
 					case BLOW:
 					case DRAIN:
 					case CHARGEDAM:
-					case FATAL:	
+					case FATAL:
 					case DEATHLINK:
 					case CPDAM:
 					case MANADAM:
-					case CPDAMPERCENT:	
+					case CPDAMPERCENT:
 						addAtkSkill(skill);
 						addUniversalSkill(skill);
 						addRangeSkill(skill);
@@ -395,7 +514,7 @@ public final class L2NpcTemplate extends L2CharTemplate
 						addNegativeSkill(skill);
 						addRangeSkill(skill);
 						break;
-					default :
+					default:
 						addUniversalSkill(skill);
 						break;
 				}
@@ -405,43 +524,48 @@ public final class L2NpcTemplate extends L2CharTemplate
 		_skills.put(skill.getId(), skill);
 	}
 	
+	public void addSleepSkill(L2Skill skill)
+	{
+		_sleepSkills.add(skill);
+	}
+	
+	public void addStunSkill(L2Skill skill)
+	{
+		_stunskills.add(skill);
+	}
+	
+	public void addSuicideSkill(L2Skill skill)
+	{
+		_suicideSkills.add(skill);
+	}
 	
-	/*public double removeVulnerability(Stats id)
+	public void addTeachInfo(ClassId classId)
 	{
-		return _vulnerabilities.remove(id);
-	}*/
+		_teachInfo.add(classId);
+	}
 	
-	/**
-	 * @return the list of all possible UNCATEGORIZED drops of this L2NpcTemplate.
-	 */
-	public FastList<L2DropCategory> getDropData()
+	public void addUniversalSkill(L2Skill skill)
 	{
-		return _categories;
+		_universalSkills.add(skill);
 	}
 	
-	/**
-	 * @return the list of all possible item drops of this L2NpcTemplate.<br>
-	 * (ie full drops and part drops, mats, miscellaneous & UNCATEGORIZED)
-	 */
-	public List<L2DropData> getAllDropData()
+	public boolean canTeach(ClassId classId)
 	{
-		if (_categories == null)
-			return null;
-		List<L2DropData> lst = new FastList<L2DropData>();
-		for (L2DropCategory tmp : _categories)
+		// If the player is on a third class, fetch the class teacher
+		// information for its parent class.
+		if (classId.level() == 3)
 		{
-			lst.addAll(tmp.getAllDrops());
+			return _teachInfo.contains(classId.getParent());
 		}
-		return lst;
+		
+		return _teachInfo.contains(classId);
 	}
 	
 	/**
-	 * Empty all possible drops of this L2NpcTemplate.<BR><BR>
+	 * Empty all possible drops of this L2NpcTemplate.
 	 */
 	public synchronized void clearAllDropData()
 	{
-		if (_categories == null)
-			return;
 		while (!_categories.isEmpty())
 		{
 			_categories.getFirst().clearAllDrops();
@@ -451,556 +575,451 @@ public final class L2NpcTemplate extends L2CharTemplate
 	}
 	
 	/**
-	 * @return the list of all Minions that must be spawn with the L2NpcInstance using this L2NpcTemplate.
+	 * @return the aggro range value.
 	 */
-	public List<L2MinionData> getMinionData()
+	public int getAggroRange()
 	{
-		return _minions;
+		return _aggroRange;
 	}
 	
-	public TIntObjectHashMap<L2Skill> getSkills()
+	public L2NpcAIData getAIDataStatic()
 	{
-		return _skills;
+		return _AIdataStatic;
 	}
 	
-	public L2Skill[] getSkillsArray()
+	/**
+	 * @return the list of all possible item drops of this L2NpcTemplate.<br>
+	 *         (ie full drops and part drops, mats, miscellaneous & UNCATEGORIZED)
+	 */
+	public List<L2DropData> getAllDropData()
 	{
-		return _skills.values(new L2Skill[0]);
+		final List<L2DropData> list = new FastList<>();
+		for (L2DropCategory tmp : _categories)
+		{
+			list.addAll(tmp.getAllDrops());
+		}
+		return list;
 	}
 	
-	public void addQuestEvent(Quest.QuestEventType EventType, Quest q)
+	/**
+	 * @return the attack skills.
+	 */
+	public FastList<L2Skill> getAtkSkills()
 	{
-		if (_questEvents == null)
-			_questEvents = new FastMap<Quest.QuestEventType, Quest[]>();
-			
-			if (_questEvents.get(EventType) == null)
-			{
-				_questEvents.put(EventType, new Quest[]
-				                                      {
-						q
-				                                      });
-			}
-			else
-			{
-				Quest[] _quests = _questEvents.get(EventType);
-				int len = _quests.length;
-				
-				// if only one registration per npc is allowed for this event type
-				// then only register this NPC if not already registered for the specified event.
-				// if a quest allows multiple registrations, then register regardless of count
-				// In all cases, check if this new registration is replacing an older copy of the SAME quest
-				// Finally, check quest class hierarchy: a parent class should never replace a child class.
-				// a child class should always replace a parent class.
-				if (!EventType.isMultipleRegistrationAllowed())
-				{
-					// if it is the same quest (i.e. reload) or the existing is a superclass of the new one, replace the existing.
-					if (_quests[0].getName().equals(q.getName()) || L2NpcTemplate.isAssignableTo(q, _quests[0].getClass()))
-					{
-						_quests[0] = q;
-					}
-					else
-					{
-						_log.warning("Quest event not allowed in multiple quests.  Skipped addition of Event Type \"" + EventType + "\" for NPC \"" + name + "\" and quest \"" + q.getName() + "\".");
-					}
-				}
-				else
-				{
-					// be ready to add a new quest to a new copy of the list, with larger size than previously.
-					Quest[] tmp = new Quest[len + 1];
-					
-					// loop through the existing quests and copy them to the new list.  While doing so, also
-					// check if this new quest happens to be just a replacement for a previously loaded quest.
-					// Replace existing if the new quest is the same (reload) or a child of the existing quest.
-					// Do nothing if the new quest is a superclass of an existing quest.
-					// Add the new quest in the end of the list otherwise.
-					for (int i = 0; i < len; i++)
-					{
-						if (_quests[i].getName().equals(q.getName()) || L2NpcTemplate.isAssignableTo(q, _quests[i].getClass()))
-						{
-							_quests[i] = q;
-							return;
-						}
-						else if (L2NpcTemplate.isAssignableTo(_quests[i], q.getClass()))
-						{
-							return;
-						}
-						tmp[i] = _quests[i];
-					}
-					tmp[len] = q;
-					_questEvents.put(EventType, tmp);
-				}
-			}
+		return _atkSkills;
 	}
 	
 	/**
-	 * Checks if obj can be assigned to the Class represented by clazz.<br>
-	 * This is true if, and only if, obj is the same class represented by clazz,
-	 * or a subclass of it or obj implements the interface represented by clazz.
-	 * 
-	 * 
-	 * @param obj
-	 * @param clazz
-	 * @return
+	 * @return the base vitality divider value.
 	 */
-	public static boolean isAssignableTo(Object obj, Class<?> clazz)
+	public float getBaseVitalityDivider()
 	{
-		return L2NpcTemplate.isAssignableTo(obj.getClass(), clazz);
+		return _baseVitalityDivider;
 	}
 	
-	public static boolean isAssignableTo(Class<?> sub, Class<?> clazz)
+	/**
+	 * @return the buff skills.
+	 */
+	public FastList<L2Skill> getBuffSkills()
 	{
-		// if clazz represents an interface
-		if (clazz.isInterface())
-		{
-			// check if obj implements the clazz interface
-			Class<?>[] interfaces = sub.getInterfaces();
-			for (int i = 0; i < interfaces.length; i++)
-			{
-				if (clazz.getName().equals(interfaces[i].getName()))
-				{
-					return true;
-				}
-			}
-		}
-		else
-		{
-			do
-			{
-				if (sub.getName().equals(clazz.getName()))
-				{
-					return true;
-				}
-				
-				sub = sub.getSuperclass();
-			}
-			while (sub != null);
-		}
-		
-		return false;
-	}
-	
-	public Quest[] getEventQuests(Quest.QuestEventType EventType)
-	{
-		if (_questEvents == null)
-		{
-			return null;
-		}
-		return _questEvents.get(EventType);
+		return _buffSkills;
 	}
 	
-	public void setRace(int raceId)
-	{
-		switch (raceId)
-		{
-			case 1:
-				race = L2NpcTemplate.Race.UNDEAD;
-				break;
-			case 2:
-				race = L2NpcTemplate.Race.MAGICCREATURE;
-				break;
-			case 3:
-				race = L2NpcTemplate.Race.BEAST;
-				break;
-			case 4:
-				race = L2NpcTemplate.Race.ANIMAL;
-				break;
-			case 5:
-				race = L2NpcTemplate.Race.PLANT;
-				break;
-			case 6:
-				race = L2NpcTemplate.Race.HUMANOID;
-				break;
-			case 7:
-				race = L2NpcTemplate.Race.SPIRIT;
-				break;
-			case 8:
-				race = L2NpcTemplate.Race.ANGEL;
-				break;
-			case 9:
-				race = L2NpcTemplate.Race.DEMON;
-				break;
-			case 10:
-				race = L2NpcTemplate.Race.DRAGON;
-				break;
-			case 11:
-				race = L2NpcTemplate.Race.GIANT;
-				break;
-			case 12:
-				race = L2NpcTemplate.Race.BUG;
-				break;
-			case 13:
-				race = L2NpcTemplate.Race.FAIRIE;
-				break;
-			case 14:
-				race = L2NpcTemplate.Race.HUMAN;
-				break;
-			case 15:
-				race = L2NpcTemplate.Race.ELVE;
-				break;
-			case 16:
-				race = L2NpcTemplate.Race.DARKELVE;
-				break;
-			case 17:
-				race = L2NpcTemplate.Race.ORC;
-				break;
-			case 18:
-				race = L2NpcTemplate.Race.DWARVE;
-				break;
-			case 19:
-				race = L2NpcTemplate.Race.OTHER;
-				break;
-			case 20:
-				race = L2NpcTemplate.Race.NONLIVING;
-				break;
-			case 21:
-				race = L2NpcTemplate.Race.SIEGEWEAPON;
-				break;
-			case 22:
-				race = L2NpcTemplate.Race.DEFENDINGARMY;
-				break;
-			case 23:
-				race = L2NpcTemplate.Race.MERCENARIE;
-				break;
-			case 24:
-				race = L2NpcTemplate.Race.UNKNOWN;
-				break;
-			case 25:
-				race = L2NpcTemplate.Race.KAMAEL;
-				break;
-			default:
-				race = L2NpcTemplate.Race.NONE;
-				break;
-		}
-	}
-	
-	//-----------------------------------------------------------------------
-	// Npc AI Data
-	// By ShanSoft
-	public void setAIData(L2NpcAIData aidata)
-	{
-		//_AIdataStatic = new L2NpcAIData(); // not needed to init object and in next line override with other reference. maybe other intention?
-		_AIdataStatic = aidata;
-	}
-	//-----------------------------------------------------------------------
-	
-	public L2NpcAIData getAIDataStatic()
-	{
-		return _AIdataStatic;
-	}
-	
-	public void addBuffSkill(L2Skill skill)
+	/**
+	 * @return the client class (same as texture path).
+	 */
+	public String getClientClass()
 	{
-		if (_buffskills == null)
-			_buffskills = new FastList<L2Skill>();
-		_buffskills.add(skill);
-		_hasbuffskills=true;
+		return _clientClass;
 	}
 	
-	public void addHealSkill(L2Skill skill)
+	/**
+	 * @return the cost over time skills.
+	 */
+	public FastList<L2Skill> getCostOverTimeSkills()
 	{
-		if (_healskills == null)
-			_healskills = new FastList<L2Skill>();
-		_healskills.add(skill);
-		_hashealskills=true;
+		return _cotSkills;
 	}
 	
-	public void addResSkill(L2Skill skill)
+	/**
+	 * @return the debuff skills.
+	 */
+	public FastList<L2Skill> getDebuffSkills()
 	{
-		if (_resskills == null)
-			_resskills = new FastList<L2Skill>();
-		_resskills.add(skill);
-		_hasresskills=true;
+		return _debuffSkills;
 	}
 	
-	public void addAtkSkill(L2Skill skill)
+	/**
+	 * @return the list of all possible UNCATEGORIZED drops of this L2NpcTemplate.
+	 */
+	public FastList<L2DropCategory> getDropData()
 	{
-		if (_atkskills == null)
-			_atkskills = new FastList<L2Skill>();
-		_atkskills.add(skill);
-		_hasatkskills=true;
+		return _categories;
 	}
 	
-	public void addDebuffSkill(L2Skill skill)
+	/**
+	 * @return the drop herb group.
+	 */
+	public int getDropHerbGroup()
 	{
-		if (_debuffskills == null)
-			_debuffskills = new FastList<L2Skill>();
-		_debuffskills.add(skill);
-		_hasdebuffskills=true;
+		return _dropHerbGroup;
 	}
 	
-	public void addRootSkill(L2Skill skill)
+	/**
+	 * @return the enchant effect.
+	 */
+	public int getEnchantEffect()
 	{
-		if (_rootskills == null)
-			_rootskills = new FastList<L2Skill>();
-		_rootskills.add(skill);
-		_hasrootskills=true;
+		return _enchantEffect;
 	}
 	
-	public void addSleepSkill(L2Skill skill)
+	public Map<QuestEventType, Quest[]> getEventQuests()
 	{
-		if (_sleepskills == null)
-			_sleepskills = new FastList<L2Skill>();
-		_sleepskills.add(skill);
-		_hassleepskills=true;
+		return _questEvents;
 	}
 	
-	public void addStunSkill(L2Skill skill)
+	public Quest[] getEventQuests(QuestEventType EventType)
 	{
-		if (_stunskills == null)
-			_stunskills = new FastList<L2Skill>();
-		_stunskills.add(skill);
-		_hasstunskills=true;
+		return _questEvents.get(EventType);
 	}
 	
-	public void addParalyzeSkill(L2Skill skill)
+	/**
+	 * @return the general skills.
+	 */
+	public FastList<L2Skill> getGeneralskills()
 	{
-		if (_paralyzeskills == null)
-			_paralyzeskills = new FastList<L2Skill>();
-		_paralyzeskills.add(skill);
-		_hasparalyzeskills=true;
+		return _generalSkills;
 	}
 	
-	public void addFloatSkill(L2Skill skill)
+	/**
+	 * @return the heal skills.
+	 */
+	public FastList<L2Skill> getHealSkills()
 	{
-		if (_floatskills == null)
-			_floatskills = new FastList<L2Skill>();
-		_floatskills.add(skill);
-		_hasfloatskills=true;
+		return _healSkills;
 	}
 	
-	public void addFossilSkill(L2Skill skill)
+	/**
+	 * @return the Id template.
+	 */
+	public int getIdTemplate()
 	{
-		if (_fossilskills == null)
-			_fossilskills = new FastList<L2Skill>();
-		_fossilskills.add(skill);
-		_hasfossilskills=true;
+		return _idTemplate;
 	}
 	
-	public void addNegativeSkill(L2Skill skill)
+	/**
+	 * @return the immobilize skills.
+	 */
+	public FastList<L2Skill> getImmobiliseSkills()
 	{
-		if (_negativeskills == null)
-			_negativeskills = new FastList<L2Skill>();
-		_negativeskills.add(skill);
-		_hasnegativeskills=true;
+		return _immobilizeSkills;
 	}
 	
-	public void addImmobiliseSkill(L2Skill skill)
+	/**
+	 * @return the left hand item.
+	 */
+	public int getLeftHand()
 	{
-		if (_immobiliseskills == null)
-			_immobiliseskills = new FastList<L2Skill>();
-		_immobiliseskills.add(skill);
-		_hasimmobiliseskills=true;
+		return _lHand;
 	}
 	
-	public void addDOTSkill(L2Skill skill)
+	/**
+	 * @return the NPC level.
+	 */
+	public byte getLevel()
 	{
-		if (_dotskills == null)
-			_dotskills = new FastList<L2Skill>();
-		_dotskills.add(skill);
-		_hasdotskills=true;
+		return _level;
 	}
 	
-	public void addUniversalSkill(L2Skill skill)
+	/**
+	 * @return the long range skills.
+	 */
+	public FastList<L2Skill> getLongRangeSkills()
 	{
-		if (_universalskills == null)
-			_universalskills = new FastList<L2Skill>();
-		_universalskills.add(skill);
-		_hasuniversalskills=true;
+		return _longRangeSkills;
 	}
 	
-	public void addCOTSkill(L2Skill skill)
+	/**
+	 * @return the list of all Minions that must be spawn with the L2NpcInstance using this L2NpcTemplate.
+	 */
+	public List<L2MinionData> getMinionData()
 	{
-		if (_cotskills == null)
-			_cotskills = new FastList<L2Skill>();
-		_cotskills.add(skill);
-		_hascotskills=true;
+		return _minions;
 	}
 	
-	public void addManaHealSkill(L2Skill skill)
+	/**
+	 * @return the NPC name.
+	 */
+	public String getName()
 	{
-		if (_manaskills == null)
-			_manaskills = new FastList<L2Skill>();
-		_manaskills.add(skill);
-		_hasmanaskills=true;
+		return _name;
 	}
 	
-	public void addGeneralSkill(L2Skill skill)
+	/**
+	 * @return the negative skills.
+	 */
+	public FastList<L2Skill> getNegativeSkills()
 	{
-		if (_generalskills == null)
-			_generalskills = new FastList<L2Skill>();
-		_generalskills.add(skill);
-		_hasgeneralskills=true;
+		return _negativeSkills;
 	}
 	
-	public void addSuicideSkill(L2Skill skill)
+	/**
+	 * @return the npc Id.
+	 */
+	public int getNpcId()
 	{
-		if (_suicideSkills == null)
-			_suicideSkills = new FastList<L2Skill>();
-		_suicideSkills.add(skill);
-		
-		_hasSuicideSkills = true;
+		return _npcId;
 	}
 	
-	public void addRangeSkill(L2Skill skill)
+	/**
+	 * @return the NPC race.
+	 */
+	public L2NpcTemplate.Race getRace()
 	{
-		if (skill.getCastRange() <= 150 && skill.getCastRange() > 0)
+		if (_race == null)
 		{
-			if (_Srangeskills == null)
-				_Srangeskills = new FastList<L2Skill>();
-			_Srangeskills.add(skill);
-			_hasSrangeskills=true;
+			_race = L2NpcTemplate.Race.NONE;
 		}
-		else if (skill.getCastRange() > 150)
-		{
-			if (_Lrangeskills == null)
-				_Lrangeskills = new FastList<L2Skill>();
-			_Lrangeskills.add(skill);
-			_hasLrangeskills=true;
-		}
-	}
-	
-	//--------------------------------------------------------------------
-	public boolean hasBuffSkill()
-	{
-		return _hasbuffskills;
-	}
-	public boolean hasHealSkill()
-	{
-		return _hashealskills;
+		return _race;
 	}
 	
-	public boolean hasResSkill()
-	{
-		return _hasresskills;
-	}
-	
-	public boolean hasAtkSkill()
+	/**
+	 * @return the resurrection skills.
+	 */
+	public FastList<L2Skill> getResSkills()
 	{
-		return _hasatkskills;
+		return _resSkills;
 	}
 	
-	public boolean hasDebuffSkill()
+	/**
+	 * @return the reward Exp.
+	 */
+	public int getRewardExp()
 	{
-		return _hasdebuffskills;
+		return _rewardExp;
 	}
 	
-	public boolean hasRootSkill()
+	/**
+	 * @return the reward SP.
+	 */
+	public int getRewardSp()
 	{
-		return _hasrootskills;
+		return _rewardSp;
 	}
 	
-	public boolean hasSleepSkill()
+	/**
+	 * @return the right hand weapon.
+	 */
+	public int getRightHand()
 	{
-		return _hassleepskills;
+		return _rHand;
 	}
 	
-	public boolean hasStunSkill()
+	/**
+	 * @return the NPC sex.
+	 */
+	public String getSex()
 	{
-		return _hasstunskills;
+		return _sex;
 	}
 	
-	public boolean hasParalyzeSkill()
+	/**
+	 * @return the short range skills.
+	 */
+	public FastList<L2Skill> getShortRangeSkills()
 	{
-		return _hasparalyzeskills;
+		return _shortRangeSkills;
 	}
 	
-	public boolean hasFloatSkill()
+	public TIntObjectHashMap<L2Skill> getSkills()
 	{
-		return _hasfloatskills;
+		return _skills;
 	}
 	
-	public boolean hasFossilSkill()
+	public L2Skill[] getSkillsArray()
 	{
-		return _hasfossilskills;
+		return _skills.values(new L2Skill[0]);
 	}
 	
-	public boolean hasNegativeSkill()
+	public FastList<L2Skill> getSuicideSkills()
 	{
-		return _hasnegativeskills;
+		return _suicideSkills;
 	}
 	
-	public boolean hasImmobiliseSkill()
+	public List<ClassId> getTeachInfo()
 	{
-		return _hasimmobiliseskills;
+		return _teachInfo;
 	}
 	
-	public boolean hasDOTSkill()
+	/**
+	 * @return the NPC title.
+	 */
+	public String getTitle()
 	{
-		return _hasdotskills;
+		return _title;
 	}
 	
-	public boolean hasUniversalSkill()
+	/**
+	 * @return the NPC type.
+	 */
+	public String getType()
 	{
-		return _hasuniversalskills;
+		return _type;
 	}
 	
-	public boolean hasCOTSkill()
+	/**
+	 * @return the universal skills.
+	 */
+	public FastList<L2Skill> getUniversalSkills()
 	{
-		return _hascotskills;
+		return _universalSkills;
 	}
 	
-	public boolean hasManaHealSkill()
-	{
-		return _hasmanaskills;
-	}
-	public boolean hasAutoLrangeSkill()
-	{
-		return _hasLrangeskills;
-	}
-	public boolean hasAutoSrangeSkill()
-	{
-		return _hasSrangeskills;
-	}
-	public boolean hasSkill()
+	/**
+	 * @return {@code true} if the NPC is custom, {@code false} otherwise.
+	 */
+	public boolean isCustom()
 	{
-		return _hasgeneralskills;
+		return _isCustom;
 	}
 	
-	public L2NpcTemplate.Race getRace()
+	/**
+	 * @return {@code true} if the NPC is a quest monster, {@code false} otherwise.
+	 */
+	public boolean isQuestMonster()
 	{
-		if (race == null)
-			race = L2NpcTemplate.Race.NONE;
-		
-		return race;
+		return _isQuestMonster;
 	}
 	
-	public boolean isCustom()
+	/**
+	 * @return {@code true} if the NPC uses server side name, {@code false} otherwise.
+	 */
+	public boolean isServerSideName()
 	{
-		return npcId != idTemplate;
+		return _serverSideName;
 	}
 	
 	/**
-	 * @return name
+	 * @return {@code true} if the NPC uses server side title, {@code false} otherwise.
 	 */
-	public String getName()
+	public boolean isServerSideTitle()
 	{
-		return name;
+		return _serverSideTitle;
 	}
 	
+	/**
+	 * @return {@code true} if the NPC is Christmas Special Tree, {@code false} otherwise.
+	 */
 	public boolean isSpecialTree()
 	{
-		return npcId == L2XmassTreeInstance.SPECIAL_TREE_ID;
+		return _npcId == L2XmassTreeInstance.SPECIAL_TREE_ID;
 	}
 	
-	public boolean isUndead()
+	/**
+	 * Checks types, ignore case.
+	 * @param t the type to check.
+	 * @return {@code true} if the type are the same, {@code false} otherwise.
+	 */
+	public boolean isType(String t)
 	{
-		return (race == Race.UNDEAD);
+		return _type.equalsIgnoreCase(t);
 	}
 	
-	public FastList<L2Skill> getSuicideSkills()
+	/**
+	 * @return {@code true} if the NPC is an undead, {@code false} otherwise.
+	 */
+	public boolean isUndead()
 	{
-		return _suicideSkills;
+		return _race == Race.UNDEAD;
 	}
 	
-	public boolean hasSuicideSkill()
+	public void setAIData(L2NpcAIData AIData)
 	{
-		return _hasSuicideSkills;
+		_AIdataStatic = AIData;
 	}
 	
-	public Map<QuestEventType, Quest[]> getEventQuests()
+	public void setRace(int raceId)
 	{
-		if (_questEvents == null)
-			_questEvents = new FastMap<Quest.QuestEventType, Quest[]>();
-		return _questEvents;
+		switch (raceId)
+		{
+			case 1:
+				_race = L2NpcTemplate.Race.UNDEAD;
+				break;
+			case 2:
+				_race = L2NpcTemplate.Race.MAGICCREATURE;
+				break;
+			case 3:
+				_race = L2NpcTemplate.Race.BEAST;
+				break;
+			case 4:
+				_race = L2NpcTemplate.Race.ANIMAL;
+				break;
+			case 5:
+				_race = L2NpcTemplate.Race.PLANT;
+				break;
+			case 6:
+				_race = L2NpcTemplate.Race.HUMANOID;
+				break;
+			case 7:
+				_race = L2NpcTemplate.Race.SPIRIT;
+				break;
+			case 8:
+				_race = L2NpcTemplate.Race.ANGEL;
+				break;
+			case 9:
+				_race = L2NpcTemplate.Race.DEMON;
+				break;
+			case 10:
+				_race = L2NpcTemplate.Race.DRAGON;
+				break;
+			case 11:
+				_race = L2NpcTemplate.Race.GIANT;
+				break;
+			case 12:
+				_race = L2NpcTemplate.Race.BUG;
+				break;
+			case 13:
+				_race = L2NpcTemplate.Race.FAIRIE;
+				break;
+			case 14:
+				_race = L2NpcTemplate.Race.HUMAN;
+				break;
+			case 15:
+				_race = L2NpcTemplate.Race.ELVE;
+				break;
+			case 16:
+				_race = L2NpcTemplate.Race.DARKELVE;
+				break;
+			case 17:
+				_race = L2NpcTemplate.Race.ORC;
+				break;
+			case 18:
+				_race = L2NpcTemplate.Race.DWARVE;
+				break;
+			case 19:
+				_race = L2NpcTemplate.Race.OTHER;
+				break;
+			case 20:
+				_race = L2NpcTemplate.Race.NONLIVING;
+				break;
+			case 21:
+				_race = L2NpcTemplate.Race.SIEGEWEAPON;
+				break;
+			case 22:
+				_race = L2NpcTemplate.Race.DEFENDINGARMY;
+				break;
+			case 23:
+				_race = L2NpcTemplate.Race.MERCENARIE;
+				break;
+			case 24:
+				_race = L2NpcTemplate.Race.UNKNOWN;
+				break;
+			case 25:
+				_race = L2NpcTemplate.Race.KAMAEL;
+				break;
+			default:
+				_race = L2NpcTemplate.Race.NONE;
+				break;
+		}
 	}
 }