Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Fake Npc/Pc

Iniciado por Swarlog, Jul 27, 2025, 12:00 AM

Tema anterior - Siguiente tema

Swarlog

CitarCORE:

Index: com/l2jserver/gameserver/datatables/customs/FakePcsTable.java
===================================================================
--- com/l2jserver/gameserver/datatables/customs/FakePcsTable.java	(revision 0)
+++ com/l2jserver/gameserver/datatables/customs/FakePcsTable.java	(working copy)
@@ -0,0 +1,147 @@
+/*
+ * 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 com.l2jserver.gameserver.datatables.customs;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.l2jserver.L2DatabaseFactory;
+import com.l2jserver.gameserver.model.actor.FakePc;
+
+public class FakePcsTable
+{
+	private static Logger _log = Logger.getLogger(FakePcsTable.class.getName());
+	
+	private final HashMap<Integer, FakePc> _fakePcs = new HashMap<>();
+	
+	private static final String SQL_LOAD_FAKE_PCS = "SELECT * FROM fake_pcs";
+	
+	protected FakePcsTable()
+	{
+		loadData();
+	}
+	
+	private void loadData()
+	{
+		_fakePcs.clear();
+		
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
+			Statement st = con.createStatement();
+			ResultSet rset = st.executeQuery(SQL_LOAD_FAKE_PCS))
+		{
+			FakePc fpc = null;
+			
+			while (rset.next())
+			{
+				fpc = new FakePc();
+				
+				int npcId = rset.getInt("npc_id");
+				fpc.race = rset.getInt("race");
+				fpc.sex = rset.getInt("sex");
+				fpc.clazz = rset.getInt("class");
+				fpc.title = rset.getString("title");
+				fpc.titleColor = Integer.decode("0x" + rset.getString("title_color"));
+				fpc.name = rset.getString("name");
+				fpc.nameColor = Integer.decode("0x" + rset.getString("name_color"));
+				fpc.hairStyle = rset.getInt("hair_style");
+				fpc.hairColor = rset.getInt("hair_color");
+				fpc.face = rset.getInt("face");
+				fpc.mount = rset.getByte("mount");
+				fpc.team = rset.getByte("team");
+				fpc.hero = rset.getByte("hero");
+				fpc.pdUnder = rset.getInt("pd_under");
+				fpc.pdUnderAug = rset.getInt("pd_under_aug");
+				fpc.pdHead = rset.getInt("pd_head");
+				fpc.pdHeadAug = rset.getInt("pd_head_aug");
+				fpc.pdRHand = rset.getInt("pd_rhand");
+				fpc.pdRHandAug = rset.getInt("pd_rhand_aug");
+				fpc.pdLHand = rset.getInt("pd_lhand");
+				fpc.pdLHandAug = rset.getInt("pd_lhand_aug");
+				fpc.pdGloves = rset.getInt("pd_gloves");
+				fpc.pdGlovesAug = rset.getInt("pd_gloves_aug");
+				fpc.pdChest = rset.getInt("pd_chest");
+				fpc.pdChestAug = rset.getInt("pd_chest_aug");
+				fpc.pdLegs = rset.getInt("pd_legs");
+				fpc.pdLegsAug = rset.getInt("pd_legs_aug");
+				fpc.pdFeet = rset.getInt("pd_feet");
+				fpc.pdFeetAug = rset.getInt("pd_feet_aug");
+				fpc.pdBack = rset.getInt("pd_back");
+				fpc.pdBackAug = rset.getInt("pd_back_aug");
+				fpc.pdLRHand = rset.getInt("pd_lrhand");
+				fpc.pdLRHandAug = rset.getInt("pd_lrhand_aug");
+				fpc.pdHair = rset.getInt("pd_hair");
+				fpc.pdHairAug = rset.getInt("pd_hair_aug");
+				fpc.pdHair2 = rset.getInt("pd_hair2");
+				fpc.pdHair2Aug = rset.getInt("pd_hair2_aug");
+				fpc.pdRBracelet = rset.getInt("pd_rbracelet");
+				fpc.pdRBraceletAug = rset.getInt("pd_rbracelet_aug");
+				fpc.pdLBracelet = rset.getInt("pd_lbracelet");
+				fpc.pdLBraceletAug = rset.getInt("pd_lbracelet_aug");
+				fpc.pdDeco1 = rset.getInt("pd_deco1");
+				fpc.pdDeco1Aug = rset.getInt("pd_deco1_aug");
+				fpc.pdDeco2 = rset.getInt("pd_deco2");
+				fpc.pdDeco2Aug = rset.getInt("pd_deco2_aug");
+				fpc.pdDeco3 = rset.getInt("pd_deco3");
+				fpc.pdDeco3Aug = rset.getInt("pd_deco3_aug");
+				fpc.pdDeco4 = rset.getInt("pd_deco4");
+				fpc.pdDeco4Aug = rset.getInt("pd_deco4_aug");
+				fpc.pdDeco5 = rset.getInt("pd_deco5");
+				fpc.pdDeco5Aug = rset.getInt("pd_deco5_aug");
+				fpc.pdDeco6 = rset.getInt("pd_deco6");
+				fpc.pdDeco6Aug = rset.getInt("pd_deco6_aug");
+				fpc.enchantEffect = rset.getInt("enchant_effect");
+				fpc.pvpFlag = rset.getInt("pvp_flag");
+				fpc.karma = rset.getInt("karma");
+				fpc.fishing = rset.getByte("fishing");
+				fpc.fishingX = rset.getInt("fishing_x");
+				fpc.fishingY = rset.getInt("fishing_y");
+				fpc.fishingZ = rset.getInt("fishing_z");
+				fpc.invisible = rset.getByte("invisible");
+				_fakePcs.put(npcId, fpc);
+			}
+			
+			rset.close();
+		}
+		catch (Exception e)
+		{
+			_log.log(Level.WARNING, "FakePcsTable: Error while creating fake pc table: ", e);
+		}
+	}
+	
+	public void reloadData()
+	{
+		loadData();
+	}
+	
+	public FakePc getFakePc(int npcId)
+	{
+		return _fakePcs.get(npcId);
+	}
+	
+	public static FakePcsTable getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	private static class SingletonHolder
+	{
+		protected static final FakePcsTable _instance = new FakePcsTable();
+	}
+}
Index: com/l2jserver/gameserver/GameServer.java
===================================================================
--- com/l2jserver/gameserver/GameServer.java	(revision 10721)
+++ com/l2jserver/gameserver/GameServer.java	(working copy)
@@ -85,6 +85,7 @@
 import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable;
 import com.l2jserver.gameserver.datatables.SkillData;
 import com.l2jserver.gameserver.datatables.SpawnTable;
+import com.l2jserver.gameserver.datatables.customs.FakePcsTable;
 import com.l2jserver.gameserver.handler.EffectHandler;
 import com.l2jserver.gameserver.idfactory.IdFactory;
 import com.l2jserver.gameserver.instancemanager.AirShipManager;
@@ -291,6 +292,7 @@
 		CursedWeaponsManager.getInstance();
 		TransformData.getInstance();
 		BotReportTable.getInstance();
+		FakePcsTable.getInstance();
 		
 		printSection("Scripts");
 		QuestManager.getInstance();
Index: com/l2jserver/gameserver/model/actor/FakePc.java
===================================================================
--- com/l2jserver/gameserver/model/actor/FakePc.java	(revision 0)
+++ com/l2jserver/gameserver/model/actor/FakePc.java	(working copy)
@@ -0,0 +1,81 @@
+/*
+ * 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 com.l2jserver.gameserver.model.actor;
+
+public class FakePc
+{
+	public int race;
+	public int sex;
+	public int clazz;
+	public String title;
+	public int titleColor;
+	public String name;
+	public int nameColor;
+	public int hairStyle;
+	public int hairColor;
+	public int face;
+	public byte mount;
+	public byte team;
+	public byte hero;
+	public int pdUnder;
+	public int pdUnderAug;
+	public int pdHead;
+	public int pdHeadAug;
+	public int pdRHand;
+	public int pdRHandAug;
+	public int pdLHand;
+	public int pdLHandAug;
+	public int pdGloves;
+	public int pdGlovesAug;
+	public int pdChest;
+	public int pdChestAug;
+	public int pdLegs;
+	public int pdLegsAug;
+	public int pdFeet;
+	public int pdFeetAug;
+	public int pdBack;
+	public int pdBackAug;
+	public int pdLRHand;
+	public int pdLRHandAug;
+	public int pdHair;
+	public int pdHairAug;
+	public int pdHair2;
+	public int pdHair2Aug;
+	public int pdRBracelet;
+	public int pdRBraceletAug;
+	public int pdLBracelet;
+	public int pdLBraceletAug;
+	public int pdDeco1;
+	public int pdDeco1Aug;
+	public int pdDeco2;
+	public int pdDeco2Aug;
+	public int pdDeco3;
+	public int pdDeco3Aug;
+	public int pdDeco4;
+	public int pdDeco4Aug;
+	public int pdDeco5;
+	public int pdDeco5Aug;
+	public int pdDeco6;
+	public int pdDeco6Aug;
+	public int enchantEffect;
+	public int pvpFlag;
+	public int karma;
+	public byte fishing;
+	public int fishingX;
+	public int fishingY;
+	public int fishingZ;
+	public byte invisible;
+}
Index: com/l2jserver/gameserver/model/actor/L2Npc.java
===================================================================
--- com/l2jserver/gameserver/model/actor/L2Npc.java	(revision 10721)
+++ com/l2jserver/gameserver/model/actor/L2Npc.java	(working copy)
@@ -37,6 +37,7 @@
 import com.l2jserver.gameserver.data.xml.impl.NpcData;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.NpcPersonalAIData;
+import com.l2jserver.gameserver.datatables.customs.FakePcsTable;
 import com.l2jserver.gameserver.enums.AISkillScope;
 import com.l2jserver.gameserver.enums.AIType;
 import com.l2jserver.gameserver.enums.InstanceType;
@@ -142,6 +143,9 @@
 	private double _currentCollisionHeight; // used for npc grow effect skills
 	private double _currentCollisionRadius; // used for npc grow effect skills
 	
+	// Fake Npc
+	private FakePc _fakePc = null;
+	
 	private int _soulshotamount = 0;
 	private int _spiritshotamount = 0;
 	private int _displayEffect = 0;
@@ -172,6 +176,9 @@
 		_currentCollisionHeight = getTemplate().getfCollisionHeight();
 		_currentCollisionRadius = getTemplate().getfCollisionRadius();
 		
+		// Fake Npc
+		_fakePc = FakePcsTable.getInstance().getFakePc(getTemplate().getId());
+		
 		setIsFlying(template.isFlying());
 	}
 	
@@ -1655,6 +1662,11 @@
 		return _displayEffect;
 	}
 	
+	public FakePc getFakePc()
+	{
+		return _fakePc;
+	}
+	
 	public int getColorEffect()
 	{
 		return 0;
Index: com/l2jserver/gameserver/model/actor/status/AttackableStatus.java
===================================================================
--- com/l2jserver/gameserver/model/actor/status/AttackableStatus.java	(revision 10721)
+++ com/l2jserver/gameserver/model/actor/status/AttackableStatus.java	(working copy)
@@ -18,8 +18,12 @@
  */
 package com.l2jserver.gameserver.model.actor.status;
 
+import java.util.Collection;
+
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.serverpackets.AbstractNpcInfo;
 
 public class AttackableStatus extends NpcStatus
 {
@@ -68,6 +72,26 @@
 	}
 	
 	@Override
+	public boolean setCurrentHp(double newHp, boolean broadcastPacket)
+	{
+		super.setCurrentHp(newHp, broadcastPacket);
+		
+		if (getActiveChar().getFakePc() != null)
+		{
+			Collection<L2PcInstance> plrs = getActiveChar().getKnownList().getKnownPlayers().values();
+			for (L2PcInstance player : plrs)
+			{
+				if (player != null)
+				{
+					player.sendPacket(new AbstractNpcInfo.NpcInfo(getActiveChar(), player));
+				}
+			}
+		}
+		
+		return broadcastPacket;
+	}
+	
+	@Override
 	public L2Attackable getActiveChar()
 	{
 		return (L2Attackable) super.getActiveChar();
Index: com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java
===================================================================
--- com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java	(revision 10721)
+++ com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java	(working copy)
@@ -18,11 +18,15 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
+import java.text.DecimalFormat;
+
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.data.sql.impl.ClanTable;
+import com.l2jserver.gameserver.data.xml.impl.PlayerTemplateData;
 import com.l2jserver.gameserver.instancemanager.TownManager;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.PcCondOverride;
+import com.l2jserver.gameserver.model.actor.FakePc;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Summon;
@@ -30,6 +34,7 @@
 import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
+import com.l2jserver.gameserver.model.actor.templates.L2PcTemplate;
 import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 
@@ -143,64 +148,216 @@
 		@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);
-			writeD(_swimWalkSpd);
-			writeD(_flyRunSpd);
-			writeD(_flyWalkSpd);
-			writeD(_flyRunSpd);
-			writeD(_flyWalkSpd);
-			writeF(_moveMultiplier);
-			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 : 0); // invisible ?? 0=false 1=true 2=summoned (only works if model has a summon animation)
-			writeD(-1); // High Five NPCString ID
-			writeS(_name);
-			writeD(-1); // High Five NPCString ID
-			writeS(_title);
-			writeD(0x00); // Title color 0=client default
-			writeD(0x00); // pvp flag
-			writeD(0x00); // karma
-			
-			writeD(_npc.isInvisible() ? _npc.getAbnormalVisualEffects() | AbnormalVisualEffect.STEALTH.getMask() : _npc.getAbnormalVisualEffects());
-			writeD(_clanId); // clan id
-			writeD(_clanCrest); // crest id
-			writeD(_allyId); // ally id
-			writeD(_allyCrest); // all crest
-			
-			writeC(_npc.isInsideZone(ZoneId.WATER) ? 1 : _npc.isFlying() ? 2 : 0); // C2
-			writeC(_npc.getTeam().getId());
-			
-			writeF(_collisionRadius);
-			writeF(_collisionHeight);
-			writeD(_enchantEffect); // C4
-			writeD(_npc.isFlying() ? 1 : 0); // C6
-			writeD(0x00);
-			writeD(_npc.getColorEffect()); // CT1.5 Pet form and skills, Color effect
-			writeC(_npc.isTargetable() ? 0x01 : 0x00);
-			writeC(_npc.isShowName() ? 0x01 : 0x00);
-			writeD(_npc.getAbnormalVisualEffectSpecial());
-			writeD(_displayEffect);
+			FakePc fpc = _npc.getFakePc();
+			if (fpc != null)
+			{
+				writeC(0x31);
+				writeD(_x);
+				writeD(_y);
+				writeD(_z);
+				writeD(0x00); // vehicle id
+				writeD(_npc.getObjectId());
+				writeS(fpc.name); // visible name
+				writeD(fpc.race);
+				writeD(fpc.sex);
+				writeD(fpc.clazz);
+				
+				writeD(fpc.pdUnder);
+				writeD(fpc.pdHead);
+				writeD(fpc.pdRHand);
+				writeD(fpc.pdLHand);
+				writeD(fpc.pdGloves);
+				writeD(fpc.pdChest);
+				writeD(fpc.pdLegs);
+				writeD(fpc.pdFeet);
+				writeD(fpc.pdBack);
+				writeD(fpc.pdLRHand);
+				writeD(fpc.pdHair);
+				writeD(fpc.pdHair2);
+				writeD(fpc.pdRBracelet);
+				writeD(fpc.pdLBracelet);
+				writeD(fpc.pdDeco1);
+				writeD(fpc.pdDeco2);
+				writeD(fpc.pdDeco3);
+				writeD(fpc.pdDeco4);
+				writeD(fpc.pdDeco5);
+				writeD(fpc.pdDeco6);
+				writeD(0x00); // belt
+				
+				writeD(fpc.pdUnderAug);
+				writeD(fpc.pdHeadAug);
+				writeD(fpc.pdRHandAug);
+				writeD(fpc.pdLHandAug);
+				writeD(fpc.pdGlovesAug);
+				writeD(fpc.pdChestAug);
+				writeD(fpc.pdLegsAug);
+				writeD(fpc.pdFeetAug);
+				writeD(fpc.pdBackAug);
+				writeD(fpc.pdLRHandAug);
+				writeD(fpc.pdHairAug);
+				writeD(fpc.pdHair2Aug);
+				writeD(fpc.pdRBraceletAug);
+				writeD(fpc.pdLBraceletAug);
+				writeD(fpc.pdDeco1Aug);
+				writeD(fpc.pdDeco2Aug);
+				writeD(fpc.pdDeco3Aug);
+				writeD(fpc.pdDeco4Aug);
+				writeD(fpc.pdDeco5Aug);
+				writeD(fpc.pdDeco6Aug);
+				writeD(0x00); // belt aug
+				writeD(0x00);
+				writeD(0x01);
+				
+				writeD(fpc.pvpFlag);
+				writeD(fpc.karma);
+				
+				writeD(_mAtkSpd);
+				writeD(_pAtkSpd);
+				
+				writeD(0x00);
+				
+				writeD(_runSpd);
+				writeD(_walkSpd);
+				writeD(_runSpd); // swim run speed
+				writeD(_walkSpd); // swim walk speed
+				writeD(_runSpd); // fly run speed
+				writeD(_walkSpd); // fly walk speed
+				writeD(_runSpd);
+				writeD(_walkSpd);
+				writeF(_npc.getMovementSpeedMultiplier()); // _activeChar.getProperMultiplier()
+				writeF(_npc.getAttackSpeedMultiplier()); // _activeChar.getAttackSpeedMultiplier()
+				
+				// TODO: add handling of mount collision
+				L2PcTemplate pctmpl = PlayerTemplateData.getInstance().getTemplate(fpc.clazz);
+				writeF(fpc.sex == 0 ? pctmpl.getCollisionRadius() : pctmpl.getCollisionRadius());
+				writeF(fpc.sex == 0 ? pctmpl.getCollisionHeight() : pctmpl.getCollisionHeight());
+				
+				writeD(fpc.hairStyle);
+				writeD(fpc.hairColor);
+				writeD(fpc.face);
+				
+				if (_npc instanceof L2MonsterInstance)
+				{
+					writeS(fpc.title + " - HP " + new DecimalFormat("#.##").format((100.0 * _npc.getCurrentHp()) / _npc.getMaxHp()) + "%"); // visible title
+				}
+				else
+				{
+					writeS(fpc.title);
+				}
+				
+				writeD(0x00); // clan id
+				writeD(0x00); // clan crest id
+				writeD(0x00); // ally id
+				writeD(0x00); // ally crest id
+				
+				writeC(0x01); // standing = 1 sitting = 0
+				writeC(_npc.isRunning() ? 1 : 0); // running = 1 walking = 0
+				writeC(_npc.isInCombat() ? 1 : 0);
+				writeC(_npc.isAlikeDead() ? 1 : 0);
+				
+				writeC(fpc.invisible); // invisible = 1 visible =0
+				
+				writeC(fpc.mount); // 1 on strider 2 on wyvern 3 on Great Wolf 0 no mount
+				writeC(0x00); // 1 - sellshop
+				writeH(0x00); // cubic count
+				
+				// for (int id : allCubics)
+				// writeH(id);
+				
+				writeC(0x00); // find party members
+				writeD(0x00); // abnormal effect
+				writeC(0x00); // isFlying() ? 2 : 0
+				writeH(0x00); // getRecomHave(): Blue value for name (0 = white, 255 = pure blue)
+				writeD(1000000); // getMountNpcId() + 1000000
+				writeD(fpc.clazz);
+				writeD(0x00); // ?
+				writeC(fpc.enchantEffect);
+				writeC(fpc.team); // team circle around feet 1= Blue, 2 = red
+				writeD(0x00); // getClanCrestLargeId()
+				writeC(0x00); // isNoble(): Symbol on char menu ctrl+I
+				writeC(fpc.hero); // Hero Aura
+				writeC(fpc.fishing); // 0x01: Fishing Mode (Cant be undone by setting back to 0)
+				writeD(fpc.fishingX);
+				writeD(fpc.fishingY);
+				writeD(fpc.fishingZ);
+				
+				writeD(fpc.nameColor);
+				writeD(_heading);
+				writeD(0x00); // pledge class
+				writeD(0x00); // pledge type
+				writeD(fpc.titleColor);
+				
+				writeD(0x00); // cursed weapon level
+				writeD(0x00); // reputation score
+				writeD(0x00); // transformation id
+				writeD(0x00); // agathion id
+				writeD(0x01); // T2 ?
+				writeD(0x00); // special effect
+				/*
+				 * writeD(0x00); // territory Id writeD(0x00); // is Disguised writeD(0x00); // territory Id
+				 */
+			}
+			else
+			{
+				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);
+				writeD(_swimWalkSpd);
+				writeD(_flyRunSpd);
+				writeD(_flyWalkSpd);
+				writeD(_flyRunSpd);
+				writeD(_flyWalkSpd);
+				writeF(_moveMultiplier);
+				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 : 0); // invisible ?? 0=false 1=true 2=summoned (only works if model has a summon animation)
+				writeD(-1); // High Five NPCString ID
+				writeS(_name);
+				writeD(-1); // High Five NPCString ID
+				writeS(_title);
+				writeD(0x00); // Title color 0=client default
+				writeD(0x00); // pvp flag
+				writeD(0x00); // karma
+				
+				writeD(_npc.isInvisible() ? _npc.getAbnormalVisualEffects() | AbnormalVisualEffect.STEALTH.getMask() : _npc.getAbnormalVisualEffects());
+				writeD(_clanId); // clan id
+				writeD(_clanCrest); // crest id
+				writeD(_allyId); // ally id
+				writeD(_allyCrest); // all crest
+				
+				writeC(_npc.isInsideZone(ZoneId.WATER) ? 1 : _npc.isFlying() ? 2 : 0); // C2
+				writeC(_npc.getTeam().getId());
+				
+				writeF(_collisionRadius);
+				writeF(_collisionHeight);
+				writeD(_enchantEffect); // C4
+				writeD(_npc.isFlying() ? 1 : 0); // C6
+				writeD(0x00);
+				writeD(_npc.getColorEffect()); // CT1.5 Pet form and skills, Color effect
+				writeC(_npc.isTargetable() ? 0x01 : 0x00);
+				writeC(_npc.isShowName() ? 0x01 : 0x00);
+				writeD(_npc.getAbnormalVisualEffectSpecial());
+				writeD(_displayEffect);
+			}
 		}
 	}
 

CitarSQL:

Index: /trunk/Data/dist/sql/Custom  sql  for server/fake_pcs/fake_pcs.sql
===================================================================
--- /trunk/Data/dist/sql/Custom  sql  for server/fake_pcs/fake_pcs.sql  (revision 340)
+++ /trunk/Data/dist/sql/Custom  sql  for server/fake_pcs/fake_pcs.sql  (revision 340)
@@ -0,0 +1,75 @@
+SET FOREIGN_KEY_CHECKS=0;
+-- ----------------------------
+-- Table structure for `fake_pcs`
+-- ----------------------------
DROP TABLE IF EXISTS `fake_pcs`;
CREATE TABLE `fake_pcs` (
  `npc_id` int(11) NOT NULL,
  `race` int(11) NOT NULL DEFAULT '0',
  `sex` int(11) NOT NULL DEFAULT '0',
  `class` int(11) NOT NULL DEFAULT '0',
  `title` varchar(255) NOT NULL,
  `title_color` int(11) NOT NULL DEFAULT '0',
  `name` varchar(255) NOT NULL,
  `name_color` int(11) NOT NULL DEFAULT '0',
  `hair_style` int(11) NOT NULL DEFAULT '0',
  `hair_color` int(11) NOT NULL DEFAULT '0',
  `face` int(11) NOT NULL DEFAULT '0',
  `mount` tinyint(4) NOT NULL DEFAULT '0',
  `team` tinyint(4) NOT NULL DEFAULT '0',
  `hero` tinyint(4) NOT NULL DEFAULT '0',
  `pd_under` int(11) NOT NULL DEFAULT '0',
  `pd_under_aug` int(11) NOT NULL DEFAULT '0',
  `pd_head` int(11) NOT NULL DEFAULT '0',
  `pd_head_aug` int(11) NOT NULL DEFAULT '0',
  `pd_rhand` int(11) NOT NULL DEFAULT '0',
  `pd_rhand_aug` int(11) NOT NULL DEFAULT '0',
  `pd_lhand` int(11) NOT NULL DEFAULT '0',
  `pd_lhand_aug` int(11) NOT NULL DEFAULT '0',
  `pd_gloves` int(11) NOT NULL DEFAULT '0',
  `pd_gloves_aug` int(11) NOT NULL DEFAULT '0',
  `pd_chest` int(11) NOT NULL DEFAULT '0',
  `pd_chest_aug` int(11) NOT NULL DEFAULT '0',
  `pd_legs` int(11) NOT NULL DEFAULT '0',
  `pd_legs_aug` int(11) NOT NULL DEFAULT '0',
  `pd_feet` int(11) NOT NULL DEFAULT '0',
  `pd_feet_aug` int(11) NOT NULL DEFAULT '0',
  `pd_back` int(11) NOT NULL DEFAULT '0',
  `pd_back_aug` int(11) NOT NULL DEFAULT '0',
  `pd_lrhand` int(11) NOT NULL DEFAULT '0',
  `pd_lrhand_aug` int(11) NOT NULL DEFAULT '0',
  `pd_hair` int(11) NOT NULL DEFAULT '0',
  `pd_hair_aug` int(11) NOT NULL DEFAULT '0',
  `pd_hair2` int(11) NOT NULL DEFAULT '0',
  `pd_hair2_aug` int(11) NOT NULL DEFAULT '0',
  `pd_rbracelet` int(11) NOT NULL DEFAULT '0',
  `pd_rbracelet_aug` int(11) NOT NULL DEFAULT '0',
  `pd_lbracelet` int(11) NOT NULL DEFAULT '0',
  `pd_lbracelet_aug` int(11) NOT NULL DEFAULT '0',
  `pd_deco1` int(11) NOT NULL DEFAULT '0',
  `pd_deco1_aug` int(11) NOT NULL DEFAULT '0',
  `pd_deco2` int(11) NOT NULL DEFAULT '0',
  `pd_deco2_aug` int(11) NOT NULL DEFAULT '0',
  `pd_deco3` int(11) NOT NULL DEFAULT '0',
  `pd_deco3_aug` int(11) NOT NULL DEFAULT '0',
  `pd_deco4` int(11) NOT NULL DEFAULT '0',
  `pd_deco4_aug` int(11) NOT NULL DEFAULT '0',
  `pd_deco5` int(11) NOT NULL DEFAULT '0',
  `pd_deco5_aug` int(11) NOT NULL DEFAULT '0',
  `pd_deco6` int(11) NOT NULL DEFAULT '0',
  `pd_deco6_aug` int(11) NOT NULL DEFAULT '0',
  `enchant_effect` tinyint(4) NOT NULL DEFAULT '0',
  `pvp_flag` int(11) NOT NULL DEFAULT '0',
  `karma` int(11) NOT NULL DEFAULT '0',
  `fishing` tinyint(4) NOT NULL DEFAULT '0',
  `fishing_x` int(11) NOT NULL DEFAULT '0',
  `fishing_y` int(11) NOT NULL DEFAULT '0',
  `fishing_z` int(11) NOT NULL DEFAULT '0',
  `invisible` tinyint(4) NOT NULL DEFAULT '1',
  PRIMARY KEY (`npc_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
+-- ----------------------------
+-- Records of fake_pcs
+-- ----------------------------
INSERT INTO `fake_pcs` VALUES ('9023', '0', '0', '88', '--', '64672', 'Flash', '64672', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '16015', '0', '0', '0', '43102', '0', '43100', '0', '43101', '0','43103', '0', '21716', '0', '0', '0', '40023', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '30', '0', '0', '0', '0', '0', '0', '0');

 

PD: Es requerido crear en stats/npc/custom los fake players/npc creados ;)