mirror of
https://github.com/cheat-engine/cheat-engine
synced 2026-08-15 02:26:08 -04:00
199 lines
4.8 KiB
ObjectPascal
199 lines
4.8 KiB
ObjectPascal
unit LuaTableFile;
|
|
|
|
{$mode delphi}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils,lua, lauxlib, lualib;
|
|
|
|
procedure initializeLuaTableFile;
|
|
|
|
implementation
|
|
|
|
uses LuaClass, LuaHandler, LuaObject, MainUnit, luafile;
|
|
|
|
resourcestring
|
|
rsErrorRaisedWithMessage = ' error raised with message: ';
|
|
rsTableDileEntryAlreadyExistsForFilename = 'Table file entry already exists for filename: ';
|
|
rsCreateTableFileRequiresAtLeastOneParameter = 'createTableFile requires at least one parameter';
|
|
|
|
function indexOfLuaFileByName(filename: string; internal: boolean=false): integer;
|
|
var
|
|
i: integer;
|
|
luaFiles: TLuaFileList;
|
|
begin
|
|
if internal then
|
|
luaFiles:=mainForm.InternalLuaFiles
|
|
else
|
|
luaFiles:=mainform.LuaFiles;
|
|
|
|
result:=-1;
|
|
for i:=0 to luaFiles.count-1 do
|
|
if luaFiles[i].name=filename then
|
|
begin
|
|
result:=i;
|
|
break;
|
|
end;
|
|
end;
|
|
|
|
function pushLuaTableFile(L: Plua_State; index: integer; internal: boolean=false): integer;
|
|
var
|
|
lf: TLuafile;
|
|
s: TMemoryStream;
|
|
begin
|
|
if internal then
|
|
lf:=MainForm.InternalLuaFiles[index]
|
|
else
|
|
lf:=MainForm.LuaFiles[index];
|
|
|
|
s:=lf.stream;
|
|
s.Position:=0;
|
|
|
|
result:=1;
|
|
luaclass_newClass(L, lf);
|
|
end;
|
|
|
|
function addLuaTableFile(L: Plua_State; filename: string; filepath: string=''): integer;
|
|
var
|
|
i: integer;
|
|
lf: TLuafile;
|
|
s: TMemoryStream;
|
|
begin
|
|
result:=0;
|
|
if (indexOfLuaFileByName(filename)=-1) and
|
|
(indexOfLuaFileByName(filename, true)=-1) then
|
|
begin
|
|
try
|
|
s:=TMemorystream.Create;
|
|
try
|
|
if filepath<>'' then
|
|
s.LoadFromFile(filepath);
|
|
lf:=TLuaFile.Create(filename, s);
|
|
finally
|
|
s.Free;
|
|
end;
|
|
i:=mainform.LuaFiles.add(lf);
|
|
result:=pushLuaTableFile(L, i);
|
|
mainform.editedsincelastsave:=true;
|
|
except
|
|
on e : Exception do begin
|
|
lua_pushstring(L, e.className + rsErrorRaisedWithMessage + e.message);
|
|
lua_error(L);
|
|
end;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
lua_pushstring(L, rsTableDileEntryAlreadyExistsForFilename + filename);
|
|
lua_error(L);
|
|
end;
|
|
end;
|
|
|
|
function createTableFile(L: Plua_State): integer; cdecl;
|
|
var
|
|
parameters: integer;
|
|
filename, filepath: string;
|
|
begin
|
|
result:=0;
|
|
parameters:=lua_gettop(L);
|
|
if parameters>=1 then
|
|
begin
|
|
filepath:='';
|
|
filename:=Lua_ToString(L, 1);
|
|
if parameters>=2 then
|
|
filepath:=Lua_ToString(L, 2);
|
|
result:=addLuaTableFile(L, filename, filepath);
|
|
end
|
|
else
|
|
begin
|
|
lua_pushstring(L, rsCreateTableFileRequiresAtLeastOneParameter);
|
|
lua_error(L);
|
|
end;
|
|
end;
|
|
|
|
function findTableFile(L: Plua_State): integer; cdecl;
|
|
var parameters: integer;
|
|
f: string;
|
|
i: integer;
|
|
begin
|
|
result:=0;
|
|
parameters:=lua_gettop(L);
|
|
if parameters>=1 then
|
|
begin
|
|
f:=Lua_ToString(L, -1);
|
|
lua_pop(L, lua_gettop(L));
|
|
i:=indexOfLuaFileByName(f);
|
|
if i<>-1 then
|
|
result:=pushLuaTableFile(L, i) //return the tableFile, not the stream. To get the stream, use tablefile_getData
|
|
else
|
|
begin
|
|
i:=indexOfLuaFileByName(f, true); //internal file
|
|
if i<>-1 then
|
|
result:=pushLuaTableFile(L, i, true);
|
|
end;
|
|
end
|
|
else
|
|
lua_pop(L, lua_gettop(L));
|
|
end;
|
|
|
|
|
|
function tablefile_delete(L: Plua_State): integer; cdecl;
|
|
var
|
|
lf: TLuaFile;
|
|
begin
|
|
result:=0;
|
|
lf:=luaclass_getClassObject(L);
|
|
mainform.LuaFiles.Remove(lf);
|
|
mainform.UpdateMenu;
|
|
lf.Free;
|
|
mainform.editedsincelastsave:=true;
|
|
end;
|
|
|
|
function tablefile_saveToFile(L: Plua_State): integer; cdecl;
|
|
var
|
|
lf: TLuaFile;
|
|
f: string;
|
|
begin
|
|
result:=0;
|
|
lf:=luaclass_getClassObject(L);
|
|
f:=lf.name;
|
|
if lua_gettop(L)>=1 then
|
|
f:=Lua_ToString(L, 1);
|
|
|
|
lf.stream.Position:=0;
|
|
lf.stream.SaveToFile(f);
|
|
end;
|
|
|
|
function tablefile_getData(L: Plua_State): integer; cdecl;
|
|
var
|
|
lf: TLuaFile;
|
|
begin
|
|
result:=1;
|
|
lf:=luaclass_getClassObject(L);
|
|
luaclass_newClass(L, lf.stream);
|
|
end;
|
|
|
|
procedure tablefile_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
|
|
begin
|
|
object_addMetaData(L, metatable, userdata);
|
|
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'delete', tablefile_delete);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'saveToFile', tablefile_saveToFile);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getData', tablefile_getData);
|
|
end;
|
|
|
|
procedure initializeLuaTableFile;
|
|
begin
|
|
Lua_register(LuaVM, 'createTableFile', createTableFile);
|
|
Lua_register(LuaVM, 'findTableFile', findTableFile);
|
|
Lua_register(LuaVM, 'tablefile_delete', tablefile_delete);
|
|
Lua_register(LuaVM, 'tablefile_saveToFile', tablefile_saveToFile);
|
|
Lua_register(LuaVM, 'tablefile_getData', tablefile_getData);
|
|
end;
|
|
|
|
initialization
|
|
luaclass_register(TLuafile, tablefile_addMetaData);
|
|
|
|
end.
|
|
|