Pārlūkot izejas kodu

BETA: Hungry pet fixes:
* Added 2 missing system messages related to hungry pets.
* Added uncontrollable state for pets when it's pet hunger gauge is equal to zero.
* Fixed uncontrollable pets should run (animation) at lower speed (like when player is overweight) instead of walking.
* Removed deprecated code.
* Removed duplicated code.
* Uncontrollable pets cannot gain XP.
* Uncontrollable pets cannot pick-up items from the ground.
* Uncontrollable pets cannot obey it's master.
* Uncontrollable pets display a hunger icon over the head (New, awesome).

Video: http://youtu.be/xhDNVIK6qRk

Zoey76 11 gadi atpakaļ
vecāks
revīzija
0ddd80f919

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

@@ -1212,4 +1212,41 @@ public abstract class L2Summon extends L2Playable
 	{
 	{
 		return (getOwner() != null) ? getOwner().getAllyId() : 0;
 		return (getOwner() != null) ? getOwner().getAllyId() : 0;
 	}
 	}
+	
+	public int getFormId()
+	{
+		int formId = 0;
+		final int npcId = getId();
+		if ((npcId == 16041) || (npcId == 16042))
+		{
+			if (getLevel() > 69)
+			{
+				formId = 3;
+			}
+			else if (getLevel() > 64)
+			{
+				formId = 2;
+			}
+			else if (getLevel() > 59)
+			{
+				formId = 1;
+			}
+		}
+		else if ((npcId == 16025) || (npcId == 16037))
+		{
+			if (getLevel() > 69)
+			{
+				formId = 3;
+			}
+			else if (getLevel() > 64)
+			{
+				formId = 2;
+			}
+			else if (getLevel() > 59)
+			{
+				formId = 1;
+			}
+		}
+		return formId;
+	}
 }
 }

+ 25 - 44
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java

@@ -67,6 +67,7 @@ import com.l2jserver.gameserver.model.skills.Skill;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
+import com.l2jserver.gameserver.network.serverpackets.ExChangeNpcState;
 import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
 import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
 import com.l2jserver.gameserver.network.serverpackets.PetInventoryUpdate;
 import com.l2jserver.gameserver.network.serverpackets.PetInventoryUpdate;
 import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
 import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
@@ -141,7 +142,6 @@ public class L2PetInstance extends L2Summon
 				}
 				}
 				else if (getCurrentFed() > getFeedConsume())
 				else if (getCurrentFed() > getFeedConsume())
 				{
 				{
-					// eat
 					setCurrentFed(getCurrentFed() - getFeedConsume());
 					setCurrentFed(getCurrentFed() - getFeedConsume());
 				}
 				}
 				else
 				else
@@ -154,7 +154,7 @@ public class L2PetInstance extends L2Summon
 				List<Integer> foodIds = getPetData().getFood();
 				List<Integer> foodIds = getPetData().getFood();
 				if (foodIds.isEmpty())
 				if (foodIds.isEmpty())
 				{
 				{
-					if (getCurrentFed() == 0)
+					if (isUncontrollable())
 					{
 					{
 						// Owl Monk remove PK
 						// Owl Monk remove PK
 						if ((getTemplate().getId() == 16050) && (getOwner() != null))
 						if ((getTemplate().getId() == 16050) && (getOwner() != null))
@@ -170,6 +170,7 @@ public class L2PetInstance extends L2Summon
 					}
 					}
 					return;
 					return;
 				}
 				}
+				
 				L2ItemInstance food = null;
 				L2ItemInstance food = null;
 				for (int id : foodIds)
 				for (int id : foodIds)
 				{
 				{
@@ -179,55 +180,24 @@ public class L2PetInstance extends L2Summon
 						break;
 						break;
 					}
 					}
 				}
 				}
-				if (isRunning() && isHungry())
-				{
-					setWalking();
-				}
-				else if (!isHungry() && !isRunning())
-				{
-					setRunning();
-				}
+				
 				if ((food != null) && isHungry())
 				if ((food != null) && isHungry())
 				{
 				{
-					IItemHandler handler = ItemHandler.getInstance().getHandler(food.getEtcItem());
+					final IItemHandler handler = ItemHandler.getInstance().getHandler(food.getEtcItem());
 					if (handler != null)
 					if (handler != null)
 					{
 					{
 						SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PET_TOOK_S1_BECAUSE_HE_WAS_HUNGRY);
 						SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PET_TOOK_S1_BECAUSE_HE_WAS_HUNGRY);
 						sm.addItemName(food.getId());
 						sm.addItemName(food.getId());
 						sendPacket(sm);
 						sendPacket(sm);
 						handler.useItem(L2PetInstance.this, food, false);
 						handler.useItem(L2PetInstance.this, food, false);
+						broadcastPacket(new ExChangeNpcState(getObjectId(), 0x65));
 					}
 					}
 				}
 				}
-				else
+				
+				if (isUncontrollable())
 				{
 				{
-					if (getCurrentFed() == 0)
-					{
-						SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOUR_PET_IS_VERY_HUNGRY);
-						sendPacket(sm);
-						// High Five: Your Pet won't be gone even when you don't feed it.
-						// if (Rnd.get(100) < 30)
-						// {
-						// stopFeed();
-						// sm = SystemMessage.getSystemMessage(SystemMessageId.STARVING_GRUMPY_AND_FED_UP_YOUR_PET_HAS_LEFT);
-						// sendPacket(sm);
-						// _log.info("Hungry pet [" + getTemplate().getName() + "][" + getLevel() + "] deleted for player: " + getOwner() + " Control Item Id :" + getControlObjectId());
-						// deleteMe(getOwner());
-						// }
-					}
-					// High Five: Your Pet won't be gone even when you don't feed it.
-					// /else if (getCurrentFed() < (0.10 * getPetLevelData().getPetMaxFeed()))
-					// {
-					// SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PET_CAN_RUN_AWAY_WHEN_HUNGER_BELOW_10_PERCENT);
-					// sendPacket(sm);
-					// if (Rnd.get(100) < 3)
-					// {
-					// stopFeed();
-					// sm = SystemMessage.getSystemMessage(SystemMessageId.STARVING_GRUMPY_AND_FED_UP_YOUR_PET_HAS_LEFT);
-					// sendPacket(sm);
-					// _log.info("Hungry pet [" + getTemplate().getName() + "][" + getLevel() + "] deleted for player: " + getOwner() + " Control Item Id :" + getControlObjectId());
-					// deleteMe(getOwner());
-					// }
-					// }
+					sendPacket(SystemMessageId.YOUR_PET_IS_STARVING_AND_WILL_NOT_OBEY_UNTIL_IT_GETS_ITS_FOOD_FEED_YOUR_PET);
+					broadcastPacket(new ExChangeNpcState(getObjectId(), 0x64));
 				}
 				}
 			}
 			}
 			catch (Exception e)
 			catch (Exception e)
@@ -236,9 +206,6 @@ public class L2PetInstance extends L2Summon
 			}
 			}
 		}
 		}
 		
 		
-		/**
-		 * @return
-		 */
 		private int getFeedConsume()
 		private int getFeedConsume()
 		{
 		{
 			// if pet is attacking
 			// if pet is attacking
@@ -269,8 +236,12 @@ public class L2PetInstance extends L2Summon
 				pet.getStat().setExp(pet.getStat().getExpForLevel(owner.getLevel()));
 				pet.getStat().setExp(pet.getStat().getExpForLevel(owner.getLevel()));
 			}
 			}
 			L2World.getInstance().addPet(owner.getObjectId(), pet);
 			L2World.getInstance().addPet(owner.getObjectId(), pet);
+			
+			if (pet.isUncontrollable())
+			{
+				owner.sendPacket(new ExChangeNpcState(pet.getObjectId(), 0x64));
+			}
 		}
 		}
-		
 		return pet;
 		return pet;
 	}
 	}
 	
 	
@@ -1385,6 +1356,16 @@ public class L2PetInstance extends L2Summon
 		return getCurrentFed() < ((getPetData().getHungryLimit() / 100f) * getPetLevelData().getPetMaxFeed());
 		return getCurrentFed() < ((getPetData().getHungryLimit() / 100f) * getPetLevelData().getPetMaxFeed());
 	}
 	}
 	
 	
+	/**
+	 * Verifies if a pet can be controlled by it's owner.<br>
+	 * Starving pets cannot be controlled.
+	 * @return {@code true} if the per cannot be controlled
+	 */
+	public boolean isUncontrollable()
+	{
+		return getCurrentFed() <= 0;
+	}
+	
 	@Override
 	@Override
 	public final int getWeapon()
 	public final int getWeapon()
 	{
 	{

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

@@ -380,7 +380,7 @@ public class CharStat
 		return (int) calcStat(Stats.STAT_MEN, _activeChar.getTemplate().getBaseMEN());
 		return (int) calcStat(Stats.STAT_MEN, _activeChar.getTemplate().getBaseMEN());
 	}
 	}
 	
 	
-	public final float getMovementSpeedMultiplier()
+	public float getMovementSpeedMultiplier()
 	{
 	{
 		float baseSpeed;
 		float baseSpeed;
 		if (_activeChar.isInsideZone(ZoneId.WATER))
 		if (_activeChar.isInsideZone(ZoneId.WATER))

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

@@ -38,7 +38,7 @@ public class PetStat extends SummonStat
 	
 	
 	public boolean addExp(int value)
 	public boolean addExp(int value)
 	{
 	{
-		if (!super.addExp(value))
+		if (getActiveChar().isUncontrollable() || !super.addExp(value))
 		{
 		{
 			return false;
 			return false;
 		}
 		}
@@ -52,7 +52,7 @@ public class PetStat extends SummonStat
 	
 	
 	public boolean addExpAndSp(long addToExp, int addToSp)
 	public boolean addExpAndSp(long addToExp, int addToSp)
 	{
 	{
-		if (!addExp(addToExp))
+		if (getActiveChar().isUncontrollable() || !addExp(addToExp))
 		{
 		{
 			return false;
 			return false;
 		}
 		}
@@ -217,4 +217,11 @@ public class PetStat extends SummonStat
 	{
 	{
 		return ExperienceTable.getInstance().getMaxPetLevel();
 		return ExperienceTable.getInstance().getMaxPetLevel();
 	}
 	}
+	
+	@Override
+	public float getMovementSpeedMultiplier()
+	{
+		// If the pet is starving, the moving speed is drastically reduced.
+		return super.getMovementSpeedMultiplier() * (getActiveChar().isUncontrollable() ? 0.5f : 1f);
+	}
 }
 }

+ 14 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/SystemMessageId.java

@@ -15086,6 +15086,18 @@ public final class SystemMessageId
 	 */
 	 */
 	public static final SystemMessageId YOU_OBTAINED_S1_RECOMMENDATIONS;
 	public static final SystemMessageId YOU_OBTAINED_S1_RECOMMENDATIONS;
 	
 	
+	/**
+	 * ID: 3212<br>
+	 * Message: When your pet's hunger gauge is at 0%, you cannot use your pet.
+	 */
+	public static final SystemMessageId WHEN_YOUR_PETS_HUNGER_GAUGE_IS_AT_0_YOU_CANNOT_USE_YOUR_PET;
+	
+	/**
+	 * ID: 3213<br>
+	 * Message: Your pet is starving and will not obey until it gets it's food. Feed your pet!
+	 */
+	public static final SystemMessageId YOUR_PET_IS_STARVING_AND_WILL_NOT_OBEY_UNTIL_IT_GETS_ITS_FOOD_FEED_YOUR_PET;
+	
 	/**
 	/**
 	 * ID: 3214<br>
 	 * ID: 3214<br>
 	 * Message: $s1 was successfully added to your Contact List.
 	 * Message: $s1 was successfully added to your Contact List.
@@ -17709,6 +17721,8 @@ public final class SystemMessageId
 		C1_IS_SET_TO_REFUSE_DUEL_REQUEST = new SystemMessageId(3169);
 		C1_IS_SET_TO_REFUSE_DUEL_REQUEST = new SystemMessageId(3169);
 		YOU_CURRENTLY_DO_NOT_HAVE_ANY_RECOMMENDATIONS = new SystemMessageId(3206);
 		YOU_CURRENTLY_DO_NOT_HAVE_ANY_RECOMMENDATIONS = new SystemMessageId(3206);
 		YOU_OBTAINED_S1_RECOMMENDATIONS = new SystemMessageId(3207);
 		YOU_OBTAINED_S1_RECOMMENDATIONS = new SystemMessageId(3207);
+		WHEN_YOUR_PETS_HUNGER_GAUGE_IS_AT_0_YOU_CANNOT_USE_YOUR_PET = new SystemMessageId(3212);
+		YOUR_PET_IS_STARVING_AND_WILL_NOT_OBEY_UNTIL_IT_GETS_ITS_FOOD_FEED_YOUR_PET = new SystemMessageId(3213);
 		S1_SUCCESSFULLY_ADDED_TO_CONTACT_LIST = new SystemMessageId(3214);
 		S1_SUCCESSFULLY_ADDED_TO_CONTACT_LIST = new SystemMessageId(3214);
 		NAME_S1_NOT_EXIST_TRY_ANOTHER_NAME = new SystemMessageId(3215);
 		NAME_S1_NOT_EXIST_TRY_ANOTHER_NAME = new SystemMessageId(3215);
 		NAME_ALREADY_EXIST_ON_CONTACT_LIST = new SystemMessageId(3216);
 		NAME_ALREADY_EXIST_ON_CONTACT_LIST = new SystemMessageId(3216);

+ 33 - 47
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestActionUse.java

@@ -147,14 +147,7 @@ public final class RequestActionUse extends L2GameClientPacket
 				{
 				{
 					// Sit when arrive using next action.
 					// Sit when arrive using next action.
 					// Creating next action class.
 					// Creating next action class.
-					final NextAction nextAction = new NextAction(CtrlEvent.EVT_ARRIVED, CtrlIntention.AI_INTENTION_MOVE_TO, new NextActionCallback()
-					{
-						@Override
-						public void doWork()
-						{
-							useSit(activeChar, target);
-						}
-					});
+					final NextAction nextAction = new NextAction(CtrlEvent.EVT_ARRIVED, CtrlIntention.AI_INTENTION_MOVE_TO, (NextActionCallback) () -> useSit(activeChar, target));
 					
 					
 					// Binding next action to AI.
 					// Binding next action to AI.
 					activeChar.getAI().setNextAction(nextAction);
 					activeChar.getAI().setNextAction(nextAction);
@@ -195,35 +188,37 @@ public final class RequestActionUse extends L2GameClientPacket
 				}
 				}
 				break;
 				break;
 			case 19: // Unsummon Pet
 			case 19: // Unsummon Pet
-				if (validateSummon(summon, true))
+				if (summon.isDead())
 				{
 				{
-					// returns pet to control item
-					if (summon.isDead())
-					{
-						sendPacket(SystemMessageId.DEAD_PET_CANNOT_BE_RETURNED);
-						break;
-					}
-					
-					if (summon.isAttackingNow() || summon.isInCombat() || summon.isMovementDisabled())
+					sendPacket(SystemMessageId.DEAD_PET_CANNOT_BE_RETURNED);
+					break;
+				}
+				
+				if (summon.isAttackingNow() || summon.isInCombat() || summon.isMovementDisabled())
+				{
+					sendPacket(SystemMessageId.PET_CANNOT_SENT_BACK_DURING_BATTLE);
+					break;
+				}
+				
+				if (summon.isHungry())
+				{
+					if (summon.isPet() && !((L2PetInstance) summon).getPetData().getFood().isEmpty())
 					{
 					{
-						sendPacket(SystemMessageId.PET_CANNOT_SENT_BACK_DURING_BATTLE);
-						break;
+						sendPacket(SystemMessageId.YOU_CANNOT_RESTORE_HUNGRY_PETS);
 					}
 					}
-					
-					if (summon.isHungry())
+					else
 					{
 					{
-						if (!((L2PetInstance) summon).getPetData().getFood().isEmpty())
-						{
-							sendPacket(SystemMessageId.YOU_CANNOT_RESTORE_HUNGRY_PETS);
-						}
-						else
-						{
-							sendPacket(SystemMessageId.THE_HELPER_PET_CANNOT_BE_RETURNED);
-						}
-						break;
+						sendPacket(SystemMessageId.THE_HELPER_PET_CANNOT_BE_RETURNED);
 					}
 					}
-					summon.unSummon(activeChar);
+					break;
 				}
 				}
+				
+				if (!validateSummon(summon, true))
+				{
+					break;
+				}
+				
+				summon.unSummon(activeChar);
 				break;
 				break;
 			case 21: // Change Movement Mode (Servitors)
 			case 21: // Change Movement Mode (Servitors)
 				if (validateSummon(summon, false))
 				if (validateSummon(summon, false))
@@ -903,6 +898,11 @@ public final class RequestActionUse extends L2GameClientPacket
 	{
 	{
 		if ((summon != null) && ((checkPet && summon.isPet()) || summon.isServitor()))
 		if ((summon != null) && ((checkPet && summon.isPet()) || summon.isServitor()))
 		{
 		{
+			if (summon.isPet() && ((L2PetInstance) summon).isUncontrollable())
+			{
+				sendPacket(SystemMessageId.WHEN_YOUR_PETS_HUNGER_GAUGE_IS_AT_0_YOU_CANNOT_USE_YOUR_PET);
+				return false;
+			}
 			if (summon.isBetrayed())
 			if (summon.isBetrayed())
 			{
 			{
 				sendPacket(SystemMessageId.PET_REFUSING_ORDER);
 				sendPacket(SystemMessageId.PET_REFUSING_ORDER);
@@ -1160,28 +1160,14 @@ public final class RequestActionUse extends L2GameClientPacket
 		
 		
 		if ((requester.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE) || (partner.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE))
 		if ((requester.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE) || (partner.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE))
 		{
 		{
-			final NextAction nextAction = new NextAction(CtrlEvent.EVT_ARRIVED, CtrlIntention.AI_INTENTION_MOVE_TO, new NextActionCallback()
-			{
-				@Override
-				public void doWork()
-				{
-					partner.sendPacket(new ExAskCoupleAction(requester.getObjectId(), id));
-				}
-			});
+			final NextAction nextAction = new NextAction(CtrlEvent.EVT_ARRIVED, CtrlIntention.AI_INTENTION_MOVE_TO, (NextActionCallback) () -> partner.sendPacket(new ExAskCoupleAction(requester.getObjectId(), id)));
 			requester.getAI().setNextAction(nextAction);
 			requester.getAI().setNextAction(nextAction);
 			return;
 			return;
 		}
 		}
 		
 		
 		if (requester.isCastingNow() || requester.isCastingSimultaneouslyNow())
 		if (requester.isCastingNow() || requester.isCastingSimultaneouslyNow())
 		{
 		{
-			final NextAction nextAction = new NextAction(CtrlEvent.EVT_FINISH_CASTING, CtrlIntention.AI_INTENTION_CAST, new NextActionCallback()
-			{
-				@Override
-				public void doWork()
-				{
-					partner.sendPacket(new ExAskCoupleAction(requester.getObjectId(), id));
-				}
-			});
+			final NextAction nextAction = new NextAction(CtrlEvent.EVT_FINISH_CASTING, CtrlIntention.AI_INTENTION_CAST, (NextActionCallback) () -> partner.sendPacket(new ExAskCoupleAction(requester.getObjectId(), id)));
 			requester.getAI().setNextAction(nextAction);
 			requester.getAI().setNextAction(nextAction);
 			return;
 			return;
 		}
 		}

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

@@ -24,6 +24,7 @@ import com.l2jserver.gameserver.instancemanager.MercTicketManager;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
+import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 
 
 public final class RequestPetGetItem extends L2GameClientPacket
 public final class RequestPetGetItem extends L2GameClientPacket
@@ -69,6 +70,12 @@ public final class RequestPetGetItem extends L2GameClientPacket
 			return;
 			return;
 		}
 		}
 		
 		
+		if (pet.isUncontrollable())
+		{
+			sendPacket(SystemMessageId.WHEN_YOUR_PETS_HUNGER_GAUGE_IS_AT_0_YOU_CANNOT_USE_YOUR_PET);
+			return;
+		}
+		
 		pet.getAI().setIntention(CtrlIntention.AI_INTENTION_PICK_UP, item);
 		pet.getAI().setIntention(CtrlIntention.AI_INTENTION_PICK_UP, item);
 	}
 	}
 	
 	

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

@@ -295,65 +295,28 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 	}
 	}
 	
 	
 	/**
 	/**
-	 * Packet for summons
+	 * Packet for summons.
 	 */
 	 */
 	public static class SummonInfo extends AbstractNpcInfo
 	public static class SummonInfo extends AbstractNpcInfo
 	{
 	{
 		private final L2Summon _summon;
 		private final L2Summon _summon;
-		private int _form = 0;
-		private int _val = 0;
+		private final int _form;
+		private final int _val;
 		
 		
 		public SummonInfo(L2Summon cha, L2Character attacker, int val)
 		public SummonInfo(L2Summon cha, L2Character attacker, int val)
 		{
 		{
 			super(cha);
 			super(cha);
 			_summon = cha;
 			_summon = cha;
 			_val = val;
 			_val = val;
-			if (_summon.isShowSummonAnimation())
-			{
-				_val = 2; // override for spawn
-			}
-			
-			int npcId = cha.getTemplate().getId();
-			
-			if ((npcId == 16041) || (npcId == 16042))
-			{
-				if (cha.getLevel() > 69)
-				{
-					_form = 3;
-				}
-				else if (cha.getLevel() > 64)
-				{
-					_form = 2;
-				}
-				else if (cha.getLevel() > 59)
-				{
-					_form = 1;
-				}
-			}
-			else if ((npcId == 16025) || (npcId == 16037))
-			{
-				if (cha.getLevel() > 69)
-				{
-					_form = 3;
-				}
-				else if (cha.getLevel() > 64)
-				{
-					_form = 2;
-				}
-				else if (cha.getLevel() > 59)
-				{
-					_form = 1;
-				}
-			}
+			_form = cha.getFormId();
 			
 			
-			// fields not set on AbstractNpcInfo
 			_isAttackable = cha.isAutoAttackable(attacker);
 			_isAttackable = cha.isAutoAttackable(attacker);
 			_rhand = cha.getWeapon();
 			_rhand = cha.getWeapon();
 			_lhand = 0;
 			_lhand = 0;
 			_chest = cha.getArmor();
 			_chest = cha.getArmor();
 			_enchantEffect = cha.getTemplate().getWeaponEnchant();
 			_enchantEffect = cha.getTemplate().getWeaponEnchant();
 			_name = cha.getName();
 			_name = cha.getName();
-			_title = cha.getOwner() != null ? ((!cha.getOwner().isOnline()) ? "" : cha.getOwner().getName()) : ""; // when owner online, summon will show in title owner name
+			_title = (cha.getOwner() != null) && cha.getOwner().isOnline() ? cha.getOwner().getName() : "";
 			_idTemplate = cha.getTemplate().getDisplayId();
 			_idTemplate = cha.getTemplate().getDisplayId();
 			_collisionHeight = cha.getTemplate().getfCollisionHeight();
 			_collisionHeight = cha.getTemplate().getfCollisionHeight();
 			_collisionRadius = cha.getTemplate().getfCollisionRadius();
 			_collisionRadius = cha.getTemplate().getfCollisionRadius();

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

@@ -63,7 +63,7 @@ public class PetInfo extends L2GameServerPacket
 		_val = val;
 		_val = val;
 		if (summon.isPet())
 		if (summon.isPet())
 		{
 		{
-			final L2PetInstance pet = (L2PetInstance) summon;
+			final L2PetInstance pet = (L2PetInstance) _summon;
 			_curFed = pet.getCurrentFed(); // how fed it is
 			_curFed = pet.getCurrentFed(); // how fed it is
 			_maxFed = pet.getMaxFed(); // max fed it can be
 			_maxFed = pet.getMaxFed(); // max fed it can be
 		}
 		}
@@ -112,7 +112,7 @@ public class PetInfo extends L2GameServerPacket
 		writeC(_summon.isAlikeDead() ? 1 : 0); // dead 1=true
 		writeC(_summon.isAlikeDead() ? 1 : 0); // dead 1=true
 		writeC(_isSummoned ? 2 : _val); // 0=teleported 1=default 2=summoned
 		writeC(_isSummoned ? 2 : _val); // 0=teleported 1=default 2=summoned
 		writeD(-1); // High Five NPCString ID
 		writeD(-1); // High Five NPCString ID
-		if (_summon instanceof L2PetInstance)
+		if (_summon.isPet())
 		{
 		{
 			writeS(_summon.getName()); // Pet name.
 			writeS(_summon.getName()); // Pet name.
 		}
 		}
@@ -145,7 +145,7 @@ public class PetInfo extends L2GameServerPacket
 		}
 		}
 		
 		
 		writeQ(_summon.getExpForNextLevel());// 100% absoulte value
 		writeQ(_summon.getExpForNextLevel());// 100% absoulte value
-		writeD(_summon instanceof L2PetInstance ? _summon.getInventory().getTotalWeight() : 0);// weight
+		writeD(_summon.isPet() ? _summon.getInventory().getTotalWeight() : 0);// weight
 		writeD(_summon.getMaxLoad());// max weight it can carry
 		writeD(_summon.getMaxLoad());// max weight it can carry
 		writeD(_summon.getPAtk(null));// patk
 		writeD(_summon.getPAtk(null));// patk
 		writeD(_summon.getPDef(null));// pdef
 		writeD(_summon.getPDef(null));// pdef
@@ -168,40 +168,7 @@ public class PetInfo extends L2GameServerPacket
 		writeC(_summon.getTeam().getId());
 		writeC(_summon.getTeam().getId());
 		writeD(_summon.getSoulShotsPerHit()); // How many soulshots this servitor uses per hit
 		writeD(_summon.getSoulShotsPerHit()); // How many soulshots this servitor uses per hit
 		writeD(_summon.getSpiritShotsPerHit()); // How many spiritshots this servitor uses per hit
 		writeD(_summon.getSpiritShotsPerHit()); // How many spiritshots this servitor uses per hit
-		
-		int form = 0;
-		final int npcId = _summon.getId();
-		if ((npcId == 16041) || (npcId == 16042))
-		{
-			if (_summon.getLevel() > 69)
-			{
-				form = 3;
-			}
-			else if (_summon.getLevel() > 64)
-			{
-				form = 2;
-			}
-			else if (_summon.getLevel() > 59)
-			{
-				form = 1;
-			}
-		}
-		else if ((npcId == 16025) || (npcId == 16037))
-		{
-			if (_summon.getLevel() > 69)
-			{
-				form = 3;
-			}
-			else if (_summon.getLevel() > 64)
-			{
-				form = 2;
-			}
-			else if (_summon.getLevel() > 59)
-			{
-				form = 1;
-			}
-		}
-		writeD(form);// CT1.5 Pet form and skills
+		writeD(_summon.getFormId());// CT1.5 Pet form and skills
 		writeD(_summon.getAbnormalVisualEffectSpecial());
 		writeD(_summon.getAbnormalVisualEffectSpecial());
 	}
 	}
 }
 }

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

@@ -29,14 +29,11 @@ import com.l2jserver.gameserver.model.actor.instance.L2ServitorInstance;
 public class PetStatusUpdate extends L2GameServerPacket
 public class PetStatusUpdate extends L2GameServerPacket
 {
 {
 	private final L2Summon _summon;
 	private final L2Summon _summon;
-	private final int _maxHp, _maxMp;
 	private int _maxFed, _curFed;
 	private int _maxFed, _curFed;
 	
 	
 	public PetStatusUpdate(L2Summon summon)
 	public PetStatusUpdate(L2Summon summon)
 	{
 	{
 		_summon = summon;
 		_summon = summon;
-		_maxHp = _summon.getMaxHp();
-		_maxMp = _summon.getMaxMp();
 		if (_summon instanceof L2PetInstance)
 		if (_summon instanceof L2PetInstance)
 		{
 		{
 			L2PetInstance pet = (L2PetInstance) _summon;
 			L2PetInstance pet = (L2PetInstance) _summon;
@@ -60,13 +57,13 @@ public class PetStatusUpdate extends L2GameServerPacket
 		writeD(_summon.getX());
 		writeD(_summon.getX());
 		writeD(_summon.getY());
 		writeD(_summon.getY());
 		writeD(_summon.getZ());
 		writeD(_summon.getZ());
-		writeS("");
+		writeS(_summon.getTitle());
 		writeD(_curFed);
 		writeD(_curFed);
 		writeD(_maxFed);
 		writeD(_maxFed);
 		writeD((int) _summon.getCurrentHp());
 		writeD((int) _summon.getCurrentHp());
-		writeD(_maxHp);
+		writeD(_summon.getMaxHp());
 		writeD((int) _summon.getCurrentMp());
 		writeD((int) _summon.getCurrentMp());
-		writeD(_maxMp);
+		writeD(_summon.getMaxMp());
 		writeD(_summon.getLevel());
 		writeD(_summon.getLevel());
 		writeQ(_summon.getStat().getExp());
 		writeQ(_summon.getStat().getExp());
 		writeQ(_summon.getExpForThisLevel()); // 0% absolute value
 		writeQ(_summon.getExpForThisLevel()); // 0% absolute value