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/scene_item_grid_methods4229938.go
T

44 lines
2.9 KiB
Go
Raw Normal View History

package methods
//
// Scene items (可破坏物 / 街头道具 / 路灯 / 念动力目标) — the second client-owned world layer.
// Where gadgets ride SyncGadgetGridAOIDecrease(68956797), scene items ride
// SyncDestructibleGridAOIDecrease(68969593). The method name is destructible-flavoured
// but the receiver is the scene-item loader: GameSceneToClientImpl.SyncDestructibleGridAOIDecrease
// fans out to SceneItemMgr.SyncSceneItemGridAOIRemoveDecrease / …Increase / …AddDecrease,
// and …AddDecrease ends in SyncSceneItemGridAOIAddByIndex(x, z, exceptIds, sectorIdList,
// playerStandardIndex) — literally the call AnantaWorldMod makes by frida injection every 700 ms.
// ⇒ Pushing this mid from the server IS world_mod, without the injector.
// ⛑️⛑️ THE MID IS THE WHOLE TRICK (donor round 23C, user-verified on their build):
// · 68934309 SyncDestructibleGridAOIIncrease args carry ONLY aoiInfo
// (dump.cs TypeDefIndex 35754) — its receiver is bookkeeping. Pushing cells through it
// does nothing; that false negative is what made this channel look dead for rounds.
// · 68969593 carries the 3-part body (TypeDefIndex 35784: aoiInfo + addGridInfo + removeGridInfo)
// and its reader is ReadDestructibleGridAOIIncrease + ReadGridAOIDecrease ×2.
// · General law: for every *GridAOI* family the wire carrier is the *Decrease* twin.
// Do NOT regress this mid to 68934309.
// Wire rules are the same family rules as the gadget grid (handoff §A1 / 硬规则 29):
// · args root has NO presence byte (the reader goes straight into the first struct);
// · nullable field = ONE peek byte (0x00 null / non-zero present), 0x01 emitted;
// · list counts are BIASED 7-bit varints — empty list is `01 01`, never `01 00`.
//
//
// UX.Game.DestructibleInfo (dump.cs TypeDefIndex 33110) — one authored scene item.
// ⛑️ Only used here as the element type of an EMPTY list. The client's reader is polymorphic
// (ReadStaticDestructibleInfo jump table: 0=null, 1=BASE, 2=Dynamic, 3=Static, 4=Task —
// the order is NOT the declaration order in dump.cs), so a NON-EMPTY list needs a hand-written
// body: per item a tag byte (1 = BASE) followed by every field all-raw. Serializing this class
// directly would omit that tag and the client would parse the base fields as TaskDestructibleInfo
// ⇒ `parameter=DestructibleInfo` failures (donor round 23B, cost a full session).
// Keep the list empty unless that raw writer exists.
//
// UX.Game.SkillDestructibleInfo (TypeDefIndex 33113).
//
// UX.Game.DestructibleGridAOIIncrease (struct, TypeDefIndex 33104). Note it is SHORTER than
// the gadget twin: no activeIds / inactiveIds. Declaration order = dump field order.
//
//
// UXRPCMethodArgs68969593 (TypeDefIndex 35784) — three parts, in this order, no root marker.
// GridAOIDecrease is the very same struct the gadget grid uses (TypeDefIndex 32361), so it is
// reused rather than redeclared: sector list / building id / cell list / except ids.
//