diff options
| author | Novatux <nathanael.courant@laposte.net> | 2014-01-03 13:29:38 +0100 | 
|---|---|---|
| committer | Novatux <nathanael.courant@laposte.net> | 2014-01-03 21:36:10 +0100 | 
| commit | d33eb89dcb1888ee1c194161e5526db5399e1e53 (patch) | |
| tree | ea0337b56bf4cd21f89c1bfaa48749fa3ae6fdab /teleport_tube.lua | |
| parent | 9a9bd2f491ecb4b62ebc069ca61ad917da584ce9 (diff) | |
| download | pipeworks-d33eb89dcb1888ee1c194161e5526db5399e1e53.tar pipeworks-d33eb89dcb1888ee1c194161e5526db5399e1e53.tar.gz pipeworks-d33eb89dcb1888ee1c194161e5526db5399e1e53.tar.bz2 pipeworks-d33eb89dcb1888ee1c194161e5526db5399e1e53.tar.xz pipeworks-d33eb89dcb1888ee1c194161e5526db5399e1e53.zip | |
Support for the mesecons mvps callback
Diffstat (limited to 'teleport_tube.lua')
| -rw-r--r-- | teleport_tube.lua | 151 | 
1 files changed, 87 insertions, 64 deletions
| diff --git a/teleport_tube.lua b/teleport_tube.lua index 845c1d9..f57f55a 100644 --- a/teleport_tube.lua +++ b/teleport_tube.lua @@ -16,6 +16,18 @@ local function write_file(tbl)      	f:close()  end +local function update_pos_in_file(pos) +	local tbl=read_file() +	for _,val in ipairs(tbl) do +		if val.x==pos.x and val.y==pos.y and val.z==pos.z then +			local meta = minetest.get_meta(val) +			val.channel = meta:get_string("channel") +			val.cr = meta:get_int("can_receive") +		end +	end +	write_file(tbl) +end +  local function add_tube_in_file(pos,channel, cr)  	local tbl=read_file()  	for _,val in ipairs(tbl) do @@ -45,6 +57,7 @@ local function get_tubes_in_file(pos,channel)  	for _,val in ipairs(tbl) do  		local node = minetest.get_node(val)  		local meta = minetest.get_meta(val) +		-- That shouldn't be needed anymore since the mvps callback, but we leave it nevertheless  		if node.name~="ignore"  and (val.channel~=meta:get_string("channel") or val.cr~=meta:get_int("can_receive")) then  			val.channel=meta:get_string("channel")  			val.cr=meta:get_int("can_receive") @@ -68,72 +81,82 @@ local teleport_short_texture="pipeworks_teleport_tube_short.png"  local teleport_inv_texture="pipeworks_teleport_tube_inv.png"  pipeworks.register_tube("pipeworks:teleport_tube","Teleporter pneumatic tube segment",teleport_plain_textures, -		teleport_noctr_textures,teleport_end_textures,teleport_short_texture,teleport_inv_texture, { -		tube = { -			can_go = function(pos,node,velocity,stack) -				velocity.x = 0 -				velocity.y = 0 -				velocity.z = 0 -				local meta = minetest.get_meta(pos) -				local channel = meta:get_string("channel") -				local target = get_tubes_in_file(pos,channel) -				if target[1] == nil then return {} end -				local d = math.random(1,#target) -				pos.x = target[d].x -				pos.y = target[d].y -				pos.z = target[d].z -				return pipeworks.meseadjlist -			end -		}, -		on_construct = function(pos) +	teleport_noctr_textures,teleport_end_textures,teleport_short_texture,teleport_inv_texture, { +	tube = { +		can_go = function(pos,node,velocity,stack) +			velocity.x = 0 +			velocity.y = 0 +			velocity.z = 0  			local meta = minetest.get_meta(pos) -			meta:set_string("channel","") -			meta:set_int("can_receive",1) -			meta:set_string("formspec","size[9,1;]".. +			local channel = meta:get_string("channel") +			local target = get_tubes_in_file(pos,channel) +			if target[1] == nil then return {} end +			local d = math.random(1,#target) +			pos.x = target[d].x +			pos.y = target[d].y +			pos.z = target[d].z +			return pipeworks.meseadjlist +		end +	}, +	on_construct = function(pos) +		local meta = minetest.get_meta(pos) +		meta:set_string("channel","") +		meta:set_int("can_receive",1) +		meta:set_string("formspec","size[9,1;]".. +				"field[0,0.5;7,1;channel;Channel:;${channel}]".. +				"button[8,0;1,1;bt;On]") +		add_tube_in_file(pos,"") +	end, +	on_receive_fields = function(pos,formname,fields,sender) +		local meta = minetest.get_meta(pos) +		 +		--check for private channels +		if fields.channel ~= nil then +			local name, mode = fields.channel:match("^([^:;]+)([:;])") +			if name and mode and name ~= sender:get_player_name() then +				 +				--channels starting with '[name]:' can only be used by the named player +				if mode == ":" then +					minetest.chat_send_player(sender:get_player_name(), "Sorry, channel '"..fields.channel.."' is reserved for exclusive use by "..name) +					return +				 +				--channels starting with '[name];' can be used by other players, but cannot be received from +				elseif mode == ";" and (meta:get_int("can_receive") ~= 0) == (fields["bt"] == nil) then +					minetest.chat_send_player(sender:get_player_name(), "Sorry, receiving from channel '"..fields.channel.."' is reserved for "..name) +					return +				end +			end +		end +		 +		if fields.channel==nil then fields.channel=meta:get_string("channel") end +		meta:set_string("channel",fields.channel) +		remove_tube_in_file(pos) +		local cr = meta:get_int("can_receive") +		if fields["bt"] then +			cr=1-cr +			meta:set_int("can_receive",cr) +			if cr==1 then +				meta:set_string("formspec","size[9,1;]"..  					"field[0,0.5;7,1;channel;Channel:;${channel}]"..  					"button[8,0;1,1;bt;On]") -			add_tube_in_file(pos,"") -		end, -		on_receive_fields = function(pos,formname,fields,sender) -			local meta = minetest.get_meta(pos) -			 -			--check for private channels -			if fields.channel ~= nil then -				local name, mode = fields.channel:match("^([^:;]+)([:;])") -				if name and mode and name ~= sender:get_player_name() then -					 -					--channels starting with '[name]:' can only be used by the named player -					if mode == ":" then -						minetest.chat_send_player(sender:get_player_name(), "Sorry, channel '"..fields.channel.."' is reserved for exclusive use by "..name) -						return -					 -					--channels starting with '[name];' can be used by other players, but cannot be received from -					elseif mode == ";" and (meta:get_int("can_receive") ~= 0) == (fields["bt"] == nil) then -						minetest.chat_send_player(sender:get_player_name(), "Sorry, receiving from channel '"..fields.channel.."' is reserved for "..name) -						return -					end -				end +			else +				meta:set_string("formspec","size[9,1;]".. +					"field[0,0.5;7,1;channel;Channel:;${channel}]".. +					"button[8,0;1,1;bt;Off]")  			end -			 -			if fields.channel==nil then fields.channel=meta:get_string("channel") end -			meta:set_string("channel",fields.channel) -			remove_tube_in_file(pos) -			local cr = meta:get_int("can_receive") -			if fields["bt"] then -				cr=1-cr -				meta:set_int("can_receive",cr) -				if cr==1 then -					meta:set_string("formspec","size[9,1;]".. -						"field[0,0.5;7,1;channel;Channel:;${channel}]".. -						"button[8,0;1,1;bt;On]") -				else -					meta:set_string("formspec","size[9,1;]".. -						"field[0,0.5;7,1;channel;Channel:;${channel}]".. -						"button[8,0;1,1;bt;Off]") -				end +		end +		add_tube_in_file(pos,fields.channel, cr) +	end, +	on_destruct = function(pos) +		remove_tube_in_file(pos) +	end}) + +if minetest.get_modpath("mesecons_mvps") ~= nil then +	mesecon:register_on_mvps_move(function(moved_nodes) +		for _, n in ipairs(moved_nodes) do +			if string.find(n.node.name, "pipeworks:teleport_tube") ~= nil then +				update_pos_in_file(n.pos)  			end -			add_tube_in_file(pos,fields.channel, cr) -		end, -		on_destruct = function(pos) -			remove_tube_in_file(pos) -		end}) +		end +	end) +end | 
