1c914568c0
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.
65 lines
1.7 KiB
Lua
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)
|