1 worldedit = worldedit or {}
6 worldedit.register_gui_function("worldedit_gui_hollow_cylinder", {
7 name = "Make Hollow Cylinder",
8 privs = {worldedit=true},
9 get_formspec = function(name) return "some formspec here" end,
10 on_select = function(name) print(name .. " clicked the button!") end,
13 Use `nil` for the `options` parameter to unregister the function associated with the given identifier.
15 Use `nil` for the `get_formspec` field to denote that the function does not have its own screen.
17 Use `nil` for the `privs` field to denote that no special privileges are required to use the function.
19 If the identifier is already registered to another function, it will be replaced by the new one.
21 The `on_select` function must not call `worldedit.show_page`
24 worldedit.pages = {} --mapping of identifiers to options
25 local identifiers = {} --ordered list of identifiers
26 worldedit.register_gui_function = function(identifier, options)
27 worldedit.pages[identifier] = options
28 table.insert(identifiers, identifier)
34 worldedit.register_gui_handler("worldedit_gui_hollow_cylinder", function(name, fields)
35 print(minetest.serialize(fields))
39 worldedit.register_gui_handler = function(identifier, handler)
40 minetest.register_on_player_receive_fields(function(player, formname, fields)
41 --ensure the form is not being exited since this is a duplicate message
46 local name = player:get_player_name()
48 --ensure the player has permission to perform the action
49 local entry = worldedit.pages[identifier]
50 if entry and minetest.check_player_privs(name, entry.privs or {}) then
51 return handler(name, fields)
57 worldedit.get_formspec_header = function(identifier)
58 local entry = worldedit.pages[identifier] or {}
59 return "button[0,0;2,0.5;worldedit_gui;Back]" ..
60 string.format("label[2,0;WorldEdit GUI > %s]", entry.name or "")
63 local get_formspec = function(name, identifier)
64 if worldedit.pages[identifier] then
65 return worldedit.pages[identifier].get_formspec(name)
67 return worldedit.pages["worldedit_gui"].get_formspec(name) --default to showing main page if an unknown page is given
70 --implement worldedit.show_page(name, page) in different ways depending on the available APIs
71 if unified_inventory then --unified inventory installed
72 local old_func = worldedit.register_gui_function
73 worldedit.register_gui_function = function(identifier, options)
74 old_func(identifier, options)
75 unified_inventory.register_page(identifier, {get_formspec=function(player) return {formspec=options.get_formspec(player:get_player_name())} end})
78 unified_inventory.register_button("worldedit_gui", {
80 image = "inventory_plus_worldedit_gui.png",
83 minetest.register_on_player_receive_fields(function(player, formname, fields)
84 local name = player:get_player_name()
85 if fields.worldedit_gui then --main page
86 worldedit.show_page(name, "worldedit_gui")
88 elseif fields.worldedit_gui_exit then --return to original page
89 local player = minetest.get_player_by_name(name)
91 unified_inventory.set_inventory_formspec(player, "craft")
98 worldedit.show_page = function(name, page)
99 local player = minetest.get_player_by_name(name)
101 player:set_inventory_formspec(get_formspec(name, page))
104 elseif inventory_plus then --inventory++ installed
105 minetest.register_on_joinplayer(function(player)
106 inventory_plus.register_button(player, "worldedit_gui", "WorldEdit")
109 --show the form when the button is pressed and hide it when done
110 local gui_player_formspecs = {}
111 minetest.register_on_player_receive_fields(function(player, formname, fields)
112 local name = player:get_player_name()
113 if fields.worldedit_gui then --main page
114 gui_player_formspecs[name] = player:get_inventory_formspec()
115 worldedit.show_page(name, "worldedit_gui")
117 elseif fields.worldedit_gui_exit then --return to original page
118 if gui_player_formspecs[name] then
119 inventory_plus.set_inventory_formspec(player, gui_player_formspecs[name])
126 worldedit.show_page = function(name, page)
127 local player = minetest.get_player_by_name(name)
129 inventory_plus.set_inventory_formspec(player, get_formspec(name, page))
132 else --fallback button
133 local player_formspecs = {}
135 local update_main_formspec = function(name)
136 local formspec = player_formspecs[name]
140 local player = minetest.get_player_by_name(name)
141 if not player then --this is in case the player signs off while the media is loading
144 if (minetest.check_player_privs(name, {creative=true}) or minetest.setting_getbool("creative_mode")) and creative_inventory then --creative_inventory is active, add button to modified formspec
145 formspec = player:get_inventory_formspec() .. "image_button[6,0;1,1;inventory_plus_worldedit_gui.png;worldedit_gui;]"
147 formspec = formspec .. "image_button[0,0;1,1;inventory_plus_worldedit_gui.png;worldedit_gui;]"
149 player:set_inventory_formspec(formspec)
152 minetest.register_on_joinplayer(function(player)
153 local name = player:get_player_name()
154 minetest.after(1, function()
155 if minetest.get_player_by_name(name) then --ensure the player is still signed in
156 player_formspecs[name] = player:get_inventory_formspec()
157 minetest.after(0.01, function()
158 update_main_formspec(name)
164 minetest.register_on_leaveplayer(function(player)
165 player_formspecs[player:get_player_name()] = nil
168 local gui_player_formspecs = {}
169 minetest.register_on_player_receive_fields(function(player, formname, fields)
170 local name = player:get_player_name()
171 if fields.worldedit_gui then --main page
172 gui_player_formspecs[name] = player:get_inventory_formspec()
173 worldedit.show_page(name, "worldedit_gui")
175 elseif fields.worldedit_gui_exit then --return to original page
176 if gui_player_formspecs[name] then
177 player:set_inventory_formspec(gui_player_formspecs[name])
180 else --deal with creative_inventory setting the formspec on every single message
181 minetest.after(0.01,function()
182 update_main_formspec(name)
184 return false --continue processing in creative inventory
188 worldedit.show_page = function(name, page)
189 local player = minetest.get_player_by_name(name)
191 player:set_inventory_formspec(get_formspec(name, page))
196 worldedit.register_gui_function("worldedit_gui", {
197 name = "WorldEdit GUI",
198 get_formspec = function(name)
199 --create a form with all the buttons arranged in a grid
200 local buttons, x, y, index = {}, 0, 1, 0
201 local width, height = 3, 0.8
203 for i, identifier in pairs(identifiers) do
204 if identifier ~= "worldedit_gui" then
205 local entry = worldedit.pages[identifier]
206 table.insert(buttons, string.format((entry.get_formspec and "button" or "button_exit") ..
207 "[%g,%g;%g,%g;%s;%s]", x, y, width, height, identifier, minetest.formspec_escape(entry.name)))
209 index, x = index + 1, x + width
210 if index == columns then --row is full
216 if index == 0 then --empty row
219 return string.format("size[%g,%g]", math.max(columns * width, 5), math.max(y + 0.5, 3)) ..
220 "button[0,0;2,0.5;worldedit_gui_exit;Back]" ..
221 "label[2,0;WorldEdit GUI]" ..
222 table.concat(buttons)
226 worldedit.register_gui_handler("worldedit_gui", function(name, fields)
227 for identifier, entry in pairs(worldedit.pages) do --check for WorldEdit GUI main formspec button selection
228 if fields[identifier] and identifier ~= "worldedit_gui" then
229 --ensure player has permission to perform action
230 local has_privs, missing_privs = minetest.check_player_privs(name, entry.privs or {})
231 if not has_privs then
232 worldedit.player_notify(name, "you are not allowed to use this function (missing privileges: " .. table.concat(missing_privs, ", ") .. ")")
235 if entry.on_select then
236 entry.on_select(name)
238 if entry.get_formspec then
239 worldedit.show_page(name, identifier)
247 dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/functionality.lua")