forked from luanti-org/minetest_game
		
	Boats / carts: Fix and improve on_punch functions
Boats: Previously, boats were not added to inventory in creative mode, fix. In creative mode multiple boats will not be added to inventory. Add comment. Carts: Set speed to 2 if punched by a non-player, to match the effect of a player punch. Add comments.
This commit is contained in:
		| @@ -109,18 +109,19 @@ function boat.on_punch(self, puncher) | |||||||
| 	end | 	end | ||||||
| 	if not self.driver then | 	if not self.driver then | ||||||
| 		self.removed = true | 		self.removed = true | ||||||
|  | 		local inv = puncher:get_inventory() | ||||||
|  | 		if not minetest.setting_getbool("creative_mode") | ||||||
|  | 				or not inv:contains_item("main", "boats:boat") then | ||||||
|  | 			local leftover = inv:add_item("main", "boats:boat") | ||||||
|  | 			-- if no room in inventory add a replacement boat to the world | ||||||
|  | 			if not leftover:is_empty() then | ||||||
|  | 				minetest.add_item(self.object:getpos(), leftover) | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
| 		-- delay remove to ensure player is detached | 		-- delay remove to ensure player is detached | ||||||
| 		minetest.after(0.1, function() | 		minetest.after(0.1, function() | ||||||
| 			self.object:remove() | 			self.object:remove() | ||||||
| 		end) | 		end) | ||||||
| 		if not minetest.setting_getbool("creative_mode") then |  | ||||||
| 			local inv = puncher:get_inventory() |  | ||||||
| 			if inv:room_for_item("main", "boats:boat") then |  | ||||||
| 				inv:add_item("main", "boats:boat") |  | ||||||
| 			else |  | ||||||
| 				minetest.add_item(self.object:getpos(), "boats:boat") |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -62,22 +62,22 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, | |||||||
| 		local node = minetest.get_node(pos).name | 		local node = minetest.get_node(pos).name | ||||||
| 		self.railtype = minetest.get_item_group(node, "connect_to_raillike") | 		self.railtype = minetest.get_item_group(node, "connect_to_raillike") | ||||||
| 	end | 	end | ||||||
|  | 	-- Punched by non-player | ||||||
| 	if not puncher or not puncher:is_player() then | 	if not puncher or not puncher:is_player() then | ||||||
| 		local cart_dir = carts:get_rail_direction(pos, self.old_dir, nil, nil, self.railtype) | 		local cart_dir = carts:get_rail_direction(pos, self.old_dir, nil, nil, self.railtype) | ||||||
| 		if vector.equals(cart_dir, {x=0, y=0, z=0}) then | 		if vector.equals(cart_dir, {x=0, y=0, z=0}) then | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		self.velocity = vector.multiply(cart_dir, 3) | 		self.velocity = vector.multiply(cart_dir, 2) | ||||||
| 		self.punched = true | 		self.punched = true | ||||||
| 		return | 		return | ||||||
| 	end | 	end | ||||||
|  | 	-- Player digs cart by sneak-punch | ||||||
| 	if puncher:get_player_control().sneak then | 	if puncher:get_player_control().sneak then | ||||||
| 		if self.sound_handle then | 		if self.sound_handle then | ||||||
| 			minetest.sound_stop(self.sound_handle) | 			minetest.sound_stop(self.sound_handle) | ||||||
| 		end | 		end | ||||||
| 		-- Pick up cart: Drop all attachments | 		-- Detach driver and items | ||||||
| 		if self.driver then | 		if self.driver then | ||||||
| 			if self.old_pos then | 			if self.old_pos then | ||||||
| 				self.object:setpos(self.old_pos) | 				self.object:setpos(self.old_pos) | ||||||
| @@ -90,11 +90,12 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, | |||||||
| 				obj_:set_detach() | 				obj_:set_detach() | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
|  | 		-- Pick up cart | ||||||
| 		local inv = puncher:get_inventory() | 		local inv = puncher:get_inventory() | ||||||
| 		if not minetest.setting_getbool("creative_mode") | 		if not minetest.setting_getbool("creative_mode") | ||||||
| 				or not inv:contains_item("main", "carts:cart") then | 				or not inv:contains_item("main", "carts:cart") then | ||||||
| 			local leftover = inv:add_item("main", "carts:cart") | 			local leftover = inv:add_item("main", "carts:cart") | ||||||
|  | 			-- If no room in inventory add a replacement cart to the world | ||||||
| 			if not leftover:is_empty() then | 			if not leftover:is_empty() then | ||||||
| 				minetest.add_item(self.object:getpos(), leftover) | 				minetest.add_item(self.object:getpos(), leftover) | ||||||
| 			end | 			end | ||||||
| @@ -102,7 +103,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, | |||||||
| 		self.object:remove() | 		self.object:remove() | ||||||
| 		return | 		return | ||||||
| 	end | 	end | ||||||
|  | 	-- Player punches cart to alter velocity | ||||||
| 	local vel = self.object:getvelocity() | 	local vel = self.object:getvelocity() | ||||||
| 	if puncher:get_player_name() == self.driver then | 	if puncher:get_player_name() == self.driver then | ||||||
| 		if math.abs(vel.x + vel.z) > carts.punch_speed_max then | 		if math.abs(vel.x + vel.z) > carts.punch_speed_max then | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user