131 lines
4.3 KiB
Lua
131 lines
4.3 KiB
Lua
--[===================================================================[--
|
|
|
|
Digiplay - Copyright © 2017 Pedro Gimeno Fortea.
|
|
|
|
This file is part of the package Digiplay. Both copying and distribution
|
|
of this package are permitted, with or without modification, under the
|
|
sole condition that any copyright notices and this notice are preserved.
|
|
This package is offered as-is, without any warranty express or implied.
|
|
|
|
--]===================================================================]--
|
|
|
|
-- Informative note: The textures included in the package are under the
|
|
-- same license; the files include a valid tEXt chunk with the copyright
|
|
-- and license notice.
|
|
|
|
-------------------------------------------------------------------------
|
|
|
|
-- Minetest 0.4.16+ required for colour changing.
|
|
|
|
-------------------------------------------------------------------------
|
|
|
|
|
|
local function multicolour_light_on_punch(pos, node, puncher, pointed_thing)
|
|
local channel = minetest.get_meta(pos):get_string("digich")
|
|
if channel == "" then
|
|
return
|
|
end
|
|
digiline:receptor_send(pos, digiline.rules.default, channel, "L " .. puncher:get_player_name())
|
|
end
|
|
|
|
local function multicolour_light_on_rightclick(pos, node, clicker, itemstack,
|
|
pointed_thing)
|
|
local channel = minetest.get_meta(pos):get_string("digich")
|
|
if channel == "" then
|
|
return
|
|
end
|
|
digiline:receptor_send(pos, digiline.rules.default, channel, "R " .. clicker:get_player_name())
|
|
end
|
|
|
|
local function multicolour_light_on_construct(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", "field[channel;Digiline Channel;]")
|
|
end
|
|
|
|
local function multicolour_light_on_receive_fields(pos, formname, fields, sender)
|
|
if fields.channel and fields.channel ~= "" then
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", "")
|
|
meta:set_string("digich", fields.channel)
|
|
end
|
|
end
|
|
|
|
local function multicolour_light_effector_action(pos, node, channel, msg)
|
|
local configured_channel = minetest.get_meta(pos):get_string("digich")
|
|
if channel == configured_channel and type(msg) == "string" then
|
|
local node = minetest.get_node(pos)
|
|
local onoff, colour = msg:match("^([^#]*)#?(%x-)$")
|
|
if onoff == "off" and node.name == "digiplay:multicolour_light_on" then
|
|
node.name = "digiplay:multicolour_light"
|
|
elseif onoff == "on" and node.name == "digiplay:multicolour_light" then
|
|
node.name = "digiplay:multicolour_light_on"
|
|
end
|
|
if colour ~= "" and colour ~= nil then
|
|
local base
|
|
if colour:match("^%x%x%x%x%x%x$") then
|
|
base = 256
|
|
elseif colour:match("^%x%x%x$") then
|
|
base = 16
|
|
end
|
|
|
|
if base then
|
|
local r = tonumber(colour, 16)
|
|
local b = r % base
|
|
r = (r - b) / base
|
|
local g = r % base
|
|
r = (r - g) / base
|
|
node.param2 = math.floor(g*5/base)*25 + math.floor(r*5/base)*5 + math.floor(b*5/base) + 1
|
|
if node.param2 == 125 then node.param2 = 0 end
|
|
end
|
|
end
|
|
minetest.swap_node(pos, node)
|
|
end
|
|
end
|
|
|
|
|
|
for i = 0, 1 do
|
|
local onoff = i == 0 and "" or "_on"
|
|
local node_definition = {
|
|
description = "Multi-coloured light";
|
|
tiles = {"digiplay_multicolour_light" .. onoff .. ".png"};
|
|
groups = {dig_immediate = 2};
|
|
|
|
drawtype = "color";
|
|
paramtype2 = "color";
|
|
palette = "digiplay_palette.png";
|
|
place_param2 = 0;
|
|
|
|
on_receive_fields = multicolour_light_on_receive_fields;
|
|
on_punch = multicolour_light_on_punch;
|
|
on_construct = multicolour_light_on_construct;
|
|
on_rightclick = multicolour_light_on_rightclick;
|
|
digiline = {
|
|
receptor = {
|
|
rules = digiline.rules.default;
|
|
};
|
|
effector = {
|
|
rules = digiline.rules.default;
|
|
action = multicolour_light_effector_action;
|
|
};
|
|
};
|
|
}
|
|
|
|
if i == 1 then
|
|
node_definition.light_source = 12
|
|
node_definition.drop = "digiplay:multicolour_light"
|
|
node_definition.groups.not_in_creative_inventory = 1
|
|
end
|
|
minetest.register_node("digiplay:multicolour_light" .. onoff, node_definition)
|
|
end
|
|
|
|
minetest.register_craft {
|
|
output = "digiplay:multicolour_light";
|
|
recipe = {
|
|
{"", "digilines:wire_std_00000000", ""},
|
|
{"default:clay", "default:mese_crystal_fragment", "default:clay"},
|
|
{"dye:red", "dye:green", "dye:blue"}
|
|
};
|
|
}
|
|
|
|
print("[mod] digiplay successfully loaded!")
|