Regarding my cheat option contributions:
[SNIP]
EDIT: I've managed to get dual 1.1.9.8 and 1.2.0.0 installations so I can work on table updates, but strictly play on 1.1.9.8.
I've quickly updated several of the cheat options, but need to step away. I'll finish updating what others I am able to and post the updated options in a little while.
(Having an issue with the Inf Mana option as the current max mana value in the code (12 C0) seems to have changed and I can't figure out what those bytes should be just yet. Earlier tables had it as 12 BC, but it changed to 12 C0 a while ago, but can't find what it is now.)
_____
UPDATED:
Sorry, still short on time and access for now. I'll paste some updated cheat option codes below. I'll add in new comments if and when I am able to update others.
Select all the code for an option and copy it.
Then paste it (CTRL+V) into your cheat table to add the updated option.
EDIT: Re-pasted the codes in case they didn't paste properly last time.
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>136211</ID>
<Description>"Enable Harder Difficulties"</Description>
<Options moAllowManualCollapseAndExpand="1"/>
<Color>FFFFFF</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>//Grim Dawn 1.2.0.0 Updated
//1.1.9.8 was 8B 81 C0 42 00 00
//changed C0 42 to 18 47
[ENABLE]
aobscanmodule(enableDifficulty,Game.dll,8B 81 18 47 00 00) // should be unique
alloc(newmem,$1000,enableDifficulty)
label(code)
label(return)
newmem:
mov [rcx+00004718],2
code:
mov eax,[rcx+00004718]
jmp return
enableDifficulty:
jmp newmem
nop
return:
registersymbol(enableDifficulty)
[DISABLE]
enableDifficulty:
db 8B 81 18 47 00 00
unregistersymbol(enableDifficulty)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Player::GetGreatestDifficultyCompleted
GGame.GAME::Player::SetGreatestDifficultyCompleted+6 - C3 - ret
Game.GAME::Player::SetGreatestDifficultyCompleted+7 - CC - int 3
Game.GAME::Player::SetGreatestDifficultyCompleted+8 - CC - int 3
Game.GAME::Player::SetGreatestDifficultyCompleted+9 - CC - int 3
Game.GAME::Player::SetGreatestDifficultyCompleted+A - CC - int 3
Game.GAME::Player::SetGreatestDifficultyCompleted+B - CC - int 3
Game.GAME::Player::SetGreatestDifficultyCompleted+C - CC - int 3
Game.GAME::Player::SetGreatestDifficultyCompleted+D - CC - int 3
Game.GAME::Player::SetGreatestDifficultyCompleted+E - CC - int 3
Game.GAME::Player::SetGreatestDifficultyCompleted+F - CC - int 3
// ---------- INJECTING HERE ----------
Game.GAME::Player::GetGreatestDifficultyCompleted - 8B 81 18470000 - mov eax,[rcx+00004718]
// ---------- DONE INJECTING ----------
Game.GAME::Player::GetGreatestDifficultyCompleted+6 - 33 C9 - xor ecx,ecx
Game.GAME::Player::GetGreatestDifficultyCompleted+8 - 83 F8 03 - cmp eax,03
Game.GAME::Player::GetGreatestDifficultyCompleted+B - 0F44 C1 - cmove eax,ecx
Game.GAME::Player::GetGreatestDifficultyCompleted+E - C3 - ret
Game.GAME::Player::GetGreatestDifficultyCompleted+F - CC - int 3
Game.GAME::Player::SetGreatestSurvivalDifficultyCompleted- 89 91 20470000 - mov [rcx+00004720],edx
Game.GAME::Player::SetGreatestSurvivalDifficultyCompleted+6- C3 - ret
Game.GAME::Player::SetGreatestSurvivalDifficultyCompleted+7- CC - int 3
Game.GAME::Player::SetGreatestSurvivalDifficultyCompleted+8- CC - int 3
Game.GAME::Player::SetGreatestSurvivalDifficultyCompleted+9- CC - int 3
}
</AssemblerScript>
<CheatEntries>
<CheatEntry>
<ID>136222</ID>
<Description>">>> NOTES: Usage"</Description>
<Options moHideChildren="1" moManualExpandCollapse="1" moAllowManualCollapseAndExpand="1"/>
<Color>80FFFF</Color>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>136223</ID>
<Description>"Enable > select/switch to character"</Description>
<Color>80FFFF</Color>
<GroupHeader>1</GroupHeader>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatTable>
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>136310</ID>
<Description>"Invincible ('isInvincible' function activation, but in "cheat" format)"</Description>
<Color>FFFFFF</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>//Game: Grim Dawn + All DLC's
//Version: Steam v1.2.0.0 (x64)
//
//1.1.9.8 pattern was 0F B6 83 2C 1A 00 00 48 83 C4 20 5B C3
//changed 2C 1A to 9C 1D
{
Game.GAME::Player::IsInvincible+23 - 0FB6 83 9C1D0000 - movzx eax,byte ptr [rbx+00001D9C]
Game.GAME::Player::IsInvincible+2A - 48 83 C4 20 - add rsp,20
Game.GAME::Player::IsInvincible+2E - 5B - pop rbx
Game.GAME::Player::IsInvincible+2F - C3 - ret
}
{$lua}
if syntaxcheck then return end
cheat_name = "game.Invincible"
[ENABLE]
local pattern = "0F B6 83 9C 1D 00 00 48 83 C4 20 5B C3"
local replace = "90 90 90 90 90 90 90 ?? ?? ?? ?? ?? ??"
-- edit the name of the cheat
-- edit the pattern to search
-- edit the replacement bytes
-- use ?? to ignore the bytes
-- do not edit the code below
local scans = AOBScan(pattern)
if scans == nil then
showMessage("Unable to find pattern:\n"..pattern)
else
local saved = {}
local length = (#replace + 1) / 3
for i = 0, scans.Count - 1 do
local backup = readBytes(scans[i], length, true)
local bytes = {}
for hex in string.gmatch(replace, "%S+") do
local size = #bytes + 1
if hex == "??" then
bytes[size] = backup[size]
else
bytes[size] = tonumber(hex, 16)
end
end
saved[i] = backup
writeBytes(scans[i], bytes)
end
_G[cheat_name] = {
["scans"] = scans,
["saved"] = saved
}
end
[DISABLE]
local vars = _G[cheat_name]
if vars ~= nil then
local scans = vars.scans
local saved = vars.saved
for i = 0, scans.Count - 1 do
writeBytes(scans[i], saved[i])
end
scans.Destroy()
vars.scans = nil
vars.saved = nil
vars = nil
_G[cheat_name] = nil
end
{$asm}
</AssemblerScript>
</CheatEntry>
</CheatEntries>
</CheatTable>
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>87881</ID>
<Description>"Free Crafting (Zero quantity needed)"</Description>
<Color>FFFFFF</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>//Grim Dawn 1.2.0.0 Updated
//1.1.9.8 was 8B 81 94 0B 00 00
//changed 94 to D4
//changed 9C to DC
//changed A0 to E0
//changed A4 to E4
//changed A8 to E8
//changed AC to EC
[ENABLE]
//MAIN Slot
Game.GAME::ItemArtifactFormula::GetReagentBaseQuantityForFormula:
db B8 00 00 00 00 90
// 8B 81 D4 0B 00 00
//mov eax,[rcx+00000BD4]
//SLOT 1 Upper Left
Game.GAME::ItemArtifactFormula::GetReagent1QuantityForFormula:
db B8 00 00 00 00 90
// 8B 81 D8 0B 00 00
//SLOT 2 Upper Right
Game.GAME::ItemArtifactFormula::GetReagent2QuantityForFormula:
db B8 00 00 00 00 90
// 8B 81 DC 0B 00 00
//SLOT 3 Middle Left
Game.GAME::ItemArtifactFormula::GetReagent3QuantityForFormula:
db B8 00 00 00 00 90
// 8B 81 E0 0B 00 00
//SLOT 4 Middle Right
Game.GAME::ItemArtifactFormula::GetReagent4QuantityForFormula:
db B8 00 00 00 00 90
// 8B 81 E4 0B 00 00
//SLOT 5 Bottom Left
Game.GAME::ItemArtifactFormula::GetReagent5QuantityForFormula:
db B8 00 00 00 00 90
// 8B 81 E8 0B 00 00
//SLOT 6 Bottom Right
Game.GAME::ItemArtifactFormula::GetReagent6QuantityForFormula:
db B8 00 00 00 00 90
// 8B 81 EC 0B 00 00
//Grim Dawn 1.2.0.0 Updated - Re-wrote
//1.1.9.8 was 4C 8B 81 98 0E 00 00
//changed 98 to D8
//"Game.dll"+26E434 to Game.GAME::ItemArtifactFormula::GetCreationCost+4
//SCRAP
aobscanregion(FreeCraftSlotIron,Game.GAME::ItemArtifactFormula::GetCreationCost,Game.GAME::ItemArtifactFormula::GetCreationCost+5F,4C8B81) // should be unique
alloc(newmem,$1000,FreeCraftSlotIron)
label(code)
label(return)
newmem:
// mov r8,[rcx+000002D8]
mov r8,0
jmp return
code:
mov r8,[rcx+00000ED8]
jmp return
FreeCraftSlotIron:
jmp newmem
nop 2
return:
registersymbol(FreeCraftSlotIron)
[DISABLE]
//MAIN Slot
Game.GAME::ItemArtifactFormula::GetReagentBaseQuantityForFormula:
db 8B 81 D4 0B 00 00
//SLOT 1 Upper Left
Game.GAME::ItemArtifactFormula::GetReagent1QuantityForFormula:
db 8B 81 D8 0B 00 00
//SLOT 2 Upper Right
Game.GAME::ItemArtifactFormula::GetReagent2QuantityForFormula:
db 8B 81 DC 0B 00 00
//SLOT 3 Middle Left
Game.GAME::ItemArtifactFormula::GetReagent3QuantityForFormula:
db 8B 81 E0 0B 00 00
//SLOT 4 Middle Right
Game.GAME::ItemArtifactFormula::GetReagent4QuantityForFormula:
db 8B 81 E4 0B 00 00
//SLOT 5 Bottom Left
Game.GAME::ItemArtifactFormula::GetReagent5QuantityForFormula:
db 8B 81 E8 0B 00 00
//SLOT 6 Bottom Right
Game.GAME::ItemArtifactFormula::GetReagent6QuantityForFormula:
db 8B 81 EC 0B 00 00
//SCRAP
FreeCraftSlotIron:
db 4C 8B 81 D8 0E 00 00
unregistersymbol(FreeCraftSlotIron)
dealloc(newmem)
</AssemblerScript>
</CheatEntry>
</CheatEntries>
</CheatTable>
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>136310</ID>
<Description>"Max Item Stack (98) (split/merge item to max out stack)"</Description>
<Options moAllowManualCollapseAndExpand="1"/>
<Color>FFFFFF</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>//Game: Grim Dawn + All DLC's
//Version: v1.1.1.1
//Grim Dawn 1.2.0.0 Updated
//1.1.9.8 was 89 8F 5C 07 00 00
//changed 5C to 74
define(address,Game.GAME::Item::IncrementStack+3F)
define(bytes,89 8F 74 07 00 00)
[ENABLE]
assert(address,bytes)
alloc(newmem,$1000,Game.GAME::Item::IncrementStack+3F)
label(code)
label(return)
newmem:
mov ecx,#98
//mov ecx,[rdi+00000760] //0x760 - maxItemValue { 100 }
code:
mov [rdi+00000774],ecx //0x75C - currentItemValue
jmp return
address:
jmp newmem
nop
return:
[DISABLE]
address:
db bytes
// mov [rdi+00000774],ecx
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Item::IncrementStack+3F
Game.GAME::Item::IncrementStack+1E - 48 8B F9 - mov rdi,rcx
Game.GAME::Item::IncrementStack+21 - FF 90 C8050000 - call qword ptr [rax+000005C8]
Game.GAME::Item::IncrementStack+27 - 8B 8F 74070000 - mov ecx,[rdi+00000774]
Game.GAME::Item::IncrementStack+2D - 03 CB - add ecx,ebx
Game.GAME::Item::IncrementStack+2F - 3B C8 - cmp ecx,eax
Game.GAME::Item::IncrementStack+31 - 76 0C - jna Game.GAME::Item::IncrementStack+3F
Game.GAME::Item::IncrementStack+33 - 2B C8 - sub ecx,eax
Game.GAME::Item::IncrementStack+35 - 89 0E - mov [rsi],ecx
// ---------- INJECTING HERE ----------
Game.GAME::Item::IncrementStack+37 - 89 87 74070000 - mov [rdi+00000774],eax
// ---------- DONE INJECTING ----------
Game.GAME::Item::IncrementStack+3D - EB 06 - jmp Game.GAME::Item::IncrementStack+45
Game.GAME::Item::IncrementStack+3F - 89 8F 74070000 - mov [rdi+00000774],ecx
Game.GAME::Item::IncrementStack+45 - 8B 87 74070000 - mov eax,[rdi+00000774]
Game.GAME::Item::IncrementStack+4B - 48 8B 5C 24 30 - mov rbx,[rsp+30]
Game.GAME::Item::IncrementStack+50 - 48 8B 74 24 38 - mov rsi,[rsp+38]
Game.GAME::Item::IncrementStack+55 - 89 87 F4050000 - mov [rdi+000005F4],eax
Game.GAME::Item::IncrementStack+5B - B0 01 - mov al,01
Game.GAME::Item::IncrementStack+5D - 48 83 C4 20 - add rsp,20
Game.GAME::Item::IncrementStack+61 - 5F - pop rdi
Game.GAME::Item::IncrementStack+62 - C3 - ret
Game.GAME::Item::IncrementStack+63 - CC - int 3
Game.GAME::Item::IncrementStack+64 - CC - int 3
}
</AssemblerScript>
</CheatEntry>
</CheatEntries>
</CheatTable>
Max Item Stack (98) - I set it to make a stack 98 to prevent each item picked up from creating a new stack. If 99 or more, a new stack is created each time you loot a component. 98 is max to keep all same items looted from making new stacks each time. Set 98 to whatever you want.
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>28</ID>
<Description>"9,999,999 Money / Iron bits"</Description>
<Options moHideChildren="1" moAllowManualCollapseAndExpand="1"/>
<Color>FFFFFF</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>//Game: Grim Dawn + All DLC's
//Version: 1.2.0.0 Updated
//1.1.9.8 was 8B 81 2C 13 00 00
//changed 2C 13 to 84 15
define(address,Game.GAME::Character::GetCurrentMoney)
define(bytes,8B 81 84 15 00 00)
[ENABLE]
assert(address,bytes)
alloc(newmem,$100,Game.GAME::Character::GetCurrentMoney)
alloc(getCurrentMoney_ptr,8)
registersymbol(getCurrentMoney_ptr)
label(code)
label(return)
newmem:
mov [getCurrentMoney_ptr],rcx
mov [rcx+00001584],#9999999
code:
mov eax,[rcx+00001584]
jmp return
address:
jmp newmem
nop
return:
[DISABLE]
address:
db bytes
// mov eax,[rcx+00001584]
unregistersymbol(getCurrentMoney_ptr)
dealloc(getCurrentMoney_ptr)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Character::GetCurrentMoney
Game.GAME::Character::GetWeaponScale+8 - C3 - ret
Game.GAME::Character::GetWeaponScale+9 - CC - int 3
Game.GAME::Character::GetWeaponScale+A - CC - int 3
Game.GAME::Character::GetWeaponScale+B - CC - int 3
Game.GAME::Character::GetWeaponScale+C - CC - int 3
Game.GAME::Character::GetWeaponScale+D - CC - int 3
Game.GAME::Character::GetWeaponScale+E - CC - int 3
Game.GAME::Character::GetWeaponScale+F - CC - int 3
// ---------- INJECTING HERE ----------
Game.GAME::Character::GetCurrentMoney - 8B 81 84150000 - mov eax,[rcx+00001584]
// ---------- DONE INJECTING ----------
Game.GAME::Character::GetCurrentMoney+6- C3 - ret
Game.GAME::Character::GetCurrentMoney+7- CC - int 3
Game.GAME::Character::GetCurrentMoney+8- CC - int 3
Game.GAME::Character::GetCurrentMoney+9- CC - int 3
Game.GAME::Character::GetCurrentMoney+A- CC - int 3
Game.GAME::Character::GetCurrentMoney+B- CC - int 3
Game.GAME::Character::GetCurrentMoney+C- CC - int 3
Game.GAME::Character::GetCurrentMoney+D- CC - int 3
Game.GAME::Character::GetCurrentMoney+E- CC - int 3
Game.GAME::Character::GetCurrentMoney+F- CC - int 3
}
</AssemblerScript>
<CheatEntries>
<CheatEntry>
<ID>70</ID>
<Description>"Money / Iron Bits - Current"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>80FF80</Color>
<VariableType>4 Bytes</VariableType>
<Address>[getCurrentMoney_ptr]+1584</Address>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatTable>
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>1178</ID>
<Description>"No Skill Cooldown"</Description>
<Color>FFFFFF</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>//Grim Dawn 1.2.0.0 Updated
//1.1.9.8 was Game.GAME::Skill::StartCooldown+9F
//changed +9F,76 to +DF,76 (the last address in the whole GAME::Skill::StartCooldown section for the range of the scan)
[ENABLE]
//Game.GAME::Skill::StartCooldown+9F
aobscanregion(noSkillCooldown,Game.GAME::Skill::StartCooldown,Game.GAME::Skill::StartCooldown+DF,76)
noSkillCooldown:
db 77
//77 1D
//ja Game.GAME::Skill::StartCooldown+9F
registersymbol(noSkillCooldown)
[DISABLE]
noSkillCooldown:
db 76
//76 1D
//jna Game.GAME::Skill::StartCooldown+9F
unregistersymbol(noSkillCooldown)
</AssemblerScript>
</CheatEntry>
</CheatEntries>
</CheatTable>
EDIT: Removed "Super Attack Speed " update - Updated the code bytes, but more was changed with it and it was only raising speed to the default 200% max, not altering it to 1000%. More needs to be done on it to work like it should.
_____
Regarding Inf Mana, it is still giving me a problem.
"movss xmm1,[rbx+000012C0]" - 0x12C0 seems to be related to a character data table address as it is also used in the old "Infinite Health" option to set your current health to be your max health. It seems like it is loading values from "Game.GAME::CharacterBio::Update" or somewhere, but I can't find how this value was found to then locate it in 1.1.9.8 and then see what that value changed to in 1.2.0.0.
The 1.2 address for current mana changed to F3 0F 10 81 EC 0D 00 00 (A4 changed to EC). While you are able to make your current mana much higher than your max mana, your max mana determines the mana bar size. Setting your current mana to be higher than your max will cause the blue mana background to extend beyond the bar out to the left across the screen.
Need to find a way to copy the max mana value to your current mana, but max mana is determined by several values added together. Need to find what that [rbx+000012C0] character data reference was to in 1.1.9.8 and then see what it changed to in 1.2.0.0.
EDIT:
I'm understanding that 12C0 with the Inf Mana better and how that was gotten and used in the old tables, but it doesn't matter anymore since the game code is changed in 1.2 with how it calculates max mana limit and that isn't useful anymore. Need to find another way to get current mana to match max mana now.