-- Shared helper for Cathedral/Bastion WALK-IN portals only. -- NPC portals (9010247/9010248/5610070/5610071) stay click-only -- not listed here. S57_PortalCD = {} S57_TimerRunning = {} S57_MAPS = { [52648950] = true, -- s57_1 [52648182] = true, -- s57_2 [52648438] = true, -- s57_3 [52649974] = true, -- s57_5 [52649206] = true, -- s57_6 [52649462] = true, -- s57_7 } -- Walk-in only. No NPC floor portals (Cathedral 4/5, Bastion 4). S57_ScriptPortals = { -- Cathedral 1: room links + exit + to floor 2 -- Exit zone kept small so spawn (entry from Frontier) does not bounce back [52648950] = { -- Exit r small: Frontier spawn 26,32 must stay outside this zone {x = 23, z = 21, r = 6, map = 3390518568, tx = 920, ty = 200, tz = 1280}, {x = 315, z = 308, r = 8, map = 52648182, tx = 18, ty = 200, tz = 478}, -- Room r kept <=8 so landings do not sit inside the reverse portal {x = 38, z = 463, r = 8, map = 52648950, tx = 489, ty = 200, tz = 77}, {x = 500, z = 75, r = 8, map = 52648950, tx = 54, ty = 200, tz = 463}, {x = 182, z = 409, r = 8, map = 52648950, tx = 465, ty = 200, tz = 216}, {x = 465, z = 229, r = 8, map = 52648950, tx = 199, ty = 200, tz = 408}, {x = 390, z = 449, r = 8, map = 52648950, tx = 486, ty = 200, tz = 352}, {x = 497, z = 368, r = 8, map = 52648950, tx = 390, ty = 200, tz = 430}, {x = 140, z = 253, r = 8, map = 52648950, tx = 489, ty = 200, tz = 448}, {x = 499, z = 449, r = 8, map = 52648950, tx = 141, ty = 200, tz = 272}, }, -- Cathedral 2: room links + back to floor 1 + to floor 3 [52648182] = { {x = 17, z = 495, r = 8, map = 52648950, tx = 315, ty = 200, tz = 294}, {x = 497, z = 63, r = 8, map = 52648182, tx = 386, ty = 200, tz = 72}, {x = 384, z = 53, r = 8, map = 52648182, tx = 484, ty = 200, tz = 64}, {x = 412, z = 177, r = 8, map = 52648182, tx = 90, ty = 200, tz = 62}, {x = 78, z = 62, r = 8, map = 52648182, tx = 424, ty = 200, tz = 178}, {x = 417, z = 275, r = 8, map = 52648182, tx = 306, ty = 200, tz = 437}, {x = 288, z = 435, r = 8, map = 52648182, tx = 427, ty = 200, tz = 276}, {x = 438, z = 355, r = 8, map = 52648182, tx = 194, ty = 200, tz = 292}, {x = 186, z = 293, r = 8, map = 52648182, tx = 446, ty = 200, tz = 367}, {x = 253, z = 237, r = 8, random = { {map = 52648438, tx = 37, ty = 199, tz = 49}, {map = 52648438, tx = 32, ty = 199, tz = 470}, {map = 52648438, tx = 478, ty = 199, tz = 466}, {map = 52648438, tx = 462, ty = 199, tz = 41}, }}, }, -- Cathedral 3: walk-in back to floor 2 only (NPC 9010247 = deeper floors, click only) [52648438] = { {x = 32, z = 35, r = 6, map = 52648182, tx = 248, ty = 200, tz = 252}, {x = 38, z = 484, r = 6, map = 52648182, tx = 248, ty = 200, tz = 252}, {x = 484, z = 483, r = 6, map = 52648182, tx = 248, ty = 200, tz = 252}, {x = 457, z = 26, r = 6, map = 52648182, tx = 248, ty = 200, tz = 252}, }, -- Bastion 1 (exit r small so Frontier entry spawn does not bounce back) [52649974] = { {x = 422, z = 766, r = 6, map = 3390518568, tx = 1820, ty = 200, tz = 1300}, {x = 406, z = 272, r = 8, map = 52649206, tx = 211, ty = 1, tz = 476}, }, -- Bastion 2 [52649206] = { {x = 186, z = 451, r = 8, map = 52649974, tx = 390, ty = 1, tz = 274}, {x = 885, z = 417, r = 8, map = 52649462, tx = 621, ty = 0, tz = 135}, }, -- Bastion 3: back to floor 2 only (NPC 9010248 = Bastion 4, click only) [52649462] = { {x = 637, z = 137, r = 8, map = 52649206, tx = 889, ty = 1, tz = 394}, }, } -- Grace after map enter so landing next to a paired portal does not bounce function S57_GrantPortalGrace(RoleID) S57_PortalCD[RoleID] = os.time() end function S57_TryTeleportRole(MapID, InstanceID, RoleID) if S57_MAPS == nil or S57_MAPS[MapID] ~= true then return end local portals = S57_ScriptPortals[MapID] if portals == nil then return end local now = os.time() if S57_PortalCD[RoleID] ~= nil and (now - S57_PortalCD[RoleID]) < 3 then return end local x, y, z = unit.GetPosition(MapID, InstanceID, RoleID) if x == nil or z == nil then return end local i = 1 while portals[i] ~= nil do local p = portals[i] if math.abs(x - p.x) <= p.r and math.abs(z - p.z) <= p.r then S57_PortalCD[RoleID] = now if p.random ~= nil then local n = 0 while p.random[n + 1] ~= nil do n = n + 1 end local d = p.random[math.random(n)] role.RoleGotoNewMap(MapID, InstanceID, RoleID, d.map, d.tx, d.ty, d.tz) else role.RoleGotoNewMap(MapID, InstanceID, RoleID, p.map, p.tx, p.ty, p.tz) end return end i = i + 1 end end function S57_CheckAllPortals(MapID, InstanceID) local RoleTbl = map.GetMapAllRoleID(MapID, InstanceID) if RoleTbl == nil then return end for _, RoleID in pairs(RoleTbl) do if RoleID ~= nil and RoleID ~= 4294967295 then S57_TryTeleportRole(MapID, InstanceID, RoleID) end end end function S57_StartPortalTimer(MapID, InstanceID) local key = tostring(MapID) .. ":" .. tostring(InstanceID) if S57_TimerRunning[key] then return end S57_TimerRunning[key] = true map.MapCreateColCreature(MapID, InstanceID, 5600085, 1, 1, 1, 1) end function S57_OnPortalTimer(MapID, InstanceID) local key = tostring(MapID) .. ":" .. tostring(InstanceID) S57_TimerRunning[key] = false S57_CheckAllPortals(MapID, InstanceID) S57_StartPortalTimer(MapID, InstanceID) end