소스 검색

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 년 전
부모
커밋
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;
-	}
-}