From b7d0f88790c01c9ca59ae0702487d4a7b211eb1e Mon Sep 17 00:00:00 2001 From: Sokomine Date: Sun, 7 Aug 2022 23:18:35 +0200 Subject: [PATCH] properties starting with "server" can only be changed manually by players with the npc_master priv --- README.md | 3 +++ exec_apply_effects.lua | 2 +- fs_edit_general.lua | 2 ++ fs_properties.lua | 17 +++++++++++++---- fs_talkdialog.lua | 2 +- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 369166f..a670587 100644 --- a/README.md +++ b/README.md @@ -350,6 +350,9 @@ and custom_functions_you_can_override.lua You can also react to or limit normal property changes this way. +Properties starting with "server" can only be changed by players who have +the npc_master priv. + Example for a property: mood of the NPC (raises when treated well, gets lowered when treated badly). diff --git a/exec_apply_effects.lua b/exec_apply_effects.lua index 5634567..ab78e91 100644 --- a/exec_apply_effects.lua +++ b/exec_apply_effects.lua @@ -518,7 +518,7 @@ yl_speak_up.execute_effect = function(player, n_id, o_id, r) local var_val = property_data.properties[r.r_value] -- set the value of the variable local new_value = yl_speak_up.execute_effect_get_new_value(r, var_val, nil) - local res = yl_speak_up.set_npc_property(pname, r.r_value, new_value) + local res = yl_speak_up.set_npc_property(pname, r.r_value, new_value, "effect") if(res ~= "OK") then yl_speak_up.debug_msg(player, n_id, o_id, tostring(r.r_id).." ".. "property: "..tostring(res)) diff --git a/fs_edit_general.lua b/fs_edit_general.lua index 1e65177..f79e9fd 100644 --- a/fs_edit_general.lua +++ b/fs_edit_general.lua @@ -1653,6 +1653,8 @@ yl_speak_up.get_fs_edit_option_p_and_e_property = function( "hypertext[1.2,7.0;16.0,2.5;some_text;".. "Note: Properties are useful for NPC that have a generic ".. "behaviour and may vary their behaviour slightly.\n".. + "Properties starting with \"server\" can only be set or changed by ".. + "players with the \"npc_master\" privilege.".. "]" end diff --git a/fs_properties.lua b/fs_properties.lua index b16fca8..80871a8 100644 --- a/fs_properties.lua +++ b/fs_properties.lua @@ -42,7 +42,7 @@ yl_speak_up.get_npc_properties = function(pname) end -yl_speak_up.set_npc_property = function(pname, property_name, property_value) +yl_speak_up.set_npc_property = function(pname, property_name, property_value, reason) if(not(pname) or not(property_name) or property_name == "") then return "No player name or property name given. Cannot load property data." end @@ -59,7 +59,16 @@ yl_speak_up.set_npc_property = function(pname, property_name, property_value) end -- properties of type self. are not set directly if(string.sub(property_name, 1, 5) == "self.") then - return "This properties of the type \"self.\" cannot be modified." + return "Properties of the type \"self.\" cannot be modified." + end + -- properites starting with "server" can only be changed or added manually by + -- players with the npc_master priv + if(string.sub(property_name, 1, 6) == "server") then + if(not(reason) or reason ~= "manually" or not(pname) + or not(minetest.check_player_privs(pname, {npc_master=true}))) then + return "Properties starting with \"server\" can only be changed by players ".. + "who have the \"npc_master\" priv." + end end -- store it property_data.entity.yl_speak_up.properties[property_name] = property_value @@ -82,11 +91,11 @@ yl_speak_up.input_properties = function(player, formname, fields) local selected_row = nil if(fields and fields.store_new_val and fields.store_new_val ~= "" and fields.prop_val) then - yl_speak_up.set_npc_property(pname, fields.prop_name, fields.prop_val) + yl_speak_up.set_npc_property(pname, fields.prop_name, fields.prop_val, "manually") elseif(fields and fields.delete_prop and fields.delete_prop ~= "") then -- delete the old property - yl_speak_up.set_npc_property(pname, fields.prop_name, nil) + yl_speak_up.set_npc_property(pname, fields.prop_name, nil, "manually") elseif(fields and fields.table_of_properties) then local selected = minetest.explode_table_event(fields.table_of_properties) diff --git a/fs_talkdialog.lua b/fs_talkdialog.lua index 385270e..df71cc0 100644 --- a/fs_talkdialog.lua +++ b/fs_talkdialog.lua @@ -39,7 +39,7 @@ yl_speak_up.input_talk = function(player, formname, fields) end if(new_move_order ~= "") then local dialog = yl_speak_up.speak_to[pname].dialog - yl_speak_up.set_npc_property(pname, "self.order", new_move_order) + yl_speak_up.set_npc_property(pname, "self.order", new_move_order, "move_order") minetest.chat_send_player(pname, tostring(dialog.n_npc or "NPC").." tells you: ".. "Ok. I will "..tostring(new_move_order)..".")