VoxeLibre/mods/PLAYER/mcl_playerinfo/init.lua

121 lines
2.9 KiB
Lua

local table = table
local storage = minetest.get_mod_storage()
-- Player state for public API
mcl_playerinfo = {}
local player_mod_metadata = {}
-- Get node but use fallback for nil or unknown
local function node_ok(pos, fallback)
fallback = fallback or "air"
local node = minetest.get_node_or_nil(pos)
if not node then
return fallback
end
if minetest.registered_nodes[node.name] then
return node.name
end
return fallback
end
local function get_player_nodes(player_pos)
local work_pos = table.copy(player_pos)
-- what is around me?
work_pos.y = work_pos.y - 0.1 -- standing on
local node_stand = node_ok(work_pos)
local node_stand_below = node_ok({x=work_pos.x, y=work_pos.y-1, z=work_pos.z})
work_pos.y = work_pos.y + 1.5 -- head level
local node_head = node_ok(work_pos)
work_pos.y = work_pos.y + 0.5 -- top of head level, at collision box height
local node_head_top = node_ok(work_pos)
work_pos.y = work_pos.y - 0.5
work_pos.y = work_pos.y - 1.2 -- feet level
local node_feet = node_ok(work_pos)
return node_stand, node_stand_below, node_head, node_feet, node_head_top
end
local time = 0
minetest.register_globalstep(function(dtime)
-- Run the rest of the code every 0.5 seconds
time = time + dtime
if time < 0.5 then
return
end
-- reset time for next check
-- FIXME: Make sure a regular check interval applies
time = 0
-- check players
for _,player in pairs(minetest.get_connected_players()) do
-- who am I?
local name = player:get_player_name()
-- where am I?
local pos = player:get_pos()
-- what is around me?
local node_stand, node_stand_below, node_head, node_feet, node_head_top = get_player_nodes(pos)
mcl_playerinfo[name].node_stand = node_stand
mcl_playerinfo[name].node_stand_below = node_stand_below
mcl_playerinfo[name].node_head = node_head
mcl_playerinfo[name].node_feet = node_feet
mcl_playerinfo[name].node_head_top = node_head_top
end
end)
function mcl_playerinfo.get_mod_meta(player_name, modname)
-- Load the player's metadata
local meta = player_mod_metadata[player_name]
if not meta then
meta = minetest.deserialize(storage:get_string(player_name))
end
if not meta then
meta = {}
end
player_mod_metadata[player_name] = meta
-- Get the requested module's section of the metadata
local mod_meta = meta[modname] or {}
meta[modname] = mod_meta
return mod_meta
end
-- set to blank on join (for 3rd party mods)
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
mcl_playerinfo[name] = {
node_head = "",
node_feet = "",
node_stand = "",
node_stand_below = "",
node_head_top = "",
}
end)
-- clear when player leaves
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
mcl_playerinfo[name] = nil
end)
minetest.register_on_shutdown(function()
for name,data in pairs(player_mod_metadata) do
storage:set_string(name, minetest.serialize(data))
end
end)