Move item inside node to free space, item_entity improvements

This commit is contained in:
MoNTE48 2019-09-02 15:21:54 +02:00
parent f2464cfcf2
commit ee649da027

View File

@ -38,10 +38,7 @@ end
local function quick_flow_logic(node, pos_testing, direction)
local node_testing = core.get_node_or_nil(pos_testing)
if node_testing and
core.registered_nodes[node_testing.name] and
core.registered_nodes[node_testing.name].liquidtype ~= "flowing" and
core.registered_nodes[node_testing.name].liquidtype ~= "source" then
if not node_testing then
return 0
end
local param2_testing = node_testing.param2
@ -62,9 +59,6 @@ local function quick_flow_logic(node, pos_testing, direction)
end
local function quick_flow(pos, node)
if not core.registered_nodes[node.name].groups.liquid then
return {x = 0, y = 0, z = 0}
end
local x, z = 0, 0
x = x + quick_flow_logic(node, {x = pos.x - 1, y = pos.y, z = pos.z}, -1)
x = x + quick_flow_logic(node, {x = pos.x + 1, y = pos.y, z = pos.z}, 1)
@ -136,6 +130,7 @@ core.register_entity(":__builtin:item", {
selectionbox = {-size, -size, -size, size, size, size},
automatic_rotate = math.pi * 0.5 * 0.15 / size,
wield_item = self.itemstring,
infotext = core.registered_items[itemname].description
})
end,
@ -212,18 +207,12 @@ core.register_entity(":__builtin:item", {
end
local pos = self.object:get_pos()
self.node_inside = core.get_node_or_nil(pos)
self.def_inside = self.node_inside
and core.registered_nodes[self.node_inside.name]
self.node_under = core.get_node_or_nil({
local node = core.get_node_or_nil({
x = pos.x,
y = pos.y + self.object:get_properties().collisionbox[2] - 0.05,
z = pos.z
})
self.def_under = self.node_under
and core.registered_nodes[self.node_under.name]
local node = self.node_inside
local node_inside = core.get_node_or_nil(pos)
-- Delete in 'ignore' nodes
if node and node.name == "ignore" then
self.itemstring = ""
@ -232,7 +221,8 @@ core.register_entity(":__builtin:item", {
end
local vel = self.object:get_velocity()
local def = self.def_inside
local def = node and core.registered_nodes[node.name]
local def_inside = node_inside and core.registered_nodes[node_inside.name]
local is_moving = (def and not def.walkable) or
vel.x ~= 0 or vel.y ~= 0 or vel.z ~= 0
local is_slippery = false
@ -259,15 +249,24 @@ core.register_entity(":__builtin:item", {
return
end
-- Moving items in the water flow
if def and def.liquidtype == "flowing" then
local vec = quick_flow(pos, node)
-- Moving items in the water flow (TenPlus1, MIT)
if def_inside and def_inside.liquidtype == "flowing" then
local vec = quick_flow(pos, node_inside)
self.object:set_velocity({x = vec.x, y = vel.y, z = vec.z})
return
end
node = self.node_under
def = self.def_under
-- Move item inside node to free space (TenPlus1, MIT)
if def_inside and not def_inside.liquid and node_inside.name ~= "air" and
def_inside.drawtype == "normal" then
local npos = minetest.find_node_near(pos, 1, "air")
if npos then
self.object:move_to(npos)
end
self.node_inside = nil -- force get_node
return
end
if def and def.walkable then
local slippery = core.get_item_group(node.name, "slippery")
is_slippery = slippery ~= 0
@ -284,11 +283,12 @@ core.register_entity(":__builtin:item", {
end
end
if self.moving_state == is_moving and
-- At some events the entity does not stop
--[[if self.moving_state == is_moving and
self.slippery_state == is_slippery then
-- Do not update anything until the moving state changes
return
end
end]]
self.moving_state = is_moving
self.slippery_state = is_slippery
@ -300,11 +300,6 @@ core.register_entity(":__builtin:item", {
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