mirror of
https://github.com/minetest/minetest.git
synced 2024-11-10 17:53:46 +01:00
Builtin/../falling: Fix bugs caused by 'ignore' nodes
Original commit by t4im, rebased and developed by paramat. Fix CONTENT_IGNORE being replaced by falling nodes or causing large areas of sand to collapse into itself. Format some conditional code for clarity. Add and clarify some comments.
This commit is contained in:
parent
e82bd3f067
commit
3c5da70d7c
@ -46,15 +46,17 @@ core.register_entity(":__builtin:falling_node", {
|
|||||||
if not vector.equals(acceleration, {x = 0, y = -10, z = 0}) then
|
if not vector.equals(acceleration, {x = 0, y = -10, z = 0}) then
|
||||||
self.object:setacceleration({x = 0, y = -10, z = 0})
|
self.object:setacceleration({x = 0, y = -10, z = 0})
|
||||||
end
|
end
|
||||||
-- Turn to actual sand when collides to ground or just move
|
-- Turn to actual node when colliding with ground, or continue to move
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
local bcp = {x = pos.x, y = pos.y - 0.7, z = pos.z} -- Position of bottom center point
|
-- Position of bottom center point
|
||||||
local bcn = core.get_node(bcp)
|
local bcp = {x = pos.x, y = pos.y - 0.7, z = pos.z}
|
||||||
local bcd = core.registered_nodes[bcn.name]
|
-- Avoid bugs caused by an unloaded node below
|
||||||
-- Note: walkable is in the node definition, not in item groups
|
local bcn = core.get_node_or_nil(bcp)
|
||||||
if not bcd or bcd.walkable or
|
local bcd = bcn and core.registered_nodes[bcn.name]
|
||||||
|
if bcn and
|
||||||
|
(not bcd or bcd.walkable or
|
||||||
(core.get_item_group(self.node.name, "float") ~= 0 and
|
(core.get_item_group(self.node.name, "float") ~= 0 and
|
||||||
bcd.liquidtype ~= "none") then
|
bcd.liquidtype ~= "none")) then
|
||||||
if bcd and bcd.leveled and
|
if bcd and bcd.leveled and
|
||||||
bcn.name == self.node.name then
|
bcn.name == self.node.name then
|
||||||
local addlevel = self.node.level
|
local addlevel = self.node.level
|
||||||
@ -154,16 +156,19 @@ function nodeupdate_single(p)
|
|||||||
local n = core.get_node(p)
|
local n = core.get_node(p)
|
||||||
if core.get_item_group(n.name, "falling_node") ~= 0 then
|
if core.get_item_group(n.name, "falling_node") ~= 0 then
|
||||||
local p_bottom = {x = p.x, y = p.y - 1, z = p.z}
|
local p_bottom = {x = p.x, y = p.y - 1, z = p.z}
|
||||||
local n_bottom = core.get_node(p_bottom)
|
-- Only spawn falling node if node below is loaded
|
||||||
local d_bottom = core.registered_nodes[n_bottom.name]
|
local n_bottom = core.get_node_or_nil(p_bottom)
|
||||||
-- Note: walkable is in the node definition, not in item groups
|
local d_bottom = n_bottom and core.registered_nodes[n_bottom.name]
|
||||||
if d_bottom and
|
if d_bottom and
|
||||||
|
|
||||||
(core.get_item_group(n.name, "float") == 0 or
|
(core.get_item_group(n.name, "float") == 0 or
|
||||||
d_bottom.liquidtype == "none") and
|
d_bottom.liquidtype == "none") and
|
||||||
|
|
||||||
(n.name ~= n_bottom.name or (d_bottom.leveled and
|
(n.name ~= n_bottom.name or (d_bottom.leveled and
|
||||||
core.get_node_level(p_bottom) < core.get_node_max_level(p_bottom))) and
|
core.get_node_level(p_bottom) <
|
||||||
(not d_bottom.walkable or
|
core.get_node_max_level(p_bottom))) and
|
||||||
d_bottom.buildable_to) then
|
|
||||||
|
(not d_bottom.walkable or d_bottom.buildable_to) then
|
||||||
n.level = core.get_node_level(p)
|
n.level = core.get_node_level(p)
|
||||||
core.remove_node(p)
|
core.remove_node(p)
|
||||||
spawn_falling_node(p, n)
|
spawn_falling_node(p, n)
|
||||||
|
Loading…
Reference in New Issue
Block a user