summaryrefslogtreecommitdiff
path: root/technic_chests/register.lua
blob: 797c65292432b99f34e707dec4971cd94266a09a (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175

local chest_mark_colors = {
	'Black',
	'Blue',
	'Brown',
	'Cyan',
	'Dark Green',
	'Dark Grey',
	'Green',
	'Grey',
	'Magenta',
	'Orange',
	'Pink',
	'Red',
	'Violet',
	'White',
	'Yellow',
}


local function colorid_to_postfix(id)
	return (chest_mark_colors[id] and "_"..chest_mark_colors[id] or ""):lower():gsub(" ", "_")
end


local function get_color_buttons()
	local buttons_string = ""
	for y = 0, 3 do
		for x = 0, 3 do
			local file_name = "technic_colorbutton"..(y * 4 + x)..".png"
			buttons_string = buttons_string.."image_button["
				..(8.1 + x * 0.7)..","..(6.1 + y * 0.7)
				..";0.8,0.8;"..file_name..";color_button"
				..(y * 4 + x + 1)..";]"
		end
	end
	return buttons_string
end


local function check_color_buttons(pos, meta, chest_name, fields)
	for i = 1, 16 do
		if fields["color_button"..i] then
			technic.swap_node(pos, chest_name..colorid_to_postfix(i))
			meta:set_string("color", chest_mark_colors[i])
			return
		end
	end
end


local function get_receive_fields(name, data)
	if not data.infotext and not data.color then
		return nil
	end
	local lname = name:lower()
	return function(pos, formname, fields, sender)
		local meta = minetest.get_meta(pos)
		local node = minetest.get_node(pos)
		local page = "main"
		if fields.edit_infotext then
			page = "edit_infotext"
		end
		if fields.save_infotext then
			meta:set_string("infotext", fields.infotext_box)
		end
		local formspec = data.formspec
		local formspec_infotext = minetest.formspec_escape(meta:get_string("infotext"))
		if page == "main" and data.infotext then
			formspec = formspec.."image_button[2.1,0.1;0.8,0.8;"
					.."technic_pencil_icon.png;edit_infotext;]"
					.."label[3,0;"..formspec_infotext.."]"
		end
		if page == "edit_infotext" then
			formspec = formspec.."image_button[2.1,0.1;0.8,0.8;"
					.."technic_checkmark_icon.png;save_infotext;]"
					.."field[3.3,0.2;4.8,1;"
					.."infotext_box;Edit chest description:;"
					..formspec_infotext.."]"
		end
		if data.color then
			-- This sets the node
			local nn = "technic:"..lname..(data.locked and "_locked" or "").."_chest"
			check_color_buttons(pos, meta, nn, fields)
			local color = meta:get_string("color")
			formspec = formspec.."label[8.2,9;Color Filter: "..color.."]"
		end
		meta:set_string("formspec", formspec)
	end
end


function technic.chests:register(name, data)
	local lname = name:lower()

	local width = math.max(data.color and 11 or 8, data.width)

	local locked_after_place = nil
	local front = {"technic_"..lname.."_chest_front.png"}
	data.formspec = "invsize["..width..",10;]"..
			"label[0,0;"..name.." Chest]"..
			"list[current_name;main;0,1;"..width..",4;]"..
			"list[current_player;main;0,6;8,4;]"..
			"background[-0.19,-0.25;"..width..".4,10.75;ui_form_bg.png]"..
			"background[0,1;"..width..",4;technic_"..lname.."_chest_inventory.png]"..
			"background[0,6;8,4;ui_main_inventory.png]"
	if data.color then
		data.formspec = data.formspec..get_color_buttons()
	end

	if data.locked then
		locked_after_place = function(pos, placer)
			local meta = minetest.get_meta(pos)
			meta:set_string("owner", placer:get_player_name() or "")
			meta:set_string("infotext", name.." Locked Chest (owned by "..
					meta:get_string("owner")..")")
		end
		table.insert(front, "technic_"..lname.."_chest_lock_overlay.png")
	end

	local def = {
		description = name..(data.locked and " Locked" or "").." Chest",
		tiles = {"technic_"..lname.."_chest_top.png", "technic_"..lname.."_chest_top.png",
			"technic_"..lname.."_chest_side.png", "technic_"..lname.."_chest_side.png",
			"technic_"..lname.."_chest_side.png", table.concat(front, "^")},
		paramtype2 = "facedir",
		groups = self.groups,
		tube = self.tube,
		legacy_facedir_simple = true,
		sounds = default.node_sound_wood_defaults(),
		after_place_node = locked_after_place,
		on_construct = function(pos)
			local meta = minetest.get_meta(pos)
			meta:set_string("formspec", data.formspec
				..(data.color and "label[8.2,9;Color Filter: None" or "")
				..(data.infotext and "image_button[2.1,0.1;0.8,0.8;"
					.."technic_pencil_icon.png;edit_infotext;]" or ""))
			meta:set_string("infotext", name.." Chest")
			local inv = meta:get_inventory()
			inv:set_size("main", data.width * 4)
		end,
		can_dig = self.can_dig,
		on_receive_fields = get_receive_fields(name, data),
		on_metadata_inventory_move = self.on_inv_move,
		on_metadata_inventory_put = self.on_inv_put,
		on_metadata_inventory_take = self.on_inv_take,
	}
	if data.locked then
		def.allow_metadata_inventory_move = self.inv_move
		def.allow_metadata_inventory_put = self.inv_put
		def.allow_metadata_inventory_take = self.inv_take
	end

	local nn = "technic:"..lname..(data.locked and "_locked" or "").."_chest"

	minetest.register_node(":"..nn, def)

	if data.color then
		front[3] = front[2]
		for i = 1, 15 do
			local postfix = colorid_to_postfix(i)
			local colordef = {}
			for k, v in pairs(def) do
				colordef[k] = v
			end
			colordef.drop = nn
			colordef.groups = self.groups_noinv
			front[2] = "technic_chest_overlay"..postfix..".png"
			colordef.tiles[6] = table.concat(front, "^")
			minetest.register_node(":"..nn..postfix, colordef)
		end
	end

end