activate Inventory Editor
open inventory
activate Create Records
and you will see this:
?? = item is not a StackableComponent ( it can't have a amount to change)
preorder_token = Coupons to get special items at shops.
note : if you load a game you need to reactivate Inventory Editor, otherwise it will crash if you click on Create Records
some items are not updated until you save at a bonfire and reload.
script code:
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>26740</ID>
<Description>"Inventory Editor (Open Inventory)"</Description>
<Options moHideChildren="1"/>
<LastState/>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>{ Game : HorizonZeroDawn.exe
Version:
Date : 2020-08-20
Author : cfe
This script does blah blah blah
}
[ENABLE]
aobscanmodule(aobGetFunctionAndParam,HorizonZeroDawn.exe,48 8D 15 ** ** ** ** 0F 94 44 24 31) // should be unique
registersymbol(aobGetFunctionAndParam)
alloc(pArgument,8)
registersymbol(pArgument)
alloc(pFunction,8)
registersymbol(pFunction)
pArgument:
readmem(aobGetFunctionAndParam+3,4)
db FF FF FF FF
pFunction:
readmem(aobGetFunctionAndParam+D,4)
db FF FF FF FF
alloc(FindFuncAndParam,$100)
registersymbol(FindFuncAndParam)
createthread(FindFuncAndParam)
FindFuncAndParam:
mov rax,aobGetFunctionAndParam
xor rbx,rbx
cmp byte ptr[pArgument+3],FF
mov ebx,[pArgument]
jne short @f
mov rbx,[pArgument]
@@:
add rax,rbx
add rax,7
mov [pArgument],rax
mov rax,aobGetFunctionAndParam
cmp byte ptr[pFunction+3],FF
mov ebx,[pFunction]
jne short @f
mov rbx,[pFunction]
@@:
add rax,rbx
add rax,11
mov [pFunction],rax
ret
//
aobscanmodule(aobGetInvItems,HorizonZeroDawn.exe,00 00 00 4D 8B 37 49 8B CE 49 8B 06 FF 10) // should be unique
alloc(newmem,$2000,"HorizonZeroDawn.exe"+12DC7C6)
label(code)
label(return)
label(bFinished)
registersymbol(bFinished)
label(iCounterCheck)
registersymbol(iCounterCheck)
label(iArrayCounter)
registersymbol(iArrayCounter)
alloc(pArrayCheck,$1000)
registersymbol(pArrayCheck)
alloc(pInvItems,1000)
registersymbol(pInvItems)
newmem:
code:
mov rax,[r14]
push rcx
push rdx
push rax
mov dword ptr[iCounterCheck],0
call TestCheck
test rax,rax
jne StopCheck
mov rcx,pArrayCheck
xor rdx,rdx
mov edx,[iArrayCounter]
mov [rcx+rdx],r14
add edx,8
mov [iArrayCounter],edx
StopCheck:
pop rax
pop rdx
pop rcx
call qword ptr [rax]
jmp return
TestCheck:
mov rax,pArrayCheck
xor rbx,rbx
mov ebx,[iCounterCheck]
cmp [rax+rbx],r14
je AlreadyInList
add ebx,8
mov [iCounterCheck],ebx
cmp ebx,1000
jl TestCheck
xor rax,rax
ret
AlreadyInList:
mov rax,1
ret
bFinished:
db 0
iArrayCounter:
dd 0
iCounterCheck:
dd 0
aobGetInvItems+09:
jmp newmem
return:
registersymbol(aobGetInvItems)
[DISABLE]
unregistersymbol(aobGetFunctionAndParam)
aobGetInvItems+09:
db 49 8B 06 FF 10
unregistersymbol(aobGetInvItems)
unregistersymbol(pArrayCheck)
unregistersymbol(bFinished)
unregistersymbol(pInvItems)
dealloc(newmem)
</AssemblerScript>
<CheatEntries>
<CheatEntry>
<ID>26741</ID>
<Description>"Create Records"</Description>
<LastState/>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>[ENABLE]
alloc(ItemThread,$2000,HorizonZeroDawn.exe)
registersymbol(ItemThread)
createthread(ItemThread)
alloc(iCount,4)
iCount:
dd 0
ItemThread:
sub rsp,28
Again:
xor rax,rax
mov eax,[iCount]
mov rcx,pArrayCheck
test rcx,rcx
je Ending
mov rcx,[rcx+rax]
test rcx,rcx
je Ending
lea rcx,[rcx+288]
mov rdx,[pArgument]
test rdx,rdx
je short Ending
mov r11,[pFunction]
test r11,r11
je short Ending
call r11
mov rcx,pInvItems
xor rdx,rdx
mov edx,[iCount]
mov [rcx+rdx],rax
add edx,8
mov [iCount],edx
cmp [iCount],1000
jl Again
Ending:
add rsp,28
mov byte ptr[bFinished],1
ret
{$lua}
local function InvThread(thread2)
local IsFinished = getAddressSafe('bFinished')
local pItems = getAddressSafe('pArrayCheck')
local pCount = getAddressSafe('pInvItems')
local iMaxItems = getAddressSafe('iArrayCounter')
local ScriptDone = 0
while InvLoop do
sleep(100)
if IsFinished and pItems and pCount and iMaxItems and ScriptDone==0 then
if readBytes(IsFinished,0x01) == 0x01 then
local iMax = readInteger(iMaxItems)
local addressList = getAddressList()
for i=0,iMax,8 do
pA = readPointer(pItems+i)
if (pA == 0) then break end
pA = readPointer(pA+0x38)
sItemString = readString(pA,25,false)
NewEntry = addressList.createMemoryRecord()
NewEntry.Description = sItemString
pInvI = readPointer(pCount+i)
if (pInvI ~= 0) then
pInvI = getAddressSafe(pInvI+0x58)
NewEntry.Address = pInvI
end
end
ScriptDone = 1
end
else
local IsFinished = getAddressSafe('bFinished')
end
end
thread2.terminate()
end
----------------------------------
if syntaxcheck then return end
InvLoop = true
createThread(InvThread)
{$asm}
[DISABLE]
{$lua}
if syntaxcheck then return end
InvLoop = false
{$asm}
</AssemblerScript>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatTable>
How to use this cheat table?
- Install Cheat Engine
- Double-click the .CT file in order to open it.
- Click the PC icon in Cheat Engine in order to select the game process.
- Keep the list.
- Activate the trainer options by checking boxes or setting values from 0 to 1