2022-01-04 22:23:51 +01:00

117 lines
3.0 KiB
Lua

-- Replace compatible default model
local multiskin_model_name = "multiskin_model.b3d"
if player_api.default_model == "character.b3d" then
player_api.default_model = multiskin_model_name
end
-- Register model with skin modifier
player_api.register_model(multiskin_model_name, {
animation_speed = 30,
textures = {
"blank.png", -- V1.0 Skin
"blank.png", -- V1.8 Skin
"blank.png", -- Armor
"blank.png" -- Wielded item
},
animations = {
stand = {x=0, y=79},
lay = {x=162, y=166},
walk = {x=168, y=187},
mine = {x=189, y=198},
walk_mine = {x=200, y=219},
sit = {x=81, y=160},
},
skin_modifier = function(model, textures, player)
local function concat_texture(base, ext)
if base == "blank.png" or base == "" or base == nil then
return ext
elseif ext == "blank.png" then
return base
else
return base .. "^" .. ext
end
end
if #textures < 4 then
-- fill up with blanks
for i = #textures, 4 do
table.insert(textures, "blank.png")
end
end
if textures.cape then
textures[1] = concat_texture(textures[1], textures.cape)
textures.cape = nil
end
if textures.clothing then
textures[2] = concat_texture(textures[2], textures.clothing)
textures.clothing = nil
end
if textures.armor then
textures[3] = concat_texture(textures[3], textures.armor)
textures.armor = nil
end
if textures.wielditem then
textures[4] = textures.wielditem or textures[4]
textures.wielditem = nil
end
end,
})
-- Compatibility skin modifier for 1.8 skins
player_api.register_skin_modifier(function(textures, player, player_model, player_skin)
if player_model ~= "multiskin_model.b3d" then
return
end
if player_api.registered_skins[player_skin].format == '1.8' then
table.insert(textures, 1, "blank.png")
end
end)
-- Check Skin format (code stohlen from stu's multiskin)
multiskin_model = {}
function multiskin_model.get_skin_format(file)
file:seek("set", 1)
if file:read(3) == "PNG" then
file:seek("set", 16)
local ws = file:read(4)
local hs = file:read(4)
local w = ws:sub(3, 3):byte() * 256 + ws:sub(4, 4):byte()
local h = hs:sub(3, 3):byte() * 256 + hs:sub(4, 4):byte()
if w >= 64 then
if w == h then
return "1.8"
elseif w == h * 2 then
return "1.0"
end
end
end
end
-- Change default model and determine the skin type
local function add_multiskin(name, skin)
if skin.model_name == "character.b3d" then -- compatible replacement
skin.model_name = multiskin_model_name
end
if skin.filename and not skin.format then
local file = io.open(skin.filename, "r")
skin.format = multiskin_model.get_skin_format(file)
file:close()
end
end
-- override player_api.register_skin for next registered skins
local old_register_skin = player_api.register_skin
function player_api.register_skin(name, skin)
old_register_skin(name, skin)
add_multiskin(name, skin)
end
-- process already registered skins
for name, skin in pairs(player_api.registered_skins) do
add_multiskin(name, skin)
end
player_api.read_textures_and_meta()