Ejemplo n.º 1
0
void MWWorld::InventoryStore::equip (int slot, const ContainerStoreIterator& iterator, const Ptr& actor)
{
    if (iterator == end())
        throw std::runtime_error ("can't equip end() iterator, use unequip function instead");

    if (slot<0 || slot>=static_cast<int> (mSlots.size()))
        throw std::runtime_error ("slot number out of range");

    if (iterator.getContainerStore()!=this)
        throw std::runtime_error ("attempt to equip an item that is not in the inventory");

    std::pair<std::vector<int>, bool> slots_;

    slots_ = iterator->getClass().getEquipmentSlots (*iterator);

    if (std::find (slots_.first.begin(), slots_.first.end(), slot)==slots_.first.end())
        throw std::runtime_error ("invalid slot");

    if (mSlots[slot] != end())
        unequipSlot(slot, actor);

    // unstack item pointed to by iterator if required
    if (iterator!=end() && !slots_.second && iterator->getRefData().getCount() > 1) // if slots.second is true, item can stay stacked when equipped
    {
        unstack(*iterator, actor);
    }

    mSlots[slot] = iterator;

    flagAsModified();

    fireEquipmentChangedEvent(actor);

    updateMagicEffects(actor);
}
Ejemplo n.º 2
0
//drop inventory slot
void cGameServer::doDrop(int id,int slot)
{
    int item=player[id].inventory[slot];

    if(item<0 || item>=ml_items.item.size())
        return;

    if(ml_items.item[item].qty==0)//cant drop empty
        return;

    //unequip

    unequipSlot(id,slot);


    //drop item on map
    sendAddMapItem(ml_items.item[item].graphic,player[id].map,player[id].x,player[id].y);

    //remove from player inventory

    ml_items.item[item].owner=-1;
    ml_items.item[item].map=player[id].map;
    ml_items.item[item].x=player[id].x;
    ml_items.item[item].y=player[id].y;
    updateItem(item);
    player[id].inventory[slot]=-1;

    //remove from client inventory
    sendInventoryRemove(itod(id),slot,ml_items.item[item].qty);
}
Ejemplo n.º 3
0
void MWWorld::InventoryStore::unequipAll(const MWWorld::Ptr& actor)
{
    // Only *one* change event should be fired
    mUpdatesEnabled = false;
    for (int slot=0; slot < MWWorld::InventoryStore::Slots; ++slot)
        unequipSlot(slot, actor);
    mUpdatesEnabled = true;
    fireEquipmentChangedEvent();
    updateMagicEffects(actor);
}
Ejemplo n.º 4
0
MWWorld::ContainerStoreIterator MWWorld::InventoryStore::unequipItem(const MWWorld::Ptr& item, const MWWorld::Ptr& actor)
{
    for (int slot=0; slot<MWWorld::InventoryStore::Slots; ++slot)
    {
        MWWorld::ContainerStoreIterator equipped = getSlot(slot);
        if (equipped != end() && *equipped == item)
            return unequipSlot(slot, actor);
    }

    throw std::runtime_error ("attempt to unequip an item that is not currently equipped");
}
Ejemplo n.º 5
0
int MWWorld::InventoryStore::remove(const Ptr& item, int count, const Ptr& actor, bool equipReplacement)
{
    int retCount = ContainerStore::remove(item, count, actor);

    bool wasEquipped = false;
    if (!item.getRefData().getCount())
    {
        for (int slot=0; slot < MWWorld::InventoryStore::Slots; ++slot)
        {
            if (mSlots[slot] == end())
                continue;

            if (*mSlots[slot] == item)
            {
                unequipSlot(slot, actor);
                wasEquipped = true;
                break;
            }
        }
    }

    // If an armor/clothing item is removed, try to find a replacement,
    // but not for the player nor werewolves, and not if the RemoveItem script command
    // was used (equipReplacement is false)
    if (equipReplacement && wasEquipped && (actor != MWMechanics::getPlayer())
            && actor.getClass().isNpc() && !actor.getClass().getNpcStats(actor).isWerewolf())
    {
        std::string type = item.getTypeName();
        if (type == typeid(ESM::Armor).name() || type == typeid(ESM::Clothing).name())
            autoEquip(actor);
    }

    if (item.getRefData().getCount() == 0 && mSelectedEnchantItem != end()
            && *mSelectedEnchantItem == item)
    {
        mSelectedEnchantItem = end();
    }

    if (mListener)
        mListener->itemRemoved(item, retCount);

    return retCount;
}
Ejemplo n.º 6
0
int MWWorld::InventoryStore::remove(const Ptr& item, int count, const Ptr& actor)
{
    int retCount = ContainerStore::remove(item, count, actor);

    if (!item.getRefData().getCount())
    {
        for (int slot=0; slot < MWWorld::InventoryStore::Slots; ++slot)
        {
            if (mSlots[slot] == end())
                continue;

            if (*mSlots[slot] == item)
            {
                unequipSlot(slot, actor);
                break;
            }
        }
    }

    // If an armor/clothing item is removed, try to find a replacement,
    // but not for the player nor werewolves.
    if ((actor.getRefData().getHandle() != "player")
            && !(actor.getClass().isNpc() && actor.getClass().getNpcStats(actor).isWerewolf()))
    {
        std::string type = item.getTypeName();
        if (((type == typeid(ESM::Armor).name()) || (type == typeid(ESM::Clothing).name()))
                && !actor.getClass().getCreatureStats(actor).isDead())
            autoEquip(actor);
    }

    if (item.getRefData().getCount() == 0 && mSelectedEnchantItem != end()
            && *mSelectedEnchantItem == item && actor.getRefData().getHandle() == "player")
    {
        mSelectedEnchantItem = end();
        MWBase::Environment::get().getWindowManager()->unsetSelectedSpell();
    }

    updateRechargingItems();

    return retCount;
}