summaryrefslogtreecommitdiff
path: root/builtin/game/item_entity.lua
diff options
context:
space:
mode:
authorDTA7 <dta7e@t-online.de>2017-09-18 20:18:55 +0200
committerparamat <mat.gregory@virginmedia.com>2017-11-06 13:51:26 +0000
commitce832eb4218340d92caa8961f5b7d7c2cda47a7e (patch)
tree2406cdab23ec305d63bbf30b475537df0ea9db5e /builtin/game/item_entity.lua
parent179476d8330ff0fd03c3c95bbb8ea0f55e5ad2ed (diff)
downloadminetest-ce832eb4218340d92caa8961f5b7d7c2cda47a7e.tar.gz
minetest-ce832eb4218340d92caa8961f5b7d7c2cda47a7e.tar.bz2
minetest-ce832eb4218340d92caa8961f5b7d7c2cda47a7e.zip
Item entities: Enable item collision detection for sudden movement
Diffstat (limited to 'builtin/game/item_entity.lua')
-rw-r--r--builtin/game/item_entity.lua33
1 files changed, 15 insertions, 18 deletions
diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua
index 718c94fb2..06e67762c 100644
--- a/builtin/game/item_entity.lua
+++ b/builtin/game/item_entity.lua
@@ -33,7 +33,7 @@ core.register_entity(":__builtin:item", {
},
itemstring = "",
- physical_state = true,
+ moving_state = true,
slippery_state = false,
age = 0,
@@ -148,16 +148,14 @@ core.register_entity(":__builtin:item", {
local vel = self.object:getvelocity()
local def = node and core.registered_nodes[node.name]
-- Ignore is nil -> stop until the block loaded
- local is_physical = (def and not def.walkable) or vel.y ~= 0
+ local is_moving = (def and not def.walkable) or
+ vel.x ~= 0 or vel.y ~= 0 or vel.z ~= 0
local is_slippery = false
- if def and def.walkable and
- (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then
+ if def and def.walkable then
local slippery = core.get_item_group(node.name, "slippery")
is_slippery = slippery ~= 0
- if is_slippery then
- is_physical = true
-
+ if is_slippery and (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then
-- Horizontal deceleration
local slip_factor = 4.0 / (slippery + 4)
self.object:set_acceleration({
@@ -165,32 +163,31 @@ core.register_entity(":__builtin:item", {
y = 0,
z = -vel.z * slip_factor
})
+ elseif vel.y == 0 then
+ is_moving = false
end
end
- if self.physical_state == is_physical and
+ if self.moving_state == is_moving and
self.slippery_state == is_slippery then
- -- Do not update anything until the physical state changes
+ -- Do not update anything until the moving state changes
return
end
- self.physical_state = is_physical
+ self.moving_state = is_moving
self.slippery_state = is_slippery
- self.object:set_properties({
- physical = is_physical
- })
-
- if is_slippery then
- return
- end
- if is_physical then
+ if is_moving then
self.object:set_acceleration({x = 0, y = -gravity, z = 0})
else
self.object:set_acceleration({x = 0, y = 0, z = 0})
self.object:set_velocity({x = 0, y = 0, z = 0})
end
+ --Only collect items if not moving
+ if is_moving then
+ return
+ end
-- Collect the items around to merge with
local own_stack = ItemStack(self.itemstring)
if own_stack:get_free_space() == 0 then