NPC/creature persistence flag

actorid
scrawl 12 years ago
parent 9fee99d56c
commit 8a3d3f954b

@ -235,6 +235,12 @@ namespace MWClass
return 0; return 0;
} }
bool Creature::isPersistent(const MWWorld::Ptr &actor) const
{
MWWorld::LiveCellRef<ESM::Creature>* ref = actor.get<ESM::Creature>();
return ref->mBase->mPersistent;
}
MWWorld::Ptr MWWorld::Ptr
Creature::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const Creature::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{ {

@ -64,6 +64,8 @@ namespace MWClass
virtual int getServices (const MWWorld::Ptr& actor) const; virtual int getServices (const MWWorld::Ptr& actor) const;
virtual bool isPersistent (const MWWorld::Ptr& ptr) const;
static void registerSelf(); static void registerSelf();
virtual std::string getModel(const MWWorld::Ptr &ptr) const; virtual std::string getModel(const MWWorld::Ptr &ptr) const;

@ -235,6 +235,12 @@ namespace MWClass
MWBase::Environment::get().getMechanicsManager()->add(ptr); MWBase::Environment::get().getMechanicsManager()->add(ptr);
} }
bool Npc::isPersistent(const MWWorld::Ptr &actor) const
{
MWWorld::LiveCellRef<ESM::NPC>* ref = actor.get<ESM::NPC>();
return ref->mBase->mPersistent;
}
std::string Npc::getModel(const MWWorld::Ptr &ptr) const std::string Npc::getModel(const MWWorld::Ptr &ptr) const
{ {
MWWorld::LiveCellRef<ESM::NPC> *ref = MWWorld::LiveCellRef<ESM::NPC> *ref =

@ -130,6 +130,8 @@ namespace MWClass
virtual int getServices (const MWWorld::Ptr& actor) const; virtual int getServices (const MWWorld::Ptr& actor) const;
virtual bool isPersistent (const MWWorld::Ptr& ptr) const;
static void registerSelf(); static void registerSelf();
virtual std::string getModel(const MWWorld::Ptr &ptr) const; virtual std::string getModel(const MWWorld::Ptr &ptr) const;

@ -201,7 +201,7 @@ namespace MWGui
{ {
mPtr = container; mPtr = container;
if (container.getTypeName() == typeid(ESM::NPC).name() && !loot) if (!loot)
{ {
// we are stealing stuff // we are stealing stuff
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer(); MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
@ -258,9 +258,9 @@ namespace MWGui
onTakeAllButtonClicked(mTakeButton); onTakeAllButtonClicked(mTakeButton);
/// \todo if corpse is non-disposable: messagebox #{sDisposeCorpseFail} /// \todo if corpse is non-disposable: messagebox #{sDisposeCorpseFail}
//if () if (MWWorld::Class::get(mPtr).isPersistent(mPtr))
// MWBase::Environment::get().getWindowManager()->messageBox("#{sDisposeCorpseFail}"); MWBase::Environment::get().getWindowManager()->messageBox("#{sDisposeCorpseFail}");
//else else
MWBase::Environment::get().getWorld()->deleteObject(mPtr); MWBase::Environment::get().getWorld()->deleteObject(mPtr);
mPtr = MWWorld::Ptr(); mPtr = MWWorld::Ptr();

@ -220,6 +220,11 @@ namespace MWWorld
return get (ptr.getTypeName()); return get (ptr.getTypeName());
} }
bool Class::isPersistent(const Ptr &ptr) const
{
throw std::runtime_error ("class does not support persistence");
}
void Class::registerClass (const std::string& key, boost::shared_ptr<Class> instance) void Class::registerClass (const std::string& key, boost::shared_ptr<Class> instance)
{ {
sClasses.insert (std::make_pair (key, instance)); sClasses.insert (std::make_pair (key, instance));

@ -253,6 +253,8 @@ namespace MWWorld
virtual float getWeight (const MWWorld::Ptr& ptr) const; virtual float getWeight (const MWWorld::Ptr& ptr) const;
virtual bool isPersistent (const MWWorld::Ptr& ptr) const;
virtual Ptr virtual Ptr
copyToCell(const Ptr &ptr, CellStore &cell) const; copyToCell(const Ptr &ptr, CellStore &cell) const;

@ -15,8 +15,9 @@ ESM_Context ESMReader::getContext()
return mCtx; return mCtx;
} }
ESMReader::ESMReader(): ESMReader::ESMReader()
mBuffer(50*1024) : mBuffer(50*1024)
, mRecordFlags(0)
{ {
} }

@ -216,7 +216,7 @@ public:
follows the header, ie beyond the entire record. You should use follows the header, ie beyond the entire record. You should use
leftRec to orient yourself inside the record itself. leftRec to orient yourself inside the record itself.
*/ */
void getRecHeader() { uint32_t u; getRecHeader(u); } void getRecHeader() { getRecHeader(mRecordFlags); }
void getRecHeader(uint32_t &flags); void getRecHeader(uint32_t &flags);
bool hasMoreRecs() const { return mCtx.leftFile > 0; } bool hasMoreRecs() const { return mCtx.leftFile > 0; }
@ -249,11 +249,16 @@ public:
/// Sets font encoder for ESM strings /// Sets font encoder for ESM strings
void setEncoder(ToUTF8::Utf8Encoder* encoder); void setEncoder(ToUTF8::Utf8Encoder* encoder);
/// Get record flags of last record
unsigned int getRecordFlags() { return mRecordFlags; }
private: private:
Ogre::DataStreamPtr mEsm; Ogre::DataStreamPtr mEsm;
ESM_Context mCtx; ESM_Context mCtx;
unsigned int mRecordFlags;
// Special file signifier (see SpecialFile enum above) // Special file signifier (see SpecialFile enum above)
// Buffer for ESM strings // Buffer for ESM strings

@ -7,6 +7,8 @@ namespace ESM {
void Creature::load(ESMReader &esm) void Creature::load(ESMReader &esm)
{ {
mPersistent = esm.getRecordFlags() & 0x0400;
mModel = esm.getHNString("MODL"); mModel = esm.getHNString("MODL");
mOriginal = esm.getHNOString("CNAM"); mOriginal = esm.getHNOString("CNAM");
mName = esm.getHNOString("FNAM"); mName = esm.getHNOString("FNAM");

@ -69,6 +69,9 @@ struct Creature
NPDTstruct mData; NPDTstruct mData;
int mFlags; int mFlags;
bool mPersistent;
float mScale; float mScale;
std::string mId, mModel, mName, mScript; std::string mId, mModel, mName, mScript;

@ -10,6 +10,8 @@ void NPC::load(ESMReader &esm)
{ {
mNpdt52.mGold = -10; mNpdt52.mGold = -10;
mPersistent = esm.getRecordFlags() & 0x0400;
mModel = esm.getHNOString("MODL"); mModel = esm.getHNOString("MODL");
mName = esm.getHNOString("FNAM"); mName = esm.getHNOString("FNAM");

@ -100,6 +100,8 @@ struct NPC
int mFlags; int mFlags;
bool mPersistent;
InventoryList mInventory; InventoryList mInventory;
SpellList mSpells; SpellList mSpells;

Loading…
Cancel
Save