#ifndef GAME_MWWORLD_REFDATA_H #define GAME_MWWORLD_REFDATA_H #include #include #include #include "../mwscript/locals.hpp" #include "../mwworld/customdata.hpp" #include #include #include namespace SceneUtil { class PositionAttitudeTransform; } namespace ESM { class Script; class CellRef; struct ObjectState; } namespace ESM4 { struct ActorCharacter; struct Reference; } namespace MWLua { class LocalScripts; } namespace MWWorld { class CustomData; class RefData { osg::ref_ptr mBaseNode; MWScript::Locals mLocals; std::shared_ptr mLuaScripts; ESM::Position mPosition; ESM::AnimationState mAnimationState; std::unique_ptr mCustomData; unsigned int mFlags; /// separate delete flag used for deletion by a content file /// @note not stored in the save game file. bool mDeletedByContentFile : 1; bool mEnabled : 1; public: bool mPhysicsPostponed : 1; private: bool mChanged : 1; void copy(const RefData& refData); void cleanup(); public: RefData(); /// @param cellRef Used to copy constant data such as position into this class where it can /// be altered without affecting the original data. This makes it possible /// to reset the position as the original data is still held in the CellRef RefData(const ESM::CellRef& cellRef); RefData(const ESM4::Reference& cellRef); RefData(const ESM4::ActorCharacter& cellRef); RefData(const ESM::ObjectState& objectState, bool deletedByContentFile); ///< Ignores local variables and custom data (not enough context available here to /// perform these operations). RefData(const RefData& refData); RefData(RefData&& other); ~RefData(); void write(ESM::ObjectState& objectState, const ESM::RefId& scriptId = ESM::RefId()) const; ///< Ignores custom data (not enough context available here to /// perform this operations). RefData& operator=(const RefData& refData); RefData& operator=(RefData&& other); /// Return base node (can be a null pointer). SceneUtil::PositionAttitudeTransform* getBaseNode(); /// Return base node (can be a null pointer). const SceneUtil::PositionAttitudeTransform* getBaseNode() const; /// Set base node (can be a null pointer). void setBaseNode(osg::ref_ptr base); void setLocals(const ESM::Script& script); MWLua::LocalScripts* getLuaScripts() { return mLuaScripts.get(); } void setLuaScripts(std::shared_ptr&&); /// This flag is only used for content stack loading and will not be stored in the savegame. /// If the object was deleted by gameplay, then use setCount(0) instead. void setDeletedByContentFile(bool deleted); /// Returns true if the object was deleted by a content file. bool isDeletedByContentFile() const; MWScript::Locals& getLocals(); bool isEnabled() const; void enable(); void disable(); void setPosition(const ESM::Position& pos); const ESM::Position& getPosition() const; void setCustomData(std::unique_ptr&& value) noexcept; ///< Set custom data (potentially replacing old custom data). The ownership of \a data is /// transferred to this. CustomData* getCustomData(); ///< May return a 0-pointer. The ownership of the return data object is not transferred. const CustomData* getCustomData() const; bool activate(); bool onActivate(); bool activateByScript(); bool hasChanged() const; ///< Has this RefData changed since it was originally loaded? const ESM::AnimationState& getAnimationState() const; ESM::AnimationState& getAnimationState(); }; } #endif