Selaa lähdekoodia

BETA: Henna, Initial Equipment and Class List rework:
* Using Freya retail Henna data.
* All constrains in [http://www.w3schools.com/schema/default.asp XSD].
* Unhardcoded cancel fee and count.
* Using Freya retail Initial Equipment data.
* Added Event Initial Equipment retail like, for example server opening.
* All constrains in [http://www.w3schools.com/schema/default.asp XSD].
* Unhardcoded equipped condition.
* Added and unhardcoded, ''in beta state'', Class List data.
* This Unhardcodeds all class names (in HTMLs for example) using client info!
* No more sub-class selection list with lower-case names or typos!
* Also unhardcoded Hero class names!
* All constrains in [http://www.w3schools.com/schema/default.asp XSD].
* Removed L2HennaInstance, using L2Henna item, since this are static [http://en.wikipedia.org/wiki/Data_transfer_object DTOs].
* Using proper getters for L2PcTemplate, reworked, added all JavaDocs.
* Packet rework for all henna and character creation client and server packets.
* Client and Server packets Logger cleanup.
* Minor fix in the order in AcquireSkillType.
* Minor improvement in logs for StatsSet.
* Minor fixes to ArmorSetTable.
* Fixed scripting/scriptengine/package-info.java

Zoey76 13 vuotta sitten
vanhempi
sitoutus
6347de8e8c
100 muutettua tiedostoa jossa 1461 lisäystä ja 1214 poistoa
  1. 19 10
      L2J_Server_BETA/dist/game/config/Character.properties
  2. 6 4
      L2J_Server_BETA/java/com/l2jserver/Config.java
  3. 6 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java
  4. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/communitybbs/Manager/RegionBBSManager.java
  5. 31 28
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ArmorSetsTable.java
  6. 20 90
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/CharTemplateTable.java
  7. 136 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ClassListData.java
  8. 165 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HennaData.java
  9. 0 112
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HennaTable.java
  10. 0 150
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HennaTreeTable.java
  11. 127 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/InitialEquipmentData.java
  12. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcTable.java
  13. 6 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/SkillTreesData.java
  14. 51 11
      L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentParser.java
  15. 9 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/StatsSet.java
  16. 7 7
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ClassMasterInstance.java
  17. 100 90
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  18. 38 40
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterInstance.java
  19. 189 88
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2PcTemplate.java
  20. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/base/AcquireSkillType.java
  21. 12 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/base/ClassId.java
  22. 104 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/base/ClassInfo.java
  23. 4 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Hero.java
  24. 9 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java
  25. 115 52
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/L2Henna.java
  26. 61 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/PcItemTemplate.java
  27. 0 185
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/instance/L2HennaInstance.java
  28. 13 13
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Formulas.java
  29. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java
  30. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/AllyLeave.java
  31. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/AnswerTradeRequest.java
  32. 75 43
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java
  33. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/CharacterRestore.java
  34. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/DummyPacket.java
  35. 17 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/L2GameClientPacket.java
  36. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/MoveBackwardToLocation.java
  37. 18 44
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/NewCharacter.java
  38. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/ObserverReturn.java
  39. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestAnswerJoinAlly.java
  40. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestAnswerJoinParty.java
  41. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestChangePartyLeader.java
  42. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestConfirmSiegeWaitingList.java
  43. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestDismissAlly.java
  44. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordCheck.java
  45. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordReq.java
  46. 1 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordVerify.java
  47. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestExOustFromMPCC.java
  48. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendInvite.java
  49. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendList.java
  50. 25 45
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaEquip.java
  51. 17 14
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemInfo.java
  52. 11 15
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemList.java
  53. 13 9
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemRemoveInfo.java
  54. 21 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaRemove.java
  55. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaRemoveList.java
  56. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestJoinAlly.java
  57. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestJoinDominionWar.java
  58. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestJoinSiege.java
  59. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestOustPartyMember.java
  60. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPetGetItem.java
  61. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPetition.java
  62. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeMemberList.java
  63. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreManageBuy.java
  64. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreManageSell.java
  65. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreQuitBuy.java
  66. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreQuitSell.java
  67. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestQuestList.java
  68. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeBookDestroy.java
  69. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeItemMakeInfo.java
  70. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeItemMakeSelf.java
  71. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopListSet.java
  72. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopMakeInfo.java
  73. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopMakeItem.java
  74. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopManageList.java
  75. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopManagePrev.java
  76. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopManageQuit.java
  77. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopMessageSet.java
  78. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStartPledgeWar.java
  79. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStopPledgeWar.java
  80. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestReplySurrenderPledgeWar.java
  81. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSellItem.java
  82. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSetCrop.java
  83. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSetSeed.java
  84. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSiegeAttackerList.java
  85. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSiegeDefenderList.java
  86. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestStartPledgeWar.java
  87. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestStopPledgeWar.java
  88. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestWithDrawalParty.java
  89. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestWithdrawalPledge.java
  90. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/SetPrivateStoreMsgBuy.java
  91. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/SetPrivateStoreMsgSell.java
  92. 0 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AskJoinAlly.java
  93. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AskJoinParty.java
  94. 0 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExReplyDominionInfo.java
  95. 1 11
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowFortressInfo.java
  96. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/FriendList.java
  97. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/FriendListExtended.java
  98. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/FriendPacket.java
  99. 18 26
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/GMHennaInfo.java
  100. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/GMViewItemList.java

+ 19 - 10
L2J_Server_BETA/dist/game/config/Character.properties

@@ -601,17 +601,12 @@ AltLeavePartyLeader = False
 
 
 # ---------------------------------------------------------------------------
-# Random
+# Initial Settings:
 # ---------------------------------------------------------------------------
-# This is the maximum amount of adena that character can have in his inventory or warehouse.
-# The maximum input amount is 9,223,372,036,854,775,807. (nine quintillion 
-# two hundred twenty three quadrillion three hundred seventy two trillion thirty six billion 
-# eight hundred fifty four million seven hundred seventy five thousand eight hundred seven)
-# Setting negative values (-1 or others) will result in maximum amount available.
-# Big values do not cause critical errors, although only 16 digits are visible in the inventory
-# (example: 3,372,036,854,775,807 is visible out of 9,223,372,036,854,775,807)
-# Default: 99900000000 (99 bilion and 900 milion)
-MaxAdena = 99900000000
+
+#Initial Equipment Events is to enable a special settings for the items that a new character starts with.
+#Default: False
+InitialEquipmentEvent = False
 
 # This is the amount of adena that a new character starts their character with.
 # Default: 0
@@ -625,6 +620,20 @@ StartingLevel = 1
 # Default: 0
 StartingSP = 0
 
+# ---------------------------------------------------------------------------
+# Other Settings:
+# ---------------------------------------------------------------------------
+
+# This is the maximum amount of adena that character can have in his inventory or warehouse.
+# The maximum input amount is 9,223,372,036,854,775,807. (nine quintillion 
+# two hundred twenty three quadrillion three hundred seventy two trillion thirty six billion 
+# eight hundred fifty four million seven hundred seventy five thousand eight hundred seven)
+# Setting negative values (-1 or others) will result in maximum amount available.
+# Big values do not cause critical errors, although only 16 digits are visible in the inventory
+# (example: 3,372,036,854,775,807 is visible out of 9,223,372,036,854,775,807)
+# Default: 99900000000 (99 bilion and 900 milion)
+MaxAdena = 99900000000
+
 # This option, when set to True, will enable automatically picking up items.
 # If set False it will force the player to pickup dropped items from mobs.
 # This excludes herbs mentioned above and items from Raid/GrandBosses with minions.

+ 6 - 4
L2J_Server_BETA/java/com/l2jserver/Config.java

@@ -207,10 +207,11 @@ public final class Config
 	public static int ALT_PARTY_RANGE;
 	public static int ALT_PARTY_RANGE2;
 	public static boolean ALT_LEAVE_PARTY_LEADER;
-	public static long MAX_ADENA;
+	public static boolean INITIAL_EQUIPMENT_EVENT;
 	public static long STARTING_ADENA;
 	public static byte STARTING_LEVEL;
 	public static int STARTING_SP;
+	public static long MAX_ADENA;
 	public static boolean AUTO_LOOT;
 	public static boolean AUTO_LOOT_RAIDS;
 	public static int LOOT_RAIDS_PRIVILEGE_INTERVAL;
@@ -1710,12 +1711,13 @@ public final class Config
 					ALT_PARTY_RANGE = Integer.parseInt(Character.getProperty("AltPartyRange", "1600"));
 					ALT_PARTY_RANGE2 = Integer.parseInt(Character.getProperty("AltPartyRange2", "1400"));
 					ALT_LEAVE_PARTY_LEADER = Boolean.parseBoolean(Character.getProperty("AltLeavePartyLeader", "False"));
-					MAX_ADENA = Long.parseLong(Character.getProperty("MaxAdena", "99900000000"));
-					if (MAX_ADENA < 0)
-						MAX_ADENA = Long.MAX_VALUE;
+					INITIAL_EQUIPMENT_EVENT = Boolean.parseBoolean(Character.getProperty("InitialEquipmentEvent", "False"));
 					STARTING_ADENA = Long.parseLong(Character.getProperty("StartingAdena", "0"));
 					STARTING_LEVEL = Byte.parseByte(Character.getProperty("StartingLevel", "1"));
 					STARTING_SP = Integer.parseInt(Character.getProperty("StartingSP", "0"));
+					MAX_ADENA = Long.parseLong(Character.getProperty("MaxAdena", "99900000000"));
+					if (MAX_ADENA < 0)
+						MAX_ADENA = Long.MAX_VALUE;
 					AUTO_LOOT = Boolean.parseBoolean(Character.getProperty("AutoLoot", "false"));
 					AUTO_LOOT_RAIDS = Boolean.parseBoolean(Character.getProperty("AutoLootRaids", "false"));
 					LOOT_RAIDS_PRIVILEGE_INTERVAL = Integer.parseInt(Character.getProperty("RaidLootRightsInterval", "900")) * 1000;

+ 6 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java

@@ -42,6 +42,7 @@ import com.l2jserver.gameserver.datatables.CharNameTable;
 import com.l2jserver.gameserver.datatables.CharSummonTable;
 import com.l2jserver.gameserver.datatables.CharTemplateTable;
 import com.l2jserver.gameserver.datatables.ClanTable;
+import com.l2jserver.gameserver.datatables.ClassListData;
 import com.l2jserver.gameserver.datatables.DoorTable;
 import com.l2jserver.gameserver.datatables.EnchantGroupsTable;
 import com.l2jserver.gameserver.datatables.EnchantHPBonusData;
@@ -50,9 +51,9 @@ import com.l2jserver.gameserver.datatables.EventDroplist;
 import com.l2jserver.gameserver.datatables.ExperienceTable;
 import com.l2jserver.gameserver.datatables.FishTable;
 import com.l2jserver.gameserver.datatables.HelperBuffTable;
-import com.l2jserver.gameserver.datatables.HennaTable;
-import com.l2jserver.gameserver.datatables.HennaTreeTable;
+import com.l2jserver.gameserver.datatables.HennaData;
 import com.l2jserver.gameserver.datatables.HerbDropTable;
+import com.l2jserver.gameserver.datatables.InitialEquipmentData;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.LevelUpData;
 import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable;
@@ -227,8 +228,11 @@ public class GameServer
 		RecipeController.getInstance();
 		ArmorSetsTable.getInstance();
 		FishTable.getInstance();
+		HennaData.getInstance();
 		
 		printSection("Characters");
+		ClassListData.getInstance();
+		InitialEquipmentData.getInstance();
 		ExperienceTable.getInstance();
 		CharTemplateTable.getInstance();
 		CharNameTable.getInstance();
@@ -293,8 +297,6 @@ public class GameServer
 		PartyMatchWaitingList.getInstance();
 		PartyMatchRoomList.getInstance();
 		PetitionManager.getInstance();
-		HennaTable.getInstance();
-		HennaTreeTable.getInstance();
 		HelperBuffTable.getInstance();
 		AugmentationData.getInstance();
 		CursedWeaponsManager.getInstance();

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/communitybbs/Manager/RegionBBSManager.java

@@ -28,6 +28,7 @@ import javolution.util.FastMap;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GameServer;
+import com.l2jserver.gameserver.datatables.ClassListData;
 import com.l2jserver.gameserver.datatables.ExperienceTable;
 import com.l2jserver.gameserver.model.BlockList;
 import com.l2jserver.gameserver.model.L2World;
@@ -131,7 +132,7 @@ public class RegionBBSManager extends BaseBBSManager
 			else if (player.getLevel() >= 20)
 				levelApprox = "medium";
 			
-			StringUtil.append(htmlCode, "<table border=0><tr><td>", player.getName(), " (", sex, " ", player.getTemplate().className, "):</td></tr>"
+			StringUtil.append(htmlCode, "<table border=0><tr><td>", player.getName(), " (", sex, " ", ClassListData.getInstance().getClass(player.getClassId()).getClassName(true), "):</td></tr>"
 					+ "<tr><td>Level: ", levelApprox, "</td></tr>" + "<tr><td><br></td></tr>");
 			
 			if (activeChar != null

+ 31 - 28
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ArmorSetsTable.java

@@ -31,29 +31,24 @@ import com.l2jserver.gameserver.model.holders.SkillHolder;
 /**
  * @author godson, Luno, UnAfraid
  */
-public class ArmorSetsTable extends DocumentParser
+public final class ArmorSetsTable extends DocumentParser
 {
-	private Map<Integer, L2ArmorSet> _armorSets;
-	
-	public static ArmorSetsTable getInstance()
-	{
-		return SingletonHolder._instance;
-	}
+	private final Map<Integer, L2ArmorSet> _armorSets = new HashMap<>();
 	
 	private ArmorSetsTable()
 	{
-		_armorSets = new HashMap<>();
 		load();
 	}
 	
 	private void load()
 	{
-		loadDirectory(new File(Config.DATAPACK_ROOT, "data/stats/armorsets"));
+		_armorSets.clear();
+		parseDirectory(new File(Config.DATAPACK_ROOT, "data/stats/armorsets"));
 		_log.log(Level.INFO, getClass().getSimpleName() + ": Loaded " + _armorSets.size() + " Armor sets.");
 	}
 	
 	@Override
-	protected void parseDoc(Document doc)
+	protected void parseDocument(Document doc)
 	{
 		NamedNodeMap attrs;
 		L2ArmorSet set;
@@ -73,52 +68,52 @@ public class ArmorSetsTable extends DocumentParser
 							{
 								case "chest":
 								{
-									set.addChest(getIntValue(attrs.getNamedItem("id")));
+									set.addChest(parseInt(attrs, "id"));
 									break;
 								}
 								case "feet":
 								{
-									set.addFeet(getIntValue(attrs.getNamedItem("id")));
+									set.addFeet(parseInt(attrs, "id"));
 									break;
 								}
 								case "gloves":
 								{
-									set.addGloves(getIntValue(attrs.getNamedItem("id")));
+									set.addGloves(parseInt(attrs, "id"));
 									break;
 								}
 								case "head":
 								{
-									set.addHead(getIntValue(attrs.getNamedItem("id")));
+									set.addHead(parseInt(attrs, "id"));
 									break;
 								}
 								case "legs":
 								{
-									set.addLegs(getIntValue(attrs.getNamedItem("id")));
+									set.addLegs(parseInt(attrs, "id"));
 									break;
 								}
 								case "shield":
 								{
-									set.addShield(getIntValue(attrs.getNamedItem("id")));
+									set.addShield(parseInt(attrs, "id"));
 									break;
 								}
 								case "skill":
 								{
-									int skillId = getIntValue(attrs.getNamedItem("id"));
-									int skillLevel = getIntValue(attrs.getNamedItem("level"));
+									int skillId = parseInt(attrs, "id");
+									int skillLevel = parseInt(attrs, "level");
 									set.addSkill(new SkillHolder(skillId, skillLevel));
 									break;
 								}
 								case "shield_skill":
 								{
-									int skillId = getIntValue(attrs.getNamedItem("id"));
-									int skillLevel = getIntValue(attrs.getNamedItem("level"));
+									int skillId = parseInt(attrs, "id");
+									int skillLevel = parseInt(attrs, "level");
 									set.addShieldSkill(new SkillHolder(skillId, skillLevel));
 									break;
 								}
 								case "enchant6skill":
 								{
-									int skillId = getIntValue(attrs.getNamedItem("id"));
-									int skillLevel = getIntValue(attrs.getNamedItem("level"));
+									int skillId = parseInt(attrs, "id");
+									int skillLevel = parseInt(attrs, "level");
 									set.addEnchant6Skill(new SkillHolder(skillId, skillLevel));
 									break;
 								}
@@ -161,21 +156,29 @@ public class ArmorSetsTable extends DocumentParser
 		}
 	}
 	
-	private int getIntValue(Node n)
-	{
-		return Integer.parseInt(n.getNodeValue());
-	}
-	
-	public boolean setExists(int chestId)
+	/**
+	 * @param chestId the chest Id to verify.
+	 * @return {@code true} if the chest Id belongs to a registered armor set, {@code false} otherwise.
+	 */
+	public boolean isArmorSet(int chestId)
 	{
 		return _armorSets.containsKey(chestId);
 	}
 	
+	/**
+	 * @param chestId the chest Id identifying the armor set.
+	 * @return the armor set associated to the give chest Id.
+	 */
 	public L2ArmorSet getSet(int chestId)
 	{
 		return _armorSets.get(chestId);
 	}
 	
+	public static ArmorSetsTable getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
 	@SuppressWarnings("synthetic-access")
 	private static class SingletonHolder
 	{

+ 20 - 90
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/CharTemplateTable.java

@@ -18,6 +18,8 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -27,40 +29,30 @@ import com.l2jserver.gameserver.model.actor.templates.L2PcTemplate;
 import com.l2jserver.gameserver.model.base.ClassId;
 
 /**
- * 
- * @author Unknown, Forsaiken
- *
+ * This will be reworked Soon(tm).
+ * @author Unknown, Forsaiken, Zoey76
  */
 public final class CharTemplateTable
 {
 	private static final Logger _log = Logger.getLogger(CharTemplateTable.class.getName());
 	
-	public static final CharTemplateTable getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
-	private final L2PcTemplate[] _templates;
+	private static final Map<ClassId, L2PcTemplate> _charTemplates = new HashMap<>();
 	
 	private CharTemplateTable()
 	{
-		_templates = new L2PcTemplate[ClassId.values().length];
-		
 		Connection con = null;
-		
 		try
 		{
 			con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement statement = con.prepareStatement("SELECT * FROM class_list, char_templates, lvlupgain"
-					+ " WHERE class_list.id = char_templates.classId" + " AND class_list.id = lvlupgain.classId"
-					+ " ORDER BY class_list.id");
-			ResultSet rset = statement.executeQuery();
+			final PreparedStatement statement = con.prepareStatement("SELECT * FROM class_list, char_templates, lvlupgain" + " WHERE class_list.id = char_templates.classId" + " AND class_list.id = lvlupgain.classId" + " ORDER BY class_list.id");
+			final ResultSet rset = statement.executeQuery();
 			
 			int count = 0;
 			while (rset.next())
 			{
-				StatsSet set = new StatsSet();
-				set.set("classId", rset.getInt("id"));
+				final StatsSet set = new StatsSet();
+				final int cId = rset.getInt("id");
+				set.set("classId", cId);
 				set.set("className", rset.getString("className"));
 				set.set("raceId", rset.getInt("raceId"));
 				set.set("baseSTR", rset.getInt("STR"));
@@ -81,12 +73,12 @@ public final class CharTemplateTable
 				set.set("baseHpReg", 1.5);
 				set.set("baseMpReg", 0.9);
 				set.set("basePAtk", rset.getInt("p_atk"));
-				set.set("basePDef", /*classId.isMage()? 77 : 129*/rset.getInt("p_def"));
+				set.set("basePDef", /* classId.isMage()? 77 : 129 */rset.getInt("p_def"));
 				set.set("baseMAtk", rset.getInt("m_atk"));
 				set.set("baseMDef", rset.getInt("char_templates.m_def"));
 				set.set("classBaseLevel", rset.getInt("class_lvl"));
 				set.set("basePAtkSpd", rset.getInt("p_spd"));
-				set.set("baseMAtkSpd", /*classId.isMage()? 166 : 333*/rset.getInt("char_templates.m_spd"));
+				set.set("baseMAtkSpd", /* classId.isMage()? 166 : 333 */rset.getInt("char_templates.m_spd"));
 				set.set("baseCritRate", rset.getInt("char_templates.critical") / 10);
 				set.set("baseRunSpd", rset.getInt("move_spd"));
 				set.set("baseWalkSpd", 0);
@@ -98,15 +90,13 @@ public final class CharTemplateTable
 				set.set("spawnY", rset.getInt("y"));
 				set.set("spawnZ", rset.getInt("z"));
 				
-				L2PcTemplate ct;
-				
 				set.set("collision_radius", rset.getDouble("m_col_r"));
 				set.set("collision_height", rset.getDouble("m_col_h"));
 				set.set("collision_radius_female", rset.getDouble("f_col_r"));
 				set.set("collision_height_female", rset.getDouble("f_col_h"));
-				ct = new L2PcTemplate(set);
 				
-				_templates[ct.classId.getId()] = ct;
+				final L2PcTemplate ct = new L2PcTemplate(set, InitialEquipmentData.getInstance().getEquipmentList(cId));
+				_charTemplates.put(ClassId.getClassId(cId), ct);
 				++count;
 			}
 			rset.close();
@@ -122,81 +112,21 @@ public final class CharTemplateTable
 		{
 			L2DatabaseFactory.close(con);
 		}
-		
-		try
-		{
-			con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement statement = con.prepareStatement("SELECT classId, itemId, amount, equipped FROM char_creation_items");
-			ResultSet rset = statement.executeQuery();
-			
-			int classId, itemId, amount;
-			boolean equipped;
-			while (rset.next())
-			{
-				classId = rset.getInt("classId");
-				itemId = rset.getInt("itemId");
-				amount = rset.getInt("amount");
-				equipped = rset.getString("equipped").equals("true");
-				
-				if (ItemTable.getInstance().getTemplate(itemId) != null)
-				{
-					if (classId == -1)
-					{
-						for (L2PcTemplate pct : _templates)
-						{
-							if (pct != null)
-								pct.addItem(itemId, amount, equipped);
-						}
-					}
-					else
-					{
-						L2PcTemplate pct = _templates[classId];
-						if (pct != null)
-						{
-							pct.addItem(itemId, amount, equipped);
-						}
-						else
-						{
-							_log.warning("char_creation_items: Entry for undefined class, classId: " + classId);
-						}
-					}
-				}
-				else
-				{
-					_log.warning("char_creation_items: No data for itemId: " + itemId + " defined for classId " + classId);
-				}
-			}
-			rset.close();
-			statement.close();
-		}
-		catch (SQLException e)
-		{
-			_log.log(Level.SEVERE, "Failed loading char creation items.", e);
-		}
-		finally
-		{
-			L2DatabaseFactory.close(con);
-		}
 	}
 	
-	public L2PcTemplate getTemplate(ClassId classId)
+	public L2PcTemplate getTemplate(final ClassId classId)
 	{
-		return this.getTemplate(classId.getId());
+		return _charTemplates.get(classId);
 	}
 	
-	public L2PcTemplate getTemplate(int classId)
+	public L2PcTemplate getTemplate(final int classId)
 	{
-		return _templates[classId];
+		return _charTemplates.get(ClassId.getClassId(classId));
 	}
 	
-	public final String getClassNameById(int classId)
+	public static final CharTemplateTable getInstance()
 	{
-		L2PcTemplate pcTemplate = getTemplate(classId);
-		if (pcTemplate == null)
-		{
-			throw new IllegalArgumentException("No template for classId: " + classId);
-		}
-		return pcTemplate.className;
+		return SingletonHolder._instance;
 	}
 	
 	@SuppressWarnings("synthetic-access")

+ 136 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ClassListData.java

@@ -0,0 +1,136 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.datatables;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.engines.DocumentParser;
+import com.l2jserver.gameserver.model.base.ClassId;
+import com.l2jserver.gameserver.model.base.ClassInfo;
+
+/**
+ * This class holds the list of classes and it's info.<br>
+ * It's in <i>beta</i> state, so it's expected to change over time.
+ * @author Zoey76
+ */
+public final class ClassListData extends DocumentParser
+{
+	private static final Map<ClassId, ClassInfo> _classData = new HashMap<>();
+	
+	private ClassListData()
+	{
+		_classData.clear();
+		final Document doc = parseFile(new File(Config.DATAPACK_ROOT, "data/stats/chars/classList.xml"));
+		if (doc != null)
+		{
+			parseDocument(doc);
+		}
+		_log.info(getClass().getSimpleName() + ": Loaded " + _classData.size() + " Class data.");
+	}
+	
+	@Override
+	protected void parseDocument(Document doc)
+	{
+		NamedNodeMap attrs;
+		Node attr;
+		ClassId classId;
+		String className;
+		String classServName;
+		ClassId parentClassId;
+		for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+		{
+			if ("list".equals(n.getNodeName()))
+			{
+				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+				{
+					attrs = d.getAttributes();
+					if ("class".equals(d.getNodeName()))
+					{
+						attr = attrs.getNamedItem("classId");
+						classId = ClassId.getClassId(parseInt(attr));
+						attr = attrs.getNamedItem("name");
+						className = attr.getNodeValue();
+						attr = attrs.getNamedItem("serverName");
+						classServName = attr.getNodeValue();
+						attr = attrs.getNamedItem("parentClassId");
+						parentClassId = (attr != null) ? ClassId.getClassId(parseInt(attr)) : null;
+						_classData.put(classId, new ClassInfo(classId, className, classServName, parentClassId));
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * @return the complete class list.
+	 */
+	public Map<ClassId, ClassInfo> getClassList()
+	{
+		return _classData;
+	}
+	
+	/**
+	 * @param classId the class Id.
+	 * @return the class info related to the given {@code classId}.
+	 */
+	public ClassInfo getClass(final ClassId classId)
+	{
+		return _classData.get(classId);
+	}
+	
+	/**
+	 * @param classId the class Id as integer.
+	 * @return the class info related to the given {@code classId}.
+	 */
+	public ClassInfo getClass(final int classId)
+	{
+		final ClassId id = ClassId.getClassId(classId);
+		return (id != null) ? _classData.get(id) : null;
+	}
+	
+	/**
+	 * @param classServName the server side class name.
+	 * @return the class info related to the given {@code classServName}.
+	 */
+	public ClassInfo getClass(final String classServName)
+	{
+		for (final ClassInfo classInfo : _classData.values())
+		{
+			if (classInfo.getClassServName().equals(classServName))
+			{
+				return classInfo;
+			}
+		}
+		return null;
+	}
+	
+	public static ClassListData getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	@SuppressWarnings("synthetic-access")
+	private static class SingletonHolder
+	{
+		protected static final ClassListData _instance = new ClassListData();
+	}
+}

+ 165 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HennaData.java

@@ -0,0 +1,165 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.datatables;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.engines.DocumentParser;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.base.ClassId;
+import com.l2jserver.gameserver.model.items.L2Henna;
+
+/**
+ * This class holds the henna related information.<br>
+ * Cost and required amount to add the henna to the player.<br>
+ * Cost and retrieved amount for removing the henna from the player.<br>
+ * Allowed classes to wear each henna.
+ * @author Zoey76
+ */
+public final class HennaData extends DocumentParser
+{
+	private static final Map<Integer, L2Henna> _hennaList = new HashMap<>();
+	
+	private HennaData()
+	{
+		_hennaList.clear();
+		final Document doc = parseFile(new File(Config.DATAPACK_ROOT, "data/stats/hennaList.xml"));
+		if (doc != null)
+		{
+			parseDocument(doc);
+		}
+		_log.info(getClass().getSimpleName() + ": Loaded " + _hennaList.size() + " Henna data.");
+	}
+	
+	@Override
+	protected void parseDocument(Document doc)
+	{
+		for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+		{
+			if ("list".equals(n.getNodeName()))
+			{
+				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+				{
+					if ("henna".equals(d.getNodeName()))
+					{
+						parseHenna(d);
+					}
+				}
+			}
+		}
+	}
+	
+	private void parseHenna(Node d)
+	{
+		final StatsSet set = new StatsSet();
+		final List<ClassId> wearClassIds = new ArrayList<>();
+		NamedNodeMap attrs = d.getAttributes();
+		Node attr;
+		String name;
+		for (int i = 0; i < attrs.getLength(); i++)
+		{
+			attr = attrs.item(i);
+			set.set(attr.getNodeName(), attr.getNodeValue());
+		}
+		
+		for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
+		{
+			name = c.getNodeName();
+			attrs = c.getAttributes();
+			switch (name)
+			{
+				case "stats":
+				{
+					for (int i = 0; i < attrs.getLength(); i++)
+					{
+						attr = attrs.item(i);
+						set.set(attr.getNodeName(), attr.getNodeValue());
+					}
+					break;
+				}
+				case "wear":
+				{
+					attr = attrs.getNamedItem("count");
+					set.set("wear_count", attr.getNodeValue());
+					attr = attrs.getNamedItem("fee");
+					set.set("wear_fee", attr.getNodeValue());
+					break;
+				}
+				case "cancel":
+				{
+					attr = attrs.getNamedItem("count");
+					set.set("cancel_count", attr.getNodeValue());
+					attr = attrs.getNamedItem("fee");
+					set.set("cancel_fee", attr.getNodeValue());
+					break;
+				}
+				case "classId":
+				{
+					wearClassIds.add(ClassId.getClassId(Integer.parseInt(c.getTextContent())));
+					break;
+				}
+			}
+		}
+		final L2Henna henna = new L2Henna(set);
+		henna.setWearClassIds(wearClassIds);
+		_hennaList.put(henna.getDyeId(), henna);
+	}
+	
+	/**
+	 * @param id of the dye.
+	 * @return the dye with that id.
+	 */
+	public L2Henna getHenna(int id)
+	{
+		return _hennaList.get(id);
+	}
+	
+	/**
+	 * @param classId the player's class Id.
+	 * @return the list with all the allowed dyes.
+	 */
+	public List<L2Henna> getHennaList(ClassId classId)
+	{
+		final List<L2Henna> list = new ArrayList<>();
+		for (L2Henna henna : _hennaList.values())
+		{
+			if (henna.isAllowedClass(classId))
+			{
+				list.add(henna);
+			}
+		}
+		return list;
+	}
+	
+	public static HennaData getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	@SuppressWarnings("synthetic-access")
+	private static class SingletonHolder
+	{
+		protected static final HennaData _instance = new HennaData();
+	}
+}

+ 0 - 112
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HennaTable.java

@@ -1,112 +0,0 @@
-/*
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version.
- * 
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- * 
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.datatables;
-
-import gnu.trove.map.hash.TIntObjectHashMap;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.l2jserver.L2DatabaseFactory;
-import com.l2jserver.gameserver.model.StatsSet;
-import com.l2jserver.gameserver.model.items.L2Henna;
-
-/**
- * This class ...
- *
- * @version $Revision$ $Date$
- */
-public class HennaTable
-{
-	private static Logger _log = Logger.getLogger(HennaTable.class.getName());
-	
-	private TIntObjectHashMap<L2Henna> _henna;
-	
-	public static HennaTable getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
-	private HennaTable()
-	{
-		_henna = new TIntObjectHashMap<L2Henna>();
-		restoreHennaData();
-	}
-	
-	/**
-	 *
-	 */
-	private void restoreHennaData()
-	{
-		Connection con = null;
-		try
-		{
-			con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement statement = con.prepareStatement("SELECT symbol_id, symbol_name, dye_id, dye_amount, price, stat_INT, stat_STR, stat_CON, stat_MEM, stat_DEX, stat_WIT FROM henna");
-			ResultSet hennadata = statement.executeQuery();
-			
-			fillHennaTable(hennadata);
-			hennadata.close();
-			statement.close();
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.SEVERE, "Error while creating henna table " + e.getMessage(), e);
-		}
-		finally
-		{
-			L2DatabaseFactory.close(con);
-		}
-	}
-	
-	private void fillHennaTable(ResultSet HennaData) throws Exception
-	{
-		while (HennaData.next())
-		{
-			StatsSet hennaDat = new StatsSet();
-			int id = HennaData.getInt("symbol_id");
-			
-			hennaDat.set("symbol_id", id);
-			hennaDat.set("dye", HennaData.getInt("dye_id"));
-			hennaDat.set("price", HennaData.getInt("price"));
-			//amount of dye required
-			hennaDat.set("amount", HennaData.getInt("dye_amount"));
-			hennaDat.set("stat_INT", HennaData.getInt("stat_INT"));
-			hennaDat.set("stat_STR", HennaData.getInt("stat_STR"));
-			hennaDat.set("stat_CON", HennaData.getInt("stat_CON"));
-			hennaDat.set("stat_MEM", HennaData.getInt("stat_MEM"));
-			hennaDat.set("stat_DEX", HennaData.getInt("stat_DEX"));
-			hennaDat.set("stat_WIT", HennaData.getInt("stat_WIT"));
-			
-			L2Henna template = new L2Henna(hennaDat);
-			_henna.put(id, template);
-		}
-		_log.info("HennaTable: Loaded " + _henna.size() + " Templates.");
-	}
-	
-	public L2Henna getTemplate(int id)
-	{
-		return _henna.get(id);
-	}
-	
-	@SuppressWarnings("synthetic-access")
-	private static class SingletonHolder
-	{
-		protected static final HennaTable _instance = new HennaTable();
-	}
-}

+ 0 - 150
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/HennaTreeTable.java

@@ -1,150 +0,0 @@
-/*
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version.
- * 
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- * 
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.datatables;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javolution.util.FastList;
-import javolution.util.FastMap;
-
-import com.l2jserver.L2DatabaseFactory;
-import com.l2jserver.gameserver.model.base.ClassId;
-import com.l2jserver.gameserver.model.items.L2Henna;
-import com.l2jserver.gameserver.model.items.instance.L2HennaInstance;
-
-/**
- * This class ...
- *
- * @version $Revision$ $Date$
- */
-public class HennaTreeTable
-{
-	private static Logger _log = Logger.getLogger(HennaTreeTable.class.getName());
-	private Map<ClassId, List<L2HennaInstance>> _hennaTrees;
-	private boolean _initialized = true;
-	
-	public static HennaTreeTable getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
-	private HennaTreeTable()
-	{
-		_hennaTrees = new FastMap<ClassId, List<L2HennaInstance>>();
-		int classId = 0;
-		int count = 0;
-		Connection con = null;
-		try
-		{
-			con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement statement = con.prepareStatement("SELECT class_name, id, parent_id FROM class_list ORDER BY id");
-			ResultSet classlist = statement.executeQuery();
-			List<L2HennaInstance> list;
-			//int parentClassId;
-			//L2Henna henna;
-			PreparedStatement statement2 = con.prepareStatement("SELECT class_id, symbol_id FROM henna_trees where class_id=? ORDER BY symbol_id");
-			while (classlist.next())
-			{
-				list = new FastList<L2HennaInstance>();
-				classId = classlist.getInt("id");
-				
-				statement2.setInt(1, classId);
-				ResultSet hennatree = statement2.executeQuery();
-				statement2.clearParameters();
-				while (hennatree.next())
-				{
-					int id = hennatree.getInt("symbol_id");
-					//String name = hennatree.getString("name");
-					L2Henna template = HennaTable.getInstance().getTemplate(id);
-					if (template == null)
-					{
-						hennatree.close();
-						statement2.close();
-						classlist.close();
-						statement.close();
-						return;
-					}
-					L2HennaInstance temp = new L2HennaInstance(template);
-					temp.setSymbolId(id);
-					temp.setItemIdDye(template.getDyeId());
-					temp.setAmountDyeRequire(template.getAmountDyeRequire());
-					temp.setPrice(template.getPrice());
-					temp.setStatINT(template.getStatINT());
-					temp.setStatSTR(template.getStatSTR());
-					temp.setStatCON(template.getStatCON());
-					temp.setStatMEM(template.getStatMEM());
-					temp.setStatDEX(template.getStatDEX());
-					temp.setStatWIT(template.getStatWIT());
-					
-					list.add(temp);
-				}
-				_hennaTrees.put(ClassId.values()[classId], list);
-				hennatree.close();
-				count += list.size();
-				_log.fine("Henna Tree for Class: " + classId + " has " + list.size() + " Henna Templates.");
-			}
-			
-			classlist.close();
-			statement.close();
-			statement2.close();
-			
-			_log.info("HennaTreeTable: Loaded " + count + " Henna Tree Templates.");
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.SEVERE, "Error loading Henna Tree Table.", e);
-		}
-		finally
-		{
-			L2DatabaseFactory.close(con);
-		}
-	}
-	
-	public L2HennaInstance[] getAvailableHenna(ClassId classId)
-	{
-		List<L2HennaInstance> result = new FastList<L2HennaInstance>();
-		List<L2HennaInstance> henna = _hennaTrees.get(classId);
-		if (henna == null)
-		{
-			// the hennatree for this class is undefined, so we give an empty list
-			_log.warning("Hennatree for class " + classId + " is not defined !");
-			return new L2HennaInstance[0];
-		}
-		
-		for (L2HennaInstance temp : henna)
-		{
-			result.add(temp);
-		}
-		
-		return result.toArray(new L2HennaInstance[result.size()]);
-	}
-	
-	public boolean isInitialized()
-	{
-		return _initialized;
-	}
-	
-	@SuppressWarnings("synthetic-access")
-	private static class SingletonHolder
-	{
-		protected static final HennaTreeTable _instance = new HennaTreeTable();
-	}
-}

+ 127 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/InitialEquipmentData.java

@@ -0,0 +1,127 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.datatables;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.engines.DocumentParser;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.base.ClassId;
+import com.l2jserver.gameserver.model.items.PcItemTemplate;
+
+/**
+ * This class holds the Initial Equipment information.<br>
+ * What items get each newly created character and if this item is equipped upon creation (<b>Requires the item to be equippable</b>).
+ * @author Zoey76
+ */
+public final class InitialEquipmentData extends DocumentParser
+{
+	private static final String filePathNormal = "data/stats/initialEquipment.xml";
+	private static final String filePathEvent = "data/stats/initialEquipmentEvent.xml";
+	private final Map<ClassId, List<PcItemTemplate>> _initialEquipmentList = new HashMap<>();
+	
+	private InitialEquipmentData()
+	{
+		_initialEquipmentList.clear();
+		final Document doc = parseFile(new File(Config.DATAPACK_ROOT, Config.INITIAL_EQUIPMENT_EVENT ? filePathEvent : filePathNormal));
+		if (doc != null)
+		{
+			parseDocument(doc);
+		}
+		_log.info(getClass().getSimpleName() + ": Loaded " + _initialEquipmentList.size() + " Initial Equipment data.");
+	}
+	
+	@Override
+	protected void parseDocument(Document doc)
+	{
+		for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+		{
+			if ("list".equalsIgnoreCase(n.getNodeName()))
+			{
+				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+				{
+					if ("equipment".equalsIgnoreCase(d.getNodeName()))
+					{
+						parseEquipment(d);
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * @param d parse an initial equipment and add it to {@link #_initialEquipmentList}
+	 */
+	private void parseEquipment(Node d)
+	{
+		NamedNodeMap attrs = d.getAttributes();
+		Node attr;
+		final ClassId classId = ClassId.getClassId(Integer.parseInt(attrs.getNamedItem("classId").getNodeValue()));
+		final List<PcItemTemplate> equipList = new ArrayList<>();
+		for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
+		{
+			if ("item".equalsIgnoreCase(c.getNodeName()))
+			{
+				final StatsSet set = new StatsSet();
+				attrs = c.getAttributes();
+				for (int i = 0; i < attrs.getLength(); i++)
+				{
+					attr = attrs.item(i);
+					set.set(attr.getNodeName(), attr.getNodeValue());
+				}
+				equipList.add(new PcItemTemplate(set));
+			}
+		}
+		_initialEquipmentList.put(classId, equipList);
+	}
+	
+	/**
+	 * @param cId the class Id for the required initial equipment.
+	 * @return the initial equipment for the given class Id.
+	 */
+	public List<PcItemTemplate> getEquipmentList(ClassId cId)
+	{
+		return _initialEquipmentList.get(cId);
+	}
+	
+	/**
+	 * @param cId the class Id for the required initial equipment.
+	 * @return the initial equipment for the given class Id.
+	 */
+	public List<PcItemTemplate> getEquipmentList(int cId)
+	{
+		return _initialEquipmentList.get(ClassId.getClassId(cId));
+	}
+	
+	public static InitialEquipmentData getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	@SuppressWarnings("synthetic-access")
+	private static class SingletonHolder
+	{
+		protected static final InitialEquipmentData _instance = new InitialEquipmentData();
+	}
+}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcTable.java

@@ -787,7 +787,7 @@ public class NpcTable
 				}
 				
 				cont++;
-				npc.addTeachInfo(ClassId.values()[classId]);
+				npc.addTeachInfo(ClassId.getClassId(classId));
 			}
 			
 			rset.close();

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

@@ -123,7 +123,7 @@ public final class SkillTreesData extends DocumentParser
 		_gameMasterAuraSkillTree.clear();
 		
 		// Load files.
-		_loading = loadDirectory(new File(Config.DATAPACK_ROOT, "data/skillTrees/"));
+		_loading = parseDirectory(new File(Config.DATAPACK_ROOT, "data/skillTrees/"));
 		
 		// Generate check arrays.
 		generateCheckArrays();
@@ -137,7 +137,7 @@ public final class SkillTreesData extends DocumentParser
 	 * @param doc the document to be parsed.
 	 */
 	@Override
-	protected void parseDoc(Document doc)
+	protected void parseDocument(Document doc)
 	{
 		NamedNodeMap attrs;
 		Node attr;
@@ -197,10 +197,10 @@ public final class SkillTreesData extends DocumentParser
 									switch (b.getNodeName())
 									{
 										case "item":
-											skillLearn.addRequiredItem(new ItemHolder(Integer.parseInt(attrs.getNamedItem("id").getNodeValue()), Integer.parseInt(attrs.getNamedItem("count").getNodeValue())));
+											skillLearn.addRequiredItem(new ItemHolder(parseInt(attrs, "id"), parseInt(attrs, "count")));
 											break;
 										case "preRequisiteSkill":
-											skillLearn.addPreReqSkill(new SkillHolder(Integer.parseInt(attrs.getNamedItem("id").getNodeValue()), Integer.parseInt(attrs.getNamedItem("lvl").getNodeValue())));
+											skillLearn.addPreReqSkill(new SkillHolder(parseInt(attrs, "id"), parseInt(attrs, "lvl")));
 											break;
 										case "race":
 											skillLearn.addRace(Race.valueOf(b.getTextContent()));
@@ -212,7 +212,7 @@ public final class SkillTreesData extends DocumentParser
 											skillLearn.setSocialClass(Enum.valueOf(SocialClass.class, b.getTextContent()));
 											break;
 										case "subClassConditions":
-											skillLearn.addSubclassConditions(Integer.parseInt(attrs.getNamedItem("slot").getNodeValue()), Integer.parseInt(attrs.getNamedItem("lvl").getNodeValue()));
+											skillLearn.addSubclassConditions(parseInt(attrs, "slot"), parseInt(attrs, "lvl"));
 											break;
 									}
 								}
@@ -1187,7 +1187,7 @@ public final class SkillTreesData extends DocumentParser
 		}
 		
 		final String className = getClass().getSimpleName();
-		_log.info(className + ": Loaded " + classSkillTreeCount + "  Class Skills for " + _classSkillTrees.size() + " Class Skill Trees.");
+		_log.info(className + ": Loaded " + classSkillTreeCount + " Class Skills for " + _classSkillTrees.size() + " Class Skill Trees.");
 		_log.info(className + ": Loaded " + _subClassSkillTree.size() + " Sub-Class Skills.");
 		_log.info(className + ": Loaded " + trasferSkillTreeCount + " Transfer Skills for " + _transferSkillTrees.size() + " Transfer Skill Trees.");
 		_log.info(className + ": Loaded " + _fishingSkillTree.size() + " Fishing Skills, " + dwarvenOnlyFishingSkillCount + " Dwarven only Fishing Skills.");

+ 51 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentParser.java

@@ -21,6 +21,8 @@ import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
 import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
 import org.xml.sax.ErrorHandler;
 import org.xml.sax.SAXParseException;
 
@@ -46,7 +48,7 @@ public abstract class DocumentParser
 	 * @param f the XML file to parse.
 	 * @return the document with the parsed data.
 	 */
-	public Document parse(File f)
+	public Document parseFile(File f)
 	{
 		if (!xmlFilter.accept(f))
 		{
@@ -75,22 +77,22 @@ public abstract class DocumentParser
 	}
 	
 	/**
-	 * Wrapper for {@link #loadDirectory(File)}.
+	 * Wrapper for {@link #parseDirectory(File)}.
 	 * @param path the path to the directory where the XML files are.
 	 * @return {@code false} if it fails to find the directory, {@code true} otherwise.
 	 */
-	public boolean loadDirectory(String path)
+	public boolean parseDirectory(String path)
 	{
-		return loadDirectory(new File(path));
+		return parseDirectory(new File(path));
 	}
 	
 	/**
-	 * Loads all XML files from {@code path} and calls {@link #parse(File)} for each one of them.<br>
-	 * If the file was successfully parsed, call {@link #parseDoc(Document)} for the parsed document.
+	 * Loads all XML files from {@code path} and calls {@link #parseFile(File)} for each one of them.<br>
+	 * If the file was successfully parsed, call {@link #parseDocument(Document)} for the parsed document.
 	 * @param dir the directory object to scan.
 	 * @return {@code false} if it fails to find the directory, {@code true} otherwise.
 	 */
-	public boolean loadDirectory(File dir)
+	public boolean parseDirectory(File dir)
 	{
 		if (!dir.exists())
 		{
@@ -101,10 +103,10 @@ public abstract class DocumentParser
 		final File[] listOfFiles = dir.listFiles(xmlFilter);
 		for (File f : listOfFiles)
 		{
-			final Document doc = parse(f);
+			final Document doc = parseFile(f);
 			if (doc != null)
 			{
-				parseDoc(doc);
+				parseDocument(doc);
 			}
 		}
 		return true;
@@ -112,10 +114,48 @@ public abstract class DocumentParser
 	
 	/**
 	 * Abstract method that when implemented will parse a document.<br>
-	 * Is expected to be used along with {@link #parse(File)}.
+	 * Is expected to be used along with {@link #parseFile(File)}.
 	 * @param doc the document to parse.
 	 */
-	protected abstract void parseDoc(Document doc);
+	protected abstract void parseDocument(Document doc);
+	
+	/**
+	 * @param n the named node map.
+	 * @param name the attribute name.
+	 * @return a parsed integer.
+	 */
+	protected static int parseInt(NamedNodeMap n, String name)
+	{
+		return Integer.parseInt(n.getNamedItem(name).getNodeValue());
+	}
+	
+	/**
+	 * @param n the named node map.
+	 * @param name the attribute name.
+	 * @return a parsed integer object.
+	 */
+	protected static Integer parseInteger(NamedNodeMap n, String name)
+	{
+		return Integer.valueOf(n.getNamedItem(name).getNodeValue());
+	}
+	
+	/**
+	 * @param n the node to parse.
+	 * @return the parsed integer.
+	 */
+	protected static int parseInt(Node n)
+	{
+		return Integer.parseInt(n.getNodeValue());
+	}
+	
+	/**
+	 * @param n the node to parse.
+	 * @return the parsed integer object.
+	 */
+	protected static Integer parseInteger(Node n)
+	{
+		return Integer.valueOf(n.getNodeValue());
+	}
 	
 	/**
 	 * Simple XML error handler.

+ 9 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/StatsSet.java

@@ -196,18 +196,24 @@ public final class StatsSet
 	 */
 	public int getInteger(String name)
 	{
-		Object val = _set.get(name);
+		final Object val = _set.get(name);
 		if (val == null)
-			throw new IllegalArgumentException("Integer value required, but not specified");
+		{
+			throw new IllegalArgumentException("Integer value required, but not specified: " + name + "!");
+		}
+		
 		if (val instanceof Number)
+		{
 			return ((Number) val).intValue();
+		}
+		
 		try
 		{
 			return Integer.parseInt((String) val);
 		}
 		catch (Exception e)
 		{
-			throw new IllegalArgumentException("Integer value required, but found: " + val);
+			throw new IllegalArgumentException("Integer value required, but found: " + val + "!");
 		}
 	}
 	

+ 7 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ClassMasterInstance.java

@@ -16,7 +16,7 @@ package com.l2jserver.gameserver.model.actor.instance;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.cache.HtmCache;
-import com.l2jserver.gameserver.datatables.CharTemplateTable;
+import com.l2jserver.gameserver.datatables.ClassListData;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
@@ -84,7 +84,7 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 			{
 				NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
 				html.setFile(player.getHtmlPrefix(), "data/html/classmaster/ok.htm");
-				html.replace("%name%", CharTemplateTable.getInstance().getClassNameById(val));
+				html.replace("%name%", ClassListData.getInstance().getClass(val).getClassName(true));
 				player.sendPacket(html);
 			}
 		}
@@ -242,7 +242,7 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 									"<a action=\"bypass -h npc_%objectId%_change_class ",
 									String.valueOf(cid.getId()),
 									"\">",
-									CharTemplateTable.getInstance().getClassNameById(cid.getId()),
+									ClassListData.getInstance().getClass(cid).getClassName(true),
 									"</a><br>"
 							);
 						}
@@ -251,7 +251,7 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 					if (menu.length() > 0)
 					{
 						html.setFile(player.getHtmlPrefix(), "data/html/classmaster/template.htm");
-						html.replace("%name%", CharTemplateTable.getInstance().getClassNameById(currentClassId.getId()));
+						html.replace("%name%", ClassListData.getInstance().getClass(currentClassId).getClassName(true));
 						html.replace("%menu%", menu.toString());
 					}
 					else
@@ -287,7 +287,7 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 		
 		String msg = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "data/html/classmaster/tutorialtemplate.htm");
 		
-		msg = msg.replaceAll("%name%", CharTemplateTable.getInstance().getClassNameById(currentClassId.getId()));
+		msg = msg.replaceAll("%name%", ClassListData.getInstance().getClass(currentClassId).getClassName(true));
 		
 		final StringBuilder menu = new StringBuilder(100);
 		for (ClassId cid : ClassId.values())
@@ -300,7 +300,7 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 						"<a action=\"link CO",
 						String.valueOf(cid.getId()),
 						"\">",
-						CharTemplateTable.getInstance().getClassNameById(cid.getId()),
+						ClassListData.getInstance().getClass(cid).getClassName(true),
 						"</a><br>"
 				);
 			}
@@ -404,7 +404,7 @@ public final class L2ClassMasterInstance extends L2MerchantInstance
 	{
 		try
 		{
-			return validateClassId(oldCID, ClassId.values()[val]);
+			return validateClassId(oldCID, ClassId.getClassId(val));
 		}
 		catch (Exception e)
 		{

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

@@ -66,10 +66,11 @@ import com.l2jserver.gameserver.datatables.CharNameTable;
 import com.l2jserver.gameserver.datatables.CharSummonTable;
 import com.l2jserver.gameserver.datatables.CharTemplateTable;
 import com.l2jserver.gameserver.datatables.ClanTable;
+import com.l2jserver.gameserver.datatables.ClassListData;
 import com.l2jserver.gameserver.datatables.EnchantGroupsTable;
 import com.l2jserver.gameserver.datatables.ExperienceTable;
 import com.l2jserver.gameserver.datatables.FishTable;
-import com.l2jserver.gameserver.datatables.HennaTable;
+import com.l2jserver.gameserver.datatables.HennaData;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.PetDataTable;
@@ -173,7 +174,6 @@ import com.l2jserver.gameserver.model.items.L2EtcItem;
 import com.l2jserver.gameserver.model.items.L2Henna;
 import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.L2Weapon;
-import com.l2jserver.gameserver.model.items.instance.L2HennaInstance;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.items.type.L2ArmorType;
 import com.l2jserver.gameserver.model.items.type.L2EtcItemType;
@@ -629,7 +629,7 @@ public final class L2PcInstance extends L2Playable
 	private final List<L2PcInstance> _snoopedPlayer = new FastList<L2PcInstance>();
 	
 	// hennas
-	private final L2HennaInstance[] _henna = new L2HennaInstance[3];
+	private final L2Henna[] _henna = new L2Henna[3];
 	private int _hennaSTR;
 	private int _hennaINT;
 	private int _hennaDEX;
@@ -1364,11 +1364,22 @@ public final class L2PcInstance extends L2Playable
 		return CharTemplateTable.getInstance().getTemplate(_baseClass);
 	}
 	
-	/** Return the L2PcTemplate link to the L2PcInstance. */
+	/**
+	 * @return the L2PcTemplate link to the L2PcInstance.
+	 */
 	@Override
-	public final L2PcTemplate getTemplate() { return (L2PcTemplate)super.getTemplate(); }
+	public final L2PcTemplate getTemplate()
+	{
+		return (L2PcTemplate) super.getTemplate();
+	}
 	
-	public void setTemplate(ClassId newclass) { super.setTemplate(CharTemplateTable.getInstance().getTemplate(newclass)); }
+	/**
+	 * @param newclass
+	 */
+	public void setTemplate(ClassId newclass)
+	{
+		super.setTemplate(CharTemplateTable.getInstance().getTemplate(newclass));
+	}
 	
 	/**
 	 * Return the AI of the L2PcInstance (create it if necessary).<BR><BR>
@@ -2614,7 +2625,7 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public ClassId getClassId()
 	{
-		return getTemplate().classId;
+		return getTemplate().getClassId();
 	}
 	
 	/**
@@ -2996,10 +3007,10 @@ public final class L2PcInstance extends L2Playable
 	public Race getRace()
 	{
 		if (!isSubClassActive())
-			return getTemplate().race;
-		
-		L2PcTemplate charTemp = CharTemplateTable.getInstance().getTemplate(_baseClass);
-		return charTemp.race;
+		{
+			return getTemplate().getRace();
+		}
+		return CharTemplateTable.getInstance().getTemplate(_baseClass).getRace();
 	}
 	
 	public L2Radar getRadar()
@@ -7287,7 +7298,7 @@ public final class L2PcInstance extends L2Playable
 			while (rset.next())
 			{
 				final int activeClassId = rset.getInt("classid");
-				final boolean female = rset.getInt("sex")!=0;
+				final boolean female = rset.getInt("sex") != 0;
 				final L2PcTemplate template = CharTemplateTable.getInstance().getTemplate(activeClassId);
 				PcAppearance app = new PcAppearance(rset.getByte("face"), rset.getByte("hairColor"), rset.getByte("hairStyle"), female);
 				
@@ -8326,7 +8337,7 @@ public final class L2PcInstance extends L2Playable
 					if (!SkillTreesData.getInstance().isSkillAllowed(this, skill))
 					{
 						Util.handleIllegalPlayerAction(this, "Player " + getName() + " has invalid skill " + skill.getName() +
-								" ("+skill.getId() + "/" + skill.getLevel() + "), class:" + getTemplate().className, 1);
+							" ("+skill.getId() + "/" + skill.getLevel() + "), class:" + ClassListData.getInstance().getClass(getClassId()).getClassName(false), 1);
 						if (Config.SKILL_CHECK_REMOVE)
 							removeSkill(skill);
 					}
@@ -8513,12 +8524,11 @@ public final class L2PcInstance extends L2Playable
 	}
 	
 	/**
-	 * Retrieve from the database all Henna of this L2PcInstance, add them to _henna and calculate stats of the L2PcInstance.<BR><BR>
+	 * Retrieve from the database all Henna of this L2PcInstance, add them to _henna and calculate stats of the L2PcInstance.
 	 */
 	private void restoreHenna()
 	{
 		Connection con = null;
-		
 		try
 		{
 			con = L2DatabaseFactory.getInstance().getConnection();
@@ -8527,30 +8537,27 @@ public final class L2PcInstance extends L2Playable
 			statement.setInt(2, getClassIndex());
 			ResultSet rset = statement.executeQuery();
 			
-			for (int i=0;i<3;i++)
-				_henna[i]=null;
+			for (int i = 0; i < 3; i++)
+			{
+				_henna[i] = null;
+			}
 			
+			int slot;
+			int symbolId;
 			while (rset.next())
 			{
-				int slot = rset.getInt("slot");
-				
-				if (slot<1 || slot>3)
+				slot = rset.getInt("slot");
+				if ((slot < 1) || (slot > 3))
+				{
 					continue;
+				}
 				
-				int symbol_id = rset.getInt("symbol_id");
-				
-				L2HennaInstance sym = null;
-				
-				if (symbol_id != 0)
+				symbolId = rset.getInt("symbol_id");
+				if (symbolId == 0)
 				{
-					L2Henna tpl = HennaTable.getInstance().getTemplate(symbol_id);
-					
-					if (tpl != null)
-					{
-						sym = new L2HennaInstance(tpl);
-						_henna[slot-1] = sym;
-					}
+					continue;
 				}
+				_henna[slot - 1] = HennaData.getInstance().getHenna(symbolId);
 			}
 			
 			rset.close();
@@ -8558,7 +8565,7 @@ public final class L2PcInstance extends L2Playable
 		}
 		catch (Exception e)
 		{
-			_log.log(Level.SEVERE, "Failed restoing character "+this+" hennas.", e);
+			_log.log(Level.SEVERE, "Failed restoing character " + this + " hennas.", e);
 		}
 		finally
 		{
@@ -8593,7 +8600,7 @@ public final class L2PcInstance extends L2Playable
 	}
 	
 	/**
-	 * Remove a Henna of the L2PcInstance, save update in the character_hennas table of the database and send Server->Client HennaInfo/UserInfo packet to this L2PcInstance.<BR><BR>
+	 * Remove a Henna of the L2PcInstance, save update in the character_hennas table of the database and send Server->Client HennaInfo/UserInfo packet to this L2PcInstance.
 	 * @param slot 
 	 * @return 
 	 */
@@ -8603,26 +8610,30 @@ public final class L2PcInstance extends L2Playable
 		{
 			return false;
 		}
+		
 		if (slot < 1 || slot > 3)
+		{
 			return false;
+		}
 		
 		slot--;
 		
-		if (_henna[slot] == null)
+		L2Henna henna = _henna[slot];
+		if (henna == null)
+		{
 			return false;
+		}
 		
-		L2HennaInstance henna = _henna[slot];
 		_henna[slot] = null;
 		
 		Connection con = null;
-		
 		try
 		{
 			con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement statement = con.prepareStatement(DELETE_CHAR_HENNA);
+			final PreparedStatement statement = con.prepareStatement(DELETE_CHAR_HENNA);
 			
 			statement.setInt(1, getObjectId());
-			statement.setInt(2, slot+1);
+			statement.setInt(2, slot + 1);
 			statement.setInt(3, getClassIndex());
 			
 			statement.execute();
@@ -8647,26 +8658,23 @@ public final class L2PcInstance extends L2Playable
 		sendPacket(new UserInfo(this));
 		sendPacket(new ExBrExtraUserInfo(this));
 		// Add the recovered dyes to the player's inventory and notify them.
-		getInventory().addItem("Henna", henna.getItemIdDye(), henna.getAmountDyeRequire() / 2, this, null);
-		
-		reduceAdena("Henna", henna.getPrice() / 5, this, false);
+		getInventory().addItem("Henna", henna.getDyeItemId(), henna.getCancelCount(), this, null);
+		reduceAdena("Henna", henna.getCancelFee(), this, false);
 		
-		SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
-		sm.addItemName(henna.getItemIdDye());
-		sm.addItemNumber(henna.getAmountDyeRequire() / 2);
+		final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
+		sm.addItemName(henna.getDyeItemId());
+		sm.addItemNumber(henna.getCancelCount());
 		sendPacket(sm);
-		
 		sendPacket(SystemMessageId.SYMBOL_DELETED);
-		
 		return true;
 	}
 	
 	/**
-	 * Add a Henna to the L2PcInstance, save update in the character_hennas table of the database and send Server->Client HennaInfo/UserInfo packet to this L2PcInstance.<BR><BR>
-	 * @param henna 
-	 * @return 
+	 * Add a Henna to the L2PcInstance, save update in the character_hennas table of the database and send Server->Client HennaInfo/UserInfo packet to this L2PcInstance.
+	 * @param henna the henna to add to the player.
+	 * @return {@code true} if the henna is added to the player, {@code false} otherwise.
 	 */
-	public boolean addHenna(L2HennaInstance henna)
+	public boolean addHenna(L2Henna henna)
 	{
 		if (!fireHennaListeners(henna, true))
 		{
@@ -8682,15 +8690,14 @@ public final class L2PcInstance extends L2Playable
 				recalcHennaStats();
 				
 				Connection con = null;
-				
 				try
 				{
 					con = L2DatabaseFactory.getInstance().getConnection();
 					PreparedStatement statement = con.prepareStatement(ADD_CHAR_HENNA);
 					
 					statement.setInt(1, getObjectId());
-					statement.setInt(2, henna.getSymbolId());
-					statement.setInt(3, i+1);
+					statement.setInt(2, henna.getDyeId());
+					statement.setInt(3, i + 1);
 					statement.setInt(4, getClassIndex());
 					
 					statement.execute();
@@ -8719,7 +8726,7 @@ public final class L2PcInstance extends L2Playable
 	}
 	
 	/**
-	 * Calculate Henna modifiers of this L2PcInstance.<BR><BR>
+	 * Calculate Henna modifiers of this L2PcInstance.
 	 */
 	private void recalcHennaStats()
 	{
@@ -8730,37 +8737,43 @@ public final class L2PcInstance extends L2Playable
 		_hennaWIT = 0;
 		_hennaDEX = 0;
 		
-		for (int i=0;i<3;i++)
-		{
-			if (_henna[i]==null)continue;
-			_hennaINT += _henna[i].getStatINT();
-			_hennaSTR += _henna[i].getStatSTR();
-			_hennaMEN += _henna[i].getStatMEM();
-			_hennaCON += _henna[i].getStatCON();
-			_hennaWIT += _henna[i].getStatWIT();
-			_hennaDEX += _henna[i].getStatDEX();
-		}
-		
-		if (_hennaINT>5)_hennaINT=5;
-		if (_hennaSTR>5)_hennaSTR=5;
-		if (_hennaMEN>5)_hennaMEN=5;
-		if (_hennaCON>5)_hennaCON=5;
-		if (_hennaWIT>5)_hennaWIT=5;
-		if (_hennaDEX>5)_hennaDEX=5;
-	}
+		for (int i = 0; i < 3; i++)
+ 		{
+			if (_henna[i] == null)
+			{
+				continue;
+			}
+			
+			_hennaINT += _henna[i].getStatINT() > 5 ? 5 : _henna[i].getStatINT();
+			_hennaSTR += _henna[i].getStatSTR() > 5 ? 5 : _henna[i].getStatSTR();
+			_hennaMEN += _henna[i].getStatMEN() > 5 ? 5 : _henna[i].getStatMEN();
+			_hennaCON += _henna[i].getStatCON() > 5 ? 5 : _henna[i].getStatCON();
+			_hennaWIT += _henna[i].getStatWIT() > 5 ? 5 : _henna[i].getStatWIT();
+			_hennaDEX += _henna[i].getStatDEX() > 5 ? 5 : _henna[i].getStatDEX();
+ 		}
+ 	}
 	
 	/**
 	 * @param slot 
 	 * @return the Henna of this L2PcInstance corresponding to the selected slot.
 	 */
-	public L2HennaInstance getHenna(int slot)
+	public L2Henna getHenna(int slot)
 	{
-		if (slot < 1 || slot > 3)
+		if ((slot < 1) || (slot > 3))
+		{
 			return null;
-		
+		}
 		return _henna[slot - 1];
 	}
 	
+	/**
+	 * @return the henna holder for this player.
+	 */
+	public L2Henna[] getHennaList()
+	{
+		return _henna;
+	}
+	
 	/**
 	 * @return the INT Henna modifier of this L2PcInstance.
 	 */
@@ -10851,9 +10864,11 @@ public final class L2PcInstance extends L2Playable
 			getSubClasses().put(newClass.getClassIndex(), newClass);
 			
 			if (Config.DEBUG)
+			{
 				_log.info(getName() + " added class ID " + classId + " as a sub class at index " + classIndex + ".");
+			}
 			
-			final ClassId subTemplate = ClassId.values()[classId];
+			final ClassId subTemplate = ClassId.getClassId(classId);
 			final FastMap<Integer, L2SkillLearn> skillTree = SkillTreesData.getInstance().getCompleteClassSkillTree(subTemplate);
 			final FastMap<Integer, L2Skill> prevSkillList = new FastMap<Integer, L2Skill>();
 			
@@ -11006,16 +11021,15 @@ public final class L2PcInstance extends L2Playable
 	{
 		_activeClass = classId;
 		
-		L2PcTemplate t = CharTemplateTable.getInstance().getTemplate(classId);
-		
-		if (t == null)
+		final L2PcTemplate pcTemplate = CharTemplateTable.getInstance().getTemplate(classId);
+		if (pcTemplate == null)
 		{
-			_log.severe("Missing template for classId: "+classId);
+			_log.severe("Missing template for classId: " + classId);
 			throw new Error();
 		}
 		// Set the template of the L2PcInstance
-		setTemplate(t);
-		fireProfessionChangeListeners(t);
+		setTemplate(pcTemplate);
+		fireProfessionChangeListeners(pcTemplate);
 	}
 	
 	/**
@@ -14903,16 +14917,12 @@ public final class L2PcInstance extends L2Playable
 	
 	public double getCollisionRadius()
 	{
-		if (getAppearance().getSex())
-			return getBaseTemplate().fCollisionRadius_female;
-		return getBaseTemplate().getfCollisionRadius();
+		return getAppearance().getSex() ? getBaseTemplate().getFCollisionRadiusFemale() : getBaseTemplate().getfCollisionRadius();
 	}
 	
 	public double getCollisionHeight()
 	{
-		if (getAppearance().getSex())
-			return getBaseTemplate().fCollisionHeight_female;
-		return getBaseTemplate().getfCollisionHeight();
+		return getAppearance().getSex() ? getBaseTemplate().getFCollisionHeightFemale() : getBaseTemplate().getfCollisionHeight();
 	}
 	
 	public final int getClientX()
@@ -15605,7 +15615,7 @@ public final class L2PcInstance extends L2Playable
 	 * @param isAdding
 	 * @return
 	 */
-	private boolean fireHennaListeners(L2HennaInstance henna, boolean isAdding)
+	private boolean fireHennaListeners(L2Henna henna, boolean isAdding)
 	{
 		if (henna != null && !hennaListeners.isEmpty())
 		{

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

@@ -23,8 +23,8 @@ import java.util.regex.PatternSyntaxException;
 import javolution.util.FastList;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.CharTemplateTable;
 import com.l2jserver.gameserver.datatables.ClanTable;
+import com.l2jserver.gameserver.datatables.ClassListData;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.FortManager;
@@ -275,10 +275,10 @@ public class L2VillageMasterInstance extends L2NpcInstance
 									"<a action=\"bypass -h npc_%objectId%_Subclass 4 ",
 									String.valueOf(subClass.ordinal()),
 									"\" msg=\"1268;",
-									formatClassForDisplay(subClass),
+									ClassListData.getInstance().getClass(subClass.ordinal()).getClassName(true),
 									"\">",
-									formatClassForDisplay(subClass),
-							"</a><br>");
+									ClassListData.getInstance().getClass(subClass.ordinal()).getClassName(true),
+									"</a><br>");
 						}
 						html.replace("%list%", content1.toString());
 					}
@@ -312,8 +312,8 @@ public class L2VillageMasterInstance extends L2NpcInstance
 						{
 							StringUtil.append(content2,
 									"<a action=\"bypass -h npc_%objectId%_Subclass 5 0\">",
-									CharTemplateTable.getInstance().getClassNameById(player.getBaseClass()),
-							"</a><br>");
+									ClassListData.getInstance().getClass(player.getBaseClass()).getClassName(true),
+									"</a><br>");
 						}
 						
 						for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();)
@@ -325,8 +325,8 @@ public class L2VillageMasterInstance extends L2NpcInstance
 										"<a action=\"bypass -h npc_%objectId%_Subclass 5 ",
 										String.valueOf(subClass.getClassIndex()),
 										"\">",
-										formatClassForDisplay(subClass.getClassDefinition()),
-								"</a><br>");
+										ClassListData.getInstance().getClass(subClass.getClassId()).getClassName(true),
+										"</a><br>");
 							}
 						}
 						
@@ -364,8 +364,8 @@ public class L2VillageMasterInstance extends L2NpcInstance
 									"<a action=\"bypass -h npc_%objectId%_Subclass 6 ",
 									String.valueOf(subClass.getClassIndex()),
 									"\">",
-									CharTemplateTable.getInstance().getClassNameById(subClass.getClassId()),
-							"</a><br>");
+									ClassListData.getInstance().getClass(subClass.getClassId()).getClassName(true),
+									"</a><br>");
 						}
 						html.replace("%list%", content3.toString());
 					}
@@ -374,17 +374,17 @@ public class L2VillageMasterInstance extends L2NpcInstance
 						// retail html contain only 3 subclasses
 						html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Modify.htm");
 						if (player.getSubClasses().containsKey(1))
-							html.replace("%sub1%", CharTemplateTable.getInstance().getClassNameById(player.getSubClasses().get(1).getClassId()));
+							html.replace("%sub1%", ClassListData.getInstance().getClass(player.getSubClasses().get(1).getClassId()).getClassName(true));
 						else
 							html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 1\">%sub1%</a><br>", "");
 						
 						if (player.getSubClasses().containsKey(2))
-							html.replace("%sub2%", CharTemplateTable.getInstance().getClassNameById(player.getSubClasses().get(2).getClassId()));
+							html.replace("%sub2%", ClassListData.getInstance().getClass(player.getSubClasses().get(2).getClassId()).getClassName(true));
 						else
 							html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 2\">%sub2%</a><br>", "");
 						
 						if (player.getSubClasses().containsKey(3))
-							html.replace("%sub3%", CharTemplateTable.getInstance().getClassNameById(player.getSubClasses().get(3).getClassId()));
+							html.replace("%sub3%", ClassListData.getInstance().getClass(player.getSubClasses().get(3).getClassId()).getClassName(true));
 						else
 							html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 3\">%sub3%</a><br>", "");
 					}
@@ -512,8 +512,8 @@ public class L2VillageMasterInstance extends L2NpcInstance
 								String.valueOf(subClass.ordinal()),
 								"\" msg=\"1445;",
 								"\">",
-								formatClassForDisplay(subClass),
-						"</a><br>");
+								ClassListData.getInstance().getClass(subClass.ordinal()).getClassName(true),
+								"</a><br>");
 					}
 					
 					switch (paramOne)
@@ -555,7 +555,7 @@ public class L2VillageMasterInstance extends L2NpcInstance
 						player.setActiveClass(paramOne);
 						
 						html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyOk.htm");
-						html.replace("%name%", CharTemplateTable.getInstance().getClassNameById(paramTwo));
+						html.replace("%name%", ClassListData.getInstance().getClass(paramTwo).getClassName(true));
 						
 						player.sendPacket(SystemMessageId.ADD_NEW_SUBCLASS); // Subclass added.
 					}
@@ -613,15 +613,17 @@ public class L2VillageMasterInstance extends L2NpcInstance
 		return true;
 	}
 	
-	/*
+	/**
 	 * Returns list of available subclasses
 	 * Base class and already used subclasses removed
+	 * @param player 
+	 * @return 
 	 */
 	private final Set<PlayerClass> getAvailableSubClasses(L2PcInstance player)
 	{
 		// get player base class
 		final int currentBaseId = player.getBaseClass();
-		final ClassId baseCID = ClassId.values()[currentBaseId];
+		final ClassId baseCID = ClassId.getClassId(currentBaseId);
 		
 		// we need 2nd occupation ID
 		final int baseClassId;
@@ -671,11 +673,13 @@ public class L2VillageMasterInstance extends L2NpcInstance
 				
 				// scan for already used subclasses
 				int availClassId = pclass.ordinal();
-				ClassId cid = ClassId.values()[availClassId];
+				ClassId cid = ClassId.getClassId(availClassId);
+				SubClass prevSubClass;
+				ClassId subClassId;
 				for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();)
 				{
-					SubClass prevSubClass = subList.next();
-					ClassId subClassId = ClassId.values()[prevSubClass.getClassId()];
+					prevSubClass = subList.next();
+					subClassId = ClassId.getClassId(prevSubClass.getClassId());
 					
 					if (subClassId.equalsOrChildOf(cid))
 					{
@@ -704,18 +708,22 @@ public class L2VillageMasterInstance extends L2NpcInstance
 			return false;
 		
 		final ClassId cid = ClassId.values()[classId];
+		SubClass sub;
+		ClassId subClassId;
 		for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();)
 		{
-			SubClass sub = subList.next();
-			ClassId subClassId = ClassId.values()[sub.getClassId()];
+			sub = subList.next();
+			subClassId = ClassId.values()[sub.getClassId()];
 			
 			if (subClassId.equalsOrChildOf(cid))
+			{
 				return false;
+			}
 		}
 		
 		// get player base class
 		final int currentBaseId = player.getBaseClass();
-		final ClassId baseCID = ClassId.values()[currentBaseId];
+		final ClassId baseCID = ClassId.getClassId(currentBaseId);
 		
 		// we need 2nd occupation ID
 		final int baseClassId;
@@ -751,16 +759,20 @@ public class L2VillageMasterInstance extends L2NpcInstance
 		return true;
 	}
 	
-	/*
+	/**
 	 * Returns true if this classId allowed for master
+	 * @param classId 
+	 * @return 
 	 */
 	public final boolean checkVillageMaster(int classId)
 	{
 		return checkVillageMaster(PlayerClass.values()[classId]);
 	}
 	
-	/*
+	/**
 	 * Returns true if this PlayerClass is allowed for master
+	 * @param pclass 
+	 * @return 
 	 */
 	public final boolean checkVillageMaster(PlayerClass pclass)
 	{
@@ -770,20 +782,6 @@ public class L2VillageMasterInstance extends L2NpcInstance
 		return checkVillageMasterRace(pclass) && checkVillageMasterTeachType(pclass);
 	}
 	
-	private static final String formatClassForDisplay(PlayerClass className)
-	{
-		String classNameStr = className.toString();
-		char[] charArray = classNameStr.toCharArray();
-		
-		for (int i = 1; i < charArray.length; i++)
-		{
-			if (Character.isUpperCase(charArray[i]))
-				classNameStr = classNameStr.substring(0, i) + " " + classNameStr.substring(i);
-		}
-		
-		return classNameStr;
-	}
-	
 	private static final Iterator<SubClass> iterSubClasses(L2PcInstance player)
 	{
 		return player.getSubClasses().values().iterator();

+ 189 - 88
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2PcTemplate.java

@@ -16,128 +16,229 @@ package com.l2jserver.gameserver.model.actor.templates;
 
 import java.util.List;
 
-import javolution.util.FastList;
-
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.base.ClassId;
 import com.l2jserver.gameserver.model.base.Race;
+import com.l2jserver.gameserver.model.items.PcItemTemplate;
 
 /**
- * @author mkizub
+ * @author mkizub, Zoey76
  */
 public class L2PcTemplate extends L2CharTemplate
 {
-	/** The Class object of the L2PcInstance */
-	public final ClassId classId;
+	private final ClassId _classId;
+	private final Race _race;
+	private final String _className;
+	
+	private final int _spawnX;
+	private final int _spawnY;
+	private final int _spawnZ;
 	
-	public final Race race;
-	public final String className;
+	private final int _classBaseLevel;
+	private final float _lvlHpAdd;
+	private final float _lvlHpMod;
+	private final float _lvlCpAdd;
+	private final float _lvlCpMod;
+	private final float _lvlMpAdd;
+	private final float _lvlMpMod;
 	
-	public final int spawnX;
-	public final int spawnY;
-	public final int spawnZ;
+	private final double _fCollisionHeightMale;
+	private final double _fCollisionRadiusMale;
 	
-	public final int classBaseLevel;
-	public final float lvlHpAdd;
-	public final float lvlHpMod;
-	public final float lvlCpAdd;
-	public final float lvlCpMod;
-	public final float lvlMpAdd;
-	public final float lvlMpMod;
+	private final double _fCollisionHeightFemale;
+	private final double _fCollisionRadiusFemale;
 	
-	public final double fCollisionHeight_female;
-	public final double fCollisionRadius_female;
+	private final int _fallHeight;
 	
-	private List<PcTemplateItem> _items = new FastList<PcTemplateItem>();
+	private final List<PcItemTemplate> _initialEquipment;
 	
-	public L2PcTemplate(StatsSet set)
+	public L2PcTemplate(StatsSet set, List<PcItemTemplate> initialEquipment)
 	{
 		super(set);
-		classId = ClassId.values()[set.getInteger("classId")];
-		race = Race.values()[set.getInteger("raceId")];
-		className = set.getString("className");
+		_classId = ClassId.getClassId(set.getInteger("classId"));
+		_race = Race.values()[set.getInteger("raceId")];
+		_className = set.getString("className");
+		
+		_spawnX = set.getInteger("spawnX");
+		_spawnY = set.getInteger("spawnY");
+		_spawnZ = set.getInteger("spawnZ");
 		
-		spawnX = set.getInteger("spawnX");
-		spawnY = set.getInteger("spawnY");
-		spawnZ = set.getInteger("spawnZ");
+		_classBaseLevel = set.getInteger("classBaseLevel");
+		_lvlHpAdd = set.getFloat("lvlHpAdd");
+		_lvlHpMod = set.getFloat("lvlHpMod");
+		_lvlCpAdd = set.getFloat("lvlCpAdd");
+		_lvlCpMod = set.getFloat("lvlCpMod");
+		_lvlMpAdd = set.getFloat("lvlMpAdd");
+		_lvlMpMod = set.getFloat("lvlMpMod");
 		
-		classBaseLevel = set.getInteger("classBaseLevel");
-		lvlHpAdd = set.getFloat("lvlHpAdd");
-		lvlHpMod = set.getFloat("lvlHpMod");
-		lvlCpAdd = set.getFloat("lvlCpAdd");
-		lvlCpMod = set.getFloat("lvlCpMod");
-		lvlMpAdd = set.getFloat("lvlMpAdd");
-		lvlMpMod = set.getFloat("lvlMpMod");
+		_fCollisionRadiusMale = set.getDouble("collision_radius");
+		_fCollisionHeightMale = set.getDouble("collision_height");
 		
-		fCollisionRadius_female = set.getDouble("collision_radius_female");
-		fCollisionHeight_female = set.getDouble("collision_height_female");
+		_fCollisionRadiusFemale = set.getDouble("collision_radius_female");
+		_fCollisionHeightFemale = set.getDouble("collision_height_female");
+		
+		_fallHeight = 333; // TODO: Unhardcode it.
+		
+		_initialEquipment = initialEquipment;
 	}
 	
 	/**
-	 * Adds starter equipment.
-	 * @param itemId
-	 * @param amount
-	 * @param equipped
+	 * @return the template class Id.
 	 */
-	public void addItem(int itemId, int amount, boolean equipped)
+	public ClassId getClassId()
 	{
-		_items.add(new PcTemplateItem(itemId, amount, equipped));
+		return _classId;
 	}
 	
 	/**
-	 *
-	 * @return itemIds of all the starter equipment
+	 * @return the template race.
 	 */
-	public List<PcTemplateItem> getItems()
+	public Race getRace()
 	{
-		return _items;
+		return _race;
 	}
 	
-	public static final class PcTemplateItem
+	/**
+	 * @return the template server side class name.
+	 */
+	public String getClassName()
 	{
-		private final int _itemId;
-		private final int _amount;
-		private final boolean _equipped;
-		
-		/**
-		 * @param amount
-		 * @param itemId
-		 * @param equipped 
-		 */
-		public PcTemplateItem(int itemId, int amount, boolean equipped)
-		{
-			_itemId = itemId;
-			_amount = amount;
-			_equipped = equipped;
-		}
-		
-		/**
-		 * @return Returns the itemId.
-		 */
-		public int getItemId()
-		{
-			return _itemId;
-		}
-		
-		/**
-		 * @return Returns the amount.
-		 */
-		public int getAmount()
-		{
-			return _amount;
-		}
-		
-		/**
-		 * @return Returns the if the item should be equipped after char creation.
-		 */
-		public boolean isEquipped()
-		{
-			return _equipped;
-		}
+		return _className;
+	}
+	
+	/**
+	 * @return the template X spawn coordinate.
+	 */
+	public int getSpawnX()
+	{
+		return _spawnX;
+	}
+	
+	/**
+	 * @return the template Y spawn coordinate.
+	 */
+	public int getSpawnY()
+	{
+		return _spawnY;
 	}
 	
-	public final int getFallHeight()
+	/**
+	 * @return the template Z spawn coordinate.
+	 */
+	public int getSpawnZ()
+	{
+		return _spawnZ;
+	}
+	
+	/**
+	 * @return the template class base level.
+	 */
+	public int getClassBaseLevel()
+	{
+		return _classBaseLevel;
+	}
+	
+	/**
+	 * @return the template level Hp add.
+	 */
+	public float getLvlHpAdd()
+	{
+		return _lvlHpAdd;
+	}
+	
+	/**
+	 * @return the template level Hp mod.
+	 */
+	public float getLvlHpMod()
+	{
+		return _lvlHpMod;
+	}
+	
+	/**
+	 * @return the template level Cp add.
+	 */
+	public float getLvlCpAdd()
+	{
+		return _lvlCpAdd;
+	}
+	
+	/**
+	 * @return the template level Cp mod.
+	 */
+	public float getLvlCpMod()
+	{
+		return _lvlCpMod;
+	}
+	
+	/**
+	 * @return the template level Mp add.
+	 */
+	public float getLvlMpAdd()
+	{
+		return _lvlMpAdd;
+	}
+	
+	/**
+	 * @return the template level Mp mod.
+	 */
+	public float getLvlMpMod()
+	{
+		return _lvlMpMod;
+	}
+	
+	/**
+	 * @return the template collision height for male characters.
+	 */
+	public double getFCollisionHeightMale()
+	{
+		return _fCollisionHeightMale;
+	}
+	
+	/**
+	 * @return the template collision radius for male characters.
+	 */
+	public double getFCollisionRadiusMale()
+	{
+		return _fCollisionRadiusMale;
+	}
+	
+	/**
+	 * @return the template collision height for female characters.
+	 */
+	public double getFCollisionHeightFemale()
+	{
+		return _fCollisionHeightFemale;
+	}
+	
+	/**
+	 * @return the template collision radius for female characters.
+	 */
+	public double getFCollisionRadiusFemale()
+	{
+		return _fCollisionRadiusFemale;
+	}
+	
+	/**
+	 * @return the fall height.
+	 */
+	public int getFallHeight()
+	{
+		return _fallHeight;
+	}
+	
+	/**
+	 * @return the initial equipment for this Pc template.
+	 */
+	public List<PcItemTemplate> getInitialEquipment()
+	{
+		return _initialEquipment;
+	}
+
+	/**
+	 * @return {@code true} if this Pc template has an initial equipment associated, {@code false} otherwise.
+	 */
+	public boolean hasInitialEquipment()
 	{
-		return 333; // TODO: unhardcode it
+		return _initialEquipment != null;
 	}
 }

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

@@ -21,10 +21,10 @@ package com.l2jserver.gameserver.model.base;
 public enum AcquireSkillType
 {
 	Class,
-	Transform,
 	Fishing,
 	Pledge,
 	SubPledge,
+	Transform,
 	Transfer,
 	SubClass,
 	Collect

+ 12 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/base/ClassId.java

@@ -318,4 +318,16 @@ public enum ClassId
 	{
 		return _parent;
 	}
+	
+	public static ClassId getClassId(int cId)
+	{
+		try
+		{
+			return ClassId.values()[cId];
+		}
+		catch (Exception e)
+		{
+			return null;
+		}
+	}
 }

+ 104 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/base/ClassInfo.java

@@ -0,0 +1,104 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.base;
+
+/**
+ * This class will hold the information of the player classes.
+ * @author Zoey76
+ */
+public final class ClassInfo
+{
+	private final ClassId _classId;
+	private final String _className;
+	private final String _classServName;
+	private final ClassId _parentClassId;
+	
+	/**
+	 * Constructor for ClassInfo.
+	 * @param classId the class Id.
+	 * @param className the in game class name.
+	 * @param classServName the server side class name.
+	 * @param parentClassId the parent class for the given {@code classId}.
+	 */
+	public ClassInfo(ClassId classId, String className, String classServName, ClassId parentClassId)
+	{
+		_classId = classId;
+		_className = className;
+		_classServName = classServName;
+		_parentClassId = parentClassId;
+	}
+	
+	/**
+	 * @return the class Id.
+	 */
+	public ClassId getClassId()
+	{
+		return _classId;
+	}
+	
+	/**
+	 * @param displayClientName if {@code true} the code to display the client side name will be returned, <b>HTMLs only</b>.
+	 * @return the in-game class name.
+	 */
+	public String getClassName(boolean displayClientName)
+	{
+		return displayClientName ? getClassClientCode() : _className;
+	}
+	
+	/**
+	 * @return the class client Id.
+	 */
+	private int getClassClientId()
+	{
+		int classClientId = _classId.getId();
+		if ((classClientId >= 0) && (classClientId <= 57))
+		{
+			classClientId += 247;
+		}
+		else if ((classClientId >= 88) && (classClientId <= 118))
+		{
+			classClientId += 1071;
+		}
+		else if ((classClientId >= 123) && (classClientId <= 136))
+		{
+			classClientId += 1438;
+		}
+		return classClientId;
+	}
+	
+	/**
+	 * @return the class client Id formatted to be displayed on a HTML.
+	 */
+	private String getClassClientCode()
+	{
+		return "&$" + getClassClientId() + ";";
+	}
+	
+	/**
+	 * @return the server side class name.
+	 */
+	public String getClassServName()
+	{
+		return _classServName;
+	}
+	
+	/**
+	 * @return the parent class Id.
+	 */
+	public ClassId getParentClassId()
+	{
+		return _parentClassId;
+	}
+}

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Hero.java

@@ -35,8 +35,8 @@ import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.gameserver.cache.HtmCache;
 import com.l2jserver.gameserver.datatables.CharNameTable;
-import com.l2jserver.gameserver.datatables.CharTemplateTable;
 import com.l2jserver.gameserver.datatables.ClanTable;
+import com.l2jserver.gameserver.datatables.ClassListData;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.model.L2Clan;
@@ -60,7 +60,7 @@ import com.l2jserver.util.StringUtil;
  */
 public class Hero
 {
-	private static Logger _log = Logger.getLogger(Hero.class.getName());
+	private static final Logger _log = Logger.getLogger(Hero.class.getName());
 	
 	private static final String GET_HEROES = "SELECT heroes.charId, " + "characters.char_name, heroes.class_id, heroes.count, heroes.played " + "FROM heroes, characters WHERE characters.charId = heroes.charId " + "AND heroes.played = 1";
 	private static final String GET_ALL_HEROES = "SELECT heroes.charId, " + "characters.char_name, heroes.class_id, heroes.count, heroes.played " + "FROM heroes, characters WHERE characters.charId = heroes.charId";
@@ -390,7 +390,7 @@ public class Hero
 				if (charId == charOneId)
 				{
 					String name = CharNameTable.getInstance().getNameById(charTwoId);
-					String cls = CharTemplateTable.getInstance().getClassNameById(charTwoClass);
+					String cls = ClassListData.getInstance().getClass(charTwoClass).getClassName(true);
 					if(name != null && cls != null)
 					{
 						StatsSet fight = new StatsSet();
@@ -426,7 +426,7 @@ public class Hero
 				else if (charId == charTwoId)
 				{
 					String name = CharNameTable.getInstance().getNameById(charOneId);
-					String cls = CharTemplateTable.getInstance().getClassNameById(charOneClass);
+					String cls = ClassListData.getInstance().getClass(charOneClass).getClassName(true);
 					if(name != null && cls != null)
 					{
 						StatsSet fight = new StatsSet();

+ 9 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java

@@ -452,12 +452,12 @@ public abstract class Inventory extends ItemContainer
 			if (chestItem == null)
 				return;
 			
-			// Checks for armorset for the equiped chest
-			L2ArmorSet armorSet = ArmorSetsTable.getInstance().getSet(chestItem.getItemId());
-			
-			if (armorSet == null)
+			// Checks for armor set for the equipped chest.
+			if (!ArmorSetsTable.getInstance().isArmorSet(chestItem.getItemId()))
+			{
 				return;
-			
+			}
+			final L2ArmorSet armorSet = ArmorSetsTable.getInstance().getSet(chestItem.getItemId());
 			boolean update = false;
 			boolean updateTimeStamp = false;
 			// Checks if equiped item is part of set
@@ -569,10 +569,11 @@ public abstract class Inventory extends ItemContainer
 			
 			if (slot == PAPERDOLL_CHEST)
 			{
-				L2ArmorSet armorSet = ArmorSetsTable.getInstance().getSet(item.getItemId());
-				if (armorSet == null)
+				if (!ArmorSetsTable.getInstance().isArmorSet(item.getItemId()))
+				{
 					return;
-				
+				}
+				final L2ArmorSet armorSet = ArmorSetsTable.getInstance().getSet(item.getItemId());
 				remove = true;
 				skills = armorSet.getSkills();
 				shieldSkill = armorSet.getShieldSkillId();

+ 115 - 52
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/L2Henna.java

@@ -14,114 +14,177 @@
  */
 package com.l2jserver.gameserver.model.items;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.base.ClassId;
 
 /**
- * This class ...
- *
- * @version $Revision$ $Date$
+ * Class for the Henna object.
+ * @author Zoey76
  */
 public class L2Henna
 {
-	private final int symbolId;
-	private final int dye;
-	private final int price;
-	private final int amount;
-	private final int statINT;
-	private final int statSTR;
-	private final int statCON;
-	private final int statMEM;
-	private final int statDEX;
-	private final int statWIT;
+	private final int _dyeId;
+	private final String _dyeName;
+	private final int _dyeItemId;
+	private final int _str;
+	private final int _con;
+	private final int _dex;
+	private final int _int;
+	private final int _men;
+	private final int _wit;
+	private final int _wear_fee;
+	private final int _wear_count;
+	private final int _cancel_fee;
+	private final int _cancel_count;
+	private final List<ClassId> _wear_class;
 	
 	public L2Henna(StatsSet set)
 	{
-		symbolId = set.getInteger("symbol_id");
-		dye = set.getInteger("dye");
-		price = set.getInteger("price");
-		amount = set.getInteger("amount");
-		statINT = set.getInteger("stat_INT");
-		statSTR = set.getInteger("stat_STR");
-		statCON = set.getInteger("stat_CON");
-		statMEM = set.getInteger("stat_MEM");
-		statDEX = set.getInteger("stat_DEX");
-		statWIT = set.getInteger("stat_WIT");
+		_dyeId = set.getInteger("dyeId");
+		_dyeName = set.getString("dyeName");
+		_dyeItemId = set.getInteger("dyeItemId");
+		_str = set.getInteger("str");
+		_con = set.getInteger("con");
+		_dex = set.getInteger("dex");
+		_int = set.getInteger("int");
+		_men = set.getInteger("men");
+		_wit = set.getInteger("wit");
+		_wear_fee = set.getInteger("wear_fee");
+		_wear_count = set.getInteger("wear_count");
+		_cancel_fee = set.getInteger("cancel_fee");
+		_cancel_count = set.getInteger("cancel_count");
+		_wear_class = new ArrayList<>();
 	}
 	
-	public int getSymbolId()
+	/**
+	 * @return the dye Id.
+	 */
+	public int getDyeId()
 	{
-		return symbolId;
+		return _dyeId;
 	}
 	
 	/**
-	 * @return
+	 * @return the dye server-side name.
 	 */
-	public int getDyeId()
+	public String getDyeName()
+	{
+		return _dyeName;
+	}
+	
+	/**
+	 * @return the item Id, required for this dye.
+	 */
+	public int getDyeItemId()
+	{
+		return _dyeItemId;
+	}
+	
+	/**
+	 * @return the STR stat.
+	 */
+	public int getStatSTR()
 	{
-		return dye;
+		return _str;
 	}
 	
 	/**
-	 * @return
+	 * @return the CON stat.
 	 */
-	public int getPrice()
+	public int getStatCON()
 	{
-		return price;
+		return _con;
 	}
 	
 	/**
-	 * @return
+	 * @return the DEX stat.
 	 */
-	public int getAmountDyeRequire()
+	public int getStatDEX()
 	{
-		return amount;
+		return _dex;
 	}
 	
 	/**
-	 * @return
+	 * @return the INT stat.
 	 */
 	public int getStatINT()
 	{
-		return statINT;
+		return _int;
 	}
 	
 	/**
-	 * @return
+	 * @return the MEN stat.
 	 */
-	public int getStatSTR()
+	public int getStatMEN()
 	{
-		return statSTR;
+		return _men;
 	}
 	
 	/**
-	 * @return
+	 * @return the WIT stat.
 	 */
-	public int getStatCON()
+	public int getStatWIT()
 	{
-		return statCON;
+		return _wit;
 	}
 	
 	/**
-	 * @return
+	 * @return the wear fee, cost for adding this dye to the player.
 	 */
-	public int getStatMEM()
+	public int getWearFee()
 	{
-		return statMEM;
+		return _wear_fee;
 	}
 	
 	/**
-	 * @return
+	 * @return the wear count, the required count to add this dye to the player.
 	 */
-	public int getStatDEX()
+	public int getWearCount()
 	{
-		return statDEX;
+		return _wear_count;
 	}
 	
 	/**
-	 * @return
+	 * @return the cancel fee, cost for removing this dye from the player.
 	 */
-	public int getStatWIT()
+	public int getCancelFee()
+	{
+		return _cancel_fee;
+	}
+	
+	/**
+	 * @return the cancel count, the retrieved amount of dye items after removing the dye.
+	 */
+	public int getCancelCount()
+	{
+		return _cancel_count;
+	}
+	
+	/**
+	 * @return the list with the allowed classes to wear this dye.
+	 */
+	public List<ClassId> getAllowedWearClass()
+	{
+		return _wear_class;
+	}
+	
+	/**
+	 * @param c the class trying to wear this dye.
+	 * @return {@code true} if the player is allowed to wear this dye, {@code false} otherwise.
+	 */
+	public boolean isAllowedClass(ClassId c)
+	{
+		return _wear_class.contains(c);
+	}
+	
+	/**
+	 * @param wearClassIds the list of classes that can wear this dye.
+	 */
+	public void setWearClassIds(List<ClassId> wearClassIds)
 	{
-		return statWIT;
+		_wear_class.addAll(wearClassIds);
 	}
-}
+}

+ 61 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/PcItemTemplate.java

@@ -0,0 +1,61 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.items;
+
+import com.l2jserver.gameserver.model.StatsSet;
+
+/**
+ * @author Zoey76
+ */
+public final class PcItemTemplate
+{
+	private final int _itemId;
+	private final long _count;
+	private final boolean _equipped;
+	
+	/**
+	 * @param set the set containing the values for this object.
+	 */
+	public PcItemTemplate(StatsSet set)
+	{
+		_itemId = set.getInteger("id");
+		_count = set.getInteger("count");
+		_equipped = set.getBool("equipped", false);
+	}
+	
+	/**
+	 * @return the item Id.
+	 */
+	public int getItemId()
+	{
+		return _itemId;
+	}
+	
+	/**
+	 * @return the item count.
+	 */
+	public long getCount()
+	{
+		return _count;
+	}
+	
+	/**
+	 * @return {@code true} if the items is equipped upon character creation, {@code false} otherwise.
+	 */
+	public boolean isEquipped()
+	{
+		return _equipped;
+	}
+}

+ 0 - 185
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/instance/L2HennaInstance.java

@@ -1,185 +0,0 @@
-/*
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version.
- * 
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- * 
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.model.items.instance;
-
-import com.l2jserver.gameserver.model.items.L2Henna;
-
-/**
- * This class represents a Non-Player-Character in the world. it can be
- * a monster or a friendly character.
- * it also uses a template to fetch some static values.
- * the templates are hardcoded in the client, so we can rely on them.
- *
- * @version $Revision$ $Date$
- */
-
-public class L2HennaInstance
-{
-	//private static Logger _log = Logger.getLogger(L2HennaInstance.class.getName());
-	
-	private L2Henna _template;
-	private int _symbolId;
-	private int _itemIdDye;
-	private int _price;
-	private int _statINT;
-	private int _statSTR;
-	private int _statCON;
-	private int _statMEM;
-	private int _statDEX;
-	private int _statWIT;
-	private int _amountDyeRequire;
-	
-	public L2HennaInstance(L2Henna template)
-	{
-		_template = template;
-		_symbolId = _template.getSymbolId();
-		_itemIdDye = _template.getDyeId();
-		_amountDyeRequire = _template.getAmountDyeRequire();
-		_price = _template.getPrice();
-		_statINT = _template.getStatINT();
-		_statSTR = _template.getStatSTR();
-		_statCON = _template.getStatCON();
-		_statMEM = _template.getStatMEM();
-		_statDEX = _template.getStatDEX();
-		_statWIT = _template.getStatWIT();
-	}
-	
-	public String getName(){
-		String res = "";
-		if (_statINT>0)res = res + "INT +"+_statINT;
-		else if (_statSTR>0)res = res + "STR +"+_statSTR;
-		else if (_statCON>0)res = res + "CON +"+_statCON;
-		else if (_statMEM>0)res = res + "MEN +"+_statMEM;
-		else if (_statDEX>0)res = res + "DEX +"+_statDEX;
-		else if (_statWIT>0)res = res + "WIT +"+_statWIT;
-		
-		if (_statINT<0)res = res + ", INT "+_statINT;
-		else if (_statSTR<0)res = res + ", STR "+_statSTR;
-		else if (_statCON<0)res = res + ", CON "+_statCON;
-		else if (_statMEM<0)res = res + ", MEN "+_statMEM;
-		else if (_statDEX<0)res = res + ", DEX "+_statDEX;
-		else if (_statWIT<0)res = res + ", WIT "+_statWIT;
-		
-		return res;
-	}
-	
-	public L2Henna getTemplate()
-	{
-		return _template;
-	}
-	
-	
-	public int getSymbolId()
-	{
-		return _symbolId;
-	}
-	
-	public void setSymbolId(int SymbolId)
-	{
-		_symbolId = SymbolId;
-	}
-	
-	public int getItemIdDye()
-	{
-		return _itemIdDye;
-	}
-	
-	public void setItemIdDye(int ItemIdDye)
-	{
-		_itemIdDye = ItemIdDye;
-	}
-	
-	
-	public int getAmountDyeRequire()
-	{
-		return _amountDyeRequire;
-	}
-	
-	public void setAmountDyeRequire(int AmountDyeRequire)
-	{
-		_amountDyeRequire = AmountDyeRequire;
-	}
-	
-	public int getPrice()
-	{
-		return _price;
-	}
-	
-	public void setPrice(int Price)
-	{
-		_price = Price;
-	}
-	
-	
-	public int getStatINT()
-	{
-		return _statINT;
-	}
-	
-	public void setStatINT(int StatINT)
-	{
-		_statINT = StatINT;
-	}
-	
-	public int getStatSTR()
-	{
-		return _statSTR;
-	}
-	
-	public void setStatSTR(int StatSTR)
-	{
-		_statSTR = StatSTR;
-	}
-	
-	public int getStatCON()
-	{
-		return _statCON;
-	}
-	
-	public void setStatCON(int StatCON)
-	{
-		_statCON = StatCON;
-	}
-	
-	public int getStatMEM()
-	{
-		return _statMEM;
-	}
-	
-	public void setStatMEM(int StatMEM)
-	{
-		_statMEM = StatMEM;
-	}
-	
-	public int getStatDEX()
-	{
-		return _statDEX;
-	}
-	
-	public void setStatDEX(int StatDEX)
-	{
-		_statDEX = StatDEX;
-	}
-	
-	public int getStatWIT()
-	{
-		return _statWIT;
-	}
-	
-	public void setStatWIT(int StatWIT)
-	{
-		_statWIT = StatWIT;
-	}
-}

+ 13 - 13
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Formulas.java

@@ -846,10 +846,10 @@ public final class Formulas
 		public void calc(Env env)
 		{
 			L2PcTemplate t = (L2PcTemplate) env.getCharacter().getTemplate();
-			int lvl = env.getCharacter().getLevel() - t.classBaseLevel;
-			double hpmod = t.lvlHpMod * lvl;
-			double hpmax = (t.lvlHpAdd + hpmod) * lvl;
-			double hpmin = (t.lvlHpAdd * lvl) + hpmod;
+			int lvl = env.getCharacter().getLevel() - t.getClassBaseLevel();
+			double hpmod = t.getLvlHpMod() * lvl;
+			double hpmax = (t.getLvlHpAdd() + hpmod) * lvl;
+			double hpmin = (t.getLvlHpAdd() * lvl) + hpmod;
 			env.addValue((hpmax + hpmin) / 2);
 		}
 	}
@@ -893,10 +893,10 @@ public final class Formulas
 		public void calc(Env env)
 		{
 			L2PcTemplate t = (L2PcTemplate) env.getCharacter().getTemplate();
-			int lvl = env.getCharacter().getLevel() - t.classBaseLevel;
-			double cpmod = t.lvlCpMod * lvl;
-			double cpmax = (t.lvlCpAdd + cpmod) * lvl;
-			double cpmin = (t.lvlCpAdd * lvl) + cpmod;
+			int lvl = env.getCharacter().getLevel() - t.getClassBaseLevel();
+			double cpmod = t.getLvlCpMod() * lvl;
+			double cpmax = (t.getLvlCpAdd() + cpmod) * lvl;
+			double cpmin = (t.getLvlCpAdd() * lvl) + cpmod;
 			env.addValue((cpmax + cpmin) / 2);
 		}
 	}
@@ -940,10 +940,10 @@ public final class Formulas
 		public void calc(Env env)
 		{
 			L2PcTemplate t = (L2PcTemplate) env.getCharacter().getTemplate();
-			int lvl = env.getCharacter().getLevel() - t.classBaseLevel;
-			double mpmod = t.lvlMpMod * lvl;
-			double mpmax = (t.lvlMpAdd + mpmod) * lvl;
-			double mpmin = (t.lvlMpAdd * lvl) + mpmod;
+			int lvl = env.getCharacter().getLevel() - t.getClassBaseLevel();
+			double mpmod = t.getLvlMpMod() * lvl;
+			double mpmax = (t.getLvlMpAdd() + mpmod) * lvl;
+			double mpmin = (t.getLvlMpAdd() * lvl) + mpmod;
 			env.addValue((mpmax + mpmin) / 2);
 		}
 	}
@@ -985,7 +985,7 @@ public final class Formulas
 	}
 	
 	/**
-	 * Return the standard NPC Calculator set containing ACCURACY_COMBAT and EVASION_RATE.
+	 * Return the standard NPC Calculator set containing ACCURACY_COMBAT and EVASION_RATE.<br>
 	 * <B><U>Concept</U>:</B><br>
 	 * A calculator is created to manage and dynamically calculate the effect of a character property (ex : MAX_HP, REGENERATE_HP_RATE...). In fact, each calculator is a table of Func object in which each Func represents a mathematic function : <br>
 	 * FuncAtkAccuracy -> Math.sqrt(_player.getDEX())*6+_player.getLevel()<br>

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java

@@ -646,11 +646,11 @@ public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>,
 					case 0xc2:
 						// Unused (RequestEvaluate/VoteSociality)
 						break;
-					case 0xc3: // RequestHennaItemList
-						msg = new RequestHennaDrawList();
+					case 0xc3:
+						msg = new RequestHennaItemList();
 						break;
 					case 0xc4:
-						msg = new RequestHennaItemDrawInfo();
+						msg = new RequestHennaItemInfo();
 						break;
 					case 0xc5:
 						msg = new RequestBuySeed();

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

@@ -24,7 +24,6 @@ import com.l2jserver.gameserver.network.communityserver.writepackets.WorldInfo;
 public final class AllyLeave extends L2GameClientPacket
 {
 	private static final String _C__8E_ALLYLEAVE = "[C] 8E AllyLeave";
-	//private static Logger _log = Logger.getLogger(AllyLeave.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -29,7 +29,6 @@ import com.l2jserver.gameserver.network.serverpackets.TradeDone;
 public final class AnswerTradeRequest extends L2GameClientPacket
 {
 	private static final String _C__55_ANSWERTRADEREQUEST = "[C] 55 AnswerTradeRequest";
-	//private static Logger _log = Logger.getLogger(AnswerTradeRequest.class.getName());
 	
 	private int _response;
 	

+ 75 - 43
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java

@@ -34,7 +34,7 @@ import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.stat.PcStat;
 import com.l2jserver.gameserver.model.actor.templates.L2PcTemplate;
-import com.l2jserver.gameserver.model.actor.templates.L2PcTemplate.PcTemplateItem;
+import com.l2jserver.gameserver.model.items.PcItemTemplate;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestState;
@@ -91,17 +91,19 @@ public final class CharacterCreate extends L2GameClientPacket
 		if ((_name.length() < 1) || (_name.length() > 16))
 		{
 			if (Config.DEBUG)
+			{
 				_log.fine("Character Creation Failure: Character name " + _name + " is invalid. Message generated: Your title cannot exceed 16 characters in length. Please try again.");
+			}
 			
 			sendPacket(new CharCreateFail(CharCreateFail.REASON_16_ENG_CHARS));
 			return;
 		}
 		
-		if(Config.FORBIDDEN_NAMES.length > 1)
+		if (Config.FORBIDDEN_NAMES.length > 1)
 		{
-			for(String st : Config.FORBIDDEN_NAMES)
+			for (String st : Config.FORBIDDEN_NAMES)
 			{
-				if(_name.toLowerCase().contains(st.toLowerCase()))
+				if (_name.toLowerCase().contains(st.toLowerCase()))
 				{
 					sendPacket(new CharCreateFail(CharCreateFail.REASON_INCORRECT_NAME));
 					return;
@@ -113,31 +115,33 @@ public final class CharacterCreate extends L2GameClientPacket
 		if (!Util.isAlphaNumeric(_name) || !isValidName(_name))
 		{
 			if (Config.DEBUG)
+			{
 				_log.fine("Character Creation Failure: Character name " + _name + " is invalid. Message generated: Incorrect name. Please try again.");
+			}
 			
 			sendPacket(new CharCreateFail(CharCreateFail.REASON_INCORRECT_NAME));
 			return;
 		}
 		
-		if (_face > 2 || _face < 0)
+		if ((_face > 2) || (_face < 0))
 		{
-			_log.warning("Character Creation Failure: Character face " + _face + " is invalid. Possible client hack. "+getClient());
+			_log.warning("Character Creation Failure: Character face " + _face + " is invalid. Possible client hack. " + getClient());
 			
 			sendPacket(new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED));
 			return;
 		}
 		
-		if (_hairStyle < 0 || (_sex == 0 && _hairStyle > 4) || (_sex != 0 && _hairStyle > 6))
+		if ((_hairStyle < 0) || ((_sex == 0) && (_hairStyle > 4)) || ((_sex != 0) && (_hairStyle > 6)))
 		{
-			_log.warning("Character Creation Failure: Character hair style " + _hairStyle + " is invalid. Possible client hack. "+getClient());
+			_log.warning("Character Creation Failure: Character hair style " + _hairStyle + " is invalid. Possible client hack. " + getClient());
 			
 			sendPacket(new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED));
 			return;
 		}
 		
-		if (_hairColor > 3 || _hairColor < 0)
+		if ((_hairColor > 3) || (_hairColor < 0))
 		{
-			_log.warning("Character Creation Failure: Character hair color " + _hairColor + " is invalid. Possible client hack. "+getClient());
+			_log.warning("Character Creation Failure: Character hair color " + _hairColor + " is invalid. Possible client hack. " + getClient());
 			
 			sendPacket(new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED));
 			return;
@@ -151,10 +155,12 @@ public final class CharacterCreate extends L2GameClientPacket
 		 */
 		synchronized (CharNameTable.getInstance())
 		{
-			if (CharNameTable.getInstance().accountCharNumber(getClient().getAccountName()) >= Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT && Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT != 0)
+			if ((CharNameTable.getInstance().accountCharNumber(getClient().getAccountName()) >= Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT) && (Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT != 0))
 			{
 				if (Config.DEBUG)
+				{
 					_log.fine("Max number of characters reached. Creation failed.");
+				}
 				
 				sendPacket(new CharCreateFail(CharCreateFail.REASON_TOO_MANY_CHARACTERS));
 				return;
@@ -162,7 +168,9 @@ public final class CharacterCreate extends L2GameClientPacket
 			else if (CharNameTable.getInstance().doesCharNameExist(_name))
 			{
 				if (Config.DEBUG)
+				{
 					_log.fine("Character Creation Failure: Message generated: You cannot create another character. Please delete the existing character and try again.");
+				}
 				
 				sendPacket(new CharCreateFail(CharCreateFail.REASON_NAME_ALREADY_EXISTS));
 				return;
@@ -170,10 +178,12 @@ public final class CharacterCreate extends L2GameClientPacket
 			
 			template = CharTemplateTable.getInstance().getTemplate(_classId);
 			
-			if (template == null || template.classBaseLevel > 1)
+			if ((template == null) || (template.getClassBaseLevel() > 1))
 			{
 				if (Config.DEBUG)
+				{
 					_log.fine("Character Creation Failure: " + _name + " classId: " + _classId + " Template: " + template + " Message generated: Your character creation has failed.");
+				}
 				
 				sendPacket(new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED));
 				return;
@@ -186,7 +196,7 @@ public final class CharacterCreate extends L2GameClientPacket
 		newChar.setCurrentHp(template.getBaseHpMax());
 		newChar.setCurrentCp(template.getBaseCpMax());
 		newChar.setCurrentMp(template.getBaseMpMax());
-		//newChar.setMaxLoad(template.getBaseLoad());
+		// newChar.setMaxLoad(template.getBaseLoad());
 		
 		CharCreateOk cco = new CharCreateOk();
 		sendPacket(cco);
@@ -194,7 +204,11 @@ public final class CharacterCreate extends L2GameClientPacket
 		initNewChar(getClient(), newChar);
 		
 		LogRecord record = new LogRecord(Level.INFO, "Created new character");
-		record.setParameters(new Object[]{newChar, this.getClient()});
+		record.setParameters(new Object[]
+		{
+			newChar,
+			getClient()
+		});
 		_logAccounting.log(record);
 	}
 	
@@ -223,23 +237,29 @@ public final class CharacterCreate extends L2GameClientPacket
 	private void initNewChar(L2GameClient client, L2PcInstance newChar)
 	{
 		if (Config.DEBUG)
+		{
 			_log.fine("Character init start");
+		}
 		
 		L2World.getInstance().storeObject(newChar);
 		
-		L2PcTemplate template = newChar.getTemplate();
-		
-		newChar.addAdena("Init", Config.STARTING_ADENA, null, false);
+		if (Config.STARTING_ADENA > 0)
+		{
+			newChar.addAdena("Init", Config.STARTING_ADENA, null, false);
+		}
 		
-		newChar.setXYZInvisible(template.spawnX, template.spawnY, template.spawnZ);
+		// TODO: Make it random.
+		final L2PcTemplate template = newChar.getTemplate();
+		newChar.setXYZInvisible(template.getSpawnX(), template.getSpawnY(), template.getSpawnZ());
 		newChar.setTitle("");
 		
 		if (Config.ENABLE_VITALITY)
+		{
 			newChar.setVitalityPoints(Math.min(Config.STARTING_VITALITY_POINTS, PcStat.MAX_VITALITY_POINTS), true);
-		
+		}
 		if (Config.STARTING_LEVEL > 1)
 		{
-			newChar.getStat().addLevel((byte)(Config.STARTING_LEVEL - 1));
+			newChar.getStat().addLevel((byte) (Config.STARTING_LEVEL - 1));
 		}
 		if (Config.STARTING_SP > 0)
 		{
@@ -257,33 +277,36 @@ public final class CharacterCreate extends L2GameClientPacket
 		shortcut = new L2ShortCut(10, 0, 3, 0, 0, 1);
 		newChar.registerShortCut(shortcut);
 		
-		for (PcTemplateItem ia : template.getItems())
+		if (template.hasInitialEquipment())
 		{
-			L2ItemInstance item = newChar.getInventory().addItem("Init", ia.getItemId(), ia.getAmount(), newChar, null);
-			
-			if (item == null)
-			{
-				_log.warning("Could not create item during char creation: itemId " + ia.getItemId() + ", amount " + ia.getAmount() + ".");
-				continue;
-			}
-			
-			// add tutbook shortcut
-			if (item.getItemId() == 5588)
+			L2ItemInstance item;
+			for (PcItemTemplate ie : template.getInitialEquipment())
 			{
-				shortcut = new L2ShortCut(11, 0, 1, item.getObjectId(), 0, 1);
-				newChar.registerShortCut(shortcut);
-			}
-			
-			if (item.isEquipable() && ia.isEquipped())
-			{
-				newChar.getInventory().equipItem(item);
+				item = newChar.getInventory().addItem("Init", ie.getItemId(), ie.getCount(), newChar, null);
+				if (item == null)
+				{
+					_log.warning("Could not create item during char creation: itemId " + ie.getItemId() + ", amount " + ie.getCount() + ".");
+					continue;
+				}
+				
+				// Place Tutorial Guide shortcut.
+				if (item.getItemId() == 5588)
+				{
+					shortcut = new L2ShortCut(11, 0, 1, item.getObjectId(), 0, 1);
+					newChar.registerShortCut(shortcut);
+				}
+				
+				if (item.isEquipable() && ie.isEquipped())
+				{
+					newChar.getInventory().equipItem(item);
+				}
 			}
 		}
 		
 		for (L2SkillLearn skill : SkillTreesData.getInstance().getAvailableSkills(newChar, newChar.getClassId(), false, true))
 		{
 			newChar.addSkill(SkillTable.getInstance().getInfo(skill.getSkillId(), skill.getSkillLevel()), true);
-			if (skill.getSkillId() == 1001 || skill.getSkillId() == 1177)
+			if ((skill.getSkillId() == 1001) || (skill.getSkillId() == 1177))
 			{
 				shortcut = new L2ShortCut(1, 0, 2, skill.getSkillId(), skill.getSkillLevel(), 1);
 				newChar.registerShortCut(shortcut);
@@ -294,31 +317,40 @@ public final class CharacterCreate extends L2GameClientPacket
 				newChar.registerShortCut(shortcut);
 			}
 			if (Config.DEBUG)
+			{
 				_log.fine("Adding starter skill:" + skill.getSkillId() + " / " + skill.getSkillLevel());
+			}
 		}
 		
 		if (!Config.DISABLE_TUTORIAL)
+		{
 			startTutorialQuest(newChar);
-		
+		}
 		newChar.setOnlineStatus(true, false);
 		newChar.deleteMe();
 		
-		CharSelectionInfo cl = new CharSelectionInfo(client.getAccountName(), client.getSessionId().playOkID1);
+		final CharSelectionInfo cl = new CharSelectionInfo(client.getAccountName(), client.getSessionId().playOkID1);
 		client.getConnection().sendPacket(cl);
 		client.setCharSelection(cl.getCharInfo());
 		
 		if (Config.DEBUG)
+		{
 			_log.fine("Character init end");
+		}
 	}
 	
 	public void startTutorialQuest(L2PcInstance player)
 	{
-		QuestState qs = player.getQuestState("255_Tutorial");
+		final QuestState qs = player.getQuestState("255_Tutorial");
 		Quest q = null;
 		if (qs == null)
+		{
 			q = QuestManager.getInstance().getQuest("255_Tutorial");
+		}
 		if (q != null)
+		{
 			q.newQuestState(player).setState(State.STARTED);
+		}
 	}
 	
 	@Override
@@ -326,4 +358,4 @@ public final class CharacterCreate extends L2GameClientPacket
 	{
 		return _C__0C_CHARACTERCREATE;
 	}
-}
+}

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

@@ -24,7 +24,6 @@ import com.l2jserver.gameserver.network.serverpackets.CharSelectionInfo;
 public final class CharacterRestore extends L2GameClientPacket
 {
 	private static final String _C__7B_CHARACTERRESTORE = "[C] 7B CharacterRestore";
-	//private static Logger _log = Logger.getLogger(CharacterRestore.class.getName());
 	
 	// cd
 	private int _charSlot;

+ 0 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/DummyPacket.java

@@ -20,8 +20,6 @@ package com.l2jserver.gameserver.network.clientpackets;
  */
 public final class DummyPacket extends L2GameClientPacket
 {
-	//private static Logger _log = Logger.getLogger(DummyPacket.class.getName());
-	
 	@Override
 	protected void readImpl()
 	{

+ 17 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/L2GameClientPacket.java

@@ -23,6 +23,7 @@ import org.mmocore.network.ReceivablePacket;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.L2GameClient;
+import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
 
 /**
@@ -103,4 +104,20 @@ public abstract class L2GameClientPacket extends ReceivablePacket<L2GameClient>
 	{
 		return true;
 	}
+	
+	/**
+	 * @return the active player if exist, otherwise null.
+	 */
+	protected final L2PcInstance getActiveChar()
+	{
+		return getClient().getActiveChar();
+	}
+	
+	protected final void sendActionFailed()
+	{
+		if (getClient() != null)
+		{
+			getClient().sendPacket(ActionFailed.STATIC_PACKET);
+		}
+	}
 }

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

@@ -34,7 +34,7 @@ import com.l2jserver.gameserver.util.Util;
 public class MoveBackwardToLocation extends L2GameClientPacket
 {
 	private static final String _C__0F_MOVEBACKWARDTOLOC = "[C] 0F MoveBackwardToLoc";
-	//private static Logger _log = Logger.getLogger(MoveBackwardToLocation.class.getName());
+	
 	// cdddddd
 	private int _targetX;
 	private int _targetY;

+ 18 - 44
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/NewCharacter.java

@@ -16,14 +16,11 @@ package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.CharTemplateTable;
-import com.l2jserver.gameserver.model.actor.templates.L2PcTemplate;
 import com.l2jserver.gameserver.model.base.ClassId;
 import com.l2jserver.gameserver.network.serverpackets.NewCharacterSuccess;
 
 /**
- * This class ...
- *
- * @version $Revision: 1.3.4.5 $ $Date: 2005/03/27 15:29:30 $
+ * @author Zoey76
  */
 public final class NewCharacter extends L2GameClientPacket
 {
@@ -38,46 +35,23 @@ public final class NewCharacter extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		if (Config.DEBUG) _log.fine("CreateNewChar");
-		
-		NewCharacterSuccess ct = new NewCharacterSuccess();
-		
-		L2PcTemplate template = CharTemplateTable.getInstance().getTemplate(0);
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.fighter);	// human fighter
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.mage);	// human mage
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.elvenFighter);	// elf fighter
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.elvenMage);	// elf mage
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.darkFighter);	// dark elf fighter
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.darkMage);	// dark elf mage
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.orcFighter);	// orc fighter
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.orcMage);	// orc mage
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.dwarvenFighter);	// dwarf fighter
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.maleSoldier); //kamael male soldier
-		ct.addChar(template);
-		
-		template = CharTemplateTable.getInstance().getTemplate(ClassId.femaleSoldier); // kamael female soldier
-		ct.addChar(template);
-		
+		if (Config.DEBUG)
+		{
+			_log.fine(_C__13_NEWCHARACTER);
+		}
+		
+		final NewCharacterSuccess ct = new NewCharacterSuccess();
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.fighter)); // Human Figther
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.mage)); // Human Mystic
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.elvenFighter)); // Elven Fighter
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.elvenMage)); // Elven Mystic
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.darkFighter)); // Dark Fighter
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.darkMage)); // Dark Mystic
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.orcFighter)); // Orc Fighter
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.orcMage)); // Orc Mystic
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.dwarvenFighter)); // Dwarf Fighter
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.maleSoldier)); // Male Kamael Soldier
+		ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.femaleSoldier)); // Female Kamael Soldier
 		sendPacket(ct);
 	}
 	

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

@@ -24,7 +24,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 public final class ObserverReturn extends L2GameClientPacket
 {
 	private static final String __C__C1_OBSERVERRETURN = "[C] C1 ObserverReturn";
-	//private static Logger _log = Logger.getLogger(Action.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -24,7 +24,6 @@ import com.l2jserver.gameserver.network.communityserver.writepackets.WorldInfo;
 public final class RequestAnswerJoinAlly extends L2GameClientPacket
 {
 	private static final String _C__8D_REQUESTANSWERJOINALLY = "[C] 8D RequestAnswerJoinAlly";
-	//private static Logger _log = Logger.getLogger(RequestAnswerJoinAlly.class.getName());
 	
 	private int _response;
 	

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

@@ -26,7 +26,6 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 public final class RequestAnswerJoinParty extends L2GameClientPacket
 {
 	private static final String _C__43_REQUESTANSWERPARTY = "[C] 43 RequestAnswerJoinParty";
-	//private static Logger _log = Logger.getLogger(RequestAnswerJoinParty.class.getName());
 	
 	private int _response;
 	

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

@@ -24,7 +24,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 public final class RequestChangePartyLeader extends L2GameClientPacket{
 	
 	private static final String _C__D0_0C_REQUESTCHANGEPARTYLEADER = "[C] D0:0C RequestChangePartyLeader";
-	//private static Logger _log = Logger.getLogger(RequestJoinParty.class.getName());
 	
 	private String _name;
 	

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

@@ -29,7 +29,6 @@ import com.l2jserver.gameserver.network.serverpackets.SiegeDefenderList;
 public final class RequestConfirmSiegeWaitingList extends L2GameClientPacket
 {
 	private static final String _C__AE_RequestConfirmSiegeWaitingList = "[C] AE RequestConfirmSiegeWaitingList";
-	//private static Logger _log = Logger.getLogger(RequestConfirmSiegeWaitingList.class.getName());
 	
 	private int _approved;
 	private int _castleId;

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

@@ -25,7 +25,6 @@ import com.l2jserver.gameserver.network.SystemMessageId;
 public final class RequestDismissAlly extends L2GameClientPacket
 {
 	private static final String _C__90_REQUESTDISMISSALLY = "[C] 90 RequestDismissAlly";
-	//static Logger _log = Logger.getLogger(RequestDismissAlly.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -25,7 +25,6 @@ import com.l2jserver.gameserver.network.serverpackets.Ex2ndPasswordCheck;
 public class RequestEx2ndPasswordCheck extends L2GameClientPacket
 {
 	private static final String _C__D0_AD_REQUESTEX2NDPASSWORDCHECK = "[C] D0:AD RequestEx2ndPasswordCheck";
-	//private static Logger _log = Logger.getLogger(RequestEx2ndPasswordCheck.class.getName());
 	
 	@Override
 	protected void readImpl()

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordReq.java

@@ -29,9 +29,9 @@ import com.l2jserver.gameserver.security.SecondaryPasswordAuth;
 public class RequestEx2ndPasswordReq extends L2GameClientPacket
 {
 	private static final String _C__D0_AF_REQUESTEX2NDPASSWORDREQ = "[C] D0:AF RequestEx2ndPasswordReq";
-	//private static Logger _log = Logger.getLogger(RequestEx2ndPasswordReq.class.getName());
-	int _changePass;
-	String _password, _newPassword;
+	
+	private int _changePass;
+	private String _password, _newPassword;
 	
 	@Override
 	protected void readImpl()

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

@@ -26,8 +26,7 @@ public class RequestEx2ndPasswordVerify extends L2GameClientPacket
 {
 	private static final String _C__D0_AE_REQUESTEX2NDPASSWORDVERIFY = "[C] D0:AE RequestEx2ndPasswordVerify";
 	
-	//private static Logger _log = Logger.getLogger(RequestEx2ndPasswordVerify.class.getName());
-	String _password;
+	private String _password;
 	
 	@Override
 	protected void readImpl()

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

@@ -25,7 +25,6 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  */
 public final class RequestExOustFromMPCC extends L2GameClientPacket
 {
-	//private static Logger _log = Logger.getLogger(RequestExOustFromMPCC.class.getName());
 	private static final String _C__D0_08_REQUESTEXOUSTFROMMPCC = "[C] D0:08 RequestExOustFromMPCC";
 	private String _name;
 	

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

@@ -29,7 +29,6 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 public final class RequestFriendInvite extends L2GameClientPacket
 {
 	private static final String _C__77_REQUESTFRIENDINVITE = "[C] 77 RequestFriendInvite";
-	//private static Logger _log = Logger.getLogger(RequestFriendInvite.class.getName());
 	
 	private String _name;
 	

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

@@ -27,7 +27,6 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  */
 public final class RequestFriendList extends L2GameClientPacket
 {
-	//private static Logger _log = Logger.getLogger(RequestFriendList.class.getName());
 	private static final String _C__79_REQUESTFRIENDLIST = "[C] 79 RequestFriendList";
 	
 	@Override

+ 25 - 45
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaEquip.java

@@ -15,19 +15,15 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.HennaTable;
-import com.l2jserver.gameserver.datatables.HennaTreeTable;
+import com.l2jserver.gameserver.datatables.HennaData;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.items.L2Henna;
-import com.l2jserver.gameserver.model.items.instance.L2HennaInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
 import com.l2jserver.gameserver.util.Util;
 
 /**
- * This class ...
- *
- * @version $Revision$ $Date$
+ * @author Zoey76
  */
 public final class RequestHennaEquip extends L2GameClientPacket
 {
@@ -43,66 +39,50 @@ public final class RequestHennaEquip extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance activeChar = getClient().getActiveChar();
+		final L2PcInstance activeChar = getActiveChar();
 		if (activeChar == null)
+		{
 			return;
+		}
 		
 		if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("HennaEquip"))
-			return;
-		
-		L2Henna template = HennaTable.getInstance().getTemplate(_symbolId);
-		if (template == null)
-			return;
-		
-		L2HennaInstance henna = new L2HennaInstance(template);
-		long _count = 0;
-		
-		/**
-		 *  Prevents henna drawing exploit:
-		 * 1) talk to L2SymbolMakerInstance
-		 * 2) RequestHennaList
-		 * 3) Don't close the window and go to a GrandMaster and change your subclass
-		 * 4) Get SymbolMaker range again and press draw
-		 * You could draw any kind of henna just having the required subclass...
-		 */
-		boolean cheater = true;
-		for (L2HennaInstance h : HennaTreeTable.getInstance().getAvailableHenna(activeChar.getClassId()))
-		{
-			if (h.getSymbolId() == henna.getSymbolId())
-			{
-				cheater = false;
-				break;
-			}
-		}
-		try
 		{
-			_count = activeChar.getInventory().getItemByItemId(henna.getItemIdDye()).getCount();
+			return;
 		}
-		catch(Exception e){}
 		
 		if (activeChar.getHennaEmptySlots() == 0)
 		{
 			activeChar.sendPacket(SystemMessageId.SYMBOLS_FULL);
+			sendActionFailed();
 			return;
 		}
 		
-		if (!cheater && (_count >= henna.getAmountDyeRequire()) && (activeChar.getAdena() >= henna.getPrice()) && activeChar.addHenna(henna))
+		final L2Henna henna = HennaData.getInstance().getHenna(_symbolId);
+		if (henna == null)
 		{
-			activeChar.destroyItemByItemId("Henna", henna.getItemIdDye(), henna.getAmountDyeRequire(), activeChar, true);
-			
-			activeChar.getInventory().reduceAdena("Henna", henna.getPrice(), activeChar, activeChar.getLastFolkNPC());
-			
-			InventoryUpdate iu = new InventoryUpdate();
+			_log.warning(getClass().getName() + ": Invalid Henna Id: " + _symbolId + " from player " + activeChar);
+			sendActionFailed();
+			return;
+		}
+		
+		final long _count = activeChar.getInventory().getInventoryItemCount(henna.getDyeItemId(), -1);
+		if (henna.isAllowedClass(activeChar.getClassId()) && (_count >= henna.getWearCount()) && (activeChar.getAdena() >= henna.getWearFee()) && activeChar.addHenna(henna))
+		{
+			activeChar.destroyItemByItemId("Henna", henna.getDyeItemId(), henna.getWearCount(), activeChar, true);
+			activeChar.getInventory().reduceAdena("Henna", henna.getWearFee(), activeChar, activeChar.getLastFolkNPC());
+			final InventoryUpdate iu = new InventoryUpdate();
 			iu.addModifiedItem(activeChar.getInventory().getAdenaInstance());
 			activeChar.sendPacket(iu);
-			
 			activeChar.sendPacket(SystemMessageId.SYMBOL_ADDED);
 		}
 		else
 		{
 			activeChar.sendPacket(SystemMessageId.CANT_DRAW_SYMBOL);
-			if ((!activeChar.isGM()) && (cheater))
-				Util.handleIllegalPlayerAction(activeChar,"Exploit attempt: Character "+activeChar.getName()+" of account "+activeChar.getAccountName()+" tryed to add a forbidden henna.",Config.DEFAULT_PUNISH);
+			if (!activeChar.isGM() && !henna.isAllowedClass(activeChar.getClassId()))
+			{
+				Util.handleIllegalPlayerAction(activeChar, "Exploit attempt: Character " + activeChar.getName() + " of account " + activeChar.getAccountName() + " tryed to add a forbidden henna.", Config.DEFAULT_PUNISH);
+			}
+			sendActionFailed();
 		}
 	}
 	

+ 17 - 14
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemDrawInfo.java → L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemInfo.java

@@ -14,23 +14,19 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import com.l2jserver.gameserver.datatables.HennaTable;
+import com.l2jserver.gameserver.datatables.HennaData;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.items.L2Henna;
-import com.l2jserver.gameserver.model.items.instance.L2HennaInstance;
 import com.l2jserver.gameserver.network.serverpackets.HennaItemDrawInfo;
 
 /**
- * This class ...
- *
- * @version $Revision$ $Date$
+ * @author Zoey76
  */
-public final class RequestHennaItemDrawInfo extends L2GameClientPacket
+public final class RequestHennaItemInfo extends L2GameClientPacket
 {
-	private static final String _C__C4_REQUESTHENNAITEMDRAWINFO = "[C] C4 RequestHennaItemDrawInfo";
+	private static final String _C__C4_REQUESTHENNAITEMINFO = "[C] C4 RequestHennaItemInfo";
 	
 	private int _symbolId;
-	// format  cd
 	
 	@Override
 	protected void readImpl()
@@ -41,21 +37,28 @@ public final class RequestHennaItemDrawInfo extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance activeChar = getClient().getActiveChar();
+		final L2PcInstance activeChar = getActiveChar();
 		if (activeChar == null)
+		{
 			return;
+		}
 		
-		L2Henna template = HennaTable.getInstance().getTemplate(_symbolId);
-		if (template == null)
+		final L2Henna henna = HennaData.getInstance().getHenna(_symbolId);
+		if (henna == null)
+		{
+			if (_symbolId != 0)
+			{
+				_log.warning(getClass().getSimpleName() + ": Invalid Henna Id: " + _symbolId + " from player " + activeChar);
+			}
+			sendActionFailed();
 			return;
-		
-		L2HennaInstance henna = new L2HennaInstance(template);
+		}
 		activeChar.sendPacket(new HennaItemDrawInfo(henna, activeChar));
 	}
 	
 	@Override
 	public String getType()
 	{
-		return _C__C4_REQUESTHENNAITEMDRAWINFO;
+		return _C__C4_REQUESTHENNAITEMINFO;
 	}
 }

+ 11 - 15
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaDrawList.java → L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemList.java

@@ -14,42 +14,38 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import com.l2jserver.gameserver.datatables.HennaTreeTable;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.items.instance.L2HennaInstance;
 import com.l2jserver.gameserver.network.serverpackets.HennaEquipList;
 
 /**
- * @author Tempy
+ * @author Tempy, Zoey76
  */
-public final class RequestHennaDrawList extends L2GameClientPacket
+public final class RequestHennaItemList extends L2GameClientPacket
 {
-	private static final String _C__C3_REQUESTHENNADRAWLIST = "[C] C3 RequestHennaDrawList";
+	private static final String _C__C3_REQUESTHENNAITEMLIST = "[C] C3 RequestHennaItemList";
 	
-	// This is just a trigger packet...
 	@SuppressWarnings("unused")
 	private int _unknown;
 	
 	@Override
 	protected void readImpl()
 	{
-		_unknown = readD(); // ??
+		_unknown = readD(); // TODO: Identify.
 	}
 	
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance activeChar = getClient().getActiveChar();
-		if (activeChar == null)
-			return;
-		
-		L2HennaInstance[] henna = HennaTreeTable.getInstance().getAvailableHenna(activeChar.getClassId());
-		activeChar.sendPacket(new HennaEquipList(activeChar, henna));
+		final L2PcInstance activeChar = getActiveChar();
+		if (activeChar != null)
+		{
+			activeChar.sendPacket(new HennaEquipList(activeChar));
+		}
 	}
 	
 	@Override
 	public String getType()
 	{
-		return _C__C3_REQUESTHENNADRAWLIST;
+		return _C__C3_REQUESTHENNAITEMLIST;
 	}
-}
+}

+ 13 - 9
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemRemoveInfo.java

@@ -14,19 +14,19 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import com.l2jserver.gameserver.datatables.HennaTable;
+import com.l2jserver.gameserver.datatables.HennaData;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.items.L2Henna;
-import com.l2jserver.gameserver.model.items.instance.L2HennaInstance;
 import com.l2jserver.gameserver.network.serverpackets.HennaItemRemoveInfo;
 
-
+/**
+ * @author Zoey76
+ */
 public final class RequestHennaItemRemoveInfo extends L2GameClientPacket
 {
 	private static final String _C__71_REQUESTHENNAITEMREMOVEINFO = "[C] 71 RequestHennaItemRemoveInfo";
 	
 	private int _symbolId;
-	// format  cd
 	
 	@Override
 	protected void readImpl()
@@ -37,15 +37,19 @@ public final class RequestHennaItemRemoveInfo extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance activeChar = getClient().getActiveChar();
+		final L2PcInstance activeChar = getClient().getActiveChar();
 		if (activeChar == null)
+		{
 			return;
+		}
 		
-		L2Henna template = HennaTable.getInstance().getTemplate(_symbolId);
-		if (template == null)
+		final L2Henna henna = HennaData.getInstance().getHenna(_symbolId);
+		if (henna == null)
+		{
+			_log.warning(getClass().getName() + ": Invalid Henna Id: " + _symbolId + " from player " + activeChar);
+			sendActionFailed();
 			return;
-		
-		L2HennaInstance henna = new L2HennaInstance(template);
+		}
 		activeChar.sendPacket(new HennaItemRemoveInfo(henna, activeChar));
 	}
 	

+ 21 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaRemove.java

@@ -15,13 +15,11 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.items.instance.L2HennaInstance;
+import com.l2jserver.gameserver.model.items.L2Henna;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
 /**
- * This class ...
- *
- * @version $Revision$ $Date$
+ * @author Zoey76
  */
 public final class RequestHennaRemove extends L2GameClientPacket
 {
@@ -37,29 +35,44 @@ public final class RequestHennaRemove extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance activeChar = getClient().getActiveChar();
+		final L2PcInstance activeChar = getActiveChar();
 		if (activeChar == null)
+		{
 			return;
+		}
 		
 		if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("HennaRemove"))
+		{
+			sendActionFailed();
 			return;
+		}
 		
+		L2Henna henna;
+		boolean found = false;
 		for (int i = 1; i <= 3; i++)
 		{
-			L2HennaInstance henna = activeChar.getHenna(i);
-			if (henna != null && henna.getSymbolId() == _symbolId)
+			henna = activeChar.getHenna(i);
+			if ((henna != null) && (henna.getDyeId() == _symbolId))
 			{
-				if (activeChar.getAdena() >= (henna.getPrice() / 5))
+				if (activeChar.getAdena() >= henna.getCancelFee())
 				{
 					activeChar.removeHenna(i);
 				}
 				else
 				{
 					activeChar.sendPacket(SystemMessageId.YOU_NOT_ENOUGH_ADENA);
+					sendActionFailed();
 				}
+				found = true;
 				break;
 			}
 		}
+		// TODO: Test.
+		if (!found)
+		{
+			_log.warning(getClass().getSimpleName() + ": Player " + activeChar + " requested Henna Draw remove without any henna.");
+			sendActionFailed();
+		}
 	}
 	
 	@Override

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaRemoveList.java

@@ -21,23 +21,23 @@ public final class RequestHennaRemoveList extends L2GameClientPacket
 {
 	private static final String _C__70_REQUESTHENNAREMOVELIST = "[C] 70 RequestHennaRemoveList";
 	
-	// This is just a trigger packet...
 	@SuppressWarnings("unused")
 	private int _unknown;
 	
 	@Override
 	protected void readImpl()
 	{
-		_unknown = readD(); // ??
+		_unknown = readD(); // TODO: Identify.
 	}
 	
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance activeChar = getClient().getActiveChar();
+		final L2PcInstance activeChar = getActiveChar();
 		if (activeChar == null)
+		{
 			return;
-		
+		}
 		activeChar.sendPacket(new HennaRemoveList(activeChar));
 	}
 	
@@ -46,4 +46,4 @@ public final class RequestHennaRemoveList extends L2GameClientPacket
 	{
 		return _C__70_REQUESTHENNAREMOVELIST;
 	}
-}
+}

+ 0 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestJoinAlly.java

@@ -28,9 +28,7 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  */
 public final class RequestJoinAlly extends L2GameClientPacket
 {
-	
 	private static final String _C__8C_REQUESTJOINALLY = "[C] 8C RequestJoinAlly";
-	//private static Logger _log = Logger.getLogger(RequestJoinAlly.class.getName());
 	
 	private int _id;
 	

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

@@ -27,7 +27,6 @@ import com.l2jserver.gameserver.network.serverpackets.ExShowDominionRegistry;
 public final class RequestJoinDominionWar extends L2GameClientPacket
 {
 	private static final String _C__D0_57_REQUESTJOINDOMINIONWAR = "[C] D0:57 RequestJoinDominionWar";
-	// private static Logger _log = Logger.getLogger(RequestJoinDominionWar.class.getName());
 	
 	private int _territoryId;
 	private int _isClan;

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

@@ -30,7 +30,6 @@ import com.l2jserver.gameserver.network.serverpackets.SiegeInfo;
 public final class RequestJoinSiege extends L2GameClientPacket
 {
 	private static final String _C__AD_RequestJoinSiege = "[C] AD RequestJoinSiege";
-	//private static Logger _log = Logger.getLogger(RequestJoinSiege.class.getName());
 	
 	private int _castleId;
 	private int _isAttacker;

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

@@ -25,7 +25,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 public final class RequestOustPartyMember extends L2GameClientPacket
 {
 	private static final String _C__45_REQUESTOUSTPARTYMEMBER = "[C] 45 RequestOustPartyMember";
-	//private static Logger _log = Logger.getLogger(RequestJoinParty.class.getName());
 	
 	private String _name;
 	

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

@@ -31,7 +31,6 @@ import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 public final class RequestPetGetItem extends L2GameClientPacket
 {
 	private static final String _C__98_REQUESTPETGETITEM = "[C] 98 RequestPetGetItem";
-	//private static Logger _log = Logger.getLogger(RequestPetGetItem.class.getName());
 	
 	private int _objectId;
 	

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

@@ -32,7 +32,6 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 public final class RequestPetition extends L2GameClientPacket
 {
 	private static final String _C__89_RequestPetition = "[C] 89 RequestPetition";
-	//private static Logger _log = Logger.getLogger(RequestPetition.class.getName());
 	
 	private String _content;
 	private int _type;       // 1 = on : 0 = off;

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

@@ -26,7 +26,6 @@ import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListAll;
 public final class RequestPledgeMemberList extends L2GameClientPacket
 {
 	private static final String _C__4D_REQUESTPLEDGEMEMBERLIST = "[C] 4D RequestPledgeMemberList";
-	//private static Logger _log = Logger.getLogger(RequestPledgeMemberList.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -24,7 +24,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 public final class RequestPrivateStoreManageBuy extends L2GameClientPacket
 {
 	private static final String _C__99_REQUESTPRIVATESTOREMANAGEBUY = "[C] 99 RequestPrivateStoreManageBuy";
-	//private static Logger _log = Logger.getLogger(RequestPrivateStoreBuyManage.class.getName());
 	
 	@Override
 	protected void readImpl()

+ 0 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreManageSell.java

@@ -26,8 +26,6 @@ public final class RequestPrivateStoreManageSell extends L2GameClientPacket
 {
 	private static final String _C__30_REQUESTPRIVATESTOREMANAGESELL = "[C] 30 RequestPrivateStoreManageSell";
 	
-	//private static Logger _log = Logger.getLogger(RequestPrivateStoreManage.class.getName());
-	
 	@Override
 	protected void readImpl()
 	{

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

@@ -24,7 +24,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 public class RequestPrivateStoreQuitBuy extends L2GameClientPacket
 {
 	private static final String _C__9C_REQUESTPRIVATESTOREQUITBUY = "[C] 9C RequestPrivateStoreQuitBuy";
-	//private static Logger _log = Logger.getLogger(RequestPrivateStoreQuitBuy.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -24,7 +24,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 public final class RequestPrivateStoreQuitSell extends L2GameClientPacket
 {
 	private static final String _C__96_REQUESTPRIVATESTOREQUITSELL = "[C] 96 RequestPrivateStoreQuitSell";
-	//private static Logger _log = Logger.getLogger(RequestPrivateStoreQuitSell.class.getName());
 	
 	@Override
 	protected void readImpl()

+ 0 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestQuestList.java

@@ -24,8 +24,6 @@ import com.l2jserver.gameserver.network.serverpackets.QuestList;
 public final class RequestQuestList extends L2GameClientPacket
 {
 	private static final String _C__62_REQUESTQUESTLIST = "[C] 62 RequestQuestList";
-	//private static Logger _log = Logger.getLogger(RequestQuestList.class.getName());
-	
 	
 	@Override
 	protected void readImpl()

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

@@ -22,7 +22,6 @@ import com.l2jserver.gameserver.network.serverpackets.RecipeBookItemList;
 public final class RequestRecipeBookDestroy extends L2GameClientPacket
 {
 	private static final String _C__B6_REQUESTRECIPEBOOKDESTROY = "[C] B6 RequestRecipeBookDestroy";
-	//private static Logger _log = Logger.getLogger(RequestSellItem.class.getName());
 	
 	private int _recipeID;
 	

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

@@ -20,7 +20,6 @@ import com.l2jserver.gameserver.network.serverpackets.RecipeItemMakeInfo;
 public final class RequestRecipeItemMakeInfo extends L2GameClientPacket
 {
 	private static final String _C__B7_REQUESTRECIPEITEMMAKEINFO = "[C] B7 RequestRecipeItemMakeInfo";
-	//private static Logger _log = Logger.getLogger(RequestSellItem.class.getName());
 	
 	private int _id;
 	

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

@@ -23,7 +23,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 public final class RequestRecipeItemMakeSelf extends L2GameClientPacket
 {
 	private static final String _C__B8_REQUESTRECIPEITEMMAKESELF = "[C] B8 RequestRecipeItemMakeSelf";
-	//private static Logger _log = Logger.getLogger(RequestSellItem.class.getName());
 	
 	private int _id;
 	

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

@@ -40,7 +40,6 @@ import com.l2jserver.gameserver.util.Util;
 public final class RequestRecipeShopListSet extends L2GameClientPacket
 {
 	private static final String _C__BB_RequestRecipeShopListSet = "[C] BB RequestRecipeShopListSet";
-	//private static Logger _log = Logger.getLogger(RequestRecipeShopListSet.class.getName());
 	
 	private static final int BATCH_LENGTH = 12; // length of the one item
 	

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

@@ -26,7 +26,6 @@ import com.l2jserver.gameserver.network.serverpackets.RecipeShopItemInfo;
 public final class RequestRecipeShopMakeInfo extends L2GameClientPacket
 {
 	private static final String _C__B5_RequestRecipeShopMakeInfo = "[C] B5 RequestRecipeShopMakeInfo";
-	//private static Logger _log = Logger.getLogger(RequestRecipeShopMakeInfo.class.getName());
 	
 	private int _playerObjectId;
 	private int _recipeId;

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

@@ -25,7 +25,6 @@ import com.l2jserver.gameserver.util.Util;
 public final class RequestRecipeShopMakeItem extends L2GameClientPacket
 {
 	private static final String _C__BF_REQUESTRECIPESHOPMAKEITEM = "[C] BF RequestRecipeShopMakeItem";
-	//private static Logger _log = Logger.getLogger(RequestSellItem.class.getName());
 	
 	private int _id;
 	private int _recipeId;

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

@@ -27,7 +27,6 @@ import com.l2jserver.gameserver.network.serverpackets.RecipeShopManageList;
 public final class RequestRecipeShopManageList extends L2GameClientPacket
 {
 	private static final String _C__B9_RequestRecipeShopManageList = "[C] B9 RequestRecipeShopManageList";
-	//private static Logger _log = Logger.getLogger(RequestPrivateStoreManage.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -26,7 +26,6 @@ import com.l2jserver.gameserver.network.serverpackets.RecipeShopSellList;
 public final class RequestRecipeShopManagePrev extends L2GameClientPacket
 {
 	private static final String _C__C0_RequestRecipeShopPrev = "[C] C0 RequestRecipeShopPrev";
-	//private static Logger _log = Logger.getLogger(RequestPrivateStoreManage.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -24,7 +24,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 public final class RequestRecipeShopManageQuit extends L2GameClientPacket
 {
 	private static final String _C__BC_RequestRecipeShopManageQuit = "[C] BC2 RequestRecipeShopManageQuit";
-	//private static Logger _log = Logger.getLogger(RequestRecipeShopManageQuit.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -26,7 +26,6 @@ import com.l2jserver.gameserver.util.Util;
 public class RequestRecipeShopMessageSet extends L2GameClientPacket
 {
 	private static final String _C__BA_RequestRecipeShopMessageSet = "[C] BA RequestRecipeShopMessageSet";
-	//private static Logger _log = Logger.getLogger(RequestRecipeShopMessageSet.class.getName());
 	
 	private static final int MAX_MSG_LENGTH = 29;
 	

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

@@ -26,7 +26,6 @@ import com.l2jserver.gameserver.network.SystemMessageId;
 public final class RequestReplyStartPledgeWar extends L2GameClientPacket
 {
 	private static final String _C__04_REQUESTREPLYSTARTPLEDGEWAR = "[C] 04 RequestReplyStartPledgeWar";
-	//private static Logger _log = Logger.getLogger(RequestReplyStartPledgeWar.class.getName());
 	
 	private int _answer;
 	

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

@@ -26,7 +26,6 @@ import com.l2jserver.gameserver.network.SystemMessageId;
 public final class RequestReplyStopPledgeWar extends L2GameClientPacket
 {
 	private static final String _C__06_REQUESTREPLYSTOPPLEDGEWAR = "[C] 06 RequestReplyStopPledgeWar";
-	//private static Logger _log = Logger.getLogger(RequestReplyStopPledgeWar.class.getName());
 	
 	private int _answer;
 	

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

@@ -20,7 +20,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 public final class RequestReplySurrenderPledgeWar extends L2GameClientPacket
 {
 	private static final String _C__08_REQUESTREPLYSURRENDERPLEDGEWAR = "[C] 08 RequestReplySurrenderPledgeWar";
-	//private static Logger _log = Logger.getLogger(RequestReplySurrenderPledgeWar.class.getName());
 	
 	private int _answer;
 	

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

@@ -56,7 +56,6 @@ import com.l2jserver.gameserver.util.Util;
 public final class RequestSellItem extends L2GameClientPacket
 {
 	private static final String _C__37_REQUESTSELLITEM = "[C] 37 RequestSellItem";
-	//private static Logger _log = Logger.getLogger(RequestSellItem.class.getName());
 	
 	private static final int BATCH_LENGTH = 16; // length of the one item
 	

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

@@ -45,7 +45,6 @@ import com.l2jserver.gameserver.util.Util;
  */
 public class RequestSetCrop extends L2GameClientPacket {
 	private static final String _C__D0_04_REQUESTSETCROP = "[C] D0:04 RequestSetCrop";
-	//private static Logger _log = Logger.getLogger(RequestSetCrop.class.getName());
 	
 	private static final int BATCH_LENGTH = 21; // length of the one item
 	

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

@@ -45,7 +45,6 @@ import com.l2jserver.gameserver.util.Util;
 public class RequestSetSeed extends L2GameClientPacket
 {
 	private static final String _C__D0_03_REQUESTSETSEED = "[C] D0:03 RequestSetSeed";
-	//private static Logger _log = Logger.getLogger(RequestSetSeed.class.getName());
 	
 	private static final int BATCH_LENGTH = 20; // length of the one item
 	

+ 0 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSiegeAttackerList.java

@@ -28,9 +28,7 @@ import com.l2jserver.gameserver.network.serverpackets.SiegeAttackerList;
  */
 public final class RequestSiegeAttackerList extends L2GameClientPacket
 {
-	
 	private static final String _C__AB_RequestSiegeAttackerList = "[C] AB RequestSiegeAttackerList";
-	//private static Logger _log = Logger.getLogger(RequestJoinParty.class.getName());
 	
 	private int _castleId;
 	

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

@@ -27,7 +27,6 @@ import com.l2jserver.gameserver.network.serverpackets.SiegeDefenderList;
 public final class RequestSiegeDefenderList extends L2GameClientPacket
 {
 	private static final String _C__AC_REQUESTSIEGEDEFENDERLIST = "[C] AC RequestSiegeDefenderList";
-	//private static Logger _log = Logger.getLogger(RequestJoinParty.class.getName());
 	
 	private int _castleId;
 	

+ 0 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestStartPledgeWar.java

@@ -25,11 +25,9 @@ import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
-
 public final class RequestStartPledgeWar extends L2GameClientPacket
 {
 	private static final String _C__03_REQUESTSTARTPLEDGEWAR = "[C] 03 RequestStartPledgewar";
-	//private static Logger _log = Logger.getLogger(RequestStartPledgeWar.class.getName());
 	
 	private String _pledgeName;
 	private L2Clan _clan;

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

@@ -29,7 +29,6 @@ import com.l2jserver.gameserver.taskmanager.AttackStanceTaskManager;
 public final class RequestStopPledgeWar extends L2GameClientPacket
 {
 	private static final String _C__05_REQUESTSTOPPLEDGEWAR = "[C] 05 RequestStopPledgeWar";
-	//private static Logger _log = Logger.getLogger(RequestStopPledgeWar.class.getName());
 	
 	private String _pledgeName;
 	

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

@@ -31,7 +31,6 @@ import com.l2jserver.gameserver.network.serverpackets.PartyMatchDetail;
 public final class RequestWithDrawalParty extends L2GameClientPacket
 {
 	private static final String _C__44_REQUESTWITHDRAWALPARTY = "[C] 44 RequestWithDrawalParty";
-	//private static Logger _log = Logger.getLogger(RequestWithDrawalParty.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -29,7 +29,6 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 public final class RequestWithdrawalPledge extends L2GameClientPacket
 {
 	private static final String _C__28_REQUESTWITHDRAWALPLEDGE = "[C] 28 RequestWithdrawalPledge";
-	//static Logger _log = Logger.getLogger(RequestWithdrawalPledge.class.getName());
 	
 	@Override
 	protected void readImpl()

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

@@ -27,7 +27,6 @@ import com.l2jserver.gameserver.util.Util;
 public final class SetPrivateStoreMsgBuy extends L2GameClientPacket
 {
 	private static final String _C__9D_SETPRIVATESTOREMSGBUY = "[C] 9D SetPrivateStoreMsgBuy";
-	//private static Logger _log = Logger.getLogger(SetPrivateStoreMsgBuy.class.getName());
 	
 	private static final int MAX_MSG_LENGTH = 29;
 	

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

@@ -27,7 +27,6 @@ import com.l2jserver.gameserver.util.Util;
 public class SetPrivateStoreMsgSell extends L2GameClientPacket
 {
 	private static final String _C__97_SETPRIVATESTOREMSGSELL = "[C] 97 SetPrivateStoreMsgSell";
-	//private static Logger _log = Logger.getLogger(SetPrivateStoreMsgSell.class.getName());
 	
 	private static final int MAX_MSG_LENGTH = 29;
 	

+ 0 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AskJoinAlly.java

@@ -14,10 +14,7 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-
-
 /**
- *
  * sample
  * <p>
  * 7d
@@ -33,7 +30,6 @@ package com.l2jserver.gameserver.network.serverpackets;
 public class AskJoinAlly extends L2GameServerPacket
 {
 	private static final String _S__A8_ASKJOINALLY_0XA8 = "[S] bb AskJoinAlly 0xa8";
-	//private static Logger _log = Logger.getLogger(AskJoinAlly.class.getName());
 	
 	private String _requestorName;
 	private int _requestorObjId;

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

@@ -33,7 +33,6 @@ package com.l2jserver.gameserver.network.serverpackets;
 public class AskJoinParty extends L2GameServerPacket
 {
 	private static final String _S__4B_ASKJOINPARTY_0X4B = "[S] 39 AskJoinParty";
-	//private static Logger _log = Logger.getLogger(AskJoinParty.class.getName());
 	
 	private String _requestorName;
 	private int _itemDistribution;

+ 0 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExReplyDominionInfo.java

@@ -21,20 +21,12 @@ import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager.Territory;
 
 /**
- *
  * @author  JIV
  */
 public class ExReplyDominionInfo extends L2GameServerPacket
 {
-	/**
-	 * @see com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket#getType()
-	 */
-	// private static Logger _log = Logger.getLogger(ExReplyDominionInfo.class.getName());
 	private int _warTime = (int) (TerritoryWarManager.getInstance().getTWStartTimeInMillis() / 1000);
 	
-	/**
-	 * @see com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket#writeImpl()
-	 */
 	@Override
 	protected void writeImpl()
 	{

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

@@ -20,29 +20,20 @@ import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.entity.Fort;
 
-
 /**
  * format: d (dSdd)
  * cnt:%d (fortressID:%d ownerName:%s, siegeState:%d, lastOwnedTime:%d)
  * 
- * @author  KenM
+ * @author KenM
  */
 public class ExShowFortressInfo extends L2GameServerPacket
 {
-	//private static final Logger _log = Logger.getLogger(ExShowFortressInfo.class.getName());
-	
-	/**
-	 * @see com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket#getType()
-	 */
 	@Override
 	public String getType()
 	{
 		return "[S] FE:15 ExShowFortressInfo";
 	}
 	
-	/**
-	 * @see com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket#writeImpl()
-	 */
 	@Override
 	protected void writeImpl()
 	{
@@ -76,5 +67,4 @@ public class ExShowFortressInfo extends L2GameServerPacket
 			writeD(fort.getOwnedTime());
 		}
 	}
-	
 }

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

@@ -36,11 +36,9 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  * d: Unknown (0 if offline)
  *
  * @author Tempy
- * 
  */
 public class FriendList extends L2GameServerPacket
 {
-	// private static Logger _log = Logger.getLogger(FriendList.class.getName());
 	private static final String _S__FA_FRIENDLIST = "[S] 75 FriendList";
 	private List<FriendInfo> _info;
 	

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

@@ -42,11 +42,9 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  * d: Player Level
  *
  * @author mrTJO & UnAfraid
- * 
  */
 public class FriendListExtended extends L2GameServerPacket
 {
-	// private static Logger _log = Logger.getLogger(FriendList.class.getName());
 	private static final String _S__FA_FRIENDLISTEXTENDED = "[S] 75 FriendListExtended";
 	private final List<FriendInfo> _info;
 	

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

@@ -30,11 +30,9 @@ import com.l2jserver.gameserver.model.L2World;
  * d: Unknown (0 if offline)<BR>
  * 
  * @author JIV
- * 
  */
 public class FriendPacket extends L2GameServerPacket
 {
-	// private static Logger _log = Logger.getLogger(FriendList.class.getName());
 	private static final String _S__FA_FRIENDLIST = "[S] 76 FriendPacket";
 	private boolean _action, _online;
 	private int _objid;

+ 18 - 26
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/GMHennaInfo.java

@@ -15,51 +15,38 @@
 package com.l2jserver.gameserver.network.serverpackets;
 
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.items.instance.L2HennaInstance;
+import com.l2jserver.gameserver.model.items.L2Henna;
 
 /**
- *
- * @author  KenM
+ * @author KenM, Zoey76
  */
 public class GMHennaInfo extends L2GameServerPacket
 {
+	private static final String _S__F0_GMHENNAINFO = "[S] F0 GMHennaInfo";
+	
 	private final L2PcInstance _activeChar;
-	private final L2HennaInstance[] _hennas = new L2HennaInstance[3];
-	private int _count;
+	private final L2Henna[] _hennas = new L2Henna[3];
+	private final int _count;
 	
 	public GMHennaInfo(L2PcInstance activeChar)
 	{
 		_activeChar = activeChar;
 		
 		int j = 0;
-		for (int i = 0; i < 3; i++)
+		for (L2Henna henna : _activeChar.getHennaList())
 		{
-			L2HennaInstance h = _activeChar.getHenna(i+1);
-			if (h != null)
+			if (henna != null)
 			{
-				_hennas[j++] = h;
+				_hennas[j++] = henna;
 			}
 		}
 		_count = j;
 	}
 	
-	/**
-	 * @see com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket#getType()
-	 */
-	@Override
-	public String getType()
-	{
-		return "[S] 0xf0 GMHennaInfo";
-	}
-	
-	/**
-	 * @see com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket#writeImpl()
-	 */
 	@Override
 	protected void writeImpl()
 	{
-		writeC(0xf0);
-		
+		writeC(0xF0);
 		writeC(_activeChar.getHennaStatINT());
 		writeC(_activeChar.getHennaStatSTR());
 		writeC(_activeChar.getHennaStatCON());
@@ -67,12 +54,17 @@ public class GMHennaInfo extends L2GameServerPacket
 		writeC(_activeChar.getHennaStatDEX());
 		writeC(_activeChar.getHennaStatWIT());
 		writeD(3); // slots?
-		writeD(_count); //size
-		for (int i = 0; i < _count; i++)
+		writeD(_count); // size
+		for (L2Henna henna : _hennas)
 		{
-			writeD(_hennas[i].getSymbolId());
+			writeD(henna.getDyeId());
 			writeD(0x01);
 		}
 	}
 	
+	@Override
+	public String getType()
+	{
+		return _S__F0_GMHENNAINFO;
+	}
 }

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

@@ -19,12 +19,10 @@ import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 
 /**
- *
  * @version $Revision: 1.1.2.1.2.3 $ $Date: 2005/03/27 15:29:57 $
  */
 public class GMViewItemList extends L2GameServerPacket
 {
-	//private static Logger _log = Logger.getLogger(GMViewItemList.class.getName());
 	private static final String _S__AD_GMVIEWITEMLIST = "[S] 9a GMViewItemList";
 	private L2ItemInstance[] _items;
 	private int _limit;

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä