UndeadNonHero wrote: ↑Wed Mar 03, 2021 6:56 am
I did not take anything in a negative light. I just felt that more needed to be clarified.
I should like to point out that downloading and installing the Grim Internals mod will make testing much easier since it allows you to teleport directly to the area that I mentioned in my above post (should anyone decide to try to make the cheat). I presume that the mod does not alter the memory area in question since teleportation is disabled in the mod for blocked areas. I do however suspect that the area in memory is likely in a different spot between 32bit and 64bit versions in the game since there is a mod that works to circumvent this for the 64bit version only. To force steam to use the 64bit version the following needs to be pasted into the launch options of steam: "C:\Program Files (x86)\Steam\steamapps\common\Grim Dawn\x64\Grim Dawn.exe" %command% It is essential to do so if using the Grim Internals mod in order to launch the 64bit version of the game. No doubt people that play both versions of the game would want the cheat.
I've been putting some time toward it each day and I'm still trying to figure it out. It's more complex than what I'm used to and I'm still trying to figure it out.
I checked to see what addresses were changing between the disabling zone and stepping out so it reactivates. I managed to narrow it down to a single address being changed, but locking it to 1 caused it to cycle back and forth between disabled and enabled as CE would update and force it enabled but not as quickly as the game is disabling it.
I looked to see what wrote to that address to see if I could alter the instruction so that it wouldn't try to change it in the first place, but it's more complex than that it seems.
The two separated instructions below write to the address:
Grim Dawn.exe+1D88D4 - FF 15 5EC40B00 - call qword ptr ["Grim Dawn.exe"+294D38] { ->Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport }
Grim Dawn.exe+1D88DA - 84 C0 - test al,al
Grim Dawn.exe+1D88DC - 0F84 8C000000 - je "Grim Dawn.exe"+1D896E { ->Grim Dawn.exe+1D896E }
Grim Dawn.exe+1D88E2 - 48 8B 0D 1F780B00 - mov rcx,["Grim Dawn.exe"+290108] { (7FEE505D6C8) }
Grim Dawn.exe+1D88E9 - 48 8B 09 - mov rcx,[rcx]
Grim Dawn.exe+1D88EC - FF 15 4EC40B00 - call qword ptr ["Grim Dawn.exe"+294D40] { ->Game.GAME::GameEngine::MainPlayerHasPersonalTeleport }
RiftGateOn - E9 0977E1FF - jmp 13FE70000
Grim Dawn.exe+1D88F7 - 0F1F 00 - nop dword ptr [rax]
Grim Dawn.exe+1D88FA - 84 C0 - test al,al
Grim Dawn.exe+1D88FC - 74 39 - je "Grim Dawn.exe"+1D8937 { ->Grim Dawn.exe+1D8937 }
Grim Dawn.exe+1D88FE - 66 41 C7 87 D9110000 0100 - mov word ptr [r15+000011D9],0001 { 1 }
Grim Dawn.exe+1D8908 - 41 C6 87 D00F0000 00 - mov byte ptr [r15+00000FD0],00 { 0 }
Grim Dawn.exe+1D8910 - 41 88 9F 89140000 - mov [r15+00001489],bl
Grim Dawn.exe+1D8917 - 41 C6 87 8C140000 00 - mov byte ptr [r15+0000148C],00 { 0 }
Grim Dawn.exe+1D891F - 84 DB - test bl,bl
Grim Dawn.exe+1D8921 - 74 08 - je "Grim Dawn.exe"+1D892B { ->Grim Dawn.exe+1D892B }
Grim Dawn.exe+1D8923 - 41 C6 87 8A140000 00 - mov byte ptr [r15+0000148A],00 { 0 }
Grim Dawn.exe+1D892B - 80 F3 01 - xor bl,01 { 1 }
Grim Dawn.exe+1D892E - 41 88 9F 80120000 - mov [r15+00001280],bl
Grim Dawn.exe+1D8935 - EB 6B - jmp "Grim Dawn.exe"+1D89A2 { ->Grim Dawn.exe+1D89A2 }
Grim Dawn.exe+1D8937 - 41 88 9F D9110000 - mov [r15+000011D9],bl
Grim Dawn.exe+1D893E - 84 DB - test bl,bl
Grim Dawn.exe+1D8940 - 74 08 - je "Grim Dawn.exe"+1D894A { ->Grim Dawn.exe+1D894A }
Grim Dawn.exe+1D8942 - 41 C6 87 DA110000 00 - mov byte ptr [r15+000011DA],00 { 0 }
Grim Dawn.exe+1D894A - 41 C6 87 D00F0000 01 - mov byte ptr [r15+00000FD0],01 { 1 }
Grim Dawn.exe+1D8952 - 66 41 C7 87 89140000 0100 - mov word ptr [r15+00001489],0001 { 1 }
Grim Dawn.exe+1D895C - 41 C6 87 8C140000 00 - mov byte ptr [r15+0000148C],00 { 0 }
Grim Dawn.exe+1D8964 - 41 C6 87 80120000 00 - mov byte ptr [r15+00001280],00 { 0 }
Grim Dawn.exe+1D896C - EB 34 - jmp "Grim Dawn.exe"+1D89A2 { ->Grim Dawn.exe+1D89A2 }
Grim Dawn.exe+1D896E - 66 41 C7 87 89140000 0100 - mov word ptr [r15+00001489],0001 { 1 }
Grim Dawn.exe+1D8978 - 41 C6 87 8C140000 00 - mov byte ptr [r15+0000148C],00 { 0 }
Grim Dawn.exe+1D8980 - 41 C6 87 80120000 00 - mov byte ptr [r15+00001280],00 { 0 }
Grim Dawn.exe+1D8988 - 66 41 C7 87 D9110000 0100 - mov word ptr [r15+000011D9],0001 { 1 }
Grim Dawn.exe+1D8992 - 41 C6 87 DC110000 00 - mov byte ptr [r15+000011DC],00 { 0 }
Grim Dawn.exe+1D899A - 41 C6 87 D00F0000 00 - mov byte ptr [r15+00000FD0],00 { 0 }
Grim Dawn.exe+1D89A2 - 41 80 BF 58120900 00 - cmp byte ptr [r15+00091258],00 { 0 }
Those are:
- Grim Dawn.exe+1D892E - 41 88 9F 80120000 - mov [r15+00001280],bl
And:
- Grim Dawn.exe+1D8980 - 41 C6 87 80120000 00 - mov byte ptr [r15+00001280],00 { 0 }
I tried several different things and tried inverting the instructions even so that it would be disabled normally and then enabled when entering the 'disabling' zone. All it resulted in was it being disabled at all times. I can't follow the logic in the checking process.
I also found this which controls whether or not the player is able to use the personal teleporter function at all.
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport - 48 89 6C 24 10 - mov [rsp+10],rbp
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+5- 48 89 74 24 18 - mov [rsp+18],rsi
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+A- 57 - push rdi
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+B- 48 81 EC 80000000 - sub rsp,00000080 { 128 }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+12- 48 8B F1 - mov rsi,rcx
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+15- E8 D6850100 - call Game.GAME::GameEngine::GetMainPlayer
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+1A- 48 8B F8 - mov rdi,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+1D- 48 85 C0 - test rax,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+20- 0F84 F2000000 - je Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+118
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+26- 48 8B C8 - mov rcx,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+29- 48 89 9C 24 90000000 - mov [rsp+00000090],rbx
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+31- FF 15 A9482C00 - call qword ptr [Game.dll+4DD500] { ->Engine.GAME::Entity::GetRegion }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+37- 48 8D 54 24 40 - lea rdx,[rsp+40]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+3C- 48 8B CF - mov rcx,rdi
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+3F- 48 8B D8 - mov rbx,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+42- FF 15 80482C00 - call qword ptr [Game.dll+4DD4E8] { ->Engine.GAME::Entity::GetCoords }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+48- 48 8B C8 - mov rcx,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+4B- FF 15 EF472C00 - call qword ptr [Game.dll+4DD460] { ->Engine.GAME::WorldVec3::GetRegionPosition }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+51- 48 8B CB - mov rcx,rbx
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+54- 48 8B E8 - mov rbp,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+57- FF 15 8B4C2C00 - call qword ptr [Game.dll+4DD908] { ->Engine.GAME::WaterRenderInterface::GetVertexDeclaration }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+5D- 48 8B 9C 24 90000000 - mov rbx,[rsp+00000090]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+65- 48 85 C0 - test rax,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+68- 74 54 - je Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+BE
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+6A- 48 8B C8 - mov rcx,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+6D- FF 15 7D4C2C00 - call qword ptr [Game.dll+4DD910] { ->Engine.GAME::Level::GetSectorLayers }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+73- 48 85 C0 - test rax,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+76- 74 46 - je Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+BE
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+78- F3 0F2C 4D 08 - cvttss2si ecx,[rbp+08]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+7D- 41 B8 0A000000 - mov r8d,0000000A { 10 }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+83- 48 8D 54 24 30 - lea rdx,[rsp+30]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+88- F3 44 0F2C 4D 00 - cvttss2si r9d,[rbp+00]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+8E- 89 4C 24 20 - mov [rsp+20],ecx
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+92- 48 8B C8 - mov rcx,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+95- FF 15 5D4C2C00 - call qword ptr [Game.dll+4DD918] { ->Engine.GAME::SectorLayers::GetTargetId }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+9B- 48 8B 05 8E432C00 - mov rax,[Game.dll+4DD050] { (7FEE54EB300) }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+A2- 4C 8D 44 24 30 - lea r8,[rsp+30]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+A7- BA 0A000000 - mov edx,0000000A { 10 }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+AC- 48 8B 08 - mov rcx,[rax]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+AF- 48 83 C1 08 - add rcx,08 { 8 }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+B3- FF 15 474C2C00 - call qword ptr [Game.dll+4DD920] { ->Engine.GAME::SectorDataManager::GetSectorData }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+B9- 48 85 C0 - test rax,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+BC- 75 5A - jne Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+118
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+BE- 48 83 BE D0590300 00 - cmp qword ptr [rsi+000359D0],00 { 0 }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+C6- 74 13 - je Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+DB
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+C8- 48 8D 96 C0590300 - lea rdx,[rsi+000359C0]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+CF- 48 8B CF - mov rcx,rdi
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+D2- E8 E99C0E00 - call Game.GAME::Player::HasToken
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+D7- 84 C0 - test al,al
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+D9- 74 3D - je Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+118
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+DB- 48 8B 0D 4E432C00 - mov rcx,[Game.dll+4DD050] { (7FEE54EB300) }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+E2- 48 8B 09 - mov rcx,[rcx]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+E5- FF 15 25552C00 - call qword ptr [Game.dll+4DE230] { ->Engine.GAME::Engine::GetGameInfo }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+EB- 48 8B C8 - mov rcx,rax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+EE- FF 15 245A2C00 - call qword ptr [Game.dll+4DE738] { ->Engine.GAME::GameInfo::GetDifficulty }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+F4- 48 63 C8 - movsxd rcx,eax
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+F7- 48 8D 04 49 - lea rax,[rcx+rcx*2]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+FB- 48 8B 8C C7 903F0000 - mov rcx,[rdi+rax*8+00003F90]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+103- 48 2B 8C C7 883F0000 - sub rcx,[rdi+rax*8+00003F88]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+10B- 48 C1 F9 04 - sar rcx,04 { 4 }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+10F- 48 85 C9 - test rcx,rcx
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+112- 74 04 - je Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+118
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+114- B0 01 - mov al,01 { 1 }
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+116- EB 02 - jmp Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+11A
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+118- 32 C0 - xor al,al
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+11A- 4C 8D 9C 24 80000000 - lea r11,[rsp+00000080]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+122- 49 8B 6B 18 - mov rbp,[r11+18]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+126- 49 8B 73 20 - mov rsi,[r11+20]
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+12A- 49 8B E3 - mov rsp,r11
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+12D- 5F - pop rdi
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+12E- C3 - ret
Game.GAME::GameEngine::MainPlayerCanUsePersonalTeleport+12F- CC - int 3
I'm still trying to work through it and try to learn as much as I can and to understand the checks and logic and try to figure out how to maybe prevent the game from even checking to see if it should be disabled or not so that it would just remain enabled at all times.
All I've managed to do so far is either have it disabled at all times, or remain visible and just greyed out and unclickable instead of being invisible entirely when it gets disabled.
If anyone else has any insight into this function or an idea of how it can be made to stay enabled instead of getting disabled, I'd welcome some help or someone to make the option entirely so I can see what I'm not understanding and how it should be done.