Register.lua: Throw error if node 'light_source' > core.LIGHT_MAX

Add 'core.LIGHT_MAX = 14' to builtin/game/constants.lua with the intention
to replace misplaced 'default.LIGHT_MAX = 14' in Minetest Game.
Add comment in light.h requiring the constant be changed in both places.
Add lighting bug warning to note in lua_api.txt.
There are hundreds of mod uses of 15 which causes a lighting bug.
This commit is contained in:
paramat 2016-09-15 22:40:19 +01:00
parent 297546af3d
commit 3aefa5d3ce
4 changed files with 16 additions and 3 deletions

@ -19,4 +19,9 @@ core.EMERGE_FROM_DISK = 3
core.EMERGE_GENERATED = 4 core.EMERGE_GENERATED = 4
-- constants.h -- constants.h
-- Size of mapblocks in nodes
core.MAP_BLOCKSIZE = 16 core.MAP_BLOCKSIZE = 16
-- light.h
-- Maximum value for node 'light_source' parameter
core.LIGHT_MAX = 14

@ -127,6 +127,9 @@ function core.register_item(name, itemdef)
fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}, fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8},
} }
end end
if itemdef.light_source and itemdef.light_source > core.LIGHT_MAX then
error("Unable to register node: 'light_source' exceeds maximum: " .. name)
end
setmetatable(itemdef, {__index = core.nodedef_default}) setmetatable(itemdef, {__index = core.nodedef_default})
core.registered_nodes[itemdef.name] = itemdef core.registered_nodes[itemdef.name] = itemdef
elseif itemdef.type == "craft" then elseif itemdef.type == "craft" then

@ -3664,7 +3664,10 @@ Definition tables
^ Don't forget to use "leveled" type nodebox. ]] ^ Don't forget to use "leveled" type nodebox. ]]
liquid_range = 8, -- number of flowing nodes around source (max. 8) liquid_range = 8, -- number of flowing nodes around source (max. 8)
drowning = 0, -- Player will take this amount of damage if no bubbles are left drowning = 0, -- Player will take this amount of damage if no bubbles are left
light_source = 0, -- Amount of light emitted by node (max. 14) light_source = 0, --[[
^ Amount of light emitted by node.
^ To set the maximum (currently 14), use the value 'minetest.LIGHT_MAX'.
^ A value outside the range 0 to minetest.LIGHT_MAX causes undefined behavior.]]
damage_per_second = 0, -- If player is inside node, this damage is caused damage_per_second = 0, -- If player is inside node, this damage is caused
node_box = {type="regular"}, -- See "Node boxes" node_box = {type="regular"}, -- See "Node boxes"
connects_to = nodenames, --[[ connects_to = nodenames, --[[

@ -27,8 +27,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/ */
// This directly sets the range of light. // This directly sets the range of light.
// Actually this is not the real maximum, and this is not the // Actually this is not the real maximum, and this is not the brightest, the
// brightest. The brightest is LIGHT_SUN. // brightest is LIGHT_SUN.
// If changed, this constant as defined in builtin/game/constants.lua must
// also be changed.
#define LIGHT_MAX 14 #define LIGHT_MAX 14
// Light is stored as 4 bits, thus 15 is the maximum. // Light is stored as 4 bits, thus 15 is the maximum.
// This brightness is reserved for sunlight // This brightness is reserved for sunlight