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
|
--wip: make back buttons images in all screens
--wip: support unified_inventory, it even seems to have some sort of API now
worldedit = worldedit or {}
--[[
Example:
worldedit.register_gui_function("worldedit_gui_hollow_cylinder", {
name = "Make Hollow Cylinder",
privs = {worldedit=true},
get_formspec = function(name) return "some formspec here" end,
on_select = function(name) print(name .. " clicked the button!") end,
})
Use `nil` for the `options` parameter to unregister the function associated with the given identifier.
Use `nil` for the `get_formspec` field to denote that the function does not have its own screen.
Use `nil` for the `privs` field to denote that no special privileges are required to use the function.
If the identifier is already registered to another function, it will be replaced by the new one.
]]
local pages = {} --mapping of identifiers to options
local identifiers = {} --ordered list of identifiers
worldedit.register_gui_function = function(identifier, options)
pages[identifier] = options
table.insert(identifiers, identifier)
end
local get_formspec = function(name, identifier)
if pages[identifier] then
return pages[identifier].get_formspec(name)
end
return pages["worldedit_gui"].get_formspec(name)
end
worldedit.show_page = function(name, page)
--wip
print("not implemented")
end
--add button to inventory_plus if it is installed
if inventory_plus then
minetest.register_on_joinplayer(function(player)
--ensure player has permission to perform action
if minetest.check_player_privs(player:get_player_name(), {worldedit=true}) then
inventory_plus.register_button(player, "worldedit_gui", "WorldEdit")
end
end)
--show the form when the button is pressed
minetest.register_on_player_receive_fields(function(player, formname, fields)
local name = player:get_player_name()
--ensure player has permission to perform action
if not minetest.check_player_privs(name, {worldedit=true}) then
return false
end
--check for showing of main GUI
local next_page = nil
if fields.worldedit_gui then --main page
worldedit.show_page(name, "worldedit_gui")
return true
end
return false
end)
worldedit.show_page = function(name, page)
inventory_plus.set_inventory_formspec(minetest.get_player_by_name(name), get_formspec(name, page))
end
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.quit then
return false
end
--check for WorldEdit GUI main formspec button selection
for identifier, entry in pairs(pages) do
if fields[identifier] then
local name = player:get_player_name()
--ensure player has permission to perform action
if entry.privs and not minetest.check_player_privs(name, entry.privs) then
return false
end
if entry.on_select then
entry.on_select(name)
end
if entry.get_formspec then
worldedit.show_page(name, identifier)
end
return true
end
end
return false
end)
worldedit.register_gui_function("worldedit_gui", {
name = "WorldEdit GUI",
get_formspec = function(name)
--create a form with all the buttons arranged in a grid
local buttons, x, y, index = {}, 0, 1, 0
local width, height = 3, 0.8
local columns = 5
for i, identifier in pairs(identifiers) do
if identifier ~= "worldedit_gui" then
local entry = pages[identifier]
table.insert(buttons, string.format((entry.get_formspec and "button" or "button_exit") ..
"[%g,%g;%g,%g;%s;%s]", x, y, width, height, identifier, minetest.formspec_escape(entry.name)))
index, x = index + 1, x + width
if index == columns then --row is full
x, y = 0, y + height
index = 0
end
end
end
return string.format("size[%g,%g]", columns * width, y + 0.5) ..
(inventory_plus and "button[0,0;2,0.5;main;Back]" or "button_exit[0,0;2,0.5;main;Exit]") ..
"label[2,0;WorldEdit GUI]" ..
table.concat(buttons)
end,
})
dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/functionality.lua")
|