forked from your-land-mirror/yl_speak_up
looks like much, but only extracted yl_speak_up.save_element_p_or_a_or_e from yl_speak_up.input_fs_edit_option_related and adjusted identation
This commit is contained in:
parent
b03ab2e6b5
commit
c44ee99fbc
@ -193,6 +193,476 @@ yl_speak_up.delete_element_p_or_a_or_e = function(
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- helper function for yl_speak_up.input_fs_edit_option_related
|
||||||
|
yl_speak_up.save_element_p_or_a_or_e = function(
|
||||||
|
player, pname, n_id, d_id, o_id, x_id, id_prefix, tmp_data_cache,
|
||||||
|
element_list_name, element_desc, max_entries_allowed,
|
||||||
|
values_what, values_operator, values_block, values_trade, values_inv,
|
||||||
|
formspec_input_to, data, fields)
|
||||||
|
|
||||||
|
-- for creating the new prerequirement; normal elements: p_type, p_value, p_id
|
||||||
|
local v = {}
|
||||||
|
-- determine p_type
|
||||||
|
v[ id_prefix.."type" ] = values_what[ data.what ]
|
||||||
|
|
||||||
|
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||||
|
if(not(dialog) or not(dialog.n_dialogs)
|
||||||
|
or not(dialog.n_dialogs[d_id])
|
||||||
|
or not(dialog.n_dialogs[d_id].d_options)
|
||||||
|
or not(dialog.n_dialogs[d_id].d_options[o_id])) then
|
||||||
|
-- this really should not happen during the normal course of operation
|
||||||
|
-- (only if the player sends forged formspec data or a bug occoured)
|
||||||
|
minetest.chat_send_player(pname, "Dialog or option does not exist.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local elements = dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ]
|
||||||
|
if(not(elements)) then
|
||||||
|
dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ] = {}
|
||||||
|
elements = dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ]
|
||||||
|
x_id = "new"
|
||||||
|
end
|
||||||
|
-- set x_id appropriately
|
||||||
|
if(not(x_id) or x_id == "new") then
|
||||||
|
x_id = id_prefix..yl_speak_up.find_next_id(elements)
|
||||||
|
end
|
||||||
|
v[ id_prefix.."id" ] = x_id
|
||||||
|
|
||||||
|
-- if needed: show a message after successful save so that the player can take
|
||||||
|
-- his items back from the trade_inv slots
|
||||||
|
local show_save_msg = nil
|
||||||
|
local sorted_key_list = yl_speak_up.sort_keys(elements)
|
||||||
|
if( x_id == "new" and #sorted_key_list >= max_entries_allowed) then
|
||||||
|
-- this really should not happen during the normal course of operation
|
||||||
|
-- (only if the player sends forged formspec data or a bug occoured)
|
||||||
|
minetest.chat_send_player(pname, "Maximum number of allowed entries exceeded.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- "an internal state (i.e. of a quest)", -- 2
|
||||||
|
if(data.what == 2 and id_prefix ~= "a_") then
|
||||||
|
v[ id_prefix.."value" ] = "expression"
|
||||||
|
v[ id_prefix.."operator" ] = values_operator[ data.operator ]
|
||||||
|
v[ id_prefix.."var_cmp_value" ] = (data.var_cmp_value or "")
|
||||||
|
v[ id_prefix.."variable" ] = data.variable_name
|
||||||
|
|
||||||
|
-- "a block somewhere", -- 3
|
||||||
|
elseif(data.what == 3 and id_prefix ~= "a_") then
|
||||||
|
v[ id_prefix.."value" ] = values_block[ data.block ]
|
||||||
|
if(not(data.block_pos) or not(data.node_data) or not(data.node_data.name)) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[8,2]"..
|
||||||
|
"label[0.2,0.5;Error: Please select a block first!]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- for "node_is_air", there is no need to store node name and parameter
|
||||||
|
if(v[ id_prefix.."value" ]
|
||||||
|
and (v[ id_prefix.."value" ] == "node_is_like"
|
||||||
|
or v[ id_prefix.."value" ] == "node_is_diffrent_from")
|
||||||
|
or v[ id_prefix.."value" ] == "place"
|
||||||
|
or v[ id_prefix.."value" ] == "dig"
|
||||||
|
or v[ id_prefix.."value" ] == "punch"
|
||||||
|
or v[ id_prefix.."value" ] == "right-click") then
|
||||||
|
v[ id_prefix.."node" ] = data.node_data.name
|
||||||
|
v[ id_prefix.."param2" ] = data.node_data.param2
|
||||||
|
end
|
||||||
|
-- preconditions can be applied to all blocks; effects may be more limited
|
||||||
|
if(id_prefix == "r_"
|
||||||
|
and yl_speak_up.check_blacklisted(v[id_prefix.."value"],
|
||||||
|
-- we don't know yet which node will be there later on
|
||||||
|
data.node_data.name, data.node_data.name)) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[8,2]"..
|
||||||
|
"label[0.2,0.5;Error: Blocks of type \""..
|
||||||
|
tostring(data.node_data.name).."\" do not allow\n"..
|
||||||
|
"interaction of type \""..tostring(v[id_prefix.."value"])..
|
||||||
|
"\" for NPC.]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- we also need to store the position of the node
|
||||||
|
v[ id_prefix.."pos" ] = {x = data.block_pos.x, y = data.block_pos.y, z = data.block_pos.z }
|
||||||
|
-- "I can't punch it. The block is as the block *above* the one I punched.",
|
||||||
|
if(id_prefix == "p_" and data.block == 5) then
|
||||||
|
v.p_pos.y = v.p_pos.y + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
-- "a trade", -- 4
|
||||||
|
-- (only for preconditions; not for effects)
|
||||||
|
elseif(data.what == 4 and id_prefix == "p_") then
|
||||||
|
-- this depends on the trade associated with that option; therefore,
|
||||||
|
-- it does not need any more parameters (they come dynamicly from the
|
||||||
|
-- trade)
|
||||||
|
v.p_value = values_trade[ data.trade ]
|
||||||
|
|
||||||
|
-- "the inventory of the player", -- 5
|
||||||
|
-- "the inventory of the NPC", -- 6
|
||||||
|
-- (only for preconditions; not for effects)
|
||||||
|
elseif((data.what == 5 or data.what == 6) and id_prefix == "p_") then
|
||||||
|
v.p_value = values_inv[ data.inv ]
|
||||||
|
if(v.p_value and v.p_value ~= "inv_is_empty") then
|
||||||
|
-- we have checked this value earlier on
|
||||||
|
v[ "p_itemstack" ] = data.inv_stack_name
|
||||||
|
end
|
||||||
|
|
||||||
|
-- "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
|
||||||
|
if(not(data.inv_stack_name) or data.inv_stack_name == "") then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[8,2]"..
|
||||||
|
"label[0.2,0.5;Error: Please provide the name of the "..
|
||||||
|
"\nitem you want to give or take!]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if(not(minetest.check_player_privs(player, {npc_master=true}))) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2]"..
|
||||||
|
"label[0.2,0.5;Error: You need the \"npc_master\" priv "..
|
||||||
|
" in order to set this effect.]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
v[ "r_value" ] = data.inv_stack_name
|
||||||
|
|
||||||
|
|
||||||
|
-- "move the player to a given position (requires npc_master priv)", -- 9
|
||||||
|
elseif(data.what and id_prefix == "r_" and data.what == 9) then
|
||||||
|
if(not(data.move_to_x) or not(data.move_to_y) or not(data.move_to_z)) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2]"..
|
||||||
|
"label[0.2,0.5;Error: Please provide valid coordinates "..
|
||||||
|
" x, y and z!]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if(not(minetest.check_player_privs(player, {npc_master=true}))) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2]"..
|
||||||
|
"label[0.2,0.5;Error: You need the \"npc_master\" priv "..
|
||||||
|
" in order to set this effect.]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
v[ "r_value" ] = minetest.pos_to_string(
|
||||||
|
{x = data.move_to_x, y = data.move_to_y, z = data.move_to_z})
|
||||||
|
|
||||||
|
-- effect "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
|
||||||
|
if(not(data.lua_code) or data.lua_code == "") then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2]"..
|
||||||
|
"label[0.2,0.5;Error: Please enter the Lua code you want "..
|
||||||
|
"to execute!]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if(not(minetest.check_player_privs(player, {npc_master=true}))) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2]"..
|
||||||
|
"label[0.2,0.5;Error: You need the \"npc_master\" priv "..
|
||||||
|
" in order to set this.]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
v[ id_prefix.."value" ] = data.lua_code
|
||||||
|
|
||||||
|
-- "NPC crafts something", -- 4
|
||||||
|
-- (only for effects; not for preconditions)
|
||||||
|
elseif(data.what and id_prefix == "r_" and data.what == 4) then
|
||||||
|
local player_inv = player:get_inventory()
|
||||||
|
if(player_inv:get_stack("craftpreview", 1):is_empty()) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[8,2]"..
|
||||||
|
"label[0.2,0.5;Error: Please prepare your craft grid first!"..
|
||||||
|
"\nYour NPC needs to know what to craft.]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- store the craft result (Note: the craft result may change in the future
|
||||||
|
-- if the server changes its craft result, making this craft invalid)
|
||||||
|
v[ "r_value" ] = player_inv:get_stack("craftpreview", 1):to_string()
|
||||||
|
v[ "r_craft_grid"] = {}
|
||||||
|
for i = 1, 9 do
|
||||||
|
-- store all the indigrents of the craft grid
|
||||||
|
table.insert( v[ "r_craft_grid" ],
|
||||||
|
player_inv:get_stack("craft", i):to_string())
|
||||||
|
end
|
||||||
|
|
||||||
|
-- "go to other dialog if the *previous* effect failed", -- 5
|
||||||
|
-- (only for effects; not for preconditions)
|
||||||
|
elseif(data.what and id_prefix == "r_" and data.what == 5) then
|
||||||
|
v[ "r_value" ] = data.on_failure
|
||||||
|
|
||||||
|
-- "send a chat message to all players", -- 6
|
||||||
|
-- (only for effects; not for preconditions)
|
||||||
|
elseif(data.what and id_prefix == "r_" and data.what == 6) then
|
||||||
|
data.chat_msg_text = fields.chat_msg_text
|
||||||
|
-- allow saving only if the placeholders are all present
|
||||||
|
-- (reason for requiring them: players and server owners ought to
|
||||||
|
-- be able to see who is responsible for a message)
|
||||||
|
if(not(string.find(data.chat_msg_text, "%$NPC_NAME%$"))
|
||||||
|
or not(string.find(data.chat_msg_text, "%$PLAYER_NAME%$"))
|
||||||
|
or not(string.find(data.chat_msg_text, "%$OWNER_NAME%$"))) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;Error: Your chat message needs to contain "..
|
||||||
|
"the following\nplaceholders: $NPC_NAME$, "..
|
||||||
|
"$PLAYER_NAME$ and $OWNER_NAME$.\nThat way, other "..
|
||||||
|
"players will know who sent the message.]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
v[ "r_value" ] = data.chat_msg_text
|
||||||
|
|
||||||
|
-- "Normal trade - one item(stack) for another item(stack).", -- 3
|
||||||
|
-- (only for actions)
|
||||||
|
elseif(data.what and id_prefix == "a_" and data.what == 3) then
|
||||||
|
-- remember which option was selected
|
||||||
|
yl_speak_up.speak_to[pname].o_id = o_id
|
||||||
|
-- do not switch target dialog (we are in edit mode)
|
||||||
|
yl_speak_up.speak_to[pname].target_d_id = nil
|
||||||
|
-- just to make sure that the trade_id is properly set...
|
||||||
|
if(not(data.trade_id)) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;Error: Missing trade ID.]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- the button is called store_trade_simple instead of save_element in
|
||||||
|
-- the trade simple function(s); we want to store a trade
|
||||||
|
fields.store_trade_simple = true
|
||||||
|
local res = yl_speak_up.input_add_trade_simple(player, "", fields)
|
||||||
|
-- the above function sets:
|
||||||
|
-- dialog.trades[ trade_id ] = {pay={ps},buy={bs}, d_id = d_id, o_id = o_id}
|
||||||
|
-- store the trade as an action:
|
||||||
|
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||||
|
if(res and dialog.trades and dialog.trades[ data.trade_id ]) then
|
||||||
|
v[ "a_value" ] = data.trade_id
|
||||||
|
v[ "a_pay" ] = dialog.trades[ data.trade_id ].pay
|
||||||
|
v[ "a_buy" ] = dialog.trades[ data.trade_id ].buy
|
||||||
|
v[ "a_on_failure" ] = ""
|
||||||
|
if(data.action_failure_dialog) then
|
||||||
|
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||||
|
local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs)
|
||||||
|
v[ "a_on_failure" ] = sorted_dialog_list[ data.action_failure_dialog ]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- "The NPC gives something to the player (i.e. a quest item).", -- 4
|
||||||
|
-- "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 == 4 or data.what == 5)) then
|
||||||
|
local trade_inv_list = "npc_gives"
|
||||||
|
if(data.what == 5) then
|
||||||
|
trade_inv_list = "npc_wants"
|
||||||
|
end
|
||||||
|
local trade_inv = minetest.get_inventory({type="detached", name="yl_speak_up_player_"..pname})
|
||||||
|
if(not(trade_inv) or trade_inv:is_empty( trade_inv_list )) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;Please insert an item first! Your NPC "..
|
||||||
|
"needs\nto know what it shall give to the player.]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
v[ "a_on_failure" ] = ""
|
||||||
|
if(data.action_failure_dialog) then
|
||||||
|
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||||
|
local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs)
|
||||||
|
v[ "a_on_failure" ] = sorted_dialog_list[ data.action_failure_dialog ]
|
||||||
|
end
|
||||||
|
-- change the node in the slot
|
||||||
|
local stack = trade_inv:get_stack( trade_inv_list, 1)
|
||||||
|
if(not(stack) or not(minetest.registered_items[ stack:get_name() ])) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;This item is unkown. Please use only known"..
|
||||||
|
"items.]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- is this particular item blacklisted on this server?
|
||||||
|
if(yl_speak_up.blacklist_action_quest_item[ stack:get_name() ]) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;Sorry. This item is blacklisted on this "..
|
||||||
|
"server.\nYou can't use it as a quest item.]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local meta = stack:get_meta()
|
||||||
|
-- what does the NPC want to give?
|
||||||
|
v[ "a_value" ] = stack:get_name().." "..stack:get_count()
|
||||||
|
-- for displaying as a background image
|
||||||
|
data.item_string = v[ "a_value" ]
|
||||||
|
if(data.what == 5) then
|
||||||
|
-- try to reconstruct $PLAYER_NAME$ (may not always work)
|
||||||
|
local item_was_for = meta:get_string("yl_speak_up:quest_item_for")
|
||||||
|
local new_desc = meta:get_string("description")
|
||||||
|
if(item_was_for and item_was_for ~= "") then
|
||||||
|
new_desc = string.gsub(new_desc, item_was_for, "$PLAYER_NAME$")
|
||||||
|
end
|
||||||
|
data.item_desc = new_desc
|
||||||
|
end
|
||||||
|
-- set new description if there is one set (optional)
|
||||||
|
if(data.item_desc
|
||||||
|
and data.item_desc ~= ""
|
||||||
|
and data.item_desc ~= "- none set -") then
|
||||||
|
if(data.what == 4) then
|
||||||
|
meta:set_string("description", data.item_desc)
|
||||||
|
end
|
||||||
|
v[ "a_item_desc" ] = data.item_desc
|
||||||
|
end
|
||||||
|
if(data.what == 5) then
|
||||||
|
data.item_quest_id = meta:get_string("yl_speak_up:quest_id")
|
||||||
|
end
|
||||||
|
-- set special ID (optional)
|
||||||
|
if(data.item_quest_id
|
||||||
|
and data.item_quest_id ~= ""
|
||||||
|
and data.item_quest_id ~= "- no item set -") then
|
||||||
|
if(data.what == 4) then
|
||||||
|
-- which player got this quest item?
|
||||||
|
meta:set_string("yl_speak_up:quest_item_for", pname)
|
||||||
|
-- include the NPC id so that we know which NPC gave it
|
||||||
|
meta:set_string("yl_speak_up:quest_item_from", tostring(n_id))
|
||||||
|
-- extend quest_id by NPC id so that it becomes more uniq
|
||||||
|
meta:set_string("yl_speak_up:quest_id",
|
||||||
|
tostring(n_id).." "..tostring(data.item_quest_id))
|
||||||
|
end
|
||||||
|
v[ "a_item_quest_id" ] = data.item_quest_id
|
||||||
|
end
|
||||||
|
if( v["a_item_quest_id"] and not(v[ "a_item_desc"]) and data.what == 4) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;You can't set a special quest ID without "..
|
||||||
|
"also changing\nthe description. The player would be "..
|
||||||
|
"unable to tell\nthe quest item and normal items "..
|
||||||
|
"apartapart.]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local player_inv = player:get_inventory()
|
||||||
|
if(not(player_inv:room_for_item("main", stack))) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;You have no room in your inventory for "..
|
||||||
|
"the example\nitem. Please make room so that it can be"..
|
||||||
|
"given back to you!]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
player_inv:add_item("main", stack)
|
||||||
|
trade_inv:remove_item(trade_inv_list, stack)
|
||||||
|
-- just send a message that the save was successful and give the player time to
|
||||||
|
-- take his items back
|
||||||
|
show_save_msg = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;The information was saved successfully.\n"..
|
||||||
|
"The item has been returned to your inventory.]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"
|
||||||
|
return
|
||||||
|
|
||||||
|
-- "The player has to manually enter a password or passphrase or some other text.", -- 6
|
||||||
|
elseif(data.what and id_prefix == "a_" and data.what == 6) then
|
||||||
|
if(not(data.quest_question)) then
|
||||||
|
data.quest_question = "Your answer:"
|
||||||
|
end
|
||||||
|
v[ "a_question" ] = data.quest_question
|
||||||
|
-- the player setting this up needs to provide the correct answer
|
||||||
|
if(not(data.quest_answer)) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;Error: Please provide the correct answer!\n"..
|
||||||
|
"The answer the player gives is checked against this.]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
v[ "a_value" ] = data.quest_answer
|
||||||
|
if(not(data.action_failure_dialog)) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[9,2.5]"..
|
||||||
|
"label[0.2,0.5;Error: Please provide a target dialog if "..
|
||||||
|
"the player gives the wrong answer.]"..
|
||||||
|
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||||
|
local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs)
|
||||||
|
v[ "a_on_failure" ] = sorted_dialog_list[ data.action_failure_dialog ]
|
||||||
|
|
||||||
|
-- "Call custom functions that are supposed to be overridden by the server.", --
|
||||||
|
-- precondition: 8; action: 7; effect: 11
|
||||||
|
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
|
||||||
|
v[ id_prefix.."value" ] = data.custom_param
|
||||||
|
if(id_prefix == "a_") then
|
||||||
|
local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs)
|
||||||
|
v[ "a_on_failure" ] = sorted_dialog_list[ data.action_failure_dialog ]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
v[ "alternate_text" ] = data.alternate_text
|
||||||
|
|
||||||
|
-- only save if something was actually selected
|
||||||
|
if(v[ id_prefix.."value"]) then
|
||||||
|
if(not(dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ])) then
|
||||||
|
dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ] = {}
|
||||||
|
end
|
||||||
|
-- store the change in the dialog
|
||||||
|
dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ][ x_id ] = v
|
||||||
|
-- clear up data
|
||||||
|
yl_speak_up.speak_to[pname][ id_prefix.."id" ] = nil
|
||||||
|
yl_speak_up.speak_to[pname][ tmp_data_cache ] = nil
|
||||||
|
-- record this as a change, but do not save do disk yet
|
||||||
|
table.insert(yl_speak_up.npc_was_changed[ n_id ],
|
||||||
|
"Dialog "..tostring(d_id)..": "..element_desc.." "..tostring(x_id)..
|
||||||
|
" added/changed for option "..tostring(o_id)..".")
|
||||||
|
if(show_save_msg) then
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = show_save_msg})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- TODO: when trying to save: save to disk as well?
|
||||||
|
-- show the new/changed precondition
|
||||||
|
yl_speak_up.show_fs(player, formspec_input_to, x_id)
|
||||||
|
return
|
||||||
|
else
|
||||||
|
-- make sure the player is informed that saving failed
|
||||||
|
yl_speak_up.show_fs(player, "msg", {
|
||||||
|
input_to = "yl_speak_up:"..formspec_input_to,
|
||||||
|
formspec = "size[8,2]"..
|
||||||
|
"label[0.2,0.5;Error: There is no \""..tostring(id_prefix)..
|
||||||
|
"value\" set.\n"..
|
||||||
|
"\nCould not save.]"..
|
||||||
|
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- These two functions
|
-- These two functions
|
||||||
-- * yl_speak_up.input_fs_edit_option_related and
|
-- * yl_speak_up.input_fs_edit_option_related and
|
||||||
-- * yl_speak_up.get_fs_edit_option_related
|
-- * yl_speak_up.get_fs_edit_option_related
|
||||||
@ -383,458 +853,15 @@ yl_speak_up.input_fs_edit_option_related = function(player, formname, fields,
|
|||||||
|
|
||||||
-- the save button was pressed
|
-- the save button was pressed
|
||||||
if(fields.save_element and data and data.what and values_what[ data.what ]) then
|
if(fields.save_element and data and data.what and values_what[ data.what ]) then
|
||||||
-- for creating the new prerequirement; normal elements: p_type, p_value, p_id
|
local v = yl_speak_up.save_element_p_or_a_or_e(
|
||||||
local v = {}
|
player, pname, n_id, d_id, o_id, x_id, id_prefix, tmp_data_cache,
|
||||||
-- determine p_type
|
element_list_name, element_desc, max_entries_allowed,
|
||||||
v[ id_prefix.."type" ] = values_what[ data.what ]
|
values_what, values_operator, values_block, values_trade, values_inv,
|
||||||
|
formspec_input_to, data, fields)
|
||||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
return
|
||||||
if(not(dialog) or not(dialog.n_dialogs)
|
|
||||||
or not(dialog.n_dialogs[d_id])
|
|
||||||
or not(dialog.n_dialogs[d_id].d_options)
|
|
||||||
or not(dialog.n_dialogs[d_id].d_options[o_id])) then
|
|
||||||
-- this really should not happen during the normal course of operation
|
|
||||||
-- (only if the player sends forged formspec data or a bug occoured)
|
|
||||||
minetest.chat_send_player(pname, "Dialog or option does not exist.")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local elements = dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ]
|
|
||||||
if(not(elements)) then
|
|
||||||
dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ] = {}
|
|
||||||
elements = dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ]
|
|
||||||
x_id = "new"
|
|
||||||
end
|
|
||||||
-- set x_id appropriately
|
|
||||||
if(not(x_id) or x_id == "new") then
|
|
||||||
x_id = id_prefix..yl_speak_up.find_next_id(elements)
|
|
||||||
end
|
|
||||||
v[ id_prefix.."id" ] = x_id
|
|
||||||
|
|
||||||
-- if needed: show a message after successful save so that the player can take
|
|
||||||
-- his items back from the trade_inv slots
|
|
||||||
local show_save_msg = nil
|
|
||||||
local sorted_key_list = yl_speak_up.sort_keys(elements)
|
|
||||||
if( x_id == "new" and #sorted_key_list >= max_entries_allowed) then
|
|
||||||
-- this really should not happen during the normal course of operation
|
|
||||||
-- (only if the player sends forged formspec data or a bug occoured)
|
|
||||||
minetest.chat_send_player(pname, "Maximum number of allowed entries exceeded.")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- "an internal state (i.e. of a quest)", -- 2
|
|
||||||
if(data.what == 2 and id_prefix ~= "a_") then
|
|
||||||
v[ id_prefix.."value" ] = "expression"
|
|
||||||
v[ id_prefix.."operator" ] = values_operator[ data.operator ]
|
|
||||||
v[ id_prefix.."var_cmp_value" ] = (data.var_cmp_value or "")
|
|
||||||
v[ id_prefix.."variable" ] = data.variable_name
|
|
||||||
|
|
||||||
-- "a block somewhere", -- 3
|
|
||||||
elseif(data.what == 3 and id_prefix ~= "a_") then
|
|
||||||
v[ id_prefix.."value" ] = values_block[ data.block ]
|
|
||||||
if(not(data.block_pos) or not(data.node_data) or not(data.node_data.name)) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[8,2]"..
|
|
||||||
"label[0.2,0.5;Error: Please select a block first!]"..
|
|
||||||
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- for "node_is_air", there is no need to store node name and parameter
|
|
||||||
if(v[ id_prefix.."value" ]
|
|
||||||
and (v[ id_prefix.."value" ] == "node_is_like"
|
|
||||||
or v[ id_prefix.."value" ] == "node_is_diffrent_from")
|
|
||||||
or v[ id_prefix.."value" ] == "place"
|
|
||||||
or v[ id_prefix.."value" ] == "dig"
|
|
||||||
or v[ id_prefix.."value" ] == "punch"
|
|
||||||
or v[ id_prefix.."value" ] == "right-click") then
|
|
||||||
v[ id_prefix.."node" ] = data.node_data.name
|
|
||||||
v[ id_prefix.."param2" ] = data.node_data.param2
|
|
||||||
end
|
|
||||||
-- preconditions can be applied to all blocks; effects may be more limited
|
|
||||||
if(id_prefix == "r_"
|
|
||||||
and yl_speak_up.check_blacklisted(v[id_prefix.."value"],
|
|
||||||
-- we don't know yet which node will be there later on
|
|
||||||
data.node_data.name, data.node_data.name)) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[8,2]"..
|
|
||||||
"label[0.2,0.5;Error: Blocks of type \""..
|
|
||||||
tostring(data.node_data.name).."\" do not allow\n"..
|
|
||||||
"interaction of type \""..tostring(v[id_prefix.."value"])..
|
|
||||||
"\" for NPC.]"..
|
|
||||||
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- we also need to store the position of the node
|
|
||||||
v[ id_prefix.."pos" ] = {x = data.block_pos.x, y = data.block_pos.y, z = data.block_pos.z }
|
|
||||||
-- "I can't punch it. The block is as the block *above* the one I punched.",
|
|
||||||
if(id_prefix == "p_" and data.block == 5) then
|
|
||||||
v.p_pos.y = v.p_pos.y + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
-- "a trade", -- 4
|
|
||||||
-- (only for preconditions; not for effects)
|
|
||||||
elseif(data.what == 4 and id_prefix == "p_") then
|
|
||||||
-- this depends on the trade associated with that option; therefore,
|
|
||||||
-- it does not need any more parameters (they come dynamicly from the
|
|
||||||
-- trade)
|
|
||||||
v.p_value = values_trade[ data.trade ]
|
|
||||||
|
|
||||||
-- "the inventory of the player", -- 5
|
|
||||||
-- "the inventory of the NPC", -- 6
|
|
||||||
-- (only for preconditions; not for effects)
|
|
||||||
elseif((data.what == 5 or data.what == 6) and id_prefix == "p_") then
|
|
||||||
v.p_value = values_inv[ data.inv ]
|
|
||||||
if(v.p_value and v.p_value ~= "inv_is_empty") then
|
|
||||||
-- we have checked this value earlier on
|
|
||||||
v[ "p_itemstack" ] = data.inv_stack_name
|
|
||||||
end
|
|
||||||
|
|
||||||
-- "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
|
|
||||||
if(not(data.inv_stack_name) or data.inv_stack_name == "") then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[8,2]"..
|
|
||||||
"label[0.2,0.5;Error: Please provide the name of the "..
|
|
||||||
"\nitem you want to give or take!]"..
|
|
||||||
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if(not(minetest.check_player_privs(player, {npc_master=true}))) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2]"..
|
|
||||||
"label[0.2,0.5;Error: You need the \"npc_master\" priv "..
|
|
||||||
" in order to set this effect.]"..
|
|
||||||
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
v[ "r_value" ] = data.inv_stack_name
|
|
||||||
|
|
||||||
|
|
||||||
-- "move the player to a given position (requires npc_master priv)", -- 9
|
|
||||||
elseif(data.what and id_prefix == "r_" and data.what == 9) then
|
|
||||||
if(not(data.move_to_x) or not(data.move_to_y) or not(data.move_to_z)) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2]"..
|
|
||||||
"label[0.2,0.5;Error: Please provide valid coordinates "..
|
|
||||||
" x, y and z!]"..
|
|
||||||
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if(not(minetest.check_player_privs(player, {npc_master=true}))) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2]"..
|
|
||||||
"label[0.2,0.5;Error: You need the \"npc_master\" priv "..
|
|
||||||
" in order to set this effect.]"..
|
|
||||||
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
v[ "r_value" ] = minetest.pos_to_string(
|
|
||||||
{x = data.move_to_x, y = data.move_to_y, z = data.move_to_z})
|
|
||||||
|
|
||||||
-- effect "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
|
|
||||||
if(not(data.lua_code) or data.lua_code == "") then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2]"..
|
|
||||||
"label[0.2,0.5;Error: Please enter the Lua code you want "..
|
|
||||||
"to execute!]"..
|
|
||||||
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if(not(minetest.check_player_privs(player, {npc_master=true}))) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2]"..
|
|
||||||
"label[0.2,0.5;Error: You need the \"npc_master\" priv "..
|
|
||||||
" in order to set this.]"..
|
|
||||||
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
v[ id_prefix.."value" ] = data.lua_code
|
|
||||||
|
|
||||||
-- "NPC crafts something", -- 4
|
|
||||||
-- (only for effects; not for preconditions)
|
|
||||||
elseif(data.what and id_prefix == "r_" and data.what == 4) then
|
|
||||||
local player_inv = player:get_inventory()
|
|
||||||
if(player_inv:get_stack("craftpreview", 1):is_empty()) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[8,2]"..
|
|
||||||
"label[0.2,0.5;Error: Please prepare your craft grid first!"..
|
|
||||||
"\nYour NPC needs to know what to craft.]"..
|
|
||||||
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- store the craft result (Note: the craft result may change in the future
|
|
||||||
-- if the server changes its craft result, making this craft invalid)
|
|
||||||
v[ "r_value" ] = player_inv:get_stack("craftpreview", 1):to_string()
|
|
||||||
v[ "r_craft_grid"] = {}
|
|
||||||
for i = 1, 9 do
|
|
||||||
-- store all the indigrents of the craft grid
|
|
||||||
table.insert( v[ "r_craft_grid" ],
|
|
||||||
player_inv:get_stack("craft", i):to_string())
|
|
||||||
end
|
|
||||||
|
|
||||||
-- "go to other dialog if the *previous* effect failed", -- 5
|
|
||||||
-- (only for effects; not for preconditions)
|
|
||||||
elseif(data.what and id_prefix == "r_" and data.what == 5) then
|
|
||||||
v[ "r_value" ] = data.on_failure
|
|
||||||
|
|
||||||
-- "send a chat message to all players", -- 6
|
|
||||||
-- (only for effects; not for preconditions)
|
|
||||||
elseif(data.what and id_prefix == "r_" and data.what == 6) then
|
|
||||||
data.chat_msg_text = fields.chat_msg_text
|
|
||||||
-- allow saving only if the placeholders are all present
|
|
||||||
-- (reason for requiring them: players and server owners ought to
|
|
||||||
-- be able to see who is responsible for a message)
|
|
||||||
if(not(string.find(data.chat_msg_text, "%$NPC_NAME%$"))
|
|
||||||
or not(string.find(data.chat_msg_text, "%$PLAYER_NAME%$"))
|
|
||||||
or not(string.find(data.chat_msg_text, "%$OWNER_NAME%$"))) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;Error: Your chat message needs to contain "..
|
|
||||||
"the following\nplaceholders: $NPC_NAME$, "..
|
|
||||||
"$PLAYER_NAME$ and $OWNER_NAME$.\nThat way, other "..
|
|
||||||
"players will know who sent the message.]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
v[ "r_value" ] = data.chat_msg_text
|
|
||||||
|
|
||||||
-- "Normal trade - one item(stack) for another item(stack).", -- 3
|
|
||||||
-- (only for actions)
|
|
||||||
elseif(data.what and id_prefix == "a_" and data.what == 3) then
|
|
||||||
-- remember which option was selected
|
|
||||||
yl_speak_up.speak_to[pname].o_id = o_id
|
|
||||||
-- do not switch target dialog (we are in edit mode)
|
|
||||||
yl_speak_up.speak_to[pname].target_d_id = nil
|
|
||||||
-- just to make sure that the trade_id is properly set...
|
|
||||||
if(not(data.trade_id)) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;Error: Missing trade ID.]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- the button is called store_trade_simple instead of save_element in
|
|
||||||
-- the trade simple function(s); we want to store a trade
|
|
||||||
fields.store_trade_simple = true
|
|
||||||
local res = yl_speak_up.input_add_trade_simple(player, "", fields)
|
|
||||||
-- the above function sets:
|
|
||||||
-- dialog.trades[ trade_id ] = {pay={ps},buy={bs}, d_id = d_id, o_id = o_id}
|
|
||||||
-- store the trade as an action:
|
|
||||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
|
||||||
if(res and dialog.trades and dialog.trades[ data.trade_id ]) then
|
|
||||||
v[ "a_value" ] = data.trade_id
|
|
||||||
v[ "a_pay" ] = dialog.trades[ data.trade_id ].pay
|
|
||||||
v[ "a_buy" ] = dialog.trades[ data.trade_id ].buy
|
|
||||||
v[ "a_on_failure" ] = ""
|
|
||||||
if(data.action_failure_dialog) then
|
|
||||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
|
||||||
local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs)
|
|
||||||
v[ "a_on_failure" ] = sorted_dialog_list[ data.action_failure_dialog ]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- "The NPC gives something to the player (i.e. a quest item).", -- 4
|
|
||||||
-- "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 == 4 or data.what == 5)) then
|
|
||||||
local trade_inv_list = "npc_gives"
|
|
||||||
if(data.what == 5) then
|
|
||||||
trade_inv_list = "npc_wants"
|
|
||||||
end
|
|
||||||
local trade_inv = minetest.get_inventory({type="detached", name="yl_speak_up_player_"..pname})
|
|
||||||
if(not(trade_inv) or trade_inv:is_empty( trade_inv_list )) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;Please insert an item first! Your NPC "..
|
|
||||||
"needs\nto know what it shall give to the player.]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
v[ "a_on_failure" ] = ""
|
|
||||||
if(data.action_failure_dialog) then
|
|
||||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
|
||||||
local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs)
|
|
||||||
v[ "a_on_failure" ] = sorted_dialog_list[ data.action_failure_dialog ]
|
|
||||||
end
|
|
||||||
-- change the node in the slot
|
|
||||||
local stack = trade_inv:get_stack( trade_inv_list, 1)
|
|
||||||
if(not(stack) or not(minetest.registered_items[ stack:get_name() ])) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;This item is unkown. Please use only known"..
|
|
||||||
"items.]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- is this particular item blacklisted on this server?
|
|
||||||
if(yl_speak_up.blacklist_action_quest_item[ stack:get_name() ]) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;Sorry. This item is blacklisted on this "..
|
|
||||||
"server.\nYou can't use it as a quest item.]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local meta = stack:get_meta()
|
|
||||||
-- what does the NPC want to give?
|
|
||||||
v[ "a_value" ] = stack:get_name().." "..stack:get_count()
|
|
||||||
-- for displaying as a background image
|
|
||||||
data.item_string = v[ "a_value" ]
|
|
||||||
if(data.what == 5) then
|
|
||||||
-- try to reconstruct $PLAYER_NAME$ (may not always work)
|
|
||||||
local item_was_for = meta:get_string("yl_speak_up:quest_item_for")
|
|
||||||
local new_desc = meta:get_string("description")
|
|
||||||
if(item_was_for and item_was_for ~= "") then
|
|
||||||
new_desc = string.gsub(new_desc, item_was_for, "$PLAYER_NAME$")
|
|
||||||
end
|
|
||||||
data.item_desc = new_desc
|
|
||||||
end
|
|
||||||
-- set new description if there is one set (optional)
|
|
||||||
if(data.item_desc
|
|
||||||
and data.item_desc ~= ""
|
|
||||||
and data.item_desc ~= "- none set -") then
|
|
||||||
if(data.what == 4) then
|
|
||||||
meta:set_string("description", data.item_desc)
|
|
||||||
end
|
|
||||||
v[ "a_item_desc" ] = data.item_desc
|
|
||||||
end
|
|
||||||
if(data.what == 5) then
|
|
||||||
data.item_quest_id = meta:get_string("yl_speak_up:quest_id")
|
|
||||||
end
|
|
||||||
-- set special ID (optional)
|
|
||||||
if(data.item_quest_id
|
|
||||||
and data.item_quest_id ~= ""
|
|
||||||
and data.item_quest_id ~= "- no item set -") then
|
|
||||||
if(data.what == 4) then
|
|
||||||
-- which player got this quest item?
|
|
||||||
meta:set_string("yl_speak_up:quest_item_for", pname)
|
|
||||||
-- include the NPC id so that we know which NPC gave it
|
|
||||||
meta:set_string("yl_speak_up:quest_item_from", tostring(n_id))
|
|
||||||
-- extend quest_id by NPC id so that it becomes more uniq
|
|
||||||
meta:set_string("yl_speak_up:quest_id",
|
|
||||||
tostring(n_id).." "..tostring(data.item_quest_id))
|
|
||||||
end
|
|
||||||
v[ "a_item_quest_id" ] = data.item_quest_id
|
|
||||||
end
|
|
||||||
if( v["a_item_quest_id"] and not(v[ "a_item_desc"]) and data.what == 4) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;You can't set a special quest ID without "..
|
|
||||||
"also changing\nthe description. The player would be "..
|
|
||||||
"unable to tell\nthe quest item and normal items "..
|
|
||||||
"apartapart.]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local player_inv = player:get_inventory()
|
|
||||||
if(not(player_inv:room_for_item("main", stack))) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;You have no room in your inventory for "..
|
|
||||||
"the example\nitem. Please make room so that it can be"..
|
|
||||||
"given back to you!]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
player_inv:add_item("main", stack)
|
|
||||||
trade_inv:remove_item(trade_inv_list, stack)
|
|
||||||
-- just send a message that the save was successful and give the player time to
|
|
||||||
-- take his items back
|
|
||||||
show_save_msg = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;The information was saved successfully.\n"..
|
|
||||||
"The item has been returned to your inventory.]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"
|
|
||||||
return
|
|
||||||
|
|
||||||
-- "The player has to manually enter a password or passphrase or some other text.", -- 6
|
|
||||||
elseif(data.what and id_prefix == "a_" and data.what == 6) then
|
|
||||||
if(not(data.quest_question)) then
|
|
||||||
data.quest_question = "Your answer:"
|
|
||||||
end
|
|
||||||
v[ "a_question" ] = data.quest_question
|
|
||||||
-- the player setting this up needs to provide the correct answer
|
|
||||||
if(not(data.quest_answer)) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;Error: Please provide the correct answer!\n"..
|
|
||||||
"The answer the player gives is checked against this.]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
v[ "a_value" ] = data.quest_answer
|
|
||||||
if(not(data.action_failure_dialog)) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = "size[9,2.5]"..
|
|
||||||
"label[0.2,0.5;Error: Please provide a target dialog if "..
|
|
||||||
"the player gives the wrong answer.]"..
|
|
||||||
"button[1.5,2.0;2,0.9;back_from_error_msg;Back]"})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
|
||||||
local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs)
|
|
||||||
v[ "a_on_failure" ] = sorted_dialog_list[ data.action_failure_dialog ]
|
|
||||||
|
|
||||||
-- "Call custom functions that are supposed to be overridden by the server.", --
|
|
||||||
-- precondition: 8; action: 7; effect: 11
|
|
||||||
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
|
|
||||||
v[ id_prefix.."value" ] = data.custom_param
|
|
||||||
if(id_prefix == "a_") then
|
|
||||||
local sorted_dialog_list = yl_speak_up.sort_keys(dialog.n_dialogs)
|
|
||||||
v[ "a_on_failure" ] = sorted_dialog_list[ data.action_failure_dialog ]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
v[ "alternate_text" ] = data.alternate_text
|
|
||||||
|
|
||||||
-- only save if something was actually selected
|
|
||||||
if(v[ id_prefix.."value"]) then
|
|
||||||
if(not(dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ])) then
|
|
||||||
dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ] = {}
|
|
||||||
end
|
|
||||||
-- store the change in the dialog
|
|
||||||
dialog.n_dialogs[d_id].d_options[o_id][ element_list_name ][ x_id ] = v
|
|
||||||
-- clear up data
|
|
||||||
yl_speak_up.speak_to[pname][ id_prefix.."id" ] = nil
|
|
||||||
yl_speak_up.speak_to[pname][ tmp_data_cache ] = nil
|
|
||||||
-- record this as a change, but do not save do disk yet
|
|
||||||
table.insert(yl_speak_up.npc_was_changed[ n_id ],
|
|
||||||
"Dialog "..tostring(d_id)..": "..element_desc.." "..tostring(x_id)..
|
|
||||||
" added/changed for option "..tostring(o_id)..".")
|
|
||||||
if(show_save_msg) then
|
|
||||||
yl_speak_up.show_fs(player, "msg", {
|
|
||||||
input_to = "yl_speak_up:"..formspec_input_to,
|
|
||||||
formspec = show_save_msg})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- TODO: when trying to save: save to disk as well?
|
|
||||||
-- show the new/changed precondition
|
|
||||||
yl_speak_up.show_fs(player, formspec_input_to, x_id)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- selections in a dropdown menu (they trigger sending the formspec)
|
-- selections in a dropdown menu (they trigger sending the formspec)
|
||||||
|
|
||||||
-- select a general direction/type first
|
-- select a general direction/type first
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user