41 lines
2.5 KiB
Go
41 lines
2.5 KiB
Go
package methods
|
|
|
|
//
|
|
// SyncGadgetGridAOIDecrease(68956797) — the world-streaming channel that makes the client
|
|
// materialize its OWN authored props, so the server never needs a placement table.
|
|
// This is the server-side equivalent of what AnantaGadgetLoader does by injection: the loader
|
|
// calls GadgetMgr.SyncGadgetGridAOIAddByIndex(cx, cz, exceptIds, sectorIds, gridIndex)
|
|
// in-process (frida). The RPC below carries the same information over the wire — the client's
|
|
// GameSceneToClientImpl.SyncGadgetGridAOIDecrease then loads the cells from its local
|
|
// GadgetBlob. Verified end-to-end by the donor server (HANDOFF round 12: vending machines,
|
|
// outfit stations, street signs and elevators appeared with no injection at all).
|
|
// ⛑️ Naming trap: only the *Decrease* side has a method id. The add is carried inside
|
|
// GadgetGridAOIIncrease aoiInfo — the same message both adds and removes.
|
|
// Wire rules — verified against GameAssembly, NOT against the donor handoff (which had the
|
|
// count encoding backwards and cost a whole session):
|
|
// · every nullable field = ONE peek byte (0x00 = null and consumed, non-zero = present
|
|
// and consumed). We emit 0x01. Nested structs carry no marker at all.
|
|
// · list/dict counts are **BIASED** 7-bit varints: written as count+1, read back as
|
|
// varint()-1. The count helper in GameAssembly ends with `dec eax` (0x94100A6) and takes
|
|
// only the reader — there is no raw variant. So an empty list is `01 01`, and writing raw
|
|
// `01 00` makes the client compute capacity = -1 and throw
|
|
// `ArgumentOutOfRangeException: Non-negative number required. (Parameter 'capacity')`.
|
|
//
|
|
// UX.Game.GridIndex — a 40 m world cell (dump.cs TypeDefIndex 32360).
|
|
// UX.Game.GadgetClientDropLimitInfo (TypeDefIndex 33129).
|
|
// UX.Game.GadgetExtraSyncInfo (TypeDefIndex 33131) — per-message drop-limit extras.
|
|
//
|
|
// UX.Game.GridAOIDecrease (TypeDefIndex 32361) — "these cells, in these sectors, minus
|
|
// these ids". Doubles as the add side because the client resolves the cells from its blob.
|
|
//
|
|
//
|
|
// UX.Game.GadgetGridAOIIncrease (TypeDefIndex 33128) — the delta lists. We stream cells only,
|
|
// so every list here stays empty; reason is what tells the client why it got the push.
|
|
//
|
|
// UXRPCMethodArgs68956797 (dump.cs TypeDefIndex 35773).
|
|
//
|
|
// Inline = true: the client reader for this method id goes straight into
|
|
// ReadGadgetGridAOIIncrease (GameAssembly 0x95068FC) and never peeks a root presence byte.
|
|
// Most other args families DO expect one; this one does not.
|
|
//
|