X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=builtin%2Fgame%2Fmisc.lua;h=39ef9b461ce08b3654d5c4595230e8844a940675;hb=912ba1e47f61be18fa01cc91936929168c883f7b;hp=d0e67bd8875aa10931e1328832ad67df61576c99;hpb=31e0667a4a53a238d0321194b57b083bd74c0a5b;p=minetest.git diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua index d0e67bd88..39ef9b461 100644 --- a/builtin/game/misc.lua +++ b/builtin/game/misc.lua @@ -4,104 +4,84 @@ -- Misc. API functions -- -local jobs = {} -local time = 0.0 -local last = 0.0 - -core.register_globalstep(function(dtime) - local new = core.get_us_time() / 1000000 - if new > last then - time = time + (new - last) - else - -- Overflow, we may lose a little bit of time here but - -- only 1 tick max, potentially running timers slightly - -- too early. - time = time + new - end - last = new - - if #jobs < 1 then - return - end - - -- Iterate backwards so that we miss any new timers added by - -- a timer callback, and so that we don't skip the next timer - -- in the list if we remove one. - for i = #jobs, 1, -1 do - local job = jobs[i] - if time >= job.expire then - core.set_last_run_mod(job.mod_origin) - job.func(unpack(job.arg)) - table.remove(jobs, i) - end - end -end) - -function core.after(after, func, ...) - assert(tonumber(time) and type(func) == "function", - "Invalid core.after invocation") - table.insert(jobs, { - func = func, - expire = time + after, - arg = {...}, - mod_origin = core.get_last_run_mod() - }) -end - -function core.check_player_privs(player_or_name, ...) - local name = player_or_name - -- Check if we have been provided with a Player object. - if type(name) ~= "string" then +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 - + local requested_privs = {...} local player_privs = core.get_player_privs(name) local missing_privileges = {} - + 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 - table.insert(missing_privileges, priv) + 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) @@ -149,7 +129,7 @@ function core.get_node_group(name, group) end 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 @@ -197,3 +177,12 @@ function core.http_add_fetch(httpenv) 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 +