added limit for amount of option/answers per dialog
This commit is contained in:
		
							parent
							
								
									63653d4dbd
								
							
						
					
					
						commit
						5db7b9c909
					
				@ -18,4 +18,7 @@ yl_speak_up.text_new_result_id = "New result"
 | 
			
		||||
yl_speak_up.text_version_warning = "You are using an outdated Minetest version!\nI will have a hard time talking to you properly, but I will try my best.\nYou can help me by upgrading to at least 5.3.0!\nGet it at https://minetest.net/downloads"
 | 
			
		||||
yl_speak_up.infotext = "Rightclick to talk"
 | 
			
		||||
 | 
			
		||||
yl_speak_up.max_number_of_buttons = 7
 | 
			
		||||
-- how many buttons will be shown simultaneously without having to scroll?
 | 
			
		||||
yl_speak_up.max_number_of_buttons = 7
 | 
			
		||||
-- how many buttons can be added to one dialog?
 | 
			
		||||
yl_speak_up.max_number_of_options_per_dialog = 15
 | 
			
		||||
 | 
			
		||||
@ -1291,13 +1291,13 @@ local function get_fs_talkdialog(player, n_id, d_id)
 | 
			
		||||
        h = -0.8
 | 
			
		||||
 | 
			
		||||
	-- allow to delete entries that have no options later on
 | 
			
		||||
	local has_at_least_one_option = false
 | 
			
		||||
	local anz_options = 0
 | 
			
		||||
        -- Let#s sort the options by o_sort
 | 
			
		||||
        if active_dialog ~= nil and active_dialog.d_options ~= nil then
 | 
			
		||||
            local sorted_buttons = {}
 | 
			
		||||
            for _, ad_v in pairs(active_dialog.d_options) do
 | 
			
		||||
                sorted_buttons[tonumber(ad_v.o_sort)] = ad_v
 | 
			
		||||
		has_at_least_one_option = true
 | 
			
		||||
		anz_options = anz_options + 1
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            for _, sb_v in pairs(sorted_buttons) do
 | 
			
		||||
@ -1439,15 +1439,24 @@ local function get_fs_talkdialog(player, n_id, d_id)
 | 
			
		||||
	if(edit_mode) then
 | 
			
		||||
            -- chat option: "Add a new answer/option to this dialog."
 | 
			
		||||
            h = h + 1
 | 
			
		||||
            table.insert(formspec, "button[0.5," .. h .. ";53.8,0.9;add_option;]")
 | 
			
		||||
            table.insert(formspec, "tooltip[add_option;Adds a new option to this dialog. You can delete options via the option edit menu.]")
 | 
			
		||||
            table.insert(formspec, "label[0.7,"..(h+0.45)..";Add a new option/answer to this dialog. You can delete options via the option edit menu.]")
 | 
			
		||||
	    if(anz_options < yl_speak_up.max_number_of_options_per_dialog) then
 | 
			
		||||
                table.insert(formspec, "button[0.5," .. h .. ";53.8,0.9;add_option;]")
 | 
			
		||||
                table.insert(formspec, "tooltip[add_option;Adds a new option to this dialog. You can "..
 | 
			
		||||
			"delete options via the option edit menu.]")
 | 
			
		||||
                table.insert(formspec, "label[0.7,"..(h+0.45)..";Add a new option/answer to this dialog. "..
 | 
			
		||||
			"You can delete options via the option edit menu.]")
 | 
			
		||||
            -- the amount of allowed options/answers has been reached
 | 
			
		||||
            else
 | 
			
		||||
                table.insert(formspec, "box[0.5,"..h..";53.8,0.9;#BBBBBB]")
 | 
			
		||||
                table.insert(formspec, "label[0.7,"..(h+0.45)..";Maximum number of allowed answers/options "..
 | 
			
		||||
			"reached. No further options/answers can be added.]")
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
	    -- chat option: "Delete this dialog."
 | 
			
		||||
	    h = h + 1
 | 
			
		||||
	    if(active_dialog
 | 
			
		||||
		    and active_dialog.d_text == ""
 | 
			
		||||
		    and not(has_at_least_one_option)) then
 | 
			
		||||
		    and anz_options == 0) then
 | 
			
		||||
                table.insert(formspec, "button[0.5," .. h .. ";53.8,0.9;delete_this_empty_dialog;]")
 | 
			
		||||
                table.insert(formspec, "tooltip[delete_this_empty_dialog;Dialogs can only be deleted "..
 | 
			
		||||
			"when they are empty and have no more options/answers. This is the case here, "..
 | 
			
		||||
@ -2151,27 +2160,39 @@ yl_speak_up.edit_mode_apply_changes = function(pname, fields)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- add a new option/answer
 | 
			
		||||
	-- TODO: limit the amount of possible answers to a sensible amount
 | 
			
		||||
	if(fields[ "add_option"]) then
 | 
			
		||||
		-- count the options/answers so that the limit is not exceeded
 | 
			
		||||
		local anz_options = 0
 | 
			
		||||
		local future_o_id = "o_" .. find_next_id(dialog.n_dialogs[d_id].d_options)
 | 
			
		||||
		if dialog.n_dialogs[d_id].d_options == nil then
 | 
			
		||||
			dialog.n_dialogs[d_id].d_options = {}
 | 
			
		||||
		else
 | 
			
		||||
			local sorted_list = yl_speak_up.get_sorted_options(dialog.n_dialogs[d_id].d_options, "o_sort")
 | 
			
		||||
			anz_options = #sorted_list
 | 
			
		||||
		end
 | 
			
		||||
		-- we don't want an infinite amount of answers per dialog
 | 
			
		||||
		if(anz_options >= yl_speak_up.max_number_of_options_per_dialog) then
 | 
			
		||||
			minetest.chat_send_player(pname, "Sorry. Only "..
 | 
			
		||||
				tostring(yl_speak_up.max_number_of_options_per_dialog)..
 | 
			
		||||
				" options/answers are allowed per dialog.")
 | 
			
		||||
			fields.add_option = nil
 | 
			
		||||
		else
 | 
			
		||||
			dialog.n_dialogs[d_id].d_options[future_o_id] = {
 | 
			
		||||
				o_id = future_o_id,
 | 
			
		||||
				o_hide_when_prerequisites_not_met = "false",
 | 
			
		||||
				o_grey_when_prerequisites_not_met = "false",
 | 
			
		||||
				o_sort = -1,
 | 
			
		||||
				o_text_when_prerequisites_not_met = "",
 | 
			
		||||
				o_text_when_prerequisites_met = "",
 | 
			
		||||
				}
 | 
			
		||||
			-- necessary in order for it to work
 | 
			
		||||
			local s = sanitize_sort(dialog.n_dialogs[d_id].d_options, yl_speak_up.speak_to[pname].o_sort)
 | 
			
		||||
			dialog.n_dialogs[d_id].d_options[future_o_id].o_sort = s
 | 
			
		||||
			table.insert(yl_speak_up.npc_was_changed[ n_id ],
 | 
			
		||||
				"Dialog "..d_id..": Added new option/answer "..future_o_id..".")
 | 
			
		||||
			-- if this is selected in the options edit menu, we want to move straight on to the new option
 | 
			
		||||
			result["show_next_option"] = future_o_id
 | 
			
		||||
		end
 | 
			
		||||
		dialog.n_dialogs[d_id].d_options[future_o_id] = {
 | 
			
		||||
			o_id = future_o_id,
 | 
			
		||||
			o_hide_when_prerequisites_not_met = "false",
 | 
			
		||||
			o_grey_when_prerequisites_not_met = "false",
 | 
			
		||||
			o_sort = -1,
 | 
			
		||||
			o_text_when_prerequisites_not_met = "",
 | 
			
		||||
			o_text_when_prerequisites_met = "",
 | 
			
		||||
			}
 | 
			
		||||
		-- necessary in order for it to work
 | 
			
		||||
		local s = sanitize_sort(dialog.n_dialogs[d_id].d_options, yl_speak_up.speak_to[pname].o_sort)
 | 
			
		||||
		dialog.n_dialogs[d_id].d_options[future_o_id].o_sort = s
 | 
			
		||||
		table.insert(yl_speak_up.npc_was_changed[ n_id ],
 | 
			
		||||
			"Dialog "..d_id..": Added new option/answer "..future_o_id..".")
 | 
			
		||||
		-- if this is selected in the options edit menu, we want to move straight on to the new option
 | 
			
		||||
		result["show_next_option"] = future_o_id
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if(fields[ "del_option"] and fields.o_id and dialog.n_dialogs[d_id].d_options[fields.o_id]) then
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user