This repository has been archived on 2026-10-31. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Ananta-ps/pkg/protocol/methods/vehicle_traffic_methods4229938.go

42 lines
3.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)。
//