117 lines
3.0 KiB
Lua
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()
|