2022-12-15 22:44:20 +02:00
|
|
|
-- Defines the border of a world
|
|
|
|
local world_border = tonumber(minetest.settings:get("world_border")) or 500
|
|
|
|
|
|
|
|
-- Stop sign entities
|
|
|
|
local north = nil
|
|
|
|
local south = nil
|
|
|
|
local west = nil
|
|
|
|
local east = nil
|
|
|
|
|
|
|
|
-- add_remove_border (stop sign)
|
|
|
|
-- Adds entity if within 10 blocks of the player position
|
|
|
|
function add_remove_border(entity, player_pos, entity_pos, is_rotated)
|
|
|
|
if vector.distance(player_pos, entity_pos) < 10 then
|
|
|
|
if not entity then
|
2022-12-16 23:03:25 +02:00
|
|
|
entity = minetest.add_entity(entity_pos, "simpleworldborder:border", nil)
|
2022-12-15 22:44:20 +02:00
|
|
|
if is_rotated then entity:set_rotation({x = 0, y = math.pi/2, z = 0 }) end
|
|
|
|
else
|
|
|
|
-- within range but entity already exists
|
|
|
|
end
|
|
|
|
else
|
|
|
|
-- out of range
|
|
|
|
if entity then
|
|
|
|
-- remove entity
|
|
|
|
entity:remove()
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return entity
|
|
|
|
end
|
|
|
|
|
|
|
|
-- worldborder:border item
|
|
|
|
-- represents "stop sign" for border
|
2022-12-16 23:03:25 +02:00
|
|
|
minetest.register_entity("simpleworldborder:border", {
|
2022-12-15 22:44:20 +02:00
|
|
|
initial_properties = {
|
|
|
|
collide_with_objects = false,
|
|
|
|
is_visible = true,
|
|
|
|
visual = "upright_sprite",
|
|
|
|
textures = {
|
|
|
|
"worldborder_stopsign.png",
|
|
|
|
"worldborder_stopsign.png"
|
|
|
|
},
|
|
|
|
visual_size = {
|
|
|
|
x = 10,
|
|
|
|
y = 10
|
|
|
|
},
|
|
|
|
backface_culling = false,
|
|
|
|
glow = -1,
|
|
|
|
shaded = false,
|
|
|
|
static_save = false,
|
|
|
|
use_texture_alpha = true
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
|
|
local players = minetest.get_connected_players()
|
|
|
|
for i, player in ipairs(players) do
|
|
|
|
local has_player_moved = false
|
|
|
|
local name = player:get_player_name()
|
|
|
|
local pos = vector.round(player:getpos())
|
|
|
|
|
|
|
|
-- Check if player is close world border. If so, spawn worldborder entity!
|
|
|
|
local northpos = vector.new(pos.x, pos.y, world_border)
|
|
|
|
local southpos = vector.new(pos.x, pos.y, -world_border)
|
|
|
|
local eastpos = vector.new(world_border, pos.y, pos.z)
|
|
|
|
local westpos = vector.new(-world_border, pos.y, pos.z)
|
|
|
|
|
|
|
|
north = add_remove_border(north, pos, northpos, false)
|
|
|
|
south = add_remove_border(south, pos, southpos, false)
|
|
|
|
east = add_remove_border(east, pos, eastpos, true)
|
|
|
|
west = add_remove_border(west, pos, westpos, true)
|
|
|
|
|
|
|
|
-- calculate new position of player
|
|
|
|
if pos.x > world_border then
|
|
|
|
pos.x = world_border
|
|
|
|
has_player_moved = true
|
|
|
|
elseif pos.x < -world_border then
|
|
|
|
pos.x = -world_border
|
|
|
|
has_player_moved = true
|
|
|
|
end
|
|
|
|
|
|
|
|
if pos.z > world_border then
|
|
|
|
pos.z = world_border
|
|
|
|
has_player_moved = true
|
|
|
|
elseif pos.z < -world_border then
|
|
|
|
pos.z = -world_border
|
|
|
|
has_player_moved = true
|
|
|
|
end
|
|
|
|
|
|
|
|
-- move player if needed
|
|
|
|
if pos and has_player_moved then
|
|
|
|
player:setpos(pos)
|
|
|
|
end
|
|
|
|
|
|
|
|
-- move stop sign entities
|
|
|
|
if east then
|
|
|
|
east:moveto({x = world_border + 1, y = pos.y, z = pos.z})
|
|
|
|
end
|
|
|
|
if west then
|
|
|
|
west:moveto({x = -world_border - 1, y = pos.y, z = pos.z})
|
|
|
|
end
|
|
|
|
if north then
|
|
|
|
north:moveto({x = pos.x, y = pos.y, z = world_border + 1})
|
|
|
|
end
|
|
|
|
if south then
|
|
|
|
south:moveto({x = pos.x, y = pos.y, z = -world_border - 1})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|