diff --git a/fs_edit_general.lua b/fs_edit_general.lua index 3a2b3f5..603d1f4 100644 --- a/fs_edit_general.lua +++ b/fs_edit_general.lua @@ -1076,11 +1076,12 @@ yl_speak_up.get_fs_edit_option_related = function(player, table_click_result, x_id = "new" end + local e = nil -- does the element exist already? if so: use the existing values as presets for data -- (so that the element can be edited) -- does kind of the opposite than the saving of values starting in line 323 of this file if(x_id ~= "new" and data.what == 1 and elements[ x_id ]) then - local e = elements[ x_id ] + e = elements[ x_id ] if( id_prefix == "r_" and e[ "r_type" ] == "dialog") then -- dialog effects cannot be edited this way return "size[9,2]".. @@ -1099,56 +1100,9 @@ yl_speak_up.get_fs_edit_option_related = function(player, table_click_result, data.what = table.indexof(values_what, e[ id_prefix.."type" ]) if(data.what == -1) then data.what = 1 - -- a state/variable (precondition + effect) - elseif(data.what == 2 and id_prefix ~= "a_") then - data.operator = math.max(1,table.indexof(values_operator, e[ id_prefix.."operator" ])) - data.var_cmp_value = e[ id_prefix.."var_cmp_value" ] - data.variable_name = e[ id_prefix.."variable" ] - local var_list = get_sorted_player_var_list_function(pname) - data.variable = math.max(1, table.indexof(var_list, e[ id_prefix.."variable"])+1) - -- a block (precondition + effect) - elseif(data.what == 3 and id_prefix ~= "a_") then - data.block = math.max(1,table.indexof(values_block, e[ id_prefix.."value" ])) - data.node_data = {} - data.node_data.data = e[ id_prefix.."node" ] - data.node_data.param2 = e[ id_prefix.."param2" ] - data.block_pos = {x=e[ id_prefix.."pos" ].x, - y=e[ id_prefix.."pos" ].y, - z=e[ id_prefix.."pos" ].z} - -- the block below was punched - if(id_prefix == "p_" and data.block == 5) then - data.block_pos.y = data.block_pos.y - 1 - end - -- a trade (precondition) - elseif(data.what == 4 and id_prefix == "p_") then - data.trade = math.max(1,table.indexof(values_trade, e[ "p_value" ])) - -- an invenetory (precondition) - elseif((data.what == 5 or data.what == 6) and id_prefix == "p_") then - data.inv = math.max(1,table.indexof(values_inv, e["p_value"])) - data.inv_stack_name = e[ "p_itemstack" ] - -- crafting (effect) - elseif(data.what and id_prefix == "r_" and data.what == 4) then - -- those items can at least be shown as background images - data.craftresult = e[ "r_value" ] - data.craft_grid = e[ "r_craft_grid"] - -- on failure (effect) - elseif(data.what and id_prefix == "r_" and data.what == 5) then - data.on_failure = e[ "r_value" ] - -- send a chat message (effect) - elseif(data.what and id_prefix == "r_" and data.what == 6) then - data.chat_msg_text = e[ "r_value" ] - -- normal trade (action) - elseif(data.what and id_prefix == "a_" and data.what == 3) then - data.trade_id = e[ "a_value" ] - -- use as background images - if(dialog and dialog.trades and dialog.trades[ data.trade_id ]) then - data.pay = dialog.trades[ data.trade_id ].pay[1] - data.buy = dialog.trades[ data.trade_id ].buy[1] - end - local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs) - data.action_failure_dialog = math.max(1, - table.indexof(sorted_dialog_list, e[ "a_on_failure" ])) + -- npc_gives/npc_wants (action) + -- (two seperate functions, but can be handled here together) elseif(data.what and id_prefix == "a_" and (data.what == 4 or data.what == 5)) then local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs) data.action_failure_dialog = math.max(1, @@ -1160,47 +1114,7 @@ yl_speak_up.get_fs_edit_option_related = function(player, table_click_result, local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs) data.action_failure_dialog = math.max(1, table.indexof(sorted_dialog_list, e[ "a_on_failure" ])) - -- entering password (action) - elseif(data.what and id_prefix == "a_" and data.what == 6) then - data.quest_question = e[ "a_question" ] - data.quest_answer = e[ "a_value" ] - local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs) - data.action_failure_dialog = math.max(1, - table.indexof(sorted_dialog_list, e[ "a_on_failure" ])) - -- custom function (action) - elseif(data.what - and ((id_prefix == "a_" and data.what == 7) - or (id_prefix == "p_" and data.what == 8) - or (id_prefix == "r_" and data.what == 11))) then - data.custom_param = e[ id_prefix.."value" ] - if(id_prefix == "a_") then - local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs) - data.action_failure_dialog = math.max(1, - table.indexof(sorted_dialog_list, e[ "a_on_failure" ])) - end - - -- give_item/take_item - elseif(data.what and id_prefix == "r_" and data.what >= 7 and data.what <= 8) then - data.inv_stack_name = e[ "r_value" ] or "" - - -- move - elseif(data.what and id_prefix == "r_" and data.what == 9) then - if(e[ "r_value"] and type(e[ "r_value" ]) == "string") then - local pos = minetest.string_to_pos(e[ "r_value" ]) - if(pos) then - data.move_to_x = pos.x - data.move_to_y = pos.y - data.move_to_z = pos.z - end - end - - -- lua code (precondition and effect) - elseif((data.what and id_prefix == "p_" and data.what == 7) - or (data.what and id_prefix == "r_" and data.what == 10)) then - if(e[ id_prefix.."value"] and e[ id_prefix.."value"] ~= "") then - data.lua_code = e[ id_prefix.."value" ] - end - end + end if(e[ "alternate_text"]) then data.alternate_text = e[ "alternate_text" ] @@ -1235,84 +1149,84 @@ yl_speak_up.get_fs_edit_option_related = function(player, table_click_result, -- "an internal state (i.e. of a quest)", -- 2 -- (state is the second offered option in both preconditions and effects list) if(data.what and data.what == 2 and id_prefix ~= "a_") then - return yl_speak_up.get_fs_edit_option_precondition_state( - pname, dialog, formspec, data, id_prefix, save_button) + return yl_speak_up.get_fs_edit_option_p_and_e_state( + pname, dialog, formspec, data, id_prefix, save_button, e) -- "a block somewhere", -- 3 -- (block is the third offered option in both preconditions and effects list) elseif(data.what and data.what == 3 and id_prefix ~= "a_") then - return yl_speak_up.get_fs_edit_option_precondition_block( - pname, dialog, formspec, data, id_prefix, save_button) + return yl_speak_up.get_fs_edit_option_p_and_e_block( + pname, dialog, formspec, data, id_prefix, save_button, e) -- "a trade", -- 4 -- (trade - only for preconditions; effects have something else here) elseif(data.what and id_prefix == "p_" and data.what == 4) then return yl_speak_up.get_fs_edit_option_precondition_trade( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "the inventory of the player", -- 5 -- "the inventory of the NPC", -- 6 -- (inventory - only for preconditions; effects have something else here) elseif(data.what and id_prefix == "p_" and data.what >= 5 and data.what <= 6) then return yl_speak_up.get_fs_edit_option_precondition_inv( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "give item (created out of thin air) to player (requires npc_master priv)", -- 7 -- "take item from player and destroy it (requires npc_master priv)", -- 8 elseif(data.what and id_prefix == "r_" and (data.what == 7 or data.what == 8)) then return yl_speak_up.get_fs_edit_option_effect_give_item_or_take_item( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "move the player to a given position (requires npc_master priv)", -- 9 elseif(data.what and id_prefix == "r_" and data.what == 9) then return yl_speak_up.get_fs_edit_option_effect_move( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "execute Lua code (requires npc_master priv)", -- precondition: 7; effect: 10 elseif((data.what and id_prefix == "p_" and data.what == 7) or (data.what and id_prefix == "r_" and data.what == 10)) then return yl_speak_up.get_fs_edit_option_p_and_e_function( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "NPC crafts something", -- 4 -- (craft - only for effects - not for preconditions) elseif(data.what and id_prefix == "r_" and data.what == 4) then return yl_speak_up.get_fs_edit_option_effect_craft( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "go to other dialog if the *previous* effect failed", -- 5 -- (on_failure - only for effects - not for preconditions) elseif(data.what and id_prefix == "r_" and data.what == 5) then return yl_speak_up.get_fs_edit_option_effect_on_failure( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "send a chat message to all players" -- 6 elseif(data.what and id_prefix == "r_" and data.what == 6) then return yl_speak_up.get_fs_edit_option_effect_chat_all( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "Normal trade - one item(stack) for another item(stack).", -- 3 elseif(data.what and id_prefix == "a_" and data.what == 3) then return yl_speak_up.get_fs_edit_option_action_trade( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "The NPC gives something to the player (i.e. a quest item).", -- 4 -- (only for actions) elseif(data.what and id_prefix == "a_" and data.what == 4) then return yl_speak_up.get_fs_edit_option_action_npc_gives( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "The player is expected to give something to the NPC (i.e. a quest item).", -- 5 -- (only for actions) elseif(data.what and id_prefix == "a_" and data.what == 5) then return yl_speak_up.get_fs_edit_option_action_npc_wants( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "The player has to manually enter a password or passphrase or some other text.", -- 6 -- (only for actions) elseif(data.what and id_prefix == "a_" and data.what == 6) then return yl_speak_up.get_fs_edit_option_action_text_input( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) -- "Call custom functions that are supposed to be overridden by the server.", -- 7 -- precondition: 8; action: 7; effect: 11 @@ -1321,7 +1235,7 @@ yl_speak_up.get_fs_edit_option_related = function(player, table_click_result, or (id_prefix == "p_" and data.what == 8) or (id_prefix == "r_" and data.what == 11))) then return yl_speak_up.get_fs_edit_option_action_custom( - pname, dialog, formspec, data, id_prefix, save_button) + pname, dialog, formspec, data, id_prefix, save_button, e) end return "ERROR" @@ -1331,8 +1245,15 @@ end ---------------------------------------------------------------------------- -- begin of formspecs for types of preconditions, actions and effects --- TODO: text_variable, text_select_operator -yl_speak_up.get_fs_edit_option_precondition_state = function(pname, dialog, formspec, data, id_prefix, save_button) +-- TODO: text_variable, text_select_operator, values_operator, get_sorted_player_var_list_function +yl_speak_up.get_fs_edit_option_p_and_e_state = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.operator = math.max(1,table.indexof(values_operator, e[ id_prefix.."operator" ])) + data.var_cmp_value = e[ id_prefix.."var_cmp_value" ] + data.variable_name = e[ id_prefix.."variable" ] + local var_list = get_sorted_player_var_list_function(pname) + data.variable = math.max(1, table.indexof(var_list, e[ id_prefix.."variable"])+1) + end if(not(data.variable) or data.variable < 1) then data.variable = 1 -- not enough selected yet for saving @@ -1391,8 +1312,21 @@ yl_speak_up.get_fs_edit_option_precondition_state = function(pname, dialog, form end --- TODO: block_pos as parameter? -yl_speak_up.get_fs_edit_option_precondition_block = function(pname, dialog, formspec, data, id_prefix, save_button) +-- TODO: block_pos as parameter?, values_block +yl_speak_up.get_fs_edit_option_p_and_e_block = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.block = math.max(1,table.indexof(values_block, e[ id_prefix.."value" ])) + data.node_data = {} + data.node_data.data = e[ id_prefix.."node" ] + data.node_data.param2 = e[ id_prefix.."param2" ] + data.block_pos = {x=e[ id_prefix.."pos" ].x, + y=e[ id_prefix.."pos" ].y, + z=e[ id_prefix.."pos" ].z} + -- the block below was punched + if(id_prefix == "p_" and data.block == 5) then + data.block_pos.y = data.block_pos.y - 1 + end + end local block_pos_str = "- none set -" local node = {name = "- unknown -", param2 = "- unkown -"} if(not(block_pos) and data and data.block_pos) then @@ -1461,7 +1395,10 @@ yl_speak_up.get_fs_edit_option_precondition_block = function(pname, dialog, form end -yl_speak_up.get_fs_edit_option_precondition_trade = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_precondition_trade = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.trade = math.max(1,table.indexof(values_trade, e[ "p_value" ])) + end if(not(data.trade) or data.trade == 1) then data.trade = 1 -- not enough selected yet for saving @@ -1476,7 +1413,11 @@ yl_speak_up.get_fs_edit_option_precondition_trade = function(pname, dialog, form end -yl_speak_up.get_fs_edit_option_precondition_inv = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_precondition_inv = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.inv = math.max(1,table.indexof(values_inv, e["p_value"])) + data.inv_stack_name = e[ "p_itemstack" ] + end if(not(data.inv) or data.inv == 1) then data.inv = 1 -- not enough selected yet for saving @@ -1501,7 +1442,10 @@ yl_speak_up.get_fs_edit_option_precondition_inv = function(pname, dialog, formsp end -yl_speak_up.get_fs_edit_option_effect_give_item_or_take_item = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_effect_give_item_or_take_item = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.inv_stack_name = e[ "r_value" ] or "" + end local text = "The following item shall be created out of thin air and added to the ".. "player's inventory:" if(data.what == 8) then @@ -1526,7 +1470,17 @@ yl_speak_up.get_fs_edit_option_effect_give_item_or_take_item = function(pname, d end -yl_speak_up.get_fs_edit_option_effect_move = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_effect_move = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + if(e[ "r_value"] and type(e[ "r_value" ]) == "string") then + local pos = minetest.string_to_pos(e[ "r_value" ]) + if(pos) then + data.move_to_x = pos.x + data.move_to_y = pos.y + data.move_to_z = pos.z + end + end + end return "label[0.2,3.0;Move the player to this position:]".. "label[0.2,3.5;Note: You can *save* this effect only if you have the ".. @@ -1542,7 +1496,12 @@ end -- for "precondition and effect" -yl_speak_up.get_fs_edit_option_p_and_e_function = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_p_and_e_function = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + if(e[ id_prefix.."value"] and e[ id_prefix.."value"] ~= "") then + data.lua_code = e[ id_prefix.."value" ] + end + end return "label[0.2,3.0;Execute the following Lua code (ought to return true or false):]".. "label[0.2,3.5;Note: You can *save* this effect only if you have the ".. @@ -1553,7 +1512,12 @@ yl_speak_up.get_fs_edit_option_p_and_e_function = function(pname, dialog, formsp end -yl_speak_up.get_fs_edit_option_effect_craft = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_effect_craft = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + -- those items can at least be shown as background images + data.craftresult = e[ "r_value" ] + data.craft_grid = e[ "r_craft_grid"] + end local bg_img = "" if(data and data.craftresult and data.craft_grid) then bg_img = "item_image[5.95,4.90;0.7,0.7;"..tostring(data.craftresult).."]" @@ -1580,7 +1544,10 @@ yl_speak_up.get_fs_edit_option_effect_craft = function(pname, dialog, formspec, end -yl_speak_up.get_fs_edit_option_effect_on_failure = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_effect_on_failure = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.on_failure = e[ "r_value" ] + end local dialog = yl_speak_up.speak_to[pname].dialog local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs) local nr = 1 @@ -1614,7 +1581,10 @@ yl_speak_up.get_fs_edit_option_effect_on_failure = function(pname, dialog, forms end -yl_speak_up.get_fs_edit_option_effect_chat_all = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_effect_chat_all = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.chat_msg_text = e[ "r_value" ] + end local default_text = "$NPC_NAME$ (owned by $OWNER_NAME$) announces: $PLAYER_NAME$ ".. "- example; please enter the text -" return @@ -1631,7 +1601,18 @@ yl_speak_up.get_fs_edit_option_effect_chat_all = function(pname, dialog, formspe end -yl_speak_up.get_fs_edit_option_action_trade = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_action_trade = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.trade_id = e[ "a_value" ] + -- use as background images + if(dialog and dialog.trades and dialog.trades[ data.trade_id ]) then + data.pay = dialog.trades[ data.trade_id ].pay[1] + data.buy = dialog.trades[ data.trade_id ].buy[1] + end + local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs) + data.action_failure_dialog = math.max(1, + table.indexof(sorted_dialog_list, e[ "a_on_failure" ])) + end local dialog = yl_speak_up.speak_to[pname].dialog local d_id = yl_speak_up.speak_to[pname].d_id local o_id = yl_speak_up.speak_to[pname].o_id @@ -1663,7 +1644,7 @@ yl_speak_up.get_fs_edit_option_action_trade = function(pname, dialog, formspec, end -yl_speak_up.get_fs_edit_option_action_npc_gives = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_action_npc_gives = function(pname, dialog, formspec, data, id_prefix, save_button, e) local bg_img = "" if(data and data.item_string) then bg_img = "item_image[2.15,3.65;0.7,0.7;"..tostring(data.item_string).."]" @@ -1710,7 +1691,7 @@ yl_speak_up.get_fs_edit_option_action_npc_gives = function(pname, dialog, formsp end -yl_speak_up.get_fs_edit_option_action_npc_wants = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_action_npc_wants = function(pname, dialog, formspec, data, id_prefix, save_button, e) local bg_img = "" if(data and data.item_string) then bg_img = "item_image[2.15,3.65;0.7,0.7;"..tostring(data.item_string).."]" @@ -1745,7 +1726,14 @@ yl_speak_up.get_fs_edit_option_action_npc_wants = function(pname, dialog, formsp end -yl_speak_up.get_fs_edit_option_action_text_input = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_action_text_input = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.quest_question = e[ "a_question" ] + data.quest_answer = e[ "a_value" ] + local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs) + data.action_failure_dialog = math.max(1, + table.indexof(sorted_dialog_list, e[ "a_on_failure" ])) + end return "label[0.2,3.3;What to ask the player and which answer to expect:]".. "label[0.2,4.0;Question to show:]".. @@ -1778,7 +1766,15 @@ yl_speak_up.get_fs_edit_option_action_text_input = function(pname, dialog, forms end -yl_speak_up.get_fs_edit_option_action_custom = function(pname, dialog, formspec, data, id_prefix, save_button) +yl_speak_up.get_fs_edit_option_action_custom = function(pname, dialog, formspec, data, id_prefix, save_button, e) + if(e) then + data.custom_param = e[ id_prefix.."value" ] + if(id_prefix == "a_") then + local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs) + data.action_failure_dialog = math.max(1, + table.indexof(sorted_dialog_list, e[ "a_on_failure" ])) + end + end formspec = formspec.. "label[0.2,3.3;Note: Calling a custom function will require direct support ".. "from the server.]"..