I think I've finally found a way to unblock stalled meetings (due to position holder replacements) without killing or driving away petitioners.
unblockmeetings.lua -- Work around for blocked meetings where a change of position holder causes the meeting activities to
-- stall. The somewhat heavy handed approch wipes all meeting activities from the participants and the
-- internal store and relies on DF's ability to rebuild the ones that should actually be there.
--
function unblockmeetings ()
if not dfhack.isWorldLoaded () or not dfhack.isMapLoaded () then
dfhack.printerr ("Error: This script requires an embark to be loaded.")
return
end
dfhack.println ("Deleting " .. tostring (#df.global.ui.meeting_requests) .. " meeting requests")
for i = #df.global.ui.meeting_requests - 1, 0, -1 do
df.global.ui.meeting_requests:erase (i)
end
dfhack.println ("Deleting " .. tostring (#df.global.ui.activities) .. " activities")
for i = #df.global.ui.activities - 1, 0, -1 do
for k = #df.global.ui.activities [i].unit_actor.specific_refs - 1, 0, -1 do
if df.global.ui.activities [i].unit_actor.specific_refs [k].type == 4 then -- ACTIVITY
dfhack.println ("Removing actor ACTIVITY from " .. dfhack.TranslateName (df.global.ui.activities [i].unit_actor.name, true))
df.global.ui.activities [i].unit_actor.specific_refs:erase (k)
end
end
for k = #df.global.ui.activities [i].unit_noble.specific_refs - 1, 0, -1 do
if df.global.ui.activities [i].unit_noble.specific_refs [k].type == 4 then -- ACTIVITY
dfhack.println ("Removing noble ACTIVITY from " .. dfhack.TranslateName (df.global.ui.activities [i].unit_noble.name, true))
df.global.ui.activities [i].unit_noble.specific_refs:erase (k)
end
end
df.global.ui.activities:erase (i)
end
end
unblockmeetings ()
The script has only been tested to a limited extent (I've had a petitioner on route to a meeting, swapped out the expedition leader, ran the script, verified that the visitor did petition, dismissed the petitioner, waited until another petitioner showed up on the petitioner screen). I haven't tried it with diplomats. It may possibly remove things that should be retained in the data structures (I didn't have anything extra in my test case), but I don't know if there are other things that can show up there.
The code is stored in a "text" file called unblockmeetings.lua in the <DF>\hacks\scripts folder and is invoked by typing "unblockmeetings" in the DFHack command console.