mirror of
https://gitea.your-land.de/Sokomine/yl_speak_up.git
synced 2025-06-18 21:28:03 +02:00
players can now add others that may edit their npc with just npc_talk_owner priv
This commit is contained in:
parent
3e019907da
commit
430cbd65bb
@ -5,6 +5,11 @@ yl_speak_up.input_fs_initial_config = function(player, formname, fields)
|
||||
local pname = player:get_player_name()
|
||||
local n_id = yl_speak_up.speak_to[pname].n_id
|
||||
|
||||
-- not in edit mode? then abort
|
||||
if(yl_speak_up.edit_mode[pname] ~= n_id or not(n_id)) then
|
||||
return
|
||||
end
|
||||
|
||||
if(fields.back_from_error_msg) then
|
||||
-- no point in showing the formspec or error message again if we did so already
|
||||
if(not(yl_speak_up.may_edit_npc(player, n_id))) then
|
||||
@ -16,7 +21,7 @@ yl_speak_up.input_fs_initial_config = function(player, formname, fields)
|
||||
return
|
||||
end
|
||||
|
||||
if(not(fields.save_initial_config)) then
|
||||
if(not(fields.save_initial_config) and (fields.quit or fields.exit)) then
|
||||
-- is the player editing the npc? then leaving this config
|
||||
-- dialog has to lead back to the talk dialog
|
||||
if(yl_speak_up.edit_mode[pname] == n_id and n_id) then
|
||||
@ -34,6 +39,7 @@ yl_speak_up.input_fs_initial_config = function(player, formname, fields)
|
||||
if(fields.n_npc) then
|
||||
fields.n_npc = fields.n_npc:match("^%s*(.-)%s*$")
|
||||
end
|
||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||
-- the player is trying to save the initial configuration
|
||||
-- is the player allowed to initialize this npc?
|
||||
if(not(yl_speak_up.may_edit_npc(player, n_id))) then
|
||||
@ -56,6 +62,55 @@ yl_speak_up.input_fs_initial_config = function(player, formname, fields)
|
||||
"have the \"npc_talk_owner\" priv. Else the\n"..
|
||||
"new owner could not edit his own NPC."
|
||||
end
|
||||
-- want to change who may edit this npc?
|
||||
-- delete a player from the list of those allowed to edit the NPC
|
||||
elseif(fields.delete_may_edit and fields.delete_may_edit ~= ""
|
||||
and fields.list_may_edit and fields.list_may_edit ~= "") then
|
||||
if(pname ~= yl_speak_up.npc_owner[ n_id ]) then
|
||||
error_msg = "Only the owner of the NPC\ncan change this."
|
||||
elseif(not(dialog)) then
|
||||
error_msg = "Please set a name for your NPC first!"
|
||||
else
|
||||
-- actually delete the player from the list
|
||||
dialog.n_may_edit[ fields.list_may_edit ] = nil
|
||||
-- show the next entry
|
||||
yl_speak_up.speak_to[pname].tmp_index = math.max(1,
|
||||
yl_speak_up.speak_to[pname].tmp_index-1)
|
||||
end
|
||||
-- add a player who may edit this NPC
|
||||
elseif(fields.add_may_edit and fields.add_may_edit ~= "") then
|
||||
if(pname ~= yl_speak_up.npc_owner[ n_id ]) then
|
||||
error_msg = "Only the owner of the NPC\ncan change this."
|
||||
elseif(fields.add_may_edit == pname) then
|
||||
error_msg = "You are already the owner of this NPC!\nNo need to add you extra here."
|
||||
elseif(not(minetest.check_player_privs(fields.add_may_edit, {interact=true}))) then
|
||||
error_msg = "Player \""..minetest.formspec_escape(fields.add_may_edit)..
|
||||
"\" not found."
|
||||
elseif(not(dialog)) then
|
||||
error_msg = "Please set a name for the NPC first!"
|
||||
else
|
||||
if(not(dialog.n_may_edit)) then
|
||||
dialog.n_may_edit = {}
|
||||
end
|
||||
dialog.n_may_edit[ fields.add_may_edit ] = true
|
||||
-- jump to the index with this player so that the player sees that he has been added
|
||||
local tmp_list = yl_speak_up.sort_keys(dialog.n_may_edit, true)
|
||||
local index = table.indexof(tmp_list, fields.add_may_edit)
|
||||
if(index and index > 0) then
|
||||
-- "Add player:" is added before all other names, so +1
|
||||
yl_speak_up.speak_to[pname].tmp_index = index + 1
|
||||
end
|
||||
end
|
||||
-- selected a player name in the why may edit this NPC dropdown?
|
||||
elseif(fields.list_may_edit and fields.list_may_edit ~= "") then
|
||||
local tmp_list = yl_speak_up.sort_keys(dialog.n_may_edit, true)
|
||||
local index = table.indexof(tmp_list, fields.list_may_edit)
|
||||
if(fields.list_may_edit == "Add player:") then
|
||||
index = 0
|
||||
end
|
||||
if(index and index > -1) then
|
||||
yl_speak_up.speak_to[pname].tmp_index = index + 1
|
||||
end
|
||||
end
|
||||
if(error_msg) then
|
||||
yl_speak_up.show_fs(player, "msg", { input_to = "yl_speak_up:initial_config",
|
||||
@ -65,7 +120,6 @@ yl_speak_up.input_fs_initial_config = function(player, formname, fields)
|
||||
return
|
||||
end
|
||||
|
||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||
local d_id = yl_speak_up.speak_to[pname].d_id
|
||||
local count = 0
|
||||
if(dialog and dialog.n_dialogs) then
|
||||
@ -102,11 +156,12 @@ yl_speak_up.input_fs_initial_config = function(player, formname, fields)
|
||||
local dialog = yl_speak_up.fields_to_dialog(pname, f)
|
||||
yl_speak_up.save_dialog(n_id, dialog)
|
||||
yl_speak_up.speak_to[pname].dialog = dialog
|
||||
dialog.n_may_edit = {}
|
||||
|
||||
yl_speak_up.log_change(pname, n_id,
|
||||
"Initial config saved. "..
|
||||
"NPC name: \""..tostring(fields.n_npc)..
|
||||
"\" Description: \""..tostring(fields.n_description).."\"")
|
||||
"\" Description: \""..tostring(fields.n_description).."\".")
|
||||
-- just change name and description
|
||||
else
|
||||
dialog = yl_speak_up.speak_to[pname].dialog
|
||||
@ -117,7 +172,9 @@ yl_speak_up.input_fs_initial_config = function(player, formname, fields)
|
||||
yl_speak_up.log_change(pname, n_id,
|
||||
"Name and/or description changed. "..
|
||||
"NPC name: \""..tostring(fields.n_npc)..
|
||||
"\" Description: \""..tostring(fields.n_description).."\"")
|
||||
"\" Description: \""..tostring(fields.n_description)..
|
||||
"\" May be edited by: \""..
|
||||
table.concat(yl_speak_up.sort_keys(dialog.n_may_edit, true), " ").."\".")
|
||||
end
|
||||
|
||||
dialog = yl_speak_up.speak_to[pname].dialog
|
||||
@ -138,6 +195,11 @@ yl_speak_up.input_fs_initial_config = function(player, formname, fields)
|
||||
end
|
||||
end
|
||||
|
||||
if(not(save_initial_config)) then
|
||||
yl_speak_up.show_fs(player, "initial_config",
|
||||
{n_id = n_id, d_id = yl_speak_up.speak_to[pname].d_id, false})
|
||||
return
|
||||
end
|
||||
-- actually start a chat with our new npc
|
||||
yl_speak_up.show_fs(player, "talk", {n_id = n_id, d_id = d_id})
|
||||
end
|
||||
@ -159,14 +221,20 @@ yl_speak_up.get_fs_initial_config = function(player, n_id, d_id, is_initial_conf
|
||||
local tmp_descr = "A new NPC without description"
|
||||
local tmp_text = "Please provide your new NPC with a name and description!"
|
||||
local tmp_owner = (yl_speak_up.npc_owner[ n_id ] or "- none -")
|
||||
local table_of_names = {}
|
||||
-- use existing name and description as presets when just editing
|
||||
if(not(is_initial_config)) then
|
||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||
tmp_name = (dialog.n_npc or tmp_name)
|
||||
tmp_descr = (dialog.n_description or tmp_descr)
|
||||
tmp_text = "You can change the name and description of your NPC."
|
||||
-- dialog.n_may_edit was a string for a short time in development
|
||||
if(not(dialog.n_may_edit) or type(dialog.n_may_edit) ~= "table") then
|
||||
dialog.n_may_edit = {}
|
||||
end
|
||||
table_of_names = dialog.n_may_edit
|
||||
end
|
||||
local formspec = "size[10,5]"..
|
||||
local formspec = "size[10,6]"..
|
||||
"label[0.2,0.2;"..tmp_text.."]"..
|
||||
-- name of the npc
|
||||
"label[0.2,1.05;Name:]"..
|
||||
@ -181,10 +249,21 @@ yl_speak_up.get_fs_initial_config = function(player, n_id, d_id, is_initial_conf
|
||||
"field[2.0,3.2;8,0.9;n_owner;;"..minetest.formspec_escape(tmp_owner).."]"..
|
||||
"tooltip[n_owner;The owner of the NPC. This can only be changed\n"..
|
||||
"if you have the npc_talk_master priv.;#FFFFFF;#000000]"..
|
||||
-- who can edit this NPC?
|
||||
"label[0.2,4.05;May be edited by:]"..
|
||||
-- offer a dropdown list and a text input field for player names for adding
|
||||
yl_speak_up.create_dropdown_playerlist(player, pname,
|
||||
table_of_names, yl_speak_up.speak_to[pname].tmp_index,
|
||||
2.5, 3.9, "list_may_edit",
|
||||
"add_may_edit", "edit your NPC.\n"..
|
||||
"The player needs at least the npc_talk_owner priv\n"..
|
||||
"in order to actually edit the NPC.",
|
||||
"delete_may_edit",
|
||||
"edit your NPC."
|
||||
)..
|
||||
-- save and exit buttons
|
||||
"button_exit[3.2,4.2;2,0.9;save_initial_config;Save]"..
|
||||
"button_exit[5.4,4.2;2,0.9;exit;Exit]"
|
||||
"button_exit[3.2,5.2;2,0.9;save_initial_config;Save]"..
|
||||
"button_exit[5.4,5.2;2,0.9;exit;Exit]"
|
||||
-- show the formspec to the player
|
||||
return formspec
|
||||
end
|
||||
|
||||
|
@ -1037,16 +1037,21 @@ end
|
||||
-- simple sort of keys of a table numericly;
|
||||
-- this is not efficient - but that doesn't matter: the lists are small and
|
||||
-- it is only executed when configuring an NPC
|
||||
yl_speak_up.sort_keys = function(t)
|
||||
-- simple: if the parameter is true, the keys will just be sorted (i.e. player names) - which is
|
||||
-- not enough for d_<nr>, o_<nr> etc. (which need more care when sorting)
|
||||
yl_speak_up.sort_keys = function(t, simple)
|
||||
local keys = {}
|
||||
for k, v in pairs(t) do
|
||||
-- add a prefix so that p_2 ends up before p_10
|
||||
if(string.len(k) == 3) then
|
||||
if(not(simple) and string.len(k) == 3) then
|
||||
k = "a"..k
|
||||
end
|
||||
table.insert(keys, k)
|
||||
end
|
||||
table.sort(keys)
|
||||
if(simple) then
|
||||
return keys
|
||||
end
|
||||
for i,k in ipairs(keys) do
|
||||
-- avoid cutting the single a from a_1 (action 1)
|
||||
if(k and string.sub(k, 1, 1) == "a" and string.sub(k, 2, 2) ~= "_") then
|
||||
@ -1830,6 +1835,13 @@ function yl_speak_up.talk(self, clicker)
|
||||
yl_speak_up.speak_to[pname].option_index = 1
|
||||
yl_speak_up.speak_to[pname].obj = self.object
|
||||
|
||||
-- is this player explicitly allowed to edit this npc?
|
||||
if(yl_speak_up.speak_to[pname].dialog
|
||||
and yl_speak_up.speak_to[pname].dialog.n_may_edit
|
||||
and yl_speak_up.speak_to[pname].dialog.n_may_edit[pname] ) then
|
||||
yl_speak_up.speak_to[pname].may_edit_this_npc = true
|
||||
end
|
||||
|
||||
yl_speak_up.show_fs(clicker, "talk", {n_id = n_id})
|
||||
|
||||
local dialog = yl_speak_up.speak_to[pname].dialog
|
||||
@ -1885,10 +1897,11 @@ yl_speak_up.may_edit_npc = function(player, n_id)
|
||||
end
|
||||
local pname = player:get_player_name()
|
||||
-- is the player allowed to edit this npc?
|
||||
return (yl_speak_up.npc_owner[ n_id ] == pname
|
||||
and minetest.check_player_privs(player, {npc_talk_owner=true})
|
||||
return ((yl_speak_up.npc_owner[ n_id ] == pname
|
||||
and minetest.check_player_privs(player, {npc_talk_owner=true}))
|
||||
or minetest.check_player_privs(player, {npc_talk_master=true})
|
||||
or minetest.check_player_privs(player, {npc_master=true}))
|
||||
or minetest.check_player_privs(player, {npc_master=true})
|
||||
or yl_speak_up.speak_to[pname].may_edit_this_npc)
|
||||
end
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user