Don't know if this thread is still alive but i'll try.
So i just install the latest version (Build 125236) which came recently and i used cheat table version (Build 124233) and i only used the infinite biomass fuel. the only problem i encountered is a memory leak average by 1 MB/s. an example is in the photo. the game was in the main menu at the time.
so what did i do wrong or what should i do in this matter ?? Thanks in advance for your good work
Update: the memory leak happens when selecting the game process.
Update 2: So i found a fix for the leak issue i'll post in case if anyone needs it.
So the issue rises due to heavy processing (i made the name up). or which is known as Symbols loading. if you opened the cheat engine and then choose the game process. open memory view (find it under the address list) you'll in the first symbols loading and it's stuck at 50%. so it first for it to be solved it'll need like 2 hours and shit ton of ram. but with some digging i found a really good fix for that.
1- Delete symsrv from the win32 and win64 folders located in cheat engine directory
2- open the game
3- alt-tap and then run cheat engine
4- choose the game process and then go to memory view
5- From the menu (File) choose ( Use windows debug symbols )
after that it'll load the process correctly and the memory leak will be fixed. Now you can peacefully add any cheat table you want. I've tested the latest table and everything worked wonderfully
Note 1: the problem only occurred with the recent version of the game (Build 125236).
Note 2: you have to do steps 2-5 every time you want the (tweak) the game.
Don't know if this thread is still alive but i'll try.
So i just install the latest version (Build 125236) which came recently and i used cheat table version (Build 124233) and i only used the infinite biomass fuel. the only problem i encountered is a memory leak average by 1 MB/s. an example is in the photo. the game was in the main menu at the time.
so what did i do wrong or what should i do in this matter ?? Thanks in advance for your good work
Update: the memory leak happens when selecting the game process.
Update 2: So i found a fix for the leak issue i'll post in case if anyone needs it.
So the issue rises due to heavy processing (i made the name up). or which is known as Symbols loading. if you opened the cheat engine and then choose the game process. open memory view (find it under the address list) you'll in the first symbols loading and it's stuck at 50%. so it first for it to be solved it'll need like 2 hours and shit ton of ram. but with some digging i found a really good fix for that.
1- Delete symsrv from the win32 and win64 folders located in cheat engine directory
2- open the game
3- alt-tap and then run cheat engine
4- choose the game process and then go to memory view
5- From the menu (File) choose ( Use windows debug symbols )
after that it'll load the process correctly and the memory leak will be fixed. Now you can peacefully add any cheat table you want. I've tested the latest table and everything worked wonderfully
Note 1: the problem only occurred with the recent version of the game (Build 125236).
Note 2: you have to do steps 2-5 every time you want the (tweak) the game.
[Link]
This isn't a memory leak. This game ships with a pdb file which contains all the debug symbols for UE4 and this game. Cheat Engine automatically loads these symbols and there are a ton of them and they take up a ton of space.
The solution is to remove "FactoryGame-Win64-Shipping.pdb" from your "FactoryGame\Binaries\Win64" folder.
That will stop cheat engine from loading the pdb (as it no longer will exist).
I'm playing build # 123437. I cannot find cheat for this build. Which version do I have to use for this build. thank you!
First you should try the latest version as it might work for you.
Otherwise if that one doesn't work then try the version that's made for the game version that's closest to your game version.
For example v1.24 or v1.26 might work if the latest version doesn't. Just test them and see if they work.
Just tried the table in Cheat Engine v7.1 for Satisfactory 1.28 build #125236 which matches my current version played through Steam. Unfortunately, it can't be Enabled and returns the following error:
<<Error while scanning for AOB's: Hook_FEngineLoop_Tick Error: Not all results found>>
I've included the full error log below. Wish I could fix it, but I don't know enough about tables or CheatEngine to do so sorry. =\ Spoiler
{
Function : FEngineLoop::Tick
Offset : +339
AOB : 48 ?? 05 ?? ?? ?? ?? 48 ?? 88 ?? 07 00 00 48 ?? 01 ?? 90 ?? 01 00 00
Offset From AOB : +7
}
{$LUA}
if syntaxcheck then return end
{$ASM}
[ENABLE]
{$LUA}
function ts(hex)
return string.format("%x", readInteger(hex))
end
function Muppet_Deallocate_Main()
-- SECTION: FIND StaticFindObject FUNCTION.DISABLE -> START
-- Unallocate the memory that stores the address of the StaticFindObject function
deAlloc(Muppet_StaticFindObject_Address)
unregisterSymbol("Muppet_StaticFindObject_Address")
Muppet_StaticFindObject_Address = nil
-- SECTION: FIND StaticFindObject FUNCTION.DISABLE -> END
-- SECTION: FIND GUObjectArray.DISABLE -> START
deAlloc(Muppet_GUObjectArray_Address)
unregisterSymbol("Muppet_GUObjectArray_Address")
Muppet_GUObjectArray_Address = nil
-- SECTION: FIND GUObjectArray.DISABLE -> END
-- SECTION: FIND GetFullName FUNCTION.DISABLE -> START
deAlloc(Muppet_GetFullName_Address)
unregisterSymbol("Muppet_GetFullName_Address")
Muppet_GetFullName_Address = nil
-- SECTION: FIND GetFullName FUNCTION.DISABLE -> END
Muppet_PlayerController = nil
Muppet_ACharacter = nil
Muppet_LocalPlayer = nil
end
memrec.OnActivate = function (memrec, before, currentstate)
if (not before) and currentstate then
Muppet_ActivationTimer = createTimer()
Muppet_ActivationTimer.Interval = 500
Muppet_ActivationTimer.OnTimer = function(b)
-- SECTION: FIND StaticFindObject FUNCTION.ENABLE -> START
-- Allocate some memory to store the address of the StaticFindObject function
Muppet_StaticFindObject_Address = allocateMemory(0x8)
-- Perform an AOB scan to find the StaticFindObject function
local Muppet_StaticFindObject_AOB = Muppet_AOBScan_Data("48 89 5C 24 08 48 89 74 24 18 55 57 41 54 41 56 41 57 48 8B EC 48 83 EC 60 80 3D ?? ?? ?? 03 00")
-- If we found the function
if Muppet_StaticFindObject_AOB then
-- Register a symbol that contains the address of the StaticFindObject function
unregisterSymbol("Muppet_StaticFindObject_Address")
registerSymbol("Muppet_StaticFindObject_Address", Muppet_StaticFindObject_AOB, true)
else -- If we didn't find the function
Muppet_ActivationTimer.destroy()
-- Deallocate memory, display an error message and stop executing
Muppet_Deallocate_Main()
showMessage("Was unable to find function StaticFindObject")
memrec.Active = false
return
end
-- SECTION: FIND StaticFindObject FUNCTION.ENABLE -> END
-- SECTION: FIND GUObjectArray.ENABLE -> START
-- Allocate some memory to store the address of GUObjectArray
Muppet_GUObjectArray_Address = allocateMemory(0x8)
-- Perform an AOB scan to find GUObjectArray
local Muppet_GUObjectArray = Muppet_AOBScan_Data("?? ?? 02 00 ?? ?? 02 00 ?? ?? 02 00 00 00 00 00 ?0 ?? ?? ?? ?? ?? 00 00 00 00 00 00 00 00 00 00 00 00 21")
-- If we found GUObjectArray
if Muppet_GUObjectArray then
-- Register a symbol that contains the address of GUObjectArray
unregisterSymbol("Muppet_GUObjectArray_Address")
registerSymbol("Muppet_GUObjectArray_Address", Muppet_GUObjectArray, true)
else -- If we didn't find the function
Muppet_ActivationTimer.destroy()
-- Deallocate memory, display an error message and stop executing
Muppet_Deallocate_Main()
showMessage("Was unable to find GUObjectArray")
memrec.Active = false
return
end
-- Get the address for CoreUObject_Object
-- This is used as the first parameter when calling StaticFindObject and StaticLoadObject
Muppet_CoreUObject_Object = readPointer(readPointer(readPointer(getAddress("Muppet_GUObjectArray_Address")+0x10))+0x18)
if not Muppet_CoreUObject_Object or Muppet_CoreUObject_Object == 0 then
Muppet_ActivationTimer.destroy()
Muppet_Deallocate_Main()
showMessage("Was unable to find Class CoreUObject.Object")
memrec.Active = false
return
end
-- SECTION: FIND GUObjectArray.ENABLE -> END
-- SECTION: FIND GetFullName FUNCTION.ENABLE -> START
-- Allocate some memory to store the address of the StaticFindObject function
Muppet_StaticFindObject_Address = allocateMemory(0x8)
-- Perform an AOB scan to find the GetFullName function
local Muppet_GetFullName_AOB = Muppet_AOBScan_Data("48 89 5C 24 18 55 56 41 56 48 83 EC 20 45 33 F6 48 8B F1")
-- If we found the function
if Muppet_GetFullName_AOB then
-- Register a symbol that contains the address of the StaticFindObject function
unregisterSymbol("Muppet_GetFullName_Address")
registerSymbol("Muppet_GetFullName_Address", Muppet_GetFullName_AOB, true)
else -- If we didn't find the function
Muppet_ActivationTimer.destroy()
-- Deallocate memory, display an error message and stop executing
Muppet_Deallocate_Main()
showMessage("Was unable to find function GetFullName")
memrec.Active = false
return
end
-- SECTION: FIND GetFullName FUNCTION.ENABLE -> END
-- Find LocalPlayer
local LocalPlayer_ObjectName = "/Engine/Transient.FGGameEngine_0:FGLocalPlayer_0"
Muppet_LocalPlayer = Muppet_StaticFindObject(LocalPlayer_ObjectName)
-- Find APlayerController offset in LocalPlayer
-- Moved this code to a function (Muppet_Find_ACharacter)
-- Should probably move it out of that function and in to its own function (Muppet_Load_APlayerController or something)
-- Find ACharacter
-- Moved this code to a function (Muppet_Find_ACharacter)
-- This is because PlayerController->ACharacter is gonna point to different objects depending on where you are
-- For example, if you're in the main menu it's likely gonna point to the default pawn,
-- and if you died or changed map then it will be destroyed and recreated and have a new address.
-- Therefor it's important to get the address for ACharacter only when you need it
Muppet_ActivationTimer.destroy()
end
end
return true
end
memrec.OnDeactivate = function (memrec, before, currentstate)
if before then
Muppet_ActivationTimer.destroy()
unregisterSymbol("Muppet_ACharacter")
Muppet_Deallocate_Main()
end
return true
end
{$ASM}
aobscanmodule(Hook_FEngineLoop_Tick,FactoryGame-Win64-Shipping.exe,48 ?? 05 ?? ?? ?? ?? 48 ?? 88 ?? 07 00 00 48 ?? 01 ?? 90 ?? 01 00 00) // should be unique
alloc(newmem,$1000,"FactoryGame-Win64-Shipping.exe")
alloc(RestoreCode_EngineHook, 8)
registersymbol(RestoreCode_EngineHook)
label(muppet_GEngine)
registersymbol(muppet_GEngine)
label(Muppet_GameInstance_Offset)
registersymbol(Muppet_GameInstance_Offset)
label(Muppet_LocalPlayers_Offset)
registersymbol(Muppet_LocalPlayers_Offset)
label(Muppet_PlayerController_Offset)
registersymbol(Muppet_PlayerController_Offset)
label(Muppet_ACharacter_Offset)
registersymbol(Muppet_ACharacter_Offset)
label(Muppet_CharacterMovementComponent_Offset)
registersymbol(Muppet_CharacterMovementComponent_Offset)
label(Muppet_bCanBeDamaged_Offset)
registersymbol(Muppet_bCanBeDamaged_Offset)
label(Muppet_HeldItemArray_Offset)
registersymbol(Muppet_HeldItemArray_Offset)
label(return)
newmem:
reassemble(Hook_FEngineLoop_Tick+7) // mov rcx,[rax+00000750]
mov [muppet_GEngine],rax
jmp return
muppet_GEngine:
dq 0
Muppet_GameInstance_Offset:
dq D80
Muppet_LocalPlayers_Offset:
dq 38
Muppet_PlayerController_Offset:
dq 30
Muppet_ACharacter_Offset:
dq 360
Muppet_CharacterMovementComponent_Offset:
dq 398
Muppet_bCanBeDamaged_Offset:
dq 82
Muppet_HeldItemArray_Offset:
dq A30
RestoreCode_EngineHook:
readmem(Hook_FEngineLoop_Tick+7, 7)
Hook_FEngineLoop_Tick+7:
jmp newmem
nop 2
return:
registersymbol(Hook_FEngineLoop_Tick)
[DISABLE]
Hook_FEngineLoop_Tick+7:
readmem(RestoreCode_EngineHook, 7)
unregistersymbol(Hook_FEngineLoop_Tick)
unregistersymbol(muppet_GEngine)
unregistersymbol(RestoreCode_EngineHook)
unregistersymbol(Muppet_GameInstance_Offset)
unregistersymbol(Muppet_LocalPlayers_Offset)
unregistersymbol(Muppet_PlayerController_Offset)
unregistersymbol(Muppet_ACharacter_Offset)
unregistersymbol(Muppet_CharacterMovementComponent_Offset)
unregistersymbol(Muppet_bCanBeDamaged_Offset)
unregistersymbol(Muppet_HeldItemArray_Offset)
dealloc(RestoreCode_EngineHook)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: "FactoryGame-Win64-Shipping.exe"+2CC5C9
"FactoryGame-Win64-Shipping.exe"+2CC59F: 49 3B F6 - cmp rsi,r14
"FactoryGame-Win64-Shipping.exe"+2CC5A2: 0F 85 38 FF FF FF - jne FactoryGame-Win64-Shipping.exe+2CC4E0
"FactoryGame-Win64-Shipping.exe"+2CC5A8: 48 8B 05 A9 2A E3 03 - mov rax,[FactoryGame-Win64-Shipping.exe+40FF058]
"FactoryGame-Win64-Shipping.exe"+2CC5AF: 48 8B 88 50 07 00 00 - mov rcx,[rax+00000750]
"FactoryGame-Win64-Shipping.exe"+2CC5B6: 48 85 C9 - test rcx,rcx
"FactoryGame-Win64-Shipping.exe"+2CC5B9: 74 3F - je FactoryGame-Win64-Shipping.exe+2CC5FA
"FactoryGame-Win64-Shipping.exe"+2CC5BB: 48 8B 01 - mov rax,[rcx]
"FactoryGame-Win64-Shipping.exe"+2CC5BE: FF 90 40 01 00 00 - call qword ptr [rax+00000140]
"FactoryGame-Win64-Shipping.exe"+2CC5C4: 48 85 C0 - test rax,rax
"FactoryGame-Win64-Shipping.exe"+2CC5C7: 74 31 - je FactoryGame-Win64-Shipping.exe+2CC5FA
// ---------- INJECTING HERE ----------
"FactoryGame-Win64-Shipping.exe"+2CC5C9: 48 8B 05 88 2A E3 03 - mov rax,[FactoryGame-Win64-Shipping.exe+40FF058] <-- GEngine
// ---------- DONE INJECTING ----------
"FactoryGame-Win64-Shipping.exe"+2CC5D0: 48 8B 88 50 07 00 00 - mov rcx,[rax+00000750] <-- Inject our code here to move rax into a symbol
"FactoryGame-Win64-Shipping.exe"+2CC5D7: 48 8B 01 - mov rax,[rcx]
"FactoryGame-Win64-Shipping.exe"+2CC5DA: FF 90 40 01 00 00 - call qword ptr [rax+00000140]
"FactoryGame-Win64-Shipping.exe"+2CC5E0: 48 8B C8 - mov rcx,rax
"FactoryGame-Win64-Shipping.exe"+2CC5E3: E8 08 27 AF 01 - call FactoryGame-Win64-Shipping.exe+1DBECF0
"FactoryGame-Win64-Shipping.exe"+2CC5E8: 84 C0 - test al,al
"FactoryGame-Win64-Shipping.exe"+2CC5EA: 74 0E - je FactoryGame-Win64-Shipping.exe+2CC5FA
"FactoryGame-Win64-Shipping.exe"+2CC5EC: 48 8B 0D 65 2A E3 03 - mov rcx,[FactoryGame-Win64-Shipping.exe+40FF058]
"FactoryGame-Win64-Shipping.exe"+2CC5F3: 33 D2 - xor edx,edx
"FactoryGame-Win64-Shipping.exe"+2CC5F5: E8 16 65 E7 01 - call FactoryGame-Win64-Shipping.exe+2142B10
}
the new Fluids update (v0.3.6.5, build 131382, CL#136408) has broken the injector and the table won't engage at all. just posting this as a flag in the sand. sorry to hear the table is not going to be updated anymore, but it was fun while it lasted. thanks for all that fun. as someone who doesn't care much for mods for this kind of game, i appreciated just being able to do simple things like 'go faster'.
EDIT: not to offend, but for those interested in the simpler things only, the fearlessrevolution trainer still works.
I've updated the table again. A new feature and a fix to an existing feature.
Changelog:
Removed StaticLoadObject in favor of StaticFindObject.
New Cheat: Teleport To Ping. Enable this & when you ping you will get teleported to the pinged location.
Updated Cheat: Machine Editor -> Clockspeed.
When the clockspeed is changed it will now properly change, visuals update only when you close and reopon the machine UI.
Previously it didn't work at all.
Table Compatability: EGS and STEAM
Download is available in the main post.
I can't find the machine editor in the Trainer.
The trainer does not have a machine editor.
Not all features were transferred from the old table to the new trainer.
The screenshot you linked looks a little strange regarding the alignment of all of the options in the trainer.
Out of curiosity, are you using non-default scaling in Windows ?