minetest-mod-models/models/init.lua

113 lines
3.5 KiB
Lua

-- Models mod for minetest
-- Allows players to choose their player model in-game
-- License: WTFPL
-- Based on the skins mod by Zeg9 (WTFPL)
models = {}
models.models = {}
dofile(minetest.get_modpath("models").."/list.lua")
models.file = minetest.get_worldpath() .. "/playermodels.txt"
models.load = function()
local input = io.open(models.file, "r")
local data = nil
if input then
data = input:read('*all')
end
if data and data ~= "" then
lines = string.split(data,"\n")
for _, line in ipairs(lines) do
data = string.split(line, ' ', 2)
models.models[data[1]] = data[2]
end
io.close(input)
end
end
models.load()
print("[Models]: Loaded saved player model settings")
models.save = function()
local output = io.open(models.file,'w')
for name, skin in pairs(models.models) do
if name and skin then
output:write(name .. " " .. skin .. "\n")
end
end
io.close(output)
end
models.update_player_skin = function(player)
local name = player:get_player_name()
local modelname = models.models[name]
player:set_properties({
visual = "mesh",
mesh = models.list[modelname].mesh,
textures = models.list[modelname].textures,
visual_size = models.list[modelname].visual_size,
collisionbox = models.list[modelname].collisionbox
})
models.save()
end
models.formspec = {}
models.formspec.main = function(name)
page = models.pages[name]
if page == nil then page = 0 end
local formspec = "size[8,7.5]"
.. "button[0,0;2,.5;main;Back]"
.. "label[0,.5;Your current model:]"
.. "label[0,1.5;Choose a model below:]"
formspec = formspec .. "image[3,.5;2,1;"..models.list[models.models[name]].textures[1].."]"
local imodel = 0
local isprite = 0
local smodel = 0 -- Skip models, used for pages
local ssprite = 0 -- Skip sprites, used for pages
for modelname, modelprops in pairs(models.list) do
if smodel < page*8 then smodel = smodel + 1 else
if imodel < 8 then
formspec = formspec .. "image_button["..(imodel)..",2;1,2;"..modelprops.preview..";models_set_"..modelname..";]"
end
imodel = imodel +1
end
end
if page > 0 then
formspec = formspec .. "button[0,7;1,.5;models_page_"..(page-1)..";<<]"
end
formspec = formspec .. "label[3,6.5;Page "..page.."]"
if imodel > 8 or isprite > 8 then
formspec = formspec .. "button[7,7;1,.5;models_page_"..(page+1)..";>>]"
end
return formspec
end
models.pages = {}
minetest.register_on_joinplayer(function(player)
local p_name = player:get_player_name()
if not models.models[p_name] then
models.models[player:get_player_name()] = "character"
elseif models.models[p_name] ~= "character" then
--don't update model if the player is using the default
models.update_player_skin(player)
end
inventory_plus.register_button(player,"models","Player Model")
end)
minetest.register_on_player_receive_fields(function(player,formname,fields)
if fields.models then
inventory_plus.set_inventory_formspec(player,models.formspec.main(player:get_player_name()))
end
for field, _ in pairs(fields) do
if string.sub(field,0,string.len("models_set_")) == "models_set_" then
models.models[player:get_player_name()] = string.sub(field,string.len("models_set_")+1)
models.update_player_skin(player)
inventory_plus.set_inventory_formspec(player,models.formspec.main(player:get_player_name()))
end
if string.sub(field,0,string.len("models_page_")) == "models_page_" then
models.pages[player:get_player_name()] = tonumber(string.sub(field,string.len("models_page_")+1))
inventory_plus.set_inventory_formspec(player,models.formspec.main(player:get_player_name()))
end
end
end)