summaryrefslogtreecommitdiff
path: root/init.lua
diff options
context:
space:
mode:
authorcheapie <no-email-for-you@example.com>2018-09-15 21:16:24 -0500
committercheapie <no-email-for-you@example.com>2018-09-15 21:16:24 -0500
commit311a5cf8d35fa11942dcf0b348f1a86fa223b5da (patch)
treeb1e4c4a5745494646729237d1b1d49be83b714d0 /init.lua
downloaddigidisplay-311a5cf8d35fa11942dcf0b348f1a86fa223b5da.tar
digidisplay-311a5cf8d35fa11942dcf0b348f1a86fa223b5da.tar.gz
digidisplay-311a5cf8d35fa11942dcf0b348f1a86fa223b5da.tar.bz2
digidisplay-311a5cf8d35fa11942dcf0b348f1a86fa223b5da.tar.xz
digidisplay-311a5cf8d35fa11942dcf0b348f1a86fa223b5da.zip
Initial commit
Diffstat (limited to 'init.lua')
-rw-r--r--init.lua166
1 files changed, 166 insertions, 0 deletions
diff --git a/init.lua b/init.lua
new file mode 100644
index 0000000..6e23a8a
--- /dev/null
+++ b/init.lua
@@ -0,0 +1,166 @@
+local function removeEntity(pos)
+ local entitiesNearby = minetest.get_objects_inside_radius(pos,0.5)
+ for _,i in pairs(entitiesNearby) do
+ if i:get_luaentity().name == "digidisplay:text" then
+ i:remove()
+ end
+ end
+end
+
+local function generateTexture(fsize,text)
+ local defTiny = {lines = 16,lineLen = 32,size = 256,margin = 4}
+ local defSmall = {lines = 8,lineLen = 16,size = 128,margin = 4}
+ local defMedium = {lines = 4,lineLen = 8,size = 64,margin = 4}
+ local defLarge = {lines = 2,lineLen = 4,size = 32,margin = 4}
+ local defHuge = {lines = 1,lineLen = 2,size = 16,margin = 2}
+ local ddef
+ if fsize == "tiny" then ddef = defTiny
+ elseif fsize == "small" then ddef = defSmall
+ elseif fsize == "medium" then ddef = defMedium
+ elseif fsize == "large" then ddef = defLarge
+ elseif fsize == "huge" then ddef = defHuge end
+ if text == "" or not ddef then return "digidisplay_20.png" end
+ local out = string.format("[combine:%dx%d",ddef.size,ddef.size)
+ local line = 0
+ local pos = 0
+ local full = false
+ for i=1,string.len(text),1 do
+ local char = string.byte(string.sub(text,i,i))
+ if char == 0xA then
+ pos = 0
+ line = line + 1
+ if line >= ddef.lines then full = true end
+ elseif not full then
+ if char < 0x20 or char > 0x7A then
+ char = 0x3F
+ end
+ out = out..string.format(":%d,%d=digidisplay_%02x.png",pos*7+ddef.margin,line*14+ddef.margin,char)
+ pos = pos+1
+ if pos >= ddef.lineLen then
+ pos = 0
+ line = line + 1
+ end
+ if line >= ddef.lines then
+ full = true
+ end
+ end
+ end
+ return out
+end
+
+local function updateDisplay(pos)
+ removeEntity(pos)
+ local meta = minetest.get_meta(pos)
+ local text = meta:get_string("text")
+ local entity = minetest.add_entity(pos,"digidisplay:text")
+ local nname = minetest.get_node(pos).name
+ local fdir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
+ local etex = ""
+ if nname == "digidisplay:tiny" then
+ etex = generateTexture("tiny",text)
+ elseif nname == "digidisplay:small" then
+ etex = generateTexture("small",text)
+ elseif nname == "digidisplay:medium" then
+ etex = generateTexture("medium",text)
+ elseif nname == "digidisplay:large" then
+ etex = generateTexture("large",text)
+ elseif nname == "digidisplay:huge" then
+ etex = generateTexture("huge",text)
+ else
+ return
+ 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.39)))
+end
+
+minetest.register_entity("digidisplay:text",{
+ initial_properties = {
+ visual = "upright_sprite",
+ physical = false,
+ collisionbox = {0,0,0,0,0,0,},
+ textures = {"digidisplay_20.png",},
+ },
+})
+
+for _,i in pairs({"tiny","small","medium","large","huge"}) do
+ minetest.register_node(string.format("digidisplay:%s",i),{
+ description = string.format("Digilines Display (%s font)",i),
+ tiles = {"digidisplay_bg.png",},
+ groups = {cracky=3,digidisplay_lbm=1},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ on_rotate = screwdriver and screwdriver.rotate_simple,
+ drawtype = "nodebox",
+ inventory_image = string.format("digidisplay_inventory_%s.png",i),
+ node_box = {
+ type = "fixed",
+ fixed = {-0.5,-0.5,0.4,0.5,0.5,0.5},
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec","field[channel;Channel;${channel}]")
+ end,
+ on_destruct = removeEntity,
+ on_receive_fields = function(pos,_,fields,sender)
+ local name = sender:get_player_name()
+ if not fields.channel then return end
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,"protection_bypass") then
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ meta:set_string("channel",fields.channel)
+ end,
+ digiline = {
+ wire = {
+ rules = digiline.rules.default,
+ },
+ effector = {
+ action = function(pos,_,channel,msg)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ if type(msg) ~= "string" or setchan ~= channel then return end
+ meta:set_string("text",msg)
+ updateDisplay(pos)
+ end,
+ },
+ },
+ })
+end
+
+minetest.register_lbm({
+ name = "digidisplay:respawn",
+ label = "Respawn entities",
+ nodenames = {"group:digidisplay_lbm"},
+ run_at_every_load = true,
+ action = updateDisplay,
+})
+
+minetest.register_craft({
+ output = "digidisplay:medium",
+ recipe = {
+ {"mesecons_lightstone:lightstone_orange_off","mesecons_lightstone:lightstone_orange_off","mesecons_lightstone:lightstone_orange_off",},
+ {"mesecons_lightstone:lightstone_orange_off","digilines:wire_std_00000000","mesecons_lightstone:lightstone_orange_off",},
+ {"mesecons_lightstone:lightstone_orange_off","mesecons_lightstone:lightstone_orange_off","mesecons_lightstone:lightstone_orange_off",},
+ },
+})
+
+local shapelessCrafts = {
+ ["digidisplay:small 2"] = {"digidisplay:tiny"},
+ ["digidisplay:medium 2"] = {"digidisplay:small"},
+ ["digidisplay:large 2"] = {"digidisplay:medium"},
+ ["digidisplay:huge 2"] = {"digidisplay:large"},
+ ["digidisplay:large"] = {"digidisplay:huge","digidisplay:huge"},
+ ["digidisplay:medium"] = {"digidisplay:large","digidisplay:large"},
+ ["digidisplay:small"] = {"digidisplay:medium","digidisplay:medium"},
+ ["digidisplay:tiny"] = {"digidisplay:small","digidisplay:small"},
+}
+
+for k,v in pairs(shapelessCrafts) do
+ minetest.register_craft({
+ type = "shapeless",
+ output = k,
+ recipe = v,
+ })
+end