diff --git a/init.lua b/init.lua index 2dd3291..e477e1d 100644 --- a/init.lua +++ b/init.lua @@ -1,147 +1,41 @@ --------------- --- 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 world = tonumber(core.settings:get("worldedge.world_size")) or 5000 local count = 0 -local waiting_list = {} ---[[ 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... - } -]] - +local edge = world --sets the edge of map +local newedge = world --sets the other side where player teleports to. Should be a few blocks less than edge minetest.register_globalstep(function(dtime) - count = count + dtime - if count < 3 then - return - end - 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 + count = count + dtime + if count > 5 then + count = 0 + local players = minetest.get_connected_players() + for _,player in pairs(players) do + local pos = player:getpos() + if pos.x >= edge then + player:moveto({x = -newedge, y = pos.y, z = pos.z}) + end + if pos.x <= -edge then + player:moveto({x = newedge, y = pos.y, z = pos.z}) + end - local newedge = edge - 5 - -- Check if the players are near the edge and teleport them - local players = minetest.get_connected_players() - for i, player in ipairs(players) do - 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 - newpos = {x = -newedge, y = 10, z = pos.z} - elseif pos.x <= -edge then - newpos = {x = newedge, y = 10, z = pos.z} - end - - if pos.z >= edge then - newpos = {x = pos.x, y = 10, z = -newedge} - elseif pos.z <= -edge then - newpos = {x = pos.x, y = 10, z = newedge} - end - - -- 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 +-- 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 + player:moveto({x = pos.x, y = pos.y, z = -newedge}) + end + if pos.z <= -edge then + player:moveto({x = pos.x, y = pos.y, z = newedge}) + 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 -}) diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..cfb312c --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,2 @@ +#Change world size +worldedge.world_size (Set world size) int 5000