6 Commits

Author SHA1 Message Date
Don
6ce2ddf3a3 added setting 2025-04-06 21:04:17 -07:00
Don
7ea602b37e Update mod.conf 2025-03-13 13:03:02 -07:00
Don
66339c8eec Update mod.conf 2025-03-13 12:58:30 -07:00
Don
3e8d65333e Update README.md 2025-03-13 12:57:27 -07:00
Don
56b7ea4833 Update licence.txt 2025-03-13 12:57:12 -07:00
Don
354cd7451f Update README.md 2025-03-13 12:56:01 -07:00
5 changed files with 63 additions and 152 deletions

View File

@ -1,13 +1,13 @@
worldedge worldedge
========= =========
A Minetest Mod that teleports you to the other side of the map when you reach its edge. A Luanti Mod that teleports you to the other side of the map when you reach its edge.
This gives the illusion that that world is round and you can walk all the way around. This gives the illusion that that world is round and you can walk all the way around.
You can change the worlds edge by changing the first variable in init.lua You can change the worlds edge by changing the first variable in init.lua
local edge = 30000 local edge = 30000
License of code: DWYWPL License of code: MIT
Written by Amaz Written by Amaz
Modified by Don Modified by Don

154
init.lua
View File

@ -1,147 +1,41 @@
-------------- local world = tonumber(core.settings:get("worldedge.world_size")) or 5000
-- TODO: Check for terrain height
-- Defines the edge of a world
local edge = tonumber(minetest.settings:get("world_edge")) or 30000
-- Radius which should be checked for a good teleportation place
local radius = 2
--------------
if minetest.settings:get_bool("log_mods") then
minetest.log("action", "World edge: " .. edge)
end
local count = 0 local count = 0
local waiting_list = {} local edge = world --sets the edge of map
--[[ Explanation of waiting_list table local newedge = world --sets the other side where player teleports to. Should be a few blocks less than edge
Index = Player name
Value = {
player = Player to teleport
pos = Destination
obj = Attacked entity
notified = When the player must wait longer...
}
]]
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
count = count + dtime count = count + dtime
if count < 3 then if count > 5 then
return
end
count = 0 count = 0
for k, v in pairs(waiting_list) do
if v.player and v.player:is_player() then
local pos = get_surface_pos(v.pos)
if pos then
v.obj:setpos(pos)
minetest.after(0.2, function(p, o)
p:set_detach()
o:remove()
end, v.player, v.obj)
waiting_list[k] = nil
elseif not v.notified then
v.notified = true
minetest.chat_send_player(k, "Sorry, we have not found a free place yet. Please be patient.")
end
else
v.obj:remove()
waiting_list[k] = nil
end
end
local newedge = edge - 5
-- Check if the players are near the edge and teleport them
local players = minetest.get_connected_players() local players = minetest.get_connected_players()
for i, player in ipairs(players) do for _,player in pairs(players) do
local name = player:get_player_name() local pos = player:getpos()
if not waiting_list[name] then
local pos = vector.round(player:getpos())
local newpos = nil
if pos.x >= edge then if pos.x >= edge then
newpos = {x = -newedge, y = 10, z = pos.z} player:moveto({x = -newedge, y = pos.y, z = pos.z})
elseif pos.x <= -edge then
newpos = {x = newedge, y = 10, z = pos.z}
end end
if pos.x <= -edge then
player:moveto({x = newedge, y = pos.y, z = pos.z})
end
-- This section is for the Y cord. It will move you from bottom to top or top to bottom of map
--[[
if pos.y >= edge then
player:moveto({x = pos.x, y = -newedge, z = pos.z})
end
if pos.y <= -edge then
player:moveto({x = pos.x, y = newedge, z = pos.z})
end
--]]
if pos.z >= edge then if pos.z >= edge then
newpos = {x = pos.x, y = 10, z = -newedge} player:moveto({x = pos.x, y = pos.y, z = -newedge})
elseif pos.z <= -edge then
newpos = {x = pos.x, y = 10, z = newedge}
end end
if pos.z <= -edge then
-- Teleport the player player:moveto({x = pos.x, y = pos.y, z = newedge})
if newpos then
minetest.chat_send_player(name, "Please wait a few seconds. We will teleport you soon.")
local obj = minetest.add_entity(newpos, "worldedge:lock")
player:set_attach(obj, "", {x=0, y=0, z=0}, {x=0, y=0, z=0})
waiting_list[name] = {
player = player,
pos = newpos,
obj = obj
}
obj:setpos(newpos)
end end
end end
end end
end) end)
function get_surface_pos(pos)
local minp = {
x = pos.x - radius - 1,
y = -10,
z = pos.z - radius - 1
}
local maxp = {
x = pos.x + radius - 1,
y = 50,
z = pos.z + radius - 1
}
local c_air = minetest.get_content_id("air")
local c_ignore = minetest.get_content_id("ignore")
local vm = minetest.get_voxel_manip()
local emin, emax = vm:read_from_map(minp, maxp)
local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
local data = vm:get_data()
local seen_air = false
local deepest_place = vector.new(pos)
deepest_place.y = 50
for x = minp.x, maxp.x do
for z = minp.z, maxp.z do
local solid = 0
for y = deepest_place.y, -10, -1 do
local node = data[area:index(x, y, z)]
if y < deepest_place.y and node == c_air then
deepest_place = vector.new(x, y, z)
seen_air = true
end
if solid > 5 then
-- Do not find caves!
break
end
if node ~= c_air and node ~= c_ignore then
solid = solid + 1
end
end
end
end
if seen_air then
return deepest_place
else
return false
end
end
minetest.register_entity("worldedge:lock", {
initial_properties = {
is_visible = false
},
on_activate = function(staticdata, dtime_s)
--self.object:set_armor_groups({immortal = 1})
end
})

View File

@ -1,13 +1,24 @@
DO WHAT YOU WANT TO PUBLIC LICENSE The MIT License (MIT)
or abbreviated DWYWPL
December 2nd 2015 Copyright (c) 2025 Don Michaud
License Copyright (C) 2015 Michael Tomaino (PlatinumArts@gmail.com)
www.sandboxgamemaker.com/DWYWPL/
DO WHAT YOU WANT TO PUBLIC LICENSE Permission is hereby granted, free of charge, to any person obtaining a copy
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
1. You are allowed to do whatever you want to with what content is using this license. The above copyright notice and this permission notice shall be included in
2. This content is provided 'as-is', without any express or implied warranty. In no event all copies or substantial portions of the Software.
will the authors be held liable for any damages arising from the use of this content.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Textures by Don Michaud (CC0) unless listed below

View File

@ -1 +1,5 @@
name = worldedge name = worldedge
description = Changes the size of your world
depends = default
author = Don Michaud & Amaz & Krock
title = World Edge

2
settingtypes.txt Normal file
View File

@ -0,0 +1,2 @@
#Change world size
worldedge.world_size (Set world size) int 5000