-------------------------------------------------------------------------------- -- -- Minetest Mod "Travelpoints" Version 1.5 2018-02-10 -- -- By Racso Rhodes -- -- travelpoints/init.lua -- -------------------------------------------------------------------------------- -- License of source code, textures and sounds: WTFPL V2 -------------------------------------------------------------------------------- -- Copyright (C) 2013-2015 Racso Rhodes -- This work is free. You can redistribute it and/or modify it under the -- terms of the Do What The Fuck You Want To Public License, Version 2, -- as published by Sam Hocevar. See the COPYING file for more details. -------------------------------------------------------------------------------- -- TOC -------------------------------------------------------------------------------- -- -- On Load -- -- Chat Commands -- -- /tpback -- /tpdrop -- /tpgdrop -- /tpggo -- /tpgo -- /tpgset -- /travelpads -- /travelpoints -- /tpset -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- On Load -------------------------------------------------------------------------------- -- Register privilege - travelpoints. -- -- This allows users to set, drop and use their own travelpoints. -- Also allows usage of global travelpoints. -- minetest.register_privilege("travelpoints", "Can use the Travelpoints chat commands.") -- Register privilege - travelpads -- -- This allows the placing of travelpoints:tansporter_pad nodes. -- minetest.register_privilege("travelpads", "Can place Travelpoint Transporter Pads.") -- Register privilege - tpglobal -- -- This allows the saving and dropping of global travelpoints. -- minetest.register_privilege("tpglobal", "Can set and drop global travelpoints.") -- Initialize mod table. travelpoints = {} -- Get path to this mod. travelpoints.modpath = minetest.get_modpath(minetest.get_current_modname()) -- Get path to current world. travelpoints.worldpath = minetest.get_worldpath() -- Get filesystem directory delimiter. travelpoints.delimiter = string.sub(package.config, 1, 1) -- Set travelpoints_tables directory path. travelpoints.travelpoints_tables = travelpoints.worldpath .. travelpoints.delimiter .. "travelpoints_tables" -- Create directory if it does not exist. if minetest.mkdir then -- Added in Minetest 0.4.13 (Thanks to GitHub user "ritschwumm" for pointing it out.) minetest.mkdir(travelpoints.travelpoints_tables) else -- For Minetest versions < 0.4.13 os.execute("mkdir \"" .. travelpoints.travelpoints_tables .. "\"") end -- Set version for /travelpoints. travelpoints.version_number = "1.4" -- Set version date for /travelpoints. travelpoints.version_date = "2015-03-27" -- Initialize restrictions table. travelpoints.restrictions = {} -- Load config file. dofile(travelpoints.modpath .. travelpoints.delimiter .. "config.lua") -- Load functions file. dofile(travelpoints.modpath .. travelpoints.delimiter .. "functions.lua") -- Load nodes file. dofile(travelpoints.modpath .. travelpoints.delimiter .. "nodes.lua") -- Validate config setting values. travelpoints.validate_config() -- Get world specific restrictions. travelpoints.get_world_restrictions() -------------------------------------------------------------------------------- -- Chat Commands -------------------------------------------------------------------------------- --[/tpback]-------------------------------------------------------------------- -- -- Returns player to the location they last used /tpgo . -- minetest.register_chatcommand("tpback", { params = "", description = "Teleports you back to the location where \"/tpgo <title>\" was last used.", privs = {travelpoints=true}, func = function(name, param) -- Get travelpoints_table. local travelpoints_table = travelpoints.get_travelpoints_table("user", name) -- Check for return location. if not travelpoints_table._back then travelpoints.print_notice(name, "You have no return location.") return end -- Get player. local player = minetest.get_player_by_name(name) -- Teleport player. player:setpos(travelpoints_table._back) -- Report. travelpoints.print_notice(name, "You have returned to " .. minetest.pos_to_string(travelpoints_table._back) .. "." ) -- Clear return location. if travelpoints.restrictions.clear_back_pos > 0 then travelpoints_table._back = nil travelpoints.save_travelpoints_table("user", name, travelpoints_table) end end, }) --[/tpdrop]-------------------------------------------------------------------- -- -- Allows player to remove the specified travelpoint for the current world, if -- "all" is used, all travelpoints are removed. -- minetest.register_chatcommand("tpdrop", { params = "<title> | all", description = "Removes the travelpoint specified by <title>. To remove all of your travelpoints for this world, use \"/tpdrop all\".", privs = {travelpoints=true}, func = function(name, param) ------------------------------------------------------------------------ -- /tpdrop ------------------------------------------------------------------------ if param == "" then travelpoints.print_notice(name, "Error: No travelpoint was specified.") return ------------------------------------------------------------------------ -- /tpdrop all ------------------------------------------------------------------------ elseif param == "all" then -- Get travelpoints_table. local travelpoints_table = travelpoints.get_travelpoints_table("user", name) -- Initialize new travelpoints_table. local tpt = {} -- Step through travelpoints_table. for key, value in pairs(travelpoints_table) do -- Find keys that begin with an underscore and add to new table. if string.find(key, "^_[%w_]+$") then tpt[key] = value end end -- Overwrite existing travelpoints_table with new table. if travelpoints.save_travelpoints_table("user", name, tpt) then -- Report success. travelpoints.print_notice(name, "You have removed all of your travelpoints for this world." ) else -- Report error. travelpoints.print_notice(name, "Error: Your travelpoints for this world could not be removed.") end return ------------------------------------------------------------------------ -- /tpdrop <title> ------------------------------------------------------------------------ else -- Get Title. local title = string.match(param, "^([^ ]+)%s*") -- Validate Title. local notice = travelpoints.validate_title(title) if notice ~= nil then travelpoints.print_notice(name, notice) return end -- Get travelpoints_table. local travelpoints_table = travelpoints.get_travelpoints_table("user", name) -- Check if <title> is a valid travelpoint. if travelpoints_table[title] == nil then travelpoints.print_notice(name, "Error: Travelpoint \"" .. title .. "\" does not exist.") return end -- Remove travelpoint from table. travelpoints_table[title] = nil -- Save travelpoints_table. if travelpoints.save_travelpoints_table("user", name, travelpoints_table) then -- Report success. travelpoints.print_notice(name, "Travelpoint \"" .. title .. "\" has been removed." ) else -- Report error. travelpoints.print_notice(name, "Error: Travelpoint \"" .. title .. "\" could not be removed.") end end end, }) --[/tpgdrop]-------------------------------------------------------------------- -- -- Removes global travelpoints, or all if specified. -- minetest.register_chatcommand("tpgdrop", { params = "<title> | all", description = "Removes the global travelpoint specified by <title>. To remove all global travelpoints for this world, use \"/tpgdrop all\".", privs = {tpglobal=true}, func = function(name, param) ------------------------------------------------------------------------ -- /tpgdrop ------------------------------------------------------------------------ if param == "" then travelpoints.print_notice(name, "Error: No travelpoint was specified.") return ------------------------------------------------------------------------ -- /tpgdrop all ------------------------------------------------------------------------ elseif param == "all" then -- Check if user has server privilege. if minetest.get_player_privs(name)["server"] then -- Get travelpoints table. local travelpoints_table = travelpoints.get_travelpoints_table("global", name) -- Initialize new travelpoints table. local tpt = {} -- Overwrite existing travelpoints table with new table. if travelpoints.save_travelpoints_table("global", name, tpt) then -- Report success. travelpoints.print_notice(name, "You have removed all global travelpoints for this world." ) else -- Report error. travelpoints.print_notice(name, "Error: Global travelpoints for this world could not be removed.") end return else -- Report error. travelpoints.print_notice(name, "Server privilege required to drop all global travelpoints.") end ------------------------------------------------------------------------ -- /tpgdrop <title> ------------------------------------------------------------------------ else -- Get Title. local title = string.match(param, "^([^ ]+)%s*") -- Validate Title. local notice = travelpoints.validate_title(title) if notice ~= nil then travelpoints.print_notice(name, notice) return end -- Get travelpoints_table. local travelpoints_table = travelpoints.get_travelpoints_table("global", name) -- Check if <title> is a valid travelpoint. if travelpoints_table[title] == nil then travelpoints.print_notice(name, "Error: Global travelpoint \"" .. title .. "\" does not exist.") return end -- Remove travelpoint from table. travelpoints_table[title] = nil -- Save travelpoints_table. if travelpoints.save_travelpoints_table("global", name, travelpoints_table) then -- Report success. travelpoints.print_notice(name, "Global travelpoint \"" .. title .. "\" has been removed." ) else -- Report error. travelpoints.print_notice(name, "Error: Global travelpoint \"" .. title .. "\" could not be removed.") end end end, }) --[/tpggo]----------------------------------------------------------------------- -- -- Teleports player to specified global travelpoint, or displays available -- global travelpoints if no title given. -- minetest.register_chatcommand("tpggo", { params = "(nothing) | <title>", description = "Teleports you to the specified global travelpoint. If no travelpoint given, a list of available global travelpoints is displayed.", privs = {travelpoints=true}, func = function(name, param) -- Get global travelpoints table. local global_travelpoints_table = travelpoints.get_travelpoints_table("global", name) -- Get player's travelpoints table. local user_travelpoints_table = travelpoints.get_travelpoints_table("user", name) -- Assume no cooldown until calculated otherwise. local cooldown_remaining = "none" -- Get current time. local now = os.time() -- Check if cooldown needs to be calculated. if ( not minetest.is_singleplayer() ) and ( travelpoints.restrictions.cooldown > 0 ) and ( not minetest.get_player_privs(name)["server"] ) then if user_travelpoints_table._cooldown ~= nil then -- Cooldown timestamp. local coolstamp = user_travelpoints_table._cooldown -- Seconds since cooldown timestamp. local seconds_since = ( now - coolstamp ) -- Check if seconds since last /tpgo <title> or /tpggo <title> -- is less than cooldown time. if seconds_since < travelpoints.restrictions.cooldown then -- Get time remaining for cooldown. cooldown_remaining = travelpoints.get_duration(travelpoints.restrictions.cooldown - seconds_since) end end end ------------------------------------------------------------------------ -- /tpggo ------------------------------------------------------------------------ if param == "" then -- Get travelpoints array. local travelpoints_array = travelpoints.get_travelpoints_array("global", name) -- Check if there are any travelpoints. if #travelpoints_array > 0 then -- Begin output. travelpoints.print_notice(name, "Available global travelpoints:") -- Step through travelpoints_array. for index, value in ipairs(travelpoints_array) do -- Extract title from value: "<title> (<x>, <y>, <z>)" local title = string.match(value, "^([^ ]+)%s+") -- Output lines. -- <n>. <title> (<x>, <y>, <z>). Saved on <date> at <time>. Descripton: <desc> travelpoints.print_notice(name, index .. ". \"" .. title .. "\" " .. minetest.pos_to_string(global_travelpoints_table[title].pos) .. ". Saved on " .. os.date("%Y-%m-%d at %I:%M:%S %p", global_travelpoints_table[title].timestamp) .. ". Description: " .. global_travelpoints_table[title].desc) end else travelpoints.print_notice(name, "There are no saved global travelpoints.") end -- Cooldown remaining. if cooldown_remaining ~= "none" then travelpoints.print_notice(name, "Your remaining cooldown is: " .. cooldown_remaining .. ".") end return ------------------------------------------------------------------------ -- /tpggo <title> ------------------------------------------------------------------------ else -- Check if player is on cooldown. if cooldown_remaining == "none" then -- Get Title. local title = string.match(param, "^([^ ]+)%s*") -- Validate Title. local notice = travelpoints.validate_title(title) if notice ~= nil then travelpoints.print_notice(name, notice) return end -- Check for specified travelpoint. if not global_travelpoints_table[title] then travelpoints.print_notice(name, "Error: Global travelpoint \"" .. title .. "\"does not exist.") return end -- Set location for /tpback user_travelpoints_table._back = travelpoints.get_location(name) -- Get player. local player = minetest.get_player_by_name(name) -- Teleport player. player:setpos(global_travelpoints_table[title].pos) -- Report. travelpoints.print_notice(name, "Teleported to global travelpoint: \"" .. title .. "\". Use /tpback to return to " .. minetest.pos_to_string(user_travelpoints_table._back) .. "." ) -- Set cooldown if needed. if ( not minetest.is_singleplayer() ) and ( travelpoints.restrictions.cooldown > 0 ) then user_travelpoints_table._cooldown = now end -- Save player's travelpoints table. travelpoints.save_travelpoints_table("user", name, user_travelpoints_table) else -- Report travelpoints.print_notice(name, "Time remaining on your cooldown: " .. cooldown_remaining .. ".") end end end, }) --[/tpgo]----------------------------------------------------------------------- -- -- Teleports player to specified travelpoint, or displays available -- travelpoints if no title given. -- minetest.register_chatcommand("tpgo", { params = "(nothing) | <title>", description = "Teleports you to the specified travelpoint. If no travelpoint given, a list of available travelpoints is displayed.", privs = {travelpoints=true}, func = function(name, param) -- Get travelpoints_table. local travelpoints_table = travelpoints.get_travelpoints_table("user", name) -- Assume no cooldown until calculated otherwise. local cooldown_remaining = "none" -- Get current time. local now = os.time() -- Check if coodown needs to be calculated. if ( not minetest.is_singleplayer() ) and ( travelpoints.restrictions.cooldown > 0 ) and ( not minetest.get_player_privs(name)["server"] ) then if travelpoints_table._cooldown ~= nil then -- Cooldown timestamp. local coolstamp = travelpoints_table._cooldown -- Seconds since cooldown timestamp. local seconds_since = ( now - coolstamp ) -- Check if seconds since last /tpgo <title> is less than cooldown time. if seconds_since < travelpoints.restrictions.cooldown then -- Get time remaining for cooldown. cooldown_remaining = travelpoints.get_duration(travelpoints.restrictions.cooldown - seconds_since) end end end ------------------------------------------------------------------------ -- /tpgo ------------------------------------------------------------------------ if param == "" then -- Get travelpoints_array. local travelpoints_array = travelpoints.get_travelpoints_array("user", name) -- Check if player has any travelpoints. if #travelpoints_array > 0 then -- Begin output. travelpoints.print_notice(name, "Your available travelpoints:") -- Step through travelpoints_array. for index, value in ipairs(travelpoints_array) do -- Extract title from value: "<title> (<x>, <y>, <z>)" local title = string.match(value, "^([^ ]+)%s+") -- Output lines. -- <n>. <title> (<x>, <y>, <z>). Saved on <date> at <time>. Descripton: <desc> travelpoints.print_notice(name, index .. ". \"" .. title .. "\" " .. minetest.pos_to_string(travelpoints_table[title].pos) .. ". Saved on " .. os.date("%Y-%m-%d at %I:%M:%S %p", travelpoints_table[title].timestamp) .. ". Description: " .. travelpoints_table[title].desc) end else travelpoints.print_notice(name, "You have no saved travelpoints.") end -- Check conditions for handling max_travelpoints. if ( not minetest.is_singleplayer() ) and ( travelpoints.restrictions.max_travelpoints > 0 ) and ( not minetest.get_player_privs(name)["server"] ) then local max_travelpoints = travelpoints.restrictions.max_travelpoints if max_travelpoints > 0 then if tp_count < max_travelpoints then if tp_count == 0 then travelpoints.print_notice(name, "You can set " .. max_travelpoints .. " travelpoints.") else travelpoints.print_notice(name, "You can set " .. ( max_travelpoints - tp_count ) .. " more travelpoints.") end elseif tp_count == max_travelpoints then travelpoints.print_notice(name, "You can set no more travelpoints unless you /tpdrop older ones. Maximum allowed is " .. max_travelpoints .. ".") end end end -- Cooldown remaining. if cooldown_remaining ~= "none" then travelpoints.print_notice(name, "Your remaining cooldown is: " .. cooldown_remaining .. ".") end return ------------------------------------------------------------------------ -- /tpgo <title> ------------------------------------------------------------------------ else -- Check if player is on cooldown. if cooldown_remaining == "none" then -- Get Title. local title = string.match(param, "^([^ ]+)%s*") -- Validate Title. local notice = travelpoints.validate_title(title) if notice ~= nil then travelpoints.print_notice(name, notice) return end -- Check for specified travelpoint. if not travelpoints_table[title] then travelpoints.print_notice(name, "Error: Travelpoint \"" .. title .. "\"does not exist.") return end -- Set location for /tpback travelpoints_table._back = travelpoints.get_location(name) -- Get player. local player = minetest.get_player_by_name(name) -- Teleport player. player:setpos(travelpoints_table[title].pos) -- Report. travelpoints.print_notice(name, "Teleported to travelpoint: \"" .. title .. "\". Use /tpback to return to " .. minetest.pos_to_string(travelpoints_table._back) .. "." ) -- Set cooldown if needed. if ( not minetest.is_singleplayer() ) and ( travelpoints.restrictions.cooldown > 0 ) then travelpoints_table._cooldown = now end -- Save travelpoints_table. travelpoints.save_travelpoints_table("user", name, travelpoints_table) else -- Report travelpoints.print_notice(name, "Time remaining on your cooldown: " .. cooldown_remaining .. ".") end end end, }) --[/tpgset]--------------------------------------------------------------------- -- -- Adds a new travelpoint to the world's global travelpoints table. -- minetest.register_chatcommand("tpgset", { params = "<title> | <title> <desc>", description = "Set a new global travelpoint at your current location. Title required, description optional.", privs = {tpglobal=true}, func = function(name, param) ------------------------------------------------------------------------ -- /tpgset ------------------------------------------------------------------------ if param == "" then travelpoints.print_notice(name, "Error: Travelpoint must be saved with a title.") return else -------------------------------------------------------------------- -- /tpgset <title> | <title> <desc> -------------------------------------------------------------------- local title, desc, notice, pos -- Get parameters. if string.find(param, "^[^ ]+%s+.+") then title, desc = string.match(param, "^([^ ]+)%s+(.+)") else title = param desc = "" end -- Validate Title. if title ~= nil then notice = travelpoints.validate_title(title) if notice ~= nil then travelpoints.print_notice(name, notice) return end end -- Validate Description. if desc ~= "" then notice = travelpoints.validate_desc(desc) if notice ~= nil then travelpoints.print_notice(name, notice) return end end -- Get player's location. pos = travelpoints.get_location(name) -- Initialize temporary travelpoint table. local travelpoint = {} -- Build travelpoint table. travelpoint.pos = pos travelpoint.desc = desc travelpoint.timestamp = os.time() -- Get travelpoints_table. local travelpoints_table = travelpoints.get_travelpoints_table("global", name) -- Check for duplicate title. if travelpoints_table[title] ~= nil then travelpoints.print_notice(name, "Error: A global travelpoint already exists for this title: " .. title) else -- Merge tables. travelpoints_table[title] = travelpoint -- Save travelpoints_table. if travelpoints.save_travelpoints_table("global", name, travelpoints_table) then travelpoints.print_notice(name, "Global travelpoint \"" .. title .. "\" has been saved.") else travelpoints.print_notice(name, "Error: Global travelpoint \"" .. title .. "\" could not be saved.") end end end end, }) --[/travelpads]----------------------------------------------------------------- -- -- Returns a list of transporter pads the user has placed. -- minetest.register_chatcommand("travelpads", { params = "", description = "Lists the transporter pads you have placed.", privs = {travelpoints=true, travelpads=true}, func = function(name, param) -- Get travelpoints_table. local travelpoints_table = travelpoints.get_travelpoints_table("user", name) -- Initialize array local travelpads = {} -- Pack array for count and sorting. if travelpoints_table._travelpads ~= nil then for key, value in pairs(travelpoints_table._travelpads) do if key ~= nil then table.insert(travelpads, value .. "|" .. key) end end end -- Sort values. table.sort(travelpads, function(A, B) return A > B end) local pad_count = #travelpads local now = os.time() -- List player's travelpads if there are any. if #travelpads == 0 then travelpoints.print_notice(name, "You have no placed transporter pads.") else local count = 1 for key, value in ipairs(travelpads) do local values = value:split("|") -- builtin/misc_helpers.lua local since = now - values[1] -- <n>. Placed at (<x>, <y>, <z>) <duration> ago. travelpoints.print_notice(name, count .. ". Placed at " .. values[2] .. " " .. travelpoints.get_duration(since, 3) .. " ago.") count = count + 1 end end -- Check conditions for handling max_travelpads. if ( not minetest.is_singleplayer() ) and ( travelpoints.restrictions.max_travelpads > 0 ) and ( not minetest.get_player_privs(name)["server"] ) then local max_travelpads = travelpoints.restrictions.max_travelpads if max_travelpads > 0 then if pad_count < max_travelpads then if pad_count == 0 then travelpoints.print_notice(name, "You can place " .. max_travelpads .. " transporter pads.") else travelpoints.print_notice(name, "You can place " .. ( max_travelpads - pad_count ) .. " more transporter pads.") end elseif pad_count == max_travelpads then travelpoints.print_notice(name, "You can place no more transporter pads unless you remove older ones. Maximum allowed is " .. max_travelpads .. ".") end end end end, }) --[/travelpoints]------------------------------------------------------------------ -- -- Gives player information about the mod and allows those with server privs to -- modify restrictions in game. -- minetest.register_chatcommand("travelpoints", { params = "(nothing) | set | set <restriction> <value>", description = "Provides players with details about the mod. Players with server privilege can use \"/travelpoints set\" to change restrictions.", privs = {travelpoints=true}, func = function(name, param) ------------------------------------------------------------------------ -- /travelpoints ------------------------------------------------------------------------ if param == "" then if ( not minetest.is_singleplayer() ) then local max_travelpoints local max_travelpads local cooldown local player_cooldown = "none" local travelpads = {} local tpback local travelpoints_table = travelpoints.get_travelpoints_table("user", name) local travelpoints_array = travelpoints.get_travelpoints_array("user", name) -- Max travelpoints if minetest.get_player_privs(name)["server"] then max_travelpoints = "No limit (server privilege)" elseif travelpoints.restrictions.max_travelpoints == 0 then max_travelpoints = "No limit" else max_travelpoints = travelpoints.restrictions.max_travelpoints end -- Max travelpads if minetest.get_player_privs(name)["server"] then max_travelpads = "No limit (server privilege)" elseif travelpoints.restrictions.max_travelpads == 0 then max_travelpads = "No limit" else max_travelpads = travelpoints.restrictions.max_travelpads end -- Cooldown if minetest.get_player_privs(name)["server"] then cooldown = "No cooldown (server privilege)" elseif travelpoints.restrictions.cooldown == 0 then cooldown = "No cooldown" else cooldown = travelpoints.get_duration(travelpoints.restrictions.cooldown) end -- Player cooldown if ( not minetest.is_singleplayer() ) and ( travelpoints.restrictions.cooldown > 0 ) and ( not minetest.get_player_privs(name)["server"] ) then if travelpoints_table._cooldown ~= nil then local difference = os.time() - travelpoints_table._cooldown if difference < travelpoints.restrictions.cooldown then player_cooldown = travelpoints.get_duration(difference) end end end if travelpoints.restrictions.clear_back_pos > 0 then tpback = "is cleared after use" else tpback = "not cleared after use" end if travelpoints_table._travelpads ~= nil then -- Pack array to get travelpad count. for key, value in pairs(travelpoints_table._travelpads) do if key ~= nil then table.insert(travelpads, key) end end end -- Report travelpoints.print_notice(name, "Running Travelpoints version " .. travelpoints.version_number .. " released on " .. travelpoints.version_date .. ".") travelpoints.print_notice(name, "Restrictions:") travelpoints.print_notice(name, "Max Travelpoints: [" .. max_travelpoints .. "] You have: [" .. #travelpoints_array .. "]") travelpoints.print_notice(name, "Max Transporter Pads: [" .. max_travelpads .. "] You have: [" .. #travelpads .. "]") travelpoints.print_notice(name, "Cooldown: [" .. cooldown .. "] Your cooldown is: [" .. player_cooldown .. "]") travelpoints.print_notice(name, "Back Location: [" .. tpback .. "]") else -- Report travelpoints.print_notice(name, "Running Travelpoints version " .. travelpoints.version_number .. " released on " .. travelpoints.version_date .. ".") end ------------------------------------------------------------------------ -- /travelpoints set ------------------------------------------------------------------------ -- Show available restrictions. elseif param == "set" then -- Check privs. if minetest.get_player_privs(name)["server"] then travelpoints.print_notice(name, "Available restrictions to modify with \"/travelpoints set <restriction> <value>\" are:") travelpoints.print_notice(name, "max_travelpoints <value> - Change travelpoints limit, \"0\" for no limit. Currently: " .. travelpoints.restrictions.max_travelpoints) travelpoints.print_notice(name, "max_travelpads <value> - Change travelpads limit, \"0\" for no limit. Currently: " .. travelpoints.restrictions.max_travelpads) travelpoints.print_notice(name, "cooldown <value> - Change cooldown time, \"0\" for no cooldown. Currently: " .. travelpoints.restrictions.cooldown) travelpoints.print_notice(name, "clear_back_pos <value> - Change /tpback location setting. Currently: " .. travelpoints.restrictions.clear_back_pos) else travelpoints.print_notice(name, "Server privilege required for that command.") end ------------------------------------------------------------------------ -- /travelpoints set <restriction> <value> ------------------------------------------------------------------------ -- Check parameters. elseif string.find(param, "^set [%w_ ]+") then -- Check privs. if minetest.get_player_privs(name)["server"] then local restriction, value -- Split parameters local parameters = param:split(" ") -- builtin/misc_helpers.lua -- Table to test <restriction> against. local restrictions = { max_travelpoints = true, max_travelpads = true, cooldown = true, clear_back_pos = true } -- Validate <restriction> if restrictions[parameters[2]] then restriction = parameters[2] else travelpoints.print_notice(name, "Error: Restriction name was mistyped.") return end -- Validate <value> if type(tonumber(parameters[3])) == "number" then value = tonumber(parameters[3]) else travelpoints.print_notice(name, "Error: Restriction value must be a number.") return end local change_made = false -- Validate input. local result, error_message = travelpoints.validate_restriction_value(restriction, value) -- Max Travelpoints if restriction == "max_travelpoints" then if value == travelpoints.restrictions.max_travelpoints then travelpoints.print_notice(name, "There was no change to max_travelpoints.") elseif result then travelpoints.restrictions.max_travelpoints = value travelpoints.print_notice(name, "Value of max_travelpoints is now " .. travelpoints.restrictions.max_travelpoints .. ".") change_made = true else travelpoints.print_notice(name, error_message) end -- Max Travelpads elseif restriction == "max_travelpads" then if value == travelpoints.restrictions.max_travelpads then travelpoints.print_notice(name, "There was no change to max_travelpads.") elseif result then travelpoints.restrictions.max_travelpads = value travelpoints.print_notice(name, "Value of max_travelpads is now " .. travelpoints.restrictions.max_travelpads .. ".") change_made = true else travelpoints.print_notice(name, error_message) end -- Cooldown elseif restriction == "cooldown" then if value == travelpoints.restrictions.cooldown then travelpoints.print_notice(name, "There was no change to cooldown.") elseif result then travelpoints.restrictions.cooldown = value travelpoints.print_notice(name, "Value of cooldown is now " .. travelpoints.restrictions.cooldown .. ".") change_made = true else travelpoints.print_notice(name, error_message) end -- Clear Back Pos elseif restriction == "clear_back_pos" then if value == travelpoints.restrictions.clear_back_pos then travelpoints.print_notice(name, "There was no change to clear_back_pos.") elseif result then travelpoints.restrictions.clear_back_pos = value travelpoints.print_notice(name, "Value of clear_back_pos is now " .. travelpoints.restrictions.clear_back_pos .. ".") change_made = true else travelpoints.print_notice(name, error_message) end else travelpoints.print_notice(name, "Error: Restriction name was mistyped.") end -- Save changes. if change_made then -- Save changes to world's "travelpoints_restrictions" file. if travelpoints.save_world_restrictions(travelpoints.restrictions) then travelpoints.print_notice(name, "Restrictions for this world saved.") else travelpoints.print_notice(name, "Error: Restrictions for this world could not be saved.") end end else travelpoints.print_notice(name, "Server privilege required for that command.") end else travelpoints.print_notice(name, "Error: Command could not be processed, you may have mistyped it.") end end, }) --[/tpset]--------------------------------------------------------------------- -- -- Adds a new travelpoint to the player's travelpoints_table for the current -- world. -- minetest.register_chatcommand("tpset", { params = "<title> | <title> <desc>", description = "Set a new travelpoint at your current location. Title required, description optional.", privs = {travelpoints=true}, func = function(name, param) ------------------------------------------------------------------------ -- /tpset ------------------------------------------------------------------------ if param == "" then travelpoints.print_notice(name, "Error: Travelpoint must be saved with a title.") return else ------------------------------------------------------------------------ -- /tpset <title> | <title> <desc> ------------------------------------------------------------------------ local tp_count = #travelpoints.get_travelpoints_array("user", name) -- Handle maximum_travelpoints if it is configured. if ( not minetest.is_singleplayer() ) and ( travelpoints.restrictions.max_travelpoints > 0 ) and ( tp_count >= travelpoints.restrictions.max_travelpoints ) and ( not minetest.get_player_privs(name)["server"] ) then travelpoints.print_notice(name, "You have already reached your maximum number of travelpoints: " .. travelpoints.restrictions.max_travelpoints .. ".") return else local title, desc, notice, pos -- Get parameters. if string.find(param, "^[^ ]+%s+.+") then title, desc = string.match(param, "^([^ ]+)%s+(.+)") else title = param desc = "" end -- Validate Title. if title ~= nil then notice = travelpoints.validate_title(title) if notice ~= nil then travelpoints.print_notice(name, notice) return end end -- Validate Description. if desc ~= "" then notice = travelpoints.validate_desc(desc) if notice ~= nil then travelpoints.print_notice(name, notice) return end end -- Get player's location. pos = travelpoints.get_location(name) -- Initialize temporary travelpoint table. local travelpoint = {} -- Build travelpoint table. travelpoint.pos = pos travelpoint.desc = desc travelpoint.timestamp = os.time() -- Get travelpoints_table. local travelpoints_table = travelpoints.get_travelpoints_table("user", name) -- Check for duplicate title. if travelpoints_table[title] ~= nil then travelpoints.print_notice(name, "Error: A travelpoint already exists for this title: " .. title) else -- Merg tables. travelpoints_table[title] = travelpoint -- Save travelpoints_table. if travelpoints.save_travelpoints_table("user", name, travelpoints_table) then travelpoints.print_notice(name, "Travelpoint \"" .. title .. "\" has been saved.") else travelpoints.print_notice(name, "Error: Travelpoint \"" .. title .. "\" could not be saved.") end end end end end, }) -------------------------------------------------------------------------------- -- EOF --------------------------------------------------------------------------------