forked from minetest-mods/mesecons
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			e38e4fe0c5
			...
			mvps-ignor
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | a38f37d1ee | 
| @@ -1,62 +0,0 @@ | ||||
|  | ||||
| -- a simple first-in-first-out queue | ||||
| -- very similar to the one in https://github.com/minetest/minetest/pull/7683 | ||||
|  | ||||
| local fifo_queue = {} | ||||
|  | ||||
| local metatable = {__index = fifo_queue} | ||||
|  | ||||
| -- creates a new empty queue | ||||
| function fifo_queue.new() | ||||
| 	local q = {n_in = 0, n_out = 0, i_out = 1, buf_in = {}, buf_out = {}} | ||||
| 	setmetatable(q, metatable) | ||||
| 	return q | ||||
| end | ||||
|  | ||||
| -- adds an element to the queue | ||||
| function fifo_queue.add(self, v) | ||||
| 	local n = self.n_in + 1 | ||||
| 	self.n_in = n | ||||
| 	self.buf_in[n] = v | ||||
| end | ||||
|  | ||||
| -- removes and returns the next element, or nil of empty | ||||
| function fifo_queue.take(self) | ||||
| 	local i_out = self.i_out | ||||
| 	if i_out <= self.n_out then | ||||
| 		local v = self.buf_out[i_out] | ||||
| 		self.i_out = i_out + 1 | ||||
| 		self.buf_out[i_out] = true | ||||
| 		return v | ||||
| 	end | ||||
|  | ||||
| 	-- buf_out is empty, try to swap | ||||
| 	self.i_out = 1 | ||||
| 	self.n_out = 0 | ||||
| 	if self.n_in == 0 then | ||||
| 		return nil -- empty | ||||
| 	end | ||||
|  | ||||
| 	-- swap | ||||
| 	self.n_out = self.n_in | ||||
| 	self.n_in = 0 | ||||
| 	self.buf_out, self.buf_in = self.buf_in, self.buf_out | ||||
|  | ||||
| 	local v = self.buf_out[1] | ||||
| 	self.i_out = 2 | ||||
| 	self.buf_out[1] = true | ||||
| 	return v | ||||
| end | ||||
|  | ||||
| -- returns whether the queue is empty | ||||
| function fifo_queue.is_empty(self) | ||||
| 	return self.n_out == self.i_out + 1 and self.n_in == 0 | ||||
| end | ||||
|  | ||||
| -- returns stuff for iteration in a for loop, like pairs | ||||
| -- adding new elements while iterating is no problem | ||||
| function fifo_queue.iter(self) | ||||
| 	return fifo_queue.take, self, nil | ||||
| end | ||||
|  | ||||
| return fifo_queue | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| -- RECEPTORS | ||||
| -- mesecon.is_receptor(nodename)	--> Returns true if nodename is a receptor | ||||
| -- mesecon.is_receptor_on(nodename)	--> Returns true if nodename is an receptor with state = mesecon.state.on | ||||
| -- mesecon.is_receptor_on(nodename	--> Returns true if nodename is an receptor with state = mesecon.state.on | ||||
| -- mesecon.is_receptor_off(nodename)	--> Returns true if nodename is an receptor with state = mesecon.state.off | ||||
| -- mesecon.receptor_get_rules(node)	--> Returns the rules of the receptor (mesecon.rules.default if none specified) | ||||
|  | ||||
| @@ -46,8 +46,6 @@ | ||||
| -- mesecon.rotate_rules_down(rules) | ||||
| -- These functions return rules that have been rotated in the specific direction | ||||
|  | ||||
| local fifo_queue = dofile(minetest.get_modpath("mesecons").."/fifo_queue.lua") | ||||
|  | ||||
| -- General | ||||
| function mesecon.get_effector(nodename) | ||||
| 	if  minetest.registered_nodes[nodename] | ||||
| @@ -94,8 +92,8 @@ function mesecon.get_any_inputrules(node) | ||||
| end | ||||
|  | ||||
| function mesecon.get_any_rules(node) | ||||
| 	return mesecon.merge_rule_sets(mesecon.get_any_inputrules(node), | ||||
| 		mesecon.get_any_outputrules(node)) | ||||
| 	return mesecon.mergetable(mesecon.get_any_inputrules(node) or {}, | ||||
| 		mesecon.get_any_outputrules(node) or {}) | ||||
| end | ||||
|  | ||||
| -- Receptors | ||||
| @@ -368,105 +366,37 @@ function mesecon.is_power_off(pos, rulename) | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| -- The set of conductor states which require light updates when they change. | ||||
| local light_update_conductors | ||||
|  | ||||
| -- Calculate the contents of the above set if they have not been calculated. | ||||
| -- This must be called before get_update_light_conductor. | ||||
| local function find_light_update_conductors() | ||||
| 	-- The expensive calculation is only done the first time. | ||||
| 	if light_update_conductors then return end | ||||
|  | ||||
| 	light_update_conductors = {} | ||||
|  | ||||
| 	-- Find conductors whose lighting characteristics change depending on their state. | ||||
| 	local checked = {} | ||||
| 	for name, def in pairs(minetest.registered_nodes) do | ||||
| 		local conductor = mesecon.get_conductor(name) | ||||
| 		if conductor and not checked[name] then | ||||
| 			-- Find the other states of the conductor besides the current one. | ||||
| 			local other_states | ||||
| 			if conductor.onstate then | ||||
| 				other_states = {conductor.onstate} | ||||
| 			elseif conductor.offstate then | ||||
| 				other_states = {conductor.offstate} | ||||
| 			else | ||||
| 				other_states = conductor.states | ||||
| 			end | ||||
|  | ||||
| 			-- Check the conductor. Other states are marked as checked. | ||||
| 			for _, other_state in ipairs(other_states) do | ||||
| 				local other_def = minetest.registered_nodes[other_state] | ||||
| 				if (def.paramtype == "light") ~= (other_def.paramtype == "light") | ||||
| 				or def.sunlight_propagates ~= other_def.sunlight_propagates | ||||
| 				or def.light_source ~= other_def.light_source then | ||||
| 					-- The light characteristics change depending on the state. | ||||
| 					-- The states are added to the set. | ||||
| 					light_update_conductors[name] = true | ||||
| 					for _, other_state in ipairs(other_states) do | ||||
| 						light_update_conductors[other_state] = true | ||||
| 						checked[other_state] = true | ||||
| 					end | ||||
| 					break | ||||
| 				end | ||||
| 				checked[other_state] = true | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- This is the callback for swap_node_force in turnon and turnoff. It determines | ||||
| -- whether a conductor node necessitates a lighting update. | ||||
| local function get_update_light_conductor(pos, name) | ||||
| 	return light_update_conductors[name] ~= nil | ||||
| end | ||||
|  | ||||
| -- Turn off an equipotential section starting at `pos`, which outputs in the direction of `link`. | ||||
| -- Breadth-first search. Map is abstracted away in a voxelmanip. | ||||
| -- Follow all all conductor paths replacing conductors that were already | ||||
| -- looked at, activating / changing all effectors along the way. | ||||
| function mesecon.turnon(pos, link) | ||||
| 	find_light_update_conductors() | ||||
|  | ||||
| 	local frontiers = fifo_queue.new() | ||||
| 	frontiers:add({pos = pos, link = link}) | ||||
| 	local pos_can_be_skipped = {} | ||||
| 	local frontiers = {{pos = pos, link = link}} | ||||
|  | ||||
| 	local depth = 1 | ||||
| 	for f in frontiers:iter() do | ||||
| 	while frontiers[1] do | ||||
| 		local f = table.remove(frontiers, 1) | ||||
| 		local node = mesecon.get_node_force(f.pos) | ||||
|  | ||||
| 		if not node then | ||||
| 			-- Area does not exist; do nothing | ||||
| 			pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true | ||||
| 		elseif mesecon.is_conductor(node.name) then | ||||
| 		elseif mesecon.is_conductor_off(node, f.link) then | ||||
| 			local rules = mesecon.conductor_get_rules(node) | ||||
|  | ||||
| 			if mesecon.is_conductor_off(node, f.link) then | ||||
| 				-- Call turnon on neighbors | ||||
| 				for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do | ||||
| 					local np = vector.add(f.pos, r) | ||||
| 					if not pos_can_be_skipped[minetest.hash_node_position(np)] then | ||||
| 						for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do | ||||
| 							frontiers:add({pos = np, link = l}) | ||||
| 						end | ||||
| 					end | ||||
| 			-- Call turnon on neighbors | ||||
| 			for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do | ||||
| 				local np = vector.add(f.pos, r) | ||||
| 				for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do | ||||
| 					table.insert(frontiers, {pos = np, link = l}) | ||||
| 				end | ||||
|  | ||||
| 				mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link), get_update_light_conductor) | ||||
| 			end | ||||
|  | ||||
| 			-- Only conductors with flat rules can be reliably skipped later | ||||
| 			if not rules[1] or rules[1].x then | ||||
| 				pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true | ||||
| 			end | ||||
| 			mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link)) | ||||
| 		elseif mesecon.is_effector(node.name) then | ||||
| 			mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth) | ||||
| 			if mesecon.is_effector_off(node.name) then | ||||
| 				mesecon.activate(f.pos, node, f.link, depth) | ||||
| 			end | ||||
| 		else | ||||
| 			pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true | ||||
| 		end | ||||
| 		depth = depth + 1 | ||||
| 	end | ||||
| @@ -489,51 +419,37 @@ end | ||||
| --	depth = indicates order in which signals wire fired, higher is later | ||||
| -- } | ||||
| function mesecon.turnoff(pos, link) | ||||
| 	find_light_update_conductors() | ||||
|  | ||||
| 	local frontiers = fifo_queue.new() | ||||
| 	frontiers:add({pos = pos, link = link}) | ||||
| 	local frontiers = {{pos = pos, link = link}} | ||||
| 	local signals = {} | ||||
| 	local pos_can_be_skipped = {} | ||||
|  | ||||
| 	local depth = 1 | ||||
| 	for f in frontiers:iter() do | ||||
| 	while frontiers[1] do | ||||
| 		local f = table.remove(frontiers, 1) | ||||
| 		local node = mesecon.get_node_force(f.pos) | ||||
|  | ||||
| 		if not node then | ||||
| 			-- Area does not exist; do nothing | ||||
| 			pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true | ||||
| 		elseif mesecon.is_conductor(node.name) then | ||||
| 		elseif mesecon.is_conductor_on(node, f.link) then | ||||
| 			local rules = mesecon.conductor_get_rules(node) | ||||
| 			for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do | ||||
| 				local np = vector.add(f.pos, r) | ||||
|  | ||||
| 			if mesecon.is_conductor_on(node, f.link) then | ||||
| 				for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do | ||||
| 					local np = vector.add(f.pos, r) | ||||
|  | ||||
| 					if not pos_can_be_skipped[minetest.hash_node_position(np)] then | ||||
| 						-- Check if an onstate receptor is connected. If that is the case, | ||||
| 						-- abort this turnoff process by returning false. `receptor_off` will | ||||
| 						-- discard all the changes that we made in the voxelmanip: | ||||
| 						if mesecon.rules_link_rule_all_inverted(f.pos, r)[1] then | ||||
| 							if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then | ||||
| 								return false | ||||
| 							end | ||||
| 						end | ||||
|  | ||||
| 						-- Call turnoff on neighbors | ||||
| 						for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do | ||||
| 							frontiers:add({pos = np, link = l}) | ||||
| 						end | ||||
| 				-- Check if an onstate receptor is connected. If that is the case, | ||||
| 				-- abort this turnoff process by returning false. `receptor_off` will | ||||
| 				-- discard all the changes that we made in the voxelmanip: | ||||
| 				for _, l in ipairs(mesecon.rules_link_rule_all_inverted(f.pos, r)) do | ||||
| 					if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then | ||||
| 						return false | ||||
| 					end | ||||
| 				end | ||||
|  | ||||
| 				mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link), get_update_light_conductor) | ||||
| 				-- Call turnoff on neighbors | ||||
| 				for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do | ||||
| 					table.insert(frontiers, {pos = np, link = l}) | ||||
| 				end | ||||
| 			end | ||||
|  | ||||
| 			-- Only conductors with flat rules can be reliably skipped later | ||||
| 			if not rules[1] or rules[1].x then | ||||
| 				pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true | ||||
| 			end | ||||
| 			mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link)) | ||||
| 		elseif mesecon.is_effector(node.name) then | ||||
| 			table.insert(signals, { | ||||
| 				pos = f.pos, | ||||
| @@ -541,8 +457,6 @@ function mesecon.turnoff(pos, link) | ||||
| 				link = f.link, | ||||
| 				depth = depth | ||||
| 			}) | ||||
| 		else | ||||
| 			pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true | ||||
| 		end | ||||
| 		depth = depth + 1 | ||||
| 	end | ||||
|   | ||||
| @@ -16,9 +16,9 @@ mesecon.rules.default = { | ||||
| 	{x =  0, y = -1, z = -1}, | ||||
| } | ||||
|  | ||||
| mesecon.rules.floor = mesecon.merge_rule_sets(mesecon.rules.default, {{x = 0, y = -1, z = 0}}) | ||||
| mesecon.rules.floor = mesecon.mergetable(mesecon.rules.default, {{x = 0, y = -1, z = 0}}) | ||||
|  | ||||
| mesecon.rules.pplate = mesecon.merge_rule_sets(mesecon.rules.floor, {{x = 0, y = -2, z = 0}}) | ||||
| mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.floor, {{x = 0, y = -2, z = 0}}) | ||||
|  | ||||
| mesecon.rules.buttonlike = { | ||||
| 	{x = 1,  y =  0, z =  0}, | ||||
|   | ||||
| @@ -16,7 +16,7 @@ mesecon.on_placenode = function(pos, node) | ||||
| 			-- also call receptor_on if itself is powered already, so that neighboring | ||||
| 			-- conductors will be activated (when pushing an on-conductor with a piston) | ||||
| 			for _, s in ipairs(sources) do | ||||
| 				local rule = vector.subtract(s, pos) | ||||
| 				local rule = vector.subtract(pos, s) | ||||
| 				mesecon.turnon(pos, rule) | ||||
| 			end | ||||
| 			--mesecon.receptor_on (pos, mesecon.conductor_get_rules(node)) | ||||
|   | ||||
| @@ -164,9 +164,7 @@ end | ||||
|  | ||||
| function mesecon.get_bit(binary,bit) | ||||
| 	bit = bit or 1 | ||||
| 	local len = binary:len() | ||||
| 	if bit > len then return false end | ||||
| 	local c = len-(bit-1) | ||||
| 	local c = binary:len()-(bit-1) | ||||
| 	return binary:sub(c,c) == "1" | ||||
| end | ||||
|  | ||||
| @@ -215,9 +213,8 @@ function mesecon.cmpAny(t1, t2) | ||||
| 	return true | ||||
| end | ||||
|  | ||||
| -- Deprecated. Use `merge_tables` or `merge_rule_sets` as appropriate. | ||||
| -- does not overwrite values; number keys (ipairs) are appended, not overwritten | ||||
| function mesecon.mergetable(source, dest) | ||||
| 	minetest.log("warning", debug.traceback("Deprecated call to mesecon.mergetable")) | ||||
| 	local rval = mesecon.tablecopy(dest) | ||||
|  | ||||
| 	for k, v in pairs(source) do | ||||
| @@ -230,32 +227,6 @@ function mesecon.mergetable(source, dest) | ||||
| 	return rval | ||||
| end | ||||
|  | ||||
| -- Merges several rule sets in one. Order may not be preserved. Nil arguments | ||||
| -- are ignored. | ||||
| -- The rule sets must be of the same kind (either all single-level or all two-level). | ||||
| -- The function may be changed to normalize the resulting set in some way. | ||||
| function mesecon.merge_rule_sets(...) | ||||
| 	local rval = {} | ||||
| 	for _, t in pairs({...}) do -- ignores nils automatically | ||||
| 		table.insert_all(rval, mesecon.tablecopy(t)) | ||||
| 	end | ||||
| 	return rval | ||||
| end | ||||
|  | ||||
| -- Merges two tables, with entries from `replacements` taking precedence over | ||||
| -- those from `base`. Returns the new table. | ||||
| -- Values are deep-copied from either table, keys are referenced. | ||||
| -- Numerical indices aren’t handled specially. | ||||
| function mesecon.merge_tables(base, replacements) | ||||
| 	local ret = mesecon.tablecopy(replacements) -- these are never overriden so have to be copied in any case | ||||
| 	for k, v in pairs(base) do | ||||
| 		if ret[k] == nil then -- it could be `false` | ||||
| 			ret[k] = mesecon.tablecopy(v) | ||||
| 		end | ||||
| 	end | ||||
| 	return ret | ||||
| end | ||||
|  | ||||
| function mesecon.register_node(name, spec_common, spec_off, spec_on) | ||||
| 	spec_common.drop = spec_common.drop or name .. "_off" | ||||
| 	spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode | ||||
| @@ -263,8 +234,8 @@ function mesecon.register_node(name, spec_common, spec_off, spec_on) | ||||
| 	spec_on.__mesecon_state = "on" | ||||
| 	spec_off.__mesecon_state = "off" | ||||
|  | ||||
| 	spec_on = mesecon.merge_tables(spec_common, spec_on); | ||||
| 	spec_off = mesecon.merge_tables(spec_common, spec_off); | ||||
| 	spec_on = mesecon.mergetable(spec_common, spec_on); | ||||
| 	spec_off = mesecon.mergetable(spec_common, spec_off); | ||||
|  | ||||
| 	minetest.register_node(name .. "_on", spec_on) | ||||
| 	minetest.register_node(name .. "_off", spec_off) | ||||
| @@ -343,7 +314,7 @@ function mesecon.vm_commit() | ||||
| 		if tbl.dirty then | ||||
| 			local vm = tbl.vm | ||||
| 			vm:set_data(tbl.data) | ||||
| 			vm:write_to_map(tbl.update_light) | ||||
| 			vm:write_to_map() | ||||
| 			vm:update_map() | ||||
| 		end | ||||
| 	end | ||||
| @@ -364,7 +335,7 @@ local function vm_get_or_create_entry(pos) | ||||
| 		local vm = minetest.get_voxel_manip(pos, pos) | ||||
| 		local min_pos, max_pos = vm:get_emerged_area() | ||||
| 		local va = VoxelArea:new{MinEdge = min_pos, MaxEdge = max_pos} | ||||
| 		tbl = {vm = vm, va = va, data = vm:get_data(), param1 = vm:get_light_data(), param2 = vm:get_param2_data(), dirty = false, update_light = false} | ||||
| 		tbl = {vm = vm, va = va, data = vm:get_data(), param1 = vm:get_light_data(), param2 = vm:get_param2_data(), dirty = false} | ||||
| 		vm_cache[hash] = tbl | ||||
| 	end | ||||
| 	return tbl | ||||
| @@ -388,11 +359,8 @@ end | ||||
| -- Sets a node’s name during a VoxelManipulator-based transaction. | ||||
| -- | ||||
| -- Existing param1, param2, and metadata are left alone. | ||||
| -- | ||||
| -- See mesecon.swap_node_force for documentation about get_update_light. | ||||
| function mesecon.vm_swap_node(pos, name, get_update_light) | ||||
| function mesecon.vm_swap_node(pos, name) | ||||
| 	local tbl = vm_get_or_create_entry(pos) | ||||
| 	tbl.update_light = tbl.update_light or (get_update_light == nil or get_update_light(pos, name)) | ||||
| 	local index = tbl.va:indexp(pos) | ||||
| 	tbl.data[index] = minetest.get_content_id(name) | ||||
| 	tbl.dirty = true | ||||
| @@ -426,15 +394,13 @@ end | ||||
| -- Outside a VM transaction, if the mapblock is not loaded, it is pulled into | ||||
| -- the server’s main map data cache and then accessed from there. | ||||
| -- | ||||
| -- Inside a VM transaction, the transaction’s VM cache is used. If a third | ||||
| -- argument is supplied, it may be called. If it returns false, the swap does | ||||
| -- not necessitate a lighting update. | ||||
| -- Inside a VM transaction, the transaction’s VM cache is used. | ||||
| -- | ||||
| -- This function can only be used to change the node’s name, not its parameters | ||||
| -- or metadata. | ||||
| function mesecon.swap_node_force(pos, name, get_update_light) | ||||
| function mesecon.swap_node_force(pos, name) | ||||
| 	if vm_cache then | ||||
| 		return mesecon.vm_swap_node(pos, name, get_update_light) | ||||
| 		return mesecon.vm_swap_node(pos, name) | ||||
| 	else | ||||
| 		-- This serves to both ensure the mapblock is loaded and also hand us | ||||
| 		-- the old node table so we can preserve param2. | ||||
|   | ||||
| @@ -32,13 +32,7 @@ mesecon.register_node("mesecons_blinkyplant:blinky_plant", { | ||||
| 		fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, | ||||
| 	}, | ||||
| 	on_timer = on_timer, | ||||
| 	on_rightclick = function(pos, node, clicker) | ||||
| 		if minetest.is_protected(pos, clicker and clicker:get_player_name() or "") then | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		toggle_timer(pos) | ||||
| 	end, | ||||
| 	on_rightclick = toggle_timer, | ||||
| 	on_construct = toggle_timer | ||||
| },{ | ||||
| 	tiles = {"jeija_blinky_plant_off.png"}, | ||||
|   | ||||
| @@ -13,19 +13,16 @@ mesecon.button_turnoff = function (pos) | ||||
| 	mesecon.receptor_off(pos, rules) | ||||
| end | ||||
|  | ||||
| local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil | ||||
|  | ||||
| minetest.register_node("mesecons_button:button_off", { | ||||
| 	drawtype = "nodebox", | ||||
| 	tiles = { | ||||
| 		"jeija_wall_button_sides.png", | ||||
| 		"jeija_wall_button_sides.png", | ||||
| 		"jeija_wall_button_sides.png", | ||||
| 		"jeija_wall_button_sides.png", | ||||
| 		"jeija_wall_button_sides.png", | ||||
| 		"jeija_wall_button_off.png" | ||||
| 	"jeija_wall_button_sides.png", | ||||
| 	"jeija_wall_button_sides.png", | ||||
| 	"jeija_wall_button_sides.png", | ||||
| 	"jeija_wall_button_sides.png", | ||||
| 	"jeija_wall_button_sides.png", | ||||
| 	"jeija_wall_button_off.png" | ||||
| 	}, | ||||
| 	use_texture_alpha = use_texture_alpha, | ||||
| 	paramtype = "light", | ||||
| 	paramtype2 = "facedir", | ||||
| 	is_ground_content = false, | ||||
| @@ -69,8 +66,7 @@ minetest.register_node("mesecons_button:button_on", { | ||||
| 		"jeija_wall_button_sides.png", | ||||
| 		"jeija_wall_button_sides.png", | ||||
| 		"jeija_wall_button_on.png" | ||||
| 	}, | ||||
| 	use_texture_alpha = use_texture_alpha, | ||||
| 		}, | ||||
| 	paramtype = "light", | ||||
| 	paramtype2 = "facedir", | ||||
| 	is_ground_content = false, | ||||
|   | ||||
| @@ -10,7 +10,6 @@ minetest.register_chatcommand("say", { | ||||
| minetest.register_chatcommand("tell", { | ||||
| 	params = "<name> <text>", | ||||
| 	description = "Say <text> to <name> privately", | ||||
| 	privs = {shout=true}, | ||||
| 	func = function(name, param) | ||||
| 		local found, _, target, message = param:find("^([^%s]+)%s+(.*)$") | ||||
| 		if found == nil then | ||||
|   | ||||
| @@ -54,7 +54,6 @@ local boxes = { | ||||
| -- Delayer definition defaults | ||||
| local def = { | ||||
| 	drawtype = "nodebox", | ||||
| 	use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil, | ||||
| 	walkable = true, | ||||
| 	selection_box = { | ||||
| 		type = "fixed", | ||||
| @@ -94,7 +93,7 @@ local off_state = { | ||||
| 	wield_image = "mesecons_delayer_off_1.png", | ||||
| 	groups = off_groups, | ||||
| 	on_punch = function(pos, node, puncher) | ||||
| 		if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then | ||||
| 		if minetest.is_protected(pos, puncher and puncher:get_player_name()) then | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| @@ -135,7 +134,7 @@ local on_state = { | ||||
| 	}, | ||||
| 	groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1}, | ||||
| 	on_punch = function(pos, node, puncher) | ||||
| 		if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then | ||||
| 		if minetest.is_protected(pos, puncher and puncher:get_player_name()) then | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
|   | ||||
| @@ -30,6 +30,7 @@ minetest.register_node("mesecons_extrawires:corner_on", { | ||||
| 	walkable = false, | ||||
| 	sunlight_propagates = true, | ||||
| 	selection_box = corner_selectionbox, | ||||
| 	node_box = corner_nodebox, | ||||
| 	groups = {dig_immediate = 3, not_in_creative_inventory = 1}, | ||||
| 	drop = "mesecons_extrawires:corner_off", | ||||
| 	sounds = default.node_sound_defaults(), | ||||
| @@ -57,6 +58,7 @@ minetest.register_node("mesecons_extrawires:corner_off", { | ||||
| 	walkable = false, | ||||
| 	sunlight_propagates = true, | ||||
| 	selection_box = corner_selectionbox, | ||||
| 	node_box = corner_nodebox, | ||||
| 	groups = {dig_immediate = 3}, | ||||
| 	sounds = default.node_sound_defaults(), | ||||
| 	mesecons = {conductor = | ||||
|   | ||||
| @@ -18,7 +18,7 @@ minetest.override_item("default:mese", { | ||||
|  | ||||
| -- Copy node definition of powered mese from normal mese | ||||
| -- and brighten texture tiles to indicate mese is powered | ||||
| local powered_def = mesecon.merge_tables(minetest.registered_nodes["default:mese"], { | ||||
| local powered_def = mesecon.mergetable(minetest.registered_nodes["default:mese"], { | ||||
| 	drop = "default:mese", | ||||
| 	light_source = 5, | ||||
| 	mesecons = {conductor = { | ||||
|   | ||||
| @@ -175,9 +175,9 @@ mesecon.register_node("mesecons_extrawires:vertical_bottom", { | ||||
| minetest.register_craft({ | ||||
| 	output = "mesecons_extrawires:vertical_off 3", | ||||
| 	recipe = { | ||||
| 		{"group:mesecon_conductor_craftable"}, | ||||
| 		{"group:mesecon_conductor_craftable"}, | ||||
| 		{"group:mesecon_conductor_craftable"}, | ||||
| 		{"mesecons:wire_00000000_off"}, | ||||
| 		{"mesecons:wire_00000000_off"}, | ||||
| 		{"mesecons:wire_00000000_off"} | ||||
| 	} | ||||
| }) | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,6 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", { | ||||
| 		"jeija_hydro_turbine_turbine_top_bottom_off.png", | ||||
| 		"jeija_hydro_turbine_turbine_misc_off.png" | ||||
| 	}, | ||||
| 	use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil, | ||||
| 	inventory_image = "jeija_hydro_turbine_inv.png", | ||||
| 	is_ground_content = false, | ||||
| 	wield_scale = {x=0.75, y=0.75, z=0.75}, | ||||
| @@ -43,7 +42,6 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", { | ||||
| 		{ name = "jeija_hydro_turbine_turbine_misc_on.png", | ||||
| 		    animation = {type = "vertical_frames", aspect_w = 256, aspect_h = 32, length = 0.4} } | ||||
| 	}, | ||||
| 	use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or nil, | ||||
| 	inventory_image = "jeija_hydro_turbine_inv.png", | ||||
| 	drop = "mesecons_hydroturbine:hydro_turbine_off 1", | ||||
| 	groups = {dig_immediate=2,not_in_creative_inventory=1}, | ||||
|   | ||||
| @@ -86,7 +86,7 @@ minetest.register_craft({ | ||||
| 	output = "mesecons_insulated:insulated_off 3", | ||||
| 	recipe = { | ||||
| 		{"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"}, | ||||
| 		{"group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable"}, | ||||
| 		{"mesecons:wire_00000000_off", "mesecons:wire_00000000_off", "mesecons:wire_00000000_off"}, | ||||
| 		{"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"}, | ||||
| 	} | ||||
| }) | ||||
|   | ||||
| @@ -9,12 +9,9 @@ local mesecon_lamp_box = { | ||||
| 	wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125}, | ||||
| } | ||||
|  | ||||
| local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil | ||||
|  | ||||
| minetest.register_node("mesecons_lamp:lamp_on", { | ||||
| 	drawtype = "nodebox", | ||||
| 	tiles = {"jeija_meselamp_on.png"}, | ||||
| 	use_texture_alpha = use_texture_alpha, | ||||
| 	paramtype = "light", | ||||
| 	paramtype2 = "wallmounted", | ||||
| 	is_ground_content = false, | ||||
| @@ -39,7 +36,6 @@ minetest.register_node("mesecons_lamp:lamp_on", { | ||||
| minetest.register_node("mesecons_lamp:lamp_off", { | ||||
| 	drawtype = "nodebox", | ||||
| 	tiles = {"jeija_meselamp_off.png"}, | ||||
| 	use_texture_alpha = use_texture_alpha, | ||||
| 	inventory_image = "jeija_meselamp.png", | ||||
| 	wield_image = "jeija_meselamp.png", | ||||
| 	paramtype = "light", | ||||
|   | ||||
| @@ -29,6 +29,9 @@ function mesecon.is_mvps_stopper(node, pushdir, stack, stackid) | ||||
| end | ||||
|  | ||||
| function mesecon.register_mvps_stopper(nodename, get_stopper) | ||||
| 	if minetest.registered_nodes[nodename] and minetest.registered_nodes[nodename].buildable_to then | ||||
| 		minetest.log("warning", ("Registering a buildable-to node \"%s\" as a mesecon stopper, this is not supported"):format(nodename)) | ||||
| 	end | ||||
| 	if get_stopper == nil then | ||||
| 			get_stopper = true | ||||
| 	end | ||||
| @@ -71,6 +74,10 @@ function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky) | ||||
| 		local np = frontiers[1] | ||||
| 		local nn = minetest.get_node(np) | ||||
|  | ||||
| 		-- Never push into unloaded blocks. Don’t try to pull from them, either. | ||||
| 		-- TODO: load blocks instead, as with wires. | ||||
| 		if nn.name == "ignore" then return nil end | ||||
|  | ||||
| 		if not node_replaceable(nn.name) then | ||||
| 			table.insert(nodes, {node = nn, pos = np}) | ||||
| 			if #nodes > maximum then return nil end | ||||
| @@ -327,10 +334,6 @@ function mesecon.mvps_move_objects(pos, dir, nodestack, movefactor) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- Never push into unloaded blocks. Don’t try to pull from them, either. | ||||
| -- TODO: load blocks instead, as with wires. | ||||
| mesecon.register_mvps_stopper("ignore") | ||||
|  | ||||
| mesecon.register_mvps_stopper("doors:door_steel_b_1") | ||||
| mesecon.register_mvps_stopper("doors:door_steel_t_1") | ||||
| mesecon.register_mvps_stopper("doors:door_steel_b_2") | ||||
|   | ||||
| @@ -3,11 +3,7 @@ minetest.register_node("mesecons_noteblock:noteblock", { | ||||
| 	tiles = {"mesecons_noteblock.png"}, | ||||
| 	is_ground_content = false, | ||||
| 	groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, | ||||
| 	on_punch = function(pos, node, puncher) -- change sound when punched | ||||
| 		if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 	on_punch = function(pos, node) -- change sound when punched | ||||
| 		node.param2 = (node.param2+1)%12 | ||||
| 		mesecon.noteblock_play(pos, node.param2) | ||||
| 		minetest.set_node(pos, node) | ||||
|   | ||||
| @@ -195,11 +195,10 @@ local function register_wires() | ||||
| 		}} | ||||
|  | ||||
| 		local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1, | ||||
| 			not_in_creative_inventory = 1, not_in_craft_guide = 1} | ||||
| 			not_in_creative_inventory = 1} | ||||
| 		local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1} | ||||
| 		if nodeid ~= "00000000" then | ||||
| 			groups_off["not_in_creative_inventory"] = 1 | ||||
| 			groups_off["not_in_craft_guide"] = 1 | ||||
| 		end | ||||
|  | ||||
| 		mesecon.register_node(":mesecons:wire_"..nodeid, { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user