diff --git a/fs_edit_general.lua b/fs_edit_general.lua index 34c6713..ea997b0 100644 --- a/fs_edit_general.lua +++ b/fs_edit_general.lua @@ -994,7 +994,11 @@ yl_speak_up.input_fs_edit_option_related = function(player, formname, fields, -- show var usuage - but this time from the edit dialog for that precondition or effect elseif(fields.show_var_usage_edit_element and x_id) then local dialog = yl_speak_up.speak_to[pname].dialog - local element = dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ][ x_id ] + local element = nil + -- x_id may be "new" and this may be the first element in element_list_name + if(dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ]) then + element = dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ][ x_id ] + end if(not(element) or data.variable_name) then element = {} element[ id_prefix.."variable"] = data.variable_name @@ -1019,16 +1023,12 @@ yl_speak_up.input_fs_edit_option_related = function(player, formname, fields, end -- allow to delete unused variables elseif(fields.delete_unused_variable) then - -- try to delete the variable - local res = yl_speak_up.del_quest_variable(pname, data.variable_name) - local text = "Deleted successfully." - if(not(res)) then - text = "Error: Variable could not be deleted." - end + -- try to delete the variable (button comes from the show usage of variable formspec) + local text = yl_speak_up.del_quest_variable(pname, data.variable_name, nil) yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:"..formspec_input_to, - formspec = "size[8,2]".. - "label[0.2,0.5;Trying to delete variable \"".. + formspec = "size[10,2]".. + "label[0.2,0.0;Trying to delete variable \"".. minetest.formspec_escape(tostring(data.variable_name)).. "\":\n"..text.."]".. "button[1.5,1.5;2,0.9;back_from_error_msg;Back]"}) diff --git a/quest_api.lua b/quest_api.lua index 8d92e2c..d5f6af2 100644 --- a/quest_api.lua +++ b/quest_api.lua @@ -73,16 +73,55 @@ end -- accidentally created or no longer needed variables need to be deleted somehow -yl_speak_up.del_quest_variable = function(owner_name, variable_name) - local k = yl_speak_up.restore_complete_var_name(variable_name, owner_name) +-- force_delete if set, the variable will be deleted no matter what; this is for +-- manual maintenance and not used in this mod +yl_speak_up.del_quest_variable = function(owner_name, variable_name, force_delete) if(not(owner_name) or not(variable_name)) then - return false + return " could not be deleted. Parameters mismatch." + end + local var_name = yl_speak_up.restore_complete_var_name(variable_name, owner_name) + if(not(var_name) or not(yl_speak_up.player_vars[ var_name ])) then + return text.." does not exist." + end + local text = "Variable \""..minetest.formspec_escape(var_name).."\"" + -- forcefully delete - even if the variable is still beeing used + if(force_delete) then + yl_speak_up.player_vars[ k ] = nil + yl_speak_up.save_quest_variables(true) + return text.." deleted by force." + end + -- check if the player really owns the variable: not that important because only unused + -- variables can be deleted; + -- check if the variable is used by an NPC + local var_data = yl_speak_up.player_vars[ var_name ] + if(var_data["$META$"] and var_data["$META$"]["used_by_npc" ] + and type(var_data["$META$"]["used_by_npc" ]) == "table") then + for k, v in pairs(var_data["$META$"]["used_by_npc" ]) do + if(k) then + return text.." could not be deleted.\nIt is used by at least one NPC." + end + end + end + -- check if the variable is used by a node position (for quests) + if(var_data["$META$"] and var_data["$META$"]["used_by_node_pos" ] + and type(var_data["$META$"]["used_by_node_pos" ]) == "table") then + for k, v in pairs(var_data["$META$"]["used_by_node_pos" ]) do + if(k) then + return text.." could not be deleted.\nIt is used by at least one node pos." + end + end + end + -- check if the variable has any values stored + for k, v in pairs(var_data) do + if(k and k ~= "$META$") then + return text.." could not be deleted.\nIt contains at least one stored value." + end end -- actually delete the variable - yl_speak_up.player_vars[ k ] = nil + yl_speak_up.player_vars[ var_name ] = nil -- a variable was deleted - that deserves a forced save yl_speak_up.save_quest_variables(true) - return true + return text.." deleted successfully." end @@ -256,8 +295,25 @@ yl_speak_up.input_fs_manage_variables = function(player, formname, fields) var_name = "" end - -- revoke read or write access to a variable + + -- delete (empty) variable if(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 @@ -372,7 +428,6 @@ yl_speak_up.input_fs_manage_variables = function(player, formname, fields) yl_speak_up.show_fs(player, "manage_variables") return - -- TODO: delete variable -- 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 @@ -402,7 +457,8 @@ yl_speak_up.get_fs_manage_variables = function(player, param) -- "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) then + 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".. @@ -785,7 +841,8 @@ yl_speak_up.get_npc_users_of_variable = function(var_name) if(not(var_name) or not(yl_speak_up.player_vars[ var_name ]) or not(yl_speak_up.player_vars[ var_name ][ "$META$"]) - or not(yl_speak_up.player_vars[ var_name ][ "$META$"][ "used_by_npc" ])) then + or not(yl_speak_up.player_vars[ var_name ][ "$META$"][ "used_by_npc" ]) + or type(yl_speak_up.player_vars[ var_name ][ "$META$"][ "used_by_npc" ]) ~= "table") then return {} end local npc_list = {} @@ -875,7 +932,6 @@ yl_speak_up.get_list_of_usage_of_variable = function(var_name, pname, check_prec minetest.colorize("#55FF55", tostring(count_changed).." (Ef)fects").. ".]") elseif(not(is_internal_var)) then - -- TODO: make delete_unused_variable work table.insert(formspec, "button[0.2,30.6;56.6,1.2;delete_unused_variable;".. minetest.formspec_escape("Delete this unused variable \""..