Browse Source

NpcInfo now is AbstractNpcInfo, an abstract class with different static childclasses for every argument (L2Summon, L2Npc, L2Trap, L2Decoy).
Constructor and writeImpl methods have been adapted for each argument.

Also fixing [2933], which was my mistake. Fixes #3640

DrHouse 16 năm trước cách đây
mục cha
commit
aecb1deb60

+ 3 - 3
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/L2Character.java

@@ -86,6 +86,7 @@ import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
 import net.sf.l2j.gameserver.model.quest.Quest;
 import net.sf.l2j.gameserver.model.quest.QuestState;
 import net.sf.l2j.gameserver.network.SystemMessageId;
+import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.network.serverpackets.Attack;
 import net.sf.l2j.gameserver.network.serverpackets.ChangeMoveType;
@@ -97,7 +98,6 @@ import net.sf.l2j.gameserver.network.serverpackets.MagicSkillCanceld;
 import net.sf.l2j.gameserver.network.serverpackets.MagicSkillLaunched;
 import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
 import net.sf.l2j.gameserver.network.serverpackets.MoveToLocation;
-import net.sf.l2j.gameserver.network.serverpackets.NpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.Revive;
 import net.sf.l2j.gameserver.network.serverpackets.ServerObjectInfo;
 import net.sf.l2j.gameserver.network.serverpackets.SetupGauge;
@@ -2248,7 +2248,7 @@ public abstract class L2Character extends L2Object
 					if (getRunSpeed() == 0)
 						player.sendPacket(new ServerObjectInfo((L2Npc) this, player));
 					else
-						player.sendPacket(new NpcInfo((L2Npc) this, player));
+						player.sendPacket(new AbstractNpcInfo.NpcInfo((L2Npc) this, player));
 				}
 			}
 		}
@@ -3755,7 +3755,7 @@ public abstract class L2Character extends L2Object
 						if (getRunSpeed() == 0)
 							player.sendPacket(new ServerObjectInfo((L2Npc)this, player));
 						else
-							player.sendPacket(new NpcInfo((L2Npc)this, player));
+							player.sendPacket(new AbstractNpcInfo.NpcInfo((L2Npc)this, player));
 					}
 				}
 			}

+ 3 - 3
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/L2Decoy.java

@@ -19,8 +19,8 @@ import java.util.Collection;
 
 import net.sf.l2j.gameserver.model.L2ItemInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.MyTargetSelected;
-import net.sf.l2j.gameserver.network.serverpackets.NpcInfo;
 import net.sf.l2j.gameserver.taskmanager.DecayTaskManager;
 import net.sf.l2j.gameserver.templates.chars.L2CharTemplate;
 import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
@@ -44,7 +44,7 @@ public abstract class L2Decoy extends L2Character
     public void onSpawn()
     {
         super.onSpawn();
-        this.getOwner().sendPacket(new NpcInfo(this));
+        this.getOwner().sendPacket(new AbstractNpcInfo.DecoyInfo(this));
     }
     
     @Override
@@ -63,7 +63,7 @@ public abstract class L2Decoy extends L2Character
     	//synchronized (getKnownList().getKnownPlayers())
 		{
 			for (L2PcInstance player : plrs)
-				player.sendPacket(new NpcInfo(this));
+				player.sendPacket(new AbstractNpcInfo.DecoyInfo(this));
 		}
     }
     

+ 2 - 2
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/L2Npc.java

@@ -76,6 +76,7 @@ import net.sf.l2j.gameserver.model.quest.State;
 import net.sf.l2j.gameserver.model.zone.type.L2TownZone;
 import net.sf.l2j.gameserver.network.L2GameClient;
 import net.sf.l2j.gameserver.network.SystemMessageId;
+import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.network.serverpackets.EtcStatusUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.ExShowBaseAttributeCancelWindow;
@@ -85,7 +86,6 @@ import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
 import net.sf.l2j.gameserver.network.serverpackets.MyTargetSelected;
 import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
-import net.sf.l2j.gameserver.network.serverpackets.NpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.RadarControl;
 import net.sf.l2j.gameserver.network.serverpackets.ServerObjectInfo;
 import net.sf.l2j.gameserver.network.serverpackets.SocialAction;
@@ -380,7 +380,7 @@ public class L2Npc extends L2Character
 				if (getRunSpeed() == 0)
 					player.sendPacket(new ServerObjectInfo(this, player));
 				else
-					player.sendPacket(new NpcInfo(this, player));
+					player.sendPacket(new AbstractNpcInfo.NpcInfo(this, player));
 			}
 		}
 	}

+ 3 - 9
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/L2Summon.java

@@ -40,12 +40,12 @@ import net.sf.l2j.gameserver.model.base.Experience;
 import net.sf.l2j.gameserver.model.itemcontainer.PetInventory;
 import net.sf.l2j.gameserver.model.olympiad.Olympiad;
 import net.sf.l2j.gameserver.network.SystemMessageId;
+import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.network.serverpackets.ExPartyPetWindowAdd;
 import net.sf.l2j.gameserver.network.serverpackets.ExPartyPetWindowDelete;
 import net.sf.l2j.gameserver.network.serverpackets.ExPartyPetWindowUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.MyTargetSelected;
-import net.sf.l2j.gameserver.network.serverpackets.NpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.PartySpelled;
 import net.sf.l2j.gameserver.network.serverpackets.PetDelete;
 import net.sf.l2j.gameserver.network.serverpackets.PetInfo;
@@ -179,7 +179,7 @@ public abstract class L2Summon extends L2Playable
 		//synchronized (getKnownList().getKnownPlayers())
 		{
 			for (L2PcInstance player : plrs)
-				player.sendPacket(new NpcInfo(this, player,1));
+				player.sendPacket(new AbstractNpcInfo.SummonInfo(this, player,1));
 		}
     }
 
@@ -875,7 +875,7 @@ public abstract class L2Summon extends L2Playable
 			{
 				if (player == getOwner())
 					continue;
-				player.sendPacket(new NpcInfo(this,player, val));
+				player.sendPacket(new AbstractNpcInfo.SummonInfo(this,player, val));
 			}
 			catch (NullPointerException e)
 			{
@@ -907,10 +907,4 @@ public abstract class L2Summon extends L2Playable
 	{
 		return getTemplate().baseRunSpd;
 	}
-	
-	@Override
-	public boolean isRunning()
-	{
-		return true; // summons always run
-	}
 }

+ 2 - 2
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2TamedBeastInstance.java

@@ -26,7 +26,7 @@ import net.sf.l2j.gameserver.model.L2ItemInstance;
 import net.sf.l2j.gameserver.model.L2Object;
 import net.sf.l2j.gameserver.model.L2Skill;
 import net.sf.l2j.gameserver.model.actor.L2Character;
-import net.sf.l2j.gameserver.network.serverpackets.NpcInfo;
+import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.StopMove;
 import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
 import net.sf.l2j.gameserver.templates.skills.L2SkillType;
@@ -158,7 +158,7 @@ public final class L2TamedBeastInstance extends L2FeedableBeastInstance
         	_owner = owner;
 	    	setTitle(owner.getName());
 	    	// broadcast the new title
-	    	broadcastPacket( new NpcInfo(this, owner) );
+	    	broadcastPacket( new AbstractNpcInfo.NpcInfo(this, owner) );
 
 	    	owner.setTrainedBeast(this);
 

+ 5 - 5
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/knownlist/PcKnownList.java

@@ -30,13 +30,13 @@ import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2StaticObjectInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2TrapInstance;
+import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.CharInfo;
 import net.sf.l2j.gameserver.network.serverpackets.DeleteObject;
 import net.sf.l2j.gameserver.network.serverpackets.DropItem;
 import net.sf.l2j.gameserver.network.serverpackets.ExBrExtraUserInfo;
 import net.sf.l2j.gameserver.network.serverpackets.ExPrivateStoreSetWholeMsg;
 import net.sf.l2j.gameserver.network.serverpackets.GetOnVehicle;
-import net.sf.l2j.gameserver.network.serverpackets.NpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.PetInfo;
 import net.sf.l2j.gameserver.network.serverpackets.PetItemList;
 import net.sf.l2j.gameserver.network.serverpackets.PrivateStoreMsgBuy;
@@ -132,11 +132,11 @@ public class PcKnownList extends PlayableKnownList
             }
             else if (object instanceof L2Decoy || object instanceof L2DecoyInstance)
             {
-                getActiveChar().sendPacket(new NpcInfo((L2Decoy) object));
+                getActiveChar().sendPacket(new AbstractNpcInfo.DecoyInfo((L2Decoy)object));
             }
             else if (object instanceof L2Trap || object instanceof L2TrapInstance)
             {
-            	getActiveChar().sendPacket(new NpcInfo((L2Trap) object, getActiveChar()));
+            	getActiveChar().sendPacket(new AbstractNpcInfo.TrapInfo((L2Trap) object, getActiveChar()));
             }
             else if (object instanceof L2Npc)
             {
@@ -144,7 +144,7 @@ public class PcKnownList extends PlayableKnownList
                 if (((L2Npc) object).getRunSpeed() == 0)
                 	getActiveChar().sendPacket(new ServerObjectInfo((L2Npc) object, getActiveChar()));
                 else
-                	getActiveChar().sendPacket(new NpcInfo((L2Npc) object, getActiveChar()));
+                	getActiveChar().sendPacket(new AbstractNpcInfo.NpcInfo((L2Npc) object, getActiveChar()));
             }
             else if (object instanceof L2Summon)
             {
@@ -162,7 +162,7 @@ public class PcKnownList extends PlayableKnownList
                     }
                 }
                 else
-                    getActiveChar().sendPacket(new NpcInfo(summon, getActiveChar(),0));
+                    getActiveChar().sendPacket(new AbstractNpcInfo.SummonInfo(summon, getActiveChar(),0));
             }
             else if (object instanceof L2PcInstance)
             {	            	

+ 3 - 3
L2_GameServer/java/net/sf/l2j/gameserver/model/zone/type/L2WaterZone.java

@@ -20,7 +20,7 @@ import net.sf.l2j.gameserver.model.actor.L2Character;
 import net.sf.l2j.gameserver.model.actor.L2Npc;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.model.zone.L2ZoneType;
-import net.sf.l2j.gameserver.network.serverpackets.NpcInfo;
+import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.ServerObjectInfo;
 
 public class L2WaterZone extends L2ZoneType
@@ -56,7 +56,7 @@ public class L2WaterZone extends L2ZoneType
 					if (character.getRunSpeed() == 0)
 						player.sendPacket(new ServerObjectInfo((L2Npc)character, player));
 					else
-						player.sendPacket(new NpcInfo((L2Npc) character, player));
+						player.sendPacket(new AbstractNpcInfo.NpcInfo((L2Npc) character, player));
 				}
 			}
 		}
@@ -92,7 +92,7 @@ public class L2WaterZone extends L2ZoneType
 					if (character.getRunSpeed() == 0)
 						player.sendPacket(new ServerObjectInfo((L2Npc)character, player));
 					else
-						player.sendPacket(new NpcInfo((L2Npc) character, player));
+						player.sendPacket(new AbstractNpcInfo.NpcInfo((L2Npc) character, player));
 				}
 			}
 		}

+ 2 - 2
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestChangePetName.java

@@ -20,8 +20,8 @@ import net.sf.l2j.gameserver.model.actor.L2Character;
 import net.sf.l2j.gameserver.model.actor.L2Summon;
 import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
 import net.sf.l2j.gameserver.network.SystemMessageId;
+import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
-import net.sf.l2j.gameserver.network.serverpackets.NpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 
 /**
@@ -76,7 +76,7 @@ public final class RequestChangePetName extends L2GameClientPacket
 		}
 
 		pet.setName(_name);
-		pet.broadcastPacket(new NpcInfo(pet, activeChar,1));
+		pet.broadcastPacket(new AbstractNpcInfo.SummonInfo(pet, activeChar,1));
 		pet.updateAndBroadcastStatus(1);
 
 		// set the flag on the control item to say that the pet has a name

+ 3 - 3
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestRecordInfo.java

@@ -27,10 +27,10 @@ import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2StaticObjectInstance;
+import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.CharInfo;
 import net.sf.l2j.gameserver.network.serverpackets.ExBrExtraUserInfo;
 import net.sf.l2j.gameserver.network.serverpackets.GetOnVehicle;
-import net.sf.l2j.gameserver.network.serverpackets.NpcInfo;
 import net.sf.l2j.gameserver.network.serverpackets.PetItemList;
 import net.sf.l2j.gameserver.network.serverpackets.RelationChanged;
 import net.sf.l2j.gameserver.network.serverpackets.ServerObjectInfo;
@@ -95,7 +95,7 @@ public class RequestRecordInfo extends L2GameClientPacket
 						if (((L2Npc) object).getRunSpeed() == 0)
 							_activeChar.sendPacket(new ServerObjectInfo((L2Npc) object, _activeChar));
 						else
-							_activeChar.sendPacket(new NpcInfo((L2Npc) object, _activeChar));
+							_activeChar.sendPacket(new AbstractNpcInfo.NpcInfo((L2Npc) object, _activeChar));
 					}
 					else if (object instanceof L2Summon)
 					{
@@ -110,7 +110,7 @@ public class RequestRecordInfo extends L2GameClientPacket
 								_activeChar.sendPacket(new PetItemList((L2PetInstance) summon));
 						}
 						else
-							_activeChar.sendPacket(new NpcInfo(summon, _activeChar,1));
+							_activeChar.sendPacket(new AbstractNpcInfo.SummonInfo(summon, _activeChar,1));
 						
 						// The PetInfo packet wipes the PartySpelled (list of
 						// active spells' icons). Re-add them

+ 604 - 0
L2_GameServer/java/net/sf/l2j/gameserver/network/serverpackets/AbstractNpcInfo.java

@@ -0,0 +1,604 @@
+/*
+ * 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 net.sf.l2j.gameserver.network.serverpackets;
+
+import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.instancemanager.CursedWeaponsManager;
+import net.sf.l2j.gameserver.model.L2Transformation;
+import net.sf.l2j.gameserver.model.actor.L2Character;
+import net.sf.l2j.gameserver.model.actor.L2Decoy;
+import net.sf.l2j.gameserver.model.actor.L2Npc;
+import net.sf.l2j.gameserver.model.actor.L2Summon;
+import net.sf.l2j.gameserver.model.actor.L2Trap;
+import net.sf.l2j.gameserver.model.actor.instance.L2MonsterInstance;
+import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
+/**
+ * This class ...
+ *
+ * @version $Revision: 1.7.2.4.2.9 $ $Date: 2005/04/11 10:05:54 $
+ */
+public abstract class AbstractNpcInfo extends L2GameServerPacket
+{
+	//   ddddddddddddddddddffffdddcccccSSddd dddddc
+	//   ddddddddddddddddddffffdddcccccSSddd dddddccffd
+
+
+	private static final String _S__22_NPCINFO = "[S] 0c NpcInfo";
+	protected int _x, _y, _z, _heading;
+	protected int _idTemplate;
+	protected boolean _isAttackable, _isSummoned;
+	protected int _mAtkSpd, _pAtkSpd;
+	protected int _runSpd, _walkSpd, _swimRunSpd, _swimWalkSpd, _flRunSpd, _flWalkSpd, _flyRunSpd, _flyWalkSpd;
+	protected int _rhand, _lhand, _chest, _val;
+    protected int _collisionHeight, _collisionRadius;
+    protected String _name = "";
+    protected String _title = "";
+
+	public AbstractNpcInfo(L2Character cha, L2Character attacker)
+    {
+    	_isSummoned = cha.isShowSummonAnimation();
+    	_x = cha.getX();
+    	_y = cha.getY();
+		_z = cha.getZ();
+		_heading = cha.getHeading();
+		_mAtkSpd = cha.getMAtkSpd();
+		_pAtkSpd = cha.getPAtkSpd();
+		_runSpd = cha.getTemplate().baseRunSpd;
+		_walkSpd = cha.getTemplate().baseWalkSpd;
+		_swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
+		_swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
+	}
+
+	/* (non-Javadoc)
+	 * @see net.sf.l2j.gameserver.serverpackets.ServerBasePacket#getType()
+	 */
+	@Override
+	public String getType()
+	{
+		return _S__22_NPCINFO;
+	}
+	
+	/**
+     * Packet for Npcs
+     */
+    public static class NpcInfo extends AbstractNpcInfo
+    {
+    	private L2Npc _npc;
+    	
+    	public NpcInfo(L2Npc cha, L2Character attacker)
+    	{
+    		super(cha, attacker);
+    		_npc = cha;
+    		_idTemplate = cha.getTemplate().idTemplate; // On every subclass
+    		_rhand = cha.getRightHandItem();  // On every subclass
+    		_lhand = cha.getLeftHandItem(); // On every subclass
+            _collisionHeight = cha.getCollisionHeight();// On every subclass
+            _collisionRadius = cha.getCollisionRadius();// On every subclass
+            if (cha.getTemplate().serverSideName)
+            	_name = cha.getTemplate().name;// On every subclass
+
+            if(Config.L2JMOD_CHAMPION_ENABLE && cha.isChampion())
+                _title = (Config.L2JMOD_CHAMP_TITLE); // On every subclass
+            else if (cha.getTemplate().serverSideTitle)
+        		_title = cha.getTemplate().title; // On every subclass
+        	else
+        		_title = cha.getTitle(); // On every subclass
+
+            if (Config.SHOW_NPC_LVL && _npc instanceof L2MonsterInstance)
+    	    {
+    			String t = "Lv " + cha.getLevel() + (cha.getAggroRange() > 0 ? "*" : "");
+    			if (_title != null)
+    				t += " " + _title;
+
+    			_title = t;
+    	    }
+    	}
+    	
+    	@Override
+		protected void writeImpl()
+		{
+			writeC(0x0c);
+			writeD(_npc.getObjectId());
+			writeD(_idTemplate + 1000000); // npctype id
+			writeD(_isAttackable ? 1 : 0);
+			writeD(_x);
+			writeD(_y);
+			writeD(_z);
+			writeD(_heading);
+			writeD(0x00);
+			writeD(_mAtkSpd);
+			writeD(_pAtkSpd);
+			writeD(_runSpd);
+			writeD(_walkSpd);
+			writeD(_swimRunSpd); // swimspeed
+			writeD(_swimWalkSpd); // swimspeed
+			writeD(_flRunSpd);
+			writeD(_flWalkSpd);
+			writeD(_flyRunSpd);
+			writeD(_flyWalkSpd);
+			writeF(_npc.getMovementSpeedMultiplier());
+			writeF(_npc.getAttackSpeedMultiplier());
+			writeF(_collisionRadius);
+			writeF(_collisionHeight);
+			writeD(_rhand); // right hand weapon
+			writeD(_chest);
+			writeD(_lhand); // left hand weapon
+			writeC(1); // name above char 1=true ... ??
+			writeC(_npc.isRunning() ? 1 : 0);
+			writeC(_npc.isInCombat() ? 1 : 0);
+			writeC(_npc.isAlikeDead() ? 1 : 0);
+			writeC(_isSummoned ? 2 : _val); // 0=teleported 1=default 2=summoned
+			writeS(_name);
+			writeS(_title);
+			writeD(0x00); // Title color 0=client default
+			writeD(0x00);
+			writeD(0x00); // pvp flag
+			
+			writeD(_npc.getAbnormalEffect()); // C2
+			writeD(0x00);
+			
+			writeD(0000); // C2
+			writeD(0000); // C2
+			writeD(0000); // C2
+			writeC(0000); // C2
+			writeC(0x00); // title color 0=client
+			
+			writeF(_collisionRadius);
+			writeF(_collisionHeight);
+			writeD(0x00); // C4
+			writeD(0x00); // C6
+			writeD(0x00);
+			writeD(0x00);// CT1.5 Pet form and skills
+		}
+	}
+    
+    public static class TrapInfo extends AbstractNpcInfo
+    {
+    	private L2Trap _trap;
+    	
+    	public TrapInfo(L2Trap cha, L2Character attacker)
+    	{
+    		super(cha, attacker);
+    		
+    		_trap = cha;
+    		_idTemplate = cha.getTemplate().idTemplate;
+    		_isAttackable = cha.isAutoAttackable(attacker);
+    		_rhand = 0;
+    		_lhand = 0;
+    		_collisionHeight = _trap.getTemplate().collisionHeight;
+    		_collisionRadius = _trap.getTemplate().collisionRadius;
+    		_title = cha.getOwner().getName();
+    		_runSpd = _trap.getRunSpeed();
+    		_walkSpd = _trap.getWalkSpeed();
+    		_swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
+    		_swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
+    	}
+    	
+    	@Override
+    	protected void writeImpl()
+    	{
+    		writeC(0x0c);
+    		writeD(_trap.getObjectId());
+    		writeD(_idTemplate+1000000);  // npctype id
+    		writeD(_isAttackable ? 1 : 0);
+    		writeD(_x);
+    		writeD(_y);
+    		writeD(_z);
+    		writeD(_heading);
+    		writeD(0x00);
+    		writeD(_mAtkSpd);
+    		writeD(_pAtkSpd);
+    		writeD(_runSpd);
+    		writeD(_walkSpd);
+    		writeD(_swimRunSpd);  // swimspeed
+    		writeD(_swimWalkSpd);  // swimspeed
+    		writeD(_flRunSpd);
+    		writeD(_flWalkSpd);
+    		writeD(_flyRunSpd);
+    		writeD(_flyWalkSpd);
+    		writeF(_trap.getMovementSpeedMultiplier());
+    		writeF(_trap.getAttackSpeedMultiplier());
+    		writeF(_collisionRadius);
+    		writeF(_collisionHeight);
+    		writeD(_rhand); // right hand weapon
+    		writeD(_chest);
+    		writeD(_lhand); // left hand weapon
+    		writeC(1);	// name above char 1=true ... ??
+    		writeC(_trap.isRunning() ? 1 : 0);
+    		writeC(_trap.isInCombat() ? 1 : 0);
+    		writeC(_trap.isAlikeDead() ? 1 : 0);
+    		writeC(_isSummoned ? 2 : _val); //  0=teleported  1=default   2=summoned
+    		writeS(_name);
+    		writeS(_title);
+    		writeD(0x00);  // title color 0 = client default
+
+    		writeD(0x00);
+    		writeD(0x00);  // pvp flag
+
+    		writeD(_trap.getAbnormalEffect());  // C2
+    		
+    		writeD(0x00);   // 0x01 only for summons
+    		writeD(0000);  // C2
+    		writeD(0000);  // C2
+    		writeD(0000);  // C2
+    		writeC(0000);  // C2
+
+    		writeC(0x00);  // Title color 0=client default 
+    		
+    		writeF(_collisionRadius);
+    		writeF(_collisionHeight);
+    		writeD(0x00);  // C4
+    		writeD(0x00);  // C6
+    		writeD(0x00);
+            writeD(0);//CT1.5 Pet form and skills
+    	}
+    }
+    
+	
+    /**
+     * Packet for Decoys
+     */
+	public static class DecoyInfo extends AbstractNpcInfo
+	{
+		private L2Decoy _decoy;
+		
+		public DecoyInfo(L2Decoy cha)
+		{
+			super(cha, null);
+			
+			if (_idTemplate <= 13070 || _idTemplate >= 13077)
+			{
+				if (Config.ASSERT)
+					throw new AssertionError("Using DecoyInfo packet with an unsupported decoy template");
+				else
+					throw new IllegalArgumentException("Using DecoyInfo packet with an unsupported decoy template");
+			}
+			
+			_decoy = cha;
+			
+			_idTemplate = cha.getTemplate().idTemplate;
+			_heading = cha.getOwner().getHeading();
+			// _mAtkSpd = cha.getMAtkSpd(); on abstract constructor
+			_pAtkSpd = cha.getOwner().getPAtkSpd();
+			_runSpd = cha.getOwner().getRunSpeed();
+			_walkSpd = cha.getOwner().getWalkSpeed();
+			_swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
+			_swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
+		}
+		
+		@Override
+		protected void writeImpl()
+		{
+			writeC(0x31);
+			writeD(_x);
+			writeD(_y);
+			writeD(_z);
+			writeD(_heading);
+			writeD(_decoy.getObjectId());
+			writeS(_decoy.getOwner().getAppearance().getVisibleName());
+			writeD(_decoy.getOwner().getRace().ordinal());
+			writeD(_decoy.getOwner().getAppearance().getSex() ? 1 : 0);
+			
+			if (_decoy.getOwner().getClassIndex() == 0)
+				writeD(_decoy.getOwner().getClassId().getId());
+			else
+				writeD(_decoy.getOwner().getBaseClass());
+			
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
+			writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR2));
+			
+			// T1 new d's
+			writeD(0x00);
+			writeD(0x00);
+			writeD(0x00);
+			writeD(0x00);
+			writeD(0x00);
+			writeD(0x00);
+			writeD(0x00);
+			writeD(0x00);
+			// end of t1 new d's
+			
+			// c6 new h's
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_RHAND));
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_LRHAND));
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			
+			// T1 new h's
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			
+			// end of t1 new h's
+			
+			writeD(_decoy.getOwner().getPvpFlag());
+			writeD(_decoy.getOwner().getKarma());
+			
+			writeD(_mAtkSpd);
+			writeD(_pAtkSpd);
+			
+			writeD(_decoy.getOwner().getPvpFlag());
+			writeD(_decoy.getOwner().getKarma());
+			
+			writeD(_runSpd);
+			writeD(_walkSpd);
+			writeD(50); // swimspeed
+			writeD(50); // swimspeed
+			writeD(_flRunSpd);
+			writeD(_flWalkSpd);
+			writeD(_flyRunSpd);
+			writeD(_flyWalkSpd);
+			writeF(_decoy.getOwner().getMovementSpeedMultiplier()); //_activeChar.getProperMultiplier
+																	// ()
+			writeF(_decoy.getOwner().getAttackSpeedMultiplier()); // _activeChar.
+																  // getAttackSpeedMultiplier
+			// ()
+			L2Summon pet = _decoy.getPet();
+			L2Transformation trans;
+			if (_decoy.getOwner().getMountType() != 0 && pet != null)
+			{
+				writeF(pet.getTemplate().collisionRadius);
+				writeF(pet.getTemplate().collisionHeight);
+			}
+			else if ((trans = _decoy.getOwner().getTransformation()) != null)
+			{
+				writeF(trans.getCollisionRadius());
+				writeF(trans.getCollisionHeight());
+			}
+			else
+			{
+				writeF(_decoy.getOwner().getBaseTemplate().collisionRadius);
+				writeF(_decoy.getOwner().getBaseTemplate().collisionHeight);
+			}
+			
+			writeD(_decoy.getOwner().getAppearance().getHairStyle());
+			writeD(_decoy.getOwner().getAppearance().getHairColor());
+			writeD(_decoy.getOwner().getAppearance().getFace());
+			
+			writeS(_decoy.getOwner().getAppearance().getVisibleTitle());
+			
+			writeD(_decoy.getOwner().getClanId());
+			writeD(_decoy.getOwner().getClanCrestId());
+			writeD(_decoy.getOwner().getAllyId());
+			writeD(_decoy.getOwner().getAllyCrestId());
+			// In UserInfo leader rights and siege flags, but here found nothing??
+			// Therefore RelationChanged packet with that info is required
+			writeD(0);
+			
+			writeC(_decoy.getOwner().isSitting() ? 0 : 1); // standing = 1 sitting = 0
+			writeC(_decoy.getOwner().isRunning() ? 1 : 0); // running = 1 walking = 0
+			writeC(_decoy.getOwner().isInCombat() ? 1 : 0);
+			writeC(_decoy.getOwner().isAlikeDead() ? 1 : 0);
+			
+			writeC(_decoy.getOwner().getAppearance().getInvisible() ? 1 : 0); // invisible = 1
+																			  // visible
+			// =0
+			
+			writeC(_decoy.getOwner().getMountType()); // 1 on strider 2 on wyvern 3 on Great Wolf 0
+													  // no
+			// mount
+			writeC(_decoy.getOwner().getPrivateStoreType()); // 1 - sellshop
+			
+			writeH(_decoy.getOwner().getCubics().size());
+			for (int id : _decoy.getOwner().getCubics().keySet())
+				writeH(id);
+			
+			writeC(0x00); // find party members
+			
+			writeD(_decoy.getOwner().getAbnormalEffect());
+			
+			writeC(_decoy.getOwner().getRecomLeft()); // Changed by Thorgrim
+			writeH(_decoy.getOwner().getRecomHave()); // Blue value for name (0 = white, 255 = pure
+			// blue)
+			writeD(_decoy.getOwner().getClassId().getId());
+			
+			writeD(_decoy.getOwner().getMaxCp());
+			writeD((int) _decoy.getOwner().getCurrentCp());
+			writeC(_decoy.getOwner().isMounted() ? 0 : _decoy.getOwner().getEnchantEffect());
+			
+			if (_decoy.getOwner().getTeam() == 1)
+				writeC(0x01); // team circle around feet 1= Blue, 2 = red
+			else if (_decoy.getOwner().getTeam() == 2)
+				writeC(0x02); // team circle around feet 1= Blue, 2 = red
+			else
+				writeC(0x00); // team circle around feet 1= Blue, 2 = red
+				
+			writeD(_decoy.getOwner().getClanCrestLargeId());
+			writeC(_decoy.getOwner().isNoble() ? 1 : 0); // Symbol on char menu ctrl+I
+			writeC(_decoy.getOwner().isHero() ? 1 : 0); // Hero Aura
+			
+			writeC(_decoy.getOwner().isFishing() ? 1 : 0); // 0x01: Fishing Mode (Cant be undone by
+			// setting back to 0)
+			writeD(_decoy.getOwner().getFishx());
+			writeD(_decoy.getOwner().getFishy());
+			writeD(_decoy.getOwner().getFishz());
+			
+			writeD(_decoy.getOwner().getAppearance().getNameColor());
+			
+			writeD(0x00); // isRunning() as in UserInfo?
+			
+			writeD(_decoy.getOwner().getPledgeClass());
+			writeD(0x00); // ??
+			
+			writeD(_decoy.getOwner().getAppearance().getTitleColor());
+			
+			// writeD(0x00); // ??
+			
+			if (_decoy.getOwner().isCursedWeaponEquipped())
+				writeD(CursedWeaponsManager.getInstance().getLevel(_decoy.getOwner().getCursedWeaponEquippedId()));
+			else
+				writeD(0x00);
+			
+			// T1
+			writeD(0x00);
+			
+			writeD(_decoy.getOwner().getTransformationId());
+		}
+	}
+	
+	/**
+	 * Packet for summons
+	 */
+	public static class SummonInfo extends AbstractNpcInfo
+	{
+		private L2Summon _summon;
+		private int _form = 0;
+		
+		public SummonInfo(L2Summon cha, L2Character attacker, int val)
+		{
+			super(cha, attacker);
+			_summon = cha;
+			_val = val;
+			
+			int npcId = cha.getTemplate().npcId;
+	        
+			if (npcId == 16041 || npcId == 16042)
+	        {
+	        	if(cha.getLevel() > 84)
+	        		_form = 3;
+	        	else if(cha.getLevel() > 79) 
+	        		_form = 2;
+	        	else if(cha.getLevel() > 74)
+	        		_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;
+	        }
+			
+			// fields not set on AbstractNpcInfo
+			_isAttackable = cha.isAutoAttackable(attacker);
+			_rhand = cha.getWeapon();
+			_lhand = 0;
+			_chest = cha.getArmor();
+			_name = cha.getName();
+	        _title = cha.getOwner() != null ? (cha.getOwner().isOnline() == 0 ? "" : cha.getOwner().getName()) : ""; // when owner online, summon will show in title owner name
+	        _idTemplate = cha.getTemplate().idTemplate;
+	        
+			// few fields needing fix from AbstractNpcInfo
+			_runSpd = cha.getPetSpeed();
+			_walkSpd = cha.isMountable() ? 45 : 30;
+			_swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
+			_swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
+		}
+		
+		@Override
+		protected void writeImpl()
+		{
+			if (_summon.getOwner() != null && _summon.getOwner().getAppearance().getInvisible())
+				return; // TODO get his out of here
+	        
+			writeC(0x0c);
+			writeD(_summon.getObjectId());
+			writeD(_idTemplate+1000000);  // npctype id
+			writeD(_isAttackable ? 1 : 0);
+			writeD(_x);
+			writeD(_y);
+			writeD(_z);
+			writeD(_heading);
+			writeD(0x00);
+			writeD(_mAtkSpd);
+			writeD(_pAtkSpd);
+			writeD(_runSpd);
+			writeD(_walkSpd);
+			writeD(_swimRunSpd);  // swimspeed
+			writeD(_swimWalkSpd);  // swimspeed
+			writeD(_flRunSpd);
+			writeD(_flWalkSpd);
+			writeD(_flyRunSpd);
+			writeD(_flyWalkSpd);
+			writeF(_summon.getMovementSpeedMultiplier());
+			writeF(_summon.getAttackSpeedMultiplier());
+			writeF(_collisionRadius);
+			writeF(_collisionHeight);
+			writeD(_rhand); // right hand weapon
+			writeD(_chest);
+			writeD(_lhand); // left hand weapon
+			writeC(1);	// name above char 1=true ... ??
+			writeC(1);
+			writeC(_summon.isInCombat() ? 1 : 0);
+			writeC(_summon.isAlikeDead() ? 1 : 0);
+			writeC(_isSummoned ? 2 : _val); //  0=teleported  1=default   2=summoned
+			writeS(_name);
+			writeS(_title);
+			writeD(0x01);// Title color 0=client default
+
+			writeD(0);
+			writeD(_summon.getOwner().getPvpFlag());
+
+			writeD(_summon.getAbnormalEffect());  // C2
+			writeD(0x01);
+			writeD(0000);  // C2
+			writeD(0000);  // C2
+			writeD(0000);  // C2
+			writeC(0000);  // C2
+
+			writeC(_summon.getOwner().getTeam());// Title color 0=client default  
+			
+			writeF(_collisionRadius);
+			writeF(_collisionHeight);
+			writeD(0x00);  // C4
+			writeD(0x00);  // C6
+			writeD(0x00);
+	        writeD(_form);//CT1.5 Pet form and skills
+		}
+	}
+}

+ 0 - 471
L2_GameServer/java/net/sf/l2j/gameserver/network/serverpackets/NpcInfo.java

@@ -1,471 +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 net.sf.l2j.gameserver.network.serverpackets;
-
-import net.sf.l2j.Config;
-import net.sf.l2j.gameserver.instancemanager.CursedWeaponsManager;
-import net.sf.l2j.gameserver.model.L2Transformation;
-import net.sf.l2j.gameserver.model.actor.L2Character;
-import net.sf.l2j.gameserver.model.actor.L2Decoy;
-import net.sf.l2j.gameserver.model.actor.L2Npc;
-import net.sf.l2j.gameserver.model.actor.L2Summon;
-import net.sf.l2j.gameserver.model.actor.L2Trap;
-import net.sf.l2j.gameserver.model.actor.instance.L2MonsterInstance;
-import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
-/**
- * This class ...
- *
- * @version $Revision: 1.7.2.4.2.9 $ $Date: 2005/04/11 10:05:54 $
- */
-public final class NpcInfo extends L2GameServerPacket
-{
-	//   ddddddddddddddddddffffdddcccccSSddd dddddc
-	//   ddddddddddddddddddffffdddcccccSSddd dddddccffd
-
-
-	private static final String _S__22_NPCINFO = "[S] 0c NpcInfo";
-	private L2Character _activeChar;
-	private int _x, _y, _z, _heading;
-	private int _idTemplate;
-	private boolean _isAttackable, _isSummoned;
-	private int _mAtkSpd, _pAtkSpd;
-	private int _runSpd, _walkSpd, _swimRunSpd, _swimWalkSpd, _flRunSpd, _flWalkSpd, _flyRunSpd, _flyWalkSpd;
-	private int _rhand, _lhand, _chest, _val;
-    private int _collisionHeight, _collisionRadius;
-    private String _name = "";
-    private String _title = "";
-    private L2Summon _summon;
-    private int _form = 0;
-
-	/**
-	 * @param _characters
-	 */
-	public NpcInfo(L2Npc cha, L2Character attacker)
-	{
-		_activeChar = cha;
-		_idTemplate = cha.getTemplate().idTemplate;
-		_isAttackable = cha.isAutoAttackable(attacker);
-		_rhand = cha.getRightHandItem(); 
-		_lhand = cha.getLeftHandItem(); 
-		_isSummoned = cha.isShowSummonAnimation();
-        _collisionHeight = cha.getCollisionHeight();
-        _collisionRadius = cha.getCollisionRadius();
-        if (cha.getTemplate().serverSideName)
-        	_name = cha.getTemplate().name;
-
-        if(Config.L2JMOD_CHAMPION_ENABLE && cha.isChampion())
-            _title = (Config.L2JMOD_CHAMP_TITLE);
-        else if (cha.getTemplate().serverSideTitle)
-    		_title = cha.getTemplate().title;
-    	else
-    		_title = cha.getTitle();
-
-        if (Config.SHOW_NPC_LVL && _activeChar instanceof L2MonsterInstance)
-	    {
-			String t = "Lv " + cha.getLevel() + (cha.getAggroRange() > 0 ? "*" : "");
-			if (_title != null)
-				t += " " + _title;
-
-			_title = t;
-	    }
-
-        _x = _activeChar.getX();
-		_y = _activeChar.getY();
-		_z = _activeChar.getZ();
-		_heading = _activeChar.getHeading();
-		_mAtkSpd = _activeChar.getMAtkSpd();
-		_pAtkSpd = _activeChar.getPAtkSpd();
-		_runSpd = _activeChar.getTemplate().baseRunSpd;
-		_walkSpd = _activeChar.getTemplate().baseWalkSpd;
-		_swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
-		_swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
-	}
-
-	public NpcInfo(L2Summon cha, L2Character attacker, int val)
-	{
-		_activeChar = cha;
-		_summon = cha;
-		_idTemplate = cha.getTemplate().idTemplate;
-		_isAttackable = cha.isAutoAttackable(attacker); //(cha.getKarma() > 0);
-		_rhand = cha.getWeapon();
-		_lhand = 0;
-		_chest = cha.getArmor();
-		_val = val;
-        _collisionHeight = _activeChar.getTemplate().collisionHeight;
-        _collisionRadius = _activeChar.getTemplate().collisionRadius;
-        _name = cha.getName();
-        _title = cha.getOwner() != null ? (cha.getOwner().isOnline() == 0 ? "" : cha.getOwner().getName()) : ""; // when owner online, summon will show in title owner name
-        int npcId = _summon.getTemplate().npcId;
-        if (npcId == 16041 || npcId == 16042)
-        {
-        	if(_summon.getLevel() > 84)
-        		_form = 3;
-        	else if(_summon.getLevel() > 79) 
-        		_form = 2;
-        	else if(_summon.getLevel() > 74)
-        		_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;
-        }
-
-        _x = _activeChar.getX();
-		_y = _activeChar.getY();
-		_z = _activeChar.getZ();
-		_heading = _activeChar.getHeading();
-		_mAtkSpd = _activeChar.getMAtkSpd();
-		_pAtkSpd = _activeChar.getPAtkSpd();
-		_runSpd = _summon.getPetSpeed();
-		_walkSpd = _summon.isMountable() ? 45 : 30;
-		_swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
-		_swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
-	}
-	
-	public NpcInfo(L2Trap cha, L2Character attacker)
-	{
-		_activeChar = cha;
-		_idTemplate = cha.getTemplate().idTemplate;
-		_isAttackable = cha.isAutoAttackable(attacker);
-		_rhand = 0;
-		_lhand = 0;
-		_collisionHeight = _activeChar.getTemplate().collisionHeight;
-		_collisionRadius = _activeChar.getTemplate().collisionRadius;
-		_x = _activeChar.getX();
-		_y = _activeChar.getY();
-		_z = _activeChar.getZ();
-		_title = cha.getOwner().getName();
-		_heading = _activeChar.getHeading();
-		_mAtkSpd = _activeChar.getMAtkSpd();
-		_pAtkSpd = _activeChar.getPAtkSpd();
-		_runSpd = _activeChar.getRunSpeed();
-		_walkSpd = _activeChar.getWalkSpeed();
-		_swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
-		_swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
-	}
-
-    public NpcInfo(L2Decoy cha)
-    {
-        _idTemplate = cha.getTemplate().idTemplate;
-        _activeChar = cha;
-        _x = _activeChar.getX();
-        _y = _activeChar.getY();
-        _z = _activeChar.getZ();
-        _heading = cha.getOwner().getHeading();
-        _mAtkSpd = cha.getMAtkSpd();
-        _pAtkSpd = cha.getOwner().getPAtkSpd();
-        _runSpd = cha.getOwner().getRunSpeed();
-        _walkSpd = cha.getOwner().getWalkSpeed();
-        _swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
-        _swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
-    }
-	   
-	@Override
-	protected final void writeImpl()
-	{
-	    if (_idTemplate > 13070 && _idTemplate < 13077)
-        {
-                
-	        writeC(0x31);
-            writeD(_x);
-            writeD(_y);
-            writeD(_z);
-            writeD(_heading);
-            writeD(_activeChar.getObjectId());
-            writeS(((L2Decoy)_activeChar).getOwner().getAppearance().getVisibleName());
-            writeD(((L2Decoy)_activeChar).getOwner().getRace().ordinal());
-            writeD(((L2Decoy)_activeChar).getOwner().getAppearance().getSex()? 1 : 0);
-
-            if (((L2Decoy)_activeChar).getOwner().getClassIndex() == 0)
-                writeD(((L2Decoy)_activeChar).getOwner().getClassId().getId());
-            else
-                writeD(((L2Decoy)_activeChar).getOwner().getBaseClass());
-
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR2));
-            
-             // T1 new d's 
-            writeD(0x00); 
-            writeD(0x00); 
-            writeD(0x00); 
-            writeD(0x00); 
-            writeD(0x00); 
-            writeD(0x00); 
-            writeD(0x00); 
-            writeD(0x00); 
-             // end of t1 new d's 
-
-            // c6 new h's
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_RHAND));
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeD(((L2Decoy)_activeChar).getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_LRHAND));
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-            writeH(0x00);
-
-            
-            // T1 new h's 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-            writeH(0x00); 
-
-            // end of t1 new h's 
-            
-            
-            writeD(((L2Decoy)_activeChar).getOwner().getPvpFlag());
-            writeD(((L2Decoy)_activeChar).getOwner().getKarma());
-
-            writeD(_mAtkSpd);
-            writeD(_pAtkSpd);
-
-            writeD(((L2Decoy)_activeChar).getOwner().getPvpFlag());
-            writeD(((L2Decoy)_activeChar).getOwner().getKarma());
-
-            writeD(_runSpd);
-            writeD(_walkSpd);
-            writeD(50);  // swimspeed
-            writeD(50);  // swimspeed
-            writeD(_flRunSpd);
-            writeD(_flWalkSpd);
-            writeD(_flyRunSpd);
-            writeD(_flyWalkSpd);
-            writeF(((L2Decoy)_activeChar).getOwner().getMovementSpeedMultiplier()); // _activeChar.getProperMultiplier()
-            writeF(((L2Decoy)_activeChar).getOwner().getAttackSpeedMultiplier()); // _activeChar.getAttackSpeedMultiplier()
-             L2Summon pet = _activeChar.getPet(); 
-                L2Transformation trans; 
-                if (((L2Decoy)_activeChar).getOwner().getMountType() != 0 && pet != null) 
-                { 
-                    writeF(pet.getTemplate().collisionRadius); 
-                    writeF(pet.getTemplate().collisionHeight); 
-                } 
-                else if ((trans = ((L2Decoy)_activeChar).getOwner().getTransformation()) != null) 
-                { 
-                    writeF(trans.getCollisionRadius()); 
-                    writeF(trans.getCollisionHeight()); 
-                } 
-                else 
-                { 
-                    writeF(((L2Decoy)_activeChar).getOwner().getBaseTemplate().collisionRadius); 
-                    writeF(((L2Decoy)_activeChar).getOwner().getBaseTemplate().collisionHeight); 
-                } 
-
-            writeD(((L2Decoy)_activeChar).getOwner().getAppearance().getHairStyle());
-            writeD(((L2Decoy)_activeChar).getOwner().getAppearance().getHairColor());
-            writeD(((L2Decoy)_activeChar).getOwner().getAppearance().getFace());
-
-            writeS(((L2Decoy)_activeChar).getOwner().getAppearance().getVisibleTitle());
-
-            writeD(((L2Decoy)_activeChar).getOwner().getClanId());
-            writeD(((L2Decoy)_activeChar).getOwner().getClanCrestId());
-            writeD(((L2Decoy)_activeChar).getOwner().getAllyId());
-            writeD(((L2Decoy)_activeChar).getOwner().getAllyCrestId());
-            // In UserInfo leader rights and siege flags, but here found nothing??
-            // Therefore RelationChanged packet with that info is required
-            writeD(0);
-
-            writeC(((L2Decoy)_activeChar).getOwner().isSitting() ? 0 : 1);    // standing = 1  sitting = 0
-            writeC(((L2Decoy)_activeChar).getOwner().isRunning() ? 1 : 0);    // running = 1   walking = 0
-            writeC(((L2Decoy)_activeChar).getOwner().isInCombat() ? 1 : 0);
-            writeC(((L2Decoy)_activeChar).getOwner().isAlikeDead() ? 1 : 0);
-
-            writeC(((L2Decoy)_activeChar).getOwner().getAppearance().getInvisible() ? 1 : 0); // invisible = 1  visible =0
-
-            writeC(((L2Decoy)_activeChar).getOwner().getMountType()); // 1 on strider   2 on wyvern  3 on Great Wolf  0 no mount
-            writeC(((L2Decoy)_activeChar).getOwner().getPrivateStoreType());   //  1 - sellshop
-
-            writeH(((L2Decoy)_activeChar).getOwner().getCubics().size());
-            for (int id : ((L2Decoy)_activeChar).getOwner().getCubics().keySet())
-                writeH(id);
-
-            writeC(0x00);   // find party members
-
-            writeD(((L2Decoy)_activeChar).getOwner().getAbnormalEffect());
-
-            writeC(((L2Decoy)_activeChar).getOwner().getRecomLeft());                       //Changed by Thorgrim
-            writeH(((L2Decoy)_activeChar).getOwner().getRecomHave()); //Blue value for name (0 = white, 255 = pure blue)
-            writeD(((L2Decoy)_activeChar).getOwner().getClassId().getId());
-
-            writeD(((L2Decoy)_activeChar).getOwner().getMaxCp());
-            writeD((int) ((L2Decoy)_activeChar).getOwner().getCurrentCp());
-            writeC(((L2Decoy)_activeChar).getOwner().isMounted() ? 0 : ((L2Decoy)_activeChar).getOwner().getEnchantEffect());
-
-            if(((L2Decoy)_activeChar).getOwner().getTeam()==1)
-                writeC(0x01); //team circle around feet 1= Blue, 2 = red
-            else if(((L2Decoy)_activeChar).getOwner().getTeam()==2)
-                writeC(0x02); //team circle around feet 1= Blue, 2 = red
-            else
-                writeC(0x00); //team circle around feet 1= Blue, 2 = red
-
-            writeD(((L2Decoy)_activeChar).getOwner().getClanCrestLargeId());
-            writeC(((L2Decoy)_activeChar).getOwner().isNoble() ? 1 : 0); // Symbol on char menu ctrl+I
-            writeC(((L2Decoy)_activeChar).getOwner().isHero() ? 1 : 0); // Hero Aura
-
-            writeC(((L2Decoy)_activeChar).getOwner().isFishing() ? 1 : 0); //0x01: Fishing Mode (Cant be undone by setting back to 0)
-            writeD(((L2Decoy)_activeChar).getOwner().getFishx());
-            writeD(((L2Decoy)_activeChar).getOwner().getFishy());
-            writeD(((L2Decoy)_activeChar).getOwner().getFishz());
-
-            writeD(((L2Decoy)_activeChar).getOwner().getAppearance().getNameColor());
-
-            writeD(0x00); // isRunning() as in UserInfo?
-
-            writeD(((L2Decoy)_activeChar).getOwner().getPledgeClass());
-            writeD(0x00); // ??
-
-            writeD(((L2Decoy)_activeChar).getOwner().getAppearance().getTitleColor());
-
-            //writeD(0x00); // ??
-
-            if (((L2Decoy)_activeChar).getOwner().isCursedWeaponEquipped())
-                writeD(CursedWeaponsManager.getInstance().getLevel(((L2Decoy)_activeChar).getOwner().getCursedWeaponEquippedId()));
-            else
-                writeD(0x00);
-            
-         // T1 
-            writeD(0x00); 
-            
-            writeD(((L2Decoy)_activeChar).getOwner().getTransformationId()); 
-        }
-        else
-	    {
-        if (_activeChar instanceof L2Summon)
-            if (((L2Summon)_activeChar).getOwner() != null
-                    && ((L2Summon)_activeChar).getOwner().getAppearance().getInvisible())
-                return;
-        
-		writeC(0x0c);
-		writeD(_activeChar.getObjectId());
-		writeD(_idTemplate+1000000);  // npctype id
-		writeD(_isAttackable ? 1 : 0);
-		writeD(_x);
-		writeD(_y);
-		writeD(_z);
-		writeD(_heading);
-		writeD(0x00);
-		writeD(_mAtkSpd);
-		writeD(_pAtkSpd);
-		writeD(_runSpd);
-		writeD(_walkSpd);
-		writeD(_swimRunSpd);  // swimspeed
-		writeD(_swimWalkSpd);  // swimspeed
-		writeD(_flRunSpd);
-		writeD(_flWalkSpd);
-		writeD(_flyRunSpd);
-		writeD(_flyWalkSpd);
-		writeF(_activeChar.getMovementSpeedMultiplier());
-		writeF(_activeChar.getAttackSpeedMultiplier());
-		writeF(_collisionRadius);
-		writeF(_collisionHeight);
-		writeD(_rhand); // right hand weapon
-		writeD(_chest);
-		writeD(_lhand); // left hand weapon
-		writeC(1);	// name above char 1=true ... ??
-		writeC(_activeChar.isRunning() ? 1 : 0);
-		writeC(_activeChar.isInCombat() ? 1 : 0);
-		writeC(_activeChar.isAlikeDead() ? 1 : 0);
-		writeC(_isSummoned ? 2 : _val); //  0=teleported  1=default   2=summoned
-		writeS(_name);
-		writeS(_title);
-		if (_activeChar instanceof L2Summon){  
-			writeD(0x01);// Title color 0=client default  
-		}else{  
-			writeD(0x00);  
-		}  
-
-		writeD(0);
-		if (_activeChar instanceof L2Summon){  
-			writeD(_summon.getOwner().getPvpFlag());
-		}else{  
-			writeD(0x00);  
-		}
-
-		writeD(_activeChar.getAbnormalEffect());  // C2
-		if (_activeChar instanceof L2Summon){  
-			writeD(0x01);
-		}else{  
-			writeD(0x00);  
-		}
-		writeD(0000);  // C2
-		writeD(0000);  // C2
-		writeD(0000);  // C2
-		writeC(0000);  // C2
-
-		if (_activeChar instanceof L2Summon){  
-			writeC(_summon.getOwner().getTeam());// Title color 0=client default  
-		}else{  
-			writeC(0x00);  
-		}  
-		writeF(_collisionRadius);
-		writeF(_collisionHeight);
-		writeD(0x00);  // C4
-		writeD(0x00);  // C6
-		writeD(0x00);
-        writeD(_form);//CT1.5 Pet form and skills
-	    }
-	}
-
-	/* (non-Javadoc)
-	 * @see net.sf.l2j.gameserver.serverpackets.ServerBasePacket#getType()
-	 */
-	@Override
-	public String getType()
-	{
-		return _S__22_NPCINFO;
-	}
-}