UserInfo.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  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 net.sf.l2j.gameserver.serverpackets;
  16. import net.sf.l2j.Config;
  17. import net.sf.l2j.gameserver.datatables.NpcTable;
  18. import net.sf.l2j.gameserver.instancemanager.CursedWeaponsManager;
  19. import net.sf.l2j.gameserver.model.Inventory;
  20. import net.sf.l2j.gameserver.model.L2Summon;
  21. import net.sf.l2j.gameserver.model.L2Transformation;
  22. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  23. import net.sf.l2j.gameserver.templates.L2NpcTemplate;
  24. /**
  25. * 0000: 04 03 15 00 00 77 ff 00 00 80 f1 ff ff 00 00 00 .....w..........
  26. * 0010: 00 2a 89 00 4c 43 00 61 00 6c 00 61 00 64 00 6f .*..LC.a.l.a.d.o
  27. * 0020: 00 6e 00 00 00 01 00 00 00 00 00 00 00 19 00 00 .n..............
  28. * 0030: 00 0d 00 00 00 ee 81 02 00 15 00 00 00 18 00 00 ................
  29. * 0040: 00 19 00 00 00 25 00 00 00 17 00 00 00 28 00 00 .....%.......(..
  30. * 0050: 00 14 01 00 00 14 01 00 00 02 01 00 00 02 01 00 ................
  31. * 0060: 00 fa 09 00 00 81 06 00 00 26 34 00 00 2e 00 00 .........&4.....
  32. * 0070: 00 00 00 00 00 db 9f a1 41 93 26 64 41 de c8 31 ........A.&dA..1
  33. * 0080: 41 ca 73 c0 41 d5 22 d0 41 83 bd 41 41 81 56 10 A.s.A.".A..AA.V.
  34. * 0090: 41 00 00 00 00 27 7d 30 41 69 aa e0 40 b4 fb d3 A....'}0Ai..@...
  35. * 00a0: 41 91 f9 63 41 00 00 00 00 81 56 10 41 00 00 00 A..cA.....V.A...
  36. * 00b0: 00 71 00 00 00 71 00 00 00 76 00 00 00 74 00 00 .q...q...v...t..
  37. * 00c0: 00 74 00 00 00 2a 00 00 00 e8 02 00 00 00 00 00 .t...*..........
  38. * 00d0: 00 5f 04 00 00 ac 01 00 00 cf 01 00 00 62 04 00 ._...........b..
  39. * 00e0: 00 00 00 00 00 e8 02 00 00 0b 00 00 00 52 01 00 .............R..
  40. * 00f0: 00 4d 00 00 00 2a 00 00 00 2f 00 00 00 29 00 00 .M...*.../...)..
  41. * 0100: 00 12 00 00 00 82 01 00 00 52 01 00 00 53 00 00 .........R...S..
  42. * 0110: 00 00 00 00 00 00 00 00 00 7a 00 00 00 55 00 00 .........z...U..
  43. * 0120: 00 32 00 00 00 32 00 00 00 00 00 00 00 00 00 00 .2...2..........
  44. * 0130: 00 00 00 00 00 00 00 00 00 a4 70 3d 0a d7 a3 f0 ..........p=....
  45. * 0140: 3f 64 5d dc 46 03 78 f3 3f 00 00 00 00 00 00 1e ?d].F.x.?.......
  46. * 0150: 40 00 00 00 00 00 00 38 40 02 00 00 00 01 00 00 @......8@.......
  47. * 0160: 00 00 00 00 00 00 00 00 00 00 00 c1 0c 00 00 01 ................
  48. * 0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  49. * 0180: 00 00 00 00 ....
  50. *
  51. *
  52. * dddddSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffffddddSdddcccdd (h)
  53. * dddddSddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ffffddddSdddddcccddh (h) c dc hhdh
  54. * dddddSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffffddddSdddddcccddh (h) c dc hhdh ddddc c dcc cddd d (from 654)
  55. * but it actually reads
  56. * dddddSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffffddddSdddddcccddh (h) c dc *dddddddd* hhdh ddddc dcc cddd d
  57. * *...*: here i am not sure at least it looks like it reads that much data (32 bytes), not sure about the format inside because it is not read thanks to the ususal parsing function
  58. *
  59. * dddddSddddQddddddddddddddddddddddddddddddddddddddddddddddddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddddddddddddddddddddffffddddSdddddcccddh [h] c dc d hhdh ddddc c dcc cddd d c dd d d
  60. * @version $Revision: 1.14.2.4.2.12 $ $Date: 2005/04/11 10:05:55 $
  61. */
  62. public final class UserInfo extends L2GameServerPacket
  63. {
  64. private static final String _S__04_USERINFO = "[S] 32 UserInfo";
  65. private L2PcInstance _activeChar;
  66. private int _runSpd, _walkSpd, _swimRunSpd, _swimWalkSpd, _flRunSpd, _flWalkSpd, _flyRunSpd,
  67. _flyWalkSpd, _relation;
  68. private float _moveMultiplier;
  69. /**
  70. * @param _characters
  71. */
  72. public UserInfo(L2PcInstance character)
  73. {
  74. _activeChar = character;
  75. _moveMultiplier = _activeChar.getMovementSpeedMultiplier();
  76. _runSpd = (int) (_activeChar.getRunSpeed() / _moveMultiplier);
  77. _walkSpd = (int) (_activeChar.getWalkSpeed() / _moveMultiplier);
  78. _swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
  79. _swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
  80. _relation = _activeChar.isClanLeader() ? 0x40 : 0;
  81. if (_activeChar.getSiegeState() == 1) _relation |= 0x180;
  82. if (_activeChar.getSiegeState() == 2) _relation |= 0x80;
  83. }
  84. @Override
  85. protected final void writeImpl()
  86. {
  87. writeC(0x32);
  88. writeD(_activeChar.getX());
  89. writeD(_activeChar.getY());
  90. writeD(_activeChar.getZ());
  91. writeD(_activeChar.getHeading());
  92. writeD(_activeChar.getObjectId());
  93. writeS(_activeChar.getName());
  94. writeD(_activeChar.getRace().ordinal());
  95. writeD(_activeChar.getAppearance().getSex()? 1 : 0);
  96. if (_activeChar.getClassIndex() == 0) writeD(_activeChar.getClassId().getId());
  97. else writeD(_activeChar.getBaseClass());
  98. writeD(_activeChar.getLevel());
  99. writeQ(_activeChar.getExp());
  100. writeD(_activeChar.getSTR());
  101. writeD(_activeChar.getDEX());
  102. writeD(_activeChar.getCON());
  103. writeD(_activeChar.getINT());
  104. writeD(_activeChar.getWIT());
  105. writeD(_activeChar.getMEN());
  106. writeD(_activeChar.getMaxHp());
  107. writeD((int) _activeChar.getCurrentHp());
  108. writeD(_activeChar.getMaxMp());
  109. writeD((int) _activeChar.getCurrentMp());
  110. writeD(_activeChar.getSp());
  111. writeD(_activeChar.getCurrentLoad());
  112. writeD(_activeChar.getMaxLoad());
  113. writeD(0x28); // unknown
  114. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIRALL));
  115. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_REAR));
  116. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEAR));
  117. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_NECK));
  118. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RFINGER));
  119. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LFINGER));
  120. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HEAD));
  121. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
  122. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LHAND));
  123. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES));
  124. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_CHEST));
  125. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEGS));
  126. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FEET));
  127. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_BACK));
  128. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LRHAND));
  129. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIR));
  130. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIR2));
  131. // T1 new D's
  132. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RBRACELET));
  133. writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LBRACELET));
  134. writeD(0x00);
  135. writeD(0x00);
  136. writeD(0x00);
  137. writeD(0x00);
  138. writeD(0x00);
  139. writeD(0x00);
  140. // end of T1 new D's
  141. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
  142. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_REAR));
  143. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEAR));
  144. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_NECK));
  145. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RFINGER));
  146. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LFINGER));
  147. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
  148. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
  149. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
  150. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
  151. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
  152. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
  153. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET));
  154. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK));
  155. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
  156. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
  157. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR2));
  158. // T1 new D's
  159. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RBRACELET));
  160. writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LBRACELET));
  161. writeD(0x00);
  162. writeD(0x00);
  163. writeD(0x00);
  164. writeD(0x00);
  165. writeD(0x00);
  166. writeD(0x00);
  167. // end of T1 new D's
  168. // c6 new h's
  169. writeH(0x00);
  170. writeH(0x00);
  171. writeH(0x00);
  172. writeH(0x00);
  173. writeH(0x00);
  174. writeH(0x00);
  175. writeH(0x00);
  176. writeH(0x00);
  177. writeH(0x00);
  178. writeH(0x00);
  179. writeH(0x00);
  180. writeH(0x00);
  181. writeH(0x00);
  182. writeH(0x00);
  183. writeD(_activeChar.getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_RHAND));
  184. writeH(0x00);
  185. writeH(0x00);
  186. writeH(0x00);
  187. writeH(0x00);
  188. writeH(0x00);
  189. writeH(0x00);
  190. writeH(0x00);
  191. writeH(0x00);
  192. writeH(0x00);
  193. writeH(0x00);
  194. writeH(0x00);
  195. writeH(0x00);
  196. writeD(_activeChar.getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_LRHAND));
  197. writeH(0x00);
  198. writeH(0x00);
  199. writeH(0x00);
  200. writeH(0x00);
  201. // end of c6 new h's
  202. // start of T1 new h's
  203. writeH(0x00);
  204. writeH(0x00);
  205. writeH(0x00);
  206. writeH(0x00);
  207. writeH(0x00);
  208. writeH(0x00);
  209. writeH(0x00);
  210. writeH(0x00);
  211. writeH(0x00);
  212. writeH(0x00);
  213. writeH(0x00);
  214. writeH(0x00);
  215. writeH(0x00);
  216. writeH(0x00);
  217. writeH(0x00);
  218. writeH(0x00);
  219. // end of T1 new h's
  220. writeD(_activeChar.getPAtk(null));
  221. writeD(_activeChar.getPAtkSpd());
  222. writeD(_activeChar.getPDef(null));
  223. writeD(_activeChar.getEvasionRate(null));
  224. writeD(_activeChar.getAccuracy());
  225. writeD(_activeChar.getCriticalHit(null, null));
  226. writeD(_activeChar.getMAtk(null, null));
  227. writeD(_activeChar.getMAtkSpd());
  228. writeD(_activeChar.getPAtkSpd());
  229. writeD(_activeChar.getMDef(null, null));
  230. writeD(_activeChar.getPvpFlag()); // 0-non-pvp 1-pvp = violett name
  231. writeD(_activeChar.getKarma());
  232. writeD(_runSpd);
  233. writeD(_walkSpd);
  234. writeD(_swimRunSpd); // swimspeed
  235. writeD(_swimWalkSpd); // swimspeed
  236. writeD(_flRunSpd);
  237. writeD(_flWalkSpd);
  238. writeD(_flyRunSpd);
  239. writeD(_flyWalkSpd);
  240. writeF(_moveMultiplier);
  241. writeF(_activeChar.getAttackSpeedMultiplier());
  242. L2Summon pet = _activeChar.getPet();
  243. L2Transformation trans;
  244. if (_activeChar.getMountType() != 0 && pet != null)
  245. {
  246. writeF(pet.getTemplate().collisionRadius);
  247. writeF(pet.getTemplate().collisionHeight);
  248. }
  249. else if ((trans = _activeChar.getTransformation()) != null)
  250. {
  251. writeF(trans.getCollisionRadius());
  252. writeF(trans.getCollisionHeight());
  253. }
  254. else
  255. {
  256. writeF(_activeChar.getBaseTemplate().collisionRadius);
  257. writeF(_activeChar.getBaseTemplate().collisionHeight);
  258. }
  259. writeD(_activeChar.getAppearance().getHairStyle());
  260. writeD(_activeChar.getAppearance().getHairColor());
  261. writeD(_activeChar.getAppearance().getFace());
  262. writeD(_activeChar.isGM() ? 1 : 0); // builder level
  263. String title = _activeChar.getTitle();
  264. if (_activeChar.getAppearance().getInvisible() && _activeChar.isGM()) title = "Invisible";
  265. if (_activeChar.getPoly().isMorphed())
  266. {
  267. L2NpcTemplate polyObj = NpcTable.getInstance().getTemplate(_activeChar.getPoly().getPolyId());
  268. if(polyObj != null)
  269. title += " - " + polyObj.name;
  270. }
  271. writeS(title);
  272. writeD(_activeChar.getClanId());
  273. writeD(_activeChar.getClanCrestId());
  274. writeD(_activeChar.getAllyId());
  275. writeD(_activeChar.getAllyCrestId()); // ally crest id
  276. // 0x40 leader rights
  277. // siege flags: attacker - 0x180 sword over name, defender - 0x80 shield, 0xC0 crown (|leader), 0x1C0 flag (|leader)
  278. writeD(_relation);
  279. writeC(_activeChar.getMountType()); // mount type
  280. writeC(_activeChar.getPrivateStoreType());
  281. writeC(_activeChar.hasDwarvenCraft() ? 1 : 0);
  282. writeD(_activeChar.getPkKills());
  283. writeD(_activeChar.getPvpKills());
  284. writeH(_activeChar.getCubics().size());
  285. for (int id : _activeChar.getCubics().keySet())
  286. writeH(id);
  287. writeC(0x00); //1-find party members
  288. writeD(_activeChar.getAbnormalEffect());
  289. writeC(0x00);
  290. writeD(_activeChar.getClanPrivileges());
  291. writeH(_activeChar.getRecomLeft()); //c2 recommendations remaining
  292. writeH(_activeChar.getRecomHave()); //c2 recommendations received
  293. writeD(_activeChar.getMountNpcId() + 1000000);
  294. writeH(_activeChar.getInventoryLimit());
  295. writeD(_activeChar.getClassId().getId());
  296. writeD(0x00); // special effects? circles around player...
  297. writeD(_activeChar.getMaxCp());
  298. writeD((int) _activeChar.getCurrentCp());
  299. writeC(_activeChar.isMounted() ? 0 : _activeChar.getEnchantEffect());
  300. if(_activeChar.getTeam()==1)
  301. writeC(0x01); //team circle around feet 1= Blue, 2 = red
  302. else if(_activeChar.getTeam()==2)
  303. writeC(0x02); //team circle around feet 1= Blue, 2 = red
  304. else
  305. writeC(0x00); //team circle around feet 1= Blue, 2 = red
  306. writeD(_activeChar.getClanCrestLargeId());
  307. writeC(_activeChar.isNoble() ? 1 : 0); //0x01: symbol on char menu ctrl+I
  308. writeC(_activeChar.isHero() || (_activeChar.isGM() && Config.GM_HERO_AURA) ? 1 : 0); //0x01: Hero Aura
  309. writeC(_activeChar.isFishing() ? 1 : 0); //Fishing Mode
  310. writeD(_activeChar.getFishx()); //fishing x
  311. writeD(_activeChar.getFishy()); //fishing y
  312. writeD(_activeChar.getFishz()); //fishing z
  313. writeD(_activeChar.getAppearance().getNameColor());
  314. //new c5
  315. writeC(_activeChar.isRunning() ? 0x01 : 0x00); //changes the Speed display on Status Window
  316. writeD(_activeChar.getPledgeClass()); //changes the text above CP on Status Window
  317. writeD(_activeChar.getPledgeType());
  318. writeD(_activeChar.getAppearance().getTitleColor());
  319. if (_activeChar.isCursedWeaponEquipped())
  320. writeD(CursedWeaponsManager.getInstance().getLevel(_activeChar.getCursedWeaponEquippedId()));
  321. else
  322. writeD(0x00);
  323. // T1 Starts
  324. writeD(_activeChar.getTranformationId());
  325. writeD(_activeChar.getAttackElement());
  326. writeD(_activeChar.getAttackElementValue());
  327. writeD(_activeChar.getDefAttrFire());
  328. writeD(_activeChar.getDefAttrWater());
  329. writeD(_activeChar.getDefAttrWind());
  330. writeD(_activeChar.getDefAttrEarth());
  331. writeD(_activeChar.getDefAttrHoly());
  332. writeD(_activeChar.getDefAttrUnholy());
  333. writeD(_activeChar.getAgathionId());
  334. }
  335. /* (non-Javadoc)
  336. * @see net.sf.l2j.gameserver.serverpackets.ServerBasePacket#getType()
  337. */
  338. @Override
  339. public String getType()
  340. {
  341. return _S__04_USERINFO;
  342. }
  343. }