summaryrefslogtreecommitdiff
path: root/api.lua
blob: 18bc875017d59d48a4703b70ec57d8d17ed90c48 (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

-- Create detached creative inventory after loading all mods
minetest.after(0.01, function()
	local rev_aliases = {}
	for source, target in pairs(minetest.registered_aliases) do
		if not rev_aliases[target] then rev_aliases[target] = {} end
		table.insert(rev_aliases[target], source)
	end
	unified_inventory.items_list = {}
	for name, def in pairs(minetest.registered_items) do
		if (not def.groups.not_in_creative_inventory or
		   def.groups.not_in_creative_inventory == 0) and
		   def.description and def.description ~= "" then
			table.insert(unified_inventory.items_list, name)
			local all_names = rev_aliases[name] or {}
			table.insert(all_names, name)
			for _, name in ipairs(all_names) do
				local recipes = minetest.get_all_craft_recipes(name)
				if recipes then
					for _, recipe in ipairs(recipes) do
						unified_inventory.register_craft(recipe)
					end
				end
			end
		end
	end
	table.sort(unified_inventory.items_list)
	unified_inventory.items_list_size = #unified_inventory.items_list
	print("Unified Inventory. inventory size: "..unified_inventory.items_list_size)
	for _, name in ipairs(unified_inventory.items_list) do
		local def = minetest.registered_items[name]
		if type(def.drop) == "string" then
			local dstack = ItemStack(def.drop)
			if not dstack:is_empty() and dstack:get_name() ~= name then
				unified_inventory.register_craft({
					type = "digging",
					items = {name},
					output = def.drop,
					width = 0,
				})

			end
		end
	end
end)


-- load_home
local function load_home()
	local input = io.open(unified_inventory.home_filename, "r")
	if input then
		while true do
			local x = input:read("*n")
			if x == nil then
				break
			end
			local y = input:read("*n")
			local z = input:read("*n")
			local name = input:read("*l")
			unified_inventory.home_pos[name:sub(2)] = {x = x, y = y, z = z}
		end
		io.close(input)
	else
		unified_inventory.home_pos = {}
	end
end
load_home()

function unified_inventory.set_home(player, pos)
	local player_name = player:get_player_name()
	unified_inventory.home_pos[player_name] = pos
	-- save the home data from the table to the file
	local output = io.open(unified_inventory.home_filename, "w")
	for k, v in pairs(unified_inventory.home_pos) do
		if v ~= nil then
			output:write(math.floor(v.x).." "
					..math.floor(v.y).." "
					..math.floor(v.z).." "
					..k.."\n")
		end
	end
	io.close(output)
end

function unified_inventory.go_home(player)
	local pos = unified_inventory.home_pos[player:get_player_name()]
	if pos ~= nil then
		player:setpos(pos)
	end
end

-- register_craft
function unified_inventory.register_craft(options)
	if  options.output == nil then
		return
	end
	local itemstack = ItemStack(options.output)
	if itemstack:is_empty() then
		return
	end
	if options.type == "normal" and options.width == 0 then
		options = { type = "shapeless", items = options.items, output = options.output, width = 0 }
	end
	if unified_inventory.crafts_table[itemstack:get_name()] == nil then
		unified_inventory.crafts_table[itemstack:get_name()] = {}
	end
	table.insert(unified_inventory.crafts_table[itemstack:get_name()],options)
end

local craft_type_defaults = {
	width = 3,
	height = 3,
	uses_crafting_grid = false,
}
function unified_inventory.canonicalise_craft_type(name, options)
	if not options.description then options.description = name end
	setmetatable(options, {__index = craft_type_defaults})
	return options
end
function unified_inventory.register_craft_type(name, options)
	unified_inventory.registered_craft_types[name] = unified_inventory.canonicalise_craft_type(name, options)
end

unified_inventory.register_craft_type("normal", {
	description = "Crafting",
	width = 3,
	height = 3,
	uses_crafting_grid = true,
})

unified_inventory.register_craft_type("shapeless", {
	description = "Mixing",
	width = 3,
	height = 3,
	uses_crafting_grid = true,
})

unified_inventory.register_craft_type("cooking", {
	description = "Cooking",
	width = 1,
	height = 1,
})

unified_inventory.register_craft_type("digging", {
	description = "Digging",
	width = 1,
	height = 1,
})

function unified_inventory.register_page(name, def)
	unified_inventory.pages[name] = def
end

function unified_inventory.register_button(name, def)
	if not def.action then
		def.action = function(player)
			unified_inventory.set_inventory_formspec(player, name)
		end
	end
	def.name = name
	table.insert(unified_inventory.buttons, def)
end

function unified_inventory.is_creative(playername)
	if minetest.check_player_privs(playername, {creative=true}) or
	   minetest.setting_getbool("creative_mode") then
		return true
	end
end