Aaron Suen 1c914568c0 Fully API-ify player model.
Mods can now override all player visuals, including
animations, model, scale, etc.  Full functionality
via overriding API methods.  Simpler overrides for
skin and mesh by setting player meta attrs.
2020-01-20 21:25:56 -05:00

65 lines
1.7 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs, type
= minetest, nodecore, pairs, type
-- LUALOCALS > ---------------------------------------------------------
local cache = {}
local function eq(t, u)
if type(t) ~= "table" then return t == u end
if type(u) ~= "table" then return end
for k, v in pairs(t) do
if not eq(v, u[k]) then return end
end
return true
end
local function updatevisuals(player, joining)
local pname = player:get_player_name()
local cached = cache[pname]
if not cached then
cached = {}
cache[pname] = cached
end
local props = nodecore.player_visuals_base(player, joining)
-- Skin can be set preemptively by visuals_base; if so, then will
-- not be modified here.
if not props.textures then
-- Recheck skin only every couple seconds to avoid
-- interfering with animations if skin includes continuous
-- effects.
local now = minetest.get_us_time() / 1000000
if (not cached.skintime) or (now >= cached.skintime + 2) then
cached.skintime = now
local t = nodecore.player_skin(player)
props.textures = {t}
end
end
if not eq(props, cached.props) then
player:set_properties(props)
cached.props = props
end
local anim = nodecore.player_anim(player)
if not eq(anim, cached.anim) then
player:set_animation(anim, anim.speed)
cached.anim = anim
end
end
minetest.register_on_joinplayer(function(player)
cache[player:get_player_name()] = nil
updatevisuals(player, true)
end)
minetest.register_globalstep(function()
for _, player in pairs(minetest.get_connected_players()) do
if nodecore.player_visible(player) then
updatevisuals(player)
end
end
end)