ObjDefManager: Set replacement object's handle info after calling set()
authorkwolekr <kwolekr@minetest.net>
Mon, 4 May 2015 02:05:24 +0000 (22:05 -0400)
committerkwolekr <kwolekr@minetest.net>
Mon, 4 May 2015 02:19:35 +0000 (22:19 -0400)
Make gamedef optional when constructing an ObjDefManager
Add note about object ownership

src/mapgen.cpp
src/mapgen.h

index d8eb8068a8680efe9c5b02bb95e59208c317a609..1de7fca817859d48e3a4ab8753aad1b922193ec5 100644 (file)
@@ -434,7 +434,7 @@ void GenerateNotifier::getEvents(
 ObjDefManager::ObjDefManager(IGameDef *gamedef, ObjDefType type)
 {
        m_objtype = type;
-       m_ndef = gamedef->getNodeDefManager();
+       m_ndef = gamedef ? gamedef->getNodeDefManager() : NULL;
 }
 
 
@@ -471,7 +471,16 @@ ObjDef *ObjDefManager::get(ObjDefHandle handle) const
 ObjDef *ObjDefManager::set(ObjDefHandle handle, ObjDef *obj)
 {
        u32 index = validateHandle(handle);
-       return (index != OBJDEF_INVALID_INDEX) ? setRaw(index, obj) : NULL;
+       if (index == OBJDEF_INVALID_INDEX)
+               return NULL;
+
+       ObjDef *oldobj = setRaw(index, obj);
+
+       obj->uid    = oldobj->uid;
+       obj->index  = oldobj->index;
+       obj->handle = oldobj->handle;
+
+       return oldobj;
 }
 
 
index ee7e8227e98162727cb3d80e025d37e99dea9626..5be004e9f720cdc09ad299496d193eebaf44e25d 100644 (file)
@@ -206,12 +206,15 @@ public:
        std::string name;
 };
 
+// WARNING: Ownership of ObjDefs is transferred to the ObjDefManager it is
+// added/set to.  Note that ObjDefs managed by ObjDefManager are NOT refcounted,
+// so the same ObjDef instance must not be referenced multiple
 class ObjDefManager {
 public:
        ObjDefManager(IGameDef *gamedef, ObjDefType type);
        virtual ~ObjDefManager();
 
-       virtual const char *getObjectTitle() const = 0;
+       virtual const char *getObjectTitle() const { return "ObjDef"; }
 
        virtual void clear();
        virtual ObjDef *getByName(const std::string &name) const;