diff --git a/init.lua b/init.lua index f62145b..364114a 100644 --- a/init.lua +++ b/init.lua @@ -28,6 +28,8 @@ Optional dependencies: areas, intllib New release by RobbieF under new mod: tps_teleport - http://blog.minetest.tv/teleport-request/ --]] +tp = {} + -- Load support for intllib. local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") @@ -35,43 +37,43 @@ local S, NS = dofile(MP.."/intllib.lua") -- Load configuration. dofile(MP.."/config.lua") -local tpr_list = {} -local tphr_list = {} +tp.tpr_list = {} +tp.tphr_list = {} local map_size = 30912 -local function can_teleport(to) +function tp.can_teleport(to) return to.x < map_size and to.x > -map_size and to.y < map_size and to.y > -map_size and to.z < map_size and to.z > -map_size end -- Teleport player to a player (used in "/tpr" and in "/tphr" command). -function tpr_teleport_player() +function tp.tpr_teleport_player() local target_coords = source:get_pos() local target_sound = target:get_pos() - target:set_pos(find_free_position_near(target_coords)) + target:set_pos(tp.find_free_position_near(target_coords)) minetest.sound_play("whoosh", {pos = target_coords, gain = 0.5, max_hear_distance = 10}) minetest.sound_play("whoosh", {pos = target_sound, gain = 0.5, max_hear_distance = 10}) - --parti2(target_coords) + --tp.parti2(target_coords) end -- TPC & TPJ -function tpc_teleport_player(player) +function tp.tpc_teleport_player(player) local pname = minetest.get_player_by_name(player) minetest.sound_play("whoosh", {pos = pname:get_pos(), gain = 0.5, max_hear_distance = 10}) - pname:set_pos(find_free_position_near(target_coords)) + pname:set_pos(tp.find_free_position_near(target_coords)) minetest.sound_play("whoosh", {pos = target_coords, gain = 0.5, max_hear_distance = 10}) - --parti2(target_coords) + --tp.parti2(target_coords) end -- TPP -function tpp_teleport_player(player) +function tp.tpp_teleport_player(player) local pname = minetest.get_player_by_name(player) minetest.sound_play("whoosh", {pos = pname:get_pos(), gain = 0.5, max_hear_distance = 10}) - pname:set_pos(find_free_position_near(pos)) + pname:set_pos(tp.find_free_position_near(pos)) minetest.sound_play("whoosh", {pos = pos, gain = 0.5, max_hear_distance = 10}) - --parti2(target_coords) + --tp.parti2(target_coords) end -function find_free_position_near(pos) +function tp.find_free_position_near(pos) local tries = { {x=1,y=0,z=0}, {x=-1,y=0,z=0}, @@ -87,7 +89,7 @@ function find_free_position_near(pos) return pos, false end -function parti(pos) +function tp.parti(pos) minetest.add_particlespawner(50, 0.4, {x=pos.x + 0.5, y=pos.y, z=pos.z + 0.5}, {x=pos.x - 0.5, y=pos.y, z=pos.z - 0.5}, {x=0, y=5, z=0}, {x=0, y=0, z=0}, @@ -98,7 +100,7 @@ function parti(pos) "tps_portal_parti.png") end -function parti2(pos) +function tp.parti2(pos) minetest.add_particlespawner(50, 0.4, {x=pos.x + 0.5, y=pos.y + 10, z=pos.z + 0.5}, {x=pos.x - 0.5, y=pos.y, z=pos.z - 0.5}, {x=0, y=-5, z=0}, {x=0, y=0, z=0}, @@ -110,35 +112,42 @@ function parti2(pos) end -- Teleport Request System -function clear_tpr_list(name) - if tpr_list[name] then - tpr_list[name] = nil +function tp.clear_tpr_list(name) + if tp.tpr_list[name] then + tp.tpr_list[name] = nil return end end -function clear_tphr_list(name) - if tphr_list[name] then - tphr_list[name] = nil +function tp.clear_tphr_list(name) + if tp.tphr_list[name] then + tp.tphr_list[name] = nil return end end -- Clear requests when the player leaves minetest.register_on_leaveplayer(function(name) - if tpr_list[name] then - tpr_list[name] = nil + if tp.tpr_list[name] then + tp.tpr_list[name] = nil return end - if tphr_list[name] then - tphr_list[name] = nil + if tp.tphr_list[name] then + tp.tphr_list[name] = nil return end end) -function tpr_send(sender, receiver) - if minetest.check_player_privs(sender, {tp_admin = true}) and enable_immediate_teleport then +function tp.tpr_send(sender, receiver) + -- Compatibility with beerchat (UNTESTED) + if minetest.get_modpath("beerchat") and not minetest.check_player_privs(sender, {tp_admin = true}) then + if minetest.get_player_by_name(sender):get_attribute("beerchat:muted:" .. sender) then + minetest.chat_send_player(sender, S("You are not allowed to send requests because you're muted.")) + return + end + end + if minetest.check_player_privs(sender, {tp_admin = true}) and tp.enable_immediate_teleport then if receiver == "" then minetest.chat_send_player(sender, S("Usage: /tpr ")) return @@ -147,8 +156,8 @@ function tpr_send(sender, receiver) minetest.chat_send_player(sender, S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online")) return end - tpr_list[receiver] = sender - tpr_accept(receiver) + tp.tpr_list[receiver] = sender + tp.tpr_accept(receiver) minetest.chat_send_player(sender, S("You are teleporting to @1.", receiver)) return end @@ -166,11 +175,11 @@ function tpr_send(sender, receiver) minetest.chat_send_player(receiver, S("@1 is requesting to teleport to you. /tpy to accept", sender)) minetest.chat_send_player(sender, S("Teleport request sent! It will timeout in @1 seconds", timeout_delay)) -- Write name values to list and clear old values. - tpr_list[receiver] = sender + tp.tpr_list[receiver] = sender -- Teleport timeout delay - minetest.after(timeout_delay, function(name) - if tpr_list[name] then - tpr_list[name] = nil + minetest.after(tp.timeout_delay, function(name) + if tp.tpr_list[name] then + tp.tpr_list[name] = nil minetest.chat_send_player(sender, S("Request timed-out.")) minetest.chat_send_player(receiver, S("Request timed-out.")) return @@ -178,8 +187,15 @@ function tpr_send(sender, receiver) end, receiver) end -function tphr_send(sender, receiver) - if minetest.check_player_privs(sender, {tp_admin = true}) and enable_immediate_teleport then +function tp.tphr_send(sender, receiver) + -- Compatibility with beerchat (UNTESTED) + if minetest.get_modpath("beerchat") and not minetest.check_player_privs(sender, {tp_admin = true}) then + if minetest.get_player_by_name(sender):get_attribute("beerchat:muted:" .. sender) then + minetest.chat_send_player(sender, S("You are not allowed to send requests because you're muted.")) + return + end + end + if minetest.check_player_privs(sender, {tp_admin = true}) and tp.enable_immediate_teleport then if receiver == "" then minetest.chat_send_player(sender, S("Usage: /tphr ")) return @@ -188,8 +204,8 @@ function tphr_send(sender, receiver) minetest.chat_send_player(sender, S("There is no player by that name. Keep in mind this is case-sensitive, and the player must be online")) return end - tphr_list[receiver] = sender - tpr_accept(receiver) + tp.tphr_list[receiver] = sender + tp.tpr_accept(receiver) minetest.chat_send_player(sender, S("@1 is teleporting to you.", receiver)) return end @@ -206,11 +222,11 @@ function tphr_send(sender, receiver) minetest.chat_send_player(receiver, S("@1 is requesting that you teleport to them. /tpy to accept; /tpn to deny", sender)) minetest.chat_send_player(sender, S("Teleport request sent! It will timeout in @1 seconds", timeout_delay)) -- Write name values to list and clear old values. - tphr_list[receiver] = sender + tp.tphr_list[receiver] = sender -- Teleport timeout delay - minetest.after(timeout_delay, function(name) - if tphr_list[name] then - tphr_list[name] = nil + minetest.after(tp.timeout_delay, function(name) + if tp.tphr_list[name] then + tp.tphr_list[name] = nil minetest.chat_send_player(sender, S("Request timed-out.")) minetest.chat_send_player(receiver, S("Request timed-out.")) return @@ -218,7 +234,7 @@ function tphr_send(sender, receiver) end, receiver) end -function tpc_send(player, coordinates) +function tp.tpc_send(player, coordinates) local posx,posy,posz = string.match(coordinates, "^(-?%d+), (-?%d+), (-?%d+)$") local pname = minetest.get_player_by_name(player) @@ -236,7 +252,7 @@ function tpc_send(player, coordinates) target_coords = {x=posx, y=posy, z=posz} - if can_teleport(target_coords) == false then + if tp.can_teleport(target_coords) == false then minetest.chat_send_player(player, S("You cannot teleport to a location outside the map!")) return nil end @@ -244,8 +260,8 @@ function tpc_send(player, coordinates) -- If the area is protected, reject the user's request to teleport to these coordinates -- In future release we'll actually query the player who owns the area, if they're online, and ask for their permission. -- Admin user (priv "tp_admin") overrides all protection - if minetest.check_player_privs(pname, {tp_admin=true}) then - tpc_teleport_player(player) + if minetest.check_player_privs(pname, {tp_admin = true}) then + tp.tpc_teleport_player(player) minetest.chat_send_player(player, S("Teleporting to: @1, @2, @3", posx, posy, posz)) else if minetest.check_player_privs(pname, {tp_tpc = true}) then @@ -257,7 +273,7 @@ function tpc_send(player, coordinates) return end end - tpc_teleport_player(player) + tp.tpc_teleport_player(player) minetest.chat_send_player(player, S("Teleporting to: @1, @2, @3", posx, posy, posz)) else minetest.chat_send_player(player, S("Error: You do not have permission to teleport to coordinates.")) @@ -266,17 +282,17 @@ function tpc_send(player, coordinates) end end -function tpr_deny(name) - if tpr_list[name] then - name2 = tpr_list[name] +function tp.tpr_deny(name) + if tp.tpr_list[name] then + name2 = tp.tpr_list[name] minetest.chat_send_player(name2, S("Teleport request denied.")) minetest.chat_send_player(name, S("You denied the request @1 sent you.", name2)) - tpr_list[name] = nil - elseif tphr_list[name] then + tp.tpr_list[name] = nil + elseif tp.tphr_list[name] then name2 = tphr_list[name] minetest.chat_send_player(name2, S("Teleport request denied.")) minetest.chat_send_player(name, S("You denied the request @1 sent you.", name2)) - tphr_list[name] = nil + tp.tphr_list[name] = nil else minetest.chat_send_player(name, S("Usage: /tpn allows you to deny teleport requests sent to you by other players.")) return @@ -284,27 +300,26 @@ function tpr_deny(name) end -- Teleport Accept Systems -function tpr_accept(name, param) +function tp.tpr_accept(name, param) -- Check to prevent constant teleporting. - if not tpr_list[name] - and not tphr_list[name] - or param == "" then + if not tp.tpr_list[name] + and not tp.tphr_list[name] minetest.chat_send_player(name, S("Usage: /tpy ")) return end - if tpr_list[name] then - name2 = tpr_list[name] + if tp.tpr_list[name] then + name2 = tp.tpr_list[name] source = minetest.get_player_by_name(name) - target = minetest.get_player_by_name(param) - chatmsg = S("@1 is teleporting to you.", param) - tpr_list[name] = nil - elseif tphr_list[name] then - name2 = tphr_list[name] - source = minetest.get_player_by_name(param) + target = minetest.get_player_by_name(name2) + chatmsg = S("@1 is teleporting to you.", name2) + tp.tpr_list[name] = nil + elseif tp.tphr_list[name] then + name2 = tp.tphr_list[name] + source = minetest.get_player_by_name(name2) target = minetest.get_player_by_name(name) - chatmsg = S("You are teleporting to @1.", param) - tphr_list[name] = nil + chatmsg = S("You are teleporting to @1.", name2) + tp.tphr_list[name] = nil else return end @@ -312,16 +327,16 @@ function tpr_accept(name, param) -- Could happen if either player disconnects (or timeout); if so just abort if not source or not target then - minetest.chat_send_player(name, S("@1 doesn't exist, or just disconnected/left (by timeout).", param)) + minetest.chat_send_player(name, S("@1 doesn't exist, or just disconnected/left (by timeout).", name2)) return end - tpr_teleport_player() - minetest.chat_send_player(param, S("Request Accepted!")) + tp.tpr_teleport_player() + minetest.chat_send_player(name2, S("Request Accepted!")) minetest.chat_send_player(name, chatmsg) end -- Teleport Jump - Relative Position Teleportation by number of nodes -function tpj(player, param) +function tp.tpj(player, param) local pname = minetest.get_player_by_name(player) if param == "" then @@ -351,15 +366,15 @@ function tpj(player, param) minetest.chat_send_player(player, S("Not a valid axis. Valid options are X, Y or Z.")) return end - if can_teleport(target_coords) == false then + if tp.can_teleport(target_coords) == false then minetest.chat_send_player(player, S("You cannot teleport to a location outside the map!")) return end - tpc_teleport_player(player) + tp.tpc_teleport_player(player) end -- Evade -function tpe(player) +function tp.tpe(player) minetest.chat_send_player(player, S("EVADE!")) local mindistance = 15 local maxdistance = 50 @@ -378,7 +393,7 @@ function tpe(player) distance = isnegative .. math.random(mindistance,maxdistance) -- the distance to jump axis = options[math.random(3)] local command = axis .. " " .. distance - tpj(player, command) + tp.tpj(player, command) end ) iteration = iteration + 0.5 @@ -386,20 +401,19 @@ function tpe(player) end -- Register chatcommands -if enable_tpp_command then +if tp.enable_tpp_command then minetest.register_chatcommand("tpp", { description = S("Teleport to a place (i.e., spawn, shop)."), params = S(" | leave empty to see available places"), privs = {}, func = function(player, param) local pname = minetest.get_player_by_name(player) - param = param:lower() -- Show the available places to the player (taken from shivajiva101's POI mod, thanks!). if param == "" then local places = {} - if not available_places then available_places = {} end - for key, value in pairs(available_places) do + if not tp.available_places then tp.available_places = {} end + for key, value in pairs(tp.available_places) do table.insert(places, key) end if #places == 0 then @@ -408,12 +422,12 @@ if enable_tpp_command then table.insert(places, S("Usage: /tpp ")) return true, table.concat(places, "\n") -- Teleport player to the specified place (taken from shivajiva101's POI mod, thanks!). - elseif available_places[param] then - pos = {x = available_places[param].x, y = available_places[param].y, z = available_places[param].z} - tpp_teleport_player(player) + elseif tp.available_places[param] then + pos = {x = tp.available_places[param].x, y = tp.available_places[param].y, z = tp.available_places[param].z} + tp.tpp_teleport_player(player) minetest.chat_send_player(player, S("Teleporting to @1.", param)) -- Check if the place exists. - elseif not available_places[param] then + elseif not tp.available_places[param] then minetest.chat_send_player(player, S("There is no place by that name. Keep in mind this is case-sensitive.")) return end @@ -425,49 +439,49 @@ minetest.register_chatcommand("tpr", { description = S("Request teleport to another player"), params = S(" | leave playername empty to see help message"), privs = {interact = true, tp = true}, - func = tpr_send + func = tp.tpr_send }) minetest.register_chatcommand("tphr", { description = S("Request player to teleport to you"), params = S(" | leave playername empty to see help message"), privs = {interact = true, tp = true}, - func = tphr_send + func = tp.tphr_send }) minetest.register_chatcommand("tpc", { description = S("Teleport to coordinates"), params = S(" | leave coordinates empty to see help message"), privs = {interact = true, tp_tpc = true, tp = true}, - func = tpc_send + func = tp.tpc_send }) minetest.register_chatcommand("tpj", { description = S("Teleport to relative position"), params = S(" | leave empty to see help message"), privs = {interact = true, tp_tpc = true, tp = true}, - func = tpj + func = tp.tpj }) minetest.register_chatcommand("tpe", { description = S("Evade Enemy"), privs = {interact = true, tp_tpc = true, tp = true}, - func = tpe + func = tp.tpe }) minetest.register_chatcommand("tpy", { description = S("Accept teleport requests from another player"), privs = {interact = true, tp = true}, - func = tpr_accept + func = tp.tpr_accept }) minetest.register_chatcommand("tpn", { description = S("Deny teleport requests from another player"), privs = {interact = true, tp = true}, - func = tpr_deny + func = tp.tpr_deny }) -- Log if minetest.settings:get_bool("log_mods") then - minetest.log("action", S("[Teleport Request] TPS Teleport v@1 Loaded!", version)) + minetest.log("action", S("[Teleport Request] TPS Teleport v@1 Loaded!", tp.version)) end