mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-19 21:53:51 +00:00
Savegame: store levelled creature state and move to actorIds
(Closes #1332)
This commit is contained in:
parent
9b67fcc4d7
commit
471bbd0021
6 changed files with 100 additions and 18 deletions
|
@ -2,6 +2,7 @@
|
||||||
#include "creaturelevlist.hpp"
|
#include "creaturelevlist.hpp"
|
||||||
|
|
||||||
#include <components/esm/loadlevlist.hpp>
|
#include <components/esm/loadlevlist.hpp>
|
||||||
|
#include <components/esm/creaturelevliststate.hpp>
|
||||||
|
|
||||||
#include "../mwmechanics/levelledlist.hpp"
|
#include "../mwmechanics/levelledlist.hpp"
|
||||||
|
|
||||||
|
@ -11,7 +12,9 @@ namespace
|
||||||
{
|
{
|
||||||
struct CreatureLevListCustomData : public MWWorld::CustomData
|
struct CreatureLevListCustomData : public MWWorld::CustomData
|
||||||
{
|
{
|
||||||
// TODO: save the creature we spawned here
|
// actorId of the creature we spawned
|
||||||
|
int mSpawnActorId;
|
||||||
|
|
||||||
virtual MWWorld::CustomData *clone() const;
|
virtual MWWorld::CustomData *clone() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -38,6 +41,25 @@ namespace MWClass
|
||||||
void CreatureLevList::insertObjectRendering(const MWWorld::Ptr &ptr, MWRender::RenderingInterface &renderingInterface) const
|
void CreatureLevList::insertObjectRendering(const MWWorld::Ptr &ptr, MWRender::RenderingInterface &renderingInterface) const
|
||||||
{
|
{
|
||||||
ensureCustomData(ptr);
|
ensureCustomData(ptr);
|
||||||
|
|
||||||
|
CreatureLevListCustomData& customData = dynamic_cast<CreatureLevListCustomData&> (*ptr.getRefData().getCustomData());
|
||||||
|
if (customData.mSpawnActorId != -1)
|
||||||
|
return; // TODO: handle respawning
|
||||||
|
|
||||||
|
|
||||||
|
MWWorld::LiveCellRef<ESM::CreatureLevList> *ref =
|
||||||
|
ptr.get<ESM::CreatureLevList>();
|
||||||
|
|
||||||
|
std::string id = MWMechanics::getLevelledItem(ref->mBase, true);
|
||||||
|
|
||||||
|
if (!id.empty())
|
||||||
|
{
|
||||||
|
const MWWorld::ESMStore& store = MWBase::Environment::get().getWorld()->getStore();
|
||||||
|
MWWorld::ManualRef ref(store, id);
|
||||||
|
ref.getPtr().getCellRef().mPos = ptr.getCellRef().mPos;
|
||||||
|
MWWorld::Ptr placed = MWBase::Environment::get().getWorld()->safePlaceObject(ref.getPtr(), ptr.getCell() , ptr.getCellRef().mPos);
|
||||||
|
customData.mSpawnActorId = placed.getClass().getCreatureStats(placed).getActorId();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatureLevList::ensureCustomData(const MWWorld::Ptr &ptr) const
|
void CreatureLevList::ensureCustomData(const MWWorld::Ptr &ptr) const
|
||||||
|
@ -45,22 +67,29 @@ namespace MWClass
|
||||||
if (!ptr.getRefData().getCustomData())
|
if (!ptr.getRefData().getCustomData())
|
||||||
{
|
{
|
||||||
std::auto_ptr<CreatureLevListCustomData> data (new CreatureLevListCustomData);
|
std::auto_ptr<CreatureLevListCustomData> data (new CreatureLevListCustomData);
|
||||||
|
data->mSpawnActorId = -1;
|
||||||
MWWorld::LiveCellRef<ESM::CreatureLevList> *ref =
|
|
||||||
ptr.get<ESM::CreatureLevList>();
|
|
||||||
|
|
||||||
std::string id = MWMechanics::getLevelledItem(ref->mBase, true);
|
|
||||||
|
|
||||||
if (!id.empty())
|
|
||||||
{
|
|
||||||
const MWWorld::ESMStore& store = MWBase::Environment::get().getWorld()->getStore();
|
|
||||||
MWWorld::ManualRef ref(store, id);
|
|
||||||
ref.getPtr().getCellRef().mPos = ptr.getCellRef().mPos;
|
|
||||||
// TODO: hold on to this for respawn purposes later
|
|
||||||
MWBase::Environment::get().getWorld()->safePlaceObject(ref.getPtr(), ptr.getCell() , ptr.getCellRef().mPos);
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr.getRefData().setCustomData(data.release());
|
ptr.getRefData().setCustomData(data.release());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CreatureLevList::readAdditionalState (const MWWorld::Ptr& ptr, const ESM::ObjectState& state)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
const ESM::CreatureLevListState& state2 = dynamic_cast<const ESM::CreatureLevListState&> (state);
|
||||||
|
|
||||||
|
ensureCustomData(ptr);
|
||||||
|
CreatureLevListCustomData& customData = dynamic_cast<CreatureLevListCustomData&> (*ptr.getRefData().getCustomData());
|
||||||
|
customData.mSpawnActorId = state2.mSpawnActorId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureLevList::writeAdditionalState (const MWWorld::Ptr& ptr, ESM::ObjectState& state)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
ESM::CreatureLevListState& state2 = dynamic_cast<ESM::CreatureLevListState&> (state);
|
||||||
|
|
||||||
|
ensureCustomData(ptr);
|
||||||
|
CreatureLevListCustomData& customData = dynamic_cast<CreatureLevListCustomData&> (*ptr.getRefData().getCustomData());
|
||||||
|
state2.mSpawnActorId = customData.mSpawnActorId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,14 @@ namespace MWClass
|
||||||
|
|
||||||
virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const;
|
virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const;
|
||||||
///< Add reference into a cell for rendering
|
///< Add reference into a cell for rendering
|
||||||
|
|
||||||
|
virtual void readAdditionalState (const MWWorld::Ptr& ptr, const ESM::ObjectState& state)
|
||||||
|
const;
|
||||||
|
///< Read additional state from \a state into \a ptr.
|
||||||
|
|
||||||
|
virtual void writeAdditionalState (const MWWorld::Ptr& ptr, ESM::ObjectState& state)
|
||||||
|
const;
|
||||||
|
///< Write additional state from \a ptr into \a state.
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <components/esm/npcstate.hpp>
|
#include <components/esm/npcstate.hpp>
|
||||||
#include <components/esm/creaturestate.hpp>
|
#include <components/esm/creaturestate.hpp>
|
||||||
#include <components/esm/fogstate.hpp>
|
#include <components/esm/fogstate.hpp>
|
||||||
|
#include <components/esm/creaturelevliststate.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
|
@ -592,7 +593,7 @@ namespace MWWorld
|
||||||
writeReferenceCollection<ESM::CreatureState> (writer, mCreatures);
|
writeReferenceCollection<ESM::CreatureState> (writer, mCreatures);
|
||||||
writeReferenceCollection<ESM::ObjectState> (writer, mDoors);
|
writeReferenceCollection<ESM::ObjectState> (writer, mDoors);
|
||||||
writeReferenceCollection<ESM::ObjectState> (writer, mIngreds);
|
writeReferenceCollection<ESM::ObjectState> (writer, mIngreds);
|
||||||
writeReferenceCollection<ESM::ObjectState> (writer, mCreatureLists);
|
writeReferenceCollection<ESM::CreatureLevListState> (writer, mCreatureLists);
|
||||||
writeReferenceCollection<ESM::ObjectState> (writer, mItemLists);
|
writeReferenceCollection<ESM::ObjectState> (writer, mItemLists);
|
||||||
writeReferenceCollection<ESM::LightState> (writer, mLights);
|
writeReferenceCollection<ESM::LightState> (writer, mLights);
|
||||||
writeReferenceCollection<ESM::ObjectState> (writer, mLockpicks);
|
writeReferenceCollection<ESM::ObjectState> (writer, mLockpicks);
|
||||||
|
@ -668,7 +669,7 @@ namespace MWWorld
|
||||||
|
|
||||||
case ESM::REC_LEVC:
|
case ESM::REC_LEVC:
|
||||||
|
|
||||||
readReferenceCollection<ESM::ObjectState> (reader, mCreatureLists, contentFileMap);
|
readReferenceCollection<ESM::CreatureLevListState> (reader, mCreatureLists, contentFileMap);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ESM::REC_LEVI:
|
case ESM::REC_LEVI:
|
||||||
|
|
|
@ -45,7 +45,7 @@ add_component_dir (esm
|
||||||
loadnpc loadpgrd loadrace loadregn loadscpt loadskil loadsndg loadsoun loadspel loadsscr loadstat
|
loadnpc loadpgrd loadrace loadregn loadscpt loadskil loadsndg loadsoun loadspel loadsscr loadstat
|
||||||
loadweap records aipackage effectlist spelllist variant variantimp loadtes3 cellref filter
|
loadweap records aipackage effectlist spelllist variant variantimp loadtes3 cellref filter
|
||||||
savedgame journalentry queststate locals globalscript player objectstate cellid cellstate globalmap lightstate inventorystate containerstate npcstate creaturestate dialoguestate statstate
|
savedgame journalentry queststate locals globalscript player objectstate cellid cellstate globalmap lightstate inventorystate containerstate npcstate creaturestate dialoguestate statstate
|
||||||
npcstats creaturestats weatherstate quickkeys fogstate spellstate activespells
|
npcstats creaturestats weatherstate quickkeys fogstate spellstate activespells creaturelevliststate
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (misc
|
add_component_dir (misc
|
||||||
|
|
25
components/esm/creaturelevliststate.cpp
Normal file
25
components/esm/creaturelevliststate.cpp
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#include "creaturelevliststate.hpp"
|
||||||
|
|
||||||
|
#include "esmreader.hpp"
|
||||||
|
#include "esmwriter.hpp"
|
||||||
|
|
||||||
|
namespace ESM
|
||||||
|
{
|
||||||
|
|
||||||
|
void CreatureLevListState::load(ESMReader &esm)
|
||||||
|
{
|
||||||
|
ObjectState::load(esm);
|
||||||
|
|
||||||
|
mSpawnActorId = -1;
|
||||||
|
esm.getHNOT (mSpawnActorId, "SPAW");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureLevListState::save(ESMWriter &esm, bool inInventory) const
|
||||||
|
{
|
||||||
|
ObjectState::save(esm, inInventory);
|
||||||
|
|
||||||
|
if (mSpawnActorId != -1)
|
||||||
|
esm.writeHNT ("SPAW", mSpawnActorId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
19
components/esm/creaturelevliststate.hpp
Normal file
19
components/esm/creaturelevliststate.hpp
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef OPENMW_ESM_CREATURELEVLISTSTATE_H
|
||||||
|
#define OPENMW_ESM_CREATURELEVLISTSTATE_H
|
||||||
|
|
||||||
|
#include "objectstate.hpp"
|
||||||
|
|
||||||
|
namespace ESM
|
||||||
|
{
|
||||||
|
// format 0, saved games only
|
||||||
|
|
||||||
|
struct CreatureLevListState : public ObjectState
|
||||||
|
{
|
||||||
|
int mSpawnActorId;
|
||||||
|
|
||||||
|
virtual void load (ESMReader &esm);
|
||||||
|
virtual void save (ESMWriter &esm, bool inInventory = false) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue