1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-30 12:32:36 +00:00
OpenMW/apps/openmw/mwscript/miscextensions.cpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

1887 lines
76 KiB
C++
Raw Normal View History

2010-07-05 13:15:49 +02:00
#include "miscextensions.hpp"
2022-06-07 02:08:50 +03:00
#include <chrono>
#include <cstdlib>
#include <iomanip>
#include <sstream>
2021-07-07 18:48:25 +02:00
#include <components/compiler/extensions.hpp>
#include <components/compiler/locals.hpp>
#include <components/compiler/opcodes.hpp>
2010-07-05 13:15:49 +02:00
#include <components/debug/debuglog.hpp>
2010-07-05 13:15:49 +02:00
#include <components/interpreter/interpreter.hpp>
#include <components/interpreter/opcodes.hpp>
#include <components/interpreter/runtime.hpp>
2020-12-29 21:45:59 +01:00
#include <components/misc/resourcehelpers.hpp>
#include <components/misc/rng.hpp>
2020-12-29 21:45:59 +01:00
#include <components/resource/resourcesystem.hpp>
2022-11-08 22:36:03 +01:00
#include <components/resource/scenemanager.hpp>
#include <components/sceneutil/positionattitudetransform.hpp>
2022-11-08 22:36:03 +01:00
#include <components/esm3/loadacti.hpp>
#include <components/esm3/loadalch.hpp>
#include <components/esm3/loadappa.hpp>
#include <components/esm3/loadarmo.hpp>
#include <components/esm3/loadbody.hpp>
#include <components/esm3/loadbook.hpp>
#include <components/esm3/loadclot.hpp>
#include <components/esm3/loadcont.hpp>
#include <components/esm3/loadcrea.hpp>
2022-09-08 21:08:59 +02:00
#include <components/esm3/loaddoor.hpp>
2022-11-08 22:36:03 +01:00
#include <components/esm3/loadingr.hpp>
2022-09-08 21:08:59 +02:00
#include <components/esm3/loadlevlist.hpp>
2022-11-08 22:36:03 +01:00
#include <components/esm3/loadligh.hpp>
#include <components/esm3/loadlock.hpp>
#include <components/esm3/loadmgef.hpp>
2022-11-08 22:36:03 +01:00
#include <components/esm3/loadmisc.hpp>
#include <components/esm3/loadprob.hpp>
#include <components/esm3/loadrepa.hpp>
#include <components/esm3/loadscpt.hpp>
2022-11-08 22:36:03 +01:00
#include <components/esm3/loadstat.hpp>
#include <components/esm3/loadweap.hpp>
2014-02-23 20:11:05 +01:00
#include <components/files/conversion.hpp>
2023-03-18 09:30:48 +00:00
#include <components/misc/strings/conversion.hpp>
2020-12-29 21:45:59 +01:00
#include <components/vfs/manager.hpp>
#include "../mwbase/environment.hpp"
2012-09-19 03:11:23 +02:00
#include "../mwbase/luamanager.hpp"
2021-08-07 10:06:56 +02:00
#include "../mwbase/mechanicsmanager.hpp"
#include "../mwbase/scriptmanager.hpp"
#include "../mwbase/soundmanager.hpp"
#include "../mwbase/windowmanager.hpp"
#include "../mwbase/world.hpp"
#include "../mwworld/cellstore.hpp"
2010-08-30 12:30:34 +02:00
#include "../mwworld/class.hpp"
2013-01-07 18:16:50 +00:00
#include "../mwworld/containerstore.hpp"
2014-02-23 20:11:05 +01:00
#include "../mwworld/esmstore.hpp"
#include "../mwworld/inventorystore.hpp"
#include "../mwworld/manualref.hpp"
#include "../mwworld/player.hpp"
2015-08-21 21:12:39 +12:00
#include "../mwmechanics/actorutil.hpp"
#include "../mwmechanics/aicast.hpp"
2012-11-24 02:15:55 +01:00
#include "../mwmechanics/creaturestats.hpp"
#include "../mwmechanics/npcstats.hpp"
#include "../mwmechanics/spellcasting.hpp"
2010-08-30 12:30:34 +02:00
#include "../mwrender/animation.hpp"
#include "interpretercontext.hpp"
#include "ref.hpp"
namespace
{
struct TextureFetchVisitor : osg::NodeVisitor
{
std::vector<std::pair<std::string, std::string>> mTextures;
TextureFetchVisitor(osg::NodeVisitor::TraversalMode mode = TRAVERSE_ALL_CHILDREN)
: osg::NodeVisitor(mode)
{
}
void apply(osg::Node& node) override
{
const osg::StateSet* stateset = node.getStateSet();
if (stateset)
{
const osg::StateSet::TextureAttributeList& texAttributes = stateset->getTextureAttributeList();
for (size_t i = 0; i < texAttributes.size(); i++)
{
const osg::StateAttribute* attr = stateset->getTextureAttribute(i, osg::StateAttribute::TEXTURE);
if (!attr)
continue;
const osg::Texture* texture = attr->asTexture();
if (!texture)
continue;
const osg::Image* image = texture->getImage(0);
std::string fileName;
if (image)
fileName = image->getFileName();
mTextures.emplace_back(texture->getName(), fileName);
}
}
traverse(node);
}
};
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
void addToLevList(ESM::LevelledListBase* list, const ESM::RefId& itemId, int level)
{
for (auto& levelItem : list->mList)
{
if (levelItem.mLevel == level && itemId == levelItem.mId)
return;
}
ESM::LevelledListBase::LevelItem item;
2022-08-23 16:59:03 +02:00
item.mId = itemId;
item.mLevel = level;
list->mList.push_back(item);
}
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
void removeFromLevList(ESM::LevelledListBase* list, const ESM::RefId& itemId, int level)
{
// level of -1 removes all items with that itemId
for (std::vector<ESM::LevelledListBase::LevelItem>::iterator it = list->mList.begin(); it != list->mList.end();)
{
if (level != -1 && it->mLevel != level)
{
++it;
continue;
}
if (itemId == it->mId)
it = list->mList.erase(it);
else
++it;
}
}
}
2010-07-05 13:15:49 +02:00
namespace MWScript
{
namespace Misc
{
class OpMenuMode : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
runtime.push(MWBase::Environment::get().getWindowManager()->isGuiMode());
}
};
class OpRandom : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Interpreter::Type_Integer limit = runtime[0].mInteger;
runtime.pop();
if (limit < 0)
throw std::runtime_error("random: argument out of range (Don't be so negative!)");
auto& prng = MWBase::Environment::get().getWorld()->getPrng();
runtime.push(static_cast<Interpreter::Type_Float>(::Misc::Rng::rollDice(limit, prng))); // [o, limit)
}
};
template <class R>
class OpStartScript : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
2020-05-26 19:01:33 +02:00
MWWorld::Ptr target = R()(runtime, false);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId name = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
if (!MWBase::Environment::get().getESMStore()->get<ESM::Script>().search(name))
{
runtime.getContext().report(
"Failed to start global script '" + name.getRefIdString() + "': script record not found");
return;
}
MWBase::Environment::get().getScriptManager()->getGlobalScripts().addScript(name, target);
}
};
class OpScriptRunning : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& name = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
runtime.push(MWBase::Environment::get().getScriptManager()->getGlobalScripts().isRunning(name));
}
};
class OpStopScript : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& name = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
if (!MWBase::Environment::get().getESMStore()->get<ESM::Script>().search(name))
{
runtime.getContext().report(
"Failed to stop global script '" + name.getRefIdString() + "': script record not found");
return;
}
MWBase::Environment::get().getScriptManager()->getGlobalScripts().removeScript(name);
}
};
class OpGetSecondsPassed : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
runtime.push(MWBase::Environment::get().getFrameDuration());
}
};
template <class R>
class OpEnable : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
MWBase::Environment::get().getWorld()->enable(ptr);
}
};
template <class R>
class OpDisable : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
MWBase::Environment::get().getWorld()->disable(ptr);
}
};
template <class R>
class OpGetDisabled : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
runtime.push(!ptr.getRefData().isEnabled());
}
};
2012-09-25 02:35:50 +02:00
class OpPlayBink : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2012-09-25 02:35:50 +02:00
{
2022-08-28 17:20:49 +02:00
std::string_view name = runtime.getStringLiteral(runtime[0].mInteger);
2012-09-25 02:35:50 +02:00
runtime.pop();
bool allowSkipping = runtime[0].mInteger != 0;
runtime.pop();
2022-05-22 09:29:03 +02:00
MWBase::Environment::get().getWindowManager()->playVideo(name, allowSkipping);
2012-09-25 02:35:50 +02:00
}
};
2012-09-19 03:11:23 +02:00
class OpGetPcSleep : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2012-09-19 03:11:23 +02:00
{
runtime.push(MWBase::Environment::get().getWindowManager()->getPlayerSleeping());
}
};
2014-01-05 19:08:12 +01:00
class OpGetPcJumping : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2014-01-05 19:08:12 +01:00
{
MWBase::World* world = MWBase::Environment::get().getWorld();
runtime.push(world->getPlayer().getJumping());
2014-01-05 19:08:12 +01:00
}
};
2012-09-29 09:41:34 +02:00
class OpWakeUpPc : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2012-09-29 09:41:34 +02:00
{
MWBase::Environment::get().getWindowManager()->wakeUpPlayer();
}
};
2010-07-05 13:15:49 +02:00
class OpXBox : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override { runtime.push(0); }
2010-07-05 13:15:49 +02:00
};
2017-10-24 00:40:17 +02:00
template <class R>
2010-07-06 10:25:42 +02:00
class OpOnActivate : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2010-07-06 10:25:42 +02:00
{
2017-10-24 00:40:17 +02:00
MWWorld::Ptr ptr = R()(runtime);
runtime.push(ptr.getRefData().onActivate());
}
2010-07-06 10:25:42 +02:00
};
template <class R>
2010-08-05 15:52:07 +02:00
class OpActivate : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2010-08-05 15:52:07 +02:00
{
InterpreterContext& context = static_cast<InterpreterContext&>(runtime.getContext());
MWWorld::Ptr ptr = R()(runtime);
2021-05-01 14:07:29 +02:00
if (ptr.getRefData().activateByScript() || ptr.getContainerStore())
context.executeActivation(ptr, MWMechanics::getPlayer());
2010-08-05 15:52:07 +02:00
}
};
template <class R>
2010-08-30 12:30:34 +02:00
class OpLock : public Interpreter::Opcode1
{
public:
void execute(Interpreter::Runtime& runtime, unsigned int arg0) override
2010-08-30 12:30:34 +02:00
{
MWWorld::Ptr ptr = R()(runtime);
2010-08-30 12:30:34 +02:00
Interpreter::Type_Integer lockLevel = ptr.getCellRef().getLockLevel();
if (lockLevel == 0)
{ // no lock level was ever set, set to 100 as default
lockLevel = 100;
}
2010-08-30 12:30:34 +02:00
if (arg0 == 1)
{
lockLevel = runtime[0].mInteger;
runtime.pop();
}
2019-09-17 20:30:37 +02:00
ptr.getCellRef().lock(lockLevel);
// Instantly reset door to closed state
// This is done when using Lock in scripts, but not when using Lock spells.
if (ptr.getType() == ESM::Door::sRecordId && !ptr.getCellRef().getTeleport())
{
2019-08-25 15:20:14 +02:00
MWBase::Environment::get().getWorld()->activateDoor(ptr, MWWorld::DoorState::Idle);
2010-08-30 12:30:34 +02:00
}
2022-09-22 21:26:05 +03:00
}
2010-08-30 12:30:34 +02:00
};
template <class R>
2010-08-30 12:30:34 +02:00
class OpUnlock : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2010-08-30 12:30:34 +02:00
{
MWWorld::Ptr ptr = R()(runtime);
if (ptr.getCellRef().isLocked())
ptr.getCellRef().unlock();
2010-08-30 12:30:34 +02:00
}
};
class OpToggleCollisionDebug : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
2015-05-02 22:45:27 +02:00
bool enabled = MWBase::Environment::get().getWorld()->toggleRenderMode(MWRender::Render_CollisionDebug);
2015-03-03 23:46:53 +01:00
runtime.getContext().report(
2012-02-18 16:06:03 +01:00
enabled ? "Collision Mesh Rendering -> On" : "Collision Mesh Rendering -> Off");
}
};
class OpToggleCollisionBoxes : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
bool enabled = MWBase::Environment::get().getWorld()->toggleRenderMode(MWRender::Render_CollisionDebug);
2015-03-03 23:46:53 +01:00
runtime.getContext().report(
enabled ? "Collision Mesh Rendering -> On" : "Collision Mesh Rendering -> Off");
}
};
2012-02-18 16:06:03 +01:00
class OpToggleWireframe : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2012-02-18 16:06:03 +01:00
{
2015-05-02 22:45:27 +02:00
bool enabled = MWBase::Environment::get().getWorld()->toggleRenderMode(MWRender::Render_Wireframe);
2012-02-18 16:06:03 +01:00
runtime.getContext().report(enabled ? "Wireframe Rendering -> On" : "Wireframe Rendering -> Off");
}
};
2018-06-13 01:48:31 +02:00
class OpToggleBorders : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2018-06-13 01:48:31 +02:00
{
bool enabled = MWBase::Environment::get().getWorld()->toggleBorders();
runtime.getContext().report(enabled ? "Border Rendering -> On" : "Border Rendering -> Off");
}
};
2012-03-08 01:09:06 +04:00
class OpTogglePathgrid : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
2015-05-02 22:45:27 +02:00
bool enabled = MWBase::Environment::get().getWorld()->toggleRenderMode(MWRender::Render_Pathgrid);
runtime.getContext().report(enabled ? "Path Grid rendering -> On" : "Path Grid Rendering -> Off");
}
};
class OpFadeIn : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Interpreter::Type_Float time = runtime[0].mFloat;
runtime.pop();
MWBase::Environment::get().getWindowManager()->fadeScreenIn(time, false);
}
};
class OpFadeOut : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Interpreter::Type_Float time = runtime[0].mFloat;
runtime.pop();
MWBase::Environment::get().getWindowManager()->fadeScreenOut(time, false);
}
};
class OpFadeTo : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Interpreter::Type_Float alpha = runtime[0].mFloat;
runtime.pop();
Interpreter::Type_Float time = runtime[0].mFloat;
runtime.pop();
MWBase::Environment::get().getWindowManager()->fadeScreenTo(static_cast<int>(alpha), time, false);
}
};
2010-08-30 12:30:34 +02:00
class OpToggleWater : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
runtime.getContext().report(
MWBase::Environment::get().getWorld()->toggleWater() ? "Water -> On" : "Water -> Off");
}
};
2014-09-30 15:53:27 +02:00
class OpToggleWorld : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2014-09-30 15:53:27 +02:00
{
runtime.getContext().report(
MWBase::Environment::get().getWorld()->toggleWorld() ? "World -> On" : "World -> Off");
}
};
class OpDontSaveObject : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
// We are ignoring the DontSaveObject statement for now. Probably not worth
// bothering with. The incompatibility we are creating should be marginal at most.
}
};
class OpPcForce1stPerson : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
if (!MWBase::Environment::get().getWorld()->isFirstPerson())
MWBase::Environment::get().getWorld()->togglePOV(true);
}
};
class OpPcForce3rdPerson : public Interpreter::Opcode0
{
void execute(Interpreter::Runtime& runtime) override
{
if (MWBase::Environment::get().getWorld()->isFirstPerson())
MWBase::Environment::get().getWorld()->togglePOV(true);
}
};
class OpPcGet3rdPerson : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
runtime.push(!MWBase::Environment::get().getWorld()->isFirstPerson());
}
};
2012-08-18 18:05:10 +04:00
class OpToggleVanityMode : public Interpreter::Opcode0
{
2012-08-19 10:37:51 +04:00
static bool sActivate;
2012-08-18 18:05:10 +04:00
public:
void execute(Interpreter::Runtime& runtime) override
2012-08-18 18:05:10 +04:00
{
MWBase::World* world = MWBase::Environment::get().getWorld();
2013-04-27 01:24:36 -07:00
if (world->toggleVanityMode(sActivate))
{
2015-03-03 23:46:53 +01:00
runtime.getContext().report(sActivate ? "Vanity Mode -> On" : "Vanity Mode -> Off");
2012-08-19 10:37:51 +04:00
sActivate = !sActivate;
2012-08-18 18:05:10 +04:00
}
else
{
2015-03-03 23:46:53 +01:00
runtime.getContext().report("Vanity Mode -> No");
2012-08-18 18:05:10 +04:00
}
}
};
2012-08-19 10:37:51 +04:00
bool OpToggleVanityMode::sActivate = true;
2012-08-18 18:05:10 +04:00
2012-11-23 21:31:10 +01:00
template <class R>
class OpGetLocked : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2012-11-23 21:31:10 +01:00
{
MWWorld::Ptr ptr = R()(runtime);
runtime.push(ptr.getCellRef().isLocked());
2012-11-23 21:31:10 +01:00
}
};
2012-11-24 02:15:55 +01:00
template <class R>
class OpGetEffect : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2012-11-24 02:15:55 +01:00
{
MWWorld::Ptr ptr = R()(runtime);
std::string_view effect = runtime.getStringLiteral(runtime[0].mInteger);
2012-11-24 02:15:55 +01:00
runtime.pop();
if (!ptr.getClass().isActor())
{
runtime.push(0);
return;
}
2023-03-18 09:30:48 +00:00
long key;
if (const auto k = ::Misc::StringUtils::toNumeric<long>(effect.data());
k.has_value() && *k >= 0 && *k <= 32767)
key = *k;
else
2023-05-23 19:06:08 +02:00
key = ESM::MagicEffect::effectGmstIdToIndex(effect);
const MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
const MWMechanics::MagicEffects& effects = stats.getMagicEffects();
2020-08-07 09:58:36 +03:00
for (const auto& activeEffect : effects)
2022-09-22 21:26:05 +03:00
{
2020-08-07 09:58:36 +03:00
if (activeEffect.first.mId == key && activeEffect.second.getModifier() > 0)
{
runtime.push(1);
return;
}
2022-09-22 21:26:05 +03:00
}
runtime.push(0);
}
2012-11-24 02:15:55 +01:00
};
2013-01-07 18:16:50 +00:00
template <class R>
class OpAddSoulGem : public Interpreter::Opcode0
{
2013-01-07 18:16:50 +00:00
public:
void execute(Interpreter::Runtime& runtime) override
{
2013-01-07 18:16:50 +00:00
MWWorld::Ptr ptr = R()(runtime);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId creature = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
2013-01-07 18:16:50 +00:00
runtime.pop();
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId gem = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
2013-01-07 18:16:50 +00:00
runtime.pop();
if (!ptr.getClass().hasInventoryStore(ptr))
return;
2023-04-20 21:07:53 +02:00
const MWWorld::ESMStore& store = *MWBase::Environment::get().getESMStore();
store.get<ESM::Creature>().find(
creature); // This line throws an exception if it can't find the creature
2013-01-07 18:16:50 +00:00
MWWorld::Ptr item = *ptr.getClass().getContainerStore(ptr).add(gem, 1);
// Set the soul on just one of the gems, not the whole stack
item.getContainerStore()->unstack(item);
item.getCellRef().setSoul(creature);
// Restack the gem with other gems with the same soul
item.getContainerStore()->restack(item);
}
2013-01-07 18:16:50 +00:00
};
2012-11-24 02:15:55 +01:00
template <class R>
class OpRemoveSoulGem : public Interpreter::Opcode1
{
public:
void execute(Interpreter::Runtime& runtime, unsigned int arg0) override
2022-09-22 21:26:05 +03:00
{
MWWorld::Ptr ptr = R()(runtime);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId soul = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
// throw away additional arguments
for (unsigned int i = 0; i < arg0; ++i)
runtime.pop();
if (!ptr.getClass().hasInventoryStore(ptr))
return;
MWWorld::InventoryStore& store = ptr.getClass().getInventoryStore(ptr);
for (MWWorld::ContainerStoreIterator it = store.begin(); it != store.end(); ++it)
2022-09-22 21:26:05 +03:00
{
if (it->getCellRef().getSoul() == soul)
{
store.remove(*it, 1);
return;
}
}
2022-09-22 21:26:05 +03:00
}
};
2013-01-09 21:16:45 +00:00
template <class R>
class OpDrop : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2013-01-09 21:16:45 +00:00
{
MWWorld::Ptr ptr = R()(runtime);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId item = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
2013-01-09 21:16:45 +00:00
runtime.pop();
Interpreter::Type_Integer amount = runtime[0].mInteger;
runtime.pop();
if (amount < 0)
throw std::runtime_error("amount must be non-negative");
// no-op
if (amount == 0)
return;
if (!ptr.getClass().isActor())
return;
if (ptr.getClass().hasInventoryStore(ptr))
2022-09-22 21:26:05 +03:00
{
// Prefer dropping unequipped items first; re-stack if possible by unequipping items before dropping
2022-09-22 21:26:05 +03:00
// them.
MWWorld::InventoryStore& store = ptr.getClass().getInventoryStore(ptr);
int numNotEquipped = store.count(item);
for (int slot = 0; slot < MWWorld::InventoryStore::Slots; ++slot)
{
MWWorld::ConstContainerStoreIterator it = store.getSlot(slot);
if (it != store.end() && it->getCellRef().getRefId() == item)
{
numNotEquipped -= it->getRefData().getCount();
}
2022-09-22 21:26:05 +03:00
}
2013-01-09 21:16:45 +00:00
for (int slot = 0; slot < MWWorld::InventoryStore::Slots && amount > numNotEquipped; ++slot)
2022-09-22 21:26:05 +03:00
{
MWWorld::ContainerStoreIterator it = store.getSlot(slot);
if (it != store.end() && it->getCellRef().getRefId() == item)
{
int numToRemove = std::min(amount - numNotEquipped, it->getRefData().getCount());
store.unequipItemQuantity(*it, numToRemove);
numNotEquipped += numToRemove;
}
2022-09-22 21:26:05 +03:00
}
2013-01-09 21:16:45 +00:00
for (MWWorld::ContainerStoreIterator iter(store.begin()); iter != store.end(); ++iter)
2022-09-22 21:26:05 +03:00
{
if (iter->getCellRef().getRefId() == item && !store.isEquipped(*iter))
2013-01-09 21:16:45 +00:00
{
int removed = store.remove(*iter, amount);
MWWorld::Ptr dropped
= MWBase::Environment::get().getWorld()->dropObjectOnGround(ptr, *iter, removed);
dropped.getCellRef().setOwner(ESM::RefId());
amount -= removed;
if (amount <= 0)
break;
}
}
2022-09-22 21:26:05 +03:00
}
2023-04-20 21:07:53 +02:00
MWWorld::ManualRef ref(*MWBase::Environment::get().getESMStore(), item, 1);
MWWorld::Ptr itemPtr(ref.getPtr());
if (amount > 0)
2022-09-22 21:26:05 +03:00
{
if (itemPtr.getClass().getScript(itemPtr).empty())
{
MWBase::Environment::get().getWorld()->dropObjectOnGround(ptr, itemPtr, amount);
}
else
{
// Dropping one item per time to prevent making stacks of scripted items
for (int i = 0; i < amount; i++)
MWBase::Environment::get().getWorld()->dropObjectOnGround(ptr, itemPtr, 1);
2013-01-09 21:16:45 +00:00
}
}
2022-09-22 21:26:05 +03:00
MWBase::Environment::get().getSoundManager()->playSound3D(
ptr, itemPtr.getClass().getDownSoundId(itemPtr), 1.f, 1.f);
2022-09-22 21:26:05 +03:00
}
2013-01-09 21:16:45 +00:00
};
template <class R>
class OpDropSoulGem : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2013-01-09 21:16:45 +00:00
{
MWWorld::Ptr ptr = R()(runtime);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId soul = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
2013-01-09 21:16:45 +00:00
runtime.pop();
if (!ptr.getClass().hasInventoryStore(ptr))
return;
2013-01-09 21:16:45 +00:00
MWWorld::InventoryStore& store = ptr.getClass().getInventoryStore(ptr);
2013-01-09 21:16:45 +00:00
for (MWWorld::ContainerStoreIterator iter(store.begin()); iter != store.end(); ++iter)
2022-09-22 21:26:05 +03:00
{
if (iter->getCellRef().getSoul() == soul)
2013-01-09 21:16:45 +00:00
{
MWBase::Environment::get().getWorld()->dropObjectOnGround(ptr, *iter, 1);
store.remove(*iter, 1);
2013-01-09 21:16:45 +00:00
break;
}
}
2022-09-22 21:26:05 +03:00
}
2013-01-09 21:16:45 +00:00
};
2012-11-24 02:48:53 +01:00
template <class R>
class OpGetAttacked : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2012-11-24 02:48:53 +01:00
{
MWWorld::Ptr ptr = R()(runtime);
runtime.push(ptr.getClass().getCreatureStats(ptr).getAttacked());
2012-11-24 02:48:53 +01:00
}
};
2012-11-24 03:04:26 +01:00
template <class R>
class OpGetWeaponDrawn : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2022-09-22 21:26:05 +03:00
{
2012-11-24 03:04:26 +01:00
MWWorld::Ptr ptr = R()(runtime);
auto& cls = ptr.getClass();
if (!cls.hasInventoryStore(ptr) && !cls.isBipedal(ptr))
2012-11-24 03:04:26 +01:00
{
runtime.push(0);
return;
}
2012-11-24 03:04:26 +01:00
if (cls.getCreatureStats(ptr).getDrawState() != MWMechanics::DrawState::Weapon)
2022-09-22 21:26:05 +03:00
{
runtime.push(0);
return;
2014-01-03 22:55:17 +01:00
}
2022-09-22 21:26:05 +03:00
MWRender::Animation* anim = MWBase::Environment::get().getWorld()->getAnimation(ptr);
runtime.push(anim && anim->getWeaponsShown());
2022-09-22 21:26:05 +03:00
}
2014-01-03 22:55:17 +01:00
};
template <class R>
class OpGetSpellReadied : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2014-01-03 22:55:17 +01:00
{
MWWorld::Ptr ptr = R()(runtime);
runtime.push(ptr.getClass().getCreatureStats(ptr).getDrawState() == MWMechanics::DrawState::Spell);
2012-11-24 03:04:26 +01:00
}
};
2012-11-25 01:26:29 +01:00
template <class R>
class OpGetSpellEffects : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2022-09-22 21:26:05 +03:00
{
2012-11-24 03:04:26 +01:00
MWWorld::Ptr ptr = R()(runtime);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId id = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
2012-11-25 01:26:29 +01:00
runtime.pop();
if (!ptr.getClass().isActor())
2012-11-25 01:26:29 +01:00
{
runtime.push(0);
return;
2012-11-25 01:26:29 +01:00
}
2022-09-22 21:26:05 +03:00
const MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
runtime.push(stats.getActiveSpells().isSpellActive(id));
2022-09-22 21:26:05 +03:00
}
2012-11-25 01:26:29 +01:00
};
2012-11-25 01:54:37 +01:00
class OpGetCurrentTime : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2012-11-25 01:54:37 +01:00
{
runtime.push(MWBase::Environment::get().getWorld()->getTimeStamp().getHour());
}
};
template <class R>
class OpSetDelete : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
2012-11-28 01:30:18 +01:00
int parameter = runtime[0].mInteger;
runtime.pop();
if (parameter == 1)
MWBase::Environment::get().getWorld()->deleteObject(ptr);
else if (parameter == 0)
MWBase::Environment::get().getWorld()->undeleteObject(ptr);
else
throw std::runtime_error("SetDelete: unexpected parameter");
}
};
class OpGetSquareRoot : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
float param = runtime[0].mFloat;
runtime.pop();
if (param < 0)
throw std::runtime_error("square root of negative number (we aren't that imaginary)");
runtime.push(std::sqrt(param));
}
};
template <class R>
class OpFall : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override {}
};
template <class R>
class OpGetStandingPc : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
runtime.push(MWBase::Environment::get().getWorld()->getPlayerStandingOn(ptr));
}
};
template <class R>
class OpGetStandingActor : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
runtime.push(MWBase::Environment::get().getWorld()->getActorStandingOn(ptr));
}
};
template <class R>
class OpGetCollidingPc : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
runtime.push(MWBase::Environment::get().getWorld()->getPlayerCollidingWith(ptr));
}
};
template <class R>
class OpGetCollidingActor : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
runtime.push(MWBase::Environment::get().getWorld()->getActorCollidingWith(ptr));
}
};
template <class R>
class OpHurtStandingActor : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
float healthDiffPerSecond = runtime[0].mFloat;
runtime.pop();
MWBase::Environment::get().getWorld()->hurtStandingActors(ptr, healthDiffPerSecond);
}
};
template <class R>
class OpHurtCollidingActor : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
float healthDiffPerSecond = runtime[0].mFloat;
runtime.pop();
MWBase::Environment::get().getWorld()->hurtCollidingActors(ptr, healthDiffPerSecond);
}
};
2013-05-01 11:42:24 +02:00
class OpGetWindSpeed : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2013-05-01 11:42:24 +02:00
{
runtime.push(MWBase::Environment::get().getWorld()->getWindSpeed());
}
};
2013-07-26 08:08:52 -07:00
template <class R>
class OpHitOnMe : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2013-07-26 08:08:52 -07:00
{
MWWorld::Ptr ptr = R()(runtime);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId objectID = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
2013-07-26 08:08:52 -07:00
runtime.pop();
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
bool hit = objectID == stats.getLastHitObject();
runtime.push(hit);
if (hit)
stats.clearLastHitObject();
2013-07-26 08:08:52 -07:00
}
};
template <class R>
class OpHitAttemptOnMe : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId objectID = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
bool hit = objectID == stats.getLastHitAttemptObject();
runtime.push(hit);
if (hit)
stats.clearLastHitAttemptObject();
}
};
template <bool Enable>
class OpEnableTeleporting : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWBase::World* world = MWBase::Environment::get().getWorld();
world->enableTeleporting(Enable);
}
};
template <bool Enable>
class OpEnableLevitation : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWBase::World* world = MWBase::Environment::get().getWorld();
world->enableLevitation(Enable);
}
};
2016-02-27 13:40:53 +01:00
template <class R>
class OpShow : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2016-02-27 13:40:53 +01:00
{
MWWorld::Ptr ptr = R()(runtime, false);
std::string_view var = runtime.getStringLiteral(runtime[0].mInteger);
2016-02-27 13:40:53 +01:00
runtime.pop();
std::stringstream output;
if (!ptr.isEmpty())
{
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId script = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
if (!script.empty())
2016-02-27 13:40:53 +01:00
{
const Compiler::Locals& locals
= MWBase::Environment::get().getScriptManager()->getLocals(script);
char type = locals.getType(var);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
std::string refId = ptr.getCellRef().getRefId().getRefIdString();
if (refId.find(' ') != std::string::npos)
refId = '"' + refId + '"';
2016-02-27 13:40:53 +01:00
switch (type)
{
case 'l':
case 's':
output << refId << "." << var << " = "
<< ptr.getRefData().getLocals().getIntVar(script, var);
2016-02-27 13:40:53 +01:00
break;
case 'f':
output << refId << "." << var << " = "
<< ptr.getRefData().getLocals().getFloatVar(script, var);
2016-02-27 13:40:53 +01:00
break;
}
}
}
if (output.rdbuf()->in_avail() == 0)
2016-02-27 13:40:53 +01:00
{
MWBase::World* world = MWBase::Environment::get().getWorld();
char type = world->getGlobalVariableType(var);
switch (type)
{
case 's':
output << var << " = " << runtime.getContext().getGlobalShort(var);
2016-02-27 13:40:53 +01:00
break;
case 'l':
output << var << " = " << runtime.getContext().getGlobalLong(var);
2016-02-27 13:40:53 +01:00
break;
case 'f':
output << var << " = " << runtime.getContext().getGlobalFloat(var);
2016-02-27 13:40:53 +01:00
break;
default:
output << "unknown variable";
2016-02-27 13:40:53 +01:00
}
}
runtime.getContext().report(output.str());
}
};
template <class R>
class OpShowVars : public Interpreter::Opcode0
{
void printLocalVars(Interpreter::Runtime& runtime, const MWWorld::Ptr& ptr)
{
std::stringstream str;
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& script = ptr.getClass().getScript(ptr);
if (script.empty())
str << ptr.getCellRef().getRefId() << " does not have a script.";
else
{
str << "Local variables for " << ptr.getCellRef().getRefId();
const Locals& locals = ptr.getRefData().getLocals();
const Compiler::Locals& complocals
= MWBase::Environment::get().getScriptManager()->getLocals(script);
const std::vector<std::string>* names = &complocals.get('s');
for (size_t i = 0; i < names->size(); ++i)
{
if (i >= locals.mShorts.size())
break;
str << std::endl << " " << (*names)[i] << " = " << locals.mShorts[i] << " (short)";
}
names = &complocals.get('l');
for (size_t i = 0; i < names->size(); ++i)
{
if (i >= locals.mLongs.size())
break;
str << std::endl << " " << (*names)[i] << " = " << locals.mLongs[i] << " (long)";
}
names = &complocals.get('f');
for (size_t i = 0; i < names->size(); ++i)
{
if (i >= locals.mFloats.size())
break;
str << std::endl << " " << (*names)[i] << " = " << locals.mFloats[i] << " (float)";
}
}
runtime.getContext().report(str.str());
}
void printGlobalVars(Interpreter::Runtime& runtime)
{
std::stringstream str;
str << "Global variables:";
MWBase::World* world = MWBase::Environment::get().getWorld();
2015-03-03 23:46:53 +01:00
std::vector<std::string> names = runtime.getContext().getGlobals();
for (size_t i = 0; i < names.size(); ++i)
{
char type = world->getGlobalVariableType(names[i]);
str << std::endl << " " << names[i] << " = ";
switch (type)
{
case 's':
2015-03-03 23:46:53 +01:00
str << runtime.getContext().getGlobalShort(names[i]) << " (short)";
break;
case 'l':
2015-03-03 23:46:53 +01:00
str << runtime.getContext().getGlobalLong(names[i]) << " (long)";
break;
case 'f':
2015-03-03 23:46:53 +01:00
str << runtime.getContext().getGlobalFloat(names[i]) << " (float)";
break;
default:
str << "<unknown type>";
}
}
2015-03-03 23:46:53 +01:00
runtime.getContext().report(str.str());
}
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime, false);
if (!ptr.isEmpty())
printLocalVars(runtime, ptr);
else
{
// No reference, no problem.
printGlobalVars(runtime);
}
}
};
2015-02-10 20:25:57 +01:00
class OpToggleScripts : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2015-02-10 20:25:57 +01:00
{
bool enabled = MWBase::Environment::get().getWorld()->toggleScripts();
2015-03-03 23:46:53 +01:00
runtime.getContext().report(enabled ? "Scripts -> On" : "Scripts -> Off");
2015-02-10 20:25:57 +01:00
}
};
class OpToggleGodMode : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
bool enabled = MWBase::Environment::get().getWorld()->toggleGodMode();
2015-03-03 23:46:53 +01:00
runtime.getContext().report(enabled ? "God Mode -> On" : "God Mode -> Off");
}
};
template <class R>
class OpCast : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId spellId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId targetId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
2023-04-20 21:07:53 +02:00
const ESM::Spell* spell = MWBase::Environment::get().getESMStore()->get<ESM::Spell>().search(spellId);
2018-09-04 12:37:43 +04:00
if (!spell)
{
runtime.getContext().report(
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
"spellcasting failed: cannot find spell \"" + spellId.getRefIdString() + "\"");
2018-09-04 12:37:43 +04:00
return;
}
if (ptr == MWMechanics::getPlayer())
{
MWBase::Environment::get().getWorld()->getPlayer().setSelectedSpell(spell->mId);
return;
}
if (ptr.getClass().isActor())
{
2021-08-07 10:06:56 +02:00
if (!MWBase::Environment::get().getMechanicsManager()->isCastingSpell(ptr))
{
MWMechanics::AiCast castPackage(targetId, spell->mId, true);
2021-08-07 10:06:56 +02:00
ptr.getClass().getCreatureStats(ptr).getAiSequence().stack(castPackage, ptr);
}
return;
}
MWWorld::Ptr target = MWBase::Environment::get().getWorld()->searchPtr(targetId, false, false);
if (target.isEmpty())
return;
MWMechanics::CastSpell cast(ptr, target, false, true);
2022-09-04 15:42:40 +02:00
cast.playSpellCastingEffects(spell);
2015-06-01 21:41:13 +02:00
cast.mHitPosition = target.getRefData().getPosition().asVec3();
cast.mAlwaysSucceed = true;
cast.cast(spell);
}
};
template <class R>
class OpExplodeSpell : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWWorld::Ptr ptr = R()(runtime);
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
ESM::RefId spellId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
2023-04-20 21:07:53 +02:00
const ESM::Spell* spell = MWBase::Environment::get().getESMStore()->get<ESM::Spell>().search(spellId);
if (!spell)
{
runtime.getContext().report(
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
"spellcasting failed: cannot find spell \"" + spellId.getRefIdString() + "\"");
return;
}
if (ptr == MWMechanics::getPlayer())
{
MWBase::Environment::get().getWorld()->getPlayer().setSelectedSpell(spell->mId);
return;
}
if (ptr.getClass().isActor())
{
2021-08-07 10:06:56 +02:00
if (!MWBase::Environment::get().getMechanicsManager()->isCastingSpell(ptr))
{
MWMechanics::AiCast castPackage(ptr.getCellRef().getRefId(), spell->mId, true);
2021-08-07 10:06:56 +02:00
ptr.getClass().getCreatureStats(ptr).getAiSequence().stack(castPackage, ptr);
}
return;
}
MWMechanics::CastSpell cast(ptr, ptr, false, true);
2015-06-01 21:41:13 +02:00
cast.mHitPosition = ptr.getRefData().getPosition().asVec3();
cast.mAlwaysSucceed = true;
cast.cast(spell);
}
};
class OpGoToJail : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWBase::World* world = MWBase::Environment::get().getWorld();
2014-01-11 06:47:58 +01:00
world->goToJail();
}
};
class OpPayFine : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
2015-08-21 21:12:39 +12:00
MWWorld::Ptr player = MWMechanics::getPlayer();
player.getClass().getNpcStats(player).setBounty(0);
MWBase::World* world = MWBase::Environment::get().getWorld();
world->confiscateStolenItems(player);
world->getPlayer().recordCrimeId();
world->getPlayer().setDrawState(MWMechanics::DrawState::Nothing);
}
};
class OpPayFineThief : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
2015-08-21 21:12:39 +12:00
MWWorld::Ptr player = MWMechanics::getPlayer();
player.getClass().getNpcStats(player).setBounty(0);
MWBase::Environment::get().getWorld()->getPlayer().recordCrimeId();
}
};
class OpGetPcInJail : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
runtime.push(MWBase::Environment::get().getWorld()->isPlayerInJail());
}
};
class OpGetPcTraveling : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
runtime.push(MWBase::Environment::get().getWorld()->isPlayerTraveling());
}
};
template <class R>
class OpBetaComment : public Interpreter::Opcode1
{
public:
void execute(Interpreter::Runtime& runtime, unsigned int arg0) override
{
MWWorld::Ptr ptr = R()(runtime);
std::stringstream msg;
msg << "Report time: ";
std::time_t currentTime = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
2022-11-08 16:38:40 +03:00
tm timeinfo{};
#ifdef _WIN32
gmtime_s(&timeinfo, &currentTime);
#else
gmtime_r(&currentTime, &timeinfo);
#endif
msg << std::put_time(&timeinfo, "%Y.%m.%d %T UTC") << std::endl;
msg << "Content file: " << ptr.getCellRef().getRefNum().mContentFile;
if (!ptr.getCellRef().hasContentFile())
msg << " [None]" << std::endl;
else
{
std::vector<std::string> contentFiles = MWBase::Environment::get().getWorld()->getContentFiles();
2014-06-27 08:37:41 +02:00
msg << " [" << contentFiles.at(ptr.getCellRef().getRefNum().mContentFile) << "]" << std::endl;
}
msg << "RefNum: " << ptr.getCellRef().getRefNum().mIndex << std::endl;
if (ptr.getRefData().isDeletedByContentFile())
msg << "[Deleted by content file]" << std::endl;
if (!ptr.getRefData().getCount())
msg << "[Deleted]" << std::endl;
msg << "RefID: " << ptr.getCellRef().getRefId() << std::endl;
2020-02-02 20:49:39 +01:00
msg << "Memory address: " << ptr.getBase() << std::endl;
if (ptr.isInCell())
{
MWWorld::CellStore* cell = ptr.getCell();
msg << "Cell: " << MWBase::Environment::get().getWorld()->getCellName(cell) << std::endl;
if (cell->getCell()->isExterior())
msg << "Grid: " << cell->getCell()->getGridX() << " " << cell->getCell()->getGridY()
<< std::endl;
2015-06-03 21:37:21 +02:00
osg::Vec3f pos(ptr.getRefData().getPosition().asVec3());
msg << "Coordinates: " << pos.x() << " " << pos.y() << " " << pos.z() << std::endl;
2020-12-29 21:45:59 +01:00
auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS();
std::string model
= ::Misc::ResourceHelpers::correctActorModelPath(ptr.getClass().getModel(ptr), vfs);
msg << "Model: " << model << std::endl;
if (!model.empty())
{
const std::string archive = vfs->getArchive(model);
if (!archive.empty())
msg << "(" << archive << ")" << std::endl;
TextureFetchVisitor visitor;
SceneUtil::PositionAttitudeTransform* baseNode = ptr.getRefData().getBaseNode();
if (baseNode)
baseNode->accept(visitor);
// The instance might not have a physical model due to paging or scripting.
// If this is the case, fall back to the template
if (visitor.mTextures.empty())
{
Resource::SceneManager* sceneManager
= MWBase::Environment::get().getResourceSystem()->getSceneManager();
const_cast<osg::Node*>(sceneManager->getTemplate(model).get())->accept(visitor);
msg << "Bound textures: [None]" << std::endl;
if (!visitor.mTextures.empty())
msg << "Model textures: ";
}
else
{
msg << "Bound textures: ";
}
if (!visitor.mTextures.empty())
{
msg << std::endl;
std::string lastTextureSrc;
for (auto& [textureName, fileName] : visitor.mTextures)
{
std::string textureSrc;
if (!fileName.empty())
textureSrc = vfs->getArchive(fileName);
if (lastTextureSrc.empty() || textureSrc != lastTextureSrc)
{
lastTextureSrc = textureSrc;
if (lastTextureSrc.empty())
lastTextureSrc = "[No Source]";
msg << " " << lastTextureSrc << std::endl;
}
msg << " ";
msg << (textureName.empty() ? "[Anonymous]: " : textureName) << ": ";
msg << (fileName.empty() ? "[No File]" : fileName) << std::endl;
}
}
else
{
msg << "[None]" << std::endl;
}
2020-12-29 21:45:59 +01:00
}
if (!ptr.getClass().getScript(ptr).empty())
msg << "Script: " << ptr.getClass().getScript(ptr) << std::endl;
}
while (arg0 > 0)
{
std::string_view notes = runtime.getStringLiteral(runtime[0].mInteger);
runtime.pop();
if (!notes.empty())
msg << "Notes: " << notes << std::endl;
--arg0;
}
Log(Debug::Warning) << "\n" << msg.str();
runtime.getContext().report(msg.str());
}
};
class OpAddToLevCreature : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& levId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& creatureId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
int level = runtime[0].mInteger;
runtime.pop();
2022-05-22 09:29:03 +02:00
ESM::CreatureLevList listCopy
2023-04-20 21:07:53 +02:00
= *MWBase::Environment::get().getESMStore()->get<ESM::CreatureLevList>().find(levId);
addToLevList(&listCopy, creatureId, level);
2023-04-20 21:07:53 +02:00
MWBase::Environment::get().getESMStore()->overrideRecord(listCopy);
}
};
class OpRemoveFromLevCreature : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& levId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& creatureId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
int level = runtime[0].mInteger;
runtime.pop();
2022-05-22 09:29:03 +02:00
ESM::CreatureLevList listCopy
2023-04-20 21:07:53 +02:00
= *MWBase::Environment::get().getESMStore()->get<ESM::CreatureLevList>().find(levId);
removeFromLevList(&listCopy, creatureId, level);
2023-04-20 21:07:53 +02:00
MWBase::Environment::get().getESMStore()->overrideRecord(listCopy);
}
};
class OpAddToLevItem : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& levId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& itemId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
int level = runtime[0].mInteger;
runtime.pop();
2022-05-22 09:29:03 +02:00
ESM::ItemLevList listCopy
2023-04-20 21:07:53 +02:00
= *MWBase::Environment::get().getESMStore()->get<ESM::ItemLevList>().find(levId);
addToLevList(&listCopy, itemId, level);
2023-04-20 21:07:53 +02:00
MWBase::Environment::get().getESMStore()->overrideRecord(listCopy);
}
};
class OpRemoveFromLevItem : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& levId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
const ESM::RefId& itemId = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger));
runtime.pop();
int level = runtime[0].mInteger;
runtime.pop();
2022-05-22 09:29:03 +02:00
ESM::ItemLevList listCopy
2023-04-20 21:07:53 +02:00
= *MWBase::Environment::get().getESMStore()->get<ESM::ItemLevList>().find(levId);
removeFromLevList(&listCopy, itemId, level);
2023-04-20 21:07:53 +02:00
MWBase::Environment::get().getESMStore()->overrideRecord(listCopy);
}
};
template <class R>
class OpShowSceneGraph : public Interpreter::Opcode1
{
public:
void execute(Interpreter::Runtime& runtime, unsigned int arg0) override
{
MWWorld::Ptr ptr = R()(runtime, false);
int confirmed = 0;
if (arg0 == 1)
{
confirmed = runtime[0].mInteger;
runtime.pop();
}
if (ptr.isEmpty() && !confirmed)
runtime.getContext().report(
"Exporting the entire scene graph will result in a large file. Confirm this action using "
"'showscenegraph 1' or select an object instead.");
else
{
const auto filename = MWBase::Environment::get().getWorld()->exportSceneGraph(ptr);
runtime.getContext().report("Wrote '" + Files::pathToUnicodeString(filename) + "'");
}
}
};
class OpToggleNavMesh : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
bool enabled = MWBase::Environment::get().getWorld()->toggleRenderMode(MWRender::Render_NavMesh);
runtime.getContext().report(
enabled ? "Navigation Mesh Rendering -> On" : "Navigation Mesh Rendering -> Off");
}
};
class OpToggleActorsPaths : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
bool enabled = MWBase::Environment::get().getWorld()->toggleRenderMode(MWRender::Render_ActorsPaths);
runtime.getContext().report(enabled ? "Agents Paths Rendering -> On" : "Agents Paths Rendering -> Off");
}
};
class OpSetNavMeshNumberToRender : public Interpreter::Opcode0
{
public:
2021-07-07 18:48:25 +02:00
void execute(Interpreter::Runtime& runtime) override
2022-09-22 21:26:05 +03:00
{
const auto navMeshNumber = runtime[0].mInteger;
runtime.pop();
if (navMeshNumber < 0)
{
runtime.getContext().report("Invalid navmesh number: use not less than zero values");
return;
}
2022-09-22 21:26:05 +03:00
MWBase::Environment::get().getWorld()->setNavMeshNumberToRender(
static_cast<std::size_t>(navMeshNumber));
2022-09-22 21:26:05 +03:00
}
};
template <class R>
class OpRepairedOnMe : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
// Broken in vanilla and deliberately no-op.
runtime.push(0);
}
};
2019-11-27 23:45:01 +01:00
class OpToggleRecastMesh : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
2019-11-27 23:45:01 +01:00
{
bool enabled = MWBase::Environment::get().getWorld()->toggleRenderMode(MWRender::Render_RecastMesh);
runtime.getContext().report(enabled ? "Recast Mesh Rendering -> On" : "Recast Mesh Rendering -> Off");
}
};
2021-07-07 18:48:25 +02:00
class OpHelp : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
std::stringstream message;
message << MWBase::Environment::get().getWindowManager()->getVersionDescription() << "\n\n";
std::vector<std::string> commands;
MWBase::Environment::get().getScriptManager()->getExtensions().listKeywords(commands);
for (const auto& command : commands)
message << command << "\n";
runtime.getContext().report(message.str());
}
};
2021-04-12 03:15:17 +02:00
class OpReloadLua : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
MWBase::Environment::get().getLuaManager()->reloadAllScripts();
runtime.getContext().report("All Lua scripts are reloaded");
}
};
2022-11-08 22:36:03 +01:00
class OpTestModels : public Interpreter::Opcode0
{
template <class T>
void test(int& count) const
{
Resource::SceneManager* sceneManager
= MWBase::Environment::get().getResourceSystem()->getSceneManager();
2023-04-20 21:07:53 +02:00
const MWWorld::ESMStore& store = *MWBase::Environment::get().getESMStore();
2022-11-08 22:36:03 +01:00
for (const T& record : store.get<T>())
{
MWWorld::ManualRef ref(store, record.mId);
std::string model = ref.getPtr().getClass().getModel(ref.getPtr());
if (!model.empty())
{
sceneManager->getTemplate(model);
++count;
}
}
}
public:
void execute(Interpreter::Runtime& runtime) override
{
Resource::SceneManager* sceneManager
= MWBase::Environment::get().getResourceSystem()->getSceneManager();
double delay = sceneManager->getExpiryDelay();
sceneManager->setExpiryDelay(0.0);
2022-11-08 22:36:03 +01:00
int count = 0;
test<ESM::Activator>(count);
test<ESM::Apparatus>(count);
test<ESM::Armor>(count);
test<ESM::Potion>(count);
test<ESM::BodyPart>(count);
test<ESM::Book>(count);
test<ESM::Clothing>(count);
test<ESM::Container>(count);
test<ESM::Creature>(count);
test<ESM::Door>(count);
test<ESM::Ingredient>(count);
test<ESM::Light>(count);
test<ESM::Lockpick>(count);
test<ESM::Miscellaneous>(count);
test<ESM::Probe>(count);
test<ESM::Repair>(count);
test<ESM::Static>(count);
test<ESM::Weapon>(count);
sceneManager->setExpiryDelay(delay);
2022-11-08 22:36:03 +01:00
std::stringstream message;
message << "Attempted to load models for " << count << " objects. Check the log for details.";
2022-11-08 22:36:03 +01:00
runtime.getContext().report(message.str());
}
};
2010-07-05 13:15:49 +02:00
void installOpcodes(Interpreter::Interpreter& interpreter)
{
2022-01-27 19:18:57 +00:00
interpreter.installSegment5<OpMenuMode>(Compiler::Misc::opcodeMenuMode);
interpreter.installSegment5<OpRandom>(Compiler::Misc::opcodeRandom);
interpreter.installSegment5<OpScriptRunning>(Compiler::Misc::opcodeScriptRunning);
interpreter.installSegment5<OpStartScript<ImplicitRef>>(Compiler::Misc::opcodeStartScript);
interpreter.installSegment5<OpStartScript<ExplicitRef>>(Compiler::Misc::opcodeStartScriptExplicit);
interpreter.installSegment5<OpStopScript>(Compiler::Misc::opcodeStopScript);
interpreter.installSegment5<OpGetSecondsPassed>(Compiler::Misc::opcodeGetSecondsPassed);
interpreter.installSegment5<OpEnable<ImplicitRef>>(Compiler::Misc::opcodeEnable);
interpreter.installSegment5<OpEnable<ExplicitRef>>(Compiler::Misc::opcodeEnableExplicit);
interpreter.installSegment5<OpDisable<ImplicitRef>>(Compiler::Misc::opcodeDisable);
interpreter.installSegment5<OpDisable<ExplicitRef>>(Compiler::Misc::opcodeDisableExplicit);
interpreter.installSegment5<OpGetDisabled<ImplicitRef>>(Compiler::Misc::opcodeGetDisabled);
interpreter.installSegment5<OpGetDisabled<ExplicitRef>>(Compiler::Misc::opcodeGetDisabledExplicit);
interpreter.installSegment5<OpXBox>(Compiler::Misc::opcodeXBox);
interpreter.installSegment5<OpOnActivate<ImplicitRef>>(Compiler::Misc::opcodeOnActivate);
interpreter.installSegment5<OpOnActivate<ExplicitRef>>(Compiler::Misc::opcodeOnActivateExplicit);
interpreter.installSegment5<OpActivate<ImplicitRef>>(Compiler::Misc::opcodeActivate);
interpreter.installSegment5<OpActivate<ExplicitRef>>(Compiler::Misc::opcodeActivateExplicit);
interpreter.installSegment3<OpLock<ImplicitRef>>(Compiler::Misc::opcodeLock);
interpreter.installSegment3<OpLock<ExplicitRef>>(Compiler::Misc::opcodeLockExplicit);
interpreter.installSegment5<OpUnlock<ImplicitRef>>(Compiler::Misc::opcodeUnlock);
interpreter.installSegment5<OpUnlock<ExplicitRef>>(Compiler::Misc::opcodeUnlockExplicit);
interpreter.installSegment5<OpToggleCollisionDebug>(Compiler::Misc::opcodeToggleCollisionDebug);
interpreter.installSegment5<OpToggleCollisionBoxes>(Compiler::Misc::opcodeToggleCollisionBoxes);
interpreter.installSegment5<OpToggleWireframe>(Compiler::Misc::opcodeToggleWireframe);
interpreter.installSegment5<OpFadeIn>(Compiler::Misc::opcodeFadeIn);
interpreter.installSegment5<OpFadeOut>(Compiler::Misc::opcodeFadeOut);
interpreter.installSegment5<OpFadeTo>(Compiler::Misc::opcodeFadeTo);
interpreter.installSegment5<OpTogglePathgrid>(Compiler::Misc::opcodeTogglePathgrid);
interpreter.installSegment5<OpToggleWater>(Compiler::Misc::opcodeToggleWater);
interpreter.installSegment5<OpToggleWorld>(Compiler::Misc::opcodeToggleWorld);
interpreter.installSegment5<OpDontSaveObject>(Compiler::Misc::opcodeDontSaveObject);
interpreter.installSegment5<OpPcForce1stPerson>(Compiler::Misc::opcodePcForce1stPerson);
interpreter.installSegment5<OpPcForce3rdPerson>(Compiler::Misc::opcodePcForce3rdPerson);
interpreter.installSegment5<OpPcGet3rdPerson>(Compiler::Misc::opcodePcGet3rdPerson);
interpreter.installSegment5<OpToggleVanityMode>(Compiler::Misc::opcodeToggleVanityMode);
interpreter.installSegment5<OpGetPcSleep>(Compiler::Misc::opcodeGetPcSleep);
interpreter.installSegment5<OpGetPcJumping>(Compiler::Misc::opcodeGetPcJumping);
interpreter.installSegment5<OpWakeUpPc>(Compiler::Misc::opcodeWakeUpPc);
interpreter.installSegment5<OpPlayBink>(Compiler::Misc::opcodePlayBink);
interpreter.installSegment5<OpPayFine>(Compiler::Misc::opcodePayFine);
interpreter.installSegment5<OpPayFineThief>(Compiler::Misc::opcodePayFineThief);
interpreter.installSegment5<OpGoToJail>(Compiler::Misc::opcodeGoToJail);
interpreter.installSegment5<OpGetLocked<ImplicitRef>>(Compiler::Misc::opcodeGetLocked);
interpreter.installSegment5<OpGetLocked<ExplicitRef>>(Compiler::Misc::opcodeGetLockedExplicit);
interpreter.installSegment5<OpGetEffect<ImplicitRef>>(Compiler::Misc::opcodeGetEffect);
interpreter.installSegment5<OpGetEffect<ExplicitRef>>(Compiler::Misc::opcodeGetEffectExplicit);
interpreter.installSegment5<OpAddSoulGem<ImplicitRef>>(Compiler::Misc::opcodeAddSoulGem);
interpreter.installSegment5<OpAddSoulGem<ExplicitRef>>(Compiler::Misc::opcodeAddSoulGemExplicit);
interpreter.installSegment3<OpRemoveSoulGem<ImplicitRef>>(Compiler::Misc::opcodeRemoveSoulGem);
interpreter.installSegment3<OpRemoveSoulGem<ExplicitRef>>(Compiler::Misc::opcodeRemoveSoulGemExplicit);
interpreter.installSegment5<OpDrop<ImplicitRef>>(Compiler::Misc::opcodeDrop);
interpreter.installSegment5<OpDrop<ExplicitRef>>(Compiler::Misc::opcodeDropExplicit);
interpreter.installSegment5<OpDropSoulGem<ImplicitRef>>(Compiler::Misc::opcodeDropSoulGem);
interpreter.installSegment5<OpDropSoulGem<ExplicitRef>>(Compiler::Misc::opcodeDropSoulGemExplicit);
interpreter.installSegment5<OpGetAttacked<ImplicitRef>>(Compiler::Misc::opcodeGetAttacked);
interpreter.installSegment5<OpGetAttacked<ExplicitRef>>(Compiler::Misc::opcodeGetAttackedExplicit);
interpreter.installSegment5<OpGetWeaponDrawn<ImplicitRef>>(Compiler::Misc::opcodeGetWeaponDrawn);
interpreter.installSegment5<OpGetWeaponDrawn<ExplicitRef>>(Compiler::Misc::opcodeGetWeaponDrawnExplicit);
interpreter.installSegment5<OpGetSpellReadied<ImplicitRef>>(Compiler::Misc::opcodeGetSpellReadied);
interpreter.installSegment5<OpGetSpellReadied<ExplicitRef>>(Compiler::Misc::opcodeGetSpellReadiedExplicit);
interpreter.installSegment5<OpGetSpellEffects<ImplicitRef>>(Compiler::Misc::opcodeGetSpellEffects);
interpreter.installSegment5<OpGetSpellEffects<ExplicitRef>>(Compiler::Misc::opcodeGetSpellEffectsExplicit);
interpreter.installSegment5<OpGetCurrentTime>(Compiler::Misc::opcodeGetCurrentTime);
interpreter.installSegment5<OpSetDelete<ImplicitRef>>(Compiler::Misc::opcodeSetDelete);
interpreter.installSegment5<OpSetDelete<ExplicitRef>>(Compiler::Misc::opcodeSetDeleteExplicit);
interpreter.installSegment5<OpGetSquareRoot>(Compiler::Misc::opcodeGetSquareRoot);
interpreter.installSegment5<OpFall<ImplicitRef>>(Compiler::Misc::opcodeFall);
interpreter.installSegment5<OpFall<ExplicitRef>>(Compiler::Misc::opcodeFallExplicit);
interpreter.installSegment5<OpGetStandingPc<ImplicitRef>>(Compiler::Misc::opcodeGetStandingPc);
interpreter.installSegment5<OpGetStandingPc<ExplicitRef>>(Compiler::Misc::opcodeGetStandingPcExplicit);
interpreter.installSegment5<OpGetStandingActor<ImplicitRef>>(Compiler::Misc::opcodeGetStandingActor);
interpreter.installSegment5<OpGetStandingActor<ExplicitRef>>(
Compiler::Misc::opcodeGetStandingActorExplicit);
interpreter.installSegment5<OpGetCollidingPc<ImplicitRef>>(Compiler::Misc::opcodeGetCollidingPc);
interpreter.installSegment5<OpGetCollidingPc<ExplicitRef>>(Compiler::Misc::opcodeGetCollidingPcExplicit);
interpreter.installSegment5<OpGetCollidingActor<ImplicitRef>>(Compiler::Misc::opcodeGetCollidingActor);
interpreter.installSegment5<OpGetCollidingActor<ExplicitRef>>(
Compiler::Misc::opcodeGetCollidingActorExplicit);
interpreter.installSegment5<OpHurtStandingActor<ImplicitRef>>(Compiler::Misc::opcodeHurtStandingActor);
interpreter.installSegment5<OpHurtStandingActor<ExplicitRef>>(
Compiler::Misc::opcodeHurtStandingActorExplicit);
interpreter.installSegment5<OpHurtCollidingActor<ImplicitRef>>(Compiler::Misc::opcodeHurtCollidingActor);
interpreter.installSegment5<OpHurtCollidingActor<ExplicitRef>>(
Compiler::Misc::opcodeHurtCollidingActorExplicit);
interpreter.installSegment5<OpGetWindSpeed>(Compiler::Misc::opcodeGetWindSpeed);
interpreter.installSegment5<OpHitOnMe<ImplicitRef>>(Compiler::Misc::opcodeHitOnMe);
interpreter.installSegment5<OpHitOnMe<ExplicitRef>>(Compiler::Misc::opcodeHitOnMeExplicit);
interpreter.installSegment5<OpHitAttemptOnMe<ImplicitRef>>(Compiler::Misc::opcodeHitAttemptOnMe);
interpreter.installSegment5<OpHitAttemptOnMe<ExplicitRef>>(Compiler::Misc::opcodeHitAttemptOnMeExplicit);
interpreter.installSegment5<OpEnableTeleporting<false>>(Compiler::Misc::opcodeDisableTeleporting);
interpreter.installSegment5<OpEnableTeleporting<true>>(Compiler::Misc::opcodeEnableTeleporting);
interpreter.installSegment5<OpShowVars<ImplicitRef>>(Compiler::Misc::opcodeShowVars);
interpreter.installSegment5<OpShowVars<ExplicitRef>>(Compiler::Misc::opcodeShowVarsExplicit);
interpreter.installSegment5<OpShow<ImplicitRef>>(Compiler::Misc::opcodeShow);
interpreter.installSegment5<OpShow<ExplicitRef>>(Compiler::Misc::opcodeShowExplicit);
interpreter.installSegment5<OpToggleGodMode>(Compiler::Misc::opcodeToggleGodMode);
interpreter.installSegment5<OpToggleScripts>(Compiler::Misc::opcodeToggleScripts);
interpreter.installSegment5<OpEnableLevitation<false>>(Compiler::Misc::opcodeDisableLevitation);
interpreter.installSegment5<OpEnableLevitation<true>>(Compiler::Misc::opcodeEnableLevitation);
interpreter.installSegment5<OpCast<ImplicitRef>>(Compiler::Misc::opcodeCast);
interpreter.installSegment5<OpCast<ExplicitRef>>(Compiler::Misc::opcodeCastExplicit);
interpreter.installSegment5<OpExplodeSpell<ImplicitRef>>(Compiler::Misc::opcodeExplodeSpell);
interpreter.installSegment5<OpExplodeSpell<ExplicitRef>>(Compiler::Misc::opcodeExplodeSpellExplicit);
interpreter.installSegment5<OpGetPcInJail>(Compiler::Misc::opcodeGetPcInJail);
interpreter.installSegment5<OpGetPcTraveling>(Compiler::Misc::opcodeGetPcTraveling);
interpreter.installSegment3<OpBetaComment<ImplicitRef>>(Compiler::Misc::opcodeBetaComment);
interpreter.installSegment3<OpBetaComment<ExplicitRef>>(Compiler::Misc::opcodeBetaCommentExplicit);
interpreter.installSegment5<OpAddToLevCreature>(Compiler::Misc::opcodeAddToLevCreature);
interpreter.installSegment5<OpRemoveFromLevCreature>(Compiler::Misc::opcodeRemoveFromLevCreature);
interpreter.installSegment5<OpAddToLevItem>(Compiler::Misc::opcodeAddToLevItem);
interpreter.installSegment5<OpRemoveFromLevItem>(Compiler::Misc::opcodeRemoveFromLevItem);
interpreter.installSegment3<OpShowSceneGraph<ImplicitRef>>(Compiler::Misc::opcodeShowSceneGraph);
interpreter.installSegment3<OpShowSceneGraph<ExplicitRef>>(Compiler::Misc::opcodeShowSceneGraphExplicit);
interpreter.installSegment5<OpToggleBorders>(Compiler::Misc::opcodeToggleBorders);
interpreter.installSegment5<OpToggleNavMesh>(Compiler::Misc::opcodeToggleNavMesh);
interpreter.installSegment5<OpToggleActorsPaths>(Compiler::Misc::opcodeToggleActorsPaths);
interpreter.installSegment5<OpSetNavMeshNumberToRender>(Compiler::Misc::opcodeSetNavMeshNumberToRender);
interpreter.installSegment5<OpRepairedOnMe<ImplicitRef>>(Compiler::Misc::opcodeRepairedOnMe);
interpreter.installSegment5<OpRepairedOnMe<ExplicitRef>>(Compiler::Misc::opcodeRepairedOnMeExplicit);
interpreter.installSegment5<OpToggleRecastMesh>(Compiler::Misc::opcodeToggleRecastMesh);
interpreter.installSegment5<OpHelp>(Compiler::Misc::opcodeHelp);
interpreter.installSegment5<OpReloadLua>(Compiler::Misc::opcodeReloadLua);
2022-11-08 22:36:03 +01:00
interpreter.installSegment5<OpTestModels>(Compiler::Misc::opcodeTestModels);
}
}
2010-07-05 13:15:49 +02:00
}