diff options
| author | root <root@linux-forks.de> | 2018-07-18 16:14:28 +0200 | 
|---|---|---|
| committer | root <root@linux-forks.de> | 2018-07-18 16:14:28 +0200 | 
| commit | c18b9fc40837aacb1ed37b7c07eeeea315ed586b (patch) | |
| tree | 1ebcea31726a6113ee90991d1e47e5aab5ce4368 | |
| parent | 217869f2c1109383aaeb753c130c333840b8078f (diff) | |
| parent | 8186f003beae42c9815b3c9c131e919f5b099035 (diff) | |
Merge branch 'master' of https://github.com/minetest-mods/pipeworks
| -rw-r--r-- | common.lua | 131 | ||||
| -rw-r--r-- | filter-injector.lua | 8 | ||||
| -rw-r--r-- | item_transport.lua | 30 | ||||
| -rw-r--r-- | legacy.lua | 2 | ||||
| -rw-r--r-- | luaentity.lua | 38 | ||||
| -rw-r--r-- | vacuum_tubes.lua | 2 | ||||
| -rw-r--r-- | wielder.lua | 91 | 
7 files changed, 189 insertions, 113 deletions
| @@ -157,3 +157,134 @@ function pipeworks.load_position(pos)  	local vm = minetest.get_voxel_manip()  	vm:read_from_map(pos, pos)  end + +local function delay(...) +	local args = {...} +	return (function() return unpack(args) end) +end + +local function get_set_wrap(name, is_dynamic) +	return (function(self) +		return self["_" .. name] +	end), (function(self, value) +		if is_dynamic then +			self["_" .. name] = type(value) == "table" +				and table.copy(value) or value +		end +	end) +end + +function pipeworks.create_fake_player(def, is_dynamic) +	local wielded_item = ItemStack("") +	if def.inventory and def.wield_list then +		wielded_item = def.inventory:get_stack(def.wield_list, def.wield_index or 1) +	end +	local p = { +		get_player_name = delay(def.name), +		is_player = delay(true), +		is_fake_player = true, + +		_formspec = def.formspec or default.gui_survival_form, +		_hp = def.hp or 20, +		_breath = 11, +		_pos = def.position and table.copy(def.position) or vector.new(), +		_properties = def.properties or { eye_height = def.eye_height or 1.47 }, +		_inventory = def.inventory, +		_wield_index = def.wield_index or 1, +		_wielded_item = wielded_item, + +		-- Model and view +		_eye_offset1 = vector.new(), +		_eye_offset3 = vector.new(), +		set_eye_offset = function(self, first, third) +			self._eye_offset1 = table.copy(first) +			self._eye_offset3 = table.copy(third) +		end, +		get_eye_offset = function(self) +			return self._eye_offset1, self._eye_offset3 +		end, +		get_look_dir = delay(def.look_dir or {x=0, y=0, z=1}), +		get_look_pitch = delay(def.look_pitch or 0), +		get_look_yaw = delay(def.look_yaw or 0), +		get_look_horizontal = delay(def.look_yaw or 0), +		get_look_vertical = delay(-(def.look_pitch or 0)), +		set_animation = delay(), + +		-- Controls +		get_player_control = delay({ +			jump=false, right=false, left=false, LMB=false, RMB=false, +			sneak=def.sneak, aux1=false, down=false, up=false +		}), +		get_player_control_bits = delay(def.sneak and 64 or 0), + +		-- Inventory and ItemStacks +		get_inventory = delay(def.inventory), +		set_wielded_item = function(self, item) +			if self._inventory and def.wield_list then +				return self._inventory:set_stack(def.wield_list, +					self._wield_index, item) +			end +			_wielded_item = ItemStack(item) +		end, +		get_wielded_item = function(self, item) +			if self._inventory and def.wield_list then +				return self._inventory:get_stack(def.wield_list, +					self._wield_index) +			end +			return ItemStack(self._wielded_item) +		end, +		get_wield_list = delay(def.wield_list), + +		punch = delay(), +		remove = delay(), +		right_click = delay(), +		set_attach = delay(), +		set_detach = delay(), +		set_bone_position = delay(), +		hud_change = delay(), +	} +	local _trash +	-- Getter & setter functions +	p.get_inventory_formspec, p.set_inventory_formspec +		= get_set_wrap("formspec", is_dynamic) +	p.get_breath, p.set_breath = get_set_wrap("breath", is_dynamic) +	p.get_hp, p.set_hp = get_set_wrap("hp", is_dynamic) +	p.get_pos, p.set_pos = get_set_wrap("pos", is_dynamic) +	_trash, p.move_to = get_set_wrap("pos", is_dynamic) +	p.get_wield_index, p.set_wield_index = get_set_wrap("wield_index", true) +	p.get_properties, p.set_properties = get_set_wrap("properties", false) + +	-- Backwards compatibilty +	p.getpos = p.get_pos +	p.setpos = p.set_pos +	p.moveto = p.move_to + +	-- TODO "implement" all these +	-- set_armor_groups +	-- get_armor_groups +	-- get_animation +	-- get_bone_position +	-- get_player_velocity +	-- set_look_pitch +	-- set_look_yaw +	-- set_physics_override +	-- get_physics_override +	-- hud_add +	-- hud_remove +	-- hud_get +	-- hud_set_flags +	-- hud_get_flags +	-- hud_set_hotbar_itemcount +	-- hud_get_hotbar_itemcount +	-- hud_set_hotbar_image +	-- hud_get_hotbar_image +	-- hud_set_hotbar_selected_image +	-- hud_get_hotbar_selected_image +	-- hud_replace_builtin +	-- set_sky +	-- get_sky +	-- override_day_night_ratio +	-- get_day_night_ratio +	-- set_local_animation +	return p +end diff --git a/filter-injector.lua b/filter-injector.lua index 0f651fb..a8659ad 100644 --- a/filter-injector.lua +++ b/filter-injector.lua @@ -167,11 +167,9 @@ local function punch_filter(data, filtpos, filtnode, msg)  	local filtmeta = minetest.get_meta(filtpos)  	local filtinv = filtmeta:get_inventory()  	local owner = filtmeta:get_string("owner") -	local fakePlayer = { -		get_player_name = delay(owner), -		is_fake_player = ":pipeworks", -		get_wielded_item = delay(ItemStack(nil)) -	} -- TODO: use a mechanism as the wielder one +	local fakePlayer = pipeworks.create_fake_player({ +		name = owner +	})  	local dir = pipeworks.facedir_to_right_dir(filtnode.param2)  	local frompos = vector.subtract(filtpos, dir)  	local fromnode = minetest.get_node(frompos) diff --git a/item_transport.lua b/item_transport.lua index 7219f7e..388e2e7 100644 --- a/item_transport.lua +++ b/item_transport.lua @@ -13,7 +13,7 @@ function pipeworks.tube_inject_item(pos, start_pos, velocity, item, owner)  	local obj = luaentity.add_entity(pos, "pipeworks:tubed_item")  	obj:set_item(stack:to_string())  	obj.start_pos = vector.new(start_pos) -	obj:setvelocity(velocity) +	obj:set_velocity(velocity)  	obj.owner = owner  	--obj:set_color("red") -- todo: this is test-only code  	return obj @@ -207,7 +207,7 @@ minetest.register_entity("pipeworks:tubed_item", {  			textures = {stack:get_name()}  		})  		local def = stack:get_definition() -		self.object:setyaw((def and def.type == "node") and 0 or math.pi * 0.25) +		self.object:set_yaw((def and def.type == "node") and 0 or math.pi * 0.25)  	end,  	get_staticdata = luaentity.get_staticdata, @@ -220,7 +220,7 @@ minetest.register_entity("pipeworks:tubed_item", {  			return  		end  		local item = minetest.deserialize(staticdata) -		pipeworks.tube_inject_item(self.object:getpos(), item.start_pos, item.velocity, item.itemstring) +		pipeworks.tube_inject_item(self.object:get_pos(), item.start_pos, item.velocity, item.itemstring)  		self.object:remove()  	end,  }) @@ -293,15 +293,15 @@ luaentity.register_entity("pipeworks:tubed_item", {  	end,  	on_step = function(self, dtime) -		local pos = self:getpos() +		local pos = self:get_pos()  		if self.start_pos == nil then  			self.start_pos = vector.round(pos) -			self:setpos(pos) +			self:set_pos(pos)  		end  		local stack = ItemStack(self.itemstring) -		local velocity = self:getvelocity() +		local velocity = self:get_velocity()  		local moved = false  		local speed = math.abs(velocity.x + velocity.y + velocity.z) @@ -331,8 +331,8 @@ luaentity.register_entity("pipeworks:tubed_item", {  				return  			end  			velocity = vector.multiply(velocity, -1) -			self:setpos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1))) -			self:setvelocity(velocity) +			self:set_pos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1))) +			self:set_velocity(velocity)  			self:set_item(leftover:to_string())  			return  		end @@ -350,13 +350,13 @@ luaentity.register_entity("pipeworks:tubed_item", {  					-- compatible with Minetest 0.4.13.  					-- Using item_drop here makes Minetest 0.4.13 crash.  					local dropped_item = minetest.add_item(self.start_pos, stack) -					dropped_item:setvelocity(vector.multiply(velocity, 5)) +					dropped_item:set_velocity(vector.multiply(velocity, 5))  					self:remove()  					return  				else  					velocity = vector.multiply(velocity, -1) -					self:setpos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1))) -					self:setvelocity(velocity) +					self:set_pos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1))) +					self:set_velocity(velocity)  				end  			elseif is_multimode(multimode) then  				-- create new stacks according to returned data. @@ -371,8 +371,8 @@ luaentity.register_entity("pipeworks:tubed_item", {  			if new_velocity and not vector.equals(velocity, new_velocity) then  				local nvelr = math.abs(new_velocity.x + new_velocity.y + new_velocity.z) -				self:setpos(vector.add(self.start_pos, vector.multiply(new_velocity, (moved_by - 1) / nvelr))) -				self:setvelocity(new_velocity) +				self:set_pos(vector.add(self.start_pos, vector.multiply(new_velocity, (moved_by - 1) / nvelr))) +				self:set_velocity(new_velocity)  			end  		end  	end @@ -388,11 +388,11 @@ if minetest.get_modpath("mesecons_mvps") then  		end  		for id, entity in pairs(luaentity.entities) do  			if entity.name == "pipeworks:tubed_item" then -				local pos = entity:getpos() +				local pos = entity:get_pos()  				local rpos = vector.round(pos)  				local dir = moved[minetest.hash_node_position(rpos)]  				if dir then -					entity:setpos(vector.add(pos, dir)) +					entity:set_pos(vector.add(pos, dir))  					entity.start_pos = vector.add(entity.start_pos, dir)  				end  			end @@ -36,7 +36,7 @@ if not minetest.get_modpath("auto_tree_tap") and  		end,  		after_place_node = function (pos, placer)  			pipeworks.scan_for_tube_objects(pos, placer) -			local placer_pos = placer:getpos() +			local placer_pos = placer:get_pos()  			--correct for the player's height  			if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end diff --git a/luaentity.lua b/luaentity.lua index 34b6665..c11c030 100644 --- a/luaentity.lua +++ b/luaentity.lua @@ -74,7 +74,7 @@ local move_entities_globalstep_part1 = function(dtime)  	local active_block_range = tonumber(minetest.settings:get("active_block_range")) or 2  	local new_active_blocks = {}  	for _, player in ipairs(minetest.get_connected_players()) do -		local blockpos = get_blockpos(player:getpos()) +		local blockpos = get_blockpos(player:get_pos())  		local minp = vector.subtract(blockpos, active_block_range)  		local maxp = vector.add(blockpos, active_block_range) @@ -114,9 +114,9 @@ local entitydef_default = {  		if not def.entity then  			return  		end -		def.entity:setpos(vector.add(self._pos, def.offset)) -		def.entity:setvelocity(self._velocity) -		def.entity:setacceleration(self._acceleration) +		def.entity:set_pos(vector.add(self._pos, def.offset)) +		def.entity:set_velocity(self._velocity) +		def.entity:set_acceleration(self._acceleration)  	end,  	_attach_all = function(self)  		local master = self._attached_entities_master @@ -186,43 +186,43 @@ local entitydef_default = {  			self:_add_attached(id)  		end  	end, -	getid = function(self) +	get_id = function(self)  		return self._id  	end, -	getpos = function(self) +	get_pos = function(self)  		return vector.new(self._pos)  	end, -	setpos = function(self, pos) +	set_pos = function(self, pos)  		self._pos = vector.new(pos)  		--for _, entity in pairs(self._attached_entities) do  		--	if entity.entity then -		--		entity.entity:setpos(vector.add(self._pos, entity.offset)) +		--		entity.entity:set_pos(vector.add(self._pos, entity.offset))  		--	end  		--end  		local master = self._attached_entities_master  		if master then  			local master_def = self._attached_entities[master] -			master_def.entity:setpos(vector.add(self._pos, master_def.offset)) +			master_def.entity:set_pos(vector.add(self._pos, master_def.offset))  		end  	end, -	getvelocity = function(self) +	get_velocity = function(self)  		return vector.new(self._velocity)	  	end, -	setvelocity = function(self, velocity) +	set_velocity = function(self, velocity)  		self._velocity = vector.new(velocity)  		local master = self._attached_entities_master  		if master then -			self._attached_entities[master].entity:setvelocity(self._velocity) +			self._attached_entities[master].entity:set_velocity(self._velocity)  		end  	end, -	getacceleration = function(self) +	get_acceleration = function(self)  		return vector.new(self._acceleration)  	end, -	setacceleration = function(self, acceleration) +	set_acceleration = function(self, acceleration)  		self._acceleration = vector.new(acceleration)  		local master = self._attached_entities_master  		if master then -			self._attached_entities[master].entity:setacceleration(self._acceleration) +			self._attached_entities[master].entity:set_acceleration(self._acceleration)  		end  	end,  	remove = function(self) @@ -314,7 +314,7 @@ function luaentity.get_objects_inside_radius(pos, radius)  	local objects = {}  	local index = 1  	for id, entity in pairs(luaentity.entities) do -		if vector.distance(pos, entity:getpos()) <= radius then +		if vector.distance(pos, entity:get_pos()) <= radius then  			objects[index] = entity  			index = index + 1  		end @@ -329,11 +329,11 @@ local move_entities_globalstep_part2 = function(dtime)  		local master = entity._attached_entities_master  		local master_def = master and entity._attached_entities[master]  		local master_entity = master_def and master_def.entity -		local master_entity_pos = master_entity and master_entity:getpos() +		local master_entity_pos = master_entity and master_entity:get_pos()  		if master_entity_pos then  			entity._pos = vector.subtract(master_entity_pos, master_def.offset) -			entity._velocity = master_entity:getvelocity() -			entity._acceleration = master_entity:getacceleration() +			entity._velocity = master_entity:get_velocity() +			entity._acceleration = master_entity:get_acceleration()  		else  			entity._pos = vector.add(vector.add(  				entity._pos, diff --git a/vacuum_tubes.lua b/vacuum_tubes.lua index 211c3ee..d616835 100644 --- a/vacuum_tubes.lua +++ b/vacuum_tubes.lua @@ -87,7 +87,7 @@ local function vacuum(pos, radius)  	for _, object in pairs(minetest.get_objects_inside_radius(pos, math.sqrt(3) * radius)) do  		local lua_entity = object:get_luaentity()  		if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then -			local obj_pos = object:getpos() +			local obj_pos = object:get_pos()  			local minpos = vector.subtract(pos, radius)  			local maxpos = vector.add(pos, radius)  			if  obj_pos.x >= minpos.x and obj_pos.x <= maxpos.x diff --git a/wielder.lua b/wielder.lua index eb7931f..98f1ef0 100644 --- a/wielder.lua +++ b/wielder.lua @@ -53,11 +53,10 @@ local function wielder_on(data, wielder_pos, wielder_node)  	local wielder_meta = minetest.get_meta(wielder_pos)  	local inv = wielder_meta:get_inventory()  	local wield_inv_name = data.wield_inv_name -	local wieldindex, wieldstack +	local wieldindex  	for i, stack in ipairs(inv:get_list(wield_inv_name)) do  		if not stack:is_empty() then  			wieldindex = i -			wieldstack = stack  			break  		end  	end @@ -66,7 +65,6 @@ local function wielder_on(data, wielder_pos, wielder_node)  		wield_inv_name = data.ghost_inv_name  		inv:set_stack(wield_inv_name, 1, ItemStack(data.ghost_tool))  		wieldindex = 1 -		wieldstack = inv:get_stack(wield_inv_name, 1)  	end  	local dir = minetest.facedir_to_dir(wielder_node.param2)  	-- under/above is currently intentionally left switched @@ -98,73 +96,20 @@ local function wielder_on(data, wielder_pos, wielder_node)  		yaw = 0  		pitch = math.pi/2  	end -	local virtplayer = { -		get_inventory_formspec = delay(wielder_meta:get_string("formspec")), -		get_look_dir = delay(vector.multiply(dir, -1)), -		get_look_pitch = delay(pitch), -		get_look_yaw = delay(yaw), -		get_look_horizontal = delay(yaw), -		get_look_vertical = delay(pitch), -		get_player_control = delay({ jump=false, right=false, left=false, LMB=false, RMB=false, sneak=data.sneak, aux1=false, down=false, up=false }), -		get_player_control_bits = delay(data.sneak and 64 or 0), -		get_player_name = delay(data.masquerade_as_owner and wielder_meta:get_string("owner") or ":pipeworks:"..minetest.pos_to_string(wielder_pos)), -		is_player = delay(true), -		is_fake_player = true, -		set_inventory_formspec = delay(), -		getpos = delay(vector.subtract(wielder_pos, assumed_eye_pos)), -		get_hp = delay(20), -		get_inventory = delay(inv), -		get_wielded_item = delay(wieldstack), -		get_wield_index = delay(wieldindex), -		get_wield_list = delay(wield_inv_name), -		moveto = delay(), -		punch = delay(), -		remove = delay(), -		right_click = delay(), -		setpos = delay(), -		set_hp = delay(), -		set_properties = delay(), -		set_wielded_item = function(self, item) -			wieldstack = item -			inv:set_stack(wield_inv_name, wieldindex, item) -		end, -		set_animation = delay(), -		set_attach = delay(), -		set_detach = delay(), -		set_bone_position = delay(), -		hud_change = delay(), -		get_breath = delay(11), -		-- TODO "implement" all these -		-- set_armor_groups -		-- get_armor_groups -		-- get_animation -		-- get_attach -		-- get_bone_position -		-- get_properties -		-- get_player_velocity -		-- set_look_pitch -		-- set_look_yaw -		-- set_breath -		-- set_physics_override -		-- get_physics_override -		-- hud_add -		-- hud_remove -		-- hud_get -		-- hud_set_flags -		-- hud_get_flags -		-- hud_set_hotbar_itemcount -		-- hud_get_hotbar_itemcount -		-- hud_set_hotbar_image -		-- hud_get_hotbar_image -		-- hud_set_hotbar_selected_image -		-- hud_get_hotbar_selected_image -		-- hud_replace_builtin -		-- set_sky -		-- get_sky -		-- override_day_night_ratio -		-- get_day_night_ratio -		-- set_local_animation -	} +	local virtplayer = pipeworks.create_fake_player({ +		name = data.masquerade_as_owner and wielder_meta:get_string("owner") +			or ":pipeworks:" .. minetest.pos_to_string(wielder_pos), +		formspec = wielder_meta:get_string("formspec"), +		look_dir = vector.multiply(dir, -1), +		look_pitch = pitch, +		look_yaw = yaw, +		sneak = data.sneak, +		position = vector.subtract(wielder_pos, assumed_eye_pos), +		inventory = inv, +		wield_index = wieldindex, +		wield_list = wield_inv_name +	}) +  	local pointed_thing = { type="node", under=under_pos, above=above_pos }  	data.act(virtplayer, pointed_thing)  	if data.eject_drops then @@ -258,7 +203,7 @@ local function register_wielder(data)  			end,  			after_place_node = function (pos, placer)  				pipeworks.scan_for_tube_objects(pos) -				local placer_pos = placer:getpos() +				local placer_pos = placer:get_pos()  				if placer_pos and placer:is_player() then placer_pos = vector.add(placer_pos, assumed_eye_pos) end  				if placer_pos then  					local dir = vector.subtract(pos, placer_pos) @@ -495,7 +440,9 @@ if pipeworks.enable_dispenser then  		sneak = true,  		act = function(virtplayer, pointed_thing)  			local wieldstack = virtplayer:get_wielded_item() -			virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or {on_drop=minetest.item_drop}).on_drop(wieldstack, virtplayer, virtplayer:getpos()) or wieldstack) +			virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or +				{on_drop=minetest.item_drop}).on_drop(wieldstack, virtplayer, virtplayer:get_pos()) or +				wieldstack)  		end,  		eject_drops = false,  	}) | 
