-- Minetest: builtin/misc.lua local S = core.get_translator("__builtin") -- -- Misc. API functions -- function core.check_player_privs(name, ...) if core.is_player(name) then name = name:get_player_name() elseif type(name) ~= "string" then error("core.check_player_privs expects a player or playername as " .. "argument.", 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 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 missing_privileges[#missing_privileges + 1] = priv end end end if #missing_privileges > 0 then return false, missing_privileges end return true, "" end function core.send_join_message(player_name) if not core.is_singleplayer() then core.chat_send_all("*** " .. S("@1 joined the game.", player_name)) end end function core.send_leave_message(player_name, timed_out) local announcement = "*** " .. S("@1 left the game.", player_name) if timed_out then announcement = "*** " .. S("@1 left the game (timed out).", player_name) end core.chat_send_all(announcement) end core.register_on_joinplayer(function(player) local player_name = player:get_player_name() if not core.is_singleplayer() then local status = core.get_server_status(player_name, true) if status and status ~= "" then core.chat_send_player(player_name, status) end end core.send_join_message(player_name) end) core.register_on_leaveplayer(function(player, timed_out) local player_name = player:get_player_name() core.send_leave_message(player_name, timed_out) end) function core.is_player(player) -- a table being a player is also supported because it quacks sufficiently -- like a player if it has the is_player function local t = type(player) return (t == "userdata" or t == "table") and type(player.is_player) == "function" and player:is_player() end function core.player_exists(name) return core.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:get_pos() 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 function core.get_position_from_hash(hash) local x = (hash % 65536) - 32768 hash = math.floor(hash / 65536) local y = (hash % 65536) - 32768 hash = math.floor(hash / 65536) local z = (hash % 65536) - 32768 return vector.new(x, y, z) end function core.get_item_group(name, group) if not core.registered_items[name] or not core.registered_items[name].groups[group] then return 0 end return core.registered_items[name].groups[group] end function core.get_node_group(name, group) core.log("deprecated", "Deprecated usage of get_node_group, use get_item_group instead") return core.get_item_group(name, group) end function core.setting_get_pos(name) local value = core.settings:get(name) if not value then return nil end return core.string_to_pos(value) end -- See l_env.cpp for the other functions function core.get_artificial_light(param1) return math.floor(param1 / 16) end -- To be overriden by protection mods function core.is_protected(pos, name) return false end function core.record_protection_violation(pos, name) for _, func in pairs(core.registered_on_protection_violation) do func(pos, name) end end -- To be overridden by Creative mods local creative_mode_cache = core.settings:get_bool("creative_mode") function core.is_creative_enabled(name) return creative_mode_cache end -- Checks if specified volume intersects a protected volume function core.is_area_protected(minp, maxp, player_name, interval) -- 'interval' is the largest allowed interval for the 3D lattice of checks. -- Compute the optimal float step 'd' for each axis so that all corners and -- borders are checked. 'd' will be smaller or equal to 'interval'. -- Subtracting 1e-4 ensures that the max co-ordinate will be reached by the -- for loop (which might otherwise not be the case due to rounding errors). -- De/* Minetest Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef S_SERVER_H_ #define S_SERVER_H_ #include "cpp_api/s_base.h" #include <set> class ScriptApiServer : virtual public ScriptApiBase { public: // Calls on_chat_message handlers // Returns true if script handled message bool on_chat_message(const std::string &name, const st