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

86 lines
5.6 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
//
// 车库 / 停车(House Parking)契约 —— 2026-09-30 新增。
// <para>为什么之前什么都没有:这一族 9 条 RPC 在服务端一直是
// DefaultReturnCatalog4229938 的 shape="void" 兜底(空 body),
// 且 SyncHouseParking(64277819) / SyncHouseParkingEntityBinding(64060781)
// 两个 S2C 服务端从来不发。客户端 GarageManager.lua 的
// LeaveGarage 第一步就读 currentParkingInfo.ParkingVehicleUid,
// 而它只能由 SyncHouseParkingEntityBinding 填 —— 服务端不发 ⇒ 为空 ⇒
// FatalLog + return ⇒ 连 AskTeleportFromHouseGarage 都发不出去。
// 这就是用户报的「按 F 驶离车库没有后续 + 车不在车位出现 + 大门不开」。</para>
// <para>线格式来源(逐条取证,2026-09-30):
// <list type="bullet">
// <item>字段名 / 顺序 / 类型:dump.cs 的 UX.Game.HouseVehicleParkingInfo(TypeDef 32690)
// / HouseParkingInfo(32691) / HouseMoveParkingSpaceInfo(32692) /
// HouseParkingEntityBinding(32693),与 RPCSerializeAuto.lua 的
// Auto.WriteHouseVehicleParkingInfo / WriteHouseParkingInfo /
// WriteHouseMoveParkingSpaceInfo / WriteHouseParkingEntityBinding 交叉核对一致。</item>
// <item>列表计数编码:Int7(biased 7-bit varint,线上写 count+1),即
// UxSerializer 对 list 的默认值。⚠️ 2026-09-30 更正:先前误判为 Int32,
// 依据是「房产族全用 Int32」—— 那是 C# 侧契约(Auto.cs 的
// HousesInfo.HouseInfoList 等)。车库这一族在两侧都是 Int7:
// <list type="bullet">
// <item>S2C:RPCDeserializeAuto.lua 的 midToReader[64277819] /
// midToReader[64060781] 都用 Base.ReadList7Bit,
// 而 RPCDeserializeBase.lua 里 ReadList7Bit 读 ReadInt7Bit、
// ReadList 读 ReadInt32 —— 两者确实不同。</item>
// <item>C2S:ClientToGameDelegate.lua 的 AskHouseParking_Serializer /
// AskHouseMoveParkingSpace_Serializer / AskHouseCancelParking_Serializer
// 全部用 SerializeBase.WriteList7Bit;RPCSerializeBase.lua 里它写
// Write7BitEncodedInt(num)(该 UX 版方法即 biased 写法,空表 = 01)。</item>
// </list></item>
// <item>列表元素编码:对象列表 = Complex(每个元素前一个 0xFF),
// 与 Base.ReadComplex(r, Auto.Reader[336]) / WriteComplexWrap(..., nullable:false) 一致。</item>
// <item>参数外壳:args 一律 [UxContract(Inline = true)](不写 0xFF 头)——
// 两侧的生成代码都是「裸着按顺序写各参数」,没有外层对象标记。</item>
// </list>
// <para>⚠️ 更正:SyncHouseParking / SyncHouseParkingEntityBinding
// 不是 CSharpOnly —— 它们在 RPCDeserializeAuto.lua 里都有 Lua reader
// (编号 64277819 / 64060781),所以 Lua 侧就是权威,线格式以 Lua 为准。</para>
//
// ---------------------------------------------------------------------------------------------
// 数据元素(Complex,列表里每个元素前写一个 0xFF)
// ---------------------------------------------------------------------------------------------
// SyncHouseParking 的 addInfoList / cancelInfoList 元素。
// dump.cs 32690 / RPCSerializeAuto.lua WriteHouseVehicleParkingInfo:
// HouseId(u32) + VehicleId(u32) + ParkingSpaceIndex(i32)。
// 客户端 Auto.Reader[336] 同序。
// SyncHouseParkingEntityBinding 的 bindingList 元素。
// dump.cs 32693 / WriteHouseParkingEntityBinding:
// VehicleId(u32) + EntityId(u64) + ParkingSpaceIndex(i32)。客户端 Auto.Reader[290] 同序。
// AskHouseParking 的 parkingInfoList 元素。
// dump.cs 32691 / WriteHouseParkingInfo:HouseId(u32) + VehicleId(u32)。
// AskHouseMoveParkingSpace 的 moveParkingSpaceInfoList 元素。
// dump.cs 32692 / WriteHouseMoveParkingSpaceInfo:
// VehicleId(u32) + HouseId(u32) + ParkingSpaceIndex(i32)。客户端 Auto.Reader[1141] 同序。
// ---------------------------------------------------------------------------------------------
// S2C(服务端 → 客户端)
// ---------------------------------------------------------------------------------------------
//
// SyncHouseParking(64277819) —— 进车库后「哪个车位停着哪辆车」。
// 客户端 GarageManager.SyncHouseParking(cancelInfoList, addInfoList) 消费:
// addInfoList 会填 currentParkingInfo.ParkingInfo[ParkingSpaceIndex+1] = VehicleId
// 并触发「进车库演出」→ 演出结束自己发 AskCreateHouseParkingVehicles。
// 服务端在玩家「调取载具 / 入库」时推这一条。
//
//
// SyncHouseParkingEntityBinding(64060781) —— 每辆车 spawn 之后的 EntityId 回填。
// 这是「按 F 驶离车库」能不能走下去的命门:客户端
// currentParkingInfo.ParkingVehicleUid[ParkingSpaceIndex+1] = EntityId,
// 而 LeaveGarage 第一行就查它。
//
// ---------------------------------------------------------------------------------------------
// C2S(客户端 → 服务端)—— 都是 Inline 外壳(与门族一致:无 0xFF 头)
// ---------------------------------------------------------------------------------------------
// AskHouseParking(63154177):List&lt;HouseParkingInfo&gt;。
// AskHouseMoveParkingSpace(63780060):List&lt;HouseMoveParkingSpaceInfo&gt;。
// AskHouseCancelParking(63495236):List&lt;uint&gt;。
// AskTeleportToHouseGarage(63099218):uint houseId, int parkingSpaceIndex。
// AskTeleportFromHouseGarage(63203581):uint houseId, int parkingSpaceIndex, uint vehicleConfigId。
// AskCreateHouseParkingVehicles(63479109):uint houseId。
// AskDestroyHouseParkingVehicles(63266373):uint houseId。
// GmHouseParking(65027125):List&lt;uint&gt; houseIdList, List&lt;uint&gt; vehicleIdList。
// GmHouseCancelParking(65601170):List&lt;uint&gt; vehicleIdList。