summaryrefslogtreecommitdiff
path: root/unified_inventory_page.lua
blob: f2f1aca71048fe0a54ae964a5e372c23ed04303e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
local S
if minetest.get_modpath("intllib") then
	S = intllib.Getter()
else
	S = function(s) return s end
end

local dropdown_values = {}
local skins_reftab = {}
local skins_reftab_byskin = {}

unified_inventory.register_page("skins", {
	get_formspec = function(player)
		local name = player:get_player_name()
		local skin = skins.get_player_skin(player)
		local formspec = ("background[0.06,0.99;7.92,7.52;ui_misc_form.png]"
			.."image[0,.75;1,2;"..skins.preview[skin].."]"
			.."label[6,.5;"..S("Raw texture")..":]"
			.."image[6,1;2,1;"..skins.textures[skin].."]")

		local meta = skins.meta[skin]
		if meta then
			if meta.name ~= "" then
				formspec = formspec.."label[2,.5;"..S("Name")..": "..minetest.formspec_escape(meta.name).."]"
			end
			if meta.author ~= "" then
				formspec = formspec.."label[2,1;"..S("Author")..": "..minetest.formspec_escape(meta.author).."]"
			end
			if meta.license ~= "" then
				formspec = formspec.."label[2,1.5;"..S("License")..": "..minetest.formspec_escape(meta.license).."]"
			end
			if meta.description ~= "" then --what's that??
				formspec = formspec.."label[2,2;"..S("Description")..": "..minetest.formspec_escape(meta.description).."]"
			end
		end
		local page = 1
		if skins_reftab_byskin[skin] then
			page = skins_reftab_byskin[skin].page
		end
		formspec = formspec .. "button[.75,3;6.5,.5;skins_page$"..page..";"..S("Change").."]"
		return {formspec=formspec}
	end,
})

unified_inventory.register_button("skins", {
	type = "image",
	image = "skins_button.png",
})

-- Create all of the skin-picker pages.
skins.generate_pages = function()
	local total_pages = 1

	for i, skin in ipairs(skins.list) do
		local page = math.floor((i-1) / 16)+1
		local index_p = (i-1)%16+1

		skins_reftab[i] = { index = i, page = page, index_p = index_p, skin = skin }
		skins_reftab_byskin[skin] = skins_reftab[i]
		total_pages = page
	end

	for page=1, total_pages do
		local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]"
		for i = (page-1)*16+1, page*16 do
			if not skins_reftab[i] then
				break
			end
			local index_p = skins_reftab[i].index_p
			local x = (index_p-1) % 8
			local y
			if index_p > 8 then
				y = 1.8
			else
				y = -0.1
			end
			formspec = (formspec.."image_button["..x..","..y..";1,2;"..
				skins.preview[skins_reftab[i].skin]..";skins_set$"..i..";]"..
				"tooltip[skins_set$"..i..";"..minetest.formspec_escape(skins.meta[skins_reftab[i].skin].name).."]")
		end
		local page_prev = page - 1
		local page_next = page + 1
		if page_prev < 1 then
			page_prev = total_pages
		end
		if page_next > total_pages then
			page_next = 1
		end
		local page_list = ""
		dropdown_values = {}
		for pg=1, total_pages do
			local pagename = S("Page").." "..pg.."/"..total_pages
			dropdown_values[pagename] = pg
			if pg > 1 then page_list = page_list.."," end
			page_list = page_list..pagename
		end
		formspec = (formspec
			.."button[0,3.8;1,.5;skins_page$"..page_prev..";<<]"
			.."dropdown[1,3.68;6.5,.5;skins_selpg;"..page_list..";"..page.."]"
			.."button[7,3.8;1,.5;skins_page$"..page_next..";>>]")
		unified_inventory.register_page("skins_page$"..(page), {
			get_formspec = function(player)
				return {formspec=formspec}
			end
		})
	end
end

-- click button handlers
minetest.register_on_player_receive_fields(function(player, formname, fields)
	if fields.skins then
		unified_inventory.set_inventory_formspec(player, "craft")
		return
	end
	for field, _ in pairs(fields) do
		local current = string.split(field, "$", 2)
		if current[1] == "skins_set" then
			skins.set_player_skin(player, skins_reftab[tonumber(current[2])].skin)
			unified_inventory.set_inventory_formspec(player, "skins")
			return
		elseif current[1] == "skins_page" then
			unified_inventory.set_inventory_formspec(player, "skins_page$"..current[2])
			return
		end
	end
	if fields.skins_selpg then
		local page = dropdown_values[fields.skins_selpg]
		unified_inventory.set_inventory_formspec(player, "skins_page$"..(page))
		return
	end
end)

skins.generate_pages()