113 lines
3.5 KiB
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)
|