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