forked from VoxeLibre/VoxeLibre
115 lines
3.0 KiB
Lua
115 lines
3.0 KiB
Lua
local table = table
|
|
|
|
-- Player state for public API
|
|
mcl_playerinfo = {}
|
|
|
|
local function get_playerpart_pos(part, player_pos, collisionbox, eye_height)
|
|
--<part> can be "head", "head_top", "stand", "stand_below", "feet"
|
|
local part_pos = table.copy(player_pos)
|
|
if part == "head" then
|
|
part_pos.y = part_pos.y + eye_height
|
|
elseif part == "head_top" then
|
|
part_pos.y = part_pos.y + collisionbox[5]
|
|
elseif part == "stand" then
|
|
-- small amount below bottom of hitbox
|
|
part_pos.y = part_pos.y + collisionbox[2] - 0.05
|
|
elseif part == "stand_below" then
|
|
-- node below stood node
|
|
part_pos.y = part_pos.y + collisionbox[2] - 1.05
|
|
elseif part == "feet" then
|
|
-- small amount above bottom of hitbox
|
|
part_pos.y = part_pos.y + collisionbox[2] + 0.05
|
|
end
|
|
return part_pos
|
|
end
|
|
|
|
mcl_playerinfo.get_playerpart_pos = get_playerpart_pos
|
|
|
|
|
|
-- Get node but use fallback for nil or unknown
|
|
local function node_ok(pos, fallback)
|
|
fallback = fallback or {name="air", param2=0, param1=0}
|
|
local node = minetest.get_node_or_nil(pos)
|
|
|
|
if not node then
|
|
return fallback
|
|
end
|
|
|
|
if minetest.registered_nodes[node.name] then
|
|
return node
|
|
end
|
|
|
|
return fallback
|
|
end
|
|
|
|
local time = 0
|
|
|
|
local function get_player_nodes(player, infotable)
|
|
infotable.player_pos = player:get_pos()
|
|
infotable.collisionbox = player:get_properties().collisionbox
|
|
infotable.eye_height = player:get_properties().eye_height
|
|
|
|
local part_pos
|
|
|
|
part_pos = get_playerpart_pos("stand", infotable.player_pos, infotable.collisionbox, infotable.eye_height)
|
|
infotable.node_stand = node_ok(part_pos).name
|
|
|
|
part_pos = get_playerpart_pos("head", infotable.player_pos, infotable.collisionbox, infotable.eye_height)
|
|
infotable.node_head = node_ok(part_pos).name
|
|
|
|
part_pos = get_playerpart_pos("head_top", infotable.player_pos, infotable.collisionbox, infotable.eye_height)
|
|
infotable.node_head_top = node_ok(part_pos).name
|
|
|
|
part_pos = get_playerpart_pos("feet", infotable.player_pos, infotable.collisionbox, infotable.eye_height)
|
|
infotable.node_feet = node_ok(part_pos).name
|
|
|
|
part_pos = get_playerpart_pos("stand_below", infotable.player_pos, infotable.collisionbox, infotable.eye_height)
|
|
infotable.node_stand_below = node_ok(part_pos).name
|
|
|
|
return infotable
|
|
end
|
|
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
|
|
time = time + dtime
|
|
|
|
-- Run the rest of the code every 0.5 seconds
|
|
if time < 0.5 then
|
|
return
|
|
end
|
|
|
|
-- reset time for next check
|
|
-- FIXME: Make sure a regular check interval applies
|
|
time = 0
|
|
|
|
-- get cbox, eye height, pos and relevant nodes around each player
|
|
for _,player in pairs(minetest.get_connected_players()) do
|
|
|
|
local name = player:get_player_name()
|
|
get_player_nodes(player, mcl_playerinfo[name])
|
|
end
|
|
|
|
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)
|