Add unified inventory support and chatcommand

master
rubenwardy 2019-12-10 19:49:19 +00:00
parent 2145aa1ebd
commit 1c2cabe795
3 changed files with 102 additions and 41 deletions

View File

@ -9,5 +9,6 @@ read_globals = {
"minetest",
"sfinv",
"vector",
"unified_inventory",
table={fields={"copy"}},
}

View File

@ -30,6 +30,8 @@ local function check_perm(player)
return minetest.check_player_privs(player:get_player_name(), { teacher = true })
end
local DASHBOARD_HEADER = "formspec_version[3]size[10.5,10.85]"
local function get_formspec(player, context)
if not check_perm(player) then
return "label[0,0;" .. FS"Access denied" .. "]"
@ -239,8 +241,7 @@ end
local function handle_results(player, context, fields)
if not check_perm(player) then
sfinv.set_page(player, sfinv.get_homepage_name(player))
return true
return false
end
if fields.students then
@ -248,7 +249,6 @@ local function handle_results(player, context, fields)
local i = (evt.row or 0) - 1
if evt.type == "CHG" and i >= 1 and i <= #context.students then
context.selected_student = context.students[i]
sfinv.set_player_inventory_formspec(player)
return true
end
end
@ -266,7 +266,6 @@ local function handle_results(player, context, fields)
i = i + 1
end
end
sfinv.set_player_inventory_formspec(player)
return true
end
@ -275,11 +274,9 @@ local function handle_results(player, context, fields)
return true
elseif fields.select_group then
context.select_toggle = "group"
sfinv.set_player_inventory_formspec(player)
return true
elseif fields.select_selected then
context.select_toggle = "selected"
sfinv.set_player_inventory_formspec(player)
return true
end
@ -287,22 +284,21 @@ local function handle_results(player, context, fields)
local student = minetest.get_player_by_name(context.selected_student)
if student then
player:set_pos(student:get_pos())
return true
return false
else
context.selected_student = nil
sfinv.set_player_inventory_formspec(player)
return true
end
end
if fields.new_group then
classroom.show_new_group(player)
return true
return false
end
if fields.edit_group and context.groupname then
classroom.show_edit_group(player, context.groupname)
return true
return false
end
for _, action in pairs(classroom.get_actions()) do
@ -319,7 +315,6 @@ local function handle_results(player, context, fields)
end
classroom.run_action(action.name, player, selector)
sfinv.set_player_inventory_formspec(player)
return true
end
end
@ -327,42 +322,107 @@ local function handle_results(player, context, fields)
end
--
-- Show formspec
--
local _contexts = {}
function classroom.show_dashboard_formspec(player)
if not check_perm(player) then
return nil
end
local name = player:get_player_name()
local context = _contexts[name] or {}
_contexts[name] = context
minetest.show_formspec(player:get_player_name(), "classroom:dashboard",
DASHBOARD_HEADER .. get_formspec(player, context))
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "classroom:dashboard" or not check_perm(player) then
return false
end
local context = _contexts[player:get_player_name()]
if not context then
return false
end
local ret = handle_results(player, context, fields)
if ret then
classroom.show_dashboard_formspec(player)
end
return ret
end)
--
-- Sfinv
--
if minetest.get_modpath("sfinv") then
sfinv.register_page("classroom:edu", {
title = S"Classroom",
is_in_nav = function(self, player, context)
return check_perm(player)
end,
get = function(self, player, context)
return sfinv.make_formspec(player, context, get_formspec(player, context),
false, DASHBOARD_HEADER)
end,
on_player_receive_fields = function(self, player, context, fields)
local ret = handle_results(player, context, fields)
if ret then
sfinv.set_player_inventory_formspec(player)
end
return ret
end,
})
sfinv.register_page("classroom:edu", {
title = S"Classroom",
is_in_nav = function(self, player, context)
return check_perm(player)
end,
get = function(self, player, context)
return sfinv.make_formspec(player, context, get_formspec(player, context),
false, "formspec_version[3]size[10.5,10.85]")
end,
on_player_receive_fields = function(self, player, context, fields)
local ret = handle_results(player, context, fields)
if ret then
sfinv.set_player_inventory_formspec(player)
local function on_grant_revoke(grantee, granter, priv)
if priv ~= "teacher" then
return
end
return ret
local player = minetest.get_player_by_name(grantee)
if not player then
return
end
minetest.after(0, function()
sfinv.set_player_inventory_formspec(player)
end)
end
minetest.register_on_priv_grant(on_grant_revoke)
minetest.register_on_priv_revoke(on_grant_revoke)
end
--
-- Chatcommand
--
minetest.register_chatcommand("classroom", {
privs = { teacher = true },
func = function(name, params)
local player = minetest.get_player_by_name(name)
if not player then
return false, "You must be online to open the GUI"
end
classroom.show_dashboard_formspec(player)
return true
end,
})
local function on_grant_revoke(grantee, granter, priv)
if priv ~= "teacher" then
return
end
local player = minetest.get_player_by_name(grantee)
if not player then
return
end
minetest.after(0, function()
sfinv.set_player_inventory_formspec(player)
end)
--
-- Unified Inventory
--
if minetest.get_modpath("unified_inventory") ~= nil then
unified_inventory.register_button("classroom", {
type = "image",
image = "classroom_icon.png",
tooltip = S("Classroom"),
action = classroom.show_dashboard_formspec,
})
end
minetest.register_on_priv_grant(on_grant_revoke)
minetest.register_on_priv_revoke(on_grant_revoke)

View File

@ -1,3 +1,3 @@
name = classroom
description = Classroom Manager
depends = sfinv
optional_depends = sfinv, unified_inventory