Grim Dawn + All DLC's

Upload your cheat tables here (No requests)
User avatar
StinVec
Table Makers
Table Makers
Posts: 135
Joined: Sun Jun 25, 2017 7:02 am
Reputation: 209

Re: Grim Dawn + All DLC's

Post by StinVec »

@Baofu

You're welcome! I'm glad helping to update, tweak and create options has been useful to so many so far.

_____Minimap
The minimap reveal option works somewhat decently most of the time for me, but it seems to be hit-or-miss with revealing all of the map or only parts of it (or losing my existing exploration and resetting it to unexplored).

I think the option might work better if it is activated prior to loading into an area rather than toggling it on and off at times while already in an area. It also doesn't reveal underground areas at all for that I've tested the option on.

I'll look closer at the option though, just in case it isn't actually working as proper and full as it could/should.

_____Crucible Stuff
Those offsets you supplied worked perfectly in 1.2.0.3 x64 when using the run speed pointer as the base. If anyone wants to continue using the runspeed pointer with those offsets, they'll work fine.

However, I backtraced and got the main addresses for controlling crucible stuff, like "Game.GAME::PlayStats::GetSurvivalScore" and I made a new standalone option using that as the base with these pointers for controlling crucible stuff:

- Crucible Score
- Crucible Score Multiplier (with a dropdown for selecting x1 - x10)
- Crucible Wave
- Crucible Tributes
- Crucible Bonus Timer (displays in milliseconds, so 1 second is 1000)

The bonus timer can be locked to freeze it, but my "Crucible / Shattered Realm - Timer Does Not Decrease" option also works well for keeping the timer from decreasing.

I haven't hopped into Shattered Realm yet to do a "Shattered Realm Control" option just yet. I'll try to get to that in a while to see what other options/pointer control can be made for it.

Let me know if this works well enough for you or if it is lacking some aspects of control that should be added, like controlling High Score/Restarts stats stuff.
Crucible Control (Pointers) 1.2.0.3 x64

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>136176</ID>
      <Description>"Crucible Control"</Description>
      <Options moAllowManualCollapseAndExpand="1"/>
      <Color>FFFFFF</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>//Grim Dawn 1.2.0.3

[ENABLE]
//Game.GAME::PlayStats::GetSurvivalScore
aobscanregion(crucibleControl,Game.GAME::PlayStats::GetSurvivalScore,Game.GAME::PlayStats::GetSurvivalScore+F,8B)
alloc(newmem,$1000,crucibleControl)

alloc(cruControl_ptr,8)
registersymbol(cruControl_ptr)

label(code)
label(return)

newmem:
  mov [cruControl_ptr],rcx
  mov eax,[rcx+00000150]

code:
  mov eax,[rcx+00000150]
  jmp return

crucibleControl:
  jmp newmem
  nop
return:
registersymbol(crucibleControl)

[DISABLE]
crucibleControl:
  db 8B 81 50 01 00 00

unregistersymbol(crucibleControl)
unregistersymbol(cruControl_ptr)
dealloc(cruControl_ptr)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::PlayStats::GetSurvivalScore

Game.GAME::PlayStats::GetSurvivalWaveTier+6: C3                 - ret
Game.GAME::PlayStats::GetSurvivalWaveTier+7: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalWaveTier+8: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalWaveTier+9: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalWaveTier+A: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalWaveTier+B: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalWaveTier+C: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalWaveTier+D: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalWaveTier+E: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalWaveTier+F: CC                 - int 3
// ---------- INJECTING HERE ----------
Game.GAME::PlayStats::GetSurvivalScore: 8B 81 50 01 00 00  - mov eax,[rcx+00000150]
// ---------- DONE INJECTING  ----------
Game.GAME::PlayStats::GetSurvivalScore+6: C3                 - ret
Game.GAME::PlayStats::GetSurvivalScore+7: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalScore+8: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalScore+9: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalScore+A: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalScore+B: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalScore+C: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalScore+D: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalScore+E: CC                 - int 3
Game.GAME::PlayStats::GetSurvivalScore+F: CC                 - int 3
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>136177</ID>
          <Description>"Crucible Score"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>80FF80</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>[cruControl_ptr]+150</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>136178</ID>
          <Description>"Crucible Score Multiplier"</Description>
          <Options moAllowManualCollapseAndExpand="1"/>
          <DropDownList ReadOnly="1" DescriptionOnly="1" DisplayValueAsItem="1">1:x1
2:x2
3:x3
4:x4
5:x5
6:x6
7:x7
8:x8
9:x9
10:x10
</DropDownList>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>80FF80</Color>
          <VariableType>Byte</VariableType>
          <Address>[cruControl_ptr]+158</Address>
          <CheatEntries>
            <CheatEntry>
              <ID>136183</ID>
              <Description>"NOTE: Dropdown select x1 to x10"</Description>
              <Color>80FFFF</Color>
              <GroupHeader>1</GroupHeader>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>136179</ID>
          <Description>"Crucible Wave"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>80FF80</Color>
          <VariableType>Byte</VariableType>
          <Address>[cruControl_ptr]+148</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>136180</ID>
          <Description>"Crucible Tributes"</Description>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>80FF80</Color>
          <VariableType>Byte</VariableType>
          <Address>[cruControl_ptr]-C8</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>136181</ID>
          <Description>"Crucible Bonus Timer"</Description>
          <Options moAllowManualCollapseAndExpand="1"/>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>80FF80</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>[cruControl_ptr]+16C</Address>
          <CheatEntries>
            <CheatEntry>
              <ID>136182</ID>
              <Description>"NOTE: In milliseconds (1 second is 1000)"</Description>
              <Color>80FFFF</Color>
              <GroupHeader>1</GroupHeader>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
_____
EDIT: Adding updated Shattered Realm: Instant Clear Floor (on kill) option:
As usual, complete option - copy code and paste (CTRL+V) into cheat table.
Shattered Realm: Instant Clear Floor (on kill) 1.2.0.3 x64

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>136209</ID>
      <Description>"Shattered Realm: Instant Clear Floor (on kill)"</Description>
      <Color>FFFFFF</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>//Grim Dawn 1.2.0.3 Re-wrote

[ENABLE]
//Game.GAME::EndlessDungeon_Generator::IncrementProgress+D6
aobscanregion(instantClearSR,Game.GAME::EndlessDungeon_Generator::IncrementProgress,Game.GAME::EndlessDungeon_Generator::IncrementProgress+22F,0F82)
alloc(newmem,$1000,instantClearSR)

label(code)
label(return)

newmem:
//  jb Game.GAME::EndlessDungeon_Generator::IncrementProgress+1F2
  jmp return

code:
  jb Game.GAME::EndlessDungeon_Generator::IncrementProgress+1F2
  jmp return

instantClearSR:
  jmp newmem
  nop

return:
registersymbol(instantClearSR)

[DISABLE]
instantClearSR:
  db 0F 82 16 01 00 00
  // 0F 82 16 01 00 00
unregistersymbol(instantClearSR)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::EndlessDungeon_Generator::IncrementProgress+D6

Game.GAME::EndlessDungeon_Generator::IncrementProgress+A8: 0F 85 61 01 00 00     - jne Game.GAME::EndlessDungeon_Generator::IncrementProgress+20F
Game.GAME::EndlessDungeon_Generator::IncrementProgress+AE: 8B 8F F4 00 00 00     - mov ecx,[rdi+000000F4]
Game.GAME::EndlessDungeon_Generator::IncrementProgress+B4: 8B 87 F8 00 00 00     - mov eax,[rdi+000000F8]
Game.GAME::EndlessDungeon_Generator::IncrementProgress+BA: 3B C8                 - cmp ecx,eax
Game.GAME::EndlessDungeon_Generator::IncrementProgress+BC: 0F 83 4D 01 00 00     - jae Game.GAME::EndlessDungeon_Generator::IncrementProgress+20F
Game.GAME::EndlessDungeon_Generator::IncrementProgress+C2: 84 DB                 - test bl,bl
Game.GAME::EndlessDungeon_Generator::IncrementProgress+C4: 44 8D 04 29           - lea r8d,[rcx+rbp]
Game.GAME::EndlessDungeon_Generator::IncrementProgress+C8: 44 0F 45 C0           - cmovne r8d,eax
Game.GAME::EndlessDungeon_Generator::IncrementProgress+CC: 44 89 87 F4 00 00 00  - mov [rdi+000000F4],r8d
Game.GAME::EndlessDungeon_Generator::IncrementProgress+D3: 44 3B C0              - cmp r8d,eax
// ---------- INJECTING HERE ----------
Game.GAME::EndlessDungeon_Generator::IncrementProgress+D6: 0F 82 16 01 00 00     - jb Game.GAME::EndlessDungeon_Generator::IncrementProgress+1F2
// ---------- DONE INJECTING  ----------
Game.GAME::EndlessDungeon_Generator::IncrementProgress+DC: 33 C9                 - xor ecx,ecx
Game.GAME::EndlessDungeon_Generator::IncrementProgress+DE: 45 85 C0              - test r8d,r8d
Game.GAME::EndlessDungeon_Generator::IncrementProgress+E1: 41 0F 45 C8           - cmovne ecx,r8d
Game.GAME::EndlessDungeon_Generator::IncrementProgress+E5: 3B C8                 - cmp ecx,eax
Game.GAME::EndlessDungeon_Generator::IncrementProgress+E7: 0F 42 C1              - cmovb eax,ecx
Game.GAME::EndlessDungeon_Generator::IncrementProgress+EA: 89 87 F4 00 00 00     - mov [rdi+000000F4],eax
Game.GAME::EndlessDungeon_Generator::IncrementProgress+F0: 8B 96 CC 00 00 00     - mov edx,[rsi+000000CC]
Game.GAME::EndlessDungeon_Generator::IncrementProgress+F6: C6 86 9D 04 00 00 00  - mov byte ptr [rsi+0000049D],00
Game.GAME::EndlessDungeon_Generator::IncrementProgress+FD: FF C2                 - inc edx
Game.GAME::EndlessDungeon_Generator::IncrementProgress+FF: 48 8B 8E C0 01 00 00  - mov rcx,[rsi+000001C0]
}
</AssemblerScript>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
_____
EDIT: Adding updated Get All Devotion Points 1.2.0.3 x64 option.

Current points: 8B 81 DC 16 00 00 Game.GAME::Character::GetTotalDevotionPoints
Max points: 8B 81 38 16 00 00 Game.GAME::Character::GetMaxDevotionPoints
Now properly changes second byte (+2) in address of Current Points from DC to 38 instead of E0, so the address of Current Points now matches address of Max Points.
Get All Devotion Points 1.2.0.3 x64

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>22</ID>
      <Description>"Get All Devotion Points"</Description>
      <Color>FFFFFF</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>//Game: Grim Dawn + All DLC's
//Version: v1.2.0.3 updated
//000013DC changed to 000016DC
//E0 changed to 38
//Current points: 8B 81 DC 16 00 00 Game.GAME::Character::GetTotalDevotionPoints
//Max points:     8B 81 38 16 00 00 Game.GAME::Character::GetMaxDevotionPoints
//Changes second byte (+2) in address of current points from DC to 38, so the address of current now matches address of max points

[ENABLE]
Game.GAME::Character::GetTotalDevotionPoints+2:
  db 38
//8B 81 38 16 00 00
//Game.GAME::Character::GetMaxDevotionPoints
//mov eax,[rcx+00001638]

[DISABLE]
Game.GAME::Character::GetTotalDevotionPoints+2:
  db DC
//8B 81 DC 16 00 00
//Game.GAME::Character::GetTotalDevotionPoints
//mov eax,[rcx+000016DC]

</AssemblerScript>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
EDIT: Re-pasted the codes just in case they did not paste properly last time.

How to use this cheat table?
  1. Install Cheat Engine
  2. Double-click the .CT file in order to open it.
  3. Click the PC icon in Cheat Engine in order to select the game process.
  4. Keep the list.
  5. Activate the trainer options by checking boxes or setting values from 0 to 1
Last edited by StinVec on Sat Dec 16, 2023 8:45 pm, edited 5 times in total.

AlexS
Expert Cheater
Expert Cheater
Posts: 324
Joined: Sun Apr 08, 2018 3:46 pm
Reputation: 193

Re: Grim Dawn + All DLC's

Post by AlexS »

(Google translation)

Three days have passed and no one can answer? Okay, I get it.

Proud Wingman
Noobzor
Noobzor
Posts: 9
Joined: Wed Mar 25, 2020 9:31 am
Reputation: 1

Re: Grim Dawn + All DLC's

Post by Proud Wingman »

Thank you @StinVec for updating the options and providing the code. Highly appriciated your work and effort you put in.

Scheimann
Expert Cheater
Expert Cheater
Posts: 107
Joined: Sun Jul 21, 2019 4:27 am
Reputation: 25

Re: Grim Dawn + All DLC's

Post by Scheimann »

AlexS wrote:
Sun Dec 10, 2023 11:54 am
(Google translation)

Three days have passed and no one can answer? Okay, I get it.
I think it's because they're no longer supporting lazy and, above all, ungrateful people.

Three days have passed and you didn't even want to read the posts before yours? Try out all the tables yourself? Nothing?


@StinVec

Thank you for your updates!

AlexS
Expert Cheater
Expert Cheater
Posts: 324
Joined: Sun Apr 08, 2018 3:46 pm
Reputation: 193

Re: Grim Dawn + All DLC's

Post by AlexS »

Scheimann wrote:
Sun Dec 10, 2023 9:16 pm
AlexS wrote:
Sun Dec 10, 2023 11:54 am
(Google translation)

Three days have passed and no one can answer? Okay, I get it.
I think it's because they're no longer supporting lazy and, above all, ungrateful people.

Three days have passed and you didn't even want to read the posts before yours? Try out all the tables yourself? Nothing?
(Google translation)

Why should I try all the tables myself? Personally, I don’t need this, I don’t use other people’s tables. On the last pages I read that due to a major update to the game, many old scripts stopped working, and users are asking to update the table because they cannot fix the scripts themselves... And I decided to help users update the table. But in order not to do extra work and waste time (I read the forum slowly, through a translator), I need to know which table is the most complete, what works in this table, what does not work, what has already been fixed, etc.. Therefore I asked the question which options and in which table work or do not work. This is a very easy question for those who regularly visit the thread and follow the updates. But no one answered...
P.S. You accuse other people of being lazy and ungrateful, but you yourself are unwilling to spend even a few minutes responding to a user who was willing to spend much more time to help you. Good luck with your table updates.

User avatar
StinVec
Table Makers
Table Makers
Posts: 135
Joined: Sun Jun 25, 2017 7:02 am
Reputation: 209

Re: Grim Dawn + All DLC's

Post by StinVec »

EDITED - text tweaks and added the cheat option to the post

I have the Freeze Buff Timers option completely redone, but I'm still doing some runnning around and testing to make sure it doesn't encounter any problems. I will add it to this post if I don't encounter any issues after a little more testing.

It has three options (for now). There are several other types of buff types that I haven't made additions for yet, such as Skill Passive Health Threshold buff that activates when you get down to a certain health percentage, as well as there maybe being a few other types that might need options.

_____
Freeze Skill Primary & Potion Buffs
Examples of Skill Primary Buffs would be:
- > Bloodfang Oil (Potion) (def: 30s)
- > Pneumatic Burst (Nightblade) (def: 60s)
- > Blade Barrier (Nightblade) (def: 3s)
- > Mirror of Ereoctes (Arcanist) (def: 3s)
Includes check for player/non-player and only freezes for the player
Includes check for Anguish debuff (Chains of Anguish belt) that is tagged as a buff and excludes it from being frozen
Includes check for Burrwitch Brew drunk potion "buff" and excludes it from being frozen (can disable this check in code)
Still includes the old "Time Remaining Check" as an option that you can enable in code to only freeze options above a certain time remaining.

_____
Freeze Skill Secondary buffs
An example of a Skill Secondary Buff would be:
- > Lethal Assault (Nightblade > Amarasta's Blade Burst) (def: 8s)
Includes check for player/non-player and only freezes for the player
Includes buff/debuff check and only freezes buffs for the player and doesn't freeze debuffs

_____
Freeze Skill Passive On Hit buffs
An example of Skill Skill Passive On Hit Buff would be:
- > Deadly Aim (Inquisitor)
Includes check for player/non-player and only freezes for the player

_____
The options first run a check to see if the buff is on the player or on an enemy/ally.
If it is not on the player, the normal code is run of subtracting time.

Skill Secondary also include checking to see if it is a buff or a debuff.
If it is a debuff, the normal code is run of subtracting time.

I haven't yet done further testing to see if it can also extend to buffs on pets and allies.

There was one problem I encountered with the Freeze Skill Primary Buffs option that I needed to address, which was the "Anguish" debuff effect from the "Chains of Anguish" belt that I'm sure everyone is familiar with.

The belt gives great effects, like +100% damage, but you have a 10% chance of triggering the Anguish debuff on each attack which will slow your movement and reduce damage and resistances. The Anguish debuff lasts for 5 seconds, but if you are using Albrecht's Aether Ray or Super Attack Speed or other fast attacks, you essentially trigger this debuff the entire time you are attacking.

The problem was, Anguish gets classified as a "buff" due to being an effect from the gear item, which meant it was getting frozen as well as all of your other Skill Primary buffs. This non-buff being frozen would leave you always running slower, having lower resistances and doing less damage than you should. You would need to disable the option to allow its timer to run out and then reactivate the option, but it would just get reapplied and refrozen the next time you attacked something.

I managed to also implement a check on the Freeze Skill Primary Buffs option to test whether the buff is a normal buff, or if it is the Anguish non-buff. If Anguish is the "buff" that is detected, it will pass to the normal code so time will get subtracted from it properly.

_____
Full cheat option with 3 separate buff freezing options depending on which buff types get frozen:
(As usual, copy all code and paste it [CTRL+V] into your cheat table)
Freeze Buff Timers - 1.2.0.3 x64 (completely re-written)

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>136156</ID>
      <Description>"Freeze Buff Timers"</Description>
      <Options moActivateChildrenAsWell="1" moDeactivateChildrenAsWell="1" moAllowManualCollapseAndExpand="1"/>
      <Color>FFFFFF</Color>
      <GroupHeader>1</GroupHeader>
      <CheatEntries>
        <CheatEntry>
          <ID>136128</ID>
          <Description>"Skill Primary &amp; Potions"</Description>
          <Options moManualExpandCollapse="1" moAllowManualCollapseAndExpand="1"/>
          <Color>FFFFFF</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>//Grim Dawn 1.2.0.3 Re-wrote

[ENABLE]
aobscanregion(buffTimeFreeze1,Game.GAME::Skill_BuffSelfDuration::Update,Game.GAME::Skill_BuffSelfDuration::Update+9F,29)
alloc(newmem,$1000,buffTimeFreeze1)

label(code)
label(return)

newmem:
//PLAYER/FOE CHECK
  cmp [rsi+00001B44],0     // checks if it is the player (0) or an enemy (2)
  jne code                 // if not the player, jump to code
//ANGUISH BELT DEBUFF CHECK
  cmp [rbx+000001C0],0     // checks if it is the Anguish debuff (0) or a real buff (1,3) on the player
  je code                  // if Anguish debuff, jump to code for time subtraction
                           //
                           // alternate Anguish debuff check offsets
                           // rbx+1C0 anguish=0  buff=1 or 3 (tests are consistent) &lt;&lt;&lt; using this one
                           // rbx+64C anguish=0  buff=1, 3 or 4 (tests are consistent)
                           // rbx+658 anguish=1  buff=0 (tests are consistent)
                           // rbx+750 anguish=0  buff=1 or 3 (tests are consistent)
                           // rbx+868 anguish=23 buff=0 (tests are consistent)
                           // rbx+870 anguish=31 buff=15 (tests are consistent)
                           // rbx+87C anguish=10 or 20 buff=0 (tests are consistent)
//
//OPTIONAL: Disable Burrwitch Brew drunk potion buff (disable the next two lines for this buff to get frozen also)
  cmp [rbx+000001D0],0     // checks if it is the Burrwitch Brew drunk buff (not 0) or a real buff (0) on the player
  jne code                 // if Burrwitch Brew drunk potion buff, jump to code for time subtraction
                           //
                           // alternate Burrwitch Brew buff check offsets
                           // rbx+1D0 Brew=not 0  buff=0 (tests are consistent) &lt;&lt;&lt; using this one
                           // rbx+2C0 Brew=256    buff=0 (tests are consistent)
//
//OPTIONAL: Time Remaining Check (enable the next two lines to activate)
//  cmp [rbx+0000053C],#5100 // check if time remaining is under 5100ms (or your custom value in milliseconds)
//  jl code                  // if lower, jump to code for time subtraction
//
  sub [rbx+0000053C],0     // if a real buff, subtract nothing from timer
  jmp return

code:
  sub [rbx+0000053C],edi // subtract time from buff normally
  jmp return

buffTimeFreeze1:
  jmp newmem
  nop

return:
registersymbol(buffTimeFreeze1)

[DISABLE]

buffTimeFreeze1:
  db 29 BB 3C 05 00 00

unregistersymbol(buffTimeFreeze1)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Skill_BuffSelfDuration::Update+4B

Game.GAME::Skill_BuffSelfDuration::Update+24 - 75 0E                 - jne Game.GAME::Skill_BuffSelfDuration::Update+34
Game.GAME::Skill_BuffSelfDuration::Update+26 - 48 8B 0D FB324D00     - mov rcx,[Game.GAME::gGameEngine]
Game.GAME::Skill_BuffSelfDuration::Update+2D - 48 81 C1 785A0300     - add rcx,00035A78
Game.GAME::Skill_BuffSelfDuration::Update+34 - 48 8B 01              - mov rax,[rcx]
Game.GAME::Skill_BuffSelfDuration::Update+37 - FF 50 08              - call qword ptr [rax+08]
Game.GAME::Skill_BuffSelfDuration::Update+3A - 48 8B C8              - mov rcx,rax
Game.GAME::Skill_BuffSelfDuration::Update+3D - 48 85 C0              - test rax,rax
Game.GAME::Skill_BuffSelfDuration::Update+40 - 74 47                 - je Game.GAME::Skill_BuffSelfDuration::Update+89
Game.GAME::Skill_BuffSelfDuration::Update+42 - 80 BB 38050000 00     - cmp byte ptr [rbx+00000538],00
Game.GAME::Skill_BuffSelfDuration::Update+49 - 74 3E                 - je Game.GAME::Skill_BuffSelfDuration::Update+89
// ---------- INJECTING HERE ----------
Game.GAME::Skill_BuffSelfDuration::Update+4B - 29 BB 3C050000        - sub [rbx+0000053C],edi
// ---------- DONE INJECTING  ----------
Game.GAME::Skill_BuffSelfDuration::Update+51 - 83 BB 3C050000 00     - cmp dword ptr [rbx+0000053C],00
Game.GAME::Skill_BuffSelfDuration::Update+58 - 7F 2F                 - jg Game.GAME::Skill_BuffSelfDuration::Update+89
Game.GAME::Skill_BuffSelfDuration::Update+5A - C6 83 38050000 00     - mov byte ptr [rbx+00000538],00
Game.GAME::Skill_BuffSelfDuration::Update+61 - 4C 8D 44 24 30        - lea r8,[rsp+30]
Game.GAME::Skill_BuffSelfDuration::Update+66 - 48 8B 00              - mov rax,[rax]
Game.GAME::Skill_BuffSelfDuration::Update+69 - 48 8B D3              - mov rdx,rbx
Game.GAME::Skill_BuffSelfDuration::Update+6C - C7 44 24 30 00000000  - mov [rsp+30],00000000
Game.GAME::Skill_BuffSelfDuration::Update+74 - 66 C7 44 24 34 0000   - mov word ptr [rsp+34],0000
Game.GAME::Skill_BuffSelfDuration::Update+7B - FF 50 30              - call qword ptr [rax+30]
Game.GAME::Skill_BuffSelfDuration::Update+7E - 48 8B D6              - mov rdx,rsi
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>136133</ID>
              <Description>"&gt;&gt;&gt; NOTES"</Description>
              <Options moHideChildren="1" moManualExpandCollapse="1" moAllowManualCollapseAndExpand="1"/>
              <Color>80FFFF</Color>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>136266</ID>
                  <Description>"Examine Code For Options"</Description>
                  <Color>80FFFF</Color>
                  <GroupHeader>1</GroupHeader>
                  <CheatEntries>
                    <CheatEntry>
                      <ID>136302</ID>
                      <Description>"Includes check for 'Anguish' non-buff and excludes it (from Chains of Anguish belt)"</Description>
                      <Color>80FFFF</Color>
                      <GroupHeader>1</GroupHeader>
                    </CheatEntry>
                    <CheatEntry>
                      <ID>136301</ID>
                      <Description>"Includes check for 'Burrwitch Brew' potion and excludes it (can disable check in code)"</Description>
                      <Color>80FFFF</Color>
                      <GroupHeader>1</GroupHeader>
                    </CheatEntry>
                    <CheatEntry>
                      <ID>136303</ID>
                      <Description>"Includes option to enable freezing only if minimum time remaining"</Description>
                      <Color>80FFFF</Color>
                      <GroupHeader>1</GroupHeader>
                    </CheatEntry>
                  </CheatEntries>
                </CheatEntry>
                <CheatEntry>
                  <ID>136140</ID>
                  <Description>"Example Buffs Affected"</Description>
                  <Color>80FFFF</Color>
                  <GroupHeader>1</GroupHeader>
                  <CheatEntries>
                    <CheatEntry>
                      <ID>136268</ID>
                      <Description>"&gt; Bloodfang Oil (Potion) (def: 30s)"</Description>
                      <Color>80FFFF</Color>
                      <GroupHeader>1</GroupHeader>
                    </CheatEntry>
                    <CheatEntry>
                      <ID>136141</ID>
                      <Description>"&gt; Pneumatic Burst (Nightblade) (def: 60s)"</Description>
                      <Color>80FFFF</Color>
                      <GroupHeader>1</GroupHeader>
                    </CheatEntry>
                    <CheatEntry>
                      <ID>136146</ID>
                      <Description>"&gt; Blade Barrier (Nightblade) (def: 3s)"</Description>
                      <Color>80FFFF</Color>
                      <GroupHeader>1</GroupHeader>
                    </CheatEntry>
                    <CheatEntry>
                      <ID>136145</ID>
                      <Description>"&gt; Mirror of Ereoctes (Arcanist) (def: 3s) "</Description>
                      <Color>80FFFF</Color>
                      <GroupHeader>1</GroupHeader>
                    </CheatEntry>
                  </CheatEntries>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>136132</ID>
          <Description>"Skill Secondary"</Description>
          <Options moManualExpandCollapse="1" moAllowManualCollapseAndExpand="1"/>
          <Color>FFFFFF</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
aobscanregion(buffTimeFreeze2,Game.GAME::SkillBuff::Update,Game.GAME::SkillBuff::Update+DF,0F84)
alloc(newmem,$2048,buffTimeFreeze2)

label(foecheck)
label(code)
label(return)

newmem:
  jne foecheck                         // if time on buff remaining is above 0, redirects to my code instead of moving on to subtracting time

foecheck:
//PLAYER/FOE CHECK
  cmp [rsi+00001B44],0                 // checks if it is the player (0) or an enemy (2)
  jne code                             // if not the player, jump to code
//BUFF/DEBUFF CHECK
  cmp [rbx+000002C0],1                 // checks if it is a buff (257) or a debuff (1) on the player
  je code                              // if a debuff, jump to code for time subtraction
  jmp Game.GAME::SkillBuff::Update+CD  // if not a buff, jump past the subtraction of time
                                       //
                                       // alternate buff/debuff check offsets
                                       // rbx+20  buff=63  debuff=79 or 95
                                       // rbx+98  buff=20  debuff=18 or 23
                                       // rbx+BC  buff=0   debuff=1 or 3
                                       // rbx+C8  buff=13  debuff=19 or 20
                                       // rbx+D8  buff=13  debuff=20,19
                                       // rbx+2C0 buff=257 debuff=1 &lt;&lt;&lt; using this one, tests are consistent

code:
  cmp dword ptr [rbx+00000518],00      // run original check
  je Game.GAME::SkillBuff::Update+CD   // if no time remains, jump past the subtraction of time, otherwise subtract time
  jmp return

buffTimeFreeze2:
  jmp newmem
  nop

return:
registersymbol(buffTimeFreeze2)

[DISABLE]
buffTimeFreeze2:
  db 0F 84 A1 00 00 00

unregistersymbol(buffTimeFreeze2)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::SkillBuff::Update+26

Game.GAME::SkillBuff::LoadResources+3E: CC                          - int 3
Game.GAME::SkillBuff::LoadResources+3F: CC                          - int 3
Game.GAME::SkillBuff::Update: 40 57                       - push rdi
Game.GAME::SkillBuff::Update+2: 48 83 EC 50                 - sub rsp,50
Game.GAME::SkillBuff::Update+6: 48 C7 44 24 20 FE FF FF FF  - mov qword ptr [rsp+20],FFFFFFFFFFFFFFFE
Game.GAME::SkillBuff::Update+F: 48 89 5C 24 60              - mov [rsp+60],rbx
Game.GAME::SkillBuff::Update+14: 41 8B F8                    - mov edi,r8d
Game.GAME::SkillBuff::Update+17: 48 8B D9                    - mov rbx,rcx
Game.GAME::SkillBuff::Update+1A: E8 61 F5 F7 FF              - call Game.GAME::Skill::Update
Game.GAME::SkillBuff::Update+1F: 83 BB 18 05 00 00 00        - cmp dword ptr [rbx+00000518],00
// ---------- INJECTING HERE ----------
Game.GAME::SkillBuff::Update+26: 0F 84 A1 00 00 00           - je Game.GAME::SkillBuff::Update+CD
// ---------- DONE INJECTING  ----------
Game.GAME::SkillBuff::Update+2C: 29 BB 14 05 00 00           - sub [rbx+00000514],edi
Game.GAME::SkillBuff::Update+32: 0F 89 95 00 00 00           - jns Game.GAME::SkillBuff::Update+CD
Game.GAME::SkillBuff::Update+38: 48 8B 4B 30                 - mov rcx,[rbx+30]
Game.GAME::SkillBuff::Update+3C: 48 85 C9                    - test rcx,rcx
Game.GAME::SkillBuff::Update+3F: 75 0E                       - jne Game.GAME::SkillBuff::Update+4F
Game.GAME::SkillBuff::Update+41: 48 8B 0D F0 3F 4A 00        - mov rcx,[Game.GAME::gGameEngine]
Game.GAME::SkillBuff::Update+48: 48 81 C1 B8 5A 03 00        - add rcx,00035AB8
Game.GAME::SkillBuff::Update+4F: 48 8B 01                    - mov rax,[rcx]
Game.GAME::SkillBuff::Update+52: FF 50 08                    - call qword ptr [rax+08]
Game.GAME::SkillBuff::Update+55: 48 8B F8                    - mov rdi,rax
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>136142</ID>
              <Description>"&gt;&gt;&gt; NOTES"</Description>
              <Options moHideChildren="1" moManualExpandCollapse="1" moAllowManualCollapseAndExpand="1"/>
              <Color>80FFFF</Color>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>136267</ID>
                  <Description>"Includes check for debuffs on the player and excludes them"</Description>
                  <Color>80FFFF</Color>
                  <GroupHeader>1</GroupHeader>
                </CheatEntry>
                <CheatEntry>
                  <ID>136269</ID>
                  <Description>"Example Buffs Affected"</Description>
                  <Color>80FFFF</Color>
                  <GroupHeader>1</GroupHeader>
                  <CheatEntries>
                    <CheatEntry>
                      <ID>136144</ID>
                      <Description>"&gt; Lethal Assault (Nightblade &gt; Amarasta's Blade Burst) (def: 8s)"</Description>
                      <Color>80FFFF</Color>
                      <GroupHeader>1</GroupHeader>
                    </CheatEntry>
                  </CheatEntries>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
        <CheatEntry>
          <ID>136304</ID>
          <Description>"Skill Passive On Hit"</Description>
          <Options moManualExpandCollapse="1" moAllowManualCollapseAndExpand="1"/>
          <Color>FFFFFF</Color>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>//Grim Dawn 1.2.0.3

[ENABLE]
aobscanregion(buffTimeFreeze3,Game.GAME::Skill_PassiveOnHitBuffSelf::Update,Game.GAME::Skill_PassiveOnHitBuffSelf::Update+7F,2B)
alloc(newmem,$1000,buffTimeFreeze3)

label(code)
label(return)

newmem:
//PLAYER/FOE CHECK
  cmp [rsi+00001B44],0     // checks if it is the player (0) or an enemy (2)
  jne code                 // if not the player, jump to code
//
  sub ecx,0
  mov [rbx+00000504],ecx
  jmp return

code:
  sub ecx,edi
  mov [rbx+00000504],ecx
  jmp return

buffTimeFreeze3:
  jmp newmem
  nop 3

return:
registersymbol(buffTimeFreeze3)

[DISABLE]
buffTimeFreeze3:
  db 2B CF 89 8B 04 05 00 00

unregistersymbol(buffTimeFreeze3)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Skill_PassiveOnHitBuffSelf::Update+44

Game.GAME::Skill_PassiveOnHitBuffSelf::Update+1E: 48 8B 0D 23 27 4C 00     - mov rcx,[Game.GAME::gGameEngine]
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+25: 48 81 C1 B8 5A 03 00     - add rcx,00035AB8
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+2C: 48 8B 01                 - mov rax,[rcx]
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+2F: FF 50 08                 - call qword ptr [rax+08]
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+32: 4C 8B C8                 - mov r9,rax
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+35: 48 85 C0                 - test rax,rax
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+38: 74 36                    - je Game.GAME::Skill_PassiveOnHitBuffSelf::Update+70
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+3A: 8B 8B 04 05 00 00        - mov ecx,[rbx+00000504]
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+40: 85 C9                    - test ecx,ecx
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+42: 7E 2C                    - jle Game.GAME::Skill_PassiveOnHitBuffSelf::Update+70
// ---------- INJECTING HERE ----------
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+44: 2B CF                    - sub ecx,edi
// ---------- DONE INJECTING  ----------
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+46: 89 8B 04 05 00 00        - mov [rbx+00000504],ecx
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+4C: 85 C9                    - test ecx,ecx
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+4E: 7F 20                    - jg Game.GAME::Skill_PassiveOnHitBuffSelf::Update+70
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+50: 48 8B 00                 - mov rax,[rax]
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+53: 4C 8D 44 24 30           - lea r8,[rsp+30]
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+58: 48 8B D3                 - mov rdx,rbx
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+5B: C7 44 24 30 00 00 00 00  - mov [rsp+30],00000000
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+63: 49 8B C9                 - mov rcx,r9
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+66: 66 C7 44 24 34 00 00     - mov word ptr [rsp+34],0000
Game.GAME::Skill_PassiveOnHitBuffSelf::Update+6D: FF 50 30                 - call qword ptr [rax+30]
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>136305</ID>
              <Description>"&gt;&gt;&gt; NOTES"</Description>
              <Options moHideChildren="1" moManualExpandCollapse="1" moAllowManualCollapseAndExpand="1"/>
              <Color>80FFFF</Color>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>136306</ID>
                  <Description>"Example Buffs Affected"</Description>
                  <Color>80FFFF</Color>
                  <GroupHeader>1</GroupHeader>
                  <CheatEntries>
                    <CheatEntry>
                      <ID>136307</ID>
                      <Description>"&gt; Deadly Aim (Inquisitor)"</Description>
                      <Color>80FFFF</Color>
                      <GroupHeader>1</GroupHeader>
                    </CheatEntry>
                  </CheatEntries>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
EDIT: Re-pasted the code as it did not paste properly last time.
Last edited by StinVec on Sat Dec 16, 2023 8:46 pm, edited 6 times in total.

Scheimann
Expert Cheater
Expert Cheater
Posts: 107
Joined: Sun Jul 21, 2019 4:27 am
Reputation: 25

Re: Grim Dawn + All DLC's

Post by Scheimann »

StinVec wrote:
Fri Dec 15, 2023 8:18 pm
I have the Freeze Buff Timers option completely redone, but I'm still doing some runnning around and testing to make sure it doesn't encounter any problems. I will add it to this post if I don't encounter any issues after a little more testing.

_____
It has two options; Freeze Skill Primary & Potion Buffs, and then Freeze Skill Secondary buffs.
Examples of Skill Primary Buffs would be:
- Bloodfang Oil (Potion) (def: 30s)
- Pneumatic Burst (Nightblade) (def: 60s)
- Blade Barrier (Nightblade) (def: 3s)
- Mirror of Ereoctes (Arcanist) (def: 3s)

An example of Skill Secondary Buffs would be:
- Lethal Assault (Nightblade > Amarasta's Blade Burst) (def: 8s)

The options first run a check to see if the buff is on the player or on an enemy/ally.
If it is not on the player, the normal code is run of subtracting time.

If it is on the player then it will then check to see if it is a buff or a debuff.
If it is a debuff, the normal code is run of subtracting time.

I haven't yet done further testing to see if it can also extend to buffs on pets and allies.

There was one problem I encountered with the Freeze Skill Primary Buffs option that I needed to address, which was the "Anguish" debuff effect from the "Chains of Anguish" belt that I'm sure everyone is familiar with.

The belt gives great effects, like +100% damage, but you have a 10% chance of triggering the Anguish debuff on each attack which will slow your movement and reduce damage and resistances. The Anguish debuff lasts for 5 seconds, but if you are using Albrecht's Aether Ray or Super Attack Speed or other fast attacks, you essentially trigger this debuff the entire time you are attacking.

The problem was, Anguish gets classified as a "buff" due to being an effect from the gear item, which meant it was getting frozen as well as all of your other Skill Primary buffs. This non-buff being frozen would leave you always running slower, having lower resistances and doing less damage than you should. You would need to disable the option to allow its timer to run out and then reactivate the option, but it would just get reapplied and refrozen the next time you attacked something.

I managed to also implement a check after the buff/debuff check on the Freeze Skill Primary Buffs option to test whether the buff is a normal buff, or if it is the Anguish non-buff.

If Anguish is the "buff" that is detected, it will pass to the normal code so time will get subtracted from it properly.
Lovely! Can't wait to test it D:

I know there's a DLC potion that makes you drunk... I'm not sure if it's classified as a buff or a debuff, but since it's a simple asset to obtain I think it would be interesting for you to research how to specifically identify which buff/debuff and create a short list of exceptions to running the script.

This potion can be obtained from those NPCs who give illusions acquired with the Loyalty Pack.

User avatar
StinVec
Table Makers
Table Makers
Posts: 135
Joined: Sun Jun 25, 2017 7:02 am
Reputation: 209

Re: Grim Dawn + All DLC's

Post by StinVec »

@Scheimann
Hey. Testing seemed to go alright. I encountered some passive skill buffs that weren't getting frozen and made an additional option to freeze them. I updated the above post with the option that now includes three options for freezing buffs, and also more text in the post describing the options.

There are quite a few types of buffs that aren't affected by the option yet though, such as a Skill Passive Health Threshold buff where it only triggers when you fall below a certain health percentage. There would need to be quite a few options made to account for each buff type activation classification.

I updated the Skill Primary & Potions option with a check for the Burrwitch Brew buff and set it to exclude that from being frozen by default. I included a lot of notes in the codes for the options, as well as being able to enable/disable checks like this one for those that want this buff to get frozen as well.

If you or anyone else encounters any issues of some buffs not getting frozen consistently, or some enemies also having their buffs frozen, of some debuffs mistakenly getting frozen, or anything else about the option, let me know and I'll try to see what can be done to fix/expand it.

EDIT:
For the topic of identifying buffs, it isn't really "identifying" them and excluding them, it's finding an address offset that has a reliably-consistent value that is common to the values of addresses that you want affected and also a different value for what you want excluded.

For excluding the Burrwitch Brew and Anguish, it was mainly a laundry list of steps and testing to identify them:
1) Hit to find what addresses are accessed by the main option address (Game.GAME::Skill_BuffSelfDuration::Update+4B)
2) Activate my real buffs and mark those accessed addresses as Group 1 for commonality search
3) Trigger the buff I want excluded and mark its accessed address as Group 2
4) Run the commonality search and then also run the structure compare (for RBX in this case)
5) Go down the list of address offsets and compare the values of the addresses of the three buffs I want affected against the value of that offset for the buff I want excluded
6) Find a good one with as similar a value for the real buffs that is different from the one I want to exclude and note the offset
7) Close and re-open the game and repeat that 3-10 times to make sure the offset address is consistent and reliable in existing with those values across game launches
8) Add the check in the option code so if that rbx+### offset address has a value of what I want excluded, then jump to normal code and deduct time, but if it has a value of what was common to the real buffs, continue on and don't subtract time

I also included some other offsets with consistent commonalities that might be useful in case the one I chose ends up not working too well.

User avatar
StinVec
Table Makers
Table Makers
Posts: 135
Joined: Sun Jun 25, 2017 7:02 am
Reputation: 209

Re: Grim Dawn + All DLC's

Post by StinVec »

Re-configured the one alternate Invincible (Player Only) option as it wasn't working properly.
Invincible (Player Only) (Enables 'isInvincible' function) - 1.2.0.3 x64 (RE-CONFIGURED)

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>136068</ID>
      <Description>"Invincible (Player Only) (Enables 'isInvincible' function)"</Description>
      <Color>FFFFFF</Color>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>//Grim Dawn 1.2.0.3

define(address,Game.GAME::Player::IsInvincible+23)
define(bytes,0F B6 83 9C 1D 00 00)

[ENABLE]
assert(address,bytes)
alloc(newmem,$1000,Game.GAME::Player::IsInvincible+23)

label(code)
label(return)

newmem:
  cmp [rbx+1D9C],0                  //Checks if the invincible flag is already on
  jne code                          //If the flag is already on (1), go to normal code
  mov eax,1                         //If the flag was off, set the actual invincible function to being on (1) and ignore the flag
  jmp return

code:
  movzx eax,byte ptr [rbx+00001D9C] //Moves the value of the flag (0 off, or 1 on) to eax (the actual invincible function)
  jmp return

address:
  jmp newmem
  nop 2
return:

[DISABLE]
address:
  db bytes
  // 0F B6 83 9C 1D 00 00

dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Game.GAME::Player::IsInvincible+23

Game.GAME::Player::IsInvincible: 40 53                    - push rbx
Game.GAME::Player::IsInvincible+2: 48 83 EC 20              - sub rsp,20
Game.GAME::Player::IsInvincible+6: 48 8B D9                 - mov rbx,rcx
Game.GAME::Player::IsInvincible+9: FF 15 E9 60 1E 00        - call qword ptr [Game.dll+4EE128]
Game.GAME::Player::IsInvincible+F: 48 8B 0D 62 B2 5B 00     - mov rcx,[Game.GAME::gGameEngine]
Game.GAME::Player::IsInvincible+16: 8B D0                    - mov edx,eax
Game.GAME::Player::IsInvincible+18: E8 43 F1 F3 FF           - call Game.GAME::GameEngine::IsPlayingVideo
Game.GAME::Player::IsInvincible+1D: 84 C0                    - test al,al
Game.GAME::Player::IsInvincible+1F: B0 01                    - mov al,01
Game.GAME::Player::IsInvincible+21: 75 07                    - jne Game.GAME::Player::IsInvincible+2A
// ---------- INJECTING HERE ----------
Game.GAME::Player::IsInvincible+23: 0F B6 83 9C 1D 00 00     - movzx eax,byte ptr [rbx+00001D9C]
// ---------- DONE INJECTING  ----------
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
Game.GAME::Player::CanMoveTo: 40 53                    - push rbx
Game.GAME::Player::CanMoveTo+2: 48 83 EC 50              - sub rsp,50
Game.GAME::Player::CanMoveTo+6: F3 0F 10 89 38 47 00 00  - movss xmm1,[rcx+00004738]
Game.GAME::Player::CanMoveTo+E: 0F 57 DB                 - xorps xmm3,xmm3
Game.GAME::Player::CanMoveTo+11: F3 0F 10 05 E7 04 33 00  - movss xmm0,[Game.GAME::WeaponArmor_Offhand::`vftable'+10A8]
Game.GAME::Player::CanMoveTo+19: 33 DB                    - xor ebx,ebx
Game.GAME::Player::CanMoveTo+1B: 48 8B 89 90 0C 00 00     - mov rcx,[rcx+00000C90]
}
</AssemblerScript>
    </CheatEntry>
  </CheatEntries>
</CheatTable>
The way the 'IsInvincible' function works is that:
  • 1) A cutscene sets the Invincible flag to 1, which is the flag pointed to in the Player Info Pointers options. The flag doesn't actually do anything and is just a byte sitting there doing nothing and only gets changed by different game events.
  • 2) In the "Game.GAME::Player::IsInvincible+23" function, it is running and looks to see if that flag is set to 1 by a game function (like a cutscene). If this finds that the value of that address is set to 1 then it moves that value into its "eax", which is the actual thing that makes you invincible.
Now, instead of this option doing a register compare like it had been unreliably doing, it now looks at the actual value stored for the Invincible Flag, the same Invincible flag address pointed at in the Player Info Pointer options.

If this flag is already set to 1 by the game or if the player had manually set that flag to 1 in the Player Info Pointer option, then this option does nothing since you are already set to being invincible.

However, if it finds that the flag is set to 0, this option will then leave that flag as being 0 and ignore it, then it just moves 1 into "eax" so the actual invincible function becomes active despite this other flag address still being at 0.

Disabling this option would then just revert whatever the value of that flag is as being what gets put into "eax".
If you have it manually set to 1 in the Player Info Pointers section, then 1 is still copied to "eax" and you are still invincible.
If you had it set to 0 or if the game had set it to 0 due to not being in a cutscene, then 0 will be copied to "eax" and the invincible function disabled.

This way allows for not interfering with the game's normal setting of that flag in instances like cutscenes, while also not permanently enabling that function even if the option is disabled.
Last edited by StinVec on Sat Dec 16, 2023 8:43 pm, edited 1 time in total.

Scheimann
Expert Cheater
Expert Cheater
Posts: 107
Joined: Sun Jul 21, 2019 4:27 am
Reputation: 25

Re: Grim Dawn + All DLC's

Post by Scheimann »

StinVec wrote:
Sat Dec 16, 2023 11:35 am
@Scheimann
...
Thank you! I'll test rn! :D

btw i was not able to copy-paste the code in the table this time. Unknown reason, so i did it manually

User avatar
StinVec
Table Makers
Table Makers
Posts: 135
Joined: Sun Jun 25, 2017 7:02 am
Reputation: 209

Re: Grim Dawn + All DLC's

Post by StinVec »

Scheimann wrote:
Sat Dec 16, 2023 8:15 pm
StinVec wrote:
Sat Dec 16, 2023 11:35 am
@Scheimann
...
Thank you! I'll test rn! :D

btw i was not able to copy-paste the code in the table this time. Unknown reason, so i did it manually
Awesome. Sorry about the code copy>paste. I just compared the pasted option in Notepad++ against what was in that above code box and half of it was missing both in sections and individual lines, with some bits being different.

Instead of copying the option in CE with CTRL+C like last time, I selected the option and then right-clicked>copy and then pasted that into the comment. I then selected the above code and copied it and then pasted it into Notepad++ and compared the two again and the code above now matches the option.

I think the issue either came from some kind of formatting issue from this website with me editing and re-editing the comment maybe breaking some of its content, or the issue may have come from my copying the option from CE using CTRL+C instead of right-click>copy. Maybe CTRL+C doesn't copy such a long multi-option with a lot of comments in the code too well.

Try to use the code that I re-pasted into the above comment instead of the previous one you manually copied and added to your table. I don't know what went wrong with that previous code, but it is likely all messed up and won't work properly.

EDIT:
Just tested it again. Yeah, the issue came from selecting the option in CE and hitting CTRL+C to copy the option. What gets pasted doing that is very different than if I select the option and then right-click it and hit Copy and then paste that into here. I think CE adds other information and changes some information in the option when you do keyboard copy>paste instead of right-click copy>paste, such as address states and other things in the table code and CE formatting.

I'll copy options using right-click>copy from now on to avoid issues like this. I'll go back to my previous comments with options and re-paste the code into them to make sure the code actually is what it is supposed to be.

(I've now updated most previous posts with options with code copied using select>right-click>copy instead of select>CTRL+C to copy)

User avatar
absrm01
Cheater
Cheater
Posts: 25
Joined: Tue Aug 09, 2022 5:53 pm
Reputation: 3

Re: Grim Dawn + All DLC's

Post by absrm01 »

R3V0L wrote:
Sun Nov 05, 2023 11:31 pm

Updated for
Base game 1.1.9.8
DoM 1.40b
Reign of Terror 0.7.3.1
Thank you very much for this wonderful work. My PC is having problems with X64.
I couldn't find a table that works with x32. I found this cheat table of yours and used it.

Your cheat table works great but has limited features.
Some features that are available in x64 are not available in x32. Is it possible to add non-existent features to x32?
Last edited by absrm01 on Mon Dec 18, 2023 12:46 pm, edited 2 times in total.

User avatar
StinVec
Table Makers
Table Makers
Posts: 135
Joined: Sun Jun 25, 2017 7:02 am
Reputation: 209

Re: Grim Dawn + All DLC's

Post by StinVec »

bubblybroccoli wrote:
Sun Oct 22, 2023 4:21 pm
Man, it's such a shame the Grim Dawn Trained Hard ceased development years ago, I never once found in any other trainer or cheat table with the option to increase enemy spawns/elites/heroes/nemesis without having to download a mod that effectively makes me choose a moded map instead of the base game and makes me have a separate character. Is it possible to add that function to these tables? The author of the tool never released his code and fell off the face of the earth.
Hey. I just started looking into this to see if I can pinpoint what determines spawn density and see if it might be able to be made into an option.

I found "Game.GAME::ControllerMonster::Load", which is a massive section related to enemy spawning and I just started poking around in it. It looks like some areas of instructions around "Load+125" are involved in controlling spawn density. I tested some with it and it seems to only access addresses of 'adds', or freshly-spawned enemies raised by a boss such as the first 'boss' guy outside the Prison by that one tree.

I will do some more testing with that area to see if I can make any progress with it.

Scheimann
Expert Cheater
Expert Cheater
Posts: 107
Joined: Sun Jul 21, 2019 4:27 am
Reputation: 25

Re: Grim Dawn + All DLC's

Post by Scheimann »

StinVec wrote:
Sun Dec 17, 2023 5:16 pm
bubblybroccoli wrote:
Sun Oct 22, 2023 4:21 pm
Man, it's such a shame the Grim Dawn Trained Hard ceased development years ago, I never once found in any other trainer or cheat table with the option to increase enemy spawns/elites/heroes/nemesis without having to download a mod that effectively makes me choose a moded map instead of the base game and makes me have a separate character. Is it possible to add that function to these tables? The author of the tool never released his code and fell off the face of the earth.
.
Taking advantage of your quote to give information to the other person:

You can simply use the mod you want ( in this case the one to change the density of the mobs ) in your main campaign using /basemods and placing the files of said mod in the root folder of the mods. However, I must warn you that if you merge something from the mod that has a dependency that doesn't exist in the main campaign (for example, a new class, items, new maps, textures, etc.) you may run into problems.

Needless to say, but whether it's for cheats or any mods, make a backup of your save first!

@StinVec

Thank you for providing us this attention and for all the support. I'll test the new code soon!

In the meantime, do you think it would be possible to do something with the loot randomizer or some form of loot boost?

Other options that I think would be interesting, would be the ability to edit and/or multiply/add/subtract/split our OA and DA (or simply make a 100% critical chance?)

I know that No Cooldowns already does this, but I think that an option that reduces cooldowns instead of resetting them, or specifically resetting the cooldown of potions only, would be interesting, but of course, far from being a priority.

User avatar
StinVec
Table Makers
Table Makers
Posts: 135
Joined: Sun Jun 25, 2017 7:02 am
Reputation: 209

Re: Grim Dawn + All DLC's

Post by StinVec »

Scheimann wrote:
Mon Dec 18, 2023 11:27 pm
@StinVec

Thank you for providing us this attention and for all the support. I'll test the new code soon!

In the meantime, do you think it would be possible to do something with the loot randomizer or some form of loot boost?

Other options that I think would be interesting, would be the ability to edit and/or multiply/add/subtract/split our OA and DA (or simply make a 100% critical chance?)

I know that No Cooldowns already does this, but I think that an option that reduces cooldowns instead of resetting them, or specifically resetting the cooldown of potions only, would be interesting, but of course, far from being a priority.
You're welcome! I haven't had a chance to look at loot randomization or reduced cooldown times (instead of no cooldown times) yet at all.

However, I managed to get a decent Offensive Ability / Defensive Ability Control option made. It may not be the best, but I think I got it configured fairly decently.

I don't think there is an issue of it affecting enemies as well from what I noticed, so I didn't include a player/foe check. If you set it to high crit chance and notice enemies are critting on you also (I didn't), let me know and I will try to adjust it to put a check in so it would be sure to only affect the player.

Here is what the option looks like: [Link]

Each option has two entries for them: the unaltered normal value and a value that you can customize.
When you activate the option, the custom value is set to default and you can change it to what you want.
You can also choose preset values I configured in the dropdowns:
- OA has 50%, 75%, 100% Crit Chance preset values
- DA has a 55% Be Hit / 0% Be Crit On preset value

You can also change the codes for the options where I note in them and change the default value so activating the option sets it to the value you want. (changing an "rax" to be a custom #)

This option should work alright. If this isn't what you were wanting or if you have any issues with it, please let me know.

I also copied the option from my table using right-click>copy instead of hitting CTRL+C like previously to avoid that issue of CE altering and breaking the option code when copying it that other way.

(Complete option - copy the code and paste it [CTRL+V] into your existing cheat table.)

[OPTION CODE REMOVED DUE TO ISSUES PRESENT IN IT]
Last edited by StinVec on Sun Jul 21, 2024 4:22 pm, edited 2 times in total.

Post Reply

Who is online

Users browsing this forum: admantx, Akira, Bing [Bot], chiyohax0r, Google Adsense [Bot], kakashi97440, Kuradeon, nthdm, Sipsi, Yanoto