Browse Source

Add minetest.is_player (#7013)

* Add minetest.is_player

* First use for is_player
you 6 years ago
parent
commit
87e08b1b3a
2 changed files with 16 additions and 7 deletions
  1. 13 5
      builtin/game/misc.lua
  2. 3 2
      doc/lua_api.txt

+ 13 - 5
builtin/game/misc.lua

@@ -5,12 +5,11 @@
 --
 
 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...
+	if core.is_player(name) then
 		name = name:get_player_name()
-	elseif arg_type ~= "string" then
-		error("Invalid core.check_player_privs argument type: " .. arg_type, 2)
+	elseif type(name) ~= "string" then
+		error("core.check_player_privs expects a player or playername as " ..
+			"argument.", 2)
 	end
 
 	local requested_privs = {...}
@@ -85,6 +84,15 @@ function core.get_connected_players()
 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 minetest.player_exists(name)
 	return minetest.get_auth_handler().get_auth(name) ~= nil
 end

+ 3 - 2
doc/lua_api.txt

@@ -2753,9 +2753,9 @@ and `minetest.auth_reload` call the authentication handler.
     * Set node on all positions set in the first argument.
     * e.g. `minetest.bulk_set_node({{x=0, y=1, z=1}, {x=1, y=2, z=2}}, {name="default:stone"})`
     * For node specification or position syntax see `minetest.set_node` call
-    * Faster than set_node due to single call, but still considerably slower than 
+    * Faster than set_node due to single call, but still considerably slower than
       Voxel Manipulators (LVM) for large numbers of nodes.
-      Unlike LVMs, this will call node callbacks. It also allows setting nodes in spread out 
+      Unlike LVMs, this will call node callbacks. It also allows setting nodes in spread out
       positions which would cause LVMs to waste memory.
       For setting a cube, this is 1.3x faster than set_node whereas LVM is 20x faster.
 * `minetest.swap_node(pos, node)`
@@ -3329,6 +3329,7 @@ These functions return the leftover itemstack.
 
 ### Misc.
 * `minetest.get_connected_players()`: returns list of `ObjectRefs`
+* `minetest.is_player(o)`: boolean, whether `o` is a player
 * `minetest.player_exists(name)`: boolean, whether player exists (regardless of online status)
 * `minetest.hud_replace_builtin(name, hud_definition)`
     * Replaces definition of a builtin hud element