跳到正文
Gbatemp· morarin·· 8 小时前AI 评分15

月光峰 [01005E9027E08000/01008C8025C8E000]

Moonlight Peaks [01005E9027E08000/01008C8025C8E000]

AI 导读

月光峰 [01005E9027E08000/01008C8025C8E000] 的钩子代码钩入 Inventory.Sort(),背包激活时自动添加特定物品。其筛选 Placeable|Pickupable|Movable 且非定制/消耗品的 GridObject 调用 AddItem 与 Discover。

正文
0BB2A700    BL      0C44050C                  // Hook in Inventory.Sort() (original: LDR X1, [X0,#0x20])

0C44050C    LDR     X8, [SP,#0x8]             // Caller LR
0C440510    ADRP    X9, 0BCD9000
0C440514    ADD     X9, X9, #0xBF0            // PlayerGlobalInventoryState.OnActivate return
0C440518    CMP     X8, X9
0C44051C    B.EQ    0C440528                   // Run only from inventory-screen activation
0C440520    LDR     X1, [X0,#0x20]             // Original instruction
0C440524    RET

0C440528    STP     X23, X30, [SP,#-0x60]!    // X19-X22 already saved by host; save X23/LR + locals
0C44052C    LDR     X22, [X0,#0x20]            // ItemBundleLibrary.InventorySortingOrder

0C440530    LDR     X8, [X0,#0xD0]             // GlobalInventoryBundle
0C440534    LDR     X8, [X8,#0x40]             // SubBundles
0C440538    LDR     X8, [X8,#0x10]             // List._items
0C44053C    LDR     X9, [X8,#0x68]             // GlobalInventoryBundle.SubBundles[9]
0C440540    STR     X9, [SP,#0x38]             // Exclusion bundle A

0C440544    LDR     X9, [X0,#0x70]             // FarmHelpersBundle
0C440548    STR     X9, [SP,#0x40]             // Exclusion bundle B

0C44054C    LDR     X9, [X8,#0x40]             // GlobalInventoryBundle.SubBundles[4]
0C440550    LDR     X9, [X9,#0x40]             // .SubBundles
0C440554    LDR     X9, [X9,#0x10]             // List._items
0C440558    LDR     X9, [X9,#0x20]             // .SubBundles[0]
0C44055C    STR     X9, [SP,#0x48]             // Exclusion bundle C

0C440560    ADRP    X8, 0F4A7000
0C440564    LDR     X0, [X8,#0x978]            // ItemAsset generic context
0C440568    BL      0492D510                   // Asset.GetAll<ItemAsset>()
0C44056C    LDP     X9, X21, [X0,#0x10]        // _items / _size
0C440570    ADD     X20, X9, #0x20             // First ItemAsset

0C440574    LDR     X23, [X20],#0x8            // Next ItemAsset

0C440578    LDR     X8, [X23,#0xC8]            // GridObjectAddon
0C44057C    CBZ     X8, 0C440680               // Not a grid object -> skip
0C440580    LDR     W9, [X8,#0x74]             // GridObjectAddon.ControlTypes
0C440584    AND     W10, W9, #0xE              // Placeable | Pickupable | Movable
0C440588    CMP     W10, #0xE
0C44058C    B.NE    0C440680                   // Require all three

0C440590    LDR     X8, [X23,#0xE8]            // CustomizationAddon
0C440594    CBNZ    X8, 0C440680               // Exclude customization items
0C440598    LDR     X8, [X23,#0xD0]            // ConsumableAddon
0C44059C    CBNZ    X8, 0C440680               // Exclude consumables
0C4405A0    LDR     X8, [X23,#0x1C8]           // CustomizationKitAddon
0C4405A4    CBNZ    X8, 0C440680               // Exclude customization kits

0C4405A8    LDR     X0, [SP,#0x38]             // Exclusion bundle A
0C4405AC    MOV     X1, X23
0C4405B0    BL      0BA6E5C0                   // ItemBundleAsset.Contains()
0C4405B4    CBNZ    W0, 0C440680               // In excluded bundle -> skip

0C4405B8    LDR     X0, [SP,#0x40]             // FarmHelpersBundle
0C4405BC    MOV     X1, X23
0C4405C0    BL      0BA6E5C0                   // ItemBundleAsset.Contains()
0C4405C4    CBNZ    W0, 0C440680               // Farm helper -> skip

0C4405C8    LDR     X8, [X23,#0xC8]            // GridObjectAddon
0C4405CC    LDR     W8, [X8,#0x74]             // ControlTypes
0C4405D0    CMP     W8, #0xE
0C4405D4    B.NE    0C4405E8                   // Extra exclusion only for exact 0xE

0C4405D8    LDR     X0, [SP,#0x48]             // Exclusion bundle C
0C4405DC    MOV     X1, X23
0C4405E0    BL      0BA6E5C0                   // ItemBundleAsset.Contains()
0C4405E4    CBNZ    W0, 0C440680               // In excluded bundle -> skip

0C4405E8    LDR     X8, [X23,#0x40]            // ItemAsset.Bundles
0C4405EC    LDR     W8, [X8,#0x18]             // List._size
0C4405F0    CBNZ    W8, 0C4405FC               // Has bundle -> accept
0C4405F4    LDR     X8, [X23,#0xC0]            // CraftableAddon
0C4405F8    CBNZ    X8, 0C440680               // Exclude unbundled craftables

0C4405FC    ADD     X0, SP, #0x10              // ItemEntry*
0C440600    MOV     X1, X23                    // ItemAsset*
0C440604    BL      0BA738A0                   // ItemEntry::.ctor(ItemAsset)

0C440608    MOV     X0, X23
0C44060C    BL      0BA6CAF0                   // ItemAsset.get_MaxStackSize()
0C440610    STR     W0, [SP,#0x30]             // maxStackSize
0C440614    LDRB    W23, [X23,#0xB0]           // ItemAsset.UsesQualities

0C440618    MOV     X0, X19                    // Inventory*
0C44061C    ADD     X1, SP, #0x10              // ItemEntry*
0C440620    LSL     W2, W23, #1                // None(0) / QualitySame(2)
0C440624    MOV     W3, WZR                    // includeTransit = false
0C440628    BL      0BB2A1D0                   // Inventory.GetAmount()

0C44062C    LDR     W8, [SP,#0x30]
0C440630    SUBS    W8, W8, W0                 // maxStackSize - current
0C440634    B.LE    0C440648                   // Already full
0C440638    STR     W8, [SP,#0x14]             // ItemEntry.Amount
0C44063C    MOV     X0, X19
0C440640    ADD     X1, SP, #0x10
0C440644    BL      0BB0EBF0                   // Inventory.AddItem()

0C440648    CBZ     W23, 0C440664              // No quality variants
0C44064C    LDR     W8, [SP,#0x10]             // ItemEntry.ItemQualityLevel
0C440650    ADD     W8, W8, #1                 // Next quality
0C440654    CMP     W8, #3
0C440658    B.EQ    0C440664                   // Regular / Good / Perfect done
0C44065C    STR     W8, [SP,#0x10]
0C440660    B       0C440618                   // Fill next quality

0C440664    LDR     X0, [SP,#0x28]             // ItemEntry.itemRef
0C440668    LDR     X0, [X0,#0x20]             // ItemAsset*
0C44066C    BL      0BA6CA00                   // ItemAsset.get_ItemPersistence()
0C440670    CBZ     X0, 0C440680
0C440674    LDR     X0, [X0,#0x30]             // AlmanacDiscovery
0C440678    CBZ     X0, 0C440680
0C44067C    BL      0BB66940                   // ItemDiscoveryPersistenceEntry.Discover()

0C440680    SUBS    W21, W21, #1               // --itemCount
0C440684    B.NE    0C440574                   // Next ItemAsset

0C440688    MOV     X1, X22                    // Restore sortingOrder argument
0C44068C    LDP     X23, X30, [SP],#0x60
0C440690    RET

来源:Gbatemp · gbatemp.net