Explorar el Código

Upgrading picking up system for pets (L2PetInstance)
* Pets can now pick up herbs.
* Added system messages to announce pet picking up items
* Fixes #3083
Thank you nekys for carrying out as many tests as needed

DrHouse hace 16 años
padre
commit
dfbb130570

+ 43 - 31
L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/Potions.java

@@ -45,11 +45,11 @@ public class Potions implements IItemHandler
 	/** Task for Herbs */
 	private class HerbTask implements Runnable
 	{
-		private L2PcInstance _activeChar;
+		private L2PlayableInstance _activeChar;
 		private int _magicId;
 		private int _level;
 		
-		HerbTask(L2PcInstance activeChar, int magicId, int level)
+		HerbTask(L2PlayableInstance activeChar, int magicId, int level)
 		{
 			_activeChar = activeChar;
 			_magicId = magicId;
@@ -299,62 +299,62 @@ public class Potions implements IItemHandler
 			
 			// HERBS
 			case 8600: // Herb of Life
-				res = usePotion(activeChar, 2278, 1);
+				res = usePotion(playable, 2278, 1);
 				break;
 			case 8601: // Greater Herb of Life
-				res = usePotion(activeChar, 2278, 2);
+				res = usePotion(playable, 2278, 2);
 				break;
 			case 8602: // Superior Herb of Life
-				res = usePotion(activeChar, 2278, 3);
+				res = usePotion(playable, 2278, 3);
 				break;
 			case 8603: // Herb of Mana
-				res = usePotion(activeChar, 2279, 1);
+				res = usePotion(playable, 2279, 1);
 				break;
 			case 8604: // Greater Herb of Mane
-				res = usePotion(activeChar, 2279, 2);
+				res = usePotion(playable, 2279, 2);
 				break;
 			case 8605: // Superior Herb of Mane
-				res = usePotion(activeChar, 2279, 3);
+				res = usePotion(playable, 2279, 3);
 				break;
 			case 8606: // Herb of Strength
-				res = usePotion(activeChar, 2280, 1);
+				res = usePotion(playable, 2280, 1);
 				break;
 			case 8607: // Herb of Magic
-				res = usePotion(activeChar, 2281, 1);
+				res = usePotion(playable, 2281, 1);
 				break;
 			case 8608: // Herb of Atk. Spd.
-				res = usePotion(activeChar, 2282, 1);
+				res = usePotion(playable, 2282, 1);
 				break;
 			case 8609: // Herb of Casting Spd.
-				res = usePotion(activeChar, 2283, 1);
+				res = usePotion(playable, 2283, 1);
 				break;
 			case 8610: // Herb of Critical Attack
-				res = usePotion(activeChar, 2284, 1);
+				res = usePotion(playable, 2284, 1);
 				break;
 			case 8611: // Herb of Speed
-				res = usePotion(activeChar, 2285, 1);
+				res = usePotion(playable, 2285, 1);
 				break;
 			case 8612: // Herb of Warrior
-				res = usePotion(activeChar, 2280, 1);// Herb of Strength
-				res = usePotion(activeChar, 2282, 1);// Herb of Atk. Spd
-				res = usePotion(activeChar, 2284, 1);// Herb of Critical Attack
+				res = usePotion(playable, 2280, 1);// Herb of Strength
+				res = usePotion(playable, 2282, 1);// Herb of Atk. Spd
+				res = usePotion(playable, 2284, 1);// Herb of Critical Attack
 				break;
 			case 8613: // Herb of Mystic
-				res = usePotion(activeChar, 2281, 1);// Herb of Magic
-				res = usePotion(activeChar, 2283, 1);// Herb of Casting Spd.
+				res = usePotion(playable, 2281, 1);// Herb of Magic
+				res = usePotion(playable, 2283, 1);// Herb of Casting Spd.
 				break;
 			case 8614: // Herb of Warrior
-				res = usePotion(activeChar, 2278, 3);// Superior Herb of Life
-				res = usePotion(activeChar, 2279, 3);// Superior Herb of Mana
+				res = usePotion(playable, 2278, 3);// Superior Herb of Life
+				res = usePotion(playable, 2279, 3);// Superior Herb of Mana
 				break;
 			case 10655:
-				res = usePotion(activeChar, 2512, 1);
+				res = usePotion(playable, 2512, 1);
 				break;
 			case 10656:
-				res = usePotion(activeChar, 2514, 1);
+				res = usePotion(playable, 2514, 1);
 				break;
 			case 10657:
-				res = usePotion(activeChar, 2513, 1);
+				res = usePotion(playable, 2513, 1);
 				break;
 			
 			// FISHERMAN POTIONS
@@ -518,7 +518,7 @@ public class Potions implements IItemHandler
 	 * @param level
 	 * @return
 	 */
-	public boolean usePotion(L2PcInstance activeChar, int magicId, int level)
+	public boolean usePotion(L2PlayableInstance activeChar, int magicId, int level)
 	{
 		if (activeChar.isCastingNow() && (magicId > 2277 && magicId < 2286 || magicId >= 2512 && magicId <= 2514))
 		{
@@ -529,7 +529,9 @@ public class Potions implements IItemHandler
 		{
 			if ((magicId > 2277 && magicId < 2286 || magicId >= 2512 && magicId <= 2514) && _herbstask >= 100)
 				_herbstask -= 100;
+			
 			L2Skill skill = SkillTable.getInstance().getInfo(magicId, level);
+			
 			if (skill != null)
 			{
 				// Return false if potion is in reuse
@@ -545,14 +547,24 @@ public class Potions implements IItemHandler
 				
 				activeChar.doCast(skill);
 				
-				//only for Heal potions
-				if (magicId == 2031 || magicId == 2032 || magicId == 2037)
+				if (activeChar instanceof L2PcInstance)
 				{
-					activeChar.shortBuffStatusUpdate(magicId, level, 15);
-				}
+					L2PcInstance player = (L2PcInstance)activeChar;
+					//only for Heal potions
+					if (magicId == 2031 || magicId == 2032 || magicId == 2037)
+					{
+						player.shortBuffStatusUpdate(magicId, level, 15);
+					}
 				
-				if (!(activeChar.isSitting() && !skill.isPotion()))
-					return true;
+					if (!(player.isSitting() && !skill.isPotion()))
+						return true;
+				}
+				else if (activeChar instanceof L2PetInstance)
+				{
+					SystemMessage sm = new SystemMessage(SystemMessageId.PET_USES_S1);
+					sm.addString(skill.getName());
+					((L2PetInstance)(activeChar)).getOwner().sendPacket(sm);
+				}
 			}
 		}
 		return false;

+ 73 - 18
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PetInstance.java

@@ -24,6 +24,9 @@ import net.sf.l2j.Config;
 import net.sf.l2j.L2DatabaseFactory;
 import net.sf.l2j.gameserver.ThreadPoolManager;
 import net.sf.l2j.gameserver.ai.CtrlIntention;
+import net.sf.l2j.gameserver.datatables.ItemTable;
+import net.sf.l2j.gameserver.handler.IItemHandler;
+import net.sf.l2j.gameserver.handler.ItemHandler;
 import net.sf.l2j.gameserver.idfactory.IdFactory;
 import net.sf.l2j.gameserver.instancemanager.CursedWeaponsManager;
 import net.sf.l2j.gameserver.instancemanager.ItemsOnGroundManager;
@@ -44,13 +47,16 @@ import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.ItemList;
 import net.sf.l2j.gameserver.network.serverpackets.MyTargetSelected;
+import net.sf.l2j.gameserver.network.serverpackets.PetInfo;
 import net.sf.l2j.gameserver.network.serverpackets.PetInventoryUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.PetItemList;
 import net.sf.l2j.gameserver.network.serverpackets.PetStatusShow;
+import net.sf.l2j.gameserver.network.serverpackets.PetStatusUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.StopMove;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 import net.sf.l2j.gameserver.taskmanager.DecayTaskManager;
+import net.sf.l2j.gameserver.templates.L2EtcItemType;
 import net.sf.l2j.gameserver.templates.L2Item;
 import net.sf.l2j.gameserver.templates.L2NpcTemplate;
 import net.sf.l2j.gameserver.templates.L2Weapon;
@@ -386,6 +392,8 @@ public class L2PetInstance extends L2Summon
 	@Override
 	protected void doPickupItem(L2Object object)
 	{
+		boolean follow = getFollowStatus();
+		
 		getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
 		StopMove sm = new StopMove(getObjectId(), getX(), getY(), getZ(), getHeading());
 
@@ -404,14 +412,6 @@ public class L2PetInstance extends L2Summon
 
 		L2ItemInstance target = (L2ItemInstance) object;
 
-		// Herbs
-		if ( target.getItemId() > 8599 && target.getItemId() < 8615 )
-		{
-	        SystemMessage smsg = new SystemMessage(SystemMessageId.FAILED_TO_PICKUP_S1);
-            smsg.addItemName(target.getItemId());
-            getOwner().sendPacket(smsg);
-			return;
-		}
 		// Cursed weapons
 		if ( CursedWeaponsManager.getInstance().isCursed(target.getItemId()) )
 		{
@@ -427,9 +427,9 @@ public class L2PetInstance extends L2Summon
 			{
 				getOwner().sendPacket(ActionFailed.STATIC_PACKET);
 				return;
-			}
-
-            if (target.getOwnerId() != 0 && target.getOwnerId() != getOwner().getObjectId() && !getOwner().isInLooterParty(target.getOwnerId()))
+			}		
+			
+			if (target.getOwnerId() != 0 && target.getOwnerId() != getOwner().getObjectId() && !getOwner().isInLooterParty(target.getOwnerId()))
             {
                 getOwner().sendPacket(ActionFailed.STATIC_PACKET);
 
@@ -462,17 +462,72 @@ public class L2PetInstance extends L2Summon
             target.pickupMe(this);
 
             if(Config.SAVE_DROPPED_ITEM) // item must be removed from ItemsOnGroundManager if is active
-        	ItemsOnGroundManager.getInstance().removeObject(target);
+            	ItemsOnGroundManager.getInstance().removeObject(target);
+		}
+		
+		// Herbs
+		if (target.getItemType() == L2EtcItemType.HERB)
+		{
+			IItemHandler handler = ItemHandler.getInstance().getItemHandler(target.getItemId());
+			if (handler == null)
+				_log.fine("No item handler registered for item ID " + target.getItemId() + ".");
+			else
+				handler.useItem(this, target);
+            
+			ItemTable.getInstance().destroyItem("Consume", target, getOwner(), null);
+	        
+			broadcastStatusUpdate();
+			
+			PetInfo pi = new PetInfo(this);
+			getOwner().sendPacket(pi);
+			
+			// Commented out and moved below synchronized block by DrHouse. 
+			// It seems that pets get full effect of herbs when picking them up by themselves
+			/*
+			SystemMessage smsg = new SystemMessage(SystemMessageId.FAILED_TO_PICKUP_S1);
+            smsg.addItemName(target.getItemId());
+            getOwner().sendPacket(smsg);
+			return; 
+			*/
+		}
+		else
+		{
+			getInventory().addItem("Pickup", target, getOwner(), this);
+			//FIXME Just send the updates if possible (old way wasn't working though)
+			PetItemList iu = new PetItemList(this);
+			getOwner().sendPacket(iu);
+			
+			if (target.getItemId() == 57)
+			{
+				SystemMessage sm2 = new SystemMessage(SystemMessageId.PET_PICKED_S1_ADENA);
+				sm2.addNumber(target.getCount());
+				getOwner().sendPacket(sm2);
+			}
+			else if (target.getEnchantLevel() > 0)
+			{
+				SystemMessage sm2 = new SystemMessage(SystemMessageId.PET_PICKED_S1_S2);
+				sm2.addNumber(target.getEnchantLevel());
+				sm2.addString(target.getName());
+				getOwner().sendPacket(sm2);
+			}
+			else if (target.getCount() > 1)
+			{
+				SystemMessage sm2 = new SystemMessage(SystemMessageId.PET_PICKED_S2_S1_S);
+				sm2.addNumber(target.getCount());
+				sm2.addString(target.getName());
+				getOwner().sendPacket(sm2);
+			}
+			else
+			{
+				SystemMessage sm2 = new SystemMessage(SystemMessageId.PET_PICKED_S1);
+				sm2.addString(target.getName());
+				getOwner().sendPacket(sm2);
+			}
 		}
-
-		getInventory().addItem("Pickup", target, getOwner(), this);
-		//FIXME Just send the updates if possible (old way wasn't working though)
-		PetItemList iu = new PetItemList(this);
-		getOwner().sendPacket(iu);
 
 		getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
 
-		if (getFollowStatus())
+		if (follow)
 			followOwner();
 	}