Add override for biomes, decorations and ores and some other help script functions.

This commit is contained in:
SFENCE 2023-12-30 22:21:52 +01:00
parent 431444ba9f
commit f9dece2f99
6 changed files with 188 additions and 6 deletions

View File

@ -442,6 +442,11 @@ local function make_registration_wrap(reg_fn_name, clear_fn_name)
local orig_reg_fn = core[reg_fn_name] local orig_reg_fn = core[reg_fn_name]
core[reg_fn_name] = function(def) core[reg_fn_name] = function(def)
if def.name ~= nil then
if list[def.name] then
error("Attempt to register already registered element - '" .. def.name .. "'", 2)
end
end
local retval = orig_reg_fn(def) local retval = orig_reg_fn(def)
if retval ~= nil then if retval ~= nil then
if def.name ~= nil then if def.name ~= nil then
@ -464,7 +469,28 @@ local function make_registration_wrap(reg_fn_name, clear_fn_name)
return list return list
end end
local function make_wrap_deregistration(reg_fn, clear_fn, list) local function make_wrap_override_deregistration(reg_fn, clear_fn, list)
local override = function (key, redef)
if type(key) ~= "string" then
error("key is not a string", 2)
end
local def = list[key]
if not def then
error("Attempt to override non-existent element - '" .. key .. "'", 2)
end
for k, v in pairs(redef) do
rawset(def, k, v)
end
local temporary_list = table.copy(list)
clear_fn()
for k,v in pairs(temporary_list) do
if key ~= k then
reg_fn(v)
else
reg_fn(def)
end
end
end
local unregister = function (key) local unregister = function (key)
if type(key) ~= "string" then if type(key) ~= "string" then
error("key is not a string", 2) error("key is not a string", 2)
@ -480,7 +506,17 @@ local function make_wrap_deregistration(reg_fn, clear_fn, list)
end end
end end
end end
return unregister return override, unregister
end
local function make_wrap_reregistration(reg_fn, clear_fn, list)
local reregistration = function ()
local temporary_list = table.copy(list)
clear_fn()
for _,v in pairs(temporary_list) do
reg_fn(v)
end
end
return reregistration
end end
core.registered_on_player_hpchanges = { modifiers = { }, loggers = { } } core.registered_on_player_hpchanges = { modifiers = { }, loggers = { } }
@ -521,9 +557,19 @@ core.registered_biomes = make_registration_wrap("register_biome", "cle
core.registered_ores = make_registration_wrap("register_ore", "clear_registered_ores") core.registered_ores = make_registration_wrap("register_ore", "clear_registered_ores")
core.registered_decorations = make_registration_wrap("register_decoration", "clear_registered_decorations") core.registered_decorations = make_registration_wrap("register_decoration", "clear_registered_decorations")
core.unregister_biome = make_wrap_deregistration(core.register_biome, core.override_biome, core.unregister_biome = make_wrap_override_deregistration(core.register_biome,
core.clear_registered_biomes, core.registered_biomes) core.clear_registered_biomes, core.registered_biomes)
core.override_ore, core.unregister_ore = make_wrap_override_deregistration(core.register_ore,
core.clear_registered_ores, core.registered_ores)
core.reregister_ores = make_wrap_reregistration(core.register_ore,
core.clear_registered_ores, core.registered_ores)
core.override_decoration, core.unregister_decoration = make_wrap_override_deregistration(core.register_decoration,
core.clear_registered_decorations, core.registered_decorations)
core.reregister_decorations = make_wrap_reregistration(core.register_decoration,
core.clear_registered_decorations, core.registered_decorations)
local make_registration = builtin_shared.make_registration local make_registration = builtin_shared.make_registration
local make_registration_reverse = builtin_shared.make_registration_reverse local make_registration_reverse = builtin_shared.make_registration_reverse

View File

@ -5466,21 +5466,44 @@ Call these functions only at load time!
* Returns an integer object handle uniquely identifying the registered * Returns an integer object handle uniquely identifying the registered
ore on success. ore on success.
* The order of ore registrations determines the order of ore generation. * The order of ore registrations determines the order of ore generation.
* `minetest.override_ore(name, ore definition)`
* Override existing ore.
* `minetest.unregister_ore(name)`
* Unregisters the decoration from the engine, and deletes the entry with key
`name` from `minetest.registered_decorations`.
* `minetest.reregister_ores()`
* Clears all ores currently registered and register them again.
* Can be used after overriding/unregistering biome/bimes.
* `minetest.register_biome(biome definition)` * `minetest.register_biome(biome definition)`
* Returns an integer object handle uniquely identifying the registered * Returns an integer object handle uniquely identifying the registered
biome on success. To get the biome ID, use `minetest.get_biome_id`. biome on success. To get the biome ID, use `minetest.get_biome_id`.
* `minetest.override_biome(name, redefinition)`
* Override existing biome.
* Warning: This alters the biome to biome ID correspondences, so any
decorations or ores using the 'biomes' field must afterwards be cleared
and re-registered. Functions `minetest.reregister_decorations` and
`minetest.reregister_ores` can be used for it.
* `minetest.unregister_biome(name)` * `minetest.unregister_biome(name)`
* Unregisters the biome from the engine, and deletes the entry with key * Unregisters the biome from the engine, and deletes the entry with key
`name` from `minetest.registered_biomes`. `name` from `minetest.registered_biomes`.
* Warning: This alters the biome to biome ID correspondences, so any * Warning: This alters the biome to biome ID correspondences, so any
decorations or ores using the 'biomes' field must afterwards be cleared decorations or ores using the 'biomes' field must afterwards be cleared
and re-registered. and re-registered. Functions `minetest.reregister_decorations` and
`minetest.reregister_ores` can be used for it.
* `minetest.register_decoration(decoration definition)` * `minetest.register_decoration(decoration definition)`
* Returns an integer object handle uniquely identifying the registered * Returns an integer object handle uniquely identifying the registered
decoration on success. To get the decoration ID, use decoration on success. To get the decoration ID, use
`minetest.get_decoration_id`. `minetest.get_decoration_id`.
* The order of decoration registrations determines the order of decoration * The order of decoration registrations determines the order of decoration
generation. generation.
* `minetest.override_decoration(name, decoration definition)`
* Override existing decoration.
* `minetest.unregister_decoration(name)`
* Unregisters the decoration from the engine, and deletes the entry with key
`name` from `minetest.registered_decorations`.
* `minetest.reregister_decorations()`
* Clears all decorations currently registered and register them again.
* Can be used after overriding/unregistering biome/bimes.
* `minetest.register_schematic(schematic definition)` * `minetest.register_schematic(schematic definition)`
* Returns an integer object handle uniquely identifying the registered * Returns an integer object handle uniquely identifying the registered
schematic on success. schematic on success.
@ -5493,7 +5516,8 @@ Call these functions only at load time!
* Clears all biomes currently registered. * Clears all biomes currently registered.
* Warning: Clearing and re-registering biomes alters the biome to biome ID * Warning: Clearing and re-registering biomes alters the biome to biome ID
correspondences, so any decorations or ores using the 'biomes' field must correspondences, so any decorations or ores using the 'biomes' field must
afterwards be cleared and re-registered. afterwards be cleared and re-registered. Functions `minetest.reregister_decorations` and
`minetest.reregister_ores` can be used for it.
* `minetest.clear_registered_decorations()` * `minetest.clear_registered_decorations()`
* Clears all decorations currently registered. * Clears all decorations currently registered.
* `minetest.clear_registered_ores()` * `minetest.clear_registered_ores()`
@ -9566,6 +9590,10 @@ See [Ores] section above for essential information.
```lua ```lua
{ {
name = "default:iron_ore_1",
-- Optional field name. This is used as key in minetest.registered_ores table.
-- Nameed ores can be overriden by minetest.override_ore function.
ore_type = "", ore_type = "",
-- Supported: "scatter", "sheet", "puff", "blob", "vein", "stratum" -- Supported: "scatter", "sheet", "puff", "blob", "vein", "stratum"
@ -9765,6 +9793,10 @@ See [Decoration types]. Used by `minetest.register_decoration`.
```lua ```lua
{ {
name = "default:grass_decoration",
-- Optional field name. Is used as key in minetest.registered_decorations table.
-- Named decorations can be overriden by minetest.override_decoration function.
deco_type = "simple", deco_type = "simple",
-- Type. "simple" or "schematic" supported -- Type. "simple" or "schematic" supported
@ -9928,7 +9960,7 @@ Chat command definition
Used by `minetest.register_chatcommand`. Used by `minetest.register_chatcommand`.
Specifies the function to be called and the privileges required when a player Specifies the function to be called and the privileges required when a player
issues the command. A help message that is the concatenation of the params and issues the command. A help message tdecorations the concatenation of the params and
description fields is shown when the "/help" chatcommand is issued. description fields is shown when the "/help" chatcommand is issued.
```lua ```lua

View File

@ -20,6 +20,12 @@ minetest.register_node("basenodes:desert_stone", {
groups = {cracky=3}, groups = {cracky=3},
}) })
minetest.register_node("basenodes:test_ore", {
description = "Test ore in stone",
tiles = {"default_stone.png^basenodes_test_ore.png"},
groups = {cracky=3},
})
minetest.register_node("basenodes:dirt_with_grass", { minetest.register_node("basenodes:dirt_with_grass", {
description = "Dirt with Grass", description = "Dirt with Grass",
tiles ={"default_grass.png", tiles ={"default_grass.png",

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 B

View File

@ -53,8 +53,10 @@ end
minetest.clear_registered_biomes() minetest.clear_registered_biomes()
minetest.clear_registered_decorations() minetest.clear_registered_decorations()
minetest.clear_registered_ores()
if minetest.settings:get_bool("devtest_register_biomes", true) then if minetest.settings:get_bool("devtest_register_biomes", true) then
minetest.log("action", "Devtest: register biomes")
minetest.register_biome({ minetest.register_biome({
name = "mapgen:grassland", name = "mapgen:grassland",
node_top = "basenodes:dirt_with_grass", node_top = "basenodes:dirt_with_grass",
@ -101,4 +103,85 @@ if minetest.settings:get_bool("devtest_register_biomes", true) then
heat_point = 50, heat_point = 50,
humidity_point = 50, humidity_point = 50,
}) })
minetest.register_biome({
name = "mapgen:desert",
node_top = "basenodes:desert_stone", -- error, to try override of it, to fix it
depth_top = 1,
node_filler = "basenodes:desert_sand",
depth_filler = 1,
node_riverbed = "basenodes:sand",
depth_riverbed = 2,
node_dungeon = "basenodes:cobble",
node_dungeon_alt = "basenodes:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = 31000,
y_min = 4,
heat_point = 60,
humidity_point = 40,
})
end
if minetest.settings:get_bool("devtest_override_biomes", true) then
minetest.log("action", "Devtest: override biomes")
minetest.override_biome("mapgen:desert", {
node_top = "basenodes:desert_sand"
})
end
if minetest.settings:get_bool("devtest_register_decorations", true) then
minetest.log("action", "Devtest: register decorations")
minetest.register_decoration({
name = "mapgen:junglegrass",
deco_type = "simple",
place_on = "basenodes:dirt_with_grass",
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.007,
spread = {x = 100, y = 100, z = 100},
seed = 329,
octaves = 3,
persist = 0.6
},
y_max = 30,
y_min = 1,
biomes = {"mapgen:grassland"},
decoration = "basenodes:leaves",
})
end
if minetest.settings:get_bool("devtest_override_decorations", true) then
minetest.log("action", "Devtest: override decorations")
minetest.override_decoration("mapgen:junglegrass", {
decoration = "basenodes:junglegrass"
})
minetest.reregister_decorations()
end
if minetest.settings:get_bool("devtest_register_ores", true) then
minetest.log("action", "Devtest: register ores")
minetest.register_ore({
name = "mapgen:test_ore",
ore_type = "scatter",
ore = "basenodes:desert_stone",
wherein = "basenodes:stone",
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = 31000,
y_min = -31000,
biomes = {"mapgen:grassland_under"}
})
end
if minetest.settings:get_bool("devtest_override_ores", true) then
minetest.log("action", "Devtest: override ores")
minetest.override_ore("mapgen:test_ore", {
ore = "basenodes:test_ore",
biomes = {"mapgen:grassland_under", "mapgen:grassland"},
})
minetest.reregister_ores()
end end

View File

@ -30,3 +30,18 @@ devtest_dungeon_mossycobble (Generate mossy cobblestone) bool false
# If enabled, some very basic biomes will be registered. # If enabled, some very basic biomes will be registered.
devtest_register_biomes (Register biomes) bool true devtest_register_biomes (Register biomes) bool true
# If enabled, minetest.override_biome function will be tested over some of registered biome/biomes.
devtest_overide_biomes (Override biomes) bool true
# If enabled, some very basic decorations will be registered.
devtest_register_decorations (Register decorations) bool true
# If enabled, minetest.override_decoration function will be tested over some of registered decoration/decorations.
devtest_overide_decorations (Override biomes) bool true
# If enabled, some very basic ores will be registered.
devtest_register_ores (Register ores) bool true
# If enabled, minetest.override_ore function will be tested over some of registered ore/ores.
devtest_overide_ores (Override ores) bool true