Files
Ananta-ps/pkg/protocol/methods/gadget_grid_methods4229938.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.
//