2019-07-01 23:57:17 +02:00

112 lines
3.2 KiB
Lua

local has_armor = minetest.get_modpath("3d_armor")
local time = 0
local update_time = tonumber(minetest.settings:get("wieldview_update_time"))
if not update_time then
update_time = 2
minetest.settings:set("wieldview_update_time", tostring(update_time))
end
local wield_tiles = {}
local wield_cubes = {}
local wield_items = {}
local wield_cycle = {}
wieldview = {
transform = {},
}
dofile(minetest.get_modpath(minetest.get_current_modname()).."/transform.lua")
local function init_wield_items()
for name, def in pairs(minetest.registered_items) do
if def.inventory_image and def.inventory_image ~= "" then
wield_tiles[name] = def.inventory_image
elseif def.tiles and type(def.tiles[1]) == "string" and
def.tiles[1] ~= "" and def.drawtype and
(def.drawtype == "normal" or def.drawtype == "allfaces" or
def.drawtype == "glasslike" or def.drawtype == "liquid") then
wield_cubes[name] = def.tiles[1]
end
end
end
local function update_player_visuals(player, item)
local name = player:get_player_name()
local animation = player_api.get_animation(player) or {}
local textures = animation.textures or {}
local skin = textures[1] and textures[1] or "character.png"
local wield_tile = wield_tiles[item]
if wield_tile then
-- Get item image transformation, first from group, then from transform.lua
local transform = minetest.get_item_group(item, "wieldview_transform")
if transform == 0 then
transform = wieldview.transform[item]
end
if transform then
-- This actually works with groups ratings because transform1, transform2, etc.
-- have meaning and transform0 is used for identidy, so it can be ignored
wield_tile = wield_tile.."^[transform"..tostring(transform)
end
else
wield_tile = "blank.png"
end
local wield_cube = wield_cubes[item] or "blank.png"
if has_armor then
armor.textures[name].wielditem = wield_tile
armor.textures[name].cube = wield_cube
armor:update_player_visuals(player)
else
player_api.set_textures(player, {skin, "blank.png", wield_tile, wield_cube})
end
end
local function update_wielded_item(dtime, name)
wield_cycle[name] = wield_cycle[name] or 0
wield_cycle[name] = wield_cycle[name] + dtime
if wield_cycle[name] < update_time then
return
end
local player = minetest.get_player_by_name(name)
if not player or not player:is_player() then
return
end
local stack = player:get_wielded_item()
local item = stack:get_name()
if not item then
return
end
if wield_items[name] and wield_items[name] == item then
return
else
update_player_visuals(player, item)
end
wield_items[name] = item
wield_cycle[name] = 0
end
if not minetest.is_singleplayer() then
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
if name then
wield_items[name] = ""
wield_cycle[name] = 0
minetest.after(0, function()
update_wielded_item(0, name)
end)
end
end)
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
if name then
wield_items[name] = ""
wield_cycle[name] = 0
end
end)
minetest.register_playerstep(function(dtime, playernames)
for _, name in pairs(playernames) do
update_wielded_item(dtime, name)
end
end)
minetest.after(0, init_wield_items)
end