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. //