yl_speak_up.input_fs_manage_variables = function(player, formname, fields) local pname = player:get_player_name() if(fields and fields.back_from_msg) then yl_speak_up.show_fs(player, "manage_variables", fields.stored_value_for_player) return end -- leave this formspec if(fields and (fields.quit or fields.exit or fields.back)) then local last_fs = yl_speak_up.speak_to[pname][ "working_at" ] yl_speak_up.show_fs(player, last_fs) return -- add a new variable? elseif(fields and fields.add_variable) then local error_msg = "" if(not(fields.add_variable_name) or fields.add_variable_name == "" or fields.add_variable_name:trim() == "") then error_msg = "Please enter the name of your variable!" -- limit names to something more sensible elseif(string.len(fields.add_variable_name) > 30) then error_msg = "The name of your variable name is too long.\n".. "Only up to 30 characters are allowed." elseif(string.len(fields.add_variable_name:trim()) < 2) then error_msg = "The name of your variable name is too short.\n".. "It has to be at least 2 characters long." else fields.add_variable_name = fields.add_variable_name:trim() local res = yl_speak_up.add_quest_variable(pname, fields.add_variable_name) -- not really an error msg here - but fascilitates output error_msg = "A new variable named\n \"".. minetest.formspec_escape(fields.add_variable_name).. "\"\nhas been created." if(not(res)) then error_msg = "Failed to create variable named\n \"".. minetest.formspec_escape(fields.add_variable_name).."\"." else -- slect this new variable local var_list = yl_speak_up.get_quest_variables(pname, true) -- make names of own variables shorter yl_speak_up.strip_pname_from_varlist(var_list, pname) table.sort(var_list) local index = table.indexof(var_list, fields.add_variable_name) if(index and index > -1) then yl_speak_up.speak_to[pname].tmp_index_variable = index + 1 end end end yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = "size[6,2]".. "label[0.2,0.0;"..error_msg.."]".. "button[1.5,1.5;2,0.9;back_from_msg;Back]"}) return -- show where this variable is used elseif(fields and fields.show_var_usage and fields.show_var_usage ~= "") then yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = yl_speak_up.fs_get_list_of_usage_of_variable( fields.list_var_names, pname, true, "back_from_msg", "Back to manage variables", -- not an internal variable false) }) return end -- which variable is currently selected? local var_list = yl_speak_up.get_quest_variables(pname, true) -- make names of own variables shorter yl_speak_up.strip_pname_from_varlist(var_list, pname) table.sort(var_list) -- a var name was selected in the dropdown list if(fields and fields.list_var_names and fields.list_var_names ~= "") then local index = table.indexof(var_list, fields.list_var_names) if(fields.list_var_names == "Add variable:") then index = 0 end if(index and index > -1) then yl_speak_up.speak_to[pname].tmp_index_variable = index + 1 end end local var_name = var_list[ yl_speak_up.speak_to[pname].tmp_index_variable - 1] if(not(var_name)) then var_name = "" end -- show all stored values for a variable in a table if(fields and fields.show_stored_values_for_var and var_name) then yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = yl_speak_up.fs_show_all_var_values(player, pname, var_name) }) return -- enable, disable and list variables in debug mode elseif(fields and fields.enable_debug_mode and var_name) then yl_speak_up.set_variable_metadata(var_name, pname, "debug", pname, true) yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = "size[10,2]".. "label[0.2,0.0;Activating debug mode for variable \"".. minetest.colorize("#FFFF00", minetest.formspec_escape(tostring(var_name))).. "\".\nYou will now receive a chat message whenever the ".. "variable changes.]".. "button[1.5,1.5;2,0.9;back_from_msg;Back]"}) return elseif(fields and fields.disable_debug_mode and var_name) then yl_speak_up.set_variable_metadata(var_name, pname, "debug", pname, nil) yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = "size[10,2]".. "label[0.2,0.0;Deactivating debug mode for variable \"".. minetest.colorize("#FFFF00", minetest.formspec_escape(tostring(var_name))).. "\".\nYou will no longer receive a chat message whenever the ".. "variable changes.]".. "button[1.5,1.5;2,0.9;back_from_msg;Back]"}) return elseif(fields and fields.list_debug_mode) then yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = "size[10,6]".. "label[0.2,0.0;You are currently receiving debug information for the ".. "following variables:]".. "tablecolumns[text]".. "table[0.8,0.8;8.8,4.0;list_of_variables_in_debug_mode;".. -- the table entries will already be formspec_escaped table.concat(yl_speak_up.get_list_of_debugged_variables(pname), ",").."]".. "button[1.5,5.5;2,0.9;back_from_msg;Back]"}) return -- a player name was given; the value for that player shall be shown elseif(fields and fields.show_stored_value_for_player and var_name and fields.stored_value_for_player and fields.stored_value_for_player ~= "") then yl_speak_up.show_fs(player, "manage_variables", fields.stored_value_for_player) return -- change the value for a player (possibly to nil) elseif(fields and fields.store_new_value_for_player and var_name and fields.stored_value_for_player and fields.stored_value_for_player ~= "") then yl_speak_up.set_quest_variable_value(fields.stored_value_for_player, var_name, fields.current_value_for_player) yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = "size[10,2]".. "label[0.2,0.0;Set variable \"".. minetest.colorize("#FFFF00", minetest.formspec_escape(tostring(var_name))).. "\"\nfor player ".. minetest.formspec_escape(fields.stored_value_for_player).. "\nto new value ".. minetest.colorize("#FFFF00", fields.current_value_for_player)..".]".. "button[1.5,1.5;2,0.9;back_from_msg;Back]"}) return -- remove the value for a player (set to nil) elseif(fields and fields.unset_value_for_player and var_name and fields.stored_value_for_player and fields.stored_value_for_player ~= "") then yl_speak_up.set_quest_variable_value(fields.stored_value_for_player, var_name, nil) yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = "size[10,2]".. "label[0.2,0.0;Unset variable \"".. minetest.colorize("#FFFF00", minetest.formspec_escape(tostring(var_name))).. "\"\nfor player ".. minetest.formspec_escape(fields.stored_value_for_player).. ".]".. "button[1.5,1.5;2,0.9;back_from_msg;Back]"}) return -- delete (empty) variable elseif(fields and ((fields.delete_variable and fields.delete_variable ~= "") or (fields.delete_unused_variable and fields.delete_unused_variable ~= "")) and var_name) then local text = yl_speak_up.del_quest_variable(pname, var_name, nil) yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = "size[10,2]".. "label[0.2,0.0;Trying to delete variable \"".. minetest.formspec_escape(tostring(var_name)).. "\":\n"..text.."]".. "button[1.5,1.5;2,0.9;back_from_msg;Back]"}) return -- revoke read or write access to a variable elseif(fields and ((fields.revoke_player_var_read_access and fields.revoke_player_var_read_access ~= "") or (fields.revoke_player_var_write_access and fields.revoke_player_var_write_access ~= "")) and var_name) then local right = "read" if(fields.revoke_player_var_write_access and fields.revoke_player_var_write_access ~= "") then right = "write" end -- which player are we talking about? local selected = yl_speak_up.speak_to[pname]["tmp_index_var_"..right.."_access"] local pl_with_access = yl_speak_up.get_access_list_for_var(var_name, pname, right.."_access") local tmp_list = {} for k, v in pairs(pl_with_access) do table.insert(tmp_list, k) end table.sort(tmp_list) local grant_to = "" if(selected > 1) then grant_to = tmp_list[ selected-1 ] end local error_msg = "" local pl_with_access = yl_speak_up.get_access_list_for_var(var_name, pname, right.."_access") if(not(grant_to) or grant_to == "") then error_msg = "For which player do you want to revoke "..right.." access?" elseif(pname ~= yl_speak_up.npc_owner[ n_id ] and not(minetest.check_player_privs(pname, {npc_talk_master=true}))) then error_msg = "Only the owner of the NPC or players with\n".. "the npc_talk_master priv can change this." elseif(not(pl_with_access[ grant_to ])) then error_msg = minetest.formspec_escape(grant_to).." doesn't have "..right.. " access\nto this variable. Nothing changed." -- try to revoke access elseif(not(yl_speak_up.manage_access_to_quest_variable(var_name, pname, grant_to, right.."_access", nil))) then error_msg = "An internal error occoured." else -- not really an error message here...rather a success message error_msg = "Revoked "..right.." access to variable\n\"".. minetest.formspec_escape(var_name).. "\"\nfor player "..minetest.formspec_escape(grant_to)..".\n".. "Note: This will *not* affect existing preconditions/effects!" end yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = "size[6,2]".. "label[0.2,0.0;"..error_msg.."]".. "button[1.5,1.5;2,0.9;back_from_msg;Back]"}) return -- grant read or write access to a variable elseif(fields and ((fields.grant_player_var_read_access and fields.grant_player_var_read_access ~= "") or (fields.grant_player_var_write_access and fields.grant_player_var_write_access ~= "")) and var_name) then local right = "read" if(fields.grant_player_var_write_access and fields.grant_player_var_write_access ~= "") then right = "write" end local grant_to = fields[ "grant_player_var_"..right.."_access"] local error_msg = "" local pl_with_access = yl_speak_up.get_access_list_for_var(var_name, pname, right.."_access") if(pname ~= yl_speak_up.npc_owner[ n_id ] and not(minetest.check_player_privs(pname, {npc_talk_master=true}))) then error_msg = "Only the owner of the NPC or players with\n".. "the npc_talk_master priv can change this." elseif(grant_to == pname) then error_msg = "You already have "..right.." access to this variable." elseif(pl_with_access[ grant_to ]) then error_msg = minetest.formspec_escape(grant_to).." already has "..right.. " access\nto this variable." elseif(not(minetest.check_player_privs(grant_to, {interact=true}))) then error_msg = "Player \""..minetest.formspec_escape(grant_to).."\" not found." -- try to grant access elseif(not(yl_speak_up.manage_access_to_quest_variable(var_name, pname, grant_to, right.."_access", true))) then error_msg = "An internal error occoured." else -- not really an error message here...rather a success message error_msg = "Granted "..right.." access to variable\n\"".. minetest.formspec_escape(var_name).. "\"\nto player "..minetest.formspec_escape(grant_to).."." end yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:manage_variables", formspec = "size[6,2]".. "label[0.2,0.0;"..error_msg.."]".. "button[1.5,1.5;2,0.9;back_from_msg;Back]"}) return -- the player clicked on a name in the list of players with read or write access elseif(fields and ((fields.list_var_read_access and fields.list_var_read_access ~= "") or (fields.list_var_write_access and fields.list_var_write_access ~= "")) and var_name) then local right = "read" if(fields.list_var_write_access and fields.list_var_write_access ~= "") then right = "write" end local selected = fields[ "list_var_"..right.."_access"] local pl_with_access = yl_speak_up.get_access_list_for_var(var_name, pname, right.."_access") local tmp_list = {} for k, v in pairs(pl_with_access) do table.insert(tmp_list, k) end table.sort(tmp_list) local index = table.indexof(tmp_list, selected) if(selected == "Add player:") then index = 0 end if(index and index > -1) then yl_speak_up.speak_to[pname]["tmp_index_var_"..right.."_access"] = index + 1 end yl_speak_up.show_fs(player, "manage_variables") return -- a var name was selected in the dropdown list elseif(fields and fields.list_var_names and fields.list_var_names ~= "") then -- show the same formspec again, with a diffrent variable selected yl_speak_up.show_fs(player, "manage_variables") return end -- try to go back to the last formspec shown before this one if(not(yl_speak_up.speak_to[pname])) then return end local last_fs = yl_speak_up.speak_to[pname][ "working_at" ] yl_speak_up.show_fs(player, last_fs) end yl_speak_up.get_fs_manage_variables = function(player, param) local pname = player:get_player_name() -- variables owned by the player - including those with write access local var_list = yl_speak_up.get_quest_variables(pname, true) -- make names of own variables shorter yl_speak_up.strip_pname_from_varlist(var_list, pname) -- the yl_speak_up.create_dropdown_playerlist function needs a table - not a list local table_of_vars = {} for i, k in ipairs(var_list) do table_of_vars[ k ] = true end -- "Add variable:" is currently selected local additional_buttons = "" if(not(yl_speak_up.speak_to[pname].tmp_index_variable) or yl_speak_up.speak_to[pname].tmp_index_variable == 1 or not(var_list[ yl_speak_up.speak_to[pname].tmp_index_variable - 1])) then yl_speak_up.speak_to[pname].tmp_index_variable = 1 additional_buttons = "button[11.4,1.9;2.5,0.9;add_variable;Create variable]".. "tooltip[add_variable;Create a new varialbe with the name\n".. "you entered in the field to the left.]" else -- index 1 is "Add variable:" local k = var_list[ yl_speak_up.speak_to[pname].tmp_index_variable - 1] local pl_with_read_access = yl_speak_up.get_access_list_for_var(k, pname, "read_access") local pl_with_write_access = yl_speak_up.get_access_list_for_var(k, pname, "write_access") local add_read_button = "" local add_write_button = "" if(not(yl_speak_up.speak_to[pname].tmp_index_var_read_access) or yl_speak_up.speak_to[pname].tmp_index_var_read_access == 1) then yl_speak_up.speak_to[pname].tmp_index_var_read_access = 1 add_read_button = "button[12.9,2.9;1.0,0.9;add_read_access;Add]".. "tooltip[add_read_access;Grant the player whose name you entered\n".. "you entered in the field to the left read access\n".. "to your variable.]" end if(not(yl_speak_up.speak_to[pname].tmp_index_var_write_access) or yl_speak_up.speak_to[pname].tmp_index_var_write_access == 1) then yl_speak_up.speak_to[pname].tmp_index_var_write_access = 1 add_write_button = "button[12.9,3.9;1.0,0.9;add_write_access;Add]".. "tooltip[add_write_access;Grant the player whose name you entered\n".. "you entered in the field to the left *write* access\n".. "to your variable.]" end local list_of_npc_users = "- none -" local list_of_node_pos_users = "- none -" -- expand name of variable k again local k_long = yl_speak_up.add_pname_to_var(k, pname) -- which npc and which node_pos use this variable? create a list for display local c1 = 0 local c2 = 0 if(k_long and yl_speak_up.player_vars[ k_long ] and yl_speak_up.player_vars[ k_long ][ "$META$"]) then local npc_users = yl_speak_up.get_variable_metadata(k_long, "used_by_npc") c1 = #npc_users if(npc_users and c1 > 0) then list_of_npc_users = minetest.formspec_escape(table.concat(npc_users, ", ")) end local node_pos_users = yl_speak_up.get_variable_metadata(k_long, "used_by_node_pos") c2 = #node_pos_users if(node_pos_users and c2 > 0) then list_of_node_pos_users = minetest.formspec_escape(table.concat( node_pos_users, ", ")) end end local debug_button = "button[10.0,10.05;4.0,0.6;list_debug_mode;What am I debugging?]".. "tooltip[list_debug_mode;".. "Show for which variables you currently have ".. "\nactivated the debug mode.]" local debuggers = yl_speak_up.get_variable_metadata(k_long, "debug") local i = table.indexof(debuggers, pname) if(i and i > 0) then debug_button = "button[5.0,10.05;4.0,0.6;disable_debug_mode;Deactivate debug mode]".. "tooltip[disable_debug_mode;".. "You will no longer receive a chat message ".. "\nwhen this value changes for a player.]"..debug_button else debug_button = "button[5.0,10.05;4.0,0.6;enable_debug_mode;Activate debug mode]".. "tooltip[enable_debug_mode;".. "You will receive a chat message whenever the value ".. "\nof this variable changes for one player. The debug\n".. "messages will be sent even after relogin.]"..debug_button end -- checking/changing debug value for one specific player if(not(param)) then param = "" end debug_button = debug_button.. "label[0.2,8.05;Show stored value for player:]".. "field[4.2,8.15;4.0,0.9;stored_value_for_player;;".. minetest.formspec_escape(param).."]".. "button[8.2,7.85;4.0,0.9;show_stored_value_for_player;Show value for this player]".. "tooltip[stored_value_for_player;Enter the name of the player for which you\n".. "want to check (or change) the stored value.]".. "tooltip[show_stored_value_for_player;Click here to read and the current value".. "\nstored for this player.]" if(param and param ~= "") then local v = yl_speak_up.get_quest_variable_value(param, k_long) or "" debug_button = debug_button.. "label[0.2,9.05;Found stored value:]".. "field[4.2,9.15;4.0,0.9;current_value_for_player;;".. minetest.formspec_escape(v).."]".. "tooltip[current_value_for_player;You can see and change the current ".. "value here.]".. "button[8.2,8.85;4.0,0.9;store_new_value_for_player;".. "Store this as new value]".. "tooltip[store_new_value_for_player;".. "Click here to update the stored value for this player.".. "\nWARNING: Be very careful here and never do this without".. "\n informing the player about this change!]".. "button[12.5,8.85;3.0,0.9;unset_value_for_player;".. "Remove this entry]".. "tooltip[unset_value_for_player;Click here to delete the entry for this ".. "player.\nSetting the entry to an empty string would not be ".. "the same!]" end additional_buttons = "button[11.4,1.9;2.5,0.9;show_var_usage;Where is it used?]".. "tooltip[show_var_usage;Show which NPC use this variable in which context.]".. -- offer a dropdown list and a text input field for new varialbe names for adding "label[0.2,3.05;Players with read access to this variable:]".. yl_speak_up.create_dropdown_playerlist(player, pname, pl_with_read_access, yl_speak_up.speak_to[pname].tmp_index_var_read_access, 5.5, 2.9, 0.0, "list_var_read_access", "player", "Remove player from list", "grant_player_var_read_access", "Enter the name of the player that shall\n".. "have read access to this variable.", "revoke_player_var_read_access", "If you click here, the selected player\n".. "will no longer be able to add new\n".. "pre(C)onditions which read your variable." )..add_read_button.. "label[0.2,4.05;Players with *write* access to this variable:]".. yl_speak_up.create_dropdown_playerlist(player, pname, pl_with_write_access, yl_speak_up.speak_to[pname].tmp_index_var_write_access, 5.5, 3.9, 0.0, "list_var_write_access", "player", "Remove player from list", "grant_player_var_write_access", "Enter the name of the player that shall\n".. "have *write* access to this variable.", "revoke_player_var_write_access", "If you click here, the selected player\n".. "will no longer be able to *write* new\n".. "values into this variable." )..add_write_button.. "label[0.2,5.05;Type of variable: ".. -- show variable type minetest.colorize("#FFFF00", (yl_speak_up.get_variable_metadata(k_long, "var_type") or "String/text or numerical value, depending on how you use it")).. ".]".. "label[0.2,6.05;This variable is used by the following ".. minetest.colorize("#FFFF00", tostring(c1)).." NPC:\n\t".. -- those are only n_id - no need to formspec_escape that minetest.colorize("#FFFF00", list_of_npc_users)..".]".. "label[0.2,7.05;This variable is used by the following ".. minetest.colorize("#FFFF00", tostring(c2)).." node positions:\n\t".. -- those are only pos_to_string(..) - no need to formspec_escape that minetest.colorize("#FFFF00", list_of_node_pos_users)..".]".. "button[0.2,10.05;4.0,0.6;show_stored_values_for_var;Show all stored values]".. "tooltip[show_stored_values_for_var;A diffrent value can be stored for each ".. "player.\nShow these values in a table.]".. debug_button end return "size[16,11.5]".. "label[5.0,0.0;* Manage your variables *]".. "label[0.2,0.8;Note: Each variable will store a diffrent value for each player who ".. "interacts with the NPC.\n".. "You can grant read and write access to other players for your ".. "variables so that they can also use them as well.]".. "label[0.2,2.05;Your variables:]".. -- offer a dropdown list and a text input field for new varialbe names for adding yl_speak_up.create_dropdown_playerlist(player, pname, table_of_vars, yl_speak_up.speak_to[pname].tmp_index_variable, 2.2, 1.9, 1.0, "list_var_names", "variable", "Delete selected variable", "add_variable_name", "Enter the name of the new variable you\n".. "want to create.", "delete_variable", "If you click here, the selected variable\n".. "will be deleted." ).. additional_buttons.. "button[0.0,0.2;1.0,0.6;back;Back]".. "button[6.5,11.0;1.0,0.6;back;Back]" end