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:
Sokomine 2021-07-02 20:58:35 +02:00
parent b03ab2e6b5
commit c44ee99fbc

View File

@ -193,196 +193,13 @@ yl_speak_up.delete_element_p_or_a_or_e = function(
end
-- These two functions
-- * yl_speak_up.input_fs_edit_option_related and
-- * yl_speak_up.get_fs_edit_option_related
-- are very similar for preconditions and effects. Therefore they're called here
-- with a lot of parameters. fs_edit_preconditions.lua and fs_edit_effects.lua
-- contain only wrappers.
yl_speak_up.input_fs_edit_option_related = function(player, formname, fields,
id_prefix, element_list_name, max_entries_allowed,
element_desc, tmp_data_cache,
text_ask_for_punching,
-- 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,
check_what, check_operator, check_block, check_trade, check_inv,
get_sorted_player_var_list_function,
formspec_input_to
)
if(not(player)) then
return
end
local pname = player:get_player_name()
-- what are we talking about?
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 x_id = yl_speak_up.speak_to[pname][ id_prefix.."id"]
formspec_input_to, data, fields)
-- this only works in edit mode
if(not(n_id) or yl_speak_up.edit_mode[pname] ~= n_id) then
return
end
if(fields.back_from_cannot_be_edited) then
yl_speak_up.show_fs(player, formspec_input_to, x_id)
return
end
-- delete precondition, action or effect
if(fields.delete_element) then
yl_speak_up.delete_element_p_or_a_or_e( player, pname, n_id, d_id, o_id, x_id, id_prefix,
element_list_name, element_desc, formspec_input_to)
return
end
if(fields.select_block_pos) then
minetest.chat_send_player(pname, text_ask_for_punching)
-- this formspec expects the block punch:
yl_speak_up.speak_to[pname].expect_block_punch = formspec_input_to
return
end
-- field inputs: those do not trigger a sending of the formspec on their own
local was_changed = false
-- are we talking about an inventory?
-- (inventory only applies to preconditions; not effects)
local data = yl_speak_up.speak_to[pname][ tmp_data_cache ]
if(((fields.inv_stack_name and fields.inv_stack_name ~= "")
or (fields.store_item_name and fields.store_item_name ~= ""))
and data and data.what
and ((id_prefix == "p_" and data.what >= 5 and data.what <= 6)
-- "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
or (id_prefix == "r_" and data.what >= 7 and data.what <= 8))) then
local wanted = ""
local wanted_name = ""
if(not(fields.store_item_name)) then
local parts = fields.inv_stack_name:split(" ")
local size = 1
if(parts and #parts > 1) then
size = tonumber(parts[2])
if(not(size) or size < 1) then
size = 1
end
end
wanted = parts[1].." "..tostring(size)
wanted_name = parts[1]
else
local trade_inv = minetest.get_inventory({type="detached",
name="yl_speak_up_player_"..pname})
if(not(trade_inv) or trade_inv:is_empty("npc_wants", 1)) then
-- show error message
yl_speak_up.show_fs(player, "msg", {
input_to = "yl_speak_up:"..formspec_input_to,
formspec = "size[8,2]"..
"label[0.2,0.0;Please put an item(stack) into the slot "..
"next to the\n\"Store\" button first!]"..
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
return
end
local stack = trade_inv:get_stack("npc_wants", 1)
wanted = stack:get_name().." "..stack:get_count()
wanted_name = stack:get_name()
end
-- does the item exist?
if(minetest.registered_items[ wanted_name ]) then
data.inv_stack_name = wanted
fields.inv_stack_name = wanted
else
-- show error message
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: \""..
minetest.formspec_escape(wanted)..
"\" is not a valid item(stack).]"..
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
return
end
-- comparison value for a variable (same for both preconditions and effects)
elseif(fields.var_cmp_value
and data and data.what and data.what == 2 and id_prefix ~= "a_") then
data.var_cmp_value = fields.var_cmp_value
was_changed = true
-- text for a chat message
elseif(fields.chat_msg_text
and data and data.what and data.what == 6 and id_prefix == "r_") then
data.chat_msg_text = fields.chat_msg_text
was_changed = true
elseif(fields.custom_param
and fields.custom_param ~= "- Insert a text that is passed on to your function here -"
and fields.custom_param ~= ""
and data and 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 = fields.custom_param
was_changed = true
elseif(fields.action_item_quest_id
and fields.action_item_quest_id ~= ""
and fields.action_item_quest_id ~= "- none set -"
and data and data.what and data.what == 4 and id_prefix == "a_") then
data.item_quest_id = fields.action_item_quest_id
was_changed = true
end
-- action_item_quest_id and action_item_desc can be set at the same time
if(fields.action_item_desc
and fields.action_item_desc ~= ""
and fields.action_item_desc ~= "- no item set -"
and data and data.what and data.what == 4 and id_prefix == "a_") then
-- TODO: check if it diffrent from the default one of the stack
data.item_desc = fields.action_item_desc
was_changed = true
end
if(fields.quest_question
and fields.quest_question ~= ""
and data and data.what and data.what == 6 and id_prefix == "a_") then
data.quest_question = fields.quest_question
was_changed = true
end
-- quest question and answer can be given with the same press of the save button
if(fields.quest_answer
and fields.quest_answer ~= "- Insert the correct answer here -"
and fields.quest_answer ~= ""
and data and data.what and data.what == 6 and id_prefix == "a_") then
data.quest_answer = fields.quest_answer
was_changed = true
end
-- "move the player to a given position (requires npc_master priv)", -- 9
if(fields.move_to_x or fields.move_to_y or fields.move_to_z) then
local dimension = {"x","y","z"}
for i, dim in ipairs(dimension) do
local text = fields["move_to_"..dim]
if(text and text ~= "") then
local val = tonumber(text)
if(not(val) or val < -32000 or val > 32000) 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: The coordinate values have "..
"be in the range of -32000..32000.]"..
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
return
else
data[ "move_to_"..dim ] = val
end
end
end
end
-- lua code
if(fields.lua_code) then
data.lua_code = fields.lua_code
end
-- the save button was pressed
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 = {}
-- determine p_type
@ -832,8 +649,218 @@ yl_speak_up.input_fs_edit_option_related = function(player, formname, fields,
-- 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
-- * yl_speak_up.input_fs_edit_option_related and
-- * yl_speak_up.get_fs_edit_option_related
-- are very similar for preconditions and effects. Therefore they're called here
-- with a lot of parameters. fs_edit_preconditions.lua and fs_edit_effects.lua
-- contain only wrappers.
yl_speak_up.input_fs_edit_option_related = function(player, formname, fields,
id_prefix, element_list_name, max_entries_allowed,
element_desc, tmp_data_cache,
text_ask_for_punching,
values_what, values_operator, values_block, values_trade, values_inv,
check_what, check_operator, check_block, check_trade, check_inv,
get_sorted_player_var_list_function,
formspec_input_to
)
if(not(player)) then
return
end
local pname = player:get_player_name()
-- what are we talking about?
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 x_id = yl_speak_up.speak_to[pname][ id_prefix.."id"]
-- this only works in edit mode
if(not(n_id) or yl_speak_up.edit_mode[pname] ~= n_id) then
return
end
if(fields.back_from_cannot_be_edited) then
yl_speak_up.show_fs(player, formspec_input_to, x_id)
return
end
-- delete precondition, action or effect
if(fields.delete_element) then
yl_speak_up.delete_element_p_or_a_or_e( player, pname, n_id, d_id, o_id, x_id, id_prefix,
element_list_name, element_desc, formspec_input_to)
return
end
if(fields.select_block_pos) then
minetest.chat_send_player(pname, text_ask_for_punching)
-- this formspec expects the block punch:
yl_speak_up.speak_to[pname].expect_block_punch = formspec_input_to
return
end
-- field inputs: those do not trigger a sending of the formspec on their own
local was_changed = false
-- are we talking about an inventory?
-- (inventory only applies to preconditions; not effects)
local data = yl_speak_up.speak_to[pname][ tmp_data_cache ]
if(((fields.inv_stack_name and fields.inv_stack_name ~= "")
or (fields.store_item_name and fields.store_item_name ~= ""))
and data and data.what
and ((id_prefix == "p_" and data.what >= 5 and data.what <= 6)
-- "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
or (id_prefix == "r_" and data.what >= 7 and data.what <= 8))) then
local wanted = ""
local wanted_name = ""
if(not(fields.store_item_name)) then
local parts = fields.inv_stack_name:split(" ")
local size = 1
if(parts and #parts > 1) then
size = tonumber(parts[2])
if(not(size) or size < 1) then
size = 1
end
end
wanted = parts[1].." "..tostring(size)
wanted_name = parts[1]
else
local trade_inv = minetest.get_inventory({type="detached",
name="yl_speak_up_player_"..pname})
if(not(trade_inv) or trade_inv:is_empty("npc_wants", 1)) then
-- show error message
yl_speak_up.show_fs(player, "msg", {
input_to = "yl_speak_up:"..formspec_input_to,
formspec = "size[8,2]"..
"label[0.2,0.0;Please put an item(stack) into the slot "..
"next to the\n\"Store\" button first!]"..
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
return
end
local stack = trade_inv:get_stack("npc_wants", 1)
wanted = stack:get_name().." "..stack:get_count()
wanted_name = stack:get_name()
end
-- does the item exist?
if(minetest.registered_items[ wanted_name ]) then
data.inv_stack_name = wanted
fields.inv_stack_name = wanted
else
-- show error message
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: \""..
minetest.formspec_escape(wanted)..
"\" is not a valid item(stack).]"..
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
return
end
-- comparison value for a variable (same for both preconditions and effects)
elseif(fields.var_cmp_value
and data and data.what and data.what == 2 and id_prefix ~= "a_") then
data.var_cmp_value = fields.var_cmp_value
was_changed = true
-- text for a chat message
elseif(fields.chat_msg_text
and data and data.what and data.what == 6 and id_prefix == "r_") then
data.chat_msg_text = fields.chat_msg_text
was_changed = true
elseif(fields.custom_param
and fields.custom_param ~= "- Insert a text that is passed on to your function here -"
and fields.custom_param ~= ""
and data and 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 = fields.custom_param
was_changed = true
elseif(fields.action_item_quest_id
and fields.action_item_quest_id ~= ""
and fields.action_item_quest_id ~= "- none set -"
and data and data.what and data.what == 4 and id_prefix == "a_") then
data.item_quest_id = fields.action_item_quest_id
was_changed = true
end
-- action_item_quest_id and action_item_desc can be set at the same time
if(fields.action_item_desc
and fields.action_item_desc ~= ""
and fields.action_item_desc ~= "- no item set -"
and data and data.what and data.what == 4 and id_prefix == "a_") then
-- TODO: check if it diffrent from the default one of the stack
data.item_desc = fields.action_item_desc
was_changed = true
end
if(fields.quest_question
and fields.quest_question ~= ""
and data and data.what and data.what == 6 and id_prefix == "a_") then
data.quest_question = fields.quest_question
was_changed = true
end
-- quest question and answer can be given with the same press of the save button
if(fields.quest_answer
and fields.quest_answer ~= "- Insert the correct answer here -"
and fields.quest_answer ~= ""
and data and data.what and data.what == 6 and id_prefix == "a_") then
data.quest_answer = fields.quest_answer
was_changed = true
end
-- "move the player to a given position (requires npc_master priv)", -- 9
if(fields.move_to_x or fields.move_to_y or fields.move_to_z) then
local dimension = {"x","y","z"}
for i, dim in ipairs(dimension) do
local text = fields["move_to_"..dim]
if(text and text ~= "") then
local val = tonumber(text)
if(not(val) or val < -32000 or val > 32000) 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: The coordinate values have "..
"be in the range of -32000..32000.]"..
"button[1.5,1.5;2,0.9;back_from_error_msg;Back]"})
return
else
data[ "move_to_"..dim ] = val
end
end
end
end
-- lua code
if(fields.lua_code) then
data.lua_code = fields.lua_code
end
-- the save button was pressed
if(fields.save_element and data and data.what and values_what[ data.what ]) then
local v = yl_speak_up.save_element_p_or_a_or_e(
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)
return
end
-- selections in a dropdown menu (they trigger sending the formspec)