root/trunk/AE-go_GameServer/src/com/aionemu/gameserver/services/ItemService.java
| 967 | 993 | ||
|---|---|---|---|
26 | import com.aionemu.gameserver.dao.ItemStoneListDAO; | 26 | import com.aionemu.gameserver.dao.ItemStoneListDAO; |
27 | import com.aionemu.gameserver.dataholders.DataManager; | 27 | import com.aionemu.gameserver.dataholders.DataManager; |
28 | import com.aionemu.gameserver.model.gameobjects.Item; | 28 | import com.aionemu.gameserver.model.gameobjects.Item; |
29 | import com.aionemu.gameserver.model.gameobjects.player.Inventory; | 29 | import com.aionemu.gameserver.model.gameobjects.player.Storage; |
30 | import com.aionemu.gameserver.model.gameobjects.player.Player; | 30 | import com.aionemu.gameserver.model.gameobjects.player.Player; |
31 | import com.aionemu.gameserver.model.gameobjects.player.StorageType; | ||
31 | import com.aionemu.gameserver.model.gameobjects.stats.listeners.ItemEquipmentListener; | 32 | import com.aionemu.gameserver.model.gameobjects.stats.listeners.ItemEquipmentListener; |
32 | import com.aionemu.gameserver.model.items.ItemId; | 33 | import com.aionemu.gameserver.model.items.ItemId; |
33 | import com.aionemu.gameserver.model.items.ItemStone; | 34 | import com.aionemu.gameserver.model.items.ItemStone; |
34 | import com.aionemu.gameserver.model.templates.item.ItemTemplate; | 35 | import com.aionemu.gameserver.model.templates.item.ItemTemplate; |
35 | import com.aionemu.gameserver.network.aion.serverpackets.SM_DELETE_ITEM; | 36 | import com.aionemu.gameserver.network.aion.serverpackets.SM_DELETE_ITEM; |
37 | import com.aionemu.gameserver.network.aion.serverpackets.SM_DELETE_WAREHOUSE_ITEM; | ||
36 | import com.aionemu.gameserver.network.aion.serverpackets.SM_INVENTORY_UPDATE; | 38 | import com.aionemu.gameserver.network.aion.serverpackets.SM_INVENTORY_UPDATE; |
37 | import com.aionemu.gameserver.network.aion.serverpackets.SM_UPDATE_ITEM; | 39 | import com.aionemu.gameserver.network.aion.serverpackets.SM_UPDATE_ITEM; |
40 | import com.aionemu.gameserver.network.aion.serverpackets.SM_UPDATE_WAREHOUSE_ITEM; | ||
41 | import com.aionemu.gameserver.network.aion.serverpackets.SM_WAREHOUSE_UPDATE; | ||
38 | import com.aionemu.gameserver.utils.PacketSendUtility; | 42 | import com.aionemu.gameserver.utils.PacketSendUtility; |
39 | import com.aionemu.gameserver.utils.idfactory.IDFactory; | 43 | import com.aionemu.gameserver.utils.idfactory.IDFactory; |
40 | import com.aionemu.gameserver.utils.idfactory.IDFactoryAionObject; | 44 | import com.aionemu.gameserver.utils.idfactory.IDFactoryAionObject; |
... | ... | ||
117 | */ | 121 | */ |
118 | public void loadItemStones(Player player) | 122 | public void loadItemStones(Player player) |
119 | { | 123 | { |
120 | List<Item> itemList = player.getInventory().getAllItems(); | 124 | List<Item> itemList = new ArrayList<Item>(); |
125 | itemList.addAll(player.getStorage(StorageType.CUBE.getId()).getStorageItems()); | ||
126 | itemList.addAll(player.getStorage(StorageType.REGULAR_WAREHOUSE.getId()).getStorageItems()); | ||
127 | itemList.addAll(player.getStorage(StorageType.ACCOUNT_WAREHOUSE.getId()).getStorageItems()); | ||
128 | itemList.addAll(player.getStorage(StorageType.CUBE.getId()).getEquippedItems()); | ||
121 | 129 | ||
122 | for(Item item : itemList) | 130 | for(Item item : itemList) |
123 | { | 131 | { |
... | ... | ||
143 | * @param itemObjId | 151 | * @param itemObjId |
144 | * @param splitAmount | 152 | * @param splitAmount |
145 | * @param slotNum | 153 | * @param slotNum |
154 | * @param sourceStorageType | ||
155 | * @param desetinationStorageType | ||
146 | */ | 156 | */ |
147 | public void splitItem (Player player, int itemObjId, int splitAmount, int slotNum) | 157 | public void splitItem (Player player, int itemObjId, int splitAmount, int slotNum, int sourceStorageType, int destinationStorageType) |
148 | { | 158 | { |
149 | Inventory inventory = player.getInventory(); | 159 | Storage sourceStorage = player.getStorage(sourceStorageType); |
160 | Storage destinationStorage = player.getStorage(destinationStorageType); | ||
150 | 161 | ||
151 | Item itemToSplit = inventory.getItemByObjId(itemObjId); | 162 | Item itemToSplit = sourceStorage.getItemByObjId(itemObjId); |
152 | if(itemToSplit == null) | 163 | if(itemToSplit == null) |
153 | { | 164 | { |
154 | log.warn(String.format("CHECKPOINT: attempt to split null item %d %d %d", itemObjId, splitAmount, slotNum)); | 165 | itemToSplit = sourceStorage.getKinahItem(); |
166 | if(itemToSplit.getObjectId() != itemObjId || itemToSplit == null) | ||
167 | { | ||
168 | log.warn(String.format("CHECKPOINT: attempt to split null item %d %d %d", itemObjId, splitAmount, slotNum)); | ||
169 | return; | ||
170 | } | ||
171 | } | ||
172 | |||
173 | // To move kinah from inventory to warehouse and vise versa client using split item packet | ||
174 | if(itemToSplit.getItemTemplate().isKinah()) | ||
175 | { | ||
176 | moveKinah(player, sourceStorage, splitAmount); | ||
155 | return; | 177 | return; |
156 | } | 178 | } |
157 | 179 | ||
... | ... | ||
162 | 184 | ||
163 | 185 | ||
164 | 186 | ||
165 | Item newItem = this.newItem(itemToSplit.getItemTemplate().getItemId(), splitAmount); | 187 | Item newItem = newItem(itemToSplit.getItemTemplate().getItemId(), splitAmount); |
166 | 188 | ||
167 | if(inventory.putToBag(newItem) != null) | 189 | if(destinationStorage.putToBag(newItem) != null) |
168 | { | 190 | { |
169 | itemToSplit.decreaseItemCount(splitAmount); | 191 | itemToSplit.decreaseItemCount(splitAmount); |
170 | 192 | ||
171 | List<Item> itemsToUpdate = new ArrayList<Item>(); | 193 | List<Item> itemsToUpdate = new ArrayList<Item>(); |
172 | itemsToUpdate.add(newItem); | 194 | itemsToUpdate.add(newItem); |
173 | 195 | ||
174 | PacketSendUtility.sendPacket(player, new SM_INVENTORY_UPDATE(itemsToUpdate)); | 196 | sendStorageUpdatePacket(player, destinationStorageType, itemsToUpdate.get(0)); |
175 | PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(itemToSplit)); | 197 | |
198 | sendUpdateItemPacket(player, sourceStorageType, itemToSplit); | ||
176 | } | 199 | } |
177 | else | 200 | else |
178 | { | 201 | { |
179 | releaseItemId(newItem); | 202 | releaseItemId(newItem); |
180 | } | 203 | } |
181 | } | 204 | } |
182 | | 205 | |
206 | |||
207 | public void moveKinah(Player player, Storage source, int splitAmount) | ||
208 | { | ||
209 | switch(source.getStorageType()) | ||
210 | { | ||
211 | case 0: | ||
212 | { | ||
213 | Storage destination = player.getStorage(StorageType.ACCOUNT_WAREHOUSE.getId()); | ||
214 | int chksum = (source.getKinahItem().getItemCount() - splitAmount) + (destination.getKinahItem().getItemCount() + splitAmount); | ||
215 | |||
216 | if(chksum != source.getKinahItem().getItemCount() + destination.getKinahItem().getItemCount()) | ||
217 | return; | ||
218 | |||
219 | source.decreaseKinah(splitAmount); | ||
220 | destination.increaseKinah(splitAmount); | ||
221 | break; | ||
222 | } | ||
223 | |||
224 | case 2: | ||
225 | { | ||
226 | Storage destination = player.getStorage(StorageType.CUBE.getId()); | ||
227 | int chksum = (source.getKinahItem().getItemCount() - splitAmount) + (destination.getKinahItem().getItemCount() + splitAmount); | ||
228 | |||
229 | if(chksum != source.getKinahItem().getItemCount() + destination.getKinahItem().getItemCount()) | ||
230 | return; | ||
231 | |||
232 | source.decreaseKinah(splitAmount); | ||
233 | destination.increaseKinah(splitAmount); | ||
234 | break; | ||
235 | } | ||
236 | default: | ||
237 | break; | ||
238 | } | ||
239 | } | ||
240 | |||
183 | /** | 241 | /** |
184 | * Used to merge 2 items in inventory | 242 | * Used to merge 2 items in inventory |
185 | * | 243 | * |
... | ... | ||
188 | * @param itemAmount | 246 | * @param itemAmount |
189 | * @param destinationObjId | 247 | * @param destinationObjId |
190 | */ | 248 | */ |
191 | public void mergeItems (Player player, int sourceItemObjId, int itemAmount, int destinationObjId) | 249 | public void mergeItems (Player player, int sourceItemObjId, int itemAmount, int destinationObjId, int sourceStorageType, int destinationStorageType) |
192 | { | 250 | { |
193 | if(itemAmount == 0) | 251 | if(itemAmount == 0) |
194 | return; | 252 | return; |
195 | 253 | ||
196 | Inventory inventory = player.getInventory(); | 254 | Storage sourceStorage = player.getStorage(sourceStorageType); |
255 | Storage destinationStorage = player.getStorage(destinationStorageType); | ||
197 | 256 | ||
198 | Item sourceItem = inventory.getItemByObjId(sourceItemObjId); | 257 | Item sourceItem = sourceStorage.getItemByObjId(sourceItemObjId); |
199 | Item destinationItem = inventory.getItemByObjId(destinationObjId); | 258 | Item destinationItem = destinationStorage.getItemByObjId(destinationObjId); |
200 | | 259 | |
201 | if(sourceItem == null || destinationItem == null) | 260 | if(sourceItem == null || destinationItem == null) |
202 | return; //Invalid object id provided | 261 | return; //Invalid object id provided |
203 | | 262 | |
204 | if(sourceItem.getItemTemplate().getItemId() != destinationItem.getItemTemplate().getItemId()) | 263 | if(sourceItem.getItemTemplate().getItemId() != destinationItem.getItemTemplate().getItemId()) |
205 | return; //Invalid item type | 264 | return; //Invalid item type |
206 | | 265 | |
207 | if(sourceItem.getItemCount() < itemAmount) | 266 | if(sourceItem.getItemCount() < itemAmount) |
208 | return; //Invalid item amount | 267 | return; //Invalid item amount |
209 | 268 | ||
210 | if(sourceItem.getItemCount() == itemAmount) | 269 | if(sourceItem.getItemCount() == itemAmount) |
211 | { | 270 | { |
212 | destinationItem.increaseItemCount(itemAmount); | 271 | destinationItem.increaseItemCount(itemAmount); |
213 | inventory.removeFromBag(sourceItem); | 272 | sourceStorage.removeFromBag(sourceItem, true); |
214 | 273 | ||
215 | PacketSendUtility.sendPacket(player, new SM_DELETE_ITEM(sourceItem.getObjectId())); | 274 | sendDeleteItemPacket(player, sourceStorageType, sourceItem.getObjectId()); |
216 | PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(destinationItem)); | 275 | |
276 | sendUpdateItemPacket(player, destinationStorageType, destinationItem); | ||
277 | |||
217 | } | 278 | } |
218 | else if(sourceItem.getItemCount() > itemAmount) | 279 | else if(sourceItem.getItemCount() > itemAmount) |
219 | { | 280 | { |
220 | sourceItem.decreaseItemCount(itemAmount); | 281 | sourceItem.decreaseItemCount(itemAmount); |
221 | destinationItem.increaseItemCount(itemAmount); | 282 | destinationItem.increaseItemCount(itemAmount); |
222 | 283 | ||
223 | PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(sourceItem)); | 284 | sendUpdateItemPacket(player, sourceStorageType, sourceItem); |
224 | PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(destinationItem)); | 285 | |
286 | sendUpdateItemPacket(player, destinationStorageType, destinationItem); | ||
225 | } | 287 | } |
226 | else return; // cant happen in theory, but... | 288 | else return; // cant happen in theory, but... |
227 | } | 289 | } |
... | ... | ||
239 | */ | 301 | */ |
240 | public int addItem(Player player, int itemId, int count, boolean isQuestItem) | 302 | public int addItem(Player player, int itemId, int count, boolean isQuestItem) |
241 | { | 303 | { |
242 | Inventory inventory = player.getInventory(); | 304 | Storage inventory = player.getInventory(); |
243 | 305 | ||
244 | ItemTemplate itemTemplate = DataManager.ITEM_DATA.getItemTemplate(itemId); | 306 | ItemTemplate itemTemplate = DataManager.ITEM_DATA.getItemTemplate(itemId); |
245 | if(itemTemplate == null) | 307 | if(itemTemplate == null) |
... | ... | ||
262 | { | 324 | { |
263 | if(count == 0) | 325 | if(count == 0) |
264 | break; | 326 | break; |
265 | | 327 | |
266 | int freeCount = maxStackCount - existingItem.getItemCount(); | 328 | int freeCount = maxStackCount - existingItem.getItemCount(); |
267 | if(count <= freeCount) | 329 | if(count <= freeCount) |
268 | { | 330 | { |
... | ... | ||
274 | existingItem.increaseItemCount(freeCount); | 336 | existingItem.increaseItemCount(freeCount); |
275 | count -= freeCount; | 337 | count -= freeCount; |
276 | } | 338 | } |
277 | | 339 | |
278 | udpateItem(player, existingItem, false); | 340 | udpateItem(player, existingItem, false); |
279 | } | 341 | } |
280 | 342 | ||
... | ... | ||
306 | return count; | 368 | return count; |
307 | } | 369 | } |
308 | } | 370 | } |
309 | | 371 | |
372 | public void moveItem(Player player, int itemObjId, int sourceStorageType, int destinationStorageType) | ||
373 | { | ||
374 | Storage sourceStorage = player.getStorage(sourceStorageType); | ||
375 | Storage destinationStorage = player.getStorage(destinationStorageType); | ||
376 | |||
377 | Item item = player.getStorage(sourceStorageType).getItemByObjId(itemObjId); | ||
378 | |||
379 | if(item == null) | ||
380 | return; | ||
381 | |||
382 | List<Item> existingItems = destinationStorage.getItemsByItemId(item.getItemTemplate().getItemId()); | ||
383 | |||
384 | int count = item.getItemCount(); | ||
385 | int maxStackCount = item.getItemTemplate().getMaxStackCount(); | ||
386 | |||
387 | for(Item existingItem : existingItems) | ||
388 | { | ||
389 | if(count == 0) | ||
390 | break; | ||
391 | |||
392 | int freeCount = maxStackCount - existingItem.getItemCount(); | ||
393 | if(count <= freeCount) | ||
394 | { | ||
395 | existingItem.increaseItemCount(count); | ||
396 | count = 0; | ||
397 | sendDeleteItemPacket(player, sourceStorageType, item.getObjectId()); | ||
398 | sourceStorage.removeFromBag(item, true); | ||
399 | |||
400 | } | ||
401 | else | ||
402 | { | ||
403 | existingItem.increaseItemCount(freeCount); | ||
404 | count -= freeCount; | ||
405 | } | ||
406 | sendStorageUpdatePacket(player, destinationStorageType, existingItem); | ||
407 | |||
408 | } | ||
409 | |||
410 | while(!destinationStorage.isFull() && count > 0) | ||
411 | { | ||
412 | // item count still more than maxStack value | ||
413 | if(count > maxStackCount) | ||
414 | { | ||
415 | count -= maxStackCount; | ||
416 | Item newitem = newItem(item.getItemTemplate().getItemId(), maxStackCount); | ||
417 | newitem = destinationStorage.putToBag(newitem); | ||
418 | sendStorageUpdatePacket(player, destinationStorageType, newitem); | ||
419 | |||
420 | } | ||
421 | else | ||
422 | { | ||
423 | item.setItemCount(count); | ||
424 | sourceStorage.removeFromBag(item, true); | ||
425 | sendDeleteItemPacket(player, sourceStorageType, item.getObjectId()); | ||
426 | |||
427 | Item newitem = destinationStorage.putToBag(item); | ||
428 | sendStorageUpdatePacket(player, destinationStorageType, newitem); | ||
429 | |||
430 | count = 0; | ||
431 | } | ||
432 | } | ||
433 | |||
434 | } | ||
435 | |||
436 | |||
310 | public void udpateItem(Player player, Item item, boolean isNew) | 437 | public void udpateItem(Player player, Item item, boolean isNew) |
311 | { | 438 | { |
312 | if(isNew) | 439 | if(isNew) |
313 | { | ||
314 | PacketSendUtility.sendPacket(player, new SM_INVENTORY_UPDATE(Collections.singletonList(item))); | 440 | PacketSendUtility.sendPacket(player, new SM_INVENTORY_UPDATE(Collections.singletonList(item))); |
315 | } | ||
316 | else | 441 | else |
317 | { | ||
318 | PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(item)); | 442 | PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(item)); |
319 | } | ||
320 | } | 443 | } |
321 | 444 | ||
445 | public void sendDeleteItemPacket(Player player, int storageType, int itemObjId) | ||
446 | { | ||
447 | if(storageType == StorageType.CUBE.getId()) | ||
448 | PacketSendUtility.sendPacket(player, new SM_DELETE_ITEM(itemObjId)); | ||
449 | else | ||
450 | PacketSendUtility.sendPacket(player, new SM_DELETE_WAREHOUSE_ITEM(storageType, itemObjId)); | ||
451 | } | ||
452 | |||
453 | public void sendStorageUpdatePacket(Player player, int storageType, Item item) | ||
454 | { | ||
455 | if(storageType == StorageType.CUBE.getId()) | ||
456 | PacketSendUtility.sendPacket(player, new SM_INVENTORY_UPDATE(Collections.singletonList(item))); | ||
457 | else | ||
458 | PacketSendUtility.sendPacket(player, new SM_WAREHOUSE_UPDATE(item, storageType)); | ||
459 | } | ||
460 | |||
461 | public void sendUpdateItemPacket(Player player, int storageType, Item item) | ||
462 | { | ||
463 | if(storageType == StorageType.CUBE.getId()) | ||
464 | PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(item)); | ||
465 | else | ||
466 | PacketSendUtility.sendPacket(player, new SM_UPDATE_WAREHOUSE_ITEM(item, storageType)); | ||
467 | } | ||
468 | |||
322 | /** | 469 | /** |
323 | * Releases item id if item was not used by caller | 470 | * Releases item id if item was not used by caller |
324 | * | 471 | * |
325 | * @param item | 472 | * @param item |
326 | */ | 473 | */ |
327 | public void releaseItemId(Item item) | 474 | public void releaseItemId(Item item) |
328 | { | 475 | { |
329 | aionObjectsIDFactory.releaseId(item.getObjectId()); | 476 | aionObjectsIDFactory.releaseId(item.getObjectId()); |
330 | } | 477 | } |
331 | } | 478 | } |
Download diff