fix: car now drives - collision groups, rigid hubs, pad spawn, anticheat grace

Four independent bugs kept the car immobile at the world origin:

1. Wheels collided with their own chassis. Wheel inner edge sits at 2.80
   vs body edge 3.00, and wheel top -0.20 vs body bottom -0.70. The
   overlap is intentional styling, but in one collision group the wheels
   ground against the body: motors spun ~1 rad/s against 20,000 torque.
   Wheels now use a CarWheel group that ignores CarChassis.

2. Suspension exploded on spawn. PrismaticConstraint+SpringConstraint
   between a 0.6-stud hub and the ballasted body was unstable enough to
   fling knuckles ~10,000,000 studs out, past FallenPartsDestroyHeight,
   deleting the wheels. Replaced with a rigid welded hub mount.

3. Car spawned at world origin, not the pad. MapBuilder made a SpawnPad
   part but no SpawnLocation, so characters spawned at (0,0,0) and Sit()
   dragged the car to them. Added a real SpawnLocation and the model is
   now pivoted after parenting, with the character teleported first.

4. AntiCheat snapped that legitimate spawn teleport back. An ~8,500-stud
   server move reads as a teleport hack. Added AntiCheat.grant() so
   server-initiated moves are exempt for a short grace window.

Verified in Studio: 881 studs in 6s, 496 studs/s top speed, 152 deg
steering, braking 33 -> 0 studs/s, chassis stays upright.
This commit is contained in:
2026-07-31 10:04:47 -04:00
parent 766fce5088
commit d45f35736a
5 changed files with 139 additions and 31 deletions
+8 -7
View File
@@ -42,13 +42,14 @@
"$className": "Lighting",
"$properties": {
"Technology": "Future",
"ClockTime": 0.0,
"Brightness": 1.0,
"Ambient": [0.05, 0.05, 0.1],
"OutdoorAmbient": [0.1, 0.1, 0.18],
"FogEnd": 900.0,
"FogColor": [0.03, 0.03, 0.08],
"EnvironmentDiffuseScale": 0.4,
"ClockTime": 14.0,
"Brightness": 2.0,
"Ambient": [0.35, 0.35, 0.38],
"OutdoorAmbient": [0.45, 0.46, 0.5],
"FogEnd": 6000.0,
"FogColor": [0.55, 0.6, 0.68],
"EnvironmentDiffuseScale": 1.0,
"EnvironmentSpecularScale": 1.0,
"GlobalShadows": true
}
}