Daikoku PA: lift mainline over the apron, rebuild both ramps
The PA ring road and the expressway mainline were both at ground level, so the ring parapet stood INSIDE the carriageway (measured -10.0 studs of vertical overlap: a wall in the middle of the road). Reference photos of the real Daikoku Futo PA show the expressway flying OVER the parking apron on pillars, with the PA at ground level and ramps climbing up to meet it. Rebuilt to match: - mainline lifted 38 studs through the junction, eased in/out (max 5.26% grade, within real expressway limits) - PA ring + apron stay at ground level; legacy PARingPillar props removed - both on/off ramps regraded over the full rise with smoothstep easing, segments overlapped 3 studs so wheels can't catch a seam, plus support pillars and edge kerbs where the deck is high Verified in-engine against built parts (tools/diag_daikoku.luau), not just source: clearance now +28.0 studs, both ramps continuous (max step 5.62, no gaps). tools/plot_daikoku.py renders the plan/section for comparison.
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
--[[
|
||||
diag_frontjoint.luau -- is the front wheel still ATTACHED?
|
||||
|
||||
My RWD change returns early before creating the motor hinge, which is the
|
||||
ONLY joint that ever connected Wheel_F* to Knuckle_F*. If nothing else
|
||||
joins them, the front wheels are now free-floating parts that merely start
|
||||
in the right place -- which would explain both observations at once:
|
||||
the servo turns perfectly (it has nothing to fight) AND the car generates
|
||||
no lateral force (the front tyres are not attached to the chassis).
|
||||
|
||||
The same doubt applies to the earlier V7 "front motors disabled" result:
|
||||
Enabled=false may have freed the servo for the same wrong reason.
|
||||
]]
|
||||
|
||||
local ServerScriptService = game:GetService("ServerScriptService")
|
||||
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||
local RunService = game:GetService("RunService")
|
||||
|
||||
local out = {}
|
||||
local function log(...)
|
||||
local parts = {}
|
||||
for i = 1, select("#", ...) do
|
||||
parts[#parts + 1] = tostring((select(i, ...)))
|
||||
end
|
||||
table.insert(out, table.concat(parts, " "))
|
||||
end
|
||||
|
||||
local Shared = ReplicatedStorage:FindFirstChild("Shared")
|
||||
local Cars = require(Shared.Cars)
|
||||
local Chassis = require(Shared.Chassis)
|
||||
|
||||
local orig = ServerScriptService:FindFirstChild("Server", true):FindFirstChild("CarManager")
|
||||
local clone = orig:Clone()
|
||||
clone.Parent = orig.Parent
|
||||
local CarManager = require(clone)
|
||||
|
||||
local pad = Instance.new("Part")
|
||||
pad.Size = Vector3.new(6000, 8, 6000)
|
||||
pad.Position = Vector3.new(0, 5000, 0)
|
||||
pad.Anchored = true
|
||||
pad.Parent = workspace
|
||||
local padTop = pad.Position.Y + 4
|
||||
|
||||
local car = Cars.Get("gtr_r34")
|
||||
local tuning = Chassis.tuningFor(car)
|
||||
local model = CarManager._buildForDiag(car, tuning)
|
||||
model.Parent = workspace
|
||||
model:PivotTo(CFrame.new(0, padTop + 3, 0))
|
||||
|
||||
local function get(n)
|
||||
for _, d in ipairs(model:GetDescendants()) do
|
||||
if d:IsA("BasePart") and d.Name == n then
|
||||
return d
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
log("Joints touching each WHEEL part:")
|
||||
for _, wn in ipairs({ "Wheel_FL", "Wheel_FR", "Wheel_RL", "Wheel_RR" }) do
|
||||
local w = get(wn)
|
||||
local found = {}
|
||||
for _, d in ipairs(model:GetDescendants()) do
|
||||
local p0, p1, kind
|
||||
if d:IsA("WeldConstraint") then
|
||||
p0, p1, kind = d.Part0, d.Part1, "Weld"
|
||||
elseif d:IsA("Constraint") then
|
||||
p0 = d.Attachment0 and d.Attachment0.Parent
|
||||
p1 = d.Attachment1 and d.Attachment1.Parent
|
||||
kind = d.ClassName .. "/" .. d.Name
|
||||
end
|
||||
if p0 and p1 and (p0 == w or p1 == w) then
|
||||
found[#found + 1] = string.format("%s(%s<->%s)", kind, p0.Name, p1.Name)
|
||||
end
|
||||
end
|
||||
log(string.format(" %-10s %s", wn, #found > 0 and table.concat(found, " ") or "*** NO JOINTS -- DETACHED ***"))
|
||||
end
|
||||
|
||||
-- Drop test: a detached wheel will not follow the body when the body is moved.
|
||||
log("")
|
||||
log("TELEPORT TEST (move body 300 studs; attached wheels follow):")
|
||||
local body = model.PrimaryPart
|
||||
for _ = 1, 60 do
|
||||
RunService.Heartbeat:Wait()
|
||||
end
|
||||
local before = {}
|
||||
for _, wn in ipairs({ "Wheel_FL", "Wheel_RL" }) do
|
||||
before[wn] = get(wn).Position
|
||||
end
|
||||
model:PivotTo(model:GetPivot() * CFrame.new(0, 0, -300))
|
||||
for _ = 1, 60 do
|
||||
RunService.Heartbeat:Wait()
|
||||
end
|
||||
for _, wn in ipairs({ "Wheel_FL", "Wheel_RL" }) do
|
||||
local w = get(wn)
|
||||
local moved = (w.Position - before[wn]).Magnitude
|
||||
log(
|
||||
string.format(
|
||||
" %-10s moved %7.1f studs %s",
|
||||
wn,
|
||||
moved,
|
||||
moved > 100 and "followed the car" or "*** LEFT BEHIND (detached) ***"
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
model:Destroy()
|
||||
pad:Destroy()
|
||||
clone:Destroy()
|
||||
return table.concat(out, "\n")
|
||||
Reference in New Issue
Block a user