// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef R2_OBJECT_FACTORY_CLIENT_H #define R2_OBJECT_FACTORY_CLIENT_H #include "game_share/object.h" #include "editor.h" #include "../interface_v3/lua_object.h" namespace R2 { /** Reference Id object on the client. * This object will trigger the right events on its parent when its target is created or erased. * (creation is watched too. This is possible because we use instance id, not direct pointer on the object) */ class CObjectRefIdClient : public CObjectRefId, public CEditor::IInstanceObserver { public: CObjectRefIdClient(const std::string &value); ~CObjectRefIdClient(); // from CObjectString virtual bool set(const std::string& key, const std::string & value); CObject* clone() const; void enable(bool enabled); protected: // from CEditor::IInstanceObserver virtual void onInstanceCreated(CInstance &instance); virtual void onInstanceErased(CInstance &instance); virtual void onPreHrcMove(CInstance &instance); virtual void onPostHrcMove(CInstance &instance); virtual void onInstanceEraseRequest(CInstance &instance); virtual void onAttrModified(CInstance &instance, const std::string &attrName, sint32 attrIndex); private: // cache for the 'name' of this property in the parent CEditor::TInstanceObserverHandle _ObserverHandle; mutable sint32 _IndexInParent; mutable sint32 _IndexInParentArray; mutable CInstance::TRefPtr _ParentInstance; bool _Enabled; private: void updateParentInstancePtr() const; void getNameInParent(std::string &name, sint32 &indexInArray) const; void addObserverHandle(); void removeObserverHandle(); }; // CObjectTable on client side class CObjectTableClient : public CObjectTable { public: CObjectTableClient(); void pushOnLuaStack(CLuaState &state, CLuaObject &metatable) const; CObject* clone() const; private: mutable CLuaObject _Ref; }; // the client factory redefine R2::CObjectRefId so that it can perform its observer job on the client class CObjectFactoryClient : public CObjectFactory { public: CObjectFactoryClient(const std::string &prefix); // from CObjectFactory virtual CObject* newBasic(const std::string & type); }; } // R2 #endif