summaryrefslogtreecommitdiff
path: root/callbacks.lua
blob: 32a096ce3ab03c39ba48000f6f3c91eca0a21d2c (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
176
177
178
179
180
181

minetest.register_on_joinplayer(function(player)
	local player_name = player:get_player_name()
	unified_inventory.players[player_name] = {}
	unified_inventory.current_index[player_name] = 1
	unified_inventory.filtered_items_list[player_name] = unified_inventory.items_list
	unified_inventory.activefilter[player_name] = ""
	unified_inventory.apply_filter(player, "")
	unified_inventory.alternate[player_name] = 1
	unified_inventory.current_item[player_name] = nil
	unified_inventory.set_inventory_formspec(player, unified_inventory.default)
	
	-- Crafting guide inventories
	local inv = minetest.create_detached_inventory(player:get_player_name().."craftrecipe", {
		allow_put = function(inv, listname, index, stack, player)
			return 0
		end,
		allow_take = function(inv, listname, index, stack, player)
			if unified_inventory.is_creative(player:get_player_name()) then
				return stack:get_count()
			else
				return 0
			end
		end,
		allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
			return 0
		end,
	})
	inv:set_size("output", 1)
	inv:set_size("build", 3 * 3)

	-- Refill slot
	local refill = minetest.create_detached_inventory(player_name.."refill", {
		allow_put = function(inv, listname, index, stack, player)
			if unified_inventory.is_creative(player:get_player_name()) then
				return stack:get_count()
			else
				return 0
			end
		end,
		on_put = function(inv, listname, index, stack, player)
			stack:set_count(stack:get_stack_max())
			inv:set_stack(listname, index, stack)
			minetest.sound_play("electricity", {to_player=player_name, gain = 1.0})
		end,
	})
	refill:set_size("main", 1)
end)

minetest.register_on_player_receive_fields(function(player, formname, fields)
	local player_name = player:get_player_name()

	for i, def in pairs(unified_inventory.buttons) do
		if fields[def.name] then
			def.action(player)
			minetest.sound_play("click",
					{to_player=player_name, gain = 0.1})
			return
		end
	end
	
	-- Inventory page controls
	local start = math.floor(unified_inventory.current_index[player_name] / 80 + 1)
	local start_i = start
	local pagemax = math.floor((unified_inventory.filtered_items_list_size[player_name] - 1) / (80) + 1)
	
	if fields.start_list then
		minetest.sound_play("paperflip1",
				{to_player=player_name, gain = 1.0})
		start_i = 1
	end
	if fields.rewind1 then
		minetest.sound_play("paperflip1",
				{to_player=player_name, gain = 1.0})
		start_i = start_i - 1
	end
	if fields.forward1 then
		minetest.sound_play("paperflip1",
				{to_player=player_name, gain = 1.0})
		start_i = start_i + 1
	end
	if fields.rewind3 then
		minetest.sound_play("paperflip1",
				{to_player=player_name, gain = 1.0})
		start_i = start_i - 3
	end
	if fields.forward3 then
		minetest.sound_play("paperflip1",
				{to_player=player_name, gain = 1.0})
		start_i = start_i + 3
	end
	if fields.end_list then
		minetest.sound_play("paperflip1",
				{to_player=player_name, gain = 1.0})
		start_i = pagemax
	end
	if start_i < 1 then
		start_i = 1
	end
	if start_i > pagemax then
		start_i = pagemax
	end
	if not (start_i	== start) then
		unified_inventory.current_index[player_name] = (start_i - 1) * 80 + 1
		unified_inventory.set_inventory_formspec(player,
				unified_inventory.current_page[player_name])
	end

	-- Item list buttons
	local list_index = unified_inventory.current_index[player_name]
	local page = unified_inventory.current_page[player_name]
	for i = 0, 80 do
		local button = "item_button"..list_index
		if fields[button] then 
			minetest.sound_play("click",
					{to_player=player_name, gain = 0.1})
			if not unified_inventory.is_creative(player_name) then
				unified_inventory.set_inventory_formspec(player, "craftguide")
				page = "craftguide"
			end
			if page == "craftguide" then 
				unified_inventory.current_item[player_name] =
						unified_inventory.filtered_items_list
							[player_name][list_index] 
				unified_inventory.alternate[player_name] = 1
				unified_inventory.update_recipe(player,
						unified_inventory.filtered_items_list
							[player_name][list_index], 1)
				unified_inventory.set_inventory_formspec(player,
						unified_inventory.current_page[player_name])
			else
				if unified_inventory.is_creative(player_name) then
					local inv = player:get_inventory()
					dst_stack = {}
					dst_stack.name = unified_inventory.filtered_items_list
							[player_name][list_index] 
					dst_stack.count = 99
					if inv:room_for_item("main", dst_stack) then
						inv:add_item("main", dst_stack)
					end
				end
			end
		end
		list_index = list_index + 1
	end
	
	if fields.searchbutton then
		unified_inventory.apply_filter(player, fields.searchbox)
		unified_inventory.set_inventory_formspec(player,
				unified_inventory.current_page[player_name])
		minetest.sound_play("paperflip2",
				{to_player=player_name, gain = 1.0})
	end	
	
	-- alternate button
	if fields.alternate then
		minetest.sound_play("click",
				{to_player=player_name, gain = 0.1})
		local item_name = unified_inventory.current_item[player_name]
		if item_name then
			local alternates = 0
			local alternate = unified_inventory.alternate[player_name]
			local crafts = unified_inventory.crafts_table[item_name]
			if crafts ~= nil then
				alternates = #crafts
			end
			if alternates > 1 then
				alternate = alternate + 1
				if alternate > alternates then
					alternate = 1
				end
				unified_inventory.alternate[player_name] = alternate		
				unified_inventory.update_recipe(player,
						unified_inventory.current_item[player_name], alternate)
				unified_inventory.set_inventory_formspec(player,
						unified_inventory.current_page[player_name])
			end
		end
	end
end)