Compare commits

...

11 Commits

Author SHA1 Message Date
Don
608462d1fa Merge pull request #6 from AntumMT/log_edge_size
Display 'edge' value in log
2017-07-14 20:43:34 -07:00
Don
15a78376e2 Merge pull request #5 from AntumMT/use_config
Use config setting 'world_edge' to determine size of world:
2017-07-14 20:42:31 -07:00
AntumDeluge
1f03ae4d8d Use config setting 'world_edge' to determine size of world:
Defaults to '30000' if setting not found.
2017-06-06 19:26:06 -07:00
AntumDeluge
5e14f3440f Display 'edge' value in log 2017-06-06 19:22:31 -07:00
DonBatman
e15fa9971c Changed Licence 2016-03-23 14:30:23 -07:00
DonBatman
9798921c21 Added screenshot 2016-03-17 20:07:02 -07:00
DonBatman
2d60289210 Added description.txt and mod.conf 2016-03-07 07:08:03 -08:00
DonBatman
8e576d69c8 Merge pull request #2 from SmallJoker/get_surface_y
Check for surface height
2014-12-18 12:27:21 -08:00
SmallJoker
078377869d Check for surface height 2014-12-18 19:47:56 +01:00
DonBatman
da0fd4ca81 Merge pull request #1 from SmallJoker/master
Cleanup
2014-12-15 11:53:00 -08:00
SmallJoker
6f6650c252 Cleanup
Add comments and TODO
2014-12-15 20:04:14 +01:00
6 changed files with 159 additions and 45 deletions

View File

@ -1,20 +1,13 @@
worldedge worldedge
========= =========
A Minetest Mod that teleports you to the other side of the map when you reach the edge. A Minetest Mod that teleports you to the other side of the map when you reach its edge.
This mod makes it so when a player reaches the edge of the world they are teleported to the other side of the map.
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 2 numbers at the top of init.lua. You can change the worlds edge by changing the first variable in init.lua
local edge = 30000
local edge = 30005 License of code: DWYWPL
local newedge = 30000
set edge to where you want the edge of the map to be. Written by Amaz
newedge sets where player teleports to. it needs to be less than edge by at least 1 block.
This mod is licenced as WTFPL
Writen by Amaz
Modified by Don Modified by Don

1
description.txt Normal file
View File

@ -0,0 +1 @@
Allows you to limit the size of your world.

152
init.lua
View File

@ -1,41 +1,147 @@
--------------
-- 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 edge = 30000 --sets the edge of map local waiting_list = {}
local newedge = 29995 --sets the other side where player teleports to. Should be a few blocks less than edge --[[ Explanation of waiting_list table
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 > 5 then if count < 3 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 _,player in pairs(players) do for i, player in ipairs(players) do
local pos = player:getpos() local name = player:get_player_name()
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
player:moveto({x = -newedge, y = pos.y, z = pos.z}) newpos = {x = -newedge, y = 10, 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
player:moveto({x = pos.x, y = pos.y, z = -newedge}) newpos = {x = pos.x, y = 10, z = -newedge}
elseif pos.z <= -edge then
newpos = {x = pos.x, y = 10, z = newedge}
end end
if pos.z <= -edge then
player:moveto({x = pos.x, y = pos.y, z = newedge}) -- Teleport the player
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
})

13
licence.txt Normal file
View File

@ -0,0 +1,13 @@
DO WHAT YOU WANT TO PUBLIC LICENSE
or abbreviated DWYWPL
December 2nd 2015
License Copyright (C) 2015 Michael Tomaino (PlatinumArts@gmail.com)
www.sandboxgamemaker.com/DWYWPL/
DO WHAT YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
1. You are allowed to do whatever you want to with what content is using this license.
2. This content is provided 'as-is', without any express or implied warranty. In no event
will the authors be held liable for any damages arising from the use of this content.

1
mod.conf Normal file
View File

@ -0,0 +1 @@
name = worldedge

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB