minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) local name=placer:get_player_name() if mesetec.nodeswitch_user[name] then if minetest.get_item_group(newnode.name,"liquid")>0 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) minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) 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) 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 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() local id=math.random(1,9999) 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") minetest.after(0.1, function(p,id,pos) mesetec.nodeswitch_user[p]={pos=pos,name=p,id=id} end, p,id,pos) minetest.after(60, function(p,id) if mesetec.nodeswitch_user[p] and mesetec.nodeswitch_user[p].id==id then mesetec.nodeswitch_user[p]=nil end end, p,id) 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:move_to(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="" })