2021-07-25 23:27:18 +02:00
-----------------------------------------------------------------------------
-- these functions are used/needed for staff based editing
-----------------------------------------------------------------------------
2021-07-25 23:28:17 +02:00
-- this was created by AliasAlreadyTaken and the original edit mechanism
2021-07-25 23:27:18 +02:00
local function options_to_dialog ( pname )
local dialog = yl_speak_up.speak_to [ pname ] . dialog
local n_id = yl_speak_up.speak_to [ pname ] . n_id
local d_id = yl_speak_up.speak_to [ pname ] . d_id
local o_id = yl_speak_up.speak_to [ pname ] . o_id
local p_id = yl_speak_up.speak_to [ pname ] . p_id
local r_id = yl_speak_up.speak_to [ pname ] . r_id
if yl_speak_up.speak_to [ pname ] . d_text then
dialog.n_dialogs [ d_id ] . d_text = yl_speak_up.speak_to [ pname ] . d_text
end
--Find the o_id to save to
local future_o_id = " "
if yl_speak_up.speak_to [ pname ] . o_id ~= nil and yl_speak_up.speak_to [ pname ] . o_id ~= yl_speak_up.text_new_option_id then
future_o_id = yl_speak_up.speak_to [ pname ] . o_id
else
future_o_id = " o_ " .. yl_speak_up.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 = { }
end
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] = { }
end
--Find the p_id to save to
local future_p_id = " "
if
yl_speak_up.speak_to [ pname ] . p_id ~= nil and
yl_speak_up.speak_to [ pname ] . p_id ~= yl_speak_up.text_new_prerequisite_id
then
future_p_id = yl_speak_up.speak_to [ pname ] . p_id
else
future_p_id = " p_ " .. yl_speak_up.find_next_id ( dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_prerequisites )
if future_p_id == " p_1 " then
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_prerequisites = { }
end
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_prerequisites [ future_p_id ] = { }
end
--Find the r_id to save to
local future_r_id = " "
if yl_speak_up.speak_to [ pname ] . r_id ~= nil and yl_speak_up.speak_to [ pname ] . r_id ~= yl_speak_up.text_new_result_id then
future_r_id = yl_speak_up.speak_to [ pname ] . r_id
else
future_r_id = yl_speak_up.add_new_result ( dialog , d_id , future_o_id )
end
--Edit options
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_id = future_o_id
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_hide_when_prerequisites_not_met =
yl_speak_up.speak_to [ pname ] . o_hide or " false "
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_grey_when_prerequisites_not_met =
yl_speak_up.speak_to [ pname ] . o_grey or " false "
local s = yl_speak_up.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
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_text_when_prerequisites_not_met =
yl_speak_up.speak_to [ pname ] . o_not_met or " "
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_text_when_prerequisites_met =
yl_speak_up.speak_to [ pname ] . o_met or " "
--Edit prerequisites
--Do we delete the prerequisite?
if
yl_speak_up.speak_to [ pname ] . p_type == " delete " and yl_speak_up.speak_to [ pname ] . p_id ~= nil and
yl_speak_up.speak_to [ pname ] . p_id ~= yl_speak_up.text_new_prerequisite_id
then
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_prerequisites [ future_p_id ] = nil
else
if yl_speak_up.speak_to [ pname ] . p_value ~= nil and yl_speak_up.speak_to [ pname ] . p_value ~= " " then
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_prerequisites [ future_p_id ] . p_id = future_p_id
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_prerequisites [ future_p_id ] . p_type =
yl_speak_up.speak_to [ pname ] . p_type
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_prerequisites [ future_p_id ] . p_value =
yl_speak_up.speak_to [ pname ] . p_value
end
end
--Do we delete the result?
if
yl_speak_up.speak_to [ pname ] . r_type == " delete " and yl_speak_up.speak_to [ pname ] . r_id ~= nil and
yl_speak_up.speak_to [ pname ] . r_id ~= yl_speak_up.text_new_result_id
then
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_results [ future_r_id ] = nil
else
if yl_speak_up.speak_to [ pname ] . r_value ~= nil and yl_speak_up.speak_to [ pname ] . r_value ~= " " then
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_results [ future_r_id ] . r_id = future_r_id
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_results [ future_r_id ] . r_type =
yl_speak_up.speak_to [ pname ] . r_type
dialog.n_dialogs [ d_id ] . d_options [ future_o_id ] . o_results [ future_r_id ] . r_value =
yl_speak_up.speak_to [ pname ] . r_value
end
end
return dialog
end
--###
-- Helpers
--###
local function get_prerequisite_types ( )
--local t_gpt = {"item", "quest", "function", "auto", "delete"}
local t_gpt = { " item " , " function " , " delete " }
local s_gpt = " "
for _ , v in pairs ( t_gpt ) do
s_gpt = s_gpt .. v .. " , "
end
s_gpt = s_gpt : sub ( 1 , - 2 ) -- cut last comma
return s_gpt , t_gpt
end
local function get_result_types ( )
--local t_grt = {"dialog", "give_item", "quest", "function", "auto", "delete"}
local t_grt = { " dialog " , " give_item " , " take_item " , " move " , " function " , " trade " , " delete " }
local s_grt = " "
for _ , v in pairs ( t_grt ) do
s_grt = s_grt .. v .. " , "
end
s_grt = s_grt : sub ( 1 , - 2 ) -- cut last comma
return s_grt , t_grt
end
local function delete_option ( n_id , d_id , o_id )
if d_id == yl_speak_up.text_new_dialog_id then
return false
end -- We don't delete "New dialog" Also, something might have gone wrong here.
if o_id == yl_speak_up.text_new_option_id then
return false
end -- We don't delete "New option"
2022-04-22 03:45:52 +02:00
local dialog = yl_speak_up.load_dialog ( n_id , false )
2021-07-25 23:27:18 +02:00
dialog.n_dialogs [ d_id ] . d_options [ o_id ] = nil
yl_speak_up.save_dialog ( n_id , dialog )
end
--###
--Formspecs
--###
-- get formspecs
-- dialog
yl_speak_up.get_fs_setdialog = function ( clicker , n_id , d_id )
2022-04-22 03:45:52 +02:00
local dialog = yl_speak_up.load_dialog ( n_id , false )
2021-07-25 23:27:18 +02:00
local items = yl_speak_up.text_new_dialog_id
local count = 1
local d_sort = " "
local text = " "
if next ( dialog ) == nil then -- file does not exist
dialog.n_id = n_id
dialog.n_npc = " "
dialog.n_description = " "
elseif dialog.n_dialogs == nil then -- file does exist, but no dialogs are set
dialog.n_id = n_id
text = " "
else -- file exists and there's already content
local n = 1
for k , v in pairs ( dialog.n_dialogs ) do
n = n + 1
if k == d_id then
count = n
d_sort = v.d_sort or " "
text = v.d_text or " "
end
items = items .. " , " .. v.d_id
end
text = minetest.formspec_escape ( text )
end
local formspec = {
" size[13.4,8.5] " ,
" label[0.2,0.35; " ,
dialog.n_id ,
" ] " ,
" field[1.3,0.1;3.7,0.5;n_npc;; " ,
dialog.n_npc ,
" ] " ,
" field[5.2,0.1;8,0.5;n_description;; " ,
dialog.n_description ,
" ] " ,
" dropdown[5.2,0.75;5,0.75;d_id; " ,
items ,
" ; " ,
count ,
" ] " ,
-- allow to change the owner of the npc
" label[0.2,1;Owner] " ,
" field[1.3,0.75;3.7,0.5;npc_owner;; " ,
( yl_speak_up.npc_owner [ n_id ] or " - nobody - " ) ,
" ] " ,
" label[10.9,1;Sort] " ,
" field[11.7,0.75;1.5,0.5;d_sort;; " ,
d_sort ,
" ] " ,
" textarea[0.2,1.6;13,6;d_text;; " ,
text ,
" ] " ,
" button_exit[0.2,7.7;3,0.75;button_cancel;Cancel] " ,
" button[4,7.7;3,0.75;button_delete;Delete] " ,
" button[7.1,7.7;3,0.75;button_option;Options] " ,
" button[10.2,7.7;3,0.75;button_save;Save] " ,
-- tooltips
" tooltip[npc_owner;npc_owner: The name of the owner of the NPC - who can edit dialogs of this NPC if he has the npc_talk_owner priv;#FFFFFF;#000000] " ,
" tooltip[n_npc;n_npc: The name of the NPC;#FFFFFF;#000000] " ,
" tooltip[n_description;n_description: A description for the NPC;#FFFFFF;#000000] " ,
" tooltip[d_sort;d_sort: Make this 0 on your dialog if you want it to be shown the first time a player talks to the NPC \n Negative values are ignored \n ;#FFFFFF;#000000] " ,
" tooltip[5.2,0.75;5,0.75;d_id: Dialog Id;#FFFFFF;#000000] " ,
" tooltip[d_text;d_text: Dialog text. What the NPC says to you;#FFFFFF;#000000] "
}
return table.concat ( formspec , " " )
end
-- options
yl_speak_up.get_fs_optiondialog = function ( player , n_id , d_id , o_id , p_id , r_id )
2022-04-22 03:45:52 +02:00
local dialog = yl_speak_up.load_dialog ( n_id , false )
2021-07-25 23:27:18 +02:00
local pname = player : get_player_name ( )
if next ( dialog ) == nil or d_id == yl_speak_up.text_new_dialog_id or dialog.n_dialogs == nil then -- file does not exist or the user sent the New dialog
return yl_speak_up.get_error_message ( n_id )
end
-- default values
local out = { }
-- npc
out.n_id = n_id
-- dialog
out.d_id = yl_speak_up.text_new_dialog_id
out.d_text = " Dialog Text "
-- option
out.o_id_items = yl_speak_up.text_new_option_id
out.o_id_count = 1
out.o_hide = " false "
out.o_grey = " false "
out.o_sort = " "
out.o_met = " Text when conditions are met "
out.o_not_met = " Text when conditions are not met "
-- prerequisite
out.p_id_items = yl_speak_up.text_new_prerequisite_id
out.p_id_count = 1
out.p_type_items , out.p_type_items_table = get_prerequisite_types ( )
out.p_type_count = 1
out.p_value = " "
-- result
out.r_id_items = yl_speak_up.text_new_result_id
out.r_id_count = 1
out.r_type_items = get_result_types ( )
out.r_type_count = 1
out.r_value = " "
--dialogs
for k , v in pairs ( dialog.n_dialogs ) do
if k == d_id then
out.d_id = v.d_id
out.d_text = minetest.formspec_escape ( v.d_text ) : trim ( )
end
end
--options
if dialog.n_dialogs [ d_id ] . d_options ~= nil then
local o_n = 1
for o_k , o_v in pairs ( dialog.n_dialogs [ d_id ] . d_options ) do
o_n = o_n + 1
if o_k == o_id then
out.o_id_count = o_n
end
out.o_id_items = out.o_id_items .. " , " .. o_v.o_id
end
if dialog.n_dialogs [ d_id ] . d_options [ o_id ] then
if dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_hide_when_prerequisites_not_met then
out.o_hide = dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_hide_when_prerequisites_not_met
end
if dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_grey_when_prerequisites_not_met then
out.o_grey = dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_grey_when_prerequisites_not_met
end
if dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_sort then
out.o_sort = dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_sort
end
if dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_text_when_prerequisites_met then
out.o_met =
minetest.formspec_escape ( dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_text_when_prerequisites_met ) : trim (
)
end
if dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_text_when_prerequisites_not_met then
out.o_not_met =
minetest.formspec_escape ( dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_text_when_prerequisites_not_met ) : trim (
)
end
-- prerequisite
--if dialog.n_dialogs[d_id].d_options[o_id].o_prerequisites ~= nil and p_id == yl_speak_up.text_new_prerequisite_id then -- new prerequisite
--end
if dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_prerequisites ~= nil then
local p_n = 1
for p_k , p_v in pairs ( dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_prerequisites ) do
p_n = p_n + 1
if p_k == p_id then
out.p_id_count = p_n
end
out.p_id_items = out.p_id_items .. " , " .. p_v.p_id
end
out.p_type_items , out.p_type_items_table = get_prerequisite_types ( )
if
dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_prerequisites [ p_id ] ~= nil and
dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_prerequisites [ p_id ] . p_type ~= nil
then
local p_type_n = 1
for _ , p_type_v in pairs ( out.p_type_items_table ) do
if p_type_v == dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_prerequisites [ p_id ] . p_type then
out.p_type_count = p_type_n
end
p_type_n = p_type_n + 1
end
out.p_value =
minetest.formspec_escape ( dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_prerequisites [ p_id ] . p_value ) : trim (
)
end
end
-- result
if dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_results ~= nil then
local r_n = 1
for r_k , r_v in pairs ( dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_results ) do
r_n = r_n + 1
if r_k == r_id then
out.r_id_count = r_n
end
out.r_id_items = out.r_id_items .. " , " .. r_v.r_id
end
out.r_type_items , out.r_type_items_table = get_result_types ( )
if
dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_results [ r_id ] ~= nil and
dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_results [ r_id ] . r_type ~= nil
then
local r_type_n = 1
for _ , r_type_v in pairs ( out.r_type_items_table ) do
if r_type_v == dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_results [ r_id ] . r_type then
out.r_type_count = r_type_n
end
r_type_n = r_type_n + 1
end
out.r_value =
minetest.formspec_escape ( dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_results [ r_id ] . r_value ) : trim ( )
end
end
end
end
local formspec = {
" size[13.4,8.5] " ,
-- npc
" field[-10,-10;4,0.5;n_id;; " ,
out.n_id ,
" ] " ,
-- dialog
" field[-10,-10;4,0.5;d_id;; " ,
out.d_id ,
" ] " ,
" label[0.2,0.35; " ,
out.d_id ,
" ] " ,
" field[1,0.1;12.2,0.5;d_text;; " ,
out.d_text ,
" ] " ,
-- option
" dropdown[0.2,0.75;2,0.75;o_id; " ,
out.o_id_items ,
" ; " ,
out.o_id_count ,
" ] " ,
" checkbox[0.2,1.85;o_hide;Hide; " ,
out.o_hide ,
" ] " ,
" checkbox[0.2,2.35;o_grey;Grey; " ,
out.o_grey ,
" ] " ,
" field[1.6,2.05;0.75,0.5;o_sort;Sort; " ,
out.o_sort ,
" ] " ,
" textarea[2.4,0.75;10.8,0.95;o_met;; " ,
out.o_met ,
" ] " ,
" textarea[2.4,1.75;10.8,0.95;o_not_met;; " ,
out.o_not_met ,
" ] " ,
-- prerequisite
" dropdown[0.2,2.8;3,0.75;p_id; " ,
out.p_id_items ,
" ; " ,
out.p_id_count ,
" ] " ,
" dropdown[0.2,3.8;3,0.75;p_type; " ,
out.p_type_items ,
" ; " ,
out.p_type_count ,
" ] " ,
" textarea[3.4,2.8;9.8,2.1;p_value;; " ,
out.p_value ,
" ] " ,
-- result
" dropdown[0.2,5;3,0.75;r_id; " ,
out.r_id_items ,
" ; " ,
out.r_id_count ,
" ] " ,
" dropdown[0.2,6;3,0.75;r_type; " ,
out.r_type_items ,
" ; " ,
out.r_type_count ,
" ] " ,
" textarea[3.4,5;9.8,2.1;r_value;; " ,
out.r_value ,
" ] " ,
-- buttons
" button[0.2,7.7;3,0.75;button_back;Back] " ,
" button[7.1,7.7;3,0.75;button_delete;Delete OPTION] " ,
" button[10.2,7.7;3,0.75;button_save;Save] " ,
-- tooltips
" tooltip[d_text;d_text: Dialog text. What the NPC says to you \n \n " ,
out.d_text ,
" ;#FFFFFF;#000000] " ,
" tooltip[0.2,0.75;2,0.75;o_id: Option Id;#FFFFFF;#000000] " ,
" tooltip[o_met;o_met: Option text when prerequisites are met \n (What you say to the NPC) \n \n " ,
out.o_met ,
" ;#FFFFFF;#000000] " ,
" tooltip[o_not_met;o_not_met: Option text when prerequisites are not met \n (What you say to the NPC instead) \n \n " ,
out.o_not_met ,
" ;#FFFFFF;#000000] " ,
" tooltip[o_hide;o_hide: If checked, this option is hidden when prerequistes are not met;#FFFFFF;#000000] " ,
" tooltip[o_grey;o_grey: If checked, this option is shown when prerequistes are not met, but grey and not selectable;#FFFFFF;#000000] " ,
" tooltip[o_sort;o_sort: The lower the number, the higher up in the list this option goes \n Negative values are ignored;#FFFFFF;#000000] " ,
" tooltip[0.2,2.8;3,0.75;p_id: Prerequisite Id;#FFFFFF;#000000] " ,
" tooltip[0.2,3.8;3,0.75;p_type: Defines what the p_value stands for. \n \n " ,
" item: requires the user to have this item in the inventory \n " ,
" quest: requires the user to have completed a quest with this id \n " ,
" function: executes the given LUA function which must return true or false. true = prerequisite met \n " ,
" auto: ??? \n " ,
" delete: Deletes the chosen prerequiste when the dialog is saved " ,
" ;#FFFFFF;#000000] " ,
" tooltip[p_value;p_value: This is evaluated to decide whether the prerequisites are met or not;#FFFFFF;#000000] " ,
" tooltip[0.2,5;3,0.75;r_id: Result Id;#FFFFFF;#000000] " ,
" tooltip[0.2,6;3,0.75;r_type: Defines what the r_value stands for. \n \n " ,
" dialog: forwards the user to the given dialog d_id \n " ,
" item: places this item in the inventory of the user \n " ,
" quest: starts a quest with this id for the user \n " ,
" function: executes the given LUA function \n " ,
" auto: automatically forwards the user to the given dialog d_id after a given time \n " ,
" delete: Deletes the chosen prerequiste when the dialog is saved " ,
" ;#FFFFFF;#000000] " ,
" tooltip[r_value;r_value: This is what happens when the user chooses this option;#FFFFFF;#000000] "
}
return table.concat ( formspec , " " )
end
-- receive fields
-- options
yl_speak_up.input_optiondialog = function ( player , formname , fields )
if formname ~= " yl_speak_up:optiondialog " then
return
end
if ( not ( minetest.check_player_privs ( player , { npc_master = true } ) ) ) then
return
end
local pname = player : get_player_name ( )
local n_id = yl_speak_up.speak_to [ pname ] . n_id
local d_id = yl_speak_up.speak_to [ pname ] . d_id
local dialog = yl_speak_up.speak_to [ pname ] . dialog
if fields then
-- Button Cancel: Exit the form
if fields.button_back or fields.quit then
local temp_dialog = yl_speak_up.speak_to [ pname ] . dialog
yl_speak_up.speak_to [ pname ] = { }
yl_speak_up.speak_to [ pname ] . dialog = temp_dialog
yl_speak_up.speak_to [ pname ] . n_id = n_id
yl_speak_up.speak_to [ pname ] . d_id = d_id
yl_speak_up.show_fs ( player , " setdialog " , { n_id = n_id , d_id = d_id } )
return
end
-- Button Delete Option: Delete option dialog, but do not exit
if fields.button_delete and fields.d_id and fields.o_id ~= yl_speak_up.text_new_option_id then
local temp_dialog = yl_speak_up.speak_to [ pname ] . dialog
yl_speak_up.speak_to [ pname ] = { }
yl_speak_up.speak_to [ pname ] . dialog = temp_dialog
yl_speak_up.speak_to [ pname ] . n_id = n_id
yl_speak_up.speak_to [ pname ] . d_id = d_id
yl_speak_up.speak_to [ pname ] . o_id = yl_speak_up.text_new_option_id
yl_speak_up.speak_to [ pname ] . p_id = yl_speak_up.text_new_prerequisite_id
yl_speak_up.speak_to [ pname ] . r_id = yl_speak_up.text_new_result_id
local o_id = yl_speak_up.text_new_option_id
local p_id = yl_speak_up.text_new_prerequisite_id
local r_id = yl_speak_up.text_new_result_id
delete_option ( fields.n_id , fields.d_id , fields.o_id )
yl_speak_up.log_change ( pname , n_id ,
" (staff) Deleted option " .. tostring ( fields.o_id ) .. " in dialog " .. tostring ( fields.d_id ) .. " . " )
yl_speak_up.show_fs ( player , " optiondialog " ,
{ n_id = n_id , d_id = d_id , o_id = o_id , p_id = p_id , r_id = r_id } )
return
end
if fields.d_text then
yl_speak_up.speak_to [ pname ] . d_text = fields.d_text
end
if fields.d_type then
yl_speak_up.speak_to [ pname ] . d_type = fields.d_type
end
-- When a new o_id is chosen, then all the other stuff is invalidated and we need to take values from the dialog or even default values
if fields.o_id ~= nil and fields.o_id ~= yl_speak_up.speak_to [ pname ] . o_id then
local o_id = fields.o_id
yl_speak_up.speak_to [ pname ] . o_id = o_id
yl_speak_up.speak_to [ pname ] . p_id = yl_speak_up.text_new_prerequisite_id
yl_speak_up.speak_to [ pname ] . r_id = yl_speak_up.text_new_result_id
-- Depends on the dialog
if o_id == yl_speak_up.text_new_option_id then --New dialog
yl_speak_up.speak_to [ pname ] . o_hide = " false "
yl_speak_up.speak_to [ pname ] . o_grey = " false "
yl_speak_up.speak_to [ pname ] . o_sort = " "
yl_speak_up.speak_to [ pname ] . o_met = " Text when conditions are not met "
yl_speak_up.speak_to [ pname ] . o_not_met = " Text when conditions are met "
else -- existing dialog
yl_speak_up.speak_to [ pname ] . o_hide =
dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_hide_when_prerequisites_not_met or " false "
yl_speak_up.speak_to [ pname ] . o_grey =
dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_grey_when_prerequisites_not_met or " false "
yl_speak_up.speak_to [ pname ] . o_sort = dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_sort or " "
yl_speak_up.speak_to [ pname ] . o_met =
dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_text_when_prerequisites_not_met or
" Text when conditions are not met "
yl_speak_up.speak_to [ pname ] . o_not_met =
dialog.n_dialogs [ d_id ] . d_options [ o_id ] . o_text_when_prerequisites_met or
" Text when conditions are met "
end
else
if fields.o_hide then
yl_speak_up.speak_to [ pname ] . o_hide = fields.o_hide
end
if fields.o_grey then
yl_speak_up.speak_to [ pname ] . o_grey = fields.o_grey
end
if fields.o_sort then
yl_speak_up.speak_to [ pname ] . o_sort = fields.o_sort
end
if fields.o_met then
yl_speak_up.speak_to [ pname ] . o_met = fields.o_met
end
if fields.o_not_met then
yl_speak_up.speak_to [ pname ] . o_not_met = fields.o_not_met
end
if fields.p_id ~= nil and fields.p_id ~= yl_speak_up.speak_to [ pname ] . p_id then
yl_speak_up.speak_to [ pname ] . p_id = fields.p_id
yl_speak_up.speak_to [ pname ] . p_value = fields.p_value
yl_speak_up.speak_to [ pname ] . p_type = fields.p_type
end
if fields.p_value then
yl_speak_up.speak_to [ pname ] . p_value = fields.p_value
end
if fields.p_type then
yl_speak_up.speak_to [ pname ] . p_type = fields.p_type
end
if fields.r_id ~= nil and fields.r_id ~= yl_speak_up.speak_to [ pname ] . r_id then
yl_speak_up.speak_to [ pname ] . r_id = fields.r_id
yl_speak_up.speak_to [ pname ] . r_value = fields.r_value
yl_speak_up.speak_to [ pname ] . r_type = fields.r_type
end
if fields.r_value then
yl_speak_up.speak_to [ pname ] . r_value = fields.r_value
end
if fields.r_type then
yl_speak_up.speak_to [ pname ] . r_type = fields.r_type
end
end
end
local o_id = fields.o_id or yl_speak_up.speak_to [ pname ] . o_id
local p_id = fields.p_id or yl_speak_up.speak_to [ pname ] . p_id
local r_id = fields.r_id or yl_speak_up.speak_to [ pname ] . r_id
-- Button Save
if fields and fields.button_save and fields.n_id and fields.d_id then
local temp_dialog = options_to_dialog ( pname )
yl_speak_up.save_dialog ( n_id , temp_dialog )
-- TODO: a better change detection would be good - because name, description and owner can change here
yl_speak_up.log_change ( pname , n_id ,
" (staff) Saved dialog " .. tostring ( fields.d_id ) .. " . " )
yl_speak_up.show_fs ( player , " optiondialog " ,
{ n_id = fields.n_id , d_id = fields.d_id , o_id = fields.o_id ,
p_id = fields.p_id , r_id = fields.r_id } )
end
yl_speak_up.show_fs ( player , " optiondialog " ,
{ n_id = n_id , d_id = d_id , o_id = o_id , p_id = p_id , r_id = r_id } )
end
-- dialog
yl_speak_up.input_setdialog = function ( player , formname , fields )
if formname ~= " yl_speak_up:setdialog " then
return
end
if ( not ( minetest.check_player_privs ( player , { npc_master = true } ) ) ) then
return
end
local pname = player : get_player_name ( )
local n_id = yl_speak_up.speak_to [ pname ] . n_id
local d_id = yl_speak_up.speak_to [ pname ] . d_id or yl_speak_up.text_new_dialog_id
-- Button Cancel: Exit the form
if fields.button_cancel or fields.quit then
yl_speak_up.speak_to [ pname ] = nil
minetest.close_formspec ( pname , " yl_speak_up:setdialog " )
return
end
-- Button Options with valid d_id: Show options formspec
if fields.button_option and fields.d_id and fields.d_id ~= yl_speak_up.text_new_dialog_id then
local o_id = yl_speak_up.text_new_option_id
local p_id = yl_speak_up.text_new_prerequisite_id
local r_id = yl_speak_up.text_new_result_id
-- Context
yl_speak_up.speak_to [ pname ] . d_id = fields.d_id
yl_speak_up.speak_to [ pname ] . o_id = o_id
yl_speak_up.speak_to [ pname ] . p_id = p_id
yl_speak_up.speak_to [ pname ] . r_id = r_id
yl_speak_up.show_fs ( player , " optiondialog " ,
{ n_id = n_id , d_id = fields.d_id , o_id = o_id , p_id = p_id , r_id = r_id } )
return
end
-- Button Options with invalid d_id: Show options formspec
if fields.button_option and fields.d_id and fields.d_id == yl_speak_up.text_new_dialog_id then
yl_speak_up.speak_to [ pname ] . d_id = yl_speak_up.text_new_dialog_id
yl_speak_up.show_fs ( player , " msg " , { input_to = " yl_speak_up:optiondialog " ,
formspec = yl_speak_up.get_error_message ( ) } )
return
end
-- Button Save: Save the settings, but do not exit
if fields.button_save and fields.d_id then
local dialog = yl_speak_up.fields_to_dialog ( pname , fields )
yl_speak_up.save_dialog ( n_id , dialog )
-- TODO: a better change detection would be great (name, description, owner can be changed as well)
yl_speak_up.log_change ( pname , n_id ,
" (staff) Saved dialog " .. tostring ( fields.d_id ) .. " . " )
yl_speak_up.speak_to [ pname ] . dialog = dialog
if yl_speak_up.speak_to [ pname ] . obj then
local obj = yl_speak_up.speak_to [ pname ] . obj
local ent = obj : get_luaentity ( )
if ent ~= nil then
ent.yl_speak_up . npc_name = dialog.n_npc
ent.yl_speak_up . npc_description = dialog.n_description
ent.owner = dialog.npc_owner
local i_text = dialog.n_npc .. " \n " .. dialog.n_description .. " \n " .. yl_speak_up.infotext
obj : set_properties ( { infotext = i_text } )
yl_speak_up.update_nametag ( ent )
end
end
yl_speak_up.show_fs ( player , " setdialog " , { n_id = n_id , d_id = d_id } )
return
end
-- Button Delete: Delete dialog, but do not exit
if fields.button_delete and fields.d_id then
yl_speak_up.delete_dialog ( n_id , fields.d_id )
yl_speak_up.speak_to [ pname ] . d_id = yl_speak_up.text_new_dialog_id
yl_speak_up.show_fs ( player , " setdialog " , { n_id = n_id , d_id = yl_speak_up.text_new_dialog_id } )
yl_speak_up.log_change ( pname , n_id ,
" (staff) Deleted dialog " .. tostring ( fields.d_id ) .. " . " )
end
-- Change in Dropdown List: Show dialog formspec again with different dialog selected
if fields.d_id then
yl_speak_up.speak_to [ pname ] . d_id = fields.d_id
yl_speak_up.show_fs ( player , " setdialog " , { n_id = n_id , d_id = fields.d_id } )
end
end
-- Make the NPC talk
function yl_speak_up . config ( clicker , npc )
if not clicker and not clicker : is_player ( ) then
return
end
if not npc then
return
end
local npc_id = npc : get_luaentity ( ) . yl_speak_up.id
local n_id = " n_ " .. npc_id
local pname = clicker : get_player_name ( )
yl_speak_up.speak_to [ pname ] = { }
yl_speak_up.speak_to [ pname ] . n_id = n_id -- Memorize which player talks to which NPC
yl_speak_up.speak_to [ pname ] . d_id = yl_speak_up.text_new_dialog_id -- The only d_id we can rely on existing
2022-04-22 03:45:52 +02:00
yl_speak_up.speak_to [ pname ] . dialog = yl_speak_up.load_dialog ( n_id , false ) -- Load the dialog and see what we can do with it
2021-07-25 23:27:18 +02:00
yl_speak_up.speak_to [ pname ] . obj = npc
-- find out who owns the npc while we still have easy access to the luaentity
yl_speak_up.npc_owner [ n_id ] = npc : get_luaentity ( ) . owner
yl_speak_up.show_fs ( clicker , " setdialog " , { n_id = n_id , d_id = yl_speak_up.text_new_dialog_id } )
end