Don't crash on spells or enchantments without effects

macos_ci_fix
Evil Eye 5 months ago
parent 102d2c4b43
commit 0da620b3f9

@ -103,6 +103,7 @@
Bug #7665: Alchemy menu is missing the ability to deselect and choose different qualities of an apparatus
Bug #7675: Successful lock spell doesn't produce a sound
Bug #7679: Scene luminance value flashes when toggling shaders
Bug #7712: Casting doesn't support spells and enchantments with no effects
Feature #3537: Shader-based water ripples
Feature #5492: Let rain and snow collide with statics
Feature #6149: Dehardcode Lua API_REVISION

@ -423,17 +423,21 @@ namespace MWGui
mSpellBox->setUserString("Spell", spellId.serialize());
mSpellBox->setUserData(MyGUI::Any::Null);
// use the icon of the first effect
const ESM::MagicEffect* effect = MWBase::Environment::get().getESMStore()->get<ESM::MagicEffect>().find(
spell->mEffects.mList.front().mEffectID);
std::string icon = effect->mIcon;
std::replace(icon.begin(), icon.end(), '/', '\\');
int slashPos = icon.rfind('\\');
icon.insert(slashPos + 1, "b_");
icon = Misc::ResourceHelpers::correctIconPath(icon, MWBase::Environment::get().getResourceSystem()->getVFS());
mSpellImage->setSpellIcon(icon);
if (!spell->mEffects.mList.empty())
{
// use the icon of the first effect
const ESM::MagicEffect* effect = MWBase::Environment::get().getESMStore()->get<ESM::MagicEffect>().find(
spell->mEffects.mList.front().mEffectID);
std::string icon = effect->mIcon;
std::replace(icon.begin(), icon.end(), '/', '\\');
size_t slashPos = icon.rfind('\\');
icon.insert(slashPos + 1, "b_");
icon = Misc::ResourceHelpers::correctIconPath(
icon, MWBase::Environment::get().getResourceSystem()->getVFS());
mSpellImage->setSpellIcon(icon);
}
else
mSpellImage->setSpellIcon({});
}
void HUD::setSelectedEnchantItem(const MWWorld::Ptr& item, int chargePercent)

@ -202,7 +202,7 @@ namespace MWGui
setIcon(ptr);
}
void SpellWidget::setSpellIcon(const std::string& icon)
void SpellWidget::setSpellIcon(std::string_view icon)
{
if (mFrame && !mCurrentFrame.empty())
{

@ -58,7 +58,7 @@ namespace MWGui
{
MYGUI_RTTI_DERIVED(SpellWidget)
public:
void setSpellIcon(const std::string& icon);
void setSpellIcon(std::string_view icon);
};
}

@ -237,13 +237,15 @@ namespace MWGui
params.mNoTarget = false;
effects.push_back(params);
}
if (MWMechanics::spellIncreasesSkill(
spell)) // display school of spells that contribute to skill progress
// display school of spells that contribute to skill progress
if (MWMechanics::spellIncreasesSkill(spell))
{
MWWorld::Ptr player = MWMechanics::getPlayer();
const auto& school
= store->get<ESM::Skill>().find(MWMechanics::getSpellSchool(spell, player))->mSchool;
info.text = "#{sSchool}: " + MyGUI::TextIterator::toTagsString(school->mName).asUTF8();
ESM::RefId id = MWMechanics::getSpellSchool(spell, MWMechanics::getPlayer());
if (!id.empty())
{
const auto& school = store->get<ESM::Skill>().find(id)->mSchool;
info.text = "#{sSchool}: " + MyGUI::TextIterator::toTagsString(school->mName).asUTF8();
}
}
auto cost = focus->getUserString("SpellCost");
if (!cost.empty() && cost != "0")

@ -1605,7 +1605,7 @@ namespace MWMechanics
effects = &spell->mEffects.mList;
cast.playSpellCastingEffects(spell);
}
if (mCanCast)
if (mCanCast && !effects->empty())
{
const ESM::MagicEffect* effect = store.get<ESM::MagicEffect>().find(
effects->back().mEffectID); // use last effect of list for color of VFX_Hands
@ -1615,18 +1615,13 @@ namespace MWMechanics
const VFS::Manager* const vfs = MWBase::Environment::get().getResourceSystem()->getVFS();
if (!effects->empty())
{
if (mAnimation->getNode("Bip01 L Hand"))
mAnimation->addEffect(
Misc::ResourceHelpers::correctMeshPath(castStatic->mModel, vfs), -1, false,
"Bip01 L Hand", effect->mParticle);
if (mAnimation->getNode("Bip01 R Hand"))
mAnimation->addEffect(
Misc::ResourceHelpers::correctMeshPath(castStatic->mModel, vfs), -1, false,
"Bip01 R Hand", effect->mParticle);
}
if (mAnimation->getNode("Bip01 L Hand"))
mAnimation->addEffect(Misc::ResourceHelpers::correctMeshPath(castStatic->mModel, vfs),
-1, false, "Bip01 L Hand", effect->mParticle);
if (mAnimation->getNode("Bip01 R Hand"))
mAnimation->addEffect(Misc::ResourceHelpers::correctMeshPath(castStatic->mModel, vfs),
-1, false, "Bip01 R Hand", effect->mParticle);
}
const ESM::ENAMstruct& firstEffect = effects->at(0); // first effect used for casting animation

@ -524,11 +524,9 @@ namespace MWWorld
const ESM::Enchantment* enchantment
= MWBase::Environment::get().getESMStore()->get<ESM::Enchantment>().search(enchantmentName);
if (!enchantment)
if (!enchantment || enchantment->mEffects.mList.empty())
return result;
assert(enchantment->mEffects.mList.size());
const ESM::MagicEffect* magicEffect = MWBase::Environment::get().getESMStore()->get<ESM::MagicEffect>().search(
enchantment->mEffects.mList.front().mEffectID);
if (!magicEffect)

Loading…
Cancel
Save