package methods // // IGameSceneToClient_SyncPlayerFallingDownState(68467726). isEnter=false is the explicit // exit from the knocked-out state whose HUD is the "昏迷" bar. Used by the revive endpoint; // nothing else on this server drives the FallingDown flow. // // // SyncUnitOccur(68870482) — UX.Game.IGameSceneToClient.SyncUnitOccur(UInt64, UInt32, Single, // UXVector3, Single). Signature read off the native method name in Auto.Client.dll: // NativeMethodInfoPtr_SyncUnitOccur_Public_Virtual_New_Void_UInt64_UInt32_Single_UXVector3_Single_0 // The reference private server sends this right after SyncRaidBattleUnitAgent; it announces the // unit "occurring" in the world and carries the spawn transform. // // // SyncBattleAiS(68555063) — the switch that moves a unit's behaviour tree onto the combat tree. // This is the third of the four engagement packets and the one that was missing. LockTarget // gives the unit a target and FightEdict gives it the attack token, but neither leaves idle: // the native side flips BaseUnit.set_IsBattleAiS and that is what selects CombatBehaviorTree // over the idle/ambient tree. Without it a spawned enemy stands still even though it is // hostile and locked on. // Field layout matches the donor build (7k-v0.4 GameRouter.EnemyAi.cs:143): agentId + bool. // // // Scene weapon snapshot used by SyncSpiritWeaponDetail. Unlike the persistent WeaponData stored in // PlayerInfo, WeaponDetail has five scene-source fields in front of the common weapon payload. // // // Atomic client WeaponManager hydration. The client must receive this before a switch action: // SyncSpiritSwitchWeaponAction only selects an instance already present in CurrWeaponSlots. // // Client -> GameScene AskSwitchWeapon(int index), zero-based. // Client -> GameScene AskUseSkill / AskClientUseCommonSkill.