Under water shine improvements (#10)

Fixed light flicking.
Make it a little more extensability.
Make floodable items not emitting light underwater.
Add Hades Revisited support for underwater light.
master
sfence 2021-06-20 16:32:29 +02:00 committed by GitHub
parent 9efe4a90f7
commit 1c3cf421ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 34 deletions

View File

@ -5,6 +5,9 @@ local shiny_items = {}
--- Shining API ---
wielded_light = {}
wielded_light.lightable_nodes = {}
wielded_light.lighting_nodes = {}
function wielded_light.update_light(pos, light_level)
local around_vector = {
{x=0, y=0, z=0},
@ -18,16 +21,13 @@ function wielded_light.update_light(pos, light_level)
for _, around in ipairs(around_vector) do
light_pos = vector.add(pos, around)
local name = minetest.get_node(light_pos).name
if name == "air" and (minetest.get_node_light(light_pos) or 0) < light_level then
update_node = "wielded_light:"..light_level
if wielded_light.lightable_nodes[name] and (minetest.get_node_light(light_pos) or 0) < light_level then
update_node = wielded_light.lightable_nodes[name][light_level]
break
elseif name == "default:water_source" and (minetest.get_node_light(light_pos) or 0) < light_level then
update_node = "wielded_light:water_"..light_level
break
elseif name:sub(1,20) == "wielded_light:water_" then
local old_value = tonumber(name:sub(21))
elseif wielded_light.lighting_nodes[name] then -- Update existing light node and timer
local old_value = minetest.registered_nodes[name].light_source
if light_level > old_value then
update_node = "wielded_light:water_"..light_level
update_node = wielded_light.lighting_nodes[name][light_level]
else
timer = minetest.get_node_timer(light_pos)
local elapsed = timer:get_elapsed()
@ -36,23 +36,7 @@ function wielded_light.update_light(pos, light_level)
-- This node was not updated the last interval and may
-- is disabled before the next step
-- Therefore the light should be re-set to avoid flicker
update_node = "wielded_light:water_"..light_level
end
end
break
elseif name:sub(1,13) == "wielded_light" then -- Update existing light node and timer
local old_value = tonumber(name:sub(15))
if light_level > old_value then
update_node = "wielded_light:"..light_level
else
timer = minetest.get_node_timer(light_pos)
local elapsed = timer:get_elapsed()
if elapsed > (update_interval * 1.5) then
-- The timer is set to 3x update_interval
-- This node was not updated the last interval and may
-- is disabled before the next step
-- Therefore the light should be re-set to avoid flicker
update_node = "wielded_light:"..light_level
update_node = wielded_light.lighting_nodes[name][light_level]
end
end
break
@ -72,6 +56,13 @@ function wielded_light.update_light_by_item(item, pos)
if not light_level and not itemdef then
return
end
if itemdef and itemdef.floodable then
local node = minetest.get_node(pos)
local nodedef = minetest.registered_nodes[node.name]
if nodedef and nodedef.liquidtype ~= "none" then
return
end
end
light_level = light_level or ((itemdef.light_source or 0) - level_delta)
@ -84,12 +75,23 @@ function wielded_light.register_item_light(itemname, light_level)
shiny_items[itemname] = light_level
end
local water_def = minetest.registered_nodes["default:water_source"]
local water_name = "default:water_source"
if minetest.get_modpath("hades_core") then
water_name = "hades_core:water_source"
end
local water_def = minetest.registered_nodes[water_name]
-- Register helper nodes
wielded_light.lightable_nodes["air"] = {}
if water_def then
wielded_light.lightable_nodes[water_name] = {}
end
for i=1, 14 do
-- 14 air nodes
minetest.register_node("wielded_light:"..i, {
local node_name = "wielded_light:"..i
wielded_light.lightable_nodes["air"][i] = node_name
wielded_light.lighting_nodes[node_name] = wielded_light.lightable_nodes["air"]
minetest.register_node(node_name, {
drawtype = "airlike",
groups = {not_in_creative_inventory = 1},
walkable = false,
@ -106,7 +108,10 @@ for i=1, 14 do
--14 water nodes (only if default mod present)
if water_def then
minetest.register_node("wielded_light:water_"..i, {
local node_name = "wielded_light:water_"..i
wielded_light.lightable_nodes[water_name][i] = node_name
wielded_light.lighting_nodes[node_name] = wielded_light.lightable_nodes[water_name]
minetest.register_node(node_name, {
drawtype = "liquid",
tiles = water_def.tiles,
special_tiles = water_def.special_tiles,
@ -120,15 +125,16 @@ for i=1, 14 do
drop = "",
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "default:water_flowing",
liquid_alternative_source = "default:water_source",
liquid_alternative_flowing = "wielded_light:water_"..i,
liquid_alternative_source = "wielded_light:water_"..i,
liquid_viscosity = 1,
liquid_range = 0,
post_effect_color = water_def.post_effect_color,
groups = {not_in_creative_inventory = 1},
sounds = default.node_sound_water_defaults(),
sounds = water_def.sounds,
light_source = i,
on_timer = function(pos, elapsed)
minetest.swap_node(pos, {name = "default:water_source"})
minetest.swap_node(pos, {name = water_name})
end,
})
end
@ -162,8 +168,8 @@ end)
-- https://github.com/minetest/minetest/issues/6909
local builtin_item = minetest.registered_entities["__builtin:item"]
local item = {
on_step = function(self, dtime)
builtin_item.on_step(self, dtime)
on_step = function(self, dtime, ...)
builtin_item.on_step(self, dtime, ...)
self.shining_timer = (self.shining_timer or 0) + dtime
if self.shining_timer >= update_interval then

View File

@ -1 +1,2 @@
name = wielded_light
optional_depends = default, hades_core