/*
* 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 silentium.gameserver.model.itemcontainer;
import java.util.List;
import javolution.util.FastList;
import silentium.gameserver.model.L2ItemInstance;
import silentium.gameserver.model.L2ItemInstance.ItemLocation;
import silentium.gameserver.model.L2Object;
import silentium.gameserver.model.L2World;
import silentium.gameserver.model.actor.instance.L2PcInstance;
import silentium.gameserver.model.actor.instance.L2PetInstance;
import silentium.gameserver.tables.ItemTable;
import silentium.gameserver.templates.item.L2EtcItemType;
import silentium.gameserver.templates.item.L2Item;
public class PetInventory extends Inventory
{
private final L2PetInstance _owner;
public PetInventory(L2PetInstance owner)
{
_owner = owner;
}
@Override
public L2PetInstance getOwner()
{
return _owner;
}
@Override
public int getOwnerId()
{
// gets the L2PcInstance-owner's ID
int id;
try
{
id = _owner.getOwner().getObjectId();
}
catch (NullPointerException e)
{
return 0;
}
return id;
}
/**
* Refresh the weight of equipment loaded
*/
@Override
protected void refreshWeight()
{
super.refreshWeight();
getOwner().updateAndBroadcastStatus(1);
}
public boolean validateCapacity(L2ItemInstance item)
{
int slots = 0;
if (!(item.isStackable() && getItemByItemId(item.getItemId()) != null) && item.getItemType() != L2EtcItemType.HERB)
slots++;
return validateCapacity(slots);
}
@Override
public boolean validateCapacity(int slots)
{
return (_items.size() + slots <= _owner.getInventoryLimit());
}
public boolean validateWeight(L2ItemInstance item, long count)
{
int weight = 0;
L2Item template = ItemTable.getInstance().getTemplate(item.getItemId());
if (template == null)
return false;
weight += count * template.getWeight();
return validateWeight(weight);
}
@Override
public boolean validateWeight(int weight)
{
return (_totalWeight + weight <= _owner.getMaxLoad());
}
@Override
protected ItemLocation getBaseLocation()
{
return ItemLocation.PET;
}
@Override
protected ItemLocation getEquipLocation()
{
return ItemLocation.PET_EQUIP;
}
@Override
public void restore()
{
super.restore();
// check for equipped items from other pets
for (L2ItemInstance item : _items)
{
if (item.isEquipped())
{
if (!item.getItem().checkCondition(getOwner(), getOwner(), false))
unEquipItemInSlot(item.getLocationSlot());
}
}
}
@Override
public void deleteMe()
{
// Transfer items only if the items list is feeded.
if (_items != null)
{
transferItemsToOwner();
List<L2Object> items = new FastList<L2Object>(_items);
_items.clear();
L2World.getInstance().removeObjects(items);
}
}
/**
* Transfer pet's inventory to owner's inventory. Doesn't check used slots / maximum weight. Method used at unsummon / logout.
*/
public void transferItemsToOwner()
{
// Retrieves the master of the pet owning the inventory.
final L2PcInstance petOwner = getOwner().getOwner();
if (petOwner == null)
return;
// Transfer each item to master's inventory.
for (L2ItemInstance item : _items)
{
if (item != null)
getOwner().transferItem("return", item.getObjectId(), item.getCount(), petOwner.getInventory(), petOwner, getOwner());
}
}
}