Exception handling improvements (Bug #3090)

openmw-38
scrawl 9 years ago
parent 2fe2f53b02
commit 1c8244276d

@ -34,7 +34,7 @@ namespace MWMechanics
MWBase::Environment::get().getWorld()->spawnEffect("meshes\\" + fx->mModel, MWBase::Environment::get().getWorld()->spawnEffect("meshes\\" + fx->mModel,
"", ptr.getRefData().getPosition().asVec3()); "", ptr.getRefData().getPosition().asVec3());
} }
else else if (creatureActorId != -1)
{ {
// We didn't find the creature. It's probably in an inactive cell. // We didn't find the creature. It's probably in an inactive cell.
// Add to graveyard so we can delete it when the cell becomes active. // Add to graveyard so we can delete it when the cell becomes active.
@ -132,25 +132,34 @@ namespace MWMechanics
if (!creatureID.empty()) if (!creatureID.empty())
{ {
MWWorld::CellStore* store = mActor.getCell(); MWWorld::CellStore* store = mActor.getCell();
MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(), creatureID, 1); int creatureActorId = -1;
ref.getPtr().getCellRef().setPosition(ipos); try
{
MWMechanics::CreatureStats& summonedCreatureStats = ref.getPtr().getClass().getCreatureStats(ref.getPtr()); MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(), creatureID, 1);
ref.getPtr().getCellRef().setPosition(ipos);
// Make the summoned creature follow its master and help in fights
AiFollow package(mActor.getCellRef().getRefId()); MWMechanics::CreatureStats& summonedCreatureStats = ref.getPtr().getClass().getCreatureStats(ref.getPtr());
summonedCreatureStats.getAiSequence().stack(package, ref.getPtr());
int creatureActorId = summonedCreatureStats.getActorId(); // Make the summoned creature follow its master and help in fights
AiFollow package(mActor.getCellRef().getRefId());
MWWorld::Ptr placed = MWBase::Environment::get().getWorld()->safePlaceObject(ref.getPtr(),store,ipos); summonedCreatureStats.getAiSequence().stack(package, ref.getPtr());
creatureActorId = summonedCreatureStats.getActorId();
MWRender::Animation* anim = MWBase::Environment::get().getWorld()->getAnimation(placed);
if (anim) MWWorld::Ptr placed = MWBase::Environment::get().getWorld()->safePlaceObject(ref.getPtr(),store,ipos);
MWRender::Animation* anim = MWBase::Environment::get().getWorld()->getAnimation(placed);
if (anim)
{
const ESM::Static* fx = MWBase::Environment::get().getWorld()->getStore().get<ESM::Static>()
.search("VFX_Summon_Start");
if (fx)
anim->addEffect("meshes\\" + fx->mModel, -1, false);
}
}
catch (std::exception& e)
{ {
const ESM::Static* fx = MWBase::Environment::get().getWorld()->getStore().get<ESM::Static>() std::cerr << "Failed to spawn summoned creature: " << e.what() << std::endl;
.search("VFX_Summon_Start"); // still insert into creatureMap so we don't try to spawn again every frame, that would spam the warning log
if (fx)
anim->addEffect("meshes\\" + fx->mModel, -1, false);
} }
creatureMap.insert(std::make_pair(*it, creatureActorId)); creatureMap.insert(std::make_pair(*it, creatureActorId));

@ -518,7 +518,16 @@ namespace MWRender
} }
if (mTextKeyListener) if (mTextKeyListener)
mTextKeyListener->handleTextKey(groupname, key, map); {
try
{
mTextKeyListener->handleTextKey(groupname, key, map);
}
catch (std::exception& e)
{
std::cerr << "Error handling text key " << evt << ": " << e.what() << std::endl;
}
}
} }
void Animation::play(const std::string &groupname, const AnimPriority& priority, int blendMask, bool autodisable, float speedmult, void Animation::play(const std::string &groupname, const AnimPriority& priority, int blendMask, bool autodisable, float speedmult,

Loading…
Cancel
Save