mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 15:49:55 +00:00
1e4a854433
It was just adding a level of indirection to Ptr.getClass(). All the call were replaced by that instead. The number of lines changed is important, but the change itself is trivial, so everything should be fine. :)
80 lines
2.4 KiB
C++
80 lines
2.4 KiB
C++
#include "actionequip.hpp"
|
|
|
|
#include "../mwbase/environment.hpp"
|
|
#include "../mwbase/world.hpp"
|
|
#include "../mwbase/windowmanager.hpp"
|
|
|
|
#include <components/compiler/locals.hpp>
|
|
|
|
#include "inventorystore.hpp"
|
|
#include "player.hpp"
|
|
#include "class.hpp"
|
|
|
|
namespace MWWorld
|
|
{
|
|
ActionEquip::ActionEquip (const MWWorld::Ptr& object) : Action (false, object)
|
|
{
|
|
}
|
|
|
|
void ActionEquip::executeImp (const Ptr& actor)
|
|
{
|
|
MWWorld::Ptr object = getTarget();
|
|
MWWorld::InventoryStore& invStore = actor.getClass().getInventoryStore(actor);
|
|
|
|
std::pair <int, std::string> result = object.getClass().canBeEquipped (object, actor);
|
|
|
|
// display error message if the player tried to equip something
|
|
if (!result.second.empty() && actor == MWBase::Environment::get().getWorld()->getPlayerPtr())
|
|
MWBase::Environment::get().getWindowManager()->messageBox(result.second);
|
|
|
|
switch(result.first)
|
|
{
|
|
case 0:
|
|
return;
|
|
case 2:
|
|
invStore.unequipSlot(MWWorld::InventoryStore::Slot_CarriedLeft, actor);
|
|
break;
|
|
case 3:
|
|
invStore.unequipSlot(MWWorld::InventoryStore::Slot_CarriedRight, actor);
|
|
break;
|
|
}
|
|
|
|
// slots that this item can be equipped in
|
|
std::pair<std::vector<int>, bool> slots_ = getTarget().getClass().getEquipmentSlots(getTarget());
|
|
|
|
// retrieve ContainerStoreIterator to the item
|
|
MWWorld::ContainerStoreIterator it = invStore.begin();
|
|
for (; it != invStore.end(); ++it)
|
|
{
|
|
if (*it == object)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
assert(it != invStore.end());
|
|
|
|
// equip the item in the first free slot
|
|
for (std::vector<int>::const_iterator slot=slots_.first.begin();
|
|
slot!=slots_.first.end(); ++slot)
|
|
{
|
|
// if the item is equipped already, nothing to do
|
|
if (invStore.getSlot(*slot) == it)
|
|
return;
|
|
|
|
// if all slots are occupied, replace the last slot
|
|
if (slot == --slots_.first.end())
|
|
{
|
|
invStore.equip(*slot, it, actor);
|
|
break;
|
|
}
|
|
|
|
if (invStore.getSlot(*slot) == invStore.end())
|
|
{
|
|
// slot is not occupied
|
|
invStore.equip(*slot, it, actor);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|