-- What actually sits near the four ramp ENDS? The user reports ramps going -- through buildings; the clip probe only found pillars vs perimeter wall. -- So: name every non-drivable part within 140 studs of each ramp end, and -- separately list PA-area structures with their footprints, so the ramp -- can be re-aimed at a genuinely clear corridor instead of guessed at. local ws = game:GetService("Workspace") local map = ws:FindFirstChild("Map") if not map then return "NO MAP" end local WANT = { PAEntryRampNear_200 = true, PAExitRampNear_200 = true, PAEntryRampTrunk_1 = true, PAExitRampTrunk_1 = true, } local ends = {} local all = {} for _, d in ipairs(map:GetDescendants()) do if d:IsA("BasePart") then if WANT[d.Name] then ends[d.Name] = d.Position end table.insert(all, d) end end local function drivable(n) return n:match("^Road_") or n:find("Ramp") or n == "PAFloor" or n == "Ground" or n:find("Water") end local out = {} for n, p in pairs(ends) do local near = {} local closest, closeName = 1e9, "none" for _, d in ipairs(all) do if not drivable(d.Name) then local dist = (d.Position - p).Magnitude if dist < 140 then near[d.Name] = (near[d.Name] or 0) + 1 if dist < closest then closest, closeName = dist, d.Name end end end end local l = {} for k, v in pairs(near) do table.insert(l, ("%s x%d"):format(k, v)) end table.sort(l) local keep = {} for i = 1, math.min(#l, 10) do table.insert(keep, l[i]) end table.insert( out, ("%s @%.0f,%.0f,%.0f closest=%s(%.0f) near: %s"):format( n, p.X, p.Y, p.Z, closeName, closest, table.concat(keep, ", ") ) ) end -- PA-area structures with footprints so we can aim at a clear corridor. table.insert(out, "--- PA structures (within 700 of PA centre) ---") local paf = nil for _, d in ipairs(all) do if d.Name == "PAFloor" then paf = d end end if paf then local c = paf.Position table.insert(out, ("PAFloor centre %.0f,%.0f,%.0f size %.0fx%.0f"):format(c.X, c.Y, c.Z, paf.Size.X, paf.Size.Z)) local seen = {} local rows = {} for _, d in ipairs(all) do if not drivable(d.Name) and (d.Position - c).Magnitude < 700 then local base = d.Name:gsub("_%d+$", "") if not seen[base] then seen[base] = { minx = 1e9, maxx = -1e9, minz = 1e9, maxz = -1e9, n = 0 } end local s = seen[base] s.n += 1 s.minx = math.min(s.minx, d.Position.X - d.Size.X / 2) s.maxx = math.max(s.maxx, d.Position.X + d.Size.X / 2) s.minz = math.min(s.minz, d.Position.Z - d.Size.Z / 2) s.maxz = math.max(s.maxz, d.Position.Z + d.Size.Z / 2) end end for k, s in pairs(seen) do table.insert(rows, ("%s n=%d X[%.0f..%.0f] Z[%.0f..%.0f]"):format(k, s.n, s.minx, s.maxx, s.minz, s.maxz)) end table.sort(rows) for _, r in ipairs(rows) do table.insert(out, " " .. r) end end return table.concat(out, "\n")