Aaron Suen 51b5aa8b94 Playerstep microoptimization
Avoid calling get_player_name too much
2021-03-01 18:58:34 -05:00

52 lines
1.3 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs
= minetest, nodecore, pairs
-- LUALOCALS > ---------------------------------------------------------
local function wieldsound(player, idx, gain)
if nodecore.player_visible(player) then
local n = player:get_inventory():get_stack("main", idx):get_name()
local def = minetest.registered_items[n]
if def and def.sounds then
local t = {}
for k, v in pairs(def.sounds.dig) do t[k] = v end
t.object = player
t.gain = gain or 1
if player:get_player_control().sneak then t.gain = t.gain / 4 end
return function() nodecore.sound_play(t.name, t) end
end
end
return function() end
end
local wields = {}
local pending = {}
nodecore.register_playerstep({
label = "wield sounds",
action = function(player, data, dtime)
local pname = data.pname
local pend = pending[pname]
if pend then
pend.t = pend.t - dtime
if pend.t <= 0 then
pend.f()
pending[pname] = nil
pend = nil
end
end
local idx = player:get_wield_index()
local old = wields[pname]
if idx ~= old then
wields[pname] = idx
if old and not pend then
wieldsound(player, old, 0.07)()
end
pending[pname] = {
t = 0.15,
f = wieldsound(player, idx, 0.15)
}
end
end
})