Compare commits
1 Commits
master
...
fix-nether
Author | SHA1 | Date |
---|---|---|
cora | 14dbb40da2 |
|
@ -21,7 +21,7 @@ The basic digging time groups determine by which tools a node can be dug.
|
|||
* `swordy=1`: Diggable by sword (any material), and this node is *not* a cobweb
|
||||
* `swordy_cobweb=1`: Diggable by sword (any material), and this node is a cobweb
|
||||
* `shearsy=1`: Diggable by shears, and this node is *not* wool
|
||||
* `shearsy_wool=1`: Diggable by shears, and this node is wool
|
||||
* `shearsy=wool=1`: Diggable by shears, and this node is wool
|
||||
* `handy=1`: Breakable by hand and this node gives it useful drop when dug by hand. All nodes which are breakable by pickaxe, axe, shovel, sword or shears are also automatically breakable by hand, but not neccess
|
||||
* `creative_breakable=1`: Block is breakable by hand in creative mode. This group is implied if the node belongs to any other digging group
|
||||
|
||||
|
|
|
@ -1,41 +1,6 @@
|
|||
local S = minetest.get_translator("mcl_chests")
|
||||
local mod_doc = minetest.get_modpath("doc")
|
||||
|
||||
-- Christmas chest setup
|
||||
local it_is_christmas = false
|
||||
local date = os.date("*t")
|
||||
if (
|
||||
date.month == 12 and (
|
||||
date.day == 24 or
|
||||
date.day == 25 or
|
||||
date.day == 26
|
||||
)
|
||||
) then
|
||||
it_is_christmas = true
|
||||
end
|
||||
|
||||
local tiles_chest_normal_small = {"mcl_chests_normal.png"}
|
||||
local tiles_chest_normal_double = {"mcl_chests_normal_double.png"}
|
||||
|
||||
if it_is_christmas then
|
||||
tiles_chest_normal_small = {"mcl_chests_normal_present.png^mcl_chests_noise.png"}
|
||||
tiles_chest_normal_double = {"mcl_chests_normal_double_present.png^mcl_chests_noise_double.png"}
|
||||
end
|
||||
|
||||
local tiles_chest_trapped_small = {"mcl_chests_trapped.png"}
|
||||
local tiles_chest_trapped_double = {"mcl_chests_trapped_double.png"}
|
||||
|
||||
if it_is_christmas then
|
||||
tiles_chest_trapped_small = {"mcl_chests_trapped_present.png^mcl_chests_noise.png"}
|
||||
tiles_chest_trapped_double = {"mcl_chests_trapped_double_present.png^mcl_chests_noise_double.png"}
|
||||
end
|
||||
|
||||
local tiles_chest_ender_small = {"mcl_chests_ender.png"}
|
||||
|
||||
if it_is_christmas then
|
||||
tiles_chest_ender_small = {"mcl_chests_ender_present.png^mcl_chests_noise.png"}
|
||||
end
|
||||
|
||||
-- Chest Entity
|
||||
local animate_chests = (minetest.settings:get_bool("animated_chests") ~= false)
|
||||
local entity_animations = {
|
||||
|
@ -256,12 +221,12 @@ local chest_update_after_close = function(pos)
|
|||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2})
|
||||
|
||||
if animate_chests then
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_small", tiles_chest_trapped_small, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small")
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small")
|
||||
end
|
||||
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
||||
elseif node.name == "mcl_chests:trapped_chest_on_left" then
|
||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
||||
|
||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
||||
|
@ -273,7 +238,7 @@ local chest_update_after_close = function(pos)
|
|||
|
||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right")
|
||||
minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
||||
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||
mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules)
|
||||
end
|
||||
end
|
||||
|
@ -884,8 +849,8 @@ register_chest("chest",
|
|||
chestusage,
|
||||
S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest"),
|
||||
{
|
||||
small = tiles_chest_normal_small,
|
||||
double = tiles_chest_normal_double,
|
||||
small = {"mcl_chests_normal.png"},
|
||||
double = {"mcl_chests_normal_double.png"},
|
||||
inv = {"default_chest_top.png", "mcl_chests_chest_bottom.png",
|
||||
"mcl_chests_chest_right.png", "mcl_chests_chest_left.png",
|
||||
"mcl_chests_chest_back.png", "default_chest_front.png"},
|
||||
|
@ -900,8 +865,8 @@ register_chest("chest",
|
|||
)
|
||||
|
||||
local traptiles = {
|
||||
small = tiles_chest_trapped_small,
|
||||
double = tiles_chest_trapped_double,
|
||||
small = {"mcl_chests_trapped.png"},
|
||||
double = {"mcl_chests_trapped_double.png"},
|
||||
inv = {"mcl_chests_chest_trapped_top.png", "mcl_chests_chest_trapped_bottom.png",
|
||||
"mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_left.png",
|
||||
"mcl_chests_chest_trapped_back.png", "mcl_chests_chest_trapped_front.png"},
|
||||
|
@ -927,7 +892,7 @@ register_chest("trapped_chest",
|
|||
function(pos, node, clicker)
|
||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_small", param2 = node.param2})
|
||||
if animate_chests then
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_on_small", tiles_chest_trapped_small, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_small")
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_on_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_small")
|
||||
end
|
||||
mesecon.receptor_on(pos, trapped_chest_mesecons_rules)
|
||||
end,
|
||||
|
@ -936,7 +901,7 @@ register_chest("trapped_chest",
|
|||
meta:set_int("players", 1)
|
||||
|
||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2})
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left")
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left")
|
||||
mesecon.receptor_on(pos, trapped_chest_mesecons_rules)
|
||||
|
||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
||||
|
@ -950,7 +915,7 @@ register_chest("trapped_chest",
|
|||
mesecon.receptor_on(pos, trapped_chest_mesecons_rules)
|
||||
|
||||
minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2})
|
||||
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left")
|
||||
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left")
|
||||
mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules)
|
||||
end
|
||||
)
|
||||
|
@ -972,14 +937,14 @@ local function close_if_trapped_chest(pos, player)
|
|||
if node.name == "mcl_chests:trapped_chest_on_small" then
|
||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2})
|
||||
if animate_chests then
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_small", tiles_chest_trapped_small, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small")
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small")
|
||||
end
|
||||
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
||||
|
||||
player_chest_close(player)
|
||||
elseif node.name == "mcl_chests:trapped_chest_on_left" then
|
||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
||||
|
||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
||||
|
@ -993,7 +958,7 @@ local function close_if_trapped_chest(pos, player)
|
|||
|
||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right")
|
||||
minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
||||
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||
mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules)
|
||||
|
||||
player_chest_close(player)
|
||||
|
@ -1041,7 +1006,7 @@ minetest.register_node("mcl_chests:ender_chest", {
|
|||
_doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."),
|
||||
drawtype = "mesh",
|
||||
mesh = "mcl_chests_chest.obj",
|
||||
tiles = tiles_chest_ender_small,
|
||||
tiles = {"mcl_chests_ender.png"},
|
||||
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
|
@ -1094,8 +1059,8 @@ minetest.register_node("mcl_chests:ender_chest_small", {
|
|||
type = "fixed",
|
||||
fixed = {-0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375},
|
||||
},
|
||||
tiles = animate_chests and {"mcl_chests_blank.png"} or tiles_chest_ender_small,
|
||||
_chest_entity_textures = tiles_chest_ender_small,
|
||||
tiles = animate_chests and {"mcl_chests_blank.png"} or {"mcl_chests_ender.png"},
|
||||
_chest_entity_textures = {"mcl_chests_ender.png"},
|
||||
_chest_entity_sound = "mcl_chests_enderchest",
|
||||
_chest_entity_mesh = "mcl_chests_chest",
|
||||
_chest_entity_animation_type = "chest",
|
||||
|
@ -1117,11 +1082,11 @@ minetest.register_node("mcl_chests:ender_chest_small", {
|
|||
meta:set_string("formspec", formspec_ender_chest)
|
||||
|
||||
if animate_chests then
|
||||
create_entity(pos, "mcl_chests:ender_chest_small", tiles_chest_ender_small, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest", "chest")
|
||||
create_entity(pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest", "chest")
|
||||
end
|
||||
end,
|
||||
on_rightclick = function(pos, node, clicker)
|
||||
player_chest_open(clicker, pos, "mcl_chests:ender_chest_small", tiles_chest_ender_small, node.param2, false, "mcl_chests_enderchest", "mcl_chests_chest")
|
||||
player_chest_open(clicker, pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, node.param2, false, "mcl_chests_enderchest", "mcl_chests_chest")
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
if fields.quit then
|
||||
|
|
Before Width: | Height: | Size: 286 B |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 9.1 KiB |
Before Width: | Height: | Size: 307 B |
Before Width: | Height: | Size: 285 B |
Before Width: | Height: | Size: 307 B |
Before Width: | Height: | Size: 286 B |
|
@ -388,11 +388,12 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s
|
|||
{ x=0, y=0, z=-1 },
|
||||
{ x=0, y=0, z=1 },
|
||||
}
|
||||
local floorpos, floor
|
||||
for n=#neighbors, 1, -1 do
|
||||
local offset = neighbors[n]
|
||||
local blockpos = vector.add(stempos, offset)
|
||||
local floorpos = { x=blockpos.x, y=blockpos.y-1, z=blockpos.z }
|
||||
local floor = minetest.get_node(floorpos)
|
||||
floorpos = { x=blockpos.x, y=blockpos.y-1, z=blockpos.z }
|
||||
floor = minetest.get_node(floorpos)
|
||||
local block = minetest.get_node(blockpos)
|
||||
local soilgroup = minetest.get_item_group(floor.name, "soil")
|
||||
if not ((minetest.get_item_group(floor.name, "grass_block") == 1 or floor.name=="mcl_core:dirt" or soilgroup == 2 or soilgroup == 3) and block.name == "air") then
|
||||
|
@ -406,8 +407,6 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s
|
|||
local r = math.random(1, #neighbors)
|
||||
local offset = neighbors[r]
|
||||
local blockpos = vector.add(stempos, offset)
|
||||
local floorpos = { x=blockpos.x, y=blockpos.y-1, z=blockpos.z }
|
||||
local floor = minetest.get_node(floorpos)
|
||||
local p2
|
||||
if offset.x == 1 then
|
||||
minetest.set_node(stempos, {name=connected_stem_names[1]})
|
||||
|
|
|
@ -29,6 +29,9 @@ if minetest.features.use_texture_alpha_string_modes then
|
|||
PORTAL_ALPHA = nil
|
||||
end
|
||||
|
||||
local PORTICLE_DISTANCE = 15 --how far to send particle spawners for the portalnodes
|
||||
local porticlespawners = {}
|
||||
|
||||
-- Table of objects (including players) which recently teleported by a
|
||||
-- Nether portal. Those objects have a brief cooloff period before they
|
||||
-- can teleport again. This prevents annoying back-and-forth teleportation.
|
||||
|
@ -59,6 +62,65 @@ local function nether_to_overworld(x)
|
|||
return LIMIT - math.abs(((x * OVERWORLD_TO_NETHER_SCALE + LIMIT) % (LIMIT*4)) - (LIMIT*2))
|
||||
end
|
||||
|
||||
local function remove_particlespawner_at_position(playername,pos)
|
||||
if not porticlespawners[minetest.pos_to_string(pos)] or porticlespawners[minetest.pos_to_string(pos)][playername] == nil then return end
|
||||
minetest.delete_particlespawner(porticlespawners[minetest.pos_to_string(pos)][playername],playername)
|
||||
porticlespawners[minetest.pos_to_string(pos)][playername]=nil
|
||||
end
|
||||
|
||||
local function add_particlespawner_at_position(player,pos,node)
|
||||
if not porticlespawners[minetest.pos_to_string(pos)] then porticlespawners[minetest.pos_to_string(pos)] = {} end
|
||||
if porticlespawners[minetest.pos_to_string(pos)][player:get_player_name()] ~= nil then return end
|
||||
porticlespawners[minetest.pos_to_string(pos)][player:get_player_name()]=minetest.add_particlespawner({
|
||||
amount = node_particles_allowed_level + 1,
|
||||
minpos = vector.add(pos, vector.new(-3,-3,-3)),
|
||||
maxpos = vector.add(pos, vector.new(3,3,3)),
|
||||
minvel = vector.new(-0.5,-0.5,-0.5),
|
||||
maxvel = vector.new(0.5,0.5,0.5),
|
||||
minacc = vector.new(-0.5,-0.5,-0.5),
|
||||
maxacc = vector.new(0.5,0.5,0.5),
|
||||
minexptime = 0.1,
|
||||
maxexptime = 2.4,
|
||||
minsize = 0.3,
|
||||
maxsize = 1.8,
|
||||
time=0,
|
||||
collisiondetection = false,
|
||||
texture = "mcl_particles_nether_portal.png",
|
||||
playername = player:get_player_name(),
|
||||
})
|
||||
end
|
||||
|
||||
local function add_porticlespawners(pos,node)
|
||||
--Add particlespawners for all players in range
|
||||
for _,obj in pairs(minetest.get_connected_players()) do
|
||||
if vector.distance(obj:get_pos(),pos) <= PORTICLE_DISTANCE then
|
||||
add_particlespawner_at_position(obj,pos,node)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function remove_porticlespawners(pos,force)
|
||||
--Remove particlespawners for all players out of range
|
||||
-- force removes all particlespawners for the given position regardless of range
|
||||
if porticlespawners[minetest.pos_to_string(pos)] then
|
||||
for k,v in pairs(porticlespawners[minetest.pos_to_string(pos)]) do
|
||||
local p=minetest.get_player_by_name(k)
|
||||
local dst=PORTICLE_DISTANCE+1 --if player is logged off remove the particlespawner
|
||||
if p and p:is_player() then
|
||||
dst=vector.distance(p:get_pos(),pos)
|
||||
end
|
||||
if dst > PORTICLE_DISTANCE or force then
|
||||
remove_particlespawner_at_position(k,pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function check_porticlespawners(pos,node)
|
||||
add_porticlespawners(pos,node)
|
||||
remove_porticlespawners(pos)
|
||||
end
|
||||
|
||||
-- Destroy portal if pos (portal frame or portal node) got destroyed
|
||||
local function destroy_nether_portal(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
@ -77,6 +139,7 @@ local function destroy_nether_portal(pos)
|
|||
local node = minetest.get_node(pos)
|
||||
if node and (node.name == "mcl_portals:portal" and (orientation == nil or (node.param2 == orientation))) then
|
||||
minetest.log("action", "[mcl_portal] Destroying Nether portal at " .. minetest.pos_to_string(pos))
|
||||
remove_porticlespawners(pos,true)
|
||||
return minetest.remove_node(pos)
|
||||
end
|
||||
end
|
||||
|
@ -769,56 +832,16 @@ local function teleport(obj, portal_pos)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
minetest.register_abm({
|
||||
label = "Nether portal teleportation and particles",
|
||||
nodenames = {"mcl_portals:portal"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node)
|
||||
local o = node.param2 -- orientation
|
||||
local d = math.random(0, 1) -- direction
|
||||
local time = math.random() * 1.9 + 0.5
|
||||
local velocity, acceleration
|
||||
if o == 1 then
|
||||
velocity = {x = math.random() * 0.7 + 0.3, y = math.random() - 0.5, z = math.random() - 0.5}
|
||||
acceleration = {x = math.random() * 1.1 + 0.3, y = math.random() - 0.5, z = math.random() - 0.5}
|
||||
else
|
||||
velocity = {x = math.random() - 0.5, y = math.random() - 0.5, z = math.random() * 0.7 + 0.3}
|
||||
acceleration = {x = math.random() - 0.5, y = math.random() - 0.5, z = math.random() * 1.1 + 0.3}
|
||||
end
|
||||
local distance = vector.add(vector.multiply(velocity, time), vector.multiply(acceleration, time * time / 2))
|
||||
if d == 1 then
|
||||
if o == 1 then
|
||||
distance.x = -distance.x
|
||||
velocity.x = -velocity.x
|
||||
acceleration.x = -acceleration.x
|
||||
else
|
||||
distance.z = -distance.z
|
||||
velocity.z = -velocity.z
|
||||
acceleration.z = -acceleration.z
|
||||
end
|
||||
end
|
||||
distance = vector.subtract(pos, distance)
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 15)) do
|
||||
if obj:is_player() then
|
||||
minetest.add_particlespawner({
|
||||
amount = node_particles_allowed_level + 1,
|
||||
minpos = distance,
|
||||
maxpos = distance,
|
||||
minvel = velocity,
|
||||
maxvel = velocity,
|
||||
minacc = acceleration,
|
||||
maxacc = acceleration,
|
||||
minexptime = time,
|
||||
maxexptime = time,
|
||||
minsize = 0.3,
|
||||
maxsize = 1.8,
|
||||
collisiondetection = false,
|
||||
texture = "mcl_particles_nether_portal.png",
|
||||
playername = obj:get_player_name(),
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
check_porticlespawners(pos)
|
||||
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do --maikerumine added for objects to travel
|
||||
local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel
|
||||
if (obj:is_player() or lua_entity) and prevent_portal_chatter(obj) then
|
||||
|
|
|
@ -75,22 +75,14 @@ local test_minetest_find_nodes_in_area_can_count = function(dtime)
|
|||
local nodes_expected = math.pow( 1 + (2 * radius), 3 )
|
||||
local nodes_counted = nnum[nodename]
|
||||
local nodes_difference = nodes_expected - nodes_counted
|
||||
-- Originally, there was an assertion here that made the game
|
||||
-- crash at startup if Minetest forgot how to count. This was
|
||||
-- originally intended to avoid buggy engine releases, but it
|
||||
-- mostly made people upset and hindered debugging. Also, the
|
||||
-- assertion contained no error message hinting at the reason
|
||||
-- for the crash, making it exceptionally user-unfriendly. It
|
||||
-- follows that a game or mod should only assert on behaviour
|
||||
-- of the Lua code, not the underlying implementation, unless
|
||||
-- engine bugs are bad enough to permanently corrupt a world.
|
||||
if ( 0 ~= nodes_difference ) then
|
||||
minetest.debug(
|
||||
"minetest.find_nodes_in_area() failed to find " ..
|
||||
nodes_difference .. " nodes that were placed. " ..
|
||||
"Downgrading to Minetest 5.4.1 might fix this."
|
||||
)
|
||||
end
|
||||
-- Yes, the following line is supposed to crash the game in
|
||||
-- the case that Minetest forgot how to count the number of
|
||||
-- nodes in a three dimensional volume it just filled. This
|
||||
-- function contains an excellent explanation on what not to
|
||||
-- do further up. I strongly suggest to pester Minetest core
|
||||
-- devs about this issue and not the author of the function,
|
||||
-- should this test ever fail.
|
||||
assert ( 0 == nodes_difference )
|
||||
end
|
||||
|
||||
minetest.after( 0, test_minetest_find_nodes_in_area_can_count )
|
||||
|
|