X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=builtin%2Fgame%2Fmisc.lua;h=39ef9b461ce08b3654d5c4595230e8844a940675;hb=912ba1e47f61be18fa01cc91936929168c883f7b;hp=4afcdb99e59c91a1d563a7cce326a2795e11425a;hpb=c4359ff65cd8e4e754442b9f2ef7051a8eaa4241;p=minetest.git diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua index 4afcdb99e..39ef9b461 100644 --- a/builtin/game/misc.lua +++ b/builtin/game/misc.lua @@ -4,64 +4,103 @@ -- Misc. API functions -- -core.timers_to_add = {} -core.timers = {} -core.register_globalstep(function(dtime) - for _, timer in ipairs(core.timers_to_add) do - table.insert(core.timers, timer) +function core.check_player_privs(name, ...) + local arg_type = type(name) + if (arg_type == "userdata" or arg_type == "table") and + name.get_player_name then -- If it quacks like a Player... + name = name:get_player_name() + elseif arg_type ~= "string" then + error("Invalid core.check_player_privs argument type: " .. arg_type, 2) end - core.timers_to_add = {} - for index, timer in ipairs(core.timers) do - timer.time = timer.time - dtime - if timer.time <= 0 then - timer.func(unpack(timer.args or {})) - table.remove(core.timers,index) - end - end -end) -function core.after(time, func, ...) - assert(tonumber(time) and type(func) == "function", - "Invalid core.after invocation") - table.insert(core.timers_to_add, {time=time, func=func, args={...}}) -end - -function core.check_player_privs(name, privs) + local requested_privs = {...} local player_privs = core.get_player_privs(name) local missing_privileges = {} - for priv, val in pairs(privs) do - if val then + + if type(requested_privs[1]) == "table" then + -- We were provided with a table like { privA = true, privB = true }. + for priv, value in pairs(requested_privs[1]) do + if value and not player_privs[priv] then + missing_privileges[#missing_privileges + 1] = priv + end + end + else + -- Only a list, we can process it directly. + for key, priv in pairs(requested_privs) do if not player_privs[priv] then - table.insert(missing_privileges, priv) + missing_privileges[#missing_privileges + 1] = priv end end end + if #missing_privileges > 0 then return false, missing_privileges end + return true, "" end local player_list = {} +function core.send_join_message(player_name) + if not minetest.is_singleplayer() then + core.chat_send_all("*** " .. player_name .. " joined the game.") + end +end + +function core.send_leave_message(player_name, timed_out) + local announcement = "*** " .. player_name .. " left the game." + if timed_out then + announcement = announcement .. " (timed out)" + end + core.chat_send_all(announcement) +end + core.register_on_joinplayer(function(player) - player_list[player:get_player_name()] = player + local player_name = player:get_player_name() + player_list[player_name] = player + core.send_join_message(player_name) end) -core.register_on_leaveplayer(function(player) - player_list[player:get_player_name()] = nil +core.register_on_leaveplayer(function(player, timed_out) + local player_name = player:get_player_name() + player_list[player_name] = nil + core.send_leave_message(player_name, timed_out) end) function core.get_connected_players() local temp_table = {} for index, value in pairs(player_list) do if value:is_player_connected() then - table.insert(temp_table, value) + temp_table[#temp_table + 1] = value end end return temp_table end +function minetest.player_exists(name) + return minetest.get_auth_handler().get_auth(name) ~= nil +end + +-- Returns two position vectors representing a box of `radius` in each +-- direction centered around the player corresponding to `player_name` +function core.get_player_radius_area(player_name, radius) + local player = core.get_player_by_name(player_name) + if player == nil then + return nil + end + + local p1 = player:getpos() + local p2 = p1 + + if radius then + p1 = vector.subtract(p1, radius) + p2 = vector.add(p2, radius) + end + + return p1, p2 +end + function core.hash_node_position(pos) return (pos.z+32768)*65536*65536 + (pos.y+32768)*65536 + pos.x+32768 end @@ -89,32 +128,8 @@ function core.get_node_group(name, group) return core.get_item_group(name, group) end -function core.string_to_pos(value) - local p = {} - p.x, p.y, p.z = string.match(value, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") - if p.x and p.y and p.z then - p.x = tonumber(p.x) - p.y = tonumber(p.y) - p.z = tonumber(p.z) - return p - end - local p = {} - p.x, p.y, p.z = string.match(value, "^%( *([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+) *%)$") - if p.x and p.y and p.z then - p.x = tonumber(p.x) - p.y = tonumber(p.y) - p.z = tonumber(p.z) - return p - end - return nil -end - -assert(core.string_to_pos("10.0, 5, -2").x == 10) -assert(core.string_to_pos("( 10.0, 5, -2)").z == -2) -assert(core.string_to_pos("asd, 5, -2)") == nil) - function core.setting_get_pos(name) - local value = core.setting_get(name) + local value = core.settings:get(name) if not value then return nil end @@ -132,3 +147,42 @@ function core.record_protection_violation(pos, name) end end +local raillike_ids = {} +local raillike_cur_id = 0 +function core.raillike_group(name) + local id = raillike_ids[name] + if not id then + raillike_cur_id = raillike_cur_id + 1 + raillike_ids[name] = raillike_cur_id + id = raillike_cur_id + end + return id +end + +-- HTTP callback interface +function core.http_add_fetch(httpenv) + httpenv.fetch = function(req, callback) + local handle = httpenv.fetch_async(req) + + local function update_http_status() + local res = httpenv.fetch_async_get(handle) + if res.completed then + callback(res) + else + core.after(0, update_http_status) + end + end + core.after(0, update_http_status) + end + + return httpenv +end + +function core.close_formspec(player_name, formname) + return minetest.show_formspec(player_name, formname, "") +end + +function core.cancel_shutdown_requests() + core.request_shutdown("", false, -1) +end +