init
This commit is contained in:
commit
0aa2d90f7d
85
init.lua
Normal file
85
init.lua
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
-- Wieldlight for mineclonia
|
||||||
|
-- supports mcl_offhand
|
||||||
|
-- License GPL3
|
||||||
|
-- cora, 2023
|
||||||
|
|
||||||
|
local UPDATE_INTERVAL = 1
|
||||||
|
local placed_lights = {}
|
||||||
|
local next_update = 0
|
||||||
|
|
||||||
|
for i=2,minetest.LIGHT_MAX do
|
||||||
|
minetest.register_node("mcl_wieldlight:light_"..i,{
|
||||||
|
drawtype = "airlike",
|
||||||
|
walkable = false,
|
||||||
|
pointable = false,
|
||||||
|
buildable_to = true,
|
||||||
|
drop = "",
|
||||||
|
light_source = i,
|
||||||
|
groups = { wieldlight = i },
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_player_light(pl)
|
||||||
|
local wield = pl:get_wielded_item():get_name()
|
||||||
|
local offhand = mcl_offhand.get_offhand(pl):get_name()
|
||||||
|
local wl = minetest.registered_items[wield] and minetest.registered_items[wield].light_source or 0
|
||||||
|
local ol = minetest.registered_items[offhand] and minetest.registered_items[offhand].light_source or 0
|
||||||
|
local light = math.min(math.max(wl,ol,0),minetest.LIGHT_MAX)
|
||||||
|
local p = vector.round(vector.offset(pl:get_pos(),0,1,0))
|
||||||
|
local ph = minetest.hash_node_position(p)
|
||||||
|
local n = minetest.get_node(p)
|
||||||
|
local has_light = false
|
||||||
|
local rm = {}
|
||||||
|
for h,v in pairs(placed_lights[pl] or {}) do
|
||||||
|
if light < 2 or ph ~= h then
|
||||||
|
table.insert(rm,v)
|
||||||
|
placed_lights[pl][h] = nil
|
||||||
|
else
|
||||||
|
has_light = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if light >= 2 and not has_light and n.name == "air" then
|
||||||
|
if not placed_lights[pl] then placed_lights[pl] = {} end
|
||||||
|
minetest.set_node(p,{name="mcl_wieldlight:light_"..light})
|
||||||
|
placed_lights[pl][ph] = p
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.bulk_set_node(rm,{name="air"}) --removal last otherwise you get flickering (and not nice flickering)
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_globalstep(function(dtime)
|
||||||
|
next_update = next_update - dtime
|
||||||
|
if next_update > 0 then return end
|
||||||
|
|
||||||
|
for _,pl in pairs(minetest.get_connected_players()) do
|
||||||
|
update_player_light(pl)
|
||||||
|
end
|
||||||
|
next_update = UPDATE_INTERVAL
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_leaveplayer(function(pl)
|
||||||
|
for h,v in pairs(placed_lights[pl]) do
|
||||||
|
minetest.remove_node(v)
|
||||||
|
end
|
||||||
|
placed_lights[pl] = nil
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_lbm({
|
||||||
|
label = "Remove oprphan wieldlights",
|
||||||
|
name = "mcl_wieldlight:remove_orphan_lights",
|
||||||
|
nodenames = {"group:wieldlight"},
|
||||||
|
run_at_every_load = true,
|
||||||
|
action = minetest.remove_node,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_on_mods_loaded(function()
|
||||||
|
for k,v in pairs(minetest.registered_items) do
|
||||||
|
if v.light_source and v.light_source >= 2 then --allow all light emitting items as offhand nodes
|
||||||
|
minetest.override_item(k,{
|
||||||
|
groups = table.update({offhand_item = 1},v.groups)
|
||||||
|
--use "reverse arg" table.update instead of the preferred table.merge to support legacy mcl2
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
Loading…
x
Reference in New Issue
Block a user