1
0
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:
Alexei Kotov 2025-03-12 09:18:51 +03:00
commit e9735889d9

View File

@ -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: