empty variables can now be deleted

This commit is contained in:
Sokomine 2021-07-31 19:01:09 +02:00
parent 144eb53719
commit 4f524f7fc1
2 changed files with 75 additions and 19 deletions

View File

@ -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]"})

View File

@ -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 \""..