AbstractNpcInfo.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package com.l2jserver.gameserver.network.serverpackets;
  16. import com.l2jserver.Config;
  17. import com.l2jserver.gameserver.datatables.ClanTable;
  18. import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager;
  19. import com.l2jserver.gameserver.instancemanager.TownManager;
  20. import com.l2jserver.gameserver.model.L2Clan;
  21. import com.l2jserver.gameserver.model.L2Transformation;
  22. import com.l2jserver.gameserver.model.actor.L2Character;
  23. import com.l2jserver.gameserver.model.actor.L2Decoy;
  24. import com.l2jserver.gameserver.model.actor.L2Npc;
  25. import com.l2jserver.gameserver.model.actor.L2Summon;
  26. import com.l2jserver.gameserver.model.actor.L2Trap;
  27. import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
  28. import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
  29. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  30. import com.l2jserver.gameserver.model.itemcontainer.Inventory;
  31. import com.l2jserver.gameserver.skills.AbnormalEffect;
  32. /**
  33. * This class ...
  34. *
  35. * @version $Revision: 1.7.2.4.2.9 $ $Date: 2005/04/11 10:05:54 $
  36. */
  37. public abstract class AbstractNpcInfo extends L2GameServerPacket
  38. {
  39. // ddddddddddddddddddffffdddcccccSSddd dddddc
  40. // ddddddddddddddddddffffdddcccccSSddd dddddccffd
  41. private static final String _S__22_NPCINFO = "[S] 0c NpcInfo";
  42. protected int _x, _y, _z, _heading;
  43. protected int _idTemplate;
  44. protected boolean _isAttackable, _isSummoned;
  45. protected int _mAtkSpd, _pAtkSpd;
  46. /**
  47. * Run speed, swimming run speed and flying run speed
  48. */
  49. protected int _runSpd;
  50. /**
  51. * Walking speed, swimming walking speed and flying walking speed
  52. */
  53. protected int _walkSpd;
  54. protected int _rhand, _lhand, _chest, _enchantEffect;
  55. protected double _collisionHeight, _collisionRadius;
  56. protected String _name = "";
  57. protected String _title = "";
  58. public AbstractNpcInfo(L2Character cha)
  59. {
  60. _isSummoned = cha.isShowSummonAnimation();
  61. _x = cha.getX();
  62. _y = cha.getY();
  63. _z = cha.getZ();
  64. _heading = cha.getHeading();
  65. _mAtkSpd = cha.getMAtkSpd();
  66. _pAtkSpd = cha.getPAtkSpd();
  67. _runSpd = cha.getTemplate().baseRunSpd;
  68. _walkSpd = cha.getTemplate().baseWalkSpd;
  69. }
  70. /* (non-Javadoc)
  71. * @see com.l2jserver.gameserver.serverpackets.ServerBasePacket#getType()
  72. */
  73. @Override
  74. public String getType()
  75. {
  76. return _S__22_NPCINFO;
  77. }
  78. /**
  79. * Packet for Npcs
  80. */
  81. public static class NpcInfo extends AbstractNpcInfo
  82. {
  83. private L2Npc _npc;
  84. private int _clanCrest = 0;
  85. private int _allyCrest = 0;
  86. private int _allyId = 0;
  87. private int _clanId = 0;
  88. public NpcInfo(L2Npc cha, L2Character attacker)
  89. {
  90. super(cha);
  91. _npc = cha;
  92. _idTemplate = cha.getTemplate().idTemplate; // On every subclass
  93. _rhand = cha.getRightHandItem(); // On every subclass
  94. _lhand = cha.getLeftHandItem(); // On every subclass
  95. _enchantEffect = cha.getEnchantEffect();
  96. _collisionHeight = cha.getCollisionHeight();// On every subclass
  97. _collisionRadius = cha.getCollisionRadius();// On every subclass
  98. _isAttackable = cha.isAutoAttackable(attacker);
  99. if (cha.getTemplate().serverSideName)
  100. _name = cha.getName();// On every subclass
  101. if (Config.L2JMOD_CHAMPION_ENABLE && cha.isChampion())
  102. _title = (Config.L2JMOD_CHAMP_TITLE); // On every subclass
  103. else if (cha.getTemplate().serverSideTitle)
  104. _title = cha.getTemplate().title; // On every subclass
  105. else
  106. _title = cha.getTitle(); // On every subclass
  107. if (Config.SHOW_NPC_LVL && _npc instanceof L2MonsterInstance)
  108. {
  109. String t = "Lv " + cha.getLevel() + (cha.getAggroRange() > 0 ? "*" : "");
  110. if (_title != null)
  111. t += " " + _title;
  112. _title = t;
  113. }
  114. // npc crest of owning clan/ally of castle
  115. if (cha instanceof L2NpcInstance && cha.isInsideZone(L2Character.ZONE_TOWN) && (Config.SHOW_CREST_WITHOUT_QUEST || cha.getCastle().getShowNpcCrest()) && cha.getCastle().getOwnerId() != 0)
  116. {
  117. int townId = TownManager.getTown(_x, _y, _z).getTownId();
  118. if (townId != 33 && townId != 22)
  119. {
  120. L2Clan clan = ClanTable.getInstance().getClan(cha.getCastle().getOwnerId());
  121. _clanCrest = clan.getCrestId();
  122. _clanId = clan.getClanId();
  123. _allyCrest = clan.getAllyCrestId();
  124. _allyId = clan.getAllyId();
  125. }
  126. }
  127. }
  128. @Override
  129. protected void writeImpl()
  130. {
  131. writeC(0x0c);
  132. writeD(_npc.getObjectId());
  133. writeD(_idTemplate + 1000000); // npctype id
  134. writeD(_isAttackable ? 1 : 0);
  135. writeD(_x);
  136. writeD(_y);
  137. writeD(_z);
  138. writeD(_heading);
  139. writeD(0x00);
  140. writeD(_mAtkSpd);
  141. writeD(_pAtkSpd);
  142. writeD(_runSpd);
  143. writeD(_walkSpd);
  144. writeD(_runSpd); // swim run speed
  145. writeD(_walkSpd); // swim walk speed
  146. writeD(_runSpd); // swim run speed
  147. writeD(_walkSpd); // swim walk speed
  148. writeD(_runSpd); // fly run speed
  149. writeD(_walkSpd); // fly run speed
  150. writeF(_npc.getMovementSpeedMultiplier());
  151. writeF(_npc.getAttackSpeedMultiplier());
  152. writeF(_collisionRadius);
  153. writeF(_collisionHeight);
  154. writeD(_rhand); // right hand weapon
  155. writeD(_chest);
  156. writeD(_lhand); // left hand weapon
  157. writeC(1); // name above char 1=true ... ??
  158. writeC(_npc.isRunning() ? 1 : 0);
  159. writeC(_npc.isInCombat() ? 1 : 0);
  160. writeC(_npc.isAlikeDead() ? 1 : 0);
  161. writeC(_isSummoned ? 2 : 0); // 0=teleported 1=default 2=summoned
  162. writeS(_name);
  163. writeS(_title);
  164. writeD(0x00); // Title color 0=client default
  165. writeD(0x00); //pvp flag
  166. writeD(0x00); // karma
  167. writeD(_npc.getAbnormalEffect()); // C2
  168. writeD(_clanId); //clan id
  169. writeD(_clanCrest); //crest id
  170. writeD(_allyId); // ally id
  171. writeD(_allyCrest); // all crest
  172. writeC(_npc.isFlying() ? 2 : 0); // C2
  173. writeC(0x00); // title color 0=client
  174. writeF(_collisionRadius);
  175. writeF(_collisionHeight);
  176. writeD(_enchantEffect); // C4
  177. writeD(_npc.isFlying() ? 1 : 0); // C6
  178. writeD(0x00);
  179. writeD(0x00);// CT1.5 Pet form and skills
  180. writeC(0x01);
  181. writeC(0x01);
  182. writeD(_npc.getSpecialEffect());
  183. }
  184. }
  185. public static class TrapInfo extends AbstractNpcInfo
  186. {
  187. private L2Trap _trap;
  188. public TrapInfo(L2Trap cha, L2Character attacker)
  189. {
  190. super(cha);
  191. _trap = cha;
  192. _idTemplate = cha.getTemplate().idTemplate;
  193. _isAttackable = cha.isAutoAttackable(attacker);
  194. _rhand = 0;
  195. _lhand = 0;
  196. _collisionHeight = _trap.getTemplate().fCollisionHeight;
  197. _collisionRadius = _trap.getTemplate().fCollisionRadius;
  198. if (cha.getTemplate().serverSideName)
  199. _name = cha.getName();
  200. _title = cha.getOwner() != null ? cha.getOwner().getName() : "";
  201. _runSpd = _trap.getRunSpeed();
  202. _walkSpd = _trap.getWalkSpeed();
  203. }
  204. @Override
  205. protected void writeImpl()
  206. {
  207. writeC(0x0c);
  208. writeD(_trap.getObjectId());
  209. writeD(_idTemplate + 1000000); // npctype id
  210. writeD(_isAttackable ? 1 : 0);
  211. writeD(_x);
  212. writeD(_y);
  213. writeD(_z);
  214. writeD(_heading);
  215. writeD(0x00);
  216. writeD(_mAtkSpd);
  217. writeD(_pAtkSpd);
  218. writeD(_runSpd);
  219. writeD(_walkSpd);
  220. writeD(_runSpd); // swim run speed
  221. writeD(_walkSpd); // swim walk speed
  222. writeD(_runSpd); // fly run speed
  223. writeD(_walkSpd); // fly walk speed
  224. writeD(_runSpd); // fly run speed
  225. writeD(_walkSpd); // fly walk speed
  226. writeF(_trap.getMovementSpeedMultiplier());
  227. writeF(_trap.getAttackSpeedMultiplier());
  228. writeF(_collisionRadius);
  229. writeF(_collisionHeight);
  230. writeD(_rhand); // right hand weapon
  231. writeD(_chest);
  232. writeD(_lhand); // left hand weapon
  233. writeC(1); // name above char 1=true ... ??
  234. writeC(1);
  235. writeC(_trap.isInCombat() ? 1 : 0);
  236. writeC(_trap.isAlikeDead() ? 1 : 0);
  237. writeC(_isSummoned ? 2 : 0); // 0=teleported 1=default 2=summoned
  238. writeS(_name);
  239. writeS(_title);
  240. writeD(0x00); // title color 0 = client default
  241. writeD(_trap.getPvpFlag());
  242. writeD(_trap.getKarma());
  243. writeD(_trap.getAbnormalEffect()); // C2
  244. writeD(0x00); //clan id
  245. writeD(0x00); //crest id
  246. writeD(0000); // C2
  247. writeD(0000); // C2
  248. writeC(0000); // C2
  249. writeC(0x00); // Title color 0=client default
  250. writeF(_collisionRadius);
  251. writeF(_collisionHeight);
  252. writeD(0x00); // C4
  253. writeD(0x00); // C6
  254. writeD(0x00);
  255. writeD(0);//CT1.5 Pet form and skills
  256. writeC(0x01);
  257. writeC(0x01);
  258. writeD(0x00);
  259. }
  260. }
  261. /**
  262. * Packet for Decoys
  263. */
  264. public static class DecoyInfo extends AbstractNpcInfo
  265. {
  266. private L2Decoy _decoy;
  267. public DecoyInfo(L2Decoy cha)
  268. {
  269. super(cha);
  270. _idTemplate = cha.getTemplate().idTemplate;
  271. _decoy = cha;
  272. _heading = cha.getOwner().getHeading();
  273. // _mAtkSpd = cha.getMAtkSpd(); on abstract constructor
  274. _pAtkSpd = cha.getOwner().getPAtkSpd();
  275. _runSpd = cha.getOwner().getRunSpeed();
  276. _walkSpd = cha.getOwner().getWalkSpeed();
  277. assert _idTemplate >= 13071 && _idTemplate <= 13076;
  278. if (_idTemplate < 13071 || _idTemplate > 13076)
  279. {
  280. throw new IllegalArgumentException("Using DecoyInfo packet with an unsupported decoy template: " + _idTemplate);
  281. }
  282. }
  283. @Override
  284. protected void writeImpl()
  285. {
  286. writeC(0x31);
  287. writeD(_x);
  288. writeD(_y);
  289. writeD(_z);
  290. writeD(_heading);
  291. writeD(_decoy.getObjectId());
  292. writeS(_decoy.getOwner().getAppearance().getVisibleName());
  293. writeD(_decoy.getOwner().getRace().ordinal());
  294. writeD(_decoy.getOwner().getAppearance().getSex() ? 1 : 0);
  295. writeD(_decoy.getOwner().getClassIndex() == 0 ? _decoy.getOwner().getClassId().getId() : _decoy.getOwner().getBaseClass());
  296. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
  297. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
  298. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
  299. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
  300. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
  301. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
  302. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
  303. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET));
  304. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK));
  305. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
  306. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
  307. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR2));
  308. // T1 new d's
  309. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RBRACELET));
  310. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LBRACELET));
  311. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_DECO1));
  312. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_DECO2));
  313. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_DECO3));
  314. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_DECO4));
  315. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_DECO5));
  316. writeD(_decoy.getOwner().getInventory().getPaperdollItemId(Inventory.PAPERDOLL_DECO6));
  317. // end of t1 new d's
  318. // CT2.3
  319. writeD(0x00);
  320. // c6 new h's
  321. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_UNDER));
  322. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_HEAD));
  323. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_RHAND));
  324. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_LHAND));
  325. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_GLOVES));
  326. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_CHEST));
  327. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_LEGS));
  328. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_FEET));
  329. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_BACK));
  330. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_LRHAND));
  331. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_HAIR));
  332. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_HAIR2));
  333. // T1 new h's
  334. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_RBRACELET));
  335. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_LBRACELET));
  336. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_DECO1));
  337. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_DECO2));
  338. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_DECO3));
  339. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_DECO4));
  340. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_DECO5));
  341. writeD(_decoy.getOwner().getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_DECO6));
  342. // end of t1 new h's
  343. // CT2.3
  344. writeD(0x00);
  345. writeD(0x00);
  346. writeD(0x00);
  347. writeD(_decoy.getOwner().getPvpFlag());
  348. writeD(_decoy.getOwner().getKarma());
  349. writeD(_mAtkSpd);
  350. writeD(_pAtkSpd);
  351. writeD(_decoy.getOwner().getPvpFlag());
  352. writeD(_decoy.getOwner().getKarma());
  353. writeD(_runSpd);
  354. writeD(_walkSpd);
  355. writeD(50); // swim run speed
  356. writeD(50); // swim walk speed
  357. writeD(_runSpd); // fly run speed
  358. writeD(_walkSpd); // fly walk speed
  359. writeD(_runSpd); // fly run speed
  360. writeD(_walkSpd); // fly walk speed
  361. writeF(_decoy.getOwner().getMovementSpeedMultiplier()); // _activeChar.getProperMultiplier()
  362. writeF(_decoy.getOwner().getAttackSpeedMultiplier()); // _activeChar.getAttackSpeedMultiplier()
  363. L2Summon pet = _decoy.getPet();
  364. L2Transformation trans;
  365. if (_decoy.getOwner().getMountType() != 0 && pet != null)
  366. {
  367. writeF(pet.getTemplate().fCollisionRadius);
  368. writeF(pet.getTemplate().fCollisionHeight);
  369. }
  370. else if ((trans = _decoy.getOwner().getTransformation()) != null)
  371. {
  372. writeF(trans.getCollisionRadius());
  373. writeF(trans.getCollisionHeight());
  374. }
  375. else
  376. {
  377. writeF(_decoy.getOwner().getBaseTemplate().fCollisionRadius);
  378. writeF(_decoy.getOwner().getBaseTemplate().fCollisionHeight);
  379. }
  380. writeD(_decoy.getOwner().getAppearance().getHairStyle());
  381. writeD(_decoy.getOwner().getAppearance().getHairColor());
  382. writeD(_decoy.getOwner().getAppearance().getFace());
  383. writeS(_decoy.getOwner().getAppearance().getVisibleTitle());
  384. writeD(_decoy.getOwner().getClanId());
  385. writeD(_decoy.getOwner().getClanCrestId());
  386. writeD(_decoy.getOwner().getAllyId());
  387. writeD(_decoy.getOwner().getAllyCrestId());
  388. // In UserInfo leader rights and siege flags, but here found nothing??
  389. // Therefore RelationChanged packet with that info is required
  390. writeD(0);
  391. writeC(_decoy.getOwner().isSitting() ? 0 : 1); // standing = 1 sitting = 0
  392. writeC(_decoy.getOwner().isRunning() ? 1 : 0); // running = 1 walking = 0
  393. writeC(_decoy.getOwner().isInCombat() ? 1 : 0);
  394. writeC(_decoy.getOwner().isAlikeDead() ? 1 : 0);
  395. writeC(_decoy.getOwner().getAppearance().getInvisible() ? 1 : 0); // invisible = 1 visible =0
  396. writeC(_decoy.getOwner().getMountType()); // 1 on strider 2 on wyvern 3 on Great Wolf 0 no mount
  397. writeC(_decoy.getOwner().getPrivateStoreType()); // 1 - sellshop
  398. writeH(_decoy.getOwner().getCubics().size());
  399. for (int id : _decoy.getOwner().getCubics().keySet())
  400. writeH(id);
  401. writeC(0x00); // find party members
  402. writeD(_decoy.getOwner().getAbnormalEffect());
  403. writeC(_decoy.getOwner().getRecomLeft()); //Changed by Thorgrim
  404. writeH(_decoy.getOwner().getRecomHave()); //Blue value for name (0 = white, 255 = pure blue)
  405. writeD(_decoy.getOwner().getClassId().getId());
  406. writeD(_decoy.getOwner().getMaxCp());
  407. writeD((int) _decoy.getOwner().getCurrentCp());
  408. writeC(_decoy.getOwner().isMounted() ? 0 : _decoy.getOwner().getEnchantEffect());
  409. if (_decoy.getOwner().getTeam() == 1)
  410. writeC(0x01); //team circle around feet 1= Blue, 2 = red
  411. else if (_decoy.getOwner().getTeam() == 2)
  412. writeC(0x02); //team circle around feet 1= Blue, 2 = red
  413. else
  414. writeC(0x00); //team circle around feet 1= Blue, 2 = red
  415. writeD(_decoy.getOwner().getClanCrestLargeId());
  416. writeC(_decoy.getOwner().isNoble() ? 1 : 0); // Symbol on char menu ctrl+I
  417. writeC(_decoy.getOwner().isHero() ? 1 : 0); // Hero Aura
  418. writeC(_decoy.getOwner().isFishing() ? 1 : 0); //0x01: Fishing Mode (Cant be undone by setting back to 0)
  419. writeD(_decoy.getOwner().getFishx());
  420. writeD(_decoy.getOwner().getFishy());
  421. writeD(_decoy.getOwner().getFishz());
  422. writeD(_decoy.getOwner().getAppearance().getNameColor());
  423. writeD(0x00); // isRunning() as in UserInfo?
  424. writeD(_decoy.getOwner().getPledgeClass());
  425. writeD(0x00); // ??
  426. writeD(_decoy.getOwner().getAppearance().getTitleColor());
  427. //writeD(0x00); // ??
  428. writeD(_decoy.getOwner().isCursedWeaponEquipped() ? CursedWeaponsManager.getInstance().getLevel(_decoy.getOwner().getCursedWeaponEquippedId()) : 0x00);
  429. // T1
  430. writeD(0x00);
  431. writeD(_decoy.getOwner().getTransformationId());
  432. }
  433. }
  434. /**
  435. * Packet for summons
  436. */
  437. public static class SummonInfo extends AbstractNpcInfo
  438. {
  439. private L2Summon _summon;
  440. private int _form = 0;
  441. private int _val = 0;
  442. public SummonInfo(L2Summon cha, L2Character attacker, int val)
  443. {
  444. super(cha);
  445. _summon = cha;
  446. _val = val;
  447. if (_summon.isShowSummonAnimation())
  448. _val = 2; //override for spawn
  449. int npcId = cha.getTemplate().npcId;
  450. if (npcId == 16041 || npcId == 16042)
  451. {
  452. if (cha.getLevel() > 84)
  453. _form = 3;
  454. else if (cha.getLevel() > 79)
  455. _form = 2;
  456. else if (cha.getLevel() > 74)
  457. _form = 1;
  458. }
  459. else if (npcId == 16025 || npcId == 16037)
  460. {
  461. if (cha.getLevel() > 69)
  462. _form = 3;
  463. else if (cha.getLevel() > 64)
  464. _form = 2;
  465. else if (cha.getLevel() > 59)
  466. _form = 1;
  467. }
  468. // fields not set on AbstractNpcInfo
  469. _isAttackable = cha.isAutoAttackable(attacker);
  470. _rhand = cha.getWeapon();
  471. _lhand = 0;
  472. _chest = cha.getArmor();
  473. _enchantEffect = cha.getTemplate().enchantEffect;
  474. if (cha.getTemplate().serverSideName)
  475. _name = cha.getName();
  476. _title = cha.getOwner() != null ? (cha.getOwner().isOnline() == 0 ? "" : cha.getOwner().getName()) : ""; // when owner online, summon will show in title owner name
  477. _idTemplate = cha.getTemplate().idTemplate;
  478. _collisionHeight = cha.getTemplate().fCollisionHeight;
  479. _collisionRadius = cha.getTemplate().fCollisionRadius;
  480. _invisible = cha.getOwner() != null ? cha.getOwner().getAppearance().getInvisible() : false;
  481. // few fields needing fix from AbstractNpcInfo
  482. _runSpd = cha.getPetSpeed();
  483. _walkSpd = cha.isMountable() ? 45 : 30;
  484. }
  485. @Override
  486. protected void writeImpl()
  487. {
  488. boolean gmSeeInvis = false;
  489. if (_invisible)
  490. {
  491. L2PcInstance tmp = getClient().getActiveChar();
  492. if (tmp != null && tmp.isGM())
  493. gmSeeInvis = true;
  494. }
  495. writeC(0x0c);
  496. writeD(_summon.getObjectId());
  497. writeD(_idTemplate + 1000000); // npctype id
  498. writeD(_isAttackable ? 1 : 0);
  499. writeD(_x);
  500. writeD(_y);
  501. writeD(_z);
  502. writeD(_heading);
  503. writeD(0x00);
  504. writeD(_mAtkSpd);
  505. writeD(_pAtkSpd);
  506. writeD(_runSpd);
  507. writeD(_walkSpd);
  508. writeD(_runSpd); // swim run speed
  509. writeD(_walkSpd); // swim walk speed
  510. writeD(_runSpd); // fly run speed
  511. writeD(_walkSpd); // fly walk speed
  512. writeD(_runSpd); // fly run speed
  513. writeD(_walkSpd); // fly walk speed
  514. writeF(_summon.getMovementSpeedMultiplier());
  515. writeF(_summon.getAttackSpeedMultiplier());
  516. writeF(_collisionRadius);
  517. writeF(_collisionHeight);
  518. writeD(_rhand); // right hand weapon
  519. writeD(_chest);
  520. writeD(_lhand); // left hand weapon
  521. writeC(1); // name above char 1=true ... ??
  522. writeC(1); // always running 1=running 0=walking
  523. writeC(_summon.isInCombat() ? 1 : 0);
  524. writeC(_summon.isAlikeDead() ? 1 : 0);
  525. writeC(_val); // 0=teleported 1=default 2=summoned
  526. writeS(_name);
  527. writeS(_title);
  528. writeD(0x01);// Title color 0=client default
  529. writeD(_summon.getPvpFlag());
  530. writeD(_summon.getKarma());
  531. writeD(gmSeeInvis ? _summon.getAbnormalEffect() | AbnormalEffect.STEALTH.getMask() : _summon.getAbnormalEffect());
  532. writeD(0x00); //clan id
  533. writeD(0x00); //crest id
  534. writeD(0000); // C2
  535. writeD(0000); // C2
  536. writeC(0000); // C2
  537. writeC(_summon.getTeam());// Title color 0=client default
  538. writeF(_collisionRadius);
  539. writeF(_collisionHeight);
  540. writeD(_enchantEffect); // C4
  541. writeD(0x00); // C6
  542. writeD(0x00);
  543. writeD(_form); //CT1.5 Pet form and skills
  544. writeC(0x01);
  545. writeC(0x01);
  546. writeD(_summon.getSpecialEffect());
  547. }
  548. }
  549. }