PageRenderTime 41ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/GameServer/src/gameserver/network/aion/InventoryPacket.java

http://aionxemu.googlecode.com/
Java | 436 lines | 310 code | 55 blank | 71 comment | 38 complexity | b50f038b257b412cdd2a544a545705b1 MD5 | raw file
Possible License(s): GPL-2.0, Apache-2.0, BSD-2-Clause
  1. /**
  2. * This file is part of Aion X Emu <aionxemu.com>
  3. *
  4. * This is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This software is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser Public License
  15. * along with this software. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. package gameserver.network.aion;
  18. import gameserver.model.gameobjects.Item;
  19. import gameserver.model.gameobjects.stats.modifiers.SimpleModifier;
  20. import gameserver.model.gameobjects.stats.modifiers.StatModifier;
  21. import gameserver.model.items.FusionStone;
  22. import gameserver.model.items.ItemSlot;
  23. import gameserver.model.items.ItemStone;
  24. import gameserver.model.items.ManaStone;
  25. import gameserver.model.templates.item.ItemTemplate;
  26. import gameserver.services.RentalService;
  27. import java.nio.ByteBuffer;
  28. import java.util.Set;
  29. import org.apache.log4j.Logger;
  30. /**
  31. * @author ATracer, ZeroSignal
  32. */
  33. public abstract class InventoryPacket extends AionServerPacket {
  34. private static Logger log = Logger.getLogger(InventoryPacket.class);
  35. /**
  36. * The header of every item block
  37. *
  38. * @param buf
  39. * @param item
  40. */
  41. protected void writeGeneralInfo(ByteBuffer buf, Item item) {
  42. writeD(buf, item.getObjectId());
  43. ItemTemplate itemTemplate = item.getItemTemplate();
  44. writeD(buf, itemTemplate.getTemplateId());
  45. writeH(buf, 0x24);
  46. writeD(buf, itemTemplate.getNameId());
  47. writeH(buf, 0);
  48. }
  49. protected void writeMailGeneralInfo(ByteBuffer buf, Item item) {
  50. writeD(buf, item.getObjectId());
  51. ItemTemplate itemTemplate = item.getItemTemplate();
  52. writeD(buf, itemTemplate.getTemplateId());
  53. writeD(buf, 1);
  54. writeD(buf, 0);
  55. writeH(buf, 0x24);
  56. writeD(buf, itemTemplate.getNameId());
  57. writeH(buf, 0);
  58. }
  59. /**
  60. * All misc items
  61. *
  62. * @param buf
  63. * @param item
  64. */
  65. protected void writeGeneralItemInfo(ByteBuffer buf, Item item, boolean privateStore, boolean mail) {
  66. //length of details
  67. if (privateStore)
  68. writeH(buf, 0x16);
  69. else
  70. writeH(buf, 0x1A);
  71. writeC(buf, 0);
  72. writeH(buf, item.getItemMask());
  73. writeQ(buf, item.getItemCount());
  74. writeD(buf, 0); //Disappears time
  75. writeD(buf, 0);
  76. if (!privateStore) {
  77. writeD(buf, 0);
  78. writeH(buf, 0);
  79. }
  80. writeC(buf, 0);
  81. if (!mail)
  82. writeH(buf, item.getEquipmentSlot()); // not equipable items
  83. }
  84. protected void writeStigmaInfo(ByteBuffer buf, Item item) {
  85. writeH(buf, 325); //length of details 45 01
  86. writeC(buf, 0x6);
  87. if (item.isEquipped())
  88. writeD(buf, item.getEquipmentSlot());
  89. else
  90. writeD(buf, 0);
  91. writeC(buf, 0x7);
  92. writeH(buf, 702); //skill id
  93. writeD(buf, 0);
  94. writeH(buf, 0);
  95. writeD(buf, 0x3c); //0x3c
  96. writeD(buf, 0);
  97. writeD(buf, 0);
  98. writeD(buf, 0);
  99. writeD(buf, 0);
  100. writeD(buf, 0);
  101. writeD(buf, 0);
  102. writeD(buf, 0);
  103. writeD(buf, 0);
  104. writeD(buf, 0);
  105. writeD(buf, 0);
  106. writeD(buf, 0);
  107. writeD(buf, 0);
  108. writeD(buf, 0);
  109. writeD(buf, 0);
  110. writeD(buf, 0);
  111. writeD(buf, 0);
  112. writeD(buf, 0);
  113. writeD(buf, 0);
  114. writeD(buf, 0);
  115. writeD(buf, 0);
  116. writeD(buf, 0);
  117. writeD(buf, 0);
  118. writeD(buf, 0);
  119. writeD(buf, 0);
  120. writeD(buf, 0);
  121. writeD(buf, 0);
  122. writeD(buf, 0);
  123. writeD(buf, 0);
  124. writeD(buf, 0);
  125. writeD(buf, 0);
  126. writeD(buf, 0);
  127. writeD(buf, 0);
  128. writeD(buf, 0);
  129. writeD(buf, 0);
  130. writeD(buf, 0);
  131. writeD(buf, 0);
  132. writeD(buf, 0);
  133. writeD(buf, 0);
  134. writeD(buf, 0);
  135. writeD(buf, 0);
  136. writeD(buf, 1);//1
  137. writeD(buf, 0);
  138. writeD(buf, 0);
  139. writeD(buf, 0);
  140. writeD(buf, 0);
  141. writeD(buf, 0);
  142. writeD(buf, 0);
  143. writeD(buf, 0);
  144. writeD(buf, 0);
  145. writeD(buf, 0);
  146. writeD(buf, 0);
  147. writeD(buf, 0);
  148. writeD(buf, 0);
  149. writeD(buf, 0);
  150. writeD(buf, 0);
  151. writeD(buf, 0);
  152. writeD(buf, 0);
  153. writeD(buf, 0);
  154. writeD(buf, 0);
  155. writeD(buf, 0);
  156. writeD(buf, 0);
  157. writeH(buf, 0);
  158. writeH(buf, 0x0b); //0b
  159. writeC(buf, 0);
  160. writeD(buf, item.getItemTemplate().getTemplateId());
  161. writeD(buf, 0);
  162. writeD(buf, 0);
  163. writeD(buf, 0);
  164. writeD(buf, 0);
  165. writeD(buf, 0);
  166. writeD(buf, 0);
  167. writeD(buf, 0);
  168. writeD(buf, 0);
  169. writeC(buf, 0);
  170. writeD(buf, 82750); //3E 43 01 00
  171. writeD(buf, 0);
  172. writeD(buf, 0);
  173. writeD(buf, 0);
  174. writeD(buf, 0);
  175. writeC(buf, 0);
  176. writeC(buf, 0x22); // 22
  177. writeH(buf, 0);
  178. }
  179. /**
  180. * @param buf
  181. * @param item
  182. */
  183. protected void writeKinah(ByteBuffer buf, Item item, boolean isInventory) {
  184. writeH(buf, 0x1A); //length of details
  185. writeC(buf, 0);
  186. writeH(buf, item.getItemMask());
  187. writeQ(buf, item.getItemCount());
  188. writeD(buf, 0);
  189. writeD(buf, 0);
  190. writeH(buf, 0);
  191. writeC(buf, 0);
  192. writeD(buf, 0);
  193. writeH(buf, 255); // FF FF equipment
  194. if (isInventory)
  195. writeC(buf, 0);
  196. }
  197. /**
  198. * Write weapon info for non weapon switch items
  199. *
  200. * @param buf
  201. * @param item
  202. * @param isInventory
  203. */
  204. protected void writeWeaponInfo(ByteBuffer buf, Item item, boolean isInventory) {
  205. this.writeWeaponInfo(buf, item, isInventory, false, false, false);
  206. }
  207. /**
  208. * For all weapon. Weapon is identified by weapon_type in xml
  209. *
  210. * @param buf
  211. * @param item
  212. */
  213. protected void writeWeaponInfo(ByteBuffer buf, Item item, boolean isInventory, boolean isWeaponSwitch, boolean privateStore, boolean mail) {
  214. int itemSlotId = item.getEquipmentSlot();
  215. int sizeLoc;
  216. sizeLoc = buf.position();
  217. writeH(buf, 5);
  218. if (!isWeaponSwitch && item.getItemTemplate().getWeaponType().getRequiredSlots() == 2) {
  219. writeC(buf, 0x0E);
  220. writeD(buf, item.hasFusionedItem() ? item.getFusionedItem() : 0);
  221. writeFusionStones(buf, item);
  222. writeC(buf, item.hasOptionalFusionSocket() ? item.getOptionalFusionSocket() : 0x00);
  223. }
  224. writeC(buf, 0x06);
  225. writeD(buf, item.isEquipped() ? itemSlotId : 0x00);
  226. if (isWeaponSwitch)
  227. return;
  228. writeC(buf, 0x01);
  229. writeD(buf, ItemSlot.getSlotsFor(item.getItemTemplate().getItemSlot()).get(0).getSlotIdMask());
  230. writeD(buf, item.hasFusionedItem() ? 0x00 : 0x02);
  231. writeC(buf, 0x0B); //? some details separator
  232. writeC(buf, item.isSoulBound() ? 1 : 0);
  233. writeC(buf, item.getEnchantLevel()); //enchant (1-15)
  234. writeD(buf, item.getItemSkinTemplate().getTemplateId());
  235. writeC(buf, item.hasOptionalSocket() ? item.getOptionalSocket() : 0x00);
  236. writeItemStones(buf, item);
  237. ItemStone god = item.getGodStone();
  238. writeD(buf, god == null ? 0 : god.getItemId());
  239. writeD(buf, 0);
  240. writeD(buf, 0);//unk 1.5.1.9
  241. /*
  242. * This is where item bonuses should be inserted.
  243. * The format is as follows:
  244. * writeH(buf, 2560); 0x000A
  245. * writeH(buf, bonusType); //ex. 0x12 is +HP
  246. * writeD(buf, bonusAmount); //ex. 0xC4 is 196
  247. */
  248. writeH(buf, 0x00); // seperator between item bonus and item mask
  249. writeH(buf, item.getItemMask());
  250. writeQ(buf, item.getItemCount());
  251. if (privateStore)
  252. writeH(buf, 0);
  253. else
  254. writeS(buf, item.getItemCreator()); // PlayerObjId of crafter
  255. writeC(buf, 0);
  256. writeD(buf, RentalService.getInstance().getRentalTimeLeft(item)); // For temp items: Remaining seconds
  257. writeC(buf, 0);
  258. writeD(buf, 0);
  259. if (!privateStore)
  260. writeH(buf, 0);
  261. writeC(buf, 0);
  262. int placeHolder, size;
  263. size = (privateStore) ? 103 : (buf.position() - sizeLoc - 2);
  264. placeHolder = buf.position();
  265. buf.position(sizeLoc);
  266. writeH(buf, size);
  267. buf.position(placeHolder);
  268. if (!mail) writeH(buf, item.isEquipped() ? 255 : item.getEquipmentSlot()); // FF FF equipment
  269. if (isInventory) writeC(buf, 0); // item.isEquipped() ? 1 : 0
  270. }
  271. /**
  272. * Writes manastones : 6C - statenum mask, 6H - value
  273. *
  274. * @param buf
  275. * @param item
  276. */
  277. private void writeItemStones(ByteBuffer buf, Item item) {
  278. int count = 0;
  279. //TODO implement new area to store the values for the manastones
  280. if (item.hasManaStones()) {
  281. Set<ManaStone> itemStones = item.getItemStones();
  282. for (ManaStone itemStone : itemStones) {
  283. if (count == 6)
  284. break;
  285. StatModifier modifier = itemStone.getFirstModifier();
  286. if (modifier != null) {
  287. count++;
  288. writeC(buf, modifier.getStat().getItemStoneMask());
  289. }
  290. }
  291. writeB(buf, new byte[(6 - count)]);
  292. count = 0;
  293. for (ManaStone itemStone : itemStones) {
  294. if (count == 6)
  295. break;
  296. StatModifier modifier = itemStone.getFirstModifier();
  297. if (modifier != null) {
  298. count++;
  299. writeH(buf, ((SimpleModifier) modifier).getValue());
  300. }
  301. }
  302. writeB(buf, new byte[(6 - count) * 2]);
  303. } else {
  304. writeB(buf, new byte[18]);
  305. }
  306. //for now max 6 stones - write some junk
  307. }
  308. private void writeFusionStones(ByteBuffer buf, Item item) {
  309. int count = 0;
  310. if (item.hasFusionStones()) {
  311. Set<FusionStone> itemStones = item.getFusionStones();
  312. for (FusionStone itemStone : itemStones) {
  313. if (count == 6)
  314. break;
  315. StatModifier modifier = itemStone.getFirstModifier();
  316. if (modifier != null) {
  317. count++;
  318. writeC(buf, modifier.getStat().getItemStoneMask());
  319. writeH(buf, ((SimpleModifier) modifier).getValue());
  320. }
  321. }
  322. writeB(buf, new byte[(6 - count) * 3]);
  323. } else {
  324. writeB(buf, new byte[18]);
  325. }
  326. //for now max 6 stones - write some junk
  327. }
  328. /**
  329. * For all armor. Armor is identified by armor_type in xml
  330. *
  331. * @param buf
  332. * @param item
  333. */
  334. protected void writeArmorInfo(ByteBuffer buf, Item item, boolean isInventory, boolean privateStore, boolean mail) {
  335. int itemSlotId = item.getEquipmentSlot();
  336. int sizeLoc = buf.position();
  337. writeH(buf, 83);
  338. writeC(buf, 0x06);
  339. writeD(buf, item.isEquipped() ? itemSlotId : 0);
  340. writeC(buf, 0x02);
  341. writeD(buf, ItemSlot.getSlotsFor(item.getItemTemplate().getItemSlot()).get(0).getSlotIdMask());
  342. writeD(buf, 0);
  343. writeD(buf, 0);
  344. writeC(buf, 0x0B); //? some details separator
  345. writeC(buf, item.isSoulBound() ? 1 : 0);
  346. writeC(buf, item.getEnchantLevel()); //enchant (1-15)
  347. writeD(buf, item.getItemSkinTemplate().getTemplateId());
  348. writeC(buf, item.hasOptionalSocket() ? item.getOptionalSocket() : 0x00);
  349. writeItemStones(buf, item);
  350. writeC(buf, 0);
  351. writeD(buf, item.getItemColor());
  352. writeD(buf, 0);
  353. writeD(buf, 0); //unk 1.5.1.9
  354. writeC(buf, 0);
  355. writeH(buf, item.getItemMask());
  356. writeQ(buf, item.getItemCount());
  357. if (privateStore)
  358. writeH(buf, 0);
  359. else
  360. writeS(buf, item.getItemCreator()); // PlayerObjId of crafter
  361. writeC(buf, 0);
  362. writeD(buf, RentalService.getInstance().getRentalTimeLeft(item)); // For temp items: Remaining seconds
  363. writeC(buf, 0);
  364. writeD(buf, 0);
  365. if (!privateStore)
  366. writeH(buf, 0);
  367. writeC(buf, 0);
  368. if (!privateStore) {
  369. int placeHolder, size;
  370. size = buf.position() - sizeLoc - 2;
  371. placeHolder = buf.position();
  372. buf.position(sizeLoc);
  373. writeH(buf, size);
  374. buf.position(placeHolder);
  375. }
  376. if (!mail)
  377. writeH(buf, item.isEquipped() ? 255 : item.getEquipmentSlot()); // FF FF equipment
  378. if (isInventory)
  379. writeC(buf, 1); //item.isEquipped() ? 1 : 0
  380. }
  381. }