From c57c57daf26d6a6b18cb5d50e13ddde8ae057e01 Mon Sep 17 00:00:00 2001
From: Zoey76 <zoey_76@msn.com>
Date: Sun, 23 Sep 2012 16:25:20 +0000
Subject: [PATCH] BETA: Implementation of reuse delay for items and item skills
 for pets. 	* Independent reuse delay from masters (fix bug with shared
 reuse time). 	* Implemented for items. 	* Implemented for skills. 
 * It doesn't show system messages (retail like) when pet has reuse time for
 items or skills. 	* Fixed bug with pets not getting herbs. 	*
 Removed custom system messages. 	* Unhardcoded some shop Ids.

Reported by: Tavo22, u3games, valdaron
Tested by: Zoey76, valdaron, MELERIX
---
 .../actionhandlers/L2PcInstanceAction.java    |   4 +-
 .../itemhandlers/ItemSkillsTemplate.java      | 138 +++++++++---------
 .../scripts/handlers/skillhandlers/Craft.java |   2 +-
 3 files changed, 68 insertions(+), 76 deletions(-)

diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PcInstanceAction.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PcInstanceAction.java
index deed6ac0f8..241d74c4da 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PcInstanceAction.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PcInstanceAction.java
@@ -53,7 +53,7 @@ public class L2PcInstanceAction implements IActionHandler
 	public boolean action(L2PcInstance activeChar, L2Object target, boolean interact)
 	{
 		// See description in TvTEvent.java
-		if (!TvTEvent.onAction( activeChar, target.getObjectId()))
+		if (!TvTEvent.onAction(activeChar, target.getObjectId()))
 			return false;
 		
 		// Check if the L2PcInstance is confused
@@ -82,7 +82,7 @@ public class L2PcInstanceAction implements IActionHandler
 		{
 			if (activeChar != target) activeChar.sendPacket(new ValidateLocation((L2Character)target));
 			// Check if this L2PcInstance has a Private Store
-			if (((L2PcInstance)target).getPrivateStoreType() != 0)
+			if (((L2PcInstance) target).getPrivateStoreType() != L2PcInstance.STORE_PRIVATE_NONE)
 			{
 				activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, target);
 			}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/itemhandlers/ItemSkillsTemplate.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/itemhandlers/ItemSkillsTemplate.java
index 4d98139298..6a3ea8a107 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/itemhandlers/ItemSkillsTemplate.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/itemhandlers/ItemSkillsTemplate.java
@@ -18,7 +18,6 @@ import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.handler.IItemHandler;
 import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2ServitorInstance;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
@@ -29,16 +28,15 @@ import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
 /**
- * Template for item skills handler.<br>
- * Only minimum of checks.
+ * Template for item skills handler.
+ * @author Zoey76
  */
 public class ItemSkillsTemplate implements IItemHandler
 {
 	@Override
 	public boolean useItem(L2Playable playable, L2ItemInstance item, boolean forceUse)
 	{
-		final L2PcInstance activeChar = playable.getActingPlayer();
-		if (!playable.isPet() && !playable.isPlayer())
+		if (!playable.isPlayer() && !playable.isPet())
 		{
 			return false;
 		}
@@ -52,19 +50,16 @@ public class ItemSkillsTemplate implements IItemHandler
 		// Pets can use items only when they are tradable.
 		if (playable.isPet() && !item.isTradeable())
 		{
-			activeChar.sendPacket(SystemMessageId.ITEM_NOT_FOR_PETS);
+			playable.sendPacket(SystemMessageId.ITEM_NOT_FOR_PETS);
 			return false;
 		}
 		
 		// Verify that item is not under reuse.
-		if (!checkReuse(activeChar, null, item))
+		if (!checkReuse(playable, null, item))
 		{
 			return false;
 		}
 		
-		int skillId;
-		int skillLvl;
-		
 		final SkillHolder[] skills = item.getEtcItem().getSkills();
 		if (skills == null)
 		{
@@ -72,6 +67,9 @@ public class ItemSkillsTemplate implements IItemHandler
 			return false;
 		}
 		
+		int skillId;
+		int skillLvl;
+		final L2PcInstance activeChar = playable.getActingPlayer();
 		for (SkillHolder skillInfo : skills)
 		{
 			if (skillInfo == null)
@@ -79,10 +77,7 @@ public class ItemSkillsTemplate implements IItemHandler
 				continue;
 			}
 			
-			skillId = skillInfo.getSkillId();
-			skillLvl = skillInfo.getSkillLvl();
 			L2Skill itemSkill = skillInfo.getSkill();
-			
 			if (itemSkill != null)
 			{
 				if (!itemSkill.checkCondition(playable, playable.getTarget(), false))
@@ -96,7 +91,7 @@ public class ItemSkillsTemplate implements IItemHandler
 				}
 				
 				// Verify that skill is not under reuse.
-				if (!checkReuse(activeChar, itemSkill, item))
+				if (!checkReuse(playable, itemSkill, item))
 				{
 					return false;
 				}
@@ -110,29 +105,31 @@ public class ItemSkillsTemplate implements IItemHandler
 				{
 					if (!playable.destroyItem("Consume", item.getObjectId(), itemSkill.getItemConsume(), playable, false))
 					{
-						activeChar.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
+						playable.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
 						return false;
 					}
 				}
 				
-				// send message to owner
+				// Send message to the master.
 				if (playable.isPet())
 				{
 					SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PET_USES_S1);
-					sm.addString(itemSkill.getName());
-					activeChar.sendPacket(sm);
+					sm.addSkillName(itemSkill);
+					playable.sendPacket(sm);
 				}
 				else
 				{
+					skillId = skillInfo.getSkillId();
+					skillLvl = skillInfo.getSkillLvl();
+					// Short buff icon for healing potions.
 					switch (skillId)
 					{
-					// short buff icon for healing potions
 						case 2031:
 						case 2032:
 						case 2037:
 						case 26025:
 						case 26026:
-							final int buffId = activeChar._shortBuffTaskSkillId;
+							final int buffId = activeChar.getShortBuffTaskSkillId();
 							if ((skillId == 2037) || (skillId == 26025))
 							{
 								activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration() / 1000);
@@ -152,11 +149,11 @@ public class ItemSkillsTemplate implements IItemHandler
 					}
 				}
 				
-				if (item.isPotion() || item.isElixir() || itemSkill.isSimultaneousCast())
+				if (item.isPotion() || item.isElixir() || (item.getItemType() == L2EtcItemType.HERB) || itemSkill.isSimultaneousCast())
 				{
 					playable.doSimultaneousCast(itemSkill);
 					// Summons should be affected by herbs too, self time effect is handled at L2Effect constructor
-					if (!playable.isPet() && (item.getItemType() == L2EtcItemType.HERB) && (activeChar.getPet() != null) && (activeChar.getPet() instanceof L2ServitorInstance))
+					if (!playable.isSummon() && (activeChar.getPet() != null))
 					{
 						activeChar.getPet().doSimultaneousCast(itemSkill);
 					}
@@ -174,7 +171,7 @@ public class ItemSkillsTemplate implements IItemHandler
 					{
 						if (!playable.destroyItem("Consume", item.getObjectId(), itemSkill.getItemConsume(), null, false))
 						{
-							activeChar.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
+							playable.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
 							return false;
 						}
 					}
@@ -182,7 +179,7 @@ public class ItemSkillsTemplate implements IItemHandler
 				
 				if (itemSkill.getReuseDelay() > 0)
 				{
-					activeChar.addTimeStamp(itemSkill, itemSkill.getReuseDelay());
+					playable.addTimeStamp(itemSkill, itemSkill.getReuseDelay());
 				}
 			}
 		}
@@ -190,70 +187,65 @@ public class ItemSkillsTemplate implements IItemHandler
 	}
 	
 	/**
-	 * @param player the player using the item or skill
+	 * @param playable the character using the item or skill
 	 * @param skill the skill being used, can be null
 	 * @param item the item being used
 	 * @return {@code true} if the the item or skill to check is available, {@code false} otherwise
 	 */
-	private boolean checkReuse(L2PcInstance player, L2Skill skill, L2ItemInstance item)
+	private boolean checkReuse(L2Playable playable, L2Skill skill, L2ItemInstance item)
 	{
-		SystemMessage sm = null;
-		final long remainingTime = (skill != null) ? player.getSkillRemainingReuseTime(skill.getReuseHashCode()) : player.getItemRemainingReuseTime(item.getObjectId());
+		final long remainingTime = (skill != null) ? playable.getSkillRemainingReuseTime(skill.getReuseHashCode()) : playable.getItemRemainingReuseTime(item.getObjectId());
 		final boolean isAvailable = remainingTime <= 0;
-		if (!isAvailable)
+		if (playable.isPlayer())
 		{
-			final int hours = (int) (remainingTime / 3600000L);
-			final int minutes = (int) (remainingTime % 3600000L) / 60000;
-			final int seconds = (int) ((remainingTime / 1000) % 60);
-			if (hours > 0)
+			if (!isAvailable)
 			{
-				sm = SystemMessage.getSystemMessage(SystemMessageId.S2_HOURS_S3_MINUTES_S4_SECONDS_REMAINING_FOR_REUSE_S1);
-				if ((skill == null) || skill.isStatic())
-				{
-					sm.addItemName(item);
-				}
-				else
-				{
-					sm.addSkillName(skill);
-				}
-				sm.addNumber(hours);
-				sm.addNumber(minutes);
-			}
-			else if (minutes > 0)
-			{
-				sm = SystemMessage.getSystemMessage(SystemMessageId.S2_MINUTES_S3_SECONDS_REMAINING_FOR_REUSE_S1);
-				if ((skill == null) || skill.isStatic())
-				{
-					sm.addItemName(item);
-				}
-				else
-				{
-					sm.addSkillName(skill);
+				final int hours = (int) (remainingTime / 3600000L);
+				final int minutes = (int) (remainingTime % 3600000L) / 60000;
+				final int seconds = (int) ((remainingTime / 1000) % 60);
+				SystemMessage sm = null;
+				if (hours > 0)
+				{
+					sm = SystemMessage.getSystemMessage(SystemMessageId.S2_HOURS_S3_MINUTES_S4_SECONDS_REMAINING_FOR_REUSE_S1);
+					if ((skill == null) || skill.isStatic())
+					{
+						sm.addItemName(item);
+					}
+					else
+					{
+						sm.addSkillName(skill);
+					}
+					sm.addNumber(hours);
+					sm.addNumber(minutes);
 				}
-				sm.addNumber(minutes);
-			}
-			else
-			{
-				sm = SystemMessage.getSystemMessage(SystemMessageId.S2_SECONDS_REMAINING_FOR_REUSE_S1);
-				if ((skill == null) || skill.isStatic())
+				else if (minutes > 0)
 				{
-					sm.addItemName(item);
+					sm = SystemMessage.getSystemMessage(SystemMessageId.S2_MINUTES_S3_SECONDS_REMAINING_FOR_REUSE_S1);
+					if ((skill == null) || skill.isStatic())
+					{
+						sm.addItemName(item);
+					}
+					else
+					{
+						sm.addSkillName(skill);
+					}
+					sm.addNumber(minutes);
 				}
 				else
 				{
-					sm.addSkillName(skill);
+					sm = SystemMessage.getSystemMessage(SystemMessageId.S2_SECONDS_REMAINING_FOR_REUSE_S1);
+					if ((skill == null) || skill.isStatic())
+					{
+						sm.addItemName(item);
+					}
+					else
+					{
+						sm.addSkillName(skill);
+					}
 				}
+				sm.addNumber(seconds);
+				playable.sendPacket(sm);
 			}
-			sm.addNumber(seconds);
-		}
-		else if (skill == null)
-		{
-			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_PREPARED_FOR_REUSE);
-			sm.addItemName(item);
-		}
-		if (sm != null)
-		{
-			player.sendPacket(sm);
 		}
 		return isAvailable;
 	}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Craft.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Craft.java
index 4734d7730d..e755f5de76 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Craft.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Craft.java
@@ -42,7 +42,7 @@ public class Craft implements ISkillHandler
 		
 		L2PcInstance player = activeChar.getActingPlayer();
 		
-		if (player.getPrivateStoreType() != 0)
+		if (player.getPrivateStoreType() != L2PcInstance.STORE_PRIVATE_NONE)
 		{
 			player.sendPacket(SystemMessageId.CANNOT_CREATED_WHILE_ENGAGED_IN_TRADING);
 			return;
-- 
GitLab