yl_speak_up/custrom_functions_you_can_override.lua

191 lines
7.5 KiB
Lua

-----------------------------------------------------------------------------
-- This can be customized for each server.
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- Placeholders (i.e. $NPC_NAME$) in texts
-----------------------------------------------------------------------------
-- this contains custom functions that you can override on your server
-- please take a look at the example code!
-- replace some variables in the text the NPC speaks and which the player can use to reply
-- pname: the name of the player that is talking to the NPC;
-- Note: If you want to change this function, best call the original as well after
-- applying your custom changes.
yl_speak_up.replace_vars_in_text = function(text, dialog, pname)
local subs = {
MY_NAME = dialog.n_npc,
NPC_NAME = dialog.n_npc,
OWNER_NAME = dialog.npc_owner,
PLAYER_NAME = pname,
}
local day_time_name = "day"
local day_time = minetest.get_timeofday()
if(day_time < 0.5) then
day_time_name = "morning"
elseif(day_time < 0.75) then
day_time_name = "afternoon"
else
day_time_name = "evening"
end
subs.GOOD_DAY = "Good "..day_time_name
subs.good_DAY = "good "..day_time_name
-- Note: the $ char is a special one. It needs to be escaped with %$ in lua.
-- Note: when substitution argument is a table, we look up
-- substitutions in it using substring captured by "()" in
-- pattern. "[%a_]+" means one or more letter or underscore.
-- If lookup returns nil, then no substitution is made.
text = string.gsub(text, "%$([%a_]+)%$", subs)
return text
end
-----------------------------------------------------------------------------
-- Custom preconditions
-----------------------------------------------------------------------------
-- When you change an existing texts NPC that make use of that precondition will no
-- longer be able to recognize it. You have to reconfigure all those NPC!
-- Adding new texts is no problem.
yl_speak_up.custom_server_functions.precondition_descriptions = {
"(internal) hour of ingame day",
"(internal) player's health points",
"(internal) player has priv:",
}
-- please return a useful value depending on the function;
-- parameter:
-- player the player object
-- desc entry from yl_speak_up.custom_server_functions.precondition_descriptions above
-- precondition contains the data of the precondition for additional information;
-- precondition.p_var_cmp_value contains a user-specified value against which
-- the return value of this function is checked. This depends on
-- precondition.p_operator. Depending on the operator, precondition.p_var_cmp_value
-- may also be used as a parameter to this function.
-- Just make sure to tell your users what return values they shall expect and which
-- operators make sense!
yl_speak_up.custom_server_functions.precondition_eval = function(player, descr, precondition)
if(descr == "(internal) hour of ingame day") then
-- timeofday is between 0..1; translate to 24 hours
return math.floor((minetest.get_timeofday() * 24)+0.5)
elseif(descr == "(internal) player's health points") then
return player:get_hp()
elseif(descr == "(internal) player has priv:") then
-- the name of the priv is derived from the parameter
local ret = minetest.check_player_privs(player,
minetest.string_to_privs(tostring(precondition.p_var_cmp_value)))
-- evaluate the parameter directly
if(not(ret) or precondition.p_operator == "true_for_param"
or precondition.p_operator == "false_for_param") then
return ret
end
-- return the parameter for == / != comparison
return tostring(precondition.p_var_cmp_value)
-- if this custom server function does not exist: return false
else
return false
end
end
-- a custom precondition; still works, but less useful than the above method.
-- Please use
-- yl_speak_up.custom_server_functions.precondition_descriptions = {..}
-- and
-- 1yl_speak_up.custom_server_functions.precondition_eval(player, descr, precondition)
-- instead!
-- has to return either true (=precondition is fulfilled) or false (=precondition is not fulfilled)
-- Note: This function will be called often. Make it efficient!
yl_speak_up.precondition_custom = function(player, param)
minetest.chat_send_player(player:get_player_name(),
"Checking custom precondition with parameter \""..tostring(param).."\"..")
-- return if your precondition is fulfilled (true) or not (false)
return true
end
-----------------------------------------------------------------------------
-- Custom effects
-----------------------------------------------------------------------------
-- a custom effect;
-- has to return true (=effect was executed successfully) or false (=effect failed for some reason)
yl_speak_up.effect_custom = function(player, param)
minetest.chat_send_player(player:get_player_name(),
"Executing custom effect with parameter \""..tostring(param).."\"..")
-- return true if your effect executed successfuly, and false if not
-- (only relevant for following on_failure effects)
return true
end
-----------------------------------------------------------------------------
-- Custom actions
-----------------------------------------------------------------------------
-- a custom action (the formspec shown to the player);
-- overwrite this function on your server with a custom one that shows the formspec
-- that you want!
yl_speak_up.get_fs_action_custom = function(player, param)
local pname = player:get_player_name()
local dialog = yl_speak_up.speak_to[pname].dialog
return "size[8.5,4.0]"..
"button[0.2,0.0;2.0,0.9;back_to_talk;Back to talk]"..
"button[4.75,0.0;3.0,0.9;finished_action;Stare back]"..
"button[4.75,0.8;3.0,0.9;failed_action;Fail to stare back]"..
"tooltip[back_to_talk;Click here if you want to abort/cancel.]"..
"tooltip[failed_action;Click here if you want the action to FAIL.]"..
"tooltip[finished_action;Click here if you want the action to be a SUCCESS.]"..
"label[0.5,1.7;"..minetest.formspec_escape(
"["..(dialog.n_npc or "- ? -").." stares expectantly at you.]").."]"..
"label[0.5,2.5;Your custom parameter is:]"..
"label[1.5,3.0;"..minetest.formspec_escape(tostring(param)).."]"..
"label[0.5,3.5;Overwrite this function with a custom one!]"
end
-- a custom action (checking of the input);
-- overwrite this function on your server with a custom one that checks the
-- input to your formspec - but don't forget to call the necessary functions
-- as shown here
yl_speak_up.input_fs_action_custom = function(player, formname, fields)
-- back from error_msg? then show the formspec again
if(fields.back_from_error_msg) then
yl_speak_up.show_fs(player, "action_custom", nil)
return
end
local pname = player:get_player_name()
local a_id = yl_speak_up.speak_to[pname].a_id
if(fields.back_to_talk) then
-- the action was aborted
yl_speak_up.execute_next_action(player, a_id, nil)
return
end
if(fields.failed_action) then
-- the action failed
yl_speak_up.execute_next_action(player, a_id, false)
return
end
if(fields.finished_action) then
-- the action was a success
yl_speak_up.execute_next_action(player, a_id, true)
return
end
-- else show a message to the player that he ought to decide
yl_speak_up.show_fs(player, "msg", {
input_to = "yl_speak_up:action_custom",
formspec = "size[7,1.0]"..
"label[0.2,-0.2;"..
"Please click either on \"Stare back\" or \"Back to talk\"!]"..
"button[2,0.5;1.5,0.9;back_from_error_msg;Back]"})
end