42 lines
3.2 KiB
Go
42 lines
3.2 KiB
Go
package methods
|
||
|
||
//
|
||
// T3-7 真实车流 —— 车道推进包。
|
||
// 契约权威 = IL2CPP dump(`ux_rpc/ux_game_all.dump.cs`)里的 IGameSceneToClient 签名:
|
||
// public abstract void SyncAetherAIVehicleLaneDatas(List<ClientVehicleLaneData> data,
|
||
// List<ClientVehicleLaneChangeData> laneChangeData, double timeStamp);
|
||
// ★ 服务端只推「车道 handle + 沿车道里程」,位置和朝向由客户端按本地 ZoneGraph 曲线插值:
|
||
// AetherCity.dll → AetherVehicleManager.OnSyncAetherVehicleLaneData
|
||
// → VehicleDataEntity.ProcessSyncVehicleLaneData
|
||
// → MassTrafficInterpolationUtils.InterpolatePositionAndOrientationAlongLane
|
||
// 所以 distance 只要单调推进即可,服务端不需要知道车道的真实形状。
|
||
//
|
||
// ClientVehicleLaneData(TypeDefIndex 32662):u64 Id / i32 LaneHandle / f32 DistanceAlongLane / u8 Status。
|
||
// ClientVehicleLaneChangeData(TypeDefIndex 32663):变道专用,T3-7 阶段不下发(列表留空)。
|
||
//
|
||
// SyncAetherAIVehicleLaneDatas = 68771276。三参数 RPC,顶层不带 0xFF Complex 标记,
|
||
// 所以这里用 Inline(= Struct)契约按声明顺序直接铺三个参数。
|
||
//
|
||
// ⛔ 2026-10-01 删除:这里曾经新加过一个同名的 `SyncVehicleAutonomousDrivingState4229938`
|
||
// (u64+bool),与 2026-09-27 就有的 `Methods.GameScene.VehicleNavigationMethods4229938.cs:105`
|
||
// **完全重复**(同为 u64+bool Inline,且那份已过 lua reader + _ux_wire_check 9B 验证)。
|
||
// 车流一律用 GameScene 那一份(别名 `SceneMethods`),**别再在这里复制第二份**。
|
||
// SyncAetherAIVehicleRemove = 68906718:ulong pid。
|
||
//
|
||
// SyncAetherAIVehicleForceGo = 68832908 —— ulong instanceId + bool forceGo。
|
||
// 客户端 handler(真存在,不是我们编的):
|
||
// LX6.Service.GameSceneToClientImpl.SyncAetherAIVehicleForceGo(ulong instanceId, bool forceGo)
|
||
// (RVA 0x08656D70,源码见 _downloads/Assembly-CSharp-src/Assembly-CSharp/Lx6/Service/GameSceneToClientImpl.cs:24)。
|
||
// 与 SyncVehicleHackableState(63563263+) 一样是 ulong+bool 两参数,故照抄其线格(Inline 顺序铺)。
|
||
// ★ 为什么要发它:客户端 AetherVehicleViewManager 有一套**距离驱动的 GO 提升**:
|
||
// 20m 内进候选(`CANDIDATE_GO_DISTANCE_SQ=400`)、8m 内强制提升(`FORCE_GO_DISTANCE_SQ=64`),
|
||
// 同屏最多 8 台 GO(`MAX_VEHICLE_COUNT=8`,切场景时随 `[City.UpdateSettings]` 打进 Player.log)。
|
||
// 提升成 GO 后车**不再吃 Aether 车道插值**,改由客户端本地(Mass)接管;
|
||
// 我们的车是服务端模拟的、不在客户端本地车流里 ⇒ **没人开 ⇒ 冻在原地**。
|
||
// 这就是用户看到的「我一靠近车,车就停了 / 追上去它又停 / 身边都是车他们又不开」。
|
||
// 官方服务端必然会给自己的 Aether 车发这条标记(否则双駆动打架),我们以前没发 ⇒ 客户端自己提了 GO。
|
||
// ⛑ 语义待实测确认:`forceGo=false` 我们期望 =「这台不要用 GO」;若客户端只把它当
|
||
// 「取消强制」(不影响自动提升),则本包无效,届时只能退回注入器方案
|
||
// (hook `AetherVehicleViewManager:CheckShouldNotUseGo` 恒返回 true,RVA 0x0B108F00)。
|
||
//
|