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:
paramat 2016-11-29 02:28:55 +00:00
parent 04f045158f
commit f06f66ccc2
2 changed files with 16 additions and 14 deletions

View File

@ -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

View File

@ -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