54 lines
2.7 KiB
Go
54 lines
2.7 KiB
Go
package routers
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"sync"
|
||
|
|
)
|
||
|
|
|
||
|
|
var _ = sync.Mutex{}
|
||
|
|
var _ = context.Background
|
||
|
|
|
||
|
|
//
|
||
|
|
// AskMetroGadgetIds(67809129) — the missing half of the metro carriages.
|
||
|
|
// What the client does: it builds the LightRail prefab on its own (see the captured hierarchy
|
||
|
|
// LightRail_4_405/carriage1|2/Seats/Gadgets_888_LightRailChair03_*), then asks the server
|
||
|
|
// which gadget instance ids belong to that train. Every SpoonSlotComponent on a seat needs a
|
||
|
|
// gadget hold before it yields a "sit down" button, and the hold comes from this reply.
|
||
|
|
// Before 2026-09-23 this method had no handler at all, so the answer was the typed-default empty
|
||
|
|
// list (see the log line "unimplemented AskMetroGadgetIds -> typed-default list7-empty 2b"), which
|
||
|
|
// is why the seats inside our carriages stay inert while AnantaTrainSeatLoader.exe can wake them
|
||
|
|
// up by calling SpoonSlotComponent.Init() directly through frida.
|
||
|
|
// Option A (implemented here): hand back invented but stable ids from the server's own 9.5e12
|
||
|
|
// gadget band. The client only needs an id to bind the local seat slot to. If seats still stay
|
||
|
|
// dead, the fallback is option B — really spawn the chairs through SyncGadgetAdd(68843189) with
|
||
|
|
// the LightRailChair pathIds (843740076 / 1058671153 / 267309514 / 1181678445, iScale must be 0)
|
||
|
|
// and return those instance ids instead.
|
||
|
|
// Rollback: world.content.metroGadgets.enabled = false.
|
||
|
|
//
|
||
|
|
func GameRouter_MetroGadget_OnAskMetroGadgetIds(ctx context.Context, conn any, msg any) any {
|
||
|
|
// Router implementation for GameRouter_MetroGadget_OnAskMetroGadgetIds
|
||
|
|
var zero any; return zero
|
||
|
|
}
|
||
|
|
|
||
|
|
//
|
||
|
|
// 同车型(同一 RailCarriageConfig 布局类)里有没有已经配好座位数的兄弟模板?
|
||
|
|
// 有就借用它的值 —— 比退化成 defaultCarriageSeats 更接近真值。
|
||
|
|
// ⛑ 必须按 key 升序取第一个:Dictionary 的遍历顺序没有保证,同车型存在
|
||
|
|
// 多个已配值时会取到随机的那个(见 WarnSeatConflict)。
|
||
|
|
//
|
||
|
|
func GameRouter_MetroGadget_FindSiblingSeats(ctx context.Context, cfg any, layoutClass string, conn any) any {
|
||
|
|
// Router implementation for GameRouter_MetroGadget_FindSiblingSeats
|
||
|
|
var zero any; return zero
|
||
|
|
}
|
||
|
|
|
||
|
|
//
|
||
|
|
// 同一布局类里配了不一样的座位数 —— 一定是某次实测数错了,喊出来(每条只喊一次)。
|
||
|
|
// 2026-09-27 现况:Vehicle03/End 同时有 tpl4=4 与 tpl9=6,而两者
|
||
|
|
// TemplateName(Vehicle03/CarriageOnEnd) 与 ViewModelName(View_Blue_End)
|
||
|
|
// 完全相同,只差 IsRevert(镜像)⇒ 座位数本该一样,现在必有一个是错的。
|
||
|
|
//
|
||
|
|
func GameRouter_MetroGadget_WarnSeatConflict(ctx context.Context, layoutClass string, values any, conn any) any {
|
||
|
|
// Router implementation for GameRouter_MetroGadget_WarnSeatConflict
|
||
|
|
var zero any; return zero
|
||
|
|
}
|
||
|
|
|