1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-05 06:40:09 +00:00
OpenMW/apps/openmw/mwlua/worldview.cpp

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

123 lines
3.4 KiB
C++
Raw Normal View History

2020-12-18 23:21:10 +01:00
#include "worldview.hpp"
#include <components/esm3/esmreader.hpp>
#include <components/esm3/esmwriter.hpp>
#include <components/esm3/loadcell.hpp>
2023-03-05 21:47:49 +01:00
#include <components/misc/resourcehelpers.hpp>
#include "../mwbase/windowmanager.hpp"
2021-01-29 01:54:54 +01:00
#include "../mwclass/container.hpp"
2020-12-18 23:21:10 +01:00
#include "../mwworld/class.hpp"
2021-03-12 18:29:51 +01:00
#include "../mwworld/timestamp.hpp"
2022-12-06 00:11:19 +01:00
#include "../mwworld/worldmodel.hpp"
2020-12-18 23:21:10 +01:00
namespace MWLua
{
void WorldView::update()
{
2021-01-29 01:54:54 +01:00
mActivatorsInScene.updateList();
2020-12-18 23:21:10 +01:00
mActorsInScene.updateList();
2021-01-29 01:54:54 +01:00
mContainersInScene.updateList();
mDoorsInScene.updateList();
2020-12-18 23:21:10 +01:00
mItemsInScene.updateList();
mPaused = MWBase::Environment::get().getWindowManager()->isGuiMode();
2020-12-18 23:21:10 +01:00
}
void WorldView::clear()
{
2021-01-29 01:54:54 +01:00
mActivatorsInScene.clear();
2020-12-18 23:21:10 +01:00
mActorsInScene.clear();
2021-01-29 01:54:54 +01:00
mContainersInScene.clear();
mDoorsInScene.clear();
2020-12-18 23:21:10 +01:00
mItemsInScene.clear();
}
2021-01-29 01:54:54 +01:00
WorldView::ObjectGroup* WorldView::chooseGroup(const MWWorld::Ptr& ptr)
{
2021-04-17 11:50:20 +02:00
// It is important to check `isMarker` first.
// For example "prisonmarker" has class "Door" despite that it is only an invisible marker.
2023-03-05 21:47:49 +01:00
if (Misc::ResourceHelpers::isHiddenMarker(ptr.getCellRef().getRefId()))
2021-04-17 11:50:20 +02:00
return nullptr;
2021-01-29 01:54:54 +01:00
const MWWorld::Class& cls = ptr.getClass();
if (cls.isActivator())
return &mActivatorsInScene;
if (cls.isActor())
return &mActorsInScene;
if (cls.isDoor())
return &mDoorsInScene;
if (typeid(cls) == typeid(MWClass::Container))
return &mContainersInScene;
if (cls.isItem(ptr))
2021-01-29 01:54:54 +01:00
return &mItemsInScene;
return nullptr;
}
2020-12-18 23:21:10 +01:00
void WorldView::objectAddedToScene(const MWWorld::Ptr& ptr)
{
MWBase::Environment::get().getWorldModel()->registerPtr(ptr);
2021-01-29 01:54:54 +01:00
ObjectGroup* group = chooseGroup(ptr);
if (group)
addToGroup(*group, ptr);
2020-12-18 23:21:10 +01:00
}
void WorldView::objectRemovedFromScene(const MWWorld::Ptr& ptr)
{
2021-01-29 01:54:54 +01:00
ObjectGroup* group = chooseGroup(ptr);
if (group)
removeFromGroup(*group, ptr);
2020-12-18 23:21:10 +01:00
}
double WorldView::getGameTime() const
2021-03-12 18:29:51 +01:00
{
MWBase::World* world = MWBase::Environment::get().getWorld();
MWWorld::TimeStamp timeStamp = world->getTimeStamp();
return (static_cast<double>(timeStamp.getDay()) * 24 + timeStamp.getHour()) * 3600.0;
2021-03-12 18:29:51 +01:00
}
void WorldView::load(ESM::ESMReader& esm)
{
esm.getHNT(mSimulationTime, "LUAW");
2023-04-07 02:14:32 +02:00
MWBase::Environment::get().getWorldModel()->setLastGeneratedRefNum(esm.getFormId(true));
}
void WorldView::save(ESM::ESMWriter& esm) const
{
esm.writeHNT("LUAW", mSimulationTime);
2023-04-07 02:14:32 +02:00
esm.writeFormId(MWBase::Environment::get().getWorldModel()->getLastGeneratedRefNum(), true);
}
2020-12-18 23:21:10 +01:00
void WorldView::ObjectGroup::updateList()
{
if (mChanged)
{
mList->clear();
for (const ObjectId& id : mSet)
mList->push_back(id);
mChanged = false;
}
}
void WorldView::ObjectGroup::clear()
{
mChanged = false;
mList->clear();
mSet.clear();
}
void WorldView::addToGroup(ObjectGroup& group, const MWWorld::Ptr& ptr)
{
group.mSet.insert(getId(ptr));
group.mChanged = true;
}
void WorldView::removeFromGroup(ObjectGroup& group, const MWWorld::Ptr& ptr)
{
group.mSet.erase(getId(ptr));
group.mChanged = true;
}
}