From 094bfbbfe3df777d6a1e9b6561d132566cae1a0e Mon Sep 17 00:00:00 2001 From: AiTechEye <40591179+AiTechEye@users.noreply.github.com> Date: Sat, 28 Jul 2018 08:04:04 +0200 Subject: [PATCH] Add files via upload --- craft.lua | 125 +++++++++++ depends.txt | 2 + description.txt | 1 + init.lua | 204 ++++++++++++++++++ misc.lua | 278 ++++++++++++++++++++++++ screenshot.png | Bin 0 -> 47974 bytes teleob.lua | 366 ++++++++++++++++++++++++++++++++ textures/mesetec_code.png | Bin 0 -> 235 bytes textures/mesetec_control.png | Bin 0 -> 503 bytes textures/mesetec_delayer.png | Bin 0 -> 856 bytes textures/mesetec_hack.png | Bin 0 -> 549 bytes textures/mesetec_hid.png | Bin 0 -> 133 bytes textures/mesetec_pos1.png | Bin 0 -> 230 bytes textures/mesetec_pos2.png | Bin 0 -> 237 bytes textures/mesetec_ptp.png | Bin 0 -> 445 bytes textures/mesetec_trap.png | Bin 0 -> 168 bytes textures/mesetec_trap2.png | Bin 0 -> 165 bytes textures/mesetec_ttp.png | Bin 0 -> 440 bytes textures/mesetec_ttp_target.png | Bin 0 -> 488 bytes textures/mesetecptp_keycard.png | Bin 0 -> 564 bytes textures/mesetecptp_target.png | Bin 0 -> 451 bytes tools.lua | 113 ++++++++++ 22 files changed, 1089 insertions(+) create mode 100644 craft.lua create mode 100644 depends.txt create mode 100644 description.txt create mode 100644 init.lua create mode 100644 misc.lua create mode 100644 screenshot.png create mode 100644 teleob.lua create mode 100644 textures/mesetec_code.png create mode 100644 textures/mesetec_control.png create mode 100644 textures/mesetec_delayer.png create mode 100644 textures/mesetec_hack.png create mode 100644 textures/mesetec_hid.png create mode 100644 textures/mesetec_pos1.png create mode 100644 textures/mesetec_pos2.png create mode 100644 textures/mesetec_ptp.png create mode 100644 textures/mesetec_trap.png create mode 100644 textures/mesetec_trap2.png create mode 100644 textures/mesetec_ttp.png create mode 100644 textures/mesetec_ttp_target.png create mode 100644 textures/mesetecptp_keycard.png create mode 100644 textures/mesetecptp_target.png create mode 100644 tools.lua diff --git a/craft.lua b/craft.lua new file mode 100644 index 0000000..8ee1e03 --- /dev/null +++ b/craft.lua @@ -0,0 +1,125 @@ +minetest.register_craft({ + output = "mesetec:nodeswitch", + recipe = {{"","mesecons:wire_00000000_off",""}, + {"mesecons_materials:silicon","mesecons_lamp:lamp_off","mesecons_materials:silicon"}, + {"","default:mese_crystal",""}, + } +}) + + +minetest.register_craft({ + output = "mesetec:objdec", + recipe = {{"mesecons_materials:silicon","mesecons_solarpanel:solar_panel_off","mesecons_materials:silicon"} + } +}) + + +minetest.register_craft({ + output = "mesetec:light", + recipe = {{"mesecons_materials:silicon","mesecons_solarpanel:solar_panel_off","mesecons_materials:silicon"} + } +}) + +minetest.register_craft({ + output = "mesetec:delayer", + recipe = {{"mesecons_delayer:delayer_off_1","default:copper_ingot","mesecons_delayer:delayer_off_1"}, + } +}) + + +minetest.register_craft({ + output = "mesetec:oxygen 3", + recipe = {{"","mesecons:wire_00000000_off",""}, + {"default:sand","mesecons_lamp:lamp_off","default:sand"}, + {"","default:torch",""}, + } +}) + +minetest.register_craft({ + output = "mesetec:dmg 3", + recipe = {{"","mesecons:wire_00000000_off",""}, + {"default:sand","mesecons_lamp:lamp_off","default:sand"}, + {"","default:mese_crystal",""}, + } +}) + +minetest.register_craft({ + output = "mesetec:ladder 3", + recipe = {{"","mesecons:wire_00000000_off",""}, + {"default:sand","mesecons_lamp:lamp_off","default:sand"}, + {"","default:ladder_wood",""}, + } +}) + + +minetest.register_craft({ + output = "mesetec:keycard", + recipe = {{"mesecons_materials:silicon","mesecons:wire_00000000_off","mesecons_materials:silicon"}, + {"mesecons_materials:silicon","mesecons_lamp:lamp_off","mesecons_materials:silicon"}, + } +}) + +minetest.register_craft({ + output = "mesetec:codelock", + recipe = {{"default:steel_ingot","mesecons:wire_00000000_off","default:steel_ingot"}, + {"default:steel_ingot","mesecons_luacontroller:luacontroller0000","default:steel_ingot"}, + {"default:steel_ingot","mesecons_lamp:lamp_off","default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "mesetec:controller", + recipe = {{"","mesecons:wire_00000000_off",""}, + {"default:steel_ingot","mesecons_walllever:wall_lever_off","default:steel_ingot"}, + {"","default:stick",""}, + } +}) + +minetest.register_craft({ + output = "mesetec:hacktool", + recipe = {{"mesecons:wire_00000000_off","","mesecons:wire_00000000_off"}, + {"default:steel_ingot","default:mese_crystal","default:steel_ingot"}, + {"","default:stick",""}, + } +}) + +minetest.register_craft({ + output = "mesetec:objdec", + recipe = {{"","mesecons:wire_00000000_off",""}, + {"","mesecons_detector:object_detector_off",""}, + {"","mesecons_luacontroller:luacontroller0000",""}, + } +}) + +minetest.register_craft({ + output = "mesetec:mtptarget", + recipe = {{"default:steel_ingot","mesecons:wire_00000000_off","default:steel_ingot"}, + {"default:steel_ingot","default:mese_crystal","default:steel_ingot"}, + {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "mesetec:mtp", + recipe = {{"default:steel_ingot","mesecons:wire_00000000_off","default:steel_ingot"}, + {"default:mese_crystal","mesecons_luacontroller:luacontroller0000","default:mese_crystal"}, + {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, + } +}) + + +minetest.register_craft({ + output = "mesetec:ptp", + recipe = {{"default:steel_ingot","mesecons:wire_00000000_off","default:steel_ingot"}, + {"default:mese_crystal_fragment","mesecons_detector:object_detector_off","default:mese_crystal_fragment"}, + {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "mesetec:ptptarget", + recipe = {{"default:steel_ingot","mesecons:wire_00000000_off","default:steel_ingot"}, + {"default:mese_crystal_fragment","mesecons_luacontroller:luacontroller0000","default:mese_crystal_fragment"}, + {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, + } +}) \ No newline at end of file diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..b599797 --- /dev/null +++ b/depends.txt @@ -0,0 +1,2 @@ +default +mesecons diff --git a/description.txt b/description.txt new file mode 100644 index 0000000..f8af19c --- /dev/null +++ b/description.txt @@ -0,0 +1 @@ +Extra and usefull mesecons stuff \ No newline at end of file diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..acd45c0 --- /dev/null +++ b/init.lua @@ -0,0 +1,204 @@ +mesetec={maxlight=default.LIGHT_MAX or 15, player_teleport={},mtcuser={},mtpuser={},rules={{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1}} + + + +,mtp_distance=30, --Mese teleport distance +} +dofile(minetest.get_modpath("mesetec") .. "/tools.lua") +dofile(minetest.get_modpath("mesetec") .. "/teleob.lua") +dofile(minetest.get_modpath("mesetec") .. "/misc.lua") + +dofile(minetest.get_modpath("mesetec") .. "/craft.lua") + +mesetec.distance=function(p,o) +return math.sqrt((p.x-o.x)*(p.x-o.x) + (p.y-o.y)*(p.y-o.y)+(p.z-o.z)*(p.z-o.z)) +end + +mesetec.strpos=function(str,spl) + if spl then + local c="," + if string.find(str," ") then c=" " end + local s=str.split(str,c) + if s[3]==nil then + return nil + else + return {x=tonumber(s[1]),y=tonumber(s[2]),z=tonumber(s[3])} + end + else if str.x and str.y and str.z then + return str.x .."," .. str.y .."," .. str.z + else + return nil + end + end +end + + +mesetec.form1=function(pos,player,type) + local meta=minetest.get_meta(pos) + local data=meta:get_string("data") + mesetec.mtpuser[player:get_player_name()]=pos + local gui="" + local label="" + local field="" + local form="" + if type=="pos" then + if data=="" then + local ppos=player:get_pos() + ppos={x=math.floor(ppos.x+0.5),y=math.floor(ppos.y+0.5),z=math.floor(ppos.z+0.5)} + data=mesetec.strpos(ppos,false) + end + label="Position of mese teleport target" + field=data + form="form1" + elseif type=="obj" then + label="Entity name, (like mobs:sheep)" + field=data + form="form2" + elseif type=="num" then + if data=="" then + data=minetest.get_node_light(pos) + if not data then data=0 end + else + data=meta:get_int("light") + end + label="Light (from 0 to " .. mesetec.maxlight .. ")" + field=data + form="form3" + end + gui="" + .."size[3.5,0.2]" + .."tooltip[data;".. label .."]" + .."field[0,0;3,1;data;;" .. field .."]" + .."button_exit[2.5,-0.3;1.3,1;save;Save]" + minetest.after((0.1), function(gui) + return minetest.show_formspec(player:get_player_name(), "mesetec." .. form,gui) + end, gui) +end +minetest.register_on_player_receive_fields(function(player, form, pressed) + if form=="mesetec.code" then + local name=player:get_player_name() + local pos=mesetec.mtpuser[name] + mesetec.mtpuser[name]=nil + if pressed.data==nil then + mesetec.mtcuser[name]=nil + return + end + local n=0 + if pressed.b1 then + n=1 + elseif pressed.b2 then + n=2 + elseif pressed.b3 then + n=3 + elseif pressed.b4 then + n=4 + elseif pressed.b5 then + n=5 + elseif pressed.b6 then + n=6 + elseif pressed.b7 then + n=7 + elseif pressed.b8 then + n=8 + elseif pressed.b9 then + n=9 + end + if pressed.save then + local meta=minetest.get_meta(pos) + meta:set_string("data",pressed.data) + minetest.chat_send_player(name, "Code set!") + mesetec.mtcuser[name]=nil + return + elseif pressed.ok then + local meta=minetest.get_meta(pos) + if pressed.data==meta:get_string("data") then + local node=minetest.get_node(pos) + mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node)) + minetest.after(1, function(pos,node) + mesecon.receptor_off(pos, mesecon.rules.buttonlike_get(node)) + end, pos,node) + mesetec.mtcuser[name]=nil + return + elseif meta:get_string("owner")==name then + n="" + pressed.data=meta:get_string("data") + else + mesetec.mtcuser[name]="" + pressed.data="" + n="" + end + end + mesetec.mtcuser[name]=pressed.data .. n + minetest.after(0.1, function(pos,player) + mesetec.form2(pos,player) + end, pos,player) + return + end + if form=="mesetec.form1" then + if pressed.save then + local name=player:get_player_name() + local pos=mesetec.mtpuser[name] + mesetec.mtpuser[name]=nil + if minetest.is_protected(pos, name)==false then + local meta=minetest.get_meta(pos) + local po1=pressed.data + local po=mesetec.strpos(po1,true) + if po and po.x and po.y and po.z and minetest.get_node(po) then + if mesetec.distance(pos,po)>mesetec.mtp_distance then + minetest.chat_send_player(name, "Error: too faraway (max: " .. mesetec.mtp_distance ..", current: " .. (math.floor(mesetec.distance(pos,po)+0.5)) .. ")") + else + meta:set_string("data",po1) + minetest.chat_send_player(name, "Target set!") + + if minetest.get_node(po).name~="mesetec:mtptarget" then + minetest.chat_send_player(name, "Place a mese teleport target on the position") + end + end + return true + else + minetest.chat_send_player(name, "Error: void position") + return false + end + end + end + return true + + elseif form=="mesetec.form2" then + if pressed.save then + local name=player:get_player_name() + local pos=mesetec.mtpuser[name] + mesetec.mtpuser[name]=nil + if minetest.is_protected(pos, name)==false then + local meta=minetest.get_meta(pos) + meta:set_string("data",pressed.data) + minetest.chat_send_player(name, "Target set!") + if pressed.data~="" and not minetest.registered_entities[pressed.data] then + minetest.chat_send_player(name, "The entity does not exist") + end + return true + end + end + return true + elseif form=="mesetec.form3" then + if pressed.save then + local name=player:get_player_name() + local pos=mesetec.mtpuser[name] + mesetec.mtpuser[name]=nil + if minetest.is_protected(pos, name)==false then + local meta=minetest.get_meta(pos) + local l=tonumber(pressed.data) + if not l or l=="" or l<0 then + l=0 + elseif l>mesetec.maxlight then + l=mesetec.maxlight + end + meta:set_int("light",l) + meta:set_string("data",1) + minetest.get_node_timer(pos):start(5) + minetest.chat_send_player(name, "Time set!") + return true + end + end + return true + end +end) \ No newline at end of file diff --git a/misc.lua b/misc.lua new file mode 100644 index 0000000..c421cd9 --- /dev/null +++ b/misc.lua @@ -0,0 +1,278 @@ +mesetec.form2=function(pos,player,try) + local meta=minetest.get_meta(pos) + local name=player:get_player_name() + local owner=meta:get_string("owner")==name + local data=meta:get_string("data") + mesetec.mtpuser[player:get_player_name()]=pos + local gui="" + gui="" + .."size[3,5]" + .."tooltip[data;Enter code]" + .."button[0,1;1,1;b1;1]" + .."button[1,1;1,1;b2;2]" + .."button[2,1;1,1;b3;3]" + .."button[0,2;1,1;b4;4]" + .."button[1,2;1,1;b5;5]" + .."button[2,2;1,1;b6;6]" + .."button[0,3;1,1;b7;7]" + .."button[1,3;1,1;b8;8]" + .."button[2,3;1,1;b9;9]" + .."button[1,4;1,1;b0;0]" + if owner then + if not mesetec.mtcuser[name] then + mesetec.mtcuser[name]=data + end + gui=gui.."button_exit[2,4;1,1;ok;OK]" + gui=gui.."button_exit[0,4;1,1;save;Save]" + gui=gui.."field[0.3,0;3,1;data;;" .. mesetec.mtcuser[name] .."]" + else + if not mesetec.mtcuser[name] then + mesetec.mtcuser[name]="" + end + gui=gui.."button_exit[2,4;1,1;ok;OK]" + gui=gui.."field[0.3,0;3,1;data;;" .. mesetec.mtcuser[name] .."]" + mesetec.mtcuser[name]=nil + end + minetest.after(0.1, function(gui) + return minetest.show_formspec(player:get_player_name(), "mesetec.code",gui) + end, gui) +end + + +minetest.register_node("mesetec:codelock", { + description = "Codelock panel", +on_rightclick = function(pos, node, player, itemstack, pointed_thing) + mesetec.form2(pos,player) + end, + tiles = {"default_steel_block.png","default_steel_block.png","default_steel_block.png","default_steel_block.png","default_steel_block.png","mesetec_code.png"}, + groups = {mesecon_needs_receiver = 1,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + mesecons = {receptor = { + rules = mesecon.rules.buttonlike_get, + state = mesecon.state.off + }}, + after_place_node = function(pos, placer, itemstack) + local meta=minetest.get_meta(pos) + meta:set_string("owner",placer:get_player_name()) + end, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + walkable = false, + node_box = { + type = "fixed", + fixed = { + {-0.1875, -0.4375, 0.375, 0.1875, 0.0625, 0.5}, + } + } +}) + + + +minetest.register_node("mesetec:dmg", { + description = "Mese damage block", + tiles = {"mesetec_trap.png^[colorize:#f9570001"}, + alpha=1, + inventory_image = "default_lava.png^mesetec_trap2.png", + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + drawtype="glasslike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesetec:dmg2", + rules = mesetec.rules + }}, +}) +minetest.register_node("mesetec:dmg2", { + description = "Mese damage block", + tiles = {"mesetec_trap.png"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=1}, + is_ground_content = false, + drawtype="glasslike", + alpha=0, + pointable = false, + paramtype = "light", + sunlight_propagates = true, + damage_per_second = 2, + walkable = false, + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesetec:dmg", + rules = mesetec.rules + }}, +}) + +minetest.register_node("mesetec:oxygen", { + description = "Mese oxygen block", + tiles = {"mesetec_trap.png^[colorize:#00a5a201"}, + alpha=1, + inventory_image = "default_river_water.png^mesetec_trap2.png", + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + drawtype="glasslike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesetec:oxygen2", + rules = mesetec.rules + }}, +}) +minetest.register_node("mesetec:oxygen2", { + description = "Mese oxygen block", + tiles = {"mesetec_trap.png"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=1}, + is_ground_content = false, + drawtype="glasslike", + alpha=1, + pointable = false, + paramtype = "light", + sunlight_propagates = true, + drowning = 1, + walkable = false, + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesetec:oxygen", + rules = mesetec.rules + }}, +}) + +minetest.register_node("mesetec:ladder", { + description = "Mese ladder block", + tiles = {"mesetec_trap.png^[colorize:#87878701"}, + alpha=1, + inventory_image = "default_ladder_wood.png^mesetec_trap2.png", + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + drawtype="glasslike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesetec:ladder2", + rules = mesetec.rules + }}, +}) +minetest.register_node("mesetec:ladder2", { + description = "Mese ladder block", + tiles = {"mesetec_trap.png"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=1}, + is_ground_content = false, + drawtype="glasslike", + alpha=1, + pointable = false, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = true, + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesetec:ladder", + rules = mesetec.rules + }}, +}) + +minetest.register_node("mesetec:delayer", { + description = "Delayer (Punch to change time)", + tiles = {"mesetec_delayer.png","default_sandstone_block.png"}, + groups = {dig_immediate = 2,mesecon=1}, + sounds = default.node_sound_stone_defaults(), + paramtype = "light", + sunlight_propagates = true, + drawtype="nodebox", + node_box = { + type="fixed", + fixed={-0.5,-0.5,-0.5,0.5,-0.4,0.5}}, + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesetec:ladder", + rules = mesetec.rules + }}, +on_punch = function(pos, node, player, pointed_thing) + if minetest.is_protected(pos, player:get_player_name())==false then + local meta = minetest.get_meta(pos) + local time=meta:get_int("time") + if time>=10 then time=0 end + meta:set_int("time",time+1) + meta:set_string("infotext","Delayer (" .. (time+1) ..")") + end + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("time",1) + meta:set_string("infotext","Delayer (1)") + meta:set_int("case",0) + end, + on_timer = function (pos, elapsed) + local meta = minetest.get_meta(pos) + if meta:get_int("case")==2 then + meta:set_int("case",0) + mesecon.receptor_off(pos) + end + if meta:get_int("case")==1 then + meta:set_int("case",2) + mesecon.receptor_on(pos) + minetest.get_node_timer(pos):start(meta:get_int("time")) + end + return false + end, + mesecons = {effector = { + action_on = function (pos, node) + local meta = minetest.get_meta(pos) + if meta:get_int("case")==0 then + meta:set_int("case",1) + minetest.get_node_timer(pos):start(meta:get_int("time")) + end + + end, + }} +}) + +minetest.register_node("mesetec:light", { + description = "Light check", + tiles = {"jeija_solar_panel.png","default_steel_block.png"}, + groups = {dig_immediate = 2,mesecon=1}, + sounds = default.node_sound_stone_defaults(), + paramtype = "light", + sunlight_propagates = true, + drawtype="nodebox", + node_box = { + type="fixed", + fixed={-0.5,-0.5,-0.5,0.5,-0.4,0.5}}, + is_ground_content = false, + mesecons = {receptor = { + rules = mesecon.rules.buttonlike_get, + rules = mesetec.rules + }}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + if minetest.is_protected(pos, player:get_player_name())==false then + mesetec.form1(pos,player,"num") + end + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext","Light") + end, + on_timer = function (pos, elapsed) + local meta = minetest.get_meta(pos) + local l=meta:get_int("light") + local rl=minetest.get_node_light(pos) + meta:set_string("infotext","Light: " .. rl) + if l==rl then + mesecon.receptor_on(pos) + else + mesecon.receptor_off(pos) + end + return true + end, +}) diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa04c5fd273492191e54a64e57c33ef77fafe01 GIT binary patch literal 47974 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 then + return + elseif mesetec.nodeswitch_user[name].p1 then + minetest.add_entity(pos, "mesetec:pos2"):get_luaentity().user=name + mesetec.nodeswitch_user[name].p2=pos + mesetec.nodeswitch_user[name].node2=newnode.name + mesetec.consnodeswitch(name) + else + minetest.add_entity(pos, "mesetec:pos1"):get_luaentity().user=name + minetest.add_entity(pos, "mesetec:pos1") + mesetec.nodeswitch_user[name].p1=pos + mesetec.nodeswitch_user[name].node1=newnode.name + end + end + end +end) + +minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) + if mesetec.nodeswitch_user then + local name=puncher:get_player_name() + if mesetec.nodeswitch_user[name] then + if minetest.get_node(pointed_thing.above).name~="air" then + return + elseif mesetec.nodeswitch_user[name].p1 then + if mesetec.nodeswitch_user[name].pun then + minetest.chat_send_player(name, "A node is already punched") + end + minetest.add_entity(pointed_thing.above, "mesetec:pos2"):get_luaentity().user=name + mesetec.nodeswitch_user[name].p2=pointed_thing.above + mesetec.nodeswitch_user[name].node2=minetest.get_node(pointed_thing.above).name + mesetec.consnodeswitch(name) + else + minetest.add_entity(pointed_thing.above, "mesetec:pos1"):get_luaentity().user=name + mesetec.nodeswitch_user[name].p1=pointed_thing.above + mesetec.nodeswitch_user[name].pun=1 + mesetec.nodeswitch_user[name].node1=minetest.get_node(pointed_thing.above).name + end + end + end +end) + +mesetec.consnodeswitch=function(name) + if mesetec.nodeswitch_user[name].p1 and mesetec.nodeswitch_user[name].p2 then + local meta=minetest.get_meta(mesetec.nodeswitch_user[name].pos) + local npos1=mesetec.nodeswitch_user[name].p1 + local npos2=mesetec.nodeswitch_user[name].p2 + minetest.get_meta(npos1):set_string("mesetec_nodeswitch",name) + minetest.get_meta(npos2):set_string("mesetec_nodeswitch",name) + meta:set_string("node1",mesetec.nodeswitch_user[name].node1) + meta:set_string("node2",mesetec.nodeswitch_user[name].node2) + meta:set_string("pos1",minetest.pos_to_string(npos1)) + meta:set_string("pos2",minetest.pos_to_string(npos2)) + meta:set_int("able",1) + mesetec.nodeswitch_user[name]=nil + if #mesetec.nodeswitch_user==0 then mesetec.nodeswitch_user=nil end + end +end + +mesetec.consnodeswitch_switch=function(pos,state) + local meta=minetest.get_meta(pos) + if meta:get_int("able")==0 then return end + local pos1=minetest.string_to_pos(meta:get_string("pos1")) + local pos2=minetest.string_to_pos(meta:get_string("pos2")) + local node1=meta:get_string("node1") + local node2=meta:get_string("node2") + local owner=meta:get_string("owner") + local meta1=minetest.get_meta(pos1) + local meta2=minetest.get_meta(pos2) + if minetest.is_protected(pos1, owner) + or minetest.is_protected(pos2, owner) + or meta1:get_string("mesetec_nodeswitch")~=owner + or meta2:get_string("mesetec_nodeswitch")~=owner then + meta:set_int("able",0) + return + end + meta1=meta1:to_table() + meta2=meta2:to_table() + local n1=minetest.get_node(pos1) + local n2=minetest.get_node(pos2) + if not ((state==1 and node1==n1.name and node2==n2.name) or (state==2 and node1==n2.name and node2==n1.name)) then + meta:set_int("able",0) + return + end + minetest.set_node(pos2,n1) + minetest.get_meta(pos2):from_table(meta1) + minetest.set_node(pos1,n2) + minetest.get_meta(pos1):from_table(meta2) +end +minetest.register_node("mesetec:nodeswitch", { + description = "Node switch", +after_place_node = function(pos, placer) + local meta=minetest.get_meta(pos) + local p=placer:get_player_name() + meta:set_string("owner",p) + minetest.chat_send_player(p, "Place the 1 or 2 nodes to replace with each other") + minetest.chat_send_player(p, "Or punch somwehere to move the node to there") + + + if not mesetec.nodeswitch_user then mesetec.nodeswitch_user={} end + + minetest.after(0.1, function(p) + mesetec.nodeswitch_user[p]={pos=pos,name=p} + end, p) + + minetest.after(60, function(p) + if mesetec.nodeswitch_user then + if mesetec.nodeswitch_user[p] then mesetec.nodeswitch_user[p]=nil end + if #mesetec.nodeswitch_user==0 then mesetec.nodeswitch_user=nil end + end + end, p) +end, + + + tiles = {"default_steel_block.png"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + --mesecons = {receptor = {state = "off"}}, + + mesecons = { + receptor = {state = "off"}, + effector = { + action_on = function (pos, node) + mesetec.consnodeswitch_switch(pos,1) + return false + end, + action_off = function (pos, node) + mesetec.consnodeswitch_switch(pos,2) + return false + end + }} + +}) + + + + + + +minetest.register_node("mesetec:objdec", { + description = "Object detector", +on_rightclick = function(pos, node, player, itemstack, pointed_thing) + mesetec.form1(pos,player,"obj") + end, + tiles = {"default_steel_block.png","jeija_object_detector_off.png^[transform2"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + mesecons = {receptor = {state = "off"}}, + on_construct = function(pos) + if not mesecon then return false end + minetest.get_node_timer(pos):start(3) + end, + on_timer = function (pos, elapsed) + local meta=minetest.get_meta(pos) + local data=meta:get_string("data") + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 5)) do + if ob and ob:get_luaentity() and (data=="" or (ob:get_luaentity().name==data)) then + mesecon.receptor_on(pos) + minetest.swap_node(pos, {name="mesetec:objdec2"}) + minetest.get_node_timer(pos):start(2) + return true + end + end + return true + end +}) + + +minetest.register_node("mesetec:objdec2", { + description = "Object detector", +on_rightclick = function(pos, node, player, itemstack, pointed_thing) + mesetec.form1(pos,player,"obj") + end, + tiles = {"default_steel_block.png","jeija_object_detector_on.png^[transform2"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + mesecons = {receptor = {state = "on"}}, + on_timer = function (pos, elapsed) + local meta=minetest.get_meta(pos) + local data=meta:get_string("data") + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 5)) do + if ob and ob:get_luaentity() and (data=="" or (ob:get_luaentity().name==data)) then + return true + end + end + mesecon.receptor_off(pos) + minetest.swap_node(pos, {name="mesetec:objdec"}) + minetest.get_node_timer(pos):start(3) + return true + end, +}) + + + + + +minetest.register_node("mesetec:mtp", { + description = "Mese teleport", +on_rightclick = function(pos, node, player, itemstack, pointed_thing) + mesetec.form1(pos,player,"pos") + end, + tiles = {"mesetec_ttp.png"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, 0.4375, -0.3125, 0.4375}, + } + }, + mesecons = {effector = { + action_on = function (pos, node) + local meta=minetest.get_meta(pos) + local po=mesetec.strpos(meta:get_string("data"),true) + if po~=nil and minetest.get_node(po) and minetest.get_node(po).name=="mesetec:mtptarget" then + mesecon.receptor_on(po) + end + return false + end, + action_off = function (pos, node) + local meta=minetest.get_meta(pos) + local po=mesetec.strpos(meta:get_string("data"),true) + if po~=nil and minetest.get_node(po) and minetest.get_node(po).name=="mesetec:mtptarget" then + mesecon.receptor_off(po) + end + return false + end, + }} +}) + +minetest.register_node("mesetec:mtptarget", { + description = "Mese teleport target", + tiles = {"mesetec_ttp_target.png"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, 0.4375, -0.3125, 0.4375}, + } + }, + mesecons = {receptor = { + state = mesecon.state.off, + onstate = "mesetec:mtptarget", + }}, +}) + + +minetest.register_node("mesetec:ptp", { + description = "Player teleport", + tiles = {"mesetec_ptp.png"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + mesecons = {effector = { + action_on = function (pos, node) + local names={} + local ii=1 + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 5)) do + if ob then + names[i]=ob + ii=ii+1 + end + end + if names[1]==nil then return false end + mesetec.player_teleport.targets=names + minetest.after((1), function(pos) + if mesetec.player_teleport.targets then + mesetec.player_teleport.targets=nil + end + end, pos) + return false + end, + }} +}) + +minetest.register_node("mesetec:ptptarget", { + description = "Player teleport target", + tiles = {"mesetecptp_target.png"}, + groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, + sounds = default.node_sound_stone_defaults(), + is_ground_content = false, + walkable = false, + mesecons = {effector = { + action_on = function (pos, node) + if mesetec.player_teleport.targets then + for i, ob in pairs(mesetec.player_teleport.targets) do + if ob then + ob:moveto(pos) + end + end + end + mesetec.player_teleport.targets=nil + return false + end, + }}, + drawtype = "nodebox", + paramtype = "light", + alpha = 210, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}, + } + } +}) + +minetest.register_entity("mesetec:pos1",{ + hp_max = 1, + physical = false, + collisionbox = {-0.52,-0.52,-0.52, 0.52,0.52,0.52}, + visual_size = {x=1.05, y=1.05}, + visual = "cube", + textures = {"mesetec_pos1.png","mesetec_pos1.png","mesetec_pos1.png","mesetec_pos1.png","mesetec_pos1.png","mesetec_pos1.png"}, + is_visible = true, + on_step = function(self, dtime) + self.timer=self.timer+dtime + if self.timer<1 then return self end + self.timer=0 + self.timer2=self.timer2+dtime + if self.timer2>2 or not (mesetec.nodeswitch_user and mesetec.nodeswitch_user[self.user]) then + self.object:remove() + return self + end + end, + timer=0, + timer2=0, + user="" +}) + +minetest.register_entity("mesetec:pos2",{ + hp_max = 1, + physical = false, + collisionbox = {-0.52,-0.52,-0.52, 0.52,0.52,0.52}, + visual_size = {x=1.05, y=1.05}, + visual = "cube", + textures = {"mesetec_pos2.png","mesetec_pos2.png","mesetec_pos2.png","mesetec_pos2.png","mesetec_pos2.png","mesetec_pos2.png"}, + is_visible = true, + on_step = function(self, dtime) + self.timer=self.timer+dtime + if self.timer<1 then return self end + self.timer=0 + self.timer2=self.timer2+dtime + if self.timer2>2 or not (mesetec.nodeswitch_user and mesetec.nodeswitch_user[self.user]) then + self.object:remove() + return self + end + end, + timer=0, + timer2=0, + user="" +}) \ No newline at end of file diff --git a/textures/mesetec_code.png b/textures/mesetec_code.png new file mode 100644 index 0000000000000000000000000000000000000000..4d25c6ab56ec02269ef476563e767f98f4952fd3 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DinK$vl=HlH+5kiEpy*OmPN50fY(!?yWHihx2Do-U3d7N_4%GUQ@W6mi~sc$(Qg z#fVDA^9u8>9h+RiCjIkIRKfOpN!+p$%Vv})e&A4CA9RXcz2w0XxdXBc@9Q1U{XD*W z$~7sA=K@X)o>!u-OLuTQn-g$#FRzDFXyV$t%wO&~3Mp-3mq=c)l`WYkspqwH#ryR? a4~iEaP@a}hZ_^EQ1B0ilpUXO@geCxm0#XtH literal 0 HcmV?d00001 diff --git a/textures/mesetec_control.png b/textures/mesetec_control.png new file mode 100644 index 0000000000000000000000000000000000000000..0d225d9c30475959bec374bc453ee4bb9bd2a5a5 GIT binary patch literal 503 zcmV1wc4LTY^(gA~xe zr{~4PLuW6VreQLfY!akw;hvt?Cnp;@x2pzLRkfNzSdPH>SLvaATRscG`N52(ust$8V@(ZB->q1k}nfU+!002ovPDHLkV1mzE+aCY` literal 0 HcmV?d00001 diff --git a/textures/mesetec_delayer.png b/textures/mesetec_delayer.png new file mode 100644 index 0000000000000000000000000000000000000000..80c9629016d0da95067c82f345b06e4d42e5c66e GIT binary patch literal 856 zcmV-e1E>6nP)HiY|HqZgUFnvMvlSf*?*) zCv9pwRb{ygijk~{l9RX@fS^E9d~e>2#9`(AN3|ffPaod#6!!Vc*V|{|ns^FufJ$0{ zv=Zwk+( z=gmE}L?WH+vW#sS+yakh`RcUm+PPPjgp+{Fdff!Lv#k*VIxRC7MR0xz=hrG;tCy50 zGFcS2EciiN)7}BE3PL0;4B^0oPRkHG9xB>(O|J`sp)O2Bv8w02mzqu+{2DYG(5Rc{ z*TDA;DbF+SJm1vLFs)2LO0)5Jrg(Lr>9k;H3wE|)YcnPhx2;WR?wa{V9rjwoP;w68g7(coNrKba-67+(_1^ zRl2_dfT-q=TY06tn>Sg|G6IFuR@!KhfZFHu{9{a(5pX3_(OB?zb&`byZf+ph1Q9|I zfb>B|5Mq+i0$7>D5W+c3r-p8}iSbNvF;SfT$X|avR7*+ssDdO-;%a21w3W`qL~${3 zmt@(R@LmM+YPU2AV>mAz(LGsM#j94G{!E)^EzL_`gW;tTUp(qYTal{M}`Rl6d zT7G_iDZBBT-O9*OrJm|~uj&aAZ@06bN%yO(j!G5vMJbbOP@#u%)% z$~i}qtbq~{j#ZHYwjKjW+($B?x_fIaK%-!n?7e4PmZ{SAE8csGqQF{dv5CU3j0E{t=%aYr=j!IHnN<{X^5g`NswAL77lKieG2Yr`YQpC6SUkD-e+A+qE z=eYuSG#Cs3F4yZd09lqLa+YO0`S`3CkA@D1Lq?-fYvOL@2(2|*YeERTxxNM<&vRC* z74!MLO%M(H7qr&AJ3DLIcsm22s;Xq704$fw|0XlW;L2MCaDKAj;%++!)>;KHnM``* zZd=9}{(Nfg0etvc^am*>*_yOB2evHL?-z5|2|W0`57}uNJ>cPNJvQB z6aJ*69KxvFSdge<$|LbHW0Ai^j|y`{htIwLg|6z{^D>t7i%V#pJ;(5)kK5zxwm()N O>pWfkT-G@yGywpKc0ua^ literal 0 HcmV?d00001 diff --git a/textures/mesetec_pos2.png b/textures/mesetec_pos2.png new file mode 100644 index 0000000000000000000000000000000000000000..6b26860e16242d19d571a46a3854a1bbb7bb9510 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPtr?9XxpCse{6F?!^%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dC?4qP;uvCadhcXIJ_ZF2=I)38_m{4d4>%H|B<;+-MO7to z14kqK+&<1v54TiYJTUv7OY;PimE0N3^GzgJ?kH*;oZ7oD^7=_fZSKe$-_%bz-mhd_ WVIj<8=yRDLWUHsEpUXO@geCw_zehR% literal 0 HcmV?d00001 diff --git a/textures/mesetec_ptp.png b/textures/mesetec_ptp.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7b0b6804654b24a91b9338376188e33e7eeef0 GIT binary patch literal 445 zcmV;u0Yd(XP)RL{HH}xgWbklm%QXS+83Eq!KnW47djDhp!Aj zE5!gU);O>G@6Ix`00#g-t^ikpZ$w1Xp|s_k)qO*MRRhHP{g$oB&q~R(Y$~}F!#4p< zniK;}%eEh?B}4uY5r+Qy(ASnj3Fiiq7N&3bZUfl|W1B-y;QHBl6h_P%Y3Kex&~^{goFLuzI;Oz+D3JIjtcf z!M(G^*HDu1oRPie1-;ZnL*JU7u(ZskRO^zD3?SU+Q-|cWc- ndj5V9`0EMToeNrw=Mv)q{9Ey5taqL100000NkvXXu0mjfZTz~k literal 0 HcmV?d00001 diff --git a/textures/mesetec_trap.png b/textures/mesetec_trap.png new file mode 100644 index 0000000000000000000000000000000000000000..637a853974ca5948ce06fac63cf561e5e111d5dc GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DinK$vl=HlH+5kiEpy*OmPN53_*0a@{%oK%kJRr;B5V#p&b(iBAoJ?H2reAN7w& z9B@7mB;q_n<13Rd?~kVQ??bqmyOI+NmNCb))g(&HV_@hPWB+>L=@J#70Sun5elF{r G5}E+b)i7uP literal 0 HcmV?d00001 diff --git a/textures/mesetec_trap2.png b/textures/mesetec_trap2.png new file mode 100644 index 0000000000000000000000000000000000000000..5f24914996b11026d37f30cb69aee3b4a332e0b4 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DinK$vl=HlH+5kiEpy*OmPN53_)Yxljt5D^SSD)5S5w;&gI?#HR+q_8;|0SB)nv zkX$XN=C#)$m|3EeL;KX>hDQ++b6zq`SM1?AEDSVSosB>HZqEXsZU#?RKbLh*2~7b1 C<1KIi literal 0 HcmV?d00001 diff --git a/textures/mesetec_ttp.png b/textures/mesetec_ttp.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6b7645320c621f706982a008b238d6d5384390 GIT binary patch literal 440 zcmV;p0Z0CcP)?_jA4zAqKh8bpe9z||LrUrK4~qc|`r^+4MyiMBl*$iWV^#^aai^IG4(DVF4>Amos?Zw$;Ag?U0!0{?s1J8PvNS zt{OEh;OM}nQYg}H2~AOm!GmklJUoF$4PM6pn4eoT0d6ix0PU7g3fBDU^S@vYzSQ2e zHZ)(UEOm&p44mO_|KS$SNK8&O1`49D!cSBw6hlyFgJ&5SQcCacSUHJbD7(889;BzYaijtx)njDFsbP)wgJ4y}skJamg@QmI0Mo8QM)5C9GQnlOWW}7NFgfg;^+J-Hf^IV1R?8$=-dn zmXS%V?0mp1VcH4cUx(H(3&6$w9ln9(x0~CZmazBdz znC0>$MPA9Em39bjRM1LMwgV|B1qc@F zXr(B@<2nGzL=N8|4ZzKnZ1zGZq|@C!0IC`!6PqTnVUd_MMvtib?WRmfnhHo_eR%#; zo*kfsb#A}DSsQ*5SXmYm%u=2yb7_(NEtTtshDqWe_=#toBB`!ghxa$mqAKUlF9a66 e*5{h{JO2W-$cf(6gsLF`0000S4FTRp+vA~>{zj)=?4&75w;>xj|h=Uq)2E9 z8`kzJ^-AL#G_{x#>R$ITcQBiolY8_3oqOiYnRDTfhwwwB@J#7_9SphCH2j2@N9orh zPzeu)+-nO>aL4*W7rgN7EGL9cxRb;*bi)B2?yVD3=!V-xLi`ro$_Ya!Je#%GGjzev zGO)cP=hy_~a^|{12Yh!AqJwh1yaK~RP+e`l9fpoQe|?3nZWxF{ZH+nHG6E{_+gpey zAhj>;;}huZ`8gp2e!z1%NFPCR12&T|G74>NP+w<%8iXpmP=NI$%uGu=HUVp^P%J_q zV1E=1ukd2A{BBUfTRWuP8IiLS_(udP8Vc7%rn3t&r|ydoK$VxUzr4WZ72Msy^^JG< zhXdt@B`5HF9x_=NACq?Kz&pIM5(+!`P2veynE!gwL?UW%S9bwGOFJ|+z|x}nm)qWkW+Kf^{=ywKB%dRZ z&qFxuAKY_C_xD0000Uq zK~z}7-B-(z!!QUHo|L$D1?x{2p^PZ%AS#l*EE&QI6pg*gB)a&3#CtrD1@OImQTSac zW(*zHypDIA!7}s!4g7MgTA!Y8w$1_gybHECmQebhaWtDkaM{VToLd8G(q- zC23O3xNH;hp;j{N4*<|SZD4Q-dc zmTkgP9Sl}s>3q%Wh$&|DQo(i!l43@yFiiqFN(O&6|0NREtr==ps}t7 z=)812bSLm~1zZALeBQPBYz2B2Uy(ph>E9y-UL*3^3UDp(8@{LitNqHW3Ru0|5#TNX z{hYRt(BR(L>T9S;c+S|~@`9dPqTz2#PgwJBHl?L5dCveMeLi$ZUR!?Dq~rzEWiavl to1@v0v!dtk4}t%lklneU$9S$WegIQpETC*FrECBI002ovPDHLkV1nG#yq^F7 literal 0 HcmV?d00001 diff --git a/tools.lua b/tools.lua new file mode 100644 index 0000000..92eafab --- /dev/null +++ b/tools.lua @@ -0,0 +1,113 @@ +minetest.register_tool("mesetec:controller", { + description = "Mese teleport target controller", + inventory_image = "mesetec_control.png", +on_use = function(itemstack, user, pointed_thing) + local name=user:get_player_name() + if pointed_thing.type=="node" and minetest.get_node(pointed_thing.under).name=="mesetec:mtptarget" and minetest.is_protected(pointed_thing.under, name)==false then + local pos=pointed_thing.under + local item=itemstack:to_table() + local meta=minetest.deserialize(item["metadata"]) + local mode=mesetec.strpos(pos,false) + meta={} + meta.mode=mesetec.strpos(pos,false) + mode=(meta.mode) + meta.mode=mode + item.metadata=minetest.serialize(meta) + itemstack:replace(item) + minetest.chat_send_player(user:get_player_name(), "Target set!") + else + local item=itemstack:to_table() + local meta=minetest.deserialize(item["metadata"]) + + if meta==nil then + minetest.chat_send_player(user:get_player_name(), "Punch a Mese teleport target") + return itemstack + end + local pos=mesetec.strpos(meta.mode,true) + local t_pos=mesetec.distance(pos,user:get_pos()) + if t_pos>mesetec.mtp_distance then + minetest.chat_send_player(name, "Error: too faraway (max: " .. mesetec.mtp_distance ..", current: " .. (math.floor(t_pos+0.5)) .. ")") + return itemstack + end + mesecon.receptor_on(pos) + minetest.after(1, function(pos) + mesecon.receptor_off(pos) + end, pos) + end + return itemstack +end +}) + +minetest.register_tool("mesetec:hacktool", { + description = "Mese hack tool", + inventory_image = "mesetec_hack.png", +on_use = function(itemstack, user, pointed_thing) + local pos=user:get_pos() + local name=user:get_player_name() + if pointed_thing.type=="node" and minetest.is_protected(pointed_thing.under, name)==false then + pos=pointed_thing.under + local node=minetest.get_node(pos) + mesecon.receptor_on(pos) + minetest.after(1, function(pos,node) + mesecon.receptor_off(pos) + end, pos, node) + end + return itemstack +end +}) + + + + + + + + +minetest.register_tool("mesetec:keycard", { + description = "Keycard", + inventory_image = "mesetecptp_keycard.png", +on_place = function(itemstack, user, pointed_thing) + local name=user:get_player_name() + if pointed_thing.type=="node" and minetest.get_node(pointed_thing.under).name=="mesetec:codelock" then + local pos=pointed_thing.under + local nmeta=minetest.get_meta(pos) + local owner=nmeta:get_string("owner") + if owner~=name then return itemstack end + local t_item=itemstack:to_table() + local t_meta=minetest.deserialize(t_item["metadata"]) + if t_meta and t_meta.owner and t_meta.owner~=owner then return itemstack end + local item=itemstack:to_table() + local code=nmeta:get_string("data") + local meta={} + meta.code=code + meta.owner=owner + item.metadata=minetest.serialize(meta) + itemstack:replace(item) + minetest.chat_send_player(user:get_player_name(), "Keycard coded") + end + return itemstack +end, +on_use = function(itemstack, user, pointed_thing) + local item=itemstack:to_table() + local meta=minetest.deserialize(item["metadata"]) + if meta==nil then + minetest.chat_send_player(user:get_player_name(), "Punch a codelock") + return itemstack + end + if pointed_thing.type=="node" and minetest.get_node(pointed_thing.under).name=="mesetec:codelock" then + local pos=pointed_thing.under + local nmeta=minetest.get_meta(pos) + local owner=nmeta:get_string("owner") + local code=nmeta:get_string("data") + if owner~=meta.owner or code~=meta.code then + return itemstack + end + local node=minetest.get_node(pos) + mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node)) + minetest.after(1, function(pos,node) + mesecon.receptor_off(pos, mesecon.rules.buttonlike_get(node)) + end, pos,node) + end + return itemstack +end +}) \ No newline at end of file