panraven Grandmaster Cheater Reputation: 55
Joined: 01 Oct 2008 Posts: 942
|
Posted: Mon Jan 23, 2017 2:32 am Post subject: scheduled function call |
|
|
origin http://forum.cheatengine.org/viewtopic.php?t=602587
add callStepGroup here, may be more intuitive to use.
Try don't use a too small result time/scale, the overhead may turn the call sequence not as expected.
Code: |
local function callnext(n,f,...) -- make local so not mixed with may be another version of callnext
local pk,upk,t,p = table.pack,table.unpack,createTimer()
if type(n)~='number'then n,f,p=1,n,pk(f,...)else p = pk(...)end
t.Interval,t.OnTimer = n,function(tm)
tm.Destroy()
pcall(f,upk(p))
end
return t
end
function callstep(n)
assert(type(n)=='number' and n>0,"Input not a positive number: "..tostring(n))
local pk,upk,p = table.pack,table.unpack,{}
local function collect(f,...)
if f == nil then
for i=1,#p do if p[i][1] then callnext(1+(i-1)*n,p[i][1],upk(p[i],2)) end end
else
p[1+#p]= pk(f,...)
return collect
end
end
return collect
end
local msev = mouse_event
local function mclick(down,up,int)
local down,up,int = down,up,int or 35
return function()
local t = createTimer(),msev(down)
t.Interval,t.OnTimer = int,function(tm)tm.Destroy();msev(up)end
end
end
local mouse2func = {
['+m0']= {msev,2},['-m0']= {msev,4},['^m0']={mclick(2,4)},
['+m1']= {msev,8},['-m1']= {msev,16},['^m1']={mclick(8,16)},
['+m2']= {msev,32},['-m2']= {msev,64},['^m2']={mclick(32,64)}
}
local key2func = {['^']=doKeyPress,['+']=keyDown,['-']=keyUp}
function callStepGroup(scale)
assert(type(scale)=='number' and scale>0,"Scale is not positive number: "..tostring(scale))
local pk,upk,fmt,int,p = table.pack,table.unpack,string.format,math.floor,{}
local function collect(maintime,...)
if maintime == nil then
local callset,mainacc,subacc = {},1
for i=1,#p do
local spec = p[i]
-- spec in format : maintime, { func1, ... }, subtime1, { func2, ... }, subtime2,...{ funcN, ...}
local maintime = spec[1]
if maintime == false then break end
assert(type(maintime)=='number',
fmt("maintime in step %d is not number: %s",i,tostring(maintime)))
mainacc = int(mainacc + maintime * scale)
subacc = mainacc
for j=2,#spec,2 do
local group = spec[j] -- in format { func, ... }
if group == false then break end
if type(group)=='string' and group:match"^[-+^]%w+$" then --key-related shortcut
local mev = mouse2func[group:lower()]
if not mev then
local func, key = group:match"([-+^])(%w+)"
func = key2func[func]
key = _G["VK_"..key:upper()]
group = {func,key}
else
group = mev
end
end
assert(type(group)=='table',
fmt("%d(th) group in step %d is not table: %s",j,i,tostring(group)))
callset[1+#callset] = pk(subacc,upk(group))
if j<#spec then -- if not last subgroup
local subtime = spec[j+1]
if subtime == false then break end
assert(type(subtime)=='number',
fmt("%d(th) subtime in step %d is not number: %s",j,i,tostring(subtime)))
subacc = int(mainacc + subtime * scale - 1)
end
end-- j
end--i
return function(extraScale)
if type(extraScale)=='number' and extraScale~=1 then
for i=1,#callset do callnext(callset[i][1]*extraScale,upk(callset[i],2))end -- fire
else
for i=1,#callset do callnext(upk(callset[i]))end -- fire
end
end
else
p[1+#p]= pk(maintime,...)
return collect
end
end
return collect
end
-- test callStepGroup
local preGeneratedCallSet = callStepGroup(10) -- scale
( 0,{keyDown,VK_A},25,{keyUp,VK_A}) -- first number is relative to whole sequence, after scale multiplied
( 25,{keyDown,VK_W},25,{keyUp,VK_W}) -- subsequence number is time relative to the parent group, after scale multiplied
( 50,{keyDown,VK_D},25,{keyUp,VK_D})
( 75,{keyDown,VK_S},25,{keyUp,VK_S})
(100,{keyDown,VK_LSHIFT},100,{keyUp,VK_LSHIFT}) -- sprint?
(100,"+A",25,"-A") -- shortcuts
(125,"+W",25,"-W")
(150,"+D",25,"-D")
(175,"+S",25,"-S")
() -- generate the callset here
-- not fire yet, so that the callset is generated once,
and can be execute elsewhere any time.
local hk = createHotkey(function()-- the function to do on hotkey
preGeneratedCallSet(2) -- fire now with an extra time scaling
end,
VK_NUMPAD0)
-- or
local hk = createHotkey(preGeneratedCallSet,VK_NUMPAD0) -- better if no extra scaling for lesser one function wrap
callnext(20000,function()
hk.Destroy()
print("destroying")
end)
|
ADDED:
added shortcut to 3 key-related function call: doKeyPress ('^'), keyDown ('+'), keyUp ('-'). eg.
{keyDown,VK_D} -- a table, can be shortcut as
"+D" -- a string, see test example.
ADDED:
add mouse click too.
m0 is left mouse button, m1 is right and m2 is middle.
"+m0" means press left mouse button down,
"-m1" means release right mouse button (up),
"^m0", simulate a left mouse button click, it is made by a sequence of
1.left mouse button down,
2.wait ~35 ms (there is overhead)
3.left mouse button up,
There should be no other left mouse event send during the interval, should assume at least 40ms in between I guess.
_________________
- Retarded. |
|