summaryrefslogtreecommitdiff
path: root/pilantern.lua
diff options
context:
space:
mode:
Diffstat (limited to 'pilantern.lua')
-rw-r--r--pilantern.lua141
1 files changed, 141 insertions, 0 deletions
diff --git a/pilantern.lua b/pilantern.lua
new file mode 100644
index 0000000..d2620f5
--- /dev/null
+++ b/pilantern.lua
@@ -0,0 +1,141 @@
+celevator.pi = {}
+
+local boringside = "[combine:64x64:0,0=celevator_cabinet_sides.png:32,0=celevator_cabinet_sides.png:0,32=celevator_cabinet_sides.png:32,32=celevator_cabinet_sides.png"
+local displaytex = boringside..":16,40=celevator_pi_background.png"
+
+minetest.register_entity("celevator:pi_entity",{
+ initial_properties = {
+ visual = "upright_sprite",
+ physical = false,
+ collisionbox = {0,0,0,0,0,0,},
+ textures = {"celevator_transparent.png",},
+ },
+})
+
+local function removeentity(pos)
+ local entitiesnearby = minetest.get_objects_inside_radius(pos,1.5)
+ for _,i in pairs(entitiesnearby) do
+ if i:get_luaentity() and i:get_luaentity().name == "celevator:pi_entity" then
+ i:remove()
+ end
+ end
+end
+
+local function generatetexture(text,uparrow,downarrow)
+ local out = "[combine:600x600:0,0=celevator_transparent.png"
+ for i=1,string.len(text),1 do
+ local char = string.byte(string.sub(text,i,i))
+ if char ~= " " then out = out..string.format(":%d,%d=celevator_pi_%02X.png",(i-1)*50+260,440,(char >= 0x20 and char < 0x7F and char or 0x2A)) end
+ end
+ if uparrow then out = out..":200,440=celevator_pi_arrow.png"
+ elseif downarrow then out = out..":200,440=(celevator_pi_arrow.png^[transformFY)" end
+ return out
+end
+
+function celevator.pi.updatedisplay(pos)
+ removeentity(pos)
+ local meta = minetest.get_meta(pos)
+ local text = meta:get_string("text")
+ local entity = minetest.add_entity(pos,"celevator:pi_entity")
+ local fdir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
+ local uparrow = meta:get_int("uparrow") > 0
+ local downarrow = meta:get_int("downarrow") > 0
+ local flash_fs = meta:get_int("flash_fs") > 0
+ local flash_is = meta:get_int("flash_is") > 0
+ local flashtimer = meta:get_int("flashtimer") > 0
+ local etex = generatetexture(text,uparrow,downarrow)
+ if flash_fs then
+ if flashtimer then etex = generatetexture(" FS",uparrow,downarrow) end
+ entity:set_properties({_flash_fs = true,_flash_is = false,})
+ elseif flash_is then
+ if flashtimer then etex = generatetexture(" IS",uparrow,downarrow) end
+ entity:set_properties({_flash_fs = false,_flash_is = true,})
+ else
+ entity:set_properties({_flash_fs = false,_flash_is = false,})
+ end
+ entity:set_properties({textures={etex}})
+ entity:set_yaw((fdir.x ~= 0) and math.pi/2 or 0)
+ entity:setpos(vector.add(pos,vector.multiply(fdir,-0.61)))
+end
+
+function celevator.pi.flash(pos,what)
+ if minetest.get_item_group(minetest.get_node(pos).name,"_celevator_pi") ~= 1 then return end
+ local meta = minetest.get_meta(pos)
+ if what == "FS" then
+ meta:set_int("flash_is",0)
+ meta:set_int("flash_fs",1)
+ elseif what == "IS" then
+ meta:set_int("flash_is",1)
+ meta:set_int("flash_fs",0)
+ else
+ meta:set_int("flash_is",0)
+ meta:set_int("flash_fs",0)
+ end
+ celevator.pi.updatedisplay(pos)
+end
+
+function celevator.pi.settext(pos,text)
+ if minetest.get_item_group(minetest.get_node(pos).name,"_celevator_pi") ~= 1 then return end
+ local meta = minetest.get_meta(pos)
+ if string.len(text) < 3 then
+ text = string.rep(" ",3-string.len(text))..text
+ end
+ meta:set_string("text",string.sub(text,1,3))
+ celevator.pi.updatedisplay(pos)
+end
+
+function celevator.pi.setarrow(pos,which,active)
+ if minetest.get_item_group(minetest.get_node(pos).name,"_celevator_pi") ~= 1 then return end
+ local meta = minetest.get_meta(pos)
+ if which == "up" then
+ meta:set_int("uparrow",active and 1 or 0)
+ elseif which == "down" then
+ meta:set_int("downarrow",active and 1 or 0)
+ end
+ celevator.pi.updatedisplay(pos)
+end
+
+minetest.register_node("celevator:pi",{
+ description = "Position Indicator",
+ groups = {
+ dig_immediate = 2,
+ _celevator_pi = 1,
+ },
+ tiles = {
+ boringside,
+ boringside,
+ boringside,
+ boringside,
+ boringside,
+ displaytex,
+ },
+ paramtype = "light",
+ paramtype2 = "facedir",
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
+ {-0.25,-0.453, -0.6,0.25,-0.125, -0.5 },
+ },
+ },
+ on_destruct = removeentity,
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("text","621")
+ celevator.pi.updatedisplay(pos)
+ end,
+})
+
+minetest.register_abm({
+ label = "Respawn / Flash PI displays",
+ nodenames = {"group:_celevator_pi"},
+ interval = 1,
+ chance = 1,
+ action = function(pos)
+ local meta = minetest.get_meta(pos)
+ local flashtimer = meta:get_int("flashtimer") > 0
+ meta:set_int("flashtimer",flashtimer and 0 or 1)
+ celevator.pi.updatedisplay(pos)
+ end,
+})