cheat-engine/Cheat Engine/LuaGenericHotkey.pas

168 lines
4.1 KiB
ObjectPascal

unit LuaGenericHotkey;
{$mode delphi}
//todo: add table support
interface
uses
windows, Classes, SysUtils, lua, lauxlib, lualib, genericHotkey, CEFuncProc, math;
procedure initializeLuaGenericHotkey;
implementation
uses luaclass, luaobject, luahandler, luacaller;
function createHotkey(L: Plua_State): integer; cdecl;
var parameters: integer;
h: TGenericHotkey;
routine: string;
lc: TLuaCaller;
i: integer;
keys: TKeycombo;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters>=2 then //(function, key, ...)
begin
lc:=TLuaCaller.create;
if lua_isfunction(L, 1) then
begin
lua_pushvalue(L, 1);
lc.luaroutineindex:=luaL_ref(L,LUA_REGISTRYINDEX)
end
else
lc.luaroutine:=lua_tostring(L,1);
parameters:=min(parameters,6); //6 because this includes the function
zeromemory(@keys,sizeof(keys));
if (parameters=2) and lua_istable(L, 2) then
begin
for i:=0 to 4 do
begin
lua_pushinteger(L, i+1);
lua_gettable(L, 2);
if lua_isnil(L, -1) then //end of the list
begin
lua_pop(L,1);
break;
end
else
begin
keys[i]:=lua_tointeger(L,-1);
lua_pop(L,1);
end;
end;
end
else
begin
for i:=2 to parameters do
keys[i-2]:=lua_tointeger(L, i);
end;
h:=TGenericHotkey.create(lc.NotifyEvent, keys);
lua_pop(L, lua_gettop(L));
luaclass_newClass(L, h);
result:=1;
end else lua_pop(L, lua_gettop(L));
end;
function GenericHotkey_setKeys(L: PLua_State): integer; cdecl;
var
GenericHotkey: TGenericHotkey;
i: integer;
paramstart, paramcount: integer;
begin
//test me
result:=0;
GenericHotkey:=luaclass_getClassObject(L, @paramstart, @paramcount);
if paramcount>=1 then
begin
zeromemory(@GenericHotkey.keys,sizeof(GenericHotkey.keys));
for i:=paramstart to paramstart+paramcount-1 do
GenericHotkey.keys[i-paramstart]:=lua_tointeger(L, i);
end;
end;
function GenericHotkey_getKeys(L: PLua_State): integer; cdecl;
var
parameters: integer;
GenericHotkey: TGenericHotkey;
i: integer;
begin
GenericHotkey:=luaclass_getClassObject(L);
i:=0;
while (i<5) and (Generichotkey.keys[i]<>0) do
begin
lua_pushinteger(L, Generichotkey.keys[i]);
inc(i);
end;
result:=i;
end;
function GenericHotkey_getOnHotkey(L: PLua_State): integer; cdecl;
var
c: TgenericHotkey;
begin
c:=luaclass_getClassObject(L);
LuaCaller_pushMethodProperty(L, TMethod(c.onNotify), 'TNotifyEvent');
result:=1;
end;
function GenericHotkey_setOnHotkey(L: PLua_State): integer; cdecl;
var
c: TgenericHotkey;
m: tmethod;
begin
if lua_gettop(L)>=1 then
begin
c:=luaclass_getClassObject(L);
m:=tmethod(c.onNotify);
LuaCaller_setMethodProperty(L, m, 'TNotifyEvent', lua_gettop(L));
c.onNotify:=tnotifyevent(m);
end;
result:=0;
end;
procedure generichotkey_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
begin
object_addMetaData(L, metatable, userdata);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setKeys', generichotkey_setKeys);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getKeys', generichotkey_getKeys);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setOnHotkey', generichotkey_setonHotkey);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getOnHotkey', generichotkey_getonHotkey);
Luaclass_addPropertyToTable(L, metatable, userdata, 'OnHotkey', generichotkey_getonHotkey, generichotkey_setonHotkey);
end;
procedure initializeLuaGenericHotkey;
begin
lua_register(LuaVM, 'createHotkey', createHotkey);
lua_register(LuaVM, 'generichotkey_setKeys', generichotkey_setKeys);
lua_register(LuaVM, 'generichotkey_getKeys', generichotkey_getKeys);
lua_register(LuaVM, 'generichotkey_onHotkey', generichotkey_setonHotkey);
end;
initialization
luaclass_register(TGenericHotkey, generichotkey_addMetaData);
end.