Vampires need sleeping people. Build a long corridor with couple of doors to the vampire's room. Usually the liaison waits at the first door (already built). Unlock the newly built doors in the corridor, the vampire will start running to the fortress (to any sleeper actually), but at the same time the liaison will either repath (let him) or better yet unlock the first door, which will allow the liaison to go inside, then lock all doors. They will meet.
After meeting, unlock the doors in the corridor, and slowly progress the game till they are separated by doors. Usually the vampire will be well ahead, so you can lock it somewhere on the way, and let the liaison out using the original first door.
Or, if you have dfhack, you can cheat a bit and temporarily disable the hunger of vampire (save it as sate-vampires.lua in \hack\scripts\ directory and run "sate-vampires" from dfhack's console):
-- sate vampires, best use with repeat.
local help = [====[
sate-vampires
=============
Sates all vampires.
You may use it with repeat in onLoad.init
Example:
repeat -name sate-vampires -time 14 -timeUnits days -command [ sate-vampires ]
]====]
---------------CONFIGURATION---------------
local LOG_SATIATION=false --set to true to log instance of every satiation
local LOG_SUCKER=false --set to true to also log ID of a vampire
------------END-OF-CONFIGURATION-----------
local utils = require 'utils'
local sucker=""
function get_date (year,ticks)
local f_Year,f_Month,f_Day,f_tmp=nil,0,0,0
if not year then return nil end
if year and not ticks then
return year,0,0
end
ticks=tonumber(ticks)
if ticks < 0 then ticks = 0 end
if ticks > 403200 then ticks = 403200 end
f_Year=tonumber(year)
f_Month=math.floor(ticks/33600)+1
f_tmp=(ticks/33600)-(math.floor(ticks/33600))
f_Day=math.floor(f_tmp*28)+1
return f_Year,f_Month,f_Day
end
-- Main program:
local args = utils.processArgs({...}, validArgs)
if args.help then
print(help)
return
end
if #df.global.world.units.all>0 then
for k,v in ipairs(df.global.world.units.all) do
if not v.flags2.killed then
if #v.status.misc_traits>0 then
for kk,vv in ipairs(v.status.misc_traits) do
if vv.id==50 then
vv.value=0
if LOG_SUCKER then sucker=string.format(" [ID %s]",v.id) else sucker="" end
if LOG_SATIATION then dfhack.gui.writeToGamelog(string.format("Vampire%s sated on %s-%s-%s.",sucker,get_date(df.global.cur_year,df.global.cur_year_tick))) end
end
end
end
end
end
end
This will make the vamp sated, and it will try to feed only after the next three months or so.