From f06f66ccc287e4773e4259cbeba95fcb0f522363 Mon Sep 17 00:00:00 2001
From: paramat <mat.gregory@virginmedia.com>
Date: Tue, 29 Nov 2016 02:28:55 +0000
Subject: [PATCH] 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.
---
 mods/boats/init.lua        | 17 +++++++++--------
 mods/carts/cart_entity.lua | 13 +++++++------
 2 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/mods/boats/init.lua b/mods/boats/init.lua
index 26486f4..9f1264b 100644
--- a/mods/boats/init.lua
+++ b/mods/boats/init.lua
@@ -109,18 +109,19 @@ function boat.on_punch(self, puncher)
 	end
 	if not self.driver then
 		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
 		minetest.after(0.1, function()
 			self.object:remove()
 		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
 
diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua
index a0a2d9f..a0b0e3f 100644
--- a/mods/carts/cart_entity.lua
+++ b/mods/carts/cart_entity.lua
@@ -62,22 +62,22 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities,
 		local node = minetest.get_node(pos).name
 		self.railtype = minetest.get_item_group(node, "connect_to_raillike")
 	end
-
+	-- Punched by non-player
 	if not puncher or not puncher:is_player() then
 		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
 			return
 		end
-		self.velocity = vector.multiply(cart_dir, 3)
+		self.velocity = vector.multiply(cart_dir, 2)
 		self.punched = true
 		return
 	end
-
+	-- Player digs cart by sneak-punch
 	if puncher:get_player_control().sneak then
 		if self.sound_handle then
 			minetest.sound_stop(self.sound_handle)
 		end
-		-- Pick up cart: Drop all attachments
+		-- Detach driver and items
 		if self.driver then
 			if self.old_pos then
 				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()
 			end
 		end
-
+		-- Pick up cart
 		local inv = puncher:get_inventory()
 		if not minetest.setting_getbool("creative_mode")
 				or not inv:contains_item("main", "carts:cart") then
 			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
 				minetest.add_item(self.object:getpos(), leftover)
 			end
@@ -102,7 +103,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities,
 		self.object:remove()
 		return
 	end
-
+	-- Player punches cart to alter velocity
 	local vel = self.object:getvelocity()
 	if puncher:get_player_name() == self.driver then
 		if math.abs(vel.x + vel.z) > carts.punch_speed_max then