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