/* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package com.l2jserver.gameserver.network.clientpackets; import java.util.logging.Level; import com.l2jserver.Config; import com.l2jserver.gameserver.model.L2ItemInstance; import com.l2jserver.gameserver.model.ItemHolder; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.itemcontainer.ItemContainer; import com.l2jserver.gameserver.model.itemcontainer.PcFreight; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate; import com.l2jserver.gameserver.network.serverpackets.ItemList; import com.l2jserver.gameserver.network.serverpackets.StatusUpdate; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.util.Util; /** * @author -Wooden- * @author UnAfraid * Thanks mrTJO */ public class RequestPackageSend extends L2GameClientPacket { private final String _C_A8_REQUESTPACKAGESEND = "[C] A8 RequestPackageSend"; private ItemHolder _items[] = null; private int _objectId; private int _count; @Override protected void readImpl() { _objectId = readD(); _count = readD(); _items = new ItemHolder[_count]; for (int i = 0; i < _count; i++) { int objId = readD(); long cnt = readQ(); if (objId < 1 || cnt < 0) { _items = null; return; } _items[i] = new ItemHolder(objId, cnt); } } @Override protected void runImpl() { if (_items == null) return; final L2PcInstance player = getClient().getActiveChar(); if (player == null) return; if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("deposit")) { player.sendMessage("You depositing items too fast."); return; } player.setActiveWarehouse(new PcFreight(_objectId)); final ItemContainer warehouse = player.getActiveWarehouse(); if (warehouse == null) return; L2Npc manager = player.getLastFolkNPC(); if ((manager == null || !player.isInsideRadius(manager, L2NpcInstance.INTERACTION_DISTANCE, false, false)) && !player.isGM()) return; if (player.getActiveEnchantItem() != null) { Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to use enchant Exploit!", Config.DEFAULT_PUNISH); return; } // Alt game - Karma punishment if (!Config.ALT_GAME_KARMA_PLAYER_CAN_USE_WAREHOUSE && player.getKarma() > 0) return; // Freight price from config or normal price per item slot (30) int fee = _count * Config.ALT_FREIGHT_PRIECE; //Config.ALT_GAME_FREIGHT_PRICE; double currentAdena = player.getAdena(); int slots = 0; for (ItemHolder i : _items) { // Check validity of requested item L2ItemInstance item = player.checkItemManipulation(i.getObjectId(), i.getCount(), "deposit"); if (item == null) { _log.log(Level.WARNING, "Error depositing a warehouse object for char " + player.getName() + " (validity check)"); return; } if (!item.isFreightable()) return; // Calculate needed adena and slots if (item.getItemId() == 57) currentAdena -= i.getCount(); else if (!item.isStackable()) slots += i.getCount(); else if (warehouse.getItemByItemId(item.getItemId()) == null) slots++; } // Item Max Limit Check if (!warehouse.validateCapacity(slots)) { sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED)); return; } // Check if enough adena and charge the fee if (currentAdena < fee || !player.reduceAdena(warehouse.getName(), fee, manager, false)) { sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_NOT_ENOUGH_ADENA)); return; } // get current tradelist if any if (player.getActiveTradeList() != null) return; // Proceed to the transfer InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); for (ItemHolder i : _items) { // Check validity of requested item L2ItemInstance oldItem = player.checkItemManipulation(i.getObjectId(), i.getCount(), "deposit"); if (oldItem == null) { _log.log(Level.WARNING, "Error depositing a warehouse object for char " + player.getName() + " (olditem == null)"); return; } L2ItemInstance newItem = player.getInventory().transferItem("Trade", i.getObjectId(), i.getCount(), warehouse, player, null); if (newItem == null) { _log.log(Level.WARNING, "Error depositing a warehouse object for char " + player.getName() + " (newitem == null)"); continue; } if (playerIU != null) { if (oldItem.getCount() > 0 && oldItem != newItem) playerIU.addModifiedItem(oldItem); else playerIU.addRemovedItem(oldItem); } } warehouse.deleteMe(); // Send updated item list to the player if (playerIU != null) player.sendPacket(playerIU); else player.sendPacket(new ItemList(player, false)); // Update current load status on player StatusUpdate su = new StatusUpdate(player); su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad()); player.sendPacket(su); } @Override public String getType() { return _C_A8_REQUESTPACKAGESEND; } }