From ed10005d381580440558dc49277b4d350f081283 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Mon, 30 Mar 2015 23:40:35 -0400 Subject: GenElementManager: Pass opaque handles to Lua and rename to ObjDefManager Add core.clear_registered_schematics() and refactor schematics somewhat --- src/mapgen.h | 66 ++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 17 deletions(-) (limited to 'src/mapgen.h') diff --git a/src/mapgen.h b/src/mapgen.h index 5b5ed19a2..59fe2fca7 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -179,36 +179,68 @@ struct MapgenFactory { virtual ~MapgenFactory() {} }; -class GenElement { +typedef std::map StringMap; +typedef u32 ObjDefHandle; + +#define OBJDEF_INVALID_INDEX ((u32)(-1)) +#define OBJDEF_INVALID_HANDLE 0 +#define OBJDEF_HANDLE_SALT 0x00585e6fu +#define OBJDEF_MAX_ITEMS (1 << 18) +#define OBJDEF_UID_MASK ((1 << 7) - 1) + +enum ObjDefType { + OBJDEF_GENERIC, + OBJDEF_BIOME, + OBJDEF_ORE, + OBJDEF_DECORATION, + OBJDEF_SCHEMATIC, +}; + +class ObjDef { public: - virtual ~GenElement() {} - u32 id; + virtual ~ObjDef() {} + + u32 index; + u32 uid; + ObjDefHandle handle; std::string name; }; -class GenElementManager { +class ObjDefManager { public: - static const char *ELEMENT_TITLE; - static const size_t ELEMENT_LIMIT = -1; + ObjDefManager(IGameDef *gamedef, ObjDefType type); + virtual ~ObjDefManager(); - GenElementManager(IGameDef *gamedef); - virtual ~GenElementManager(); + virtual const char *getObjectTitle() const = 0; - virtual GenElement *create(int type) = 0; - - virtual u32 add(GenElement *elem); - virtual GenElement *get(u32 id); - virtual GenElement *update(u32 id, GenElement *elem); - virtual GenElement *remove(u32 id); + virtual ObjDef *create(int type) = 0; virtual void clear(); + virtual ObjDef *getByName(const std::string &name) const; + + //// Add new/get/set object definitions by handle + virtual ObjDefHandle add(ObjDef *obj); + virtual ObjDef *get(ObjDefHandle handle) const; + virtual ObjDef *set(ObjDefHandle handle, ObjDef *obj); + + //// Raw variants that work on indexes + virtual u32 addRaw(ObjDef *obj); + + // It is generally assumed that getRaw() will always return a valid object + // This won't be true if people do odd things such as call setRaw() with NULL + virtual ObjDef *getRaw(u32 index) const; + virtual ObjDef *setRaw(u32 index, ObjDef *obj); - virtual GenElement *getByName(const std::string &name); + INodeDefManager *getNodeDef() const { return m_ndef; } - INodeDefManager *getNodeDef() { return m_ndef; } + u32 validateHandle(ObjDefHandle handle) const; + static ObjDefHandle createHandle(u32 index, ObjDefType type, u32 uid); + static bool decodeHandle(ObjDefHandle handle, u32 *index, + ObjDefType *type, u32 *uid); protected: INodeDefManager *m_ndef; - std::vector m_elements; + std::vector m_objects; + ObjDefType m_objtype; }; #endif -- cgit v1.2.3