mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
Add minetest.unregister_item and minetest.register_alias_force
This commit is contained in:
parent
7eacdc7bb8
commit
aa33166386
@ -7,6 +7,9 @@
|
|||||||
local register_item_raw = core.register_item_raw
|
local register_item_raw = core.register_item_raw
|
||||||
core.register_item_raw = nil
|
core.register_item_raw = nil
|
||||||
|
|
||||||
|
local unregister_item_raw = core.unregister_item_raw
|
||||||
|
core.unregister_item_raw = nil
|
||||||
|
|
||||||
local register_alias_raw = core.register_alias_raw
|
local register_alias_raw = core.register_alias_raw
|
||||||
core.register_alias_raw = nil
|
core.register_alias_raw = nil
|
||||||
|
|
||||||
@ -172,6 +175,27 @@ function core.register_item(name, itemdef)
|
|||||||
register_item_raw(itemdef)
|
register_item_raw(itemdef)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function core.unregister_item(name)
|
||||||
|
if not core.registered_items[name] then
|
||||||
|
core.log("warning", "Not unregistering item " ..name..
|
||||||
|
" because it doesn't exist.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- Erase from registered_* table
|
||||||
|
local type = core.registered_items[name].type
|
||||||
|
if type == "node" then
|
||||||
|
core.registered_nodes[name] = nil
|
||||||
|
elseif type == "craft" then
|
||||||
|
core.registered_craftitems[name] = nil
|
||||||
|
elseif type == "tool" then
|
||||||
|
core.registered_tools[name] = nil
|
||||||
|
end
|
||||||
|
core.registered_items[name] = nil
|
||||||
|
|
||||||
|
|
||||||
|
unregister_item_raw(name)
|
||||||
|
end
|
||||||
|
|
||||||
function core.register_node(name, nodedef)
|
function core.register_node(name, nodedef)
|
||||||
nodedef.type = "node"
|
nodedef.type = "node"
|
||||||
core.register_item(name, nodedef)
|
core.register_item(name, nodedef)
|
||||||
@ -242,6 +266,20 @@ function core.register_alias(name, convert_to)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function core.register_alias_force(name, convert_to)
|
||||||
|
if forbidden_item_names[name] then
|
||||||
|
error("Unable to register alias: Name is forbidden: " .. name)
|
||||||
|
end
|
||||||
|
if core.registered_items[name] ~= nil then
|
||||||
|
core.unregister_item(name)
|
||||||
|
core.log("info", "Removed item " ..name..
|
||||||
|
" while attempting to force add an alias")
|
||||||
|
end
|
||||||
|
--core.log("Registering alias: " .. name .. " -> " .. convert_to)
|
||||||
|
core.registered_aliases[name] = convert_to
|
||||||
|
register_alias_raw(name, convert_to)
|
||||||
|
end
|
||||||
|
|
||||||
function core.on_craft(itemstack, player, old_craft_list, craft_inv)
|
function core.on_craft(itemstack, player, old_craft_list, craft_inv)
|
||||||
for _, func in ipairs(core.registered_on_crafts) do
|
for _, func in ipairs(core.registered_on_crafts) do
|
||||||
itemstack = func(itemstack, player, old_craft_list, craft_inv) or itemstack
|
itemstack = func(itemstack, player, old_craft_list, craft_inv) or itemstack
|
||||||
|
@ -208,11 +208,17 @@ when registering it.
|
|||||||
The `:` prefix can also be used for maintaining backwards compatibility.
|
The `:` prefix can also be used for maintaining backwards compatibility.
|
||||||
|
|
||||||
### Aliases
|
### Aliases
|
||||||
Aliases can be added by using `minetest.register_alias(name, convert_to)`.
|
Aliases can be added by using `minetest.register_alias(name, convert_to)` or
|
||||||
|
`minetest.register_alias_force(name, convert_to).
|
||||||
|
|
||||||
This will make Minetest to convert things called name to things called
|
This will make Minetest to convert things called name to things called
|
||||||
`convert_to`.
|
`convert_to`.
|
||||||
|
|
||||||
|
The only difference between `minetest.register_alias` and
|
||||||
|
`minetest.register_alias_force` is that if an item called `name` exists,
|
||||||
|
`minetest.register_alias` will do nothing while
|
||||||
|
`minetest.register_alias_force` will unregister it.
|
||||||
|
|
||||||
This can be used for maintaining backwards compatibility.
|
This can be used for maintaining backwards compatibility.
|
||||||
|
|
||||||
This can be also used for setting quick access names for things, e.g. if
|
This can be also used for setting quick access names for things, e.g. if
|
||||||
@ -464,6 +470,11 @@ the global `minetest.registered_*` tables.
|
|||||||
* `minetest.register_craftitem(name, item definition)`
|
* `minetest.register_craftitem(name, item definition)`
|
||||||
* added to `minetest.registered_items[name]`
|
* added to `minetest.registered_items[name]`
|
||||||
|
|
||||||
|
* `minetest.unregister_item(name)`
|
||||||
|
* Unregisters the item name from engine, and deletes the entry with key
|
||||||
|
* `name` from `minetest.registered_items` and from the associated item
|
||||||
|
* table according to its nature: minetest.registered_nodes[] etc
|
||||||
|
|
||||||
* `minetest.register_biome(biome definition)`
|
* `minetest.register_biome(biome definition)`
|
||||||
* returns an integer uniquely identifying the registered biome
|
* returns an integer uniquely identifying the registered biome
|
||||||
* added to `minetest.registered_biome` with the key of `biome.name`
|
* added to `minetest.registered_biome` with the key of `biome.name`
|
||||||
@ -1883,7 +1894,9 @@ Call these functions only at load time!
|
|||||||
* `minetest.register_node(name, node definition)`
|
* `minetest.register_node(name, node definition)`
|
||||||
* `minetest.register_tool(name, item definition)`
|
* `minetest.register_tool(name, item definition)`
|
||||||
* `minetest.register_craftitem(name, item definition)`
|
* `minetest.register_craftitem(name, item definition)`
|
||||||
|
* `minetest.unregister_item(name)`
|
||||||
* `minetest.register_alias(name, convert_to)`
|
* `minetest.register_alias(name, convert_to)`
|
||||||
|
* `minetest.register_alias_force(name, convert_to)`
|
||||||
* `minetest.register_craft(recipe)`
|
* `minetest.register_craft(recipe)`
|
||||||
* Check recipe table syntax for different types below.
|
* Check recipe table syntax for different types below.
|
||||||
* `minetest.clear_craft(recipe)`
|
* `minetest.clear_craft(recipe)`
|
||||||
|
@ -466,11 +466,17 @@ public:
|
|||||||
infostream<<"ItemDefManager: erased alias "<<def.name
|
infostream<<"ItemDefManager: erased alias "<<def.name
|
||||||
<<" because item was defined"<<std::endl;
|
<<" 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,
|
virtual void registerAlias(const std::string &name,
|
||||||
const std::string &convert_to)
|
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
|
verbosestream<<"ItemDefManager: setting alias "<<name
|
||||||
<<" -> "<<convert_to<<std::endl;
|
<<" -> "<<convert_to<<std::endl;
|
||||||
m_aliases[name] = convert_to;
|
m_aliases[name] = convert_to;
|
||||||
|
@ -144,6 +144,7 @@ public:
|
|||||||
virtual void clear()=0;
|
virtual void clear()=0;
|
||||||
// Register item definition
|
// Register item definition
|
||||||
virtual void registerItem(const ItemDefinition &def)=0;
|
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>.
|
// Set an alias so that items named <name> will load as <convert_to>.
|
||||||
// Alias is not set if <name> has already been defined.
|
// Alias is not set if <name> has already been defined.
|
||||||
// Alias will be removed if <name> is defined at a later point of time.
|
// Alias will be removed if <name> is defined at a later point of time.
|
||||||
|
@ -778,6 +778,7 @@ public:
|
|||||||
content_t allocateId();
|
content_t allocateId();
|
||||||
virtual content_t set(const std::string &name, const ContentFeatures &def);
|
virtual content_t set(const std::string &name, const ContentFeatures &def);
|
||||||
virtual content_t allocateDummy(const std::string &name);
|
virtual content_t allocateDummy(const std::string &name);
|
||||||
|
virtual void removeNode(const std::string &name);
|
||||||
virtual void updateAliases(IItemDefManager *idef);
|
virtual void updateAliases(IItemDefManager *idef);
|
||||||
virtual void applyTextureOverrides(const std::string &override_filepath);
|
virtual void applyTextureOverrides(const std::string &override_filepath);
|
||||||
virtual void updateTextures(IGameDef *gamedef,
|
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)
|
void CNodeDefManager::updateAliases(IItemDefManager *idef)
|
||||||
{
|
{
|
||||||
std::set<std::string> all = idef->getAll();
|
std::set<std::string> all = idef->getAll();
|
||||||
|
@ -384,6 +384,8 @@ public:
|
|||||||
const ContentFeatures &def)=0;
|
const ContentFeatures &def)=0;
|
||||||
// If returns CONTENT_IGNORE, could not allocate id
|
// If returns CONTENT_IGNORE, could not allocate id
|
||||||
virtual content_t allocateDummy(const std::string &name)=0;
|
virtual content_t allocateDummy(const std::string &name)=0;
|
||||||
|
// Remove a node
|
||||||
|
virtual void removeNode(const std::string &name)=0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Update item alias mapping.
|
Update item alias mapping.
|
||||||
|
@ -525,6 +525,27 @@ int ModApiItemMod::l_register_item_raw(lua_State *L)
|
|||||||
return 0; /* number of results */
|
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)
|
// register_alias_raw(name, convert_to_name)
|
||||||
int ModApiItemMod::l_register_alias_raw(lua_State *L)
|
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)
|
void ModApiItemMod::Initialize(lua_State *L, int top)
|
||||||
{
|
{
|
||||||
API_FCT(register_item_raw);
|
API_FCT(register_item_raw);
|
||||||
|
API_FCT(unregister_item_raw);
|
||||||
API_FCT(register_alias_raw);
|
API_FCT(register_alias_raw);
|
||||||
API_FCT(get_content_id);
|
API_FCT(get_content_id);
|
||||||
API_FCT(get_name_from_content_id);
|
API_FCT(get_name_from_content_id);
|
||||||
|
@ -135,6 +135,7 @@ public:
|
|||||||
class ModApiItemMod : public ModApiBase {
|
class ModApiItemMod : public ModApiBase {
|
||||||
private:
|
private:
|
||||||
static int l_register_item_raw(lua_State *L);
|
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_register_alias_raw(lua_State *L);
|
||||||
static int l_get_content_id(lua_State *L);
|
static int l_get_content_id(lua_State *L);
|
||||||
static int l_get_name_from_content_id(lua_State *L);
|
static int l_get_name_from_content_id(lua_State *L);
|
||||||
|
Loading…
Reference in New Issue
Block a user