celevator.pi = {} celevator.lantern = {} 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",}, static_save = false, }, }) minetest.register_entity("celevator:incar_pi_entity",{ initial_properties = { visual = "upright_sprite", physical = false, collisionbox = {0,0,0,0,0,0,}, textures = {"celevator_transparent.png",}, _flashtimer = 0, _machinepos = "", static_save = false, }, }) function celevator.pi.removeentity(pos) local entitiesnearby = minetest.get_objects_inside_radius(pos,0.5) for _,i in pairs(entitiesnearby) do if i:get_luaentity() and (i:get_luaentity().name == "celevator:pi_entity" or i:get_luaentity().name == "celevator:incar_pi_entity") then i:remove() end end end function celevator.pi.generatetexture(text,uparrow,downarrow,lanternoffset,carbg) local out = "[combine:600x600:0,0=celevator_transparent.png" if carbg then out = out..":0,0=celevator_pi_background_incar.png" end local yp = 440 if lanternoffset then yp = 290 end 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,yp,(char >= 0x20 and char < 0x7F and char or 0x2A)) end end if uparrow then out = out..string.format(":200,%d=celevator_pi_arrow.png",yp) elseif downarrow then out = out..string.format(":200,%d=(celevator_pi_arrow.png^[transformFY)",yp) end return out end function celevator.pi.updatedisplay(pos) celevator.pi.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 islantern = minetest.get_item_group(minetest.get_node(pos).name,"_celevator_lantern") == 1 local etex = celevator.pi.generatetexture(text,uparrow,downarrow,islantern) if flash_fs then if flashtimer then etex = celevator.pi.generatetexture(" FS",uparrow,downarrow) end entity:set_properties({_flash_fs = true,_flash_is = false,}) elseif flash_is then if flashtimer then etex = celevator.pi.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:set_pos(vector.add(pos,vector.multiply(fdir,0.47))) 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.25,-0.453,0.475,0.25,-0.125,0.5}, }, }, on_destruct = celevator.pi.removeentity, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("text","--") celevator.pi.updatedisplay(pos) end, }) function celevator.lantern.setlight(pos,dir,newstate) local node = minetest.get_node(pos) if minetest.get_item_group(node.name,"_celevator_lantern") ~= 1 then return end if dir == "up" then if minetest.get_item_group(node.name,"_celevator_lantern_has_up") ~= 1 then return end local lit = minetest.get_item_group(node.name,"_celevator_lantern_up_lit") == 1 if lit == newstate then return end local newname = "celevator:lantern_" if minetest.get_item_group(node.name,"_celevator_pi") == 1 then newname = "celevator:pilantern_" end if minetest.get_item_group(node.name,"_celevator_lantern_has_down") == 1 then newname = newname.."both" else newname = newname.."up" end if newstate then newname = newname.."_upon" minetest.sound_play("celevator_chime_up",{pos = pos},true) end if minetest.get_item_group(node.name,"_celevator_lantern_down_lit") == 1 then newname = newname.."_downon" end node.name = newname minetest.swap_node(pos,node) elseif dir == "down" then if minetest.get_item_group(node.name,"_celevator_lantern_has_down") ~= 1 then return end local lit = minetest.get_item_group(node.name,"_celevator_lantern_down_lit") == 1 if lit == newstate then return end local newname = "celevator:lantern_" if minetest.get_item_group(node.name,"_celevator_pi") == 1 then newname = "celevator:pilantern_" end if minetest.get_item_group(node.name,"_celevator_lantern_has_up") == 1 then newname = newname.."both" else newname = newname.."down" end if minetest.get_item_group(node.name,"_celevator_lantern_up_lit") == 1 then newname = newname.."_upon" end if newstate then newname = newname.."_downon" minetest.sound_play("celevator_chime_down",{pos = pos},true) end node.name = newname minetest.swap_node(pos,node) end end local function makepilanterntex(dir,upon,downon) local tex = boringside if dir == "up" then tex = tex..":16,24=celevator_pi_lantern_background_up.png" if upon then tex = tex..":26,49=celevator_lantern_up.png" end elseif dir == "down" then tex = tex..":16,24=celevator_pi_lantern_background_down.png" if downon then tex = tex..":27,49=celevator_lantern_down.png" end elseif dir == "both" then tex = tex..":16,24=celevator_pi_lantern_background_updown.png" if upon then tex = tex..":20,49=celevator_lantern_up.png" end if downon then tex = tex..":33,49=celevator_lantern_down.png" end end return(tex) end local function makelanterntex(dir,upon,downon) local tex = boringside if dir == "up" then tex = tex..":16,32=celevator_lantern_background_up.png" if upon then tex = tex..":26,36=celevator_lantern_up.png" end elseif dir == "down" then tex = tex..":16,32=celevator_lantern_background_down.png" if downon then tex = tex..":27,36=celevator_lantern_down.png" end elseif dir == "both" then tex = tex..":16,32=celevator_lantern_background_updown.png" if upon then tex = tex..":20,36=celevator_lantern_up.png" end if downon then tex = tex..":33,36=celevator_lantern_down.png" end end return(tex) end local validstates = { {"up",false,false,"Up"}, {"up",true,false,"Up"}, {"down",false,false,"Down"}, {"down",false,true,"Down"}, {"both",false,false,"Up and Down"}, {"both",true,false,"Up and Down"}, {"both",false,true,"Up and Down"}, {"both",true,true,"Up and Down"}, } for _,state in ipairs(validstates) do local nname = "celevator:pilantern_"..state[1] local dropname = nname if state[2] then nname = nname.."_upon" end if state[3] then nname = nname.."_downon" end local idle = not (state[2] or state[3]) local description = string.format("%s Position Indicator/Lantern Combo%s",state[4],(idle and "" or " (on state, you hacker you!)")) minetest.register_node(nname,{ description = description, groups = { dig_immediate = 2, not_in_creative_inventory = (idle and 0 or 1), _celevator_lantern = 1, _celevator_lantern_has_up = (state[1] == "down" and 0 or 1), _celevator_lantern_has_down = (state[1] == "up" and 0 or 1), _celevator_lantern_up_lit = (state[2] and 1 or 0), _celevator_lantern_down_lit = (state[3] and 1 or 0), _celevator_pi = 1, }, drop = dropname, tiles = { boringside, boringside, boringside, boringside, boringside, makepilanterntex(state[1],state[2],state[3]) }, paramtype = "light", paramtype2 = "facedir", on_destruct = celevator.pi.removeentity, drawtype = "nodebox", node_box = { type = "fixed", fixed = { {-0.25,-0.5,0.475,0.25,0.125,0.5}, }, }, }) nname = "celevator:lantern_"..state[1] dropname = nname if state[2] then nname = nname.."_upon" end if state[3] then nname = nname.."_downon" end idle = not (state[2] or state[3]) description = string.format("%s Lantern%s",state[4],(idle and "" or " (on state, you hacker you!)")) minetest.register_node(nname,{ description = description, groups = { dig_immediate = 2, not_in_creative_inventory = (idle and 0 or 1), _celevator_lantern = 1, _celevator_lantern_has_up = (state[1] == "down" and 0 or 1), _celevator_lantern_has_down = (state[1] == "up" and 0 or 1), _celevator_lantern_up_lit = (state[2] and 1 or 0), _celevator_lantern_down_lit = (state[3] and 1 or 0), }, drop = dropname, tiles = { boringside, boringside, boringside, boringside, boringside, makelanterntex(state[1],state[2],state[3]) }, paramtype = "light", paramtype2 = "facedir", drawtype = "nodebox", node_box = { type = "fixed", fixed = { {-0.25,-0.328,0.475,0.25,0,0.5}, }, }, }) 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, })