forked from minetest-mods/worldedge
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
6ce2ddf3a3 | |||
7ea602b37e | |||
66339c8eec | |||
3e8d65333e | |||
56b7ea4833 | |||
354cd7451f |
@ -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
154
init.lua
@ -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
|
|
||||||
})
|
|
||||||
|
31
licence.txt
31
licence.txt
@ -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
|
||||||
|
4
mod.conf
4
mod.conf
@ -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
2
settingtypes.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#Change world size
|
||||||
|
worldedge.world_size (Set world size) int 5000
|
Reference in New Issue
Block a user