summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcheapie <no-email-for-you@example.com>2016-05-31 23:39:00 -0500
committercheapie <no-email-for-you@example.com>2016-05-31 23:39:00 -0500
commit383858ba9f6a4e2d857a2831bda14b4b73c05a6d (patch)
tree55da9acd7ee96d7a89d95e9a7ab9a90fd79a3ff3
parent37b1b19f4d0e2c88566e2caa1d3f0cb9fce457ca (diff)
downloadrgblightstone-383858ba9f6a4e2d857a2831bda14b4b73c05a6d.tar
rgblightstone-383858ba9f6a4e2d857a2831bda14b4b73c05a6d.tar.gz
rgblightstone-383858ba9f6a4e2d857a2831bda14b4b73c05a6d.tar.bz2
rgblightstone-383858ba9f6a4e2d857a2831bda14b4b73c05a6d.tar.xz
rgblightstone-383858ba9f6a4e2d857a2831bda14b4b73c05a6d.zip
Convert to entity-based system and use colors in chat messages
-rw-r--r--README27
-rw-r--r--init.lua263
-rw-r--r--textures/rgblightstone_gray.pngbin107 -> 0 bytes
3 files changed, 141 insertions, 149 deletions
diff --git a/README b/README
index 7e726a7..9efeeb7 100644
--- a/README
+++ b/README
@@ -2,7 +2,6 @@ RGB Lightstones for Minetest
License:
---Code: WTFPL
----Textures: WTFPL (made by VanessaE)
Depends: mesecons_lightstone, digilines?
@@ -13,12 +12,6 @@ Instructions (with digilines):
red lightstone luacontroller blue lightstone
nothing digiline nothing
-or, if you don't have luacontrollers:
-
- nothing green lightstone nothing
- red lightstone mesecon blue lightstone
- nothing mesecon nothing
-
* Place the thing
* Right-click and set a channel
* Send a digilines message to it on that channel with the color you want (choices listed below)
@@ -28,25 +21,7 @@ Instructions (without digilines):
You'll have to use /give or /giveme. The node names follow the pattern "rgblightstone:lightstone_color", where "color" is replaced with the color (see below).
-Colors:
-
-Edit the settings at the top of init.lua to change what colors are available. The 16 colors from 16-color mode are always available.
-
-16 color mode:
-off, black, blue, brown, cyan, darkblue, darkcyan, darkgray, darkgreen, darkmagenta, darkred, gray, green, magenta, red, white, yellow
-
-512 color mode:
-Same as 4096-color (below), but only even digits work (so "EEAA88" works but "55BBFF" doesn't).
-
-4096 color mode:
-Any 6-digit hex value where the two digits for each part are the same. For example, "00FF66" and "112233" work, but "5678AC" will not.
-
-"True Color" mode:
-While the code is present, engine limitations do not allow this many nodes to be registered. If this ever changes, any hex value (such as "237AF0" or "C0FFEE") will work.
-
-Adding more colors:
-
-Call rgblightstone.add(name,color) - "name" is what digilines message should switch to it, and "color" is a hex color.
+Colors available: Any 6-digit hex color, such as "FF0000", "#c0ffee", "123456"...
Group addressing mode:
diff --git a/init.lua b/init.lua
index 9ca521a..951b7ab 100644
--- a/init.lua
+++ b/init.lua
@@ -1,9 +1,12 @@
rgblightstone = {}
---If neither of the following are on, only the 16 colors listed in the readme will be available
-rgblightstone.sortaextracolors = true -- 512 Color Mode
-rgblightstone.extracolors = false -- 4096 Color Mode
-rgblightstone.insanecolors = false -- "True Color" Mode (DOES NOT WORK - the engine does not allow this many nodes to be registered. If it ever does, however...)
-rgblightstone.colors = {}
+
+if type(minetest.colorize) == "function" then
+ rgblightstone.colorize = minetest.colorize
+else
+ rgblightstone.colorize = function(color,text)
+ return text
+ end
+end
function rgblightstone.autofill(pos,player)
local meta = minetest.get_meta(pos)
@@ -21,138 +24,152 @@ function rgblightstone.autofill(pos,player)
meta:set_string("channel",channel)
meta:set_string("addrx",addrx)
meta:set_string("addry",addry)
- minetest.chat_send_player(player:get_player_name(),"Successfully auto-filled with channel "..channel..", X address "..addrx..", and Y address "..addry..".")
+ minetest.chat_send_player(player:get_player_name(),rgblightstone.colorize("#55FF55","Success: ").."Auto-filled with channel "..rgblightstone.colorize("#00FFFF",channel)..", X address "..rgblightstone.colorize("#00FFFF",addrx)..", and Y address "..rgblightstone.colorize("#00FFFF",addry)..".")
meta:set_string("infotext","")
else
- minetest.chat_send_player(player:get_player_name(),"Node above is not RGB Lightstone or is not configured correctly!")
+ minetest.chat_send_player(player:get_player_name(),rgblightstone.colorize("#FF0000","ERROR: ").."Node above is not RGB Lightstone or is not configured correctly!")
end
end
end
-function rgblightstone.add(name,color)
- table.insert(rgblightstone.colors,name)
- minetest.register_node("rgblightstone:lightstone_" .. name, {
- tiles = name == "off" and {"jeija_lightstone_darkgray_off.png"} or {"rgblightstone_gray.png^[colorize:#"..color.."CC"},
- drop = "rgblightstone:lightstone_off",
- groups = name == "off" and {cracky=2} or {cracky=2,not_in_creative_inventory=1},
- description="RGB Lightstone ("..name..")",
- sounds = default.node_sound_stone_defaults(),
- on_construct = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("formspec", "size[8,5;]field[1,1;6,2;channel;Channel;${channel}]field[1,2;2,2;addrx;X Address;${addrx}]field[5,2;2,2;addry;Y Address;${addry}]button_exit[2.25,3;3,1;submit;Save]button_exit[2.25,4;3,1;autofill;Auto-Fill From Node Above]label[3,2;Leave address blank\nfor individual mode]")
- meta:set_string("infotext","Not configured! Right-click to set up manually, or punch to auto-fill from the node above.")
- end,
- on_punch = function(pos, node, player, pointed_thing)
- rgblightstone.autofill(pos,player)
- end,
- on_receive_fields = function(pos, formname, fields, sender)
- local meta = minetest.get_meta(pos)
- if fields.autofill then
- rgblightstone.autofill(pos,sender)
- else
- if fields.channel then
- meta:set_string("channel", fields.channel)
- meta:set_string("infotext","")
- end
- if fields.addrx then meta:set_string("addrx",fields.addrx) end
- if fields.addry then meta:set_string("addry",fields.addry) end
+minetest.register_entity("rgblightstone:entity",{
+ hp_max = 1,
+ physical = false,
+ collisionbox = {0,0,0,0,0,0},
+ visual_size = {x=1.003, y=1.003},
+ visual = "cube",
+ is_visible = true
+})
+
+minetest.register_node("rgblightstone:rgblightstone", {
+ tiles = {"jeija_lightstone_darkgray_off.png^[colorize:#000000FF"},
+ groups = {cracky=2},
+ sunlight_propagates = true,
+ paramtype = "light",
+ description = "RGB Lightstone",
+ sounds = default.node_sound_stone_defaults(),
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec", "size[8,5;]field[1,1;6,2;channel;Channel;${channel}]field[1,2;2,2;addrx;X Address;${addrx}]field[5,2;2,2;addry;Y Address;${addry}]button_exit[2.25,3;3,1;submit;Save]button_exit[2.25,4;3,1;autofill;Auto-Fill From Node Above]label[3,2;Leave address blank\nfor individual mode]")
+ meta:set_string("infotext","Not configured! Right-click to set up manually, or punch to auto-fill from the node above.")
+ meta:set_string("color","000000")
+ end,
+ on_destruct = function(pos)
+ local objs = minetest.get_objects_inside_radius(pos,0.5)
+ for _,obj in ipairs(objs) do
+ if obj:get_luaentity().name == "rgblightstone:entity" then
+ obj:remove()
+ end
+ end
+ end,
+ on_punch = function(pos, node, player, pointed_thing)
+ rgblightstone.autofill(pos,player)
+ end,
+ on_receive_fields = function(pos, formname, fields, sender)
+ local meta = minetest.get_meta(pos)
+ if fields.autofill then
+ rgblightstone.autofill(pos,sender)
+ else
+ if fields.channel then
+ meta:set_string("channel", fields.channel)
+ meta:set_string("infotext","")
end
- end,
- light_source = name ~= "off" and default.LIGHT_MAX-2 or 0,
- digiline = {
- receptor = {},
- effector = {
- action = function(pos, node, channel, msg)
- local channel_set = minetest.get_meta(pos):get_string("channel")
- local xaddr = minetest.get_meta(pos):get_string("addrx")
- local yaddr = minetest.get_meta(pos):get_string("addry")
- if channel==channel_set and msg ~= nil then
- if xaddr ~= nil and xaddr ~= "" and yaddr ~= nil and yaddr ~= "" and type(msg) == "table" then
- for _,color in ipairs(rgblightstone.colors) do
- if msg[tonumber(yaddr)] ~= nil and msg[tonumber(yaddr)][tonumber(xaddr)] ~= nil and msg[tonumber(yaddr)][tonumber(xaddr)] == color and msg[tonumber(yaddr)][tonumber(xaddr)] ~= minetest.get_node(pos).color then
- minetest.swap_node(pos, {name = "rgblightstone:lightstone_"..color})
- end
- end
- elseif type(msg) == "string" then
- for _,color in ipairs(rgblightstone.colors) do
- if msg == color and msg ~= minetest.get_node(pos).color then
- minetest.swap_node(pos, {name = "rgblightstone:lightstone_"..color})
- end
- end
- end
+ if fields.addrx then meta:set_string("addrx",fields.addrx) end
+ if fields.addry then meta:set_string("addry",fields.addry) end
+ end
+ end,
+ light_source = 0,
+ digiline = {
+ receptor = {},
+ effector = {
+ action = function(pos, node, channel, msg)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ if channel ~= setchan then
+ return
+ end
+
+ local addrx = tonumber(meta:get_string("addrx"))
+ local addry = tonumber(meta:get_string("addry"))
+
+ if type(msg) == "table" then
+ if not (addrx and addry and type(msg[addry]) == "table" and msg[addry][addrx]) then
+ return
end
+ msg = msg[addry][addrx]
end
- }
- }
- })
-end
-rgblightstone.add("off",nil)
-rgblightstone.add("red","FF5555")
-rgblightstone.add("green","55FF55")
-rgblightstone.add("blue","5555FF")
-rgblightstone.add("cyan","55FFFF")
-rgblightstone.add("magenta","FF55FF")
-rgblightstone.add("yellow","FFFF55")
-rgblightstone.add("gray","AAAAAA")
-rgblightstone.add("darkred","AA0000")
-rgblightstone.add("darkgreen","00AA00")
-rgblightstone.add("darkblue","0000AA")
-rgblightstone.add("darkcyan","00AAAA")
-rgblightstone.add("darkmagenta","AA00AA")
-rgblightstone.add("brown","AA5500")
-rgblightstone.add("darkgray","555555")
-rgblightstone.add("white","FFFFFF")
-rgblightstone.add("black","000000")
-if rgblightstone.sortaextracolors and not rgblightstone.insanecolors and not rgblightstone.extracolors then
- for r=0x0,0xFF,0x22 do
- for g=0x0,0xFF,0x22 do
- for b=0x0,0xFF,0x22 do
- local color = string.format("%02X%02X%02X",r,g,b)
- rgblightstone.add(color,color)
- end
- end
- end
-end
+ --Validation starts here
+ if type(msg) ~= "string" then
+ return
+ end
+ msg = string.upper(msg)
+ --Drop a leading # if present (e.g. "#FF55AA")
+ if string.sub(msg,1,1) == "#" then
+ msg = string.sub(msg,2)
+ end
+ --Check length
+ if string.len(msg) ~= 6 then
+ return
+ end
+ --Make sure there aren't any invalid chars
+ local acceptable_chars = {["0"]=true,["1"]=true,["2"]=true,["3"]=true,["4"]=true,["5"]=true,["6"]=true,["7"]=true,["8"]=true,["9"]=true,["A"]=true,["B"]=true,["C"]=true,["D"]=true,["E"]=true,["F"]=true}
+ for i = 1,6,1 do
+ if not acceptable_chars[string.sub(msg,i,i)] then
+ return
+ else
+ end
+ end
+ --Should be a valid hex color by this point
+
+ --Remove old entity, if present
+ local objs = minetest.get_objects_inside_radius(pos,0.5)
+ for _,obj in ipairs(objs) do
+ if obj:get_luaentity().name == "rgblightstone:entity" then
+ obj:remove()
+ end
+ end
-if rgblightstone.extracolors and not rgblightstone.insanecolors then
- for r=0x0,0xFF,0x11 do
- for g=0x0,0xFF,0x11 do
- for b=0x0,0xFF,0x11 do
- local color = string.format("%02X%02X%02X",r,g,b)
- rgblightstone.add(color,color)
+ --Create a new entity
+ local obj = minetest.add_entity(pos,"rgblightstone:entity")
+
+ --Set to the correct color
+ meta:set_string("color",msg)
+ local tex = "jeija_lightstone_darkgray_off.png^[colorize:#"..msg.."FF"
+ obj:set_properties({textures = {tex,tex,tex,tex,tex,tex}})
end
- end
- end
-end
+ }
+ }
+})
-if rgblightstone.insanecolors then
- for r=0x0,0xFF,0x1 do
- for g=0x0,0xFF,0x1 do
- for b=0x0,0xFF,0x1 do
- local color = string.format("%02X%02X%02X",r,g,b)
- rgblightstone.add(color,color)
+minetest.register_lbm({
+ name = "rgblightstone:reset_entities",
+ nodenames = {"rgblightstone:rgblightstone"},
+ run_at_every_load = true,
+ action = function(pos)
+ local objs = minetest.get_objects_inside_radius(pos,0.5)
+ for _,obj in ipairs(objs) do
+ if obj:get_luaentity().name == "rgblightstone:entity" then
+ obj:remove()
end
end
+ local meta = minetest.get_meta(pos)
+ local color = meta:get_string("color")
+ if color == "" then
+ return
+ end
+ local tex = "jeija_lightstone_darkgray_off.png^[colorize:#"..color.."FF"
+ local obj = minetest.add_entity(pos,"rgblightstone:entity")
+ obj:set_properties({textures = {tex,tex,tex,tex,tex,tex}})
end
-end
+})
-if minetest.get_modpath("mesecons_luacontroller") and minetest.get_modpath("digilines") then
- minetest.register_craft({
- output = "rgblightstone:lightstone_off",
- recipe = {
- {"","mesecons_lightstone:lightstone_green_off",""},
- {"mesecons_lightstone:lightstone_red_off","mesecons_luacontroller:luacontroller0000","mesecons_lightstone:lightstone_blue_off"},
- {"","digilines:wire_std_00000000",""}
- }
- })
-else
- minetest.register_craft({
- output = "rgblightstone:lightstone_off",
- recipe = {
- {"","mesecons_lightstone:lightstone_green_off",""},
- {"mesecons_lightstone:lightstone_red_off","group:mesecon_conductor_craftable","mesecons_lightstone:lightstone_blue_off"},
- {"","group:mesecon_conductor_craftable",""}
- }
- })
-end
+
+minetest.register_craft({
+ output = "rgblightstone:lightstone",
+ recipe = {
+ {"","mesecons_lightstone:lightstone_green_off",""},
+ {"mesecons_lightstone:lightstone_red_off","mesecons_luacontroller:luacontroller0000","mesecons_lightstone:lightstone_blue_off"},
+ {"","digilines:wire_std_00000000",""}
+ }
+})
diff --git a/textures/rgblightstone_gray.png b/textures/rgblightstone_gray.png
deleted file mode 100644
index 329e5cf..0000000
--- a/textures/rgblightstone_gray.png
+++ /dev/null
Binary files differ