PageRenderTime 50ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/GameServer/src/gameserver/services/ItemService.java

http://aionxemu.googlecode.com/
Java | 808 lines | 541 code | 122 blank | 145 comment | 168 complexity | c75352b3dc349588008fac0c9f5dc7c2 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.services;
  18. import com.aionemu.commons.database.dao.DAOManager;
  19. import com.aionemu.commons.utils.Rnd;
  20. import gameserver.configs.main.GSConfig;
  21. import gameserver.dao.ItemStoneListDAO;
  22. import gameserver.dataholders.DataManager;
  23. import gameserver.model.DescriptionId;
  24. import gameserver.model.gameobjects.Item;
  25. import gameserver.model.gameobjects.PersistentState;
  26. import gameserver.model.gameobjects.player.Player;
  27. import gameserver.model.gameobjects.player.Storage;
  28. import gameserver.model.gameobjects.player.StorageType;
  29. import gameserver.model.gameobjects.player.Equipment;
  30. import gameserver.model.items.FusionStone;
  31. import gameserver.model.items.GodStone;
  32. import gameserver.model.items.ItemId;
  33. import gameserver.model.items.ManaStone;
  34. import gameserver.model.templates.item.GodstoneInfo;
  35. import gameserver.model.templates.item.ItemTemplate;
  36. import gameserver.model.templates.quest.QuestItems;
  37. import gameserver.network.aion.serverpackets.*;
  38. import gameserver.utils.PacketSendUtility;
  39. import gameserver.utils.idfactory.IDFactory;
  40. import gameserver.utils.i18n.CustomMessageId;
  41. import gameserver.utils.i18n.LanguageHandler;
  42. import org.apache.log4j.Logger;
  43. import java.util.*;
  44. /**
  45. * @author ATracer
  46. * This class is used for Item manipulations (creation, disposing, modification)
  47. * Can be used as a factory for Item objects
  48. */
  49. public class ItemService {
  50. private static Logger log = Logger.getLogger(ItemService.class);
  51. /**
  52. * @param itemId
  53. * @return The ItemTemplate related to the given itemId.
  54. */
  55. public static ItemTemplate getItemTemplate(int itemId) {
  56. ItemTemplate it = DataManager.ITEM_DATA.getItemTemplate(itemId);
  57. if (it == null)
  58. log.warn("Item was not populated correctly. Item template is missing for itemId: " + itemId);
  59. return it;
  60. }
  61. /**
  62. * @param itemId
  63. * @param count
  64. * @return Creates new Item instance.
  65. */
  66. public static Item newItem(int itemId, long count) {
  67. return newItem(itemId, count, null);
  68. }
  69. /**
  70. * @param itemId
  71. * @param count
  72. * @return Creates new Item instance.
  73. * If count is greater than template maxStackCount, count value will be cut to maximum allowed
  74. * This method will return null if ItemTemplate for itemId was not found.
  75. */
  76. public static Item newItem(int itemId, long count, String itemCreator) {
  77. ItemTemplate itemTemplate = DataManager.ITEM_DATA.getItemTemplate(itemId);
  78. if (itemTemplate == null) {
  79. return null;
  80. }
  81. int maxStackCount = itemTemplate.getMaxStackCount();
  82. if (count > maxStackCount && maxStackCount != 0) {
  83. count = maxStackCount;
  84. }
  85. //TODO if Item object will contain ownerId - item can be saved to DB before return
  86. Item temp = new Item(IDFactory.getInstance().nextId(), itemId, itemTemplate, count, itemCreator, false, 0);
  87. if (itemTemplate.isWeapon() || itemTemplate.isArmor()) {
  88. temp.setOptionalSocket(Rnd.get(0, itemTemplate.getOptionSlotBonus()));
  89. }
  90. return temp;
  91. }
  92. /**
  93. * Loads item stones from DB for each item in a list if item is ARMOR or WEAPON
  94. * Godstones will be laoded for WEAPON items
  95. *
  96. * @param itemList
  97. */
  98. public static void loadItemStones(List<Item> itemList) {
  99. if (itemList == null)
  100. return;
  101. DAOManager.getDAO(ItemStoneListDAO.class).load(itemList);
  102. }
  103. /**
  104. * Used to split item into 2 items
  105. *
  106. * @param player
  107. * @param itemObjId
  108. * @param splitAmount
  109. * @param slotNum
  110. * @param sourceStorageType
  111. * @param desetinationStorageType
  112. */
  113. public static void splitItem(Player player, int itemObjId, long splitAmount, int slotNum, int sourceStorageType, int destinationStorageType) {
  114. Storage sourceStorage = player.getStorage(sourceStorageType);
  115. Storage destinationStorage = player.getStorage(destinationStorageType);
  116. if (splitAmount <= 0) {
  117. log.warn(String.format("CHECKPOINT: attempt to split with 0 <= amount %d %d %d", itemObjId, splitAmount, slotNum));
  118. return;
  119. }
  120. Item itemToSplit = sourceStorage.getItemByObjId(itemObjId);
  121. if (itemToSplit == null) {
  122. itemToSplit = sourceStorage.getKinahItem();
  123. if (itemToSplit.getObjectId() != itemObjId || itemToSplit == null) {
  124. log.warn(String.format("CHECKPOINT: attempt to split null item %d %d %d", itemObjId, splitAmount, slotNum));
  125. return;
  126. }
  127. }
  128. // To move kinah from inventory to warehouse and vise versa client using split item packet
  129. if (itemToSplit.getItemTemplate().isKinah()) {
  130. moveKinah(player, sourceStorage, splitAmount);
  131. return;
  132. }
  133. long oldItemCount = itemToSplit.getItemCount() - splitAmount;
  134. if (itemToSplit.getItemCount() < splitAmount || oldItemCount == 0)
  135. return;
  136. Item newItem = newItem(itemToSplit.getItemTemplate().getTemplateId(), splitAmount);
  137. newItem.setEquipmentSlot(slotNum);
  138. if (destinationStorage.putToBag(newItem) != null) {
  139. sourceStorage.decreaseItemCount(itemToSplit, splitAmount);
  140. List<Item> itemsToUpdate = new ArrayList<Item>();
  141. itemsToUpdate.add(newItem);
  142. sendStorageUpdatePacket(player, destinationStorageType, itemsToUpdate.get(0));
  143. sendUpdateItemPacket(player, sourceStorageType, itemToSplit);
  144. } else {
  145. releaseItemId(newItem);
  146. }
  147. }
  148. private static void moveKinah(Player player, Storage source, long splitAmount) {
  149. if (source.getKinahItem().getItemCount() < splitAmount)
  150. return;
  151. switch (source.getStorageType()) {
  152. case 0: {
  153. Storage destination = player.getStorage(StorageType.ACCOUNT_WAREHOUSE.getId());
  154. long chksum = (source.getKinahItem().getItemCount() - splitAmount) + (destination.getKinahItem().getItemCount() + splitAmount);
  155. if (chksum != source.getKinahItem().getItemCount() + destination.getKinahItem().getItemCount())
  156. return;
  157. source.decreaseKinah(splitAmount);
  158. destination.increaseKinah(splitAmount);
  159. break;
  160. }
  161. case 2: {
  162. Storage destination = player.getStorage(StorageType.CUBE.getId());
  163. long chksum = (source.getKinahItem().getItemCount() - splitAmount) + (destination.getKinahItem().getItemCount() + splitAmount);
  164. if (chksum != source.getKinahItem().getItemCount() + destination.getKinahItem().getItemCount())
  165. return;
  166. source.decreaseKinah(splitAmount);
  167. destination.increaseKinah(splitAmount);
  168. break;
  169. }
  170. default:
  171. break;
  172. }
  173. }
  174. /**
  175. * Used to merge 2 items in inventory
  176. *
  177. * @param player
  178. * @param sourceItemObjId
  179. * @param itemAmount
  180. * @param destinationObjId
  181. */
  182. public static void mergeItems(Player player, int sourceItemObjId, long itemAmount, int destinationObjId, int sourceStorageType, int destinationStorageType) {
  183. if (itemAmount == 0)
  184. return;
  185. if (sourceItemObjId == destinationObjId)
  186. return;
  187. Storage sourceStorage = player.getStorage(sourceStorageType);
  188. Storage destinationStorage = player.getStorage(destinationStorageType);
  189. Item sourceItem = sourceStorage.getItemByObjId(sourceItemObjId);
  190. Item destinationItem = destinationStorage.getItemByObjId(destinationObjId);
  191. if (sourceItem == null || destinationItem == null)
  192. return; //Invalid object id provided
  193. if (sourceItem.getItemTemplate().getTemplateId() != destinationItem.getItemTemplate().getTemplateId())
  194. return; //Invalid item type
  195. if (sourceItem.getItemCount() < itemAmount)
  196. return; //Invalid item amount
  197. if (sourceItem.getItemCount() == itemAmount) {
  198. destinationStorage.increaseItemCount(destinationItem, itemAmount);
  199. sourceStorage.removeFromBag(sourceItem, true);
  200. sendDeleteItemPacket(player, sourceStorageType, sourceItem.getObjectId());
  201. sendUpdateItemPacket(player, destinationStorageType, destinationItem);
  202. } else if (sourceItem.getItemCount() > itemAmount) {
  203. sourceStorage.decreaseItemCount(sourceItem, itemAmount);
  204. destinationStorage.increaseItemCount(destinationItem, itemAmount);
  205. sendUpdateItemPacket(player, sourceStorageType, sourceItem);
  206. sendUpdateItemPacket(player, destinationStorageType, destinationItem);
  207. } else return; // cant happen in theory, but...
  208. }
  209. public static void switchStoragesItems(Player player, int sourceStorageType, int sourceItemObjId, int replaceStorageType, int replaceItemObjId) {
  210. Storage sourceStorage = player.getStorage(sourceStorageType);
  211. Storage replaceStorage = player.getStorage(replaceStorageType);
  212. Item sourceItem = sourceStorage.getItemByObjId(sourceItemObjId);
  213. if (sourceItem == null)
  214. return;
  215. Item replaceItem = replaceStorage.getItemByObjId(replaceItemObjId);
  216. if (replaceItem == null)
  217. return;
  218. if (!sourceItem.isStorable(replaceStorageType) || !replaceItem.isStorable(sourceStorageType))
  219. return;//TODO: proper message
  220. int sourceSlot = sourceItem.getEquipmentSlot();
  221. int replaceSlot = replaceItem.getEquipmentSlot();
  222. sourceItem.setEquipmentSlot(replaceSlot);
  223. replaceItem.setEquipmentSlot(sourceSlot);
  224. sourceStorage.removeFromBag(sourceItem, false);
  225. replaceStorage.removeFromBag(replaceItem, false);
  226. Item newSourceItem = sourceStorage.putToBag(replaceItem);
  227. Item newReplaceItem = replaceStorage.putToBag(sourceItem);
  228. sendDeleteItemPacket(player, sourceStorageType, sourceItemObjId);
  229. sendStorageUpdatePacket(player, sourceStorageType, newSourceItem);
  230. sendDeleteItemPacket(player, replaceStorageType, replaceItemObjId);
  231. sendStorageUpdatePacket(player, replaceStorageType, newReplaceItem);
  232. }
  233. public static long addItem(Player player, int itemId, long count) {
  234. return addItem(player, itemId, count, null);
  235. }
  236. /**
  237. * Adds item count to player inventory
  238. * I moved this method to service cause right implementation of it is critical to server
  239. * operation and could cause starvation of object ids.
  240. * <p/>
  241. * This packet will send necessary packets to client (initialize used only from quest engine
  242. *
  243. * @param player
  244. * @param itemId
  245. * @param count
  246. * @param itemCreator
  247. *
  248. * amount of item that were not added to player's inventory
  249. */
  250. public static long addItem(Player player, int itemId, long count, String itemCreator) {
  251. if (GSConfig.LOG_ITEM)
  252. log.info(String.format("[ITEM] ID/Count - %d/%d to player %s.", itemId, count, player.getName()));
  253. return addFullItem(player, itemId, count, itemCreator, null, null, 0);
  254. }
  255. /**
  256. * @param player
  257. * @param itemId
  258. * @param count
  259. * @param itemCreator
  260. * @param manastones
  261. * @param godStone
  262. * @param enchantLevel
  263. */
  264. public static long addFullItem(Player player, int itemId, long count,
  265. String itemCreator, Set<ManaStone> manastones, GodStone godStone,
  266. int enchantLevel)
  267. {
  268. Storage inventory = player.getInventory();
  269. ItemTemplate itemTemplate = DataManager.ITEM_DATA.getItemTemplate(itemId);
  270. if (itemTemplate == null)
  271. return count;
  272. int maxStackCount = itemTemplate.getMaxStackCount();
  273. if (itemId == ItemId.KINAH.value()) {
  274. inventory.increaseKinah(count);
  275. return 0;
  276. } else {
  277. /**
  278. * Increase count of existing items
  279. */
  280. List<Item> existingItems = inventory.getAllItemsByItemId(itemId); // look for existing in equipment. need for power shards.
  281. for (Item existingItem : existingItems) {
  282. if (count == 0)
  283. break;
  284. long freeCount = maxStackCount - existingItem.getItemCount();
  285. if (count <= freeCount) {
  286. inventory.increaseItemCount(existingItem, count);
  287. count = 0;
  288. } else {
  289. inventory.increaseItemCount(existingItem, freeCount);
  290. count -= freeCount;
  291. }
  292. updateItem(player, existingItem, false);
  293. }
  294. /**
  295. * Create new stacks
  296. */
  297. while (!inventory.isFull() && count > 0) {
  298. // item count still more than maxStack value
  299. if (count > maxStackCount) {
  300. Item item = newItem(itemId, maxStackCount, itemCreator);
  301. count -= maxStackCount;
  302. inventory.putToBag(item);
  303. updateItem(player, item, true);
  304. if (RentalService.getInstance().isRentalItem(item))
  305. RentalService.getInstance().addRentalItem(player, item);
  306. } else {
  307. Item item = newItem(itemId, count, itemCreator);
  308. //add item stones if available
  309. //1. manastones
  310. if (manastones != null) {
  311. for (ManaStone manaStone : manastones) {
  312. addManaStone(item, manaStone.getItemId());
  313. }
  314. }
  315. //2. godstone
  316. if (godStone != null) {
  317. item.addGodStone(godStone.getItemId());
  318. }
  319. //3. enchantLevel
  320. if (enchantLevel > 0) {
  321. item.setEnchantLevel(enchantLevel);
  322. }
  323. inventory.putToBag(item);
  324. updateItem(player, item, true);
  325. count = 0;
  326. if (RentalService.getInstance().isRentalItem(item))
  327. RentalService.getInstance().addRentalItem(player, item);
  328. }
  329. }
  330. if (inventory.isFull() && count > 0) {
  331. PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_MSG_DICE_INVEN_ERROR);
  332. }
  333. return count;
  334. }
  335. }
  336. /**
  337. * @param player
  338. * @param itemObjId
  339. * @param sourceStorageType
  340. * @param destinationStorageType
  341. * @param slot
  342. */
  343. public static void moveItem(Player player, int itemObjId, int sourceStorageType, int destinationStorageType, int slot) {
  344. Storage sourceStorage = player.getStorage(sourceStorageType);
  345. Item item = player.getStorage(sourceStorageType).getItemByObjId(itemObjId);
  346. if (item == null)
  347. return;
  348. //check if item is storable
  349. if(destinationStorageType < 32 || destinationStorageType > 35) //pets storages
  350. if (!item.isStorable(destinationStorageType))
  351. return;//TODO: proper message
  352. item.setEquipmentSlot(slot);
  353. if (sourceStorageType == destinationStorageType) {
  354. sourceStorage.setPersistentState(PersistentState.UPDATE_REQUIRED);
  355. return;
  356. }
  357. Storage destinationStorage = player.getStorage(destinationStorageType);
  358. List<Item> existingItems = destinationStorage.getItemsByItemId(item.getItemTemplate().getTemplateId());
  359. long count = item.getItemCount();
  360. int maxStackCount = item.getItemTemplate().getMaxStackCount();
  361. for (Item existingItem : existingItems) {
  362. if (count == 0)
  363. break;
  364. long freeCount = maxStackCount - existingItem.getItemCount();
  365. if (count <= freeCount) {
  366. destinationStorage.increaseItemCount(existingItem, count);
  367. count = 0;
  368. sendDeleteItemPacket(player, sourceStorageType, item.getObjectId());
  369. sourceStorage.removeFromBag(item, true);
  370. } else {
  371. destinationStorage.increaseItemCount(existingItem, freeCount);
  372. count -= freeCount;
  373. }
  374. sendStorageUpdatePacket(player, destinationStorageType, existingItem);
  375. }
  376. while (!destinationStorage.isFull() && count > 0) {
  377. // item count still more than maxStack value
  378. if (count > maxStackCount) {
  379. count -= maxStackCount;
  380. Item newitem = newItem(item.getItemTemplate().getTemplateId(), maxStackCount);
  381. newitem = destinationStorage.putToBag(newitem);
  382. sendStorageUpdatePacket(player, destinationStorageType, newitem);
  383. } else {
  384. item.setItemCount(count);
  385. sourceStorage.removeFromBag(item, false);
  386. sendDeleteItemPacket(player, sourceStorageType, item.getObjectId());
  387. Item newitem = destinationStorage.putToBag(item);
  388. sendStorageUpdatePacket(player, destinationStorageType, newitem);
  389. count = 0;
  390. }
  391. }
  392. if (count > 0) // if storage is full and some items left
  393. {
  394. item.setItemCount(count);
  395. sendUpdateItemPacket(player, sourceStorageType, item);
  396. }
  397. }
  398. public static void updateItem(Player player, Item item, boolean isNew) {
  399. if (isNew)
  400. PacketSendUtility.sendPacket(player, new SM_INVENTORY_UPDATE(Collections.singletonList(item)));
  401. else
  402. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(item));
  403. }
  404. private static void sendDeleteItemPacket(Player player, int storageType, int itemObjId) {
  405. if (storageType == StorageType.CUBE.getId())
  406. PacketSendUtility.sendPacket(player, new SM_DELETE_ITEM(itemObjId));
  407. else
  408. PacketSendUtility.sendPacket(player, new SM_DELETE_WAREHOUSE_ITEM(storageType, itemObjId));
  409. }
  410. private static void sendStorageUpdatePacket(Player player, int storageType, Item item) {
  411. if (storageType == StorageType.CUBE.getId())
  412. PacketSendUtility.sendPacket(player, new SM_INVENTORY_UPDATE(Collections.singletonList(item)));
  413. else
  414. PacketSendUtility.sendPacket(player, new SM_WAREHOUSE_UPDATE(item, storageType));
  415. }
  416. private static void sendUpdateItemPacket(Player player, int storageType, Item item) {
  417. if (storageType == StorageType.CUBE.getId())
  418. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(item));
  419. else
  420. PacketSendUtility.sendPacket(player, new SM_UPDATE_WAREHOUSE_ITEM(item, storageType));
  421. }
  422. /**
  423. * Releases item id if item was not used by caller
  424. *
  425. * @param item
  426. */
  427. public static void releaseItemId(Item item) {
  428. // IDFactory.getInstance().releaseId(item.getObjectId());
  429. }
  430. /**
  431. * @param itemId
  432. */
  433. public static ManaStone addManaStone(Item item, int itemId) {
  434. if (item == null)
  435. return null;
  436. Set<ManaStone> manaStones = item.getItemStones();
  437. if (manaStones.size() > item.getSockets(false))
  438. return null;
  439. int nextSlot = 0;
  440. boolean slotFound = false;
  441. Iterator<ManaStone> iterator = manaStones.iterator();
  442. while (iterator.hasNext()) {
  443. ManaStone manaStone = iterator.next();
  444. if (nextSlot != manaStone.getSlot()) {
  445. slotFound = true;
  446. break;
  447. }
  448. nextSlot++;
  449. }
  450. if (!slotFound)
  451. nextSlot = manaStones.size();
  452. ManaStone stone = new ManaStone(item.getObjectId(), itemId,
  453. nextSlot, PersistentState.NEW);
  454. manaStones.add(stone);
  455. return stone;
  456. }
  457. /**
  458. * @param itemId
  459. */
  460. public static FusionStone addFusionStone(Item item, int itemId) {
  461. if (item == null)
  462. return null;
  463. Set<FusionStone> manaStones = item.getFusionStones();
  464. if (manaStones.size() > item.getSockets(true))
  465. return null;
  466. int nextSlot = 0;
  467. boolean slotFound = false;
  468. Iterator<FusionStone> iterator = manaStones.iterator();
  469. while (iterator.hasNext()) {
  470. FusionStone manaStone = iterator.next();
  471. if (nextSlot != manaStone.getSlot()) {
  472. slotFound = true;
  473. break;
  474. }
  475. nextSlot++;
  476. }
  477. if (!slotFound)
  478. nextSlot = manaStones.size();
  479. FusionStone stone = new FusionStone(item.getObjectId(), itemId,
  480. nextSlot, PersistentState.NEW);
  481. manaStones.add(stone);
  482. return stone;
  483. }
  484. /**
  485. * @param player
  486. * @param itemObjId
  487. * @param slotNum
  488. */
  489. public static void removeManastone(Player player, int itemObjId, int slotNum) {
  490. Storage inventory = player.getInventory();
  491. Item item = inventory.getItemByObjId(itemObjId);
  492. if (item == null) {
  493. item = player.getEquipment().getEquippedItemByObjId(itemObjId);
  494. if (item == null)
  495. {
  496. log.warn("Item not found during manastone remove");
  497. return;
  498. }
  499. }
  500. if (!item.hasManaStones()) {
  501. log.warn("Item stone list is empty");
  502. return;
  503. }
  504. Set<ManaStone> itemStones = item.getItemStones();
  505. if (itemStones.size() <= slotNum)
  506. return;
  507. int counter = 0;
  508. Iterator<ManaStone> iterator = itemStones.iterator();
  509. while (iterator.hasNext()) {
  510. ManaStone manaStone = iterator.next();
  511. if (counter == slotNum) {
  512. manaStone.setPersistentState(PersistentState.DELETED);
  513. iterator.remove();
  514. DAOManager.getDAO(ItemStoneListDAO.class).storeManaStone(Collections.singleton(manaStone));
  515. break;
  516. }
  517. counter++;
  518. }
  519. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(item));
  520. }
  521. /**
  522. * @param player
  523. * @param itemObjId
  524. * @param slotNum
  525. */
  526. public static void removeFusionstone(Player player, int itemObjId, int slotNum) {
  527. Storage inventory = player.getInventory();
  528. Item item = inventory.getItemByObjId(itemObjId);
  529. if (item == null) {
  530. item = player.getEquipment().getEquippedItemByObjId(itemObjId);
  531. if (item == null)
  532. {
  533. log.warn("Item not found during manastone remove");
  534. return;
  535. }
  536. }
  537. if (!item.hasFusionStones()) {
  538. log.warn("Item stone list is empty");
  539. return;
  540. }
  541. Set<FusionStone> itemStones = item.getFusionStones();
  542. if (itemStones.size() <= slotNum)
  543. return;
  544. int counter = 0;
  545. Iterator<FusionStone> iterator = itemStones.iterator();
  546. while (iterator.hasNext()) {
  547. FusionStone manaStone = iterator.next();
  548. if (counter == slotNum) {
  549. manaStone.setPersistentState(PersistentState.DELETED);
  550. iterator.remove();
  551. DAOManager.getDAO(ItemStoneListDAO.class).storeFusionStone(Collections.singleton(manaStone));
  552. break;
  553. }
  554. counter++;
  555. }
  556. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(item));
  557. }
  558. /**
  559. * @param player
  560. * @param item
  561. */
  562. public static void removeAllManastone(Player player, Item item) {
  563. if (item == null) {
  564. log.warn("Item not found during manastone remove");
  565. return;
  566. }
  567. if (!item.hasManaStones()) {
  568. return;
  569. }
  570. Set<ManaStone> itemStones = item.getItemStones();
  571. Iterator<ManaStone> iterator = itemStones.iterator();
  572. while (iterator.hasNext()) {
  573. ManaStone manaStone = iterator.next();
  574. manaStone.setPersistentState(PersistentState.DELETED);
  575. iterator.remove();
  576. DAOManager.getDAO(ItemStoneListDAO.class).storeManaStone(Collections.singleton(manaStone));
  577. }
  578. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(item));
  579. }
  580. /**
  581. * @param player
  582. * @param item
  583. */
  584. public static void removeAllFusionStone(Player player, Item item) {
  585. if (item == null) {
  586. log.warn("Item not found during manastone remove");
  587. return;
  588. }
  589. if (!item.hasFusionStones()) {
  590. return;
  591. }
  592. Set<FusionStone> itemStones = item.getFusionStones();
  593. Iterator<FusionStone> iterator = itemStones.iterator();
  594. while (iterator.hasNext()) {
  595. FusionStone manaStone = iterator.next();
  596. manaStone.setPersistentState(PersistentState.DELETED);
  597. iterator.remove();
  598. DAOManager.getDAO(ItemStoneListDAO.class).storeFusionStone(Collections.singleton(manaStone));
  599. }
  600. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(item));
  601. }
  602. /**
  603. * @param player
  604. * @param weaponId
  605. * @param stoneId
  606. */
  607. public static void socketGodstone(Player player, int weaponId, int stoneId) {
  608. long socketPrice = player.getPrices().getPriceForService(100000, player.getCommonData().getRace());
  609. Item kinahItem = player.getInventory().getKinahItem();
  610. if (kinahItem.getItemCount() < socketPrice)
  611. return;
  612. Item weaponItem = player.getInventory().getItemByObjId(weaponId);
  613. if (weaponItem == null) {
  614. PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_GIVE_ITEM_PROC_CANNOT_GIVE_PROC_TO_EQUIPPED_ITEM);
  615. return;
  616. }
  617. else
  618. {
  619. int weaponItemId = weaponItem.getItemTemplate().getTemplateId();
  620. int wID = Math.round(weaponItemId/1000000);
  621. if(wID != 100 && wID != 101)
  622. return;
  623. }
  624. Item godstone = player.getInventory().getItemByObjId(stoneId);
  625. int godStoneItemId = godstone.getItemTemplate().getTemplateId();
  626. ItemTemplate itemTemplate = DataManager.ITEM_DATA.getItemTemplate(godStoneItemId);
  627. GodstoneInfo godstoneInfo = itemTemplate.getGodstoneInfo();
  628. if (godstoneInfo == null) {
  629. PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_GIVE_ITEM_PROC_NO_PROC_GIVE_ITEM);
  630. log.warn("Godstone info missing for itemid " + godStoneItemId);
  631. return;
  632. }
  633. else
  634. {
  635. int gsID = Math.round(godStoneItemId/1000000);
  636. if(gsID != 168)
  637. return;
  638. }
  639. weaponItem.addGodStone(godStoneItemId);
  640. PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_GIVE_ITEM_PROC_ENCHANTED_TARGET_ITEM(new DescriptionId(Integer.parseInt(weaponItem.getName()))));
  641. player.getInventory().removeFromBagByObjectId(stoneId, 1);
  642. player.getInventory().decreaseKinah(socketPrice);
  643. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(weaponItem));
  644. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(kinahItem));
  645. }
  646. public static boolean addItems(Player player, List<QuestItems> questItems) {
  647. int needSlot = 0;
  648. for (QuestItems qi : questItems) {
  649. int itemId = qi.getItemId();
  650. if (itemId != ItemId.KINAH.value() && qi.getCount() != 0) {
  651. ItemTemplate itemTemplate = DataManager.ITEM_DATA.getItemTemplate(itemId);
  652. if (itemTemplate == null) {
  653. PacketSendUtility.sendMessage(player, LanguageHandler.translate(CustomMessageId.COMMAND_ADD_FAILURE, itemId, player.getName()));
  654. return false;
  655. }
  656. int stackCount = itemTemplate.getMaxStackCount();
  657. int count = qi.getCount() / stackCount;
  658. if (qi.getCount() % stackCount != 0)
  659. count++;
  660. needSlot += count;
  661. }
  662. }
  663. if (needSlot > player.getInventory().getNumberOfFreeSlots()) {
  664. PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.MSG_FULL_INVENTORY);
  665. return false;
  666. }
  667. for (QuestItems qi : questItems)
  668. addItem(player, qi.getItemId(), qi.getCount());
  669. return true;
  670. }
  671. /**
  672. * @param player
  673. */
  674. public static void restoreKinah(Player player) {
  675. // if kinah was deleted by some reason it should be restored with 0 count
  676. if (player.getStorage(StorageType.CUBE.getId()).getKinahItem() == null) {
  677. Item kinahItem = newItem(182400001, 0);
  678. player.getStorage(StorageType.CUBE.getId()).onLoadHandler(kinahItem);
  679. }
  680. if (player.getStorage(StorageType.ACCOUNT_WAREHOUSE.getId()).getKinahItem() == null) {
  681. Item kinahItem = newItem(182400001, 0);
  682. kinahItem.setItemLocation(StorageType.ACCOUNT_WAREHOUSE.getId());
  683. player.getStorage(StorageType.ACCOUNT_WAREHOUSE.getId()).onLoadHandler(kinahItem);
  684. }
  685. }
  686. }