mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-14 01:19:59 +00:00
Merge branch 'bounditems' into 'master'
Interrupt bound item effect if equipment failed (#8383) Closes #8383 See merge request OpenMW/openmw!4572
This commit is contained in:
commit
e9735889d9
@ -174,7 +174,7 @@ namespace
|
||||
return -1;
|
||||
}
|
||||
|
||||
void addBoundItem(const ESM::RefId& itemId, const MWWorld::Ptr& actor)
|
||||
bool addBoundItem(const ESM::RefId& itemId, const MWWorld::Ptr& actor)
|
||||
{
|
||||
MWWorld::InventoryStore& store = actor.getClass().getInventoryStore(actor);
|
||||
MWWorld::Ptr boundPtr = *store.MWWorld::ContainerStore::add(itemId, 1);
|
||||
@ -185,9 +185,6 @@ namespace
|
||||
MWWorld::ActionEquip action(boundPtr);
|
||||
action.execute(actor);
|
||||
|
||||
if (actor != MWMechanics::getPlayer())
|
||||
return;
|
||||
|
||||
MWWorld::Ptr newItem;
|
||||
auto it = slot >= 0 ? store.getSlot(slot) : store.end();
|
||||
// Equip can fail because beast races cannot equip boots/helmets
|
||||
@ -195,16 +192,21 @@ namespace
|
||||
newItem = *it;
|
||||
|
||||
if (newItem.isEmpty() || boundPtr != newItem)
|
||||
return;
|
||||
return false;
|
||||
|
||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||
if (actor == MWMechanics::getPlayer())
|
||||
{
|
||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||
|
||||
// change draw state only if the item is in player's right hand
|
||||
if (slot == MWWorld::InventoryStore::Slot_CarriedRight)
|
||||
player.setDrawState(MWMechanics::DrawState::Weapon);
|
||||
// change draw state only if the item is in player's right hand
|
||||
if (slot == MWWorld::InventoryStore::Slot_CarriedRight)
|
||||
player.setDrawState(MWMechanics::DrawState::Weapon);
|
||||
|
||||
if (prevItem != store.end())
|
||||
player.setPreviousItem(itemId, prevItem->getCellRef().getRefId());
|
||||
if (prevItem != store.end())
|
||||
player.setPreviousItem(itemId, prevItem->getCellRef().getRefId());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void removeBoundItem(const ESM::RefId& itemId, const MWWorld::Ptr& actor)
|
||||
@ -626,16 +628,19 @@ namespace MWMechanics
|
||||
case ESM::MagicEffect::BoundHelm:
|
||||
case ESM::MagicEffect::BoundBoots:
|
||||
case ESM::MagicEffect::BoundShield:
|
||||
{
|
||||
if (!target.getClass().hasInventoryStore(target))
|
||||
invalid = true;
|
||||
else
|
||||
{
|
||||
const std::string& item = sBoundItemsMap.at(effect.mEffectId);
|
||||
addBoundItem(ESM::RefId::stringRefId(
|
||||
world->getStore().get<ESM::GameSetting>().find(item)->mValue.getString()),
|
||||
target);
|
||||
invalid = true;
|
||||
break;
|
||||
}
|
||||
const std::string& item = sBoundItemsMap.at(effect.mEffectId);
|
||||
const MWWorld::Store<ESM::GameSetting>& gmst = world->getStore().get<ESM::GameSetting>();
|
||||
const ESM::RefId itemId = ESM::RefId::stringRefId(gmst.find(item)->mValue.getString());
|
||||
if (!addBoundItem(itemId, target))
|
||||
effect.mTimeLeft = 0.f;
|
||||
break;
|
||||
}
|
||||
case ESM::MagicEffect::FireDamage:
|
||||
case ESM::MagicEffect::ShockDamage:
|
||||
case ESM::MagicEffect::FrostDamage:
|
||||
|
Loading…
x
Reference in New Issue
Block a user