diff --git a/Cheat Engine/LuaMemscan.pas b/Cheat Engine/LuaMemscan.pas index 115fd604..d1b66e9b 100755 --- a/Cheat Engine/LuaMemscan.pas +++ b/Cheat Engine/LuaMemscan.pas @@ -12,7 +12,7 @@ procedure initializeMemscan; implementation -uses luaclass, LuaObject; +uses luaclass, LuaObject, savedscanhandler; resourcestring rsNotAllParametersHaveBeenProvided = 'Not all parameters have been provided'; @@ -167,6 +167,58 @@ begin result:=1; end; +function memscan_getSavedResultHandler(L: Plua_State): integer; cdecl; +var + memscan: TMemscan; + name: string; + ssh: TSavedscanHandler; +begin + result:=0; + memscan:=luaclass_getClassObject(L); + if lua_gettop(L)>=1 then + begin + name:=Lua_ToString(L, -1); + try + ssh:=TSavedScanHandler.create(memscan.GetScanFolder,name); + ssh.AllowNotFound:=true; + ssh.AllowRandomAccess:=true; + ssh.memscan:=memscan; + luaclass_newClass(L,ssh); + exit(1); + except + on e: exception do + begin + lua_pushnil(L); + lua_pushstring(L,e.message); + exit(2); + end; + end; + end; +end; + +function memscan_getSavedResultList(L: Plua_State): integer; cdecl; +var + memscan: TMemscan; + r: tstringlist; + i: integer; +begin + memscan:=luaclass_getClassObject(L); + r:=tstringlist.create; + memscan.getsavedresults(r); + lua_createtable(L,r.count,0); + + for i:=0 to r.count-1 do + begin + lua_pushinteger(L,i+1); + lua_pushstring(L, r[i]); + lua_settable(L,-3); + end; + + result:=1; + + + r.free; +end; function memscan_saveCurrentResults(L: Plua_State): integer; cdecl; var @@ -251,6 +303,8 @@ begin luaclass_addClassFunctionToTable(L, metatable, userdata, 'waitTillDone', memscan_waitTillDone); luaclass_addClassFunctionToTable(L, metatable, userdata, 'getProgress', memscan_getProgress); luaclass_addClassFunctionToTable(L, metatable, userdata, 'saveCurrentResults', memscan_saveCurrentResults); + luaclass_addClassFunctionToTable(L, metatable, userdata, 'getSavedResultList', memscan_getSavedResultList); + luaclass_addClassFunctionToTable(L, metatable, userdata, 'getSavedResultHandler', memscan_getSavedResultHandler); luaclass_addClassFunctionToTable(L, metatable, userdata, 'getAttachedFoundlist', memscan_getAttachedFoundlist); luaclass_addClassFunctionToTable(L, metatable, userdata, 'setOnlyOneResult', memscan_setreturnOnlyOneResult); luaclass_addClassFunctionToTable(L, metatable, userdata, 'getOnlyResult', memscan_getOnlyResult); diff --git a/Cheat Engine/betterControls/newtreeview.pas b/Cheat Engine/betterControls/newtreeview.pas index 44523571..b9241492 100644 --- a/Cheat Engine/betterControls/newtreeview.pas +++ b/Cheat Engine/betterControls/newtreeview.pas @@ -26,6 +26,7 @@ begin if ShouldAppsUseDarkMode and (parent<>nil) then begin + ToolTips:=false; AllowDarkModeForWindow(handle, 1); SetWindowTheme(Handle, 'explorer', nil); diff --git a/Cheat Engine/release/readme.txt b/Cheat Engine/release/readme.txt index 5e5b382d..db536e9c 100755 --- a/Cheat Engine/release/readme.txt +++ b/Cheat Engine/release/readme.txt @@ -4,7 +4,7 @@ Additions and changes: structure dissect add to addresslist uses the addressstring instead of number, so symbols will be preserved structure dissect now has a option to save the previous state of a column and show changes easier Added {$LUACODE} blocks for inline Lua coding - Added a c-compiler to CE (compile) + Added a c-compiler to CE Added {$C} blocks to the auto assembler. all {$C} blocks get combined into one script before execution Added {$CCODE} blocks for inline C coding (Check the forum, wiki, CE patreon discord or CE's youtube) Added a C# compiler (compilecs) @@ -34,14 +34,17 @@ Fixes: fixed assembling movsq fixed ultimap ret filter fixed luapipe never calling OnError + fixed vehdebug in 64-bit CE zeroing out the FPU registers in 32-bit targets fixed DBVM find what access/writes sometimes skipping entries on AMD fixed undo not working on memory records when using the single line editor + fixed hide children group option when loading a table lua: changes: saveTable won't ask to sign the table anymore messageDialog will work if you omit the buttonlist. (Defaults to mbOK then) added more customizabe button + registerSymbol no longer errors out the whole script on failure. It now overwrites existing symbols New functions: form.saveToStream @@ -51,8 +54,10 @@ lua: signTable symbollist.getModuleList symbollist.getSymbolList + memscan.getSavedResultHandler + memscan.getSavedResultList - + SavedResultHandler class How to use: diff --git a/Cheat Engine/savedscanhandler.pas b/Cheat Engine/savedscanhandler.pas index fc028441..94c25cd7 100755 --- a/Cheat Engine/savedscanhandler.pas +++ b/Cheat Engine/savedscanhandler.pas @@ -131,7 +131,10 @@ type lastFail: integer; AllowRandomAccess: boolean; //set this if you wish to allow random access through the list. (EXTREMELY INEFFICIENT IF IT HAPPENS, addresslist purposes only) AllowNotFound: boolean; //set this if you wish to return nil instead of an exception if the address can't be found in the list + + memscan: TObject; function getpointertoaddress(address:ptruint;valuetype:TVariableType; ct: TCustomType; recallifneeded: boolean=true): pointer; + function getStringFromAddress(address: ptruint; out r: string; Hexadecimal: boolean=false; Signed: boolean=false): boolean; procedure deinitialize; procedure reinitialize; @@ -144,7 +147,8 @@ end; implementation -uses Math, globals; +uses Math, globals, memscan, lua, lauxlib, lualib, LuaClass, LuaObject, + LuaHandler, byteinterpreter; resourcestring rsMaxaddresslistcountIs0MeansTheAddresslistIsBad = 'maxaddresslistcount is 0 (Means: the addresslist is bad)'; @@ -296,6 +300,24 @@ begin LastAddressAccessed.index:=0; //reset the index end; +function TSavedScanHandler.getStringFromAddress(address: ptruint; out r: string; Hexadecimal: boolean=false; Signed: boolean=false): boolean; +var + p: pointer; + ms: TMemScan; +begin + result:=false; + if memscan=nil then exit; + + + ms:=TMemscan(memscan); + p:=getpointertoaddress(address, ms.VarType, ms.Customtype); + if p<>nil then + begin + r:=readAndParsePointer(address, p, ms.VariableType, ms.Customtype, hexadecimal, Signed); + result:=true; + end; +end; + function TSavedScanHandler.getpointertoaddress(address:ptruint;valuetype:TVariableType; ct: Tcustomtype; recallifneeded: boolean=true): pointer; var i,j: integer; pm: ^TArrMemoryRegion; @@ -773,5 +795,57 @@ begin deinitialized:=false; end; + +//---------------LUA------------------- +function savedscanhandler_getStringFromAddress(L: PLua_State): integer; cdecl; +var + address: ptruint; + ssh: TSavedScanHandler; + r: string; + hexadecimal, signed: boolean; +begin + result:=0; + ssh:=luaclass_getClassObject(L); + if lua_gettop(L)>=1 then + begin + try + address:=lua_toaddress(L,1); + except + on e: exception do + begin + lua_pushnil(L); + lua_pushstring(L, e.Message); + exit(2); + end; + end; + + if lua_Gettop(L)>=2 then + hexadecimal:=lua_toboolean(L,2) + else + hexadecimal:=false; + + if lua_getProperty(L)>=3 then + signed:=lua_toboolean(L,3) + else + signed:=false; + + if ssh.getStringFromAddress(address,r, hexadecimal, signed) then + lua_pushstring(L,r) + else + lua_pushnil(L); + + result:=1; + end; +end; + +procedure savedscanhandler_addMetaData(L: PLua_state; metatable: integer; userdata: integer ); +begin + object_addMetaData(L, metatable, userdata); + luaclass_addClassFunctionToTable(L, metatable, userdata, 'getStringFromAddress', savedscanhandler_getStringFromAddress); +end; + +initialization + luaclass_register(TSavedScanHandler, savedscanhandler_addMetaData); + end.