diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/itemdef.cpp | 10 | ||||
-rw-r--r-- | src/itemdef.h | 1 | ||||
-rw-r--r-- | src/nodedef.cpp | 35 | ||||
-rw-r--r-- | src/nodedef.h | 2 | ||||
-rw-r--r-- | src/script/lua_api/l_item.cpp | 22 | ||||
-rw-r--r-- | src/script/lua_api/l_item.h | 1 |
6 files changed, 69 insertions, 2 deletions
diff --git a/src/itemdef.cpp b/src/itemdef.cpp index a618ad631..a6c627a03 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -466,11 +466,17 @@ public: infostream<<"ItemDefManager: erased alias "<<def.name <<" because item was defined"<<std::endl; } + virtual void unregisterItem(const std::string &name) + { + verbosestream<<"ItemDefManager: unregistering \""<<name<<"\""<<std::endl; + + delete m_item_definitions[name]; + m_item_definitions.erase(name); + } virtual void registerAlias(const std::string &name, const std::string &convert_to) { - if(m_item_definitions.find(name) == m_item_definitions.end()) - { + if (m_item_definitions.find(name) == m_item_definitions.end()) { verbosestream<<"ItemDefManager: setting alias "<<name <<" -> "<<convert_to<<std::endl; m_aliases[name] = convert_to; diff --git a/src/itemdef.h b/src/itemdef.h index 805b4aa5d..b14ed41f7 100644 --- a/src/itemdef.h +++ b/src/itemdef.h @@ -144,6 +144,7 @@ public: virtual void clear()=0; // Register item definition virtual void registerItem(const ItemDefinition &def)=0; + virtual void unregisterItem(const std::string &name)=0; // Set an alias so that items named <name> will load as <convert_to>. // Alias is not set if <name> has already been defined. // Alias will be removed if <name> is defined at a later point of time. diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 646375575..bfb2999bd 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -778,6 +778,7 @@ public: content_t allocateId(); virtual content_t set(const std::string &name, const ContentFeatures &def); virtual content_t allocateDummy(const std::string &name); + virtual void removeNode(const std::string &name); virtual void updateAliases(IItemDefManager *idef); virtual void applyTextureOverrides(const std::string &override_filepath); virtual void updateTextures(IGameDef *gamedef, @@ -1072,6 +1073,40 @@ content_t CNodeDefManager::allocateDummy(const std::string &name) } +void CNodeDefManager::removeNode(const std::string &name) +{ + // Pre-condition + assert(name != ""); + + // Erase name from name ID mapping + content_t id = CONTENT_IGNORE; + if (m_name_id_mapping.getId(name, id)) { + m_name_id_mapping.eraseName(name); + m_name_id_mapping_with_aliases.erase(name); + } + + // Erase node content from all groups it belongs to + for (std::map<std::string, GroupItems>::iterator iter_groups = + m_group_to_items.begin(); + iter_groups != m_group_to_items.end();) { + GroupItems &items = iter_groups->second; + for (GroupItems::iterator iter_groupitems = items.begin(); + iter_groupitems != items.end();) { + if (iter_groupitems->first == id) + items.erase(iter_groupitems++); + else + iter_groupitems++; + } + + // Check if group is empty + if (items.size() == 0) + m_group_to_items.erase(iter_groups++); + else + iter_groups++; + } +} + + void CNodeDefManager::updateAliases(IItemDefManager *idef) { std::set<std::string> all = idef->getAll(); diff --git a/src/nodedef.h b/src/nodedef.h index f17c53727..80396f992 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -384,6 +384,8 @@ public: const ContentFeatures &def)=0; // If returns CONTENT_IGNORE, could not allocate id virtual content_t allocateDummy(const std::string &name)=0; + // Remove a node + virtual void removeNode(const std::string &name)=0; /* Update item alias mapping. diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index 5381cba76..ff0baea14 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -525,6 +525,27 @@ int ModApiItemMod::l_register_item_raw(lua_State *L) return 0; /* number of results */ } +// unregister_item(name) +int ModApiItemMod::l_unregister_item_raw(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + std::string name = luaL_checkstring(L, 1); + + IWritableItemDefManager *idef = + getServer(L)->getWritableItemDefManager(); + + // Unregister the node + if (idef->get(name).type == ITEM_NODE) { + IWritableNodeDefManager *ndef = + getServer(L)->getWritableNodeDefManager(); + ndef->removeNode(name); + } + + idef->unregisterItem(name); + + return 0; /* number of results */ +} + // register_alias_raw(name, convert_to_name) int ModApiItemMod::l_register_alias_raw(lua_State *L) { @@ -570,6 +591,7 @@ int ModApiItemMod::l_get_name_from_content_id(lua_State *L) void ModApiItemMod::Initialize(lua_State *L, int top) { API_FCT(register_item_raw); + API_FCT(unregister_item_raw); API_FCT(register_alias_raw); API_FCT(get_content_id); API_FCT(get_name_from_content_id); diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h index 0f9e4ba9b..be919b701 100644 --- a/src/script/lua_api/l_item.h +++ b/src/script/lua_api/l_item.h @@ -135,6 +135,7 @@ public: class ModApiItemMod : public ModApiBase { private: static int l_register_item_raw(lua_State *L); + static int l_unregister_item_raw(lua_State *L); static int l_register_alias_raw(lua_State *L); static int l_get_content_id(lua_State *L); static int l_get_name_from_content_id(lua_State *L); |