124 lines
4.4 KiB
Lua
124 lines
4.4 KiB
Lua
-- Important: This is only of relevance for the Server YourLand -
|
|
-- which was running an older version of this mod and nees
|
|
-- adjustments for the newer version.
|
|
---
|
|
-- Rename this file to
|
|
-- local_server_do_on_reload.lua
|
|
-- and execute
|
|
-- /npc_talk_migrate
|
|
-- in order to automaticly add the necessary privs for all existing old NPC.
|
|
--
|
|
-- NPC dialogs are checked and reported if broken.
|
|
|
|
yl_speak_up.migration_npc_needs_priv = function(n_id, pname, counter, priv_name)
|
|
if(counter < 1) then
|
|
return
|
|
end
|
|
-- does the NPC have the priv already?
|
|
if(yl_speak_up.npc_has_priv(n_id, priv_name, nil)) then
|
|
minetest.chat_send_player(pname, " OK: "..tostring(n_id).." has priv "..priv_name)
|
|
return
|
|
end
|
|
-- grant the NPC the priv
|
|
minetest.chat_send_player(pname, " GRANTING "..tostring(n_id).." priv "..priv_name)
|
|
if(not(yl_speak_up.npc_priv_table[n_id])) then
|
|
yl_speak_up.npc_priv_table[n_id] = {}
|
|
end
|
|
yl_speak_up.npc_priv_table[n_id][priv_name] = true
|
|
end
|
|
|
|
|
|
yl_speak_up.check_one_npc_for_migration = function(dialog, pname, n_id)
|
|
-- nothing defined yet - nothing to repair
|
|
if(not(dialog.n_dialogs)) then
|
|
minetest.chat_send_player(pname, " NPC "..tostring(n_id).." has nothing to say.")
|
|
return
|
|
end
|
|
local c_effect_exec_lua = 0
|
|
local c_effect_give_item = 0
|
|
local c_effect_take_item = 0
|
|
local c_effect_move_player = 0
|
|
local c_precon_exec_lua = 0
|
|
-- iterate over all dialogs
|
|
for d_id, d in pairs(dialog.n_dialogs) do
|
|
if(d_id and d and d.d_options) then
|
|
-- iterate over all options
|
|
for o_id, o in pairs(d.d_options) do
|
|
if(o_id and o and o.o_results) then
|
|
local dialog_results = {}
|
|
-- iterate over all results
|
|
for r_id, r in pairs(o.o_results) do
|
|
if(r.r_type == "dialog") then
|
|
table.insert(dialog_results, r_id)
|
|
elseif(r.r_type == "function") then
|
|
c_effect_exec_lua = c_effect_exec_lua + 1
|
|
elseif(r.r_type == "move") then
|
|
c_effect_move_player = c_effect_move_player + 1
|
|
elseif(r.r_type == "give_item") then
|
|
c_effect_give_item = c_effect_give_item + 1
|
|
elseif(r.r_type == "take_item") then
|
|
c_effect_take_item = c_effect_take_item + 1
|
|
end
|
|
end
|
|
if(#dialog_results>1) then
|
|
local msg = "ERROR: Dialog "..
|
|
tostring(d_id)..", option "..tostring(o_id)..
|
|
", has multiple results of type dialog: "..
|
|
minetest.serialize(dialog_results)..". Please "..
|
|
"let someone with npc_master priv fix that first!"
|
|
yl_speak_up.log_change(pname, n_id, msg, "error")
|
|
if(pname) then
|
|
minetest.chat_send_player(pname, msg)
|
|
end
|
|
end
|
|
end
|
|
if(o_id and o and o.o_prerequisites) then
|
|
for p_id, p in pairs(o.o_prerequisites) do
|
|
if(p.p_type == "function") then
|
|
c_precon_exec_lua = c_precon_exec_lua + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
yl_speak_up.migration_npc_needs_priv(n_id, pname, c_effect_exec_lua, "effect_exec_lua")
|
|
yl_speak_up.migration_npc_needs_priv(n_id, pname, c_effect_give_item, "effect_give_item")
|
|
yl_speak_up.migration_npc_needs_priv(n_id, pname, c_effect_take_item, "effect_take_item")
|
|
yl_speak_up.migration_npc_needs_priv(n_id, pname, c_effect_move_player, "effect_move_player")
|
|
yl_speak_up.migration_npc_needs_priv(n_id, pname, c_precon_exec_lua, "precon_exec_lua")
|
|
end
|
|
|
|
|
|
yl_speak_up.check_all_npc_for_migration = function(pname)
|
|
local path = yl_speak_up.worldpath..yl_speak_up.path.."/"
|
|
local file_names = minetest.get_dir_list(path, false)
|
|
minetest.chat_send_player(pname, "There are "..tostring(#file_names).." NPCs with stored dialogs "..
|
|
"in folder "..path..".")
|
|
for i, fname in ipairs(file_names) do
|
|
local file, err = io.open(path..fname, "r")
|
|
io.input(file)
|
|
local content = io.read()
|
|
local dialog = minetest.parse_json(content)
|
|
io.close(file)
|
|
if type(dialog) ~= "table" then
|
|
dialog = {}
|
|
end
|
|
minetest.chat_send_player(pname, " Checking NPC "..tostring(fname).."...")
|
|
yl_speak_up.check_one_npc_for_migration(dialog, pname, string.sub(fname, 0, -6))
|
|
end
|
|
minetest.chat_send_player(pname, "Done with checking all NPC files for migration.")
|
|
-- store the changed privs
|
|
yl_speak_up.npc_privs_store()
|
|
return true
|
|
end
|
|
|
|
|
|
minetest.register_chatcommand( 'npc_talk_migrate', {
|
|
description = "Checks NPC from old yl_speak_up for migration to new version of the mod.",
|
|
privs = {npc_master = true},
|
|
func = function(pname, param)
|
|
return yl_speak_up.check_all_npc_for_migration(pname)
|
|
end
|
|
})
|