forked from RainbowwPhoenixx/control-splitters
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathControl.asl
More file actions
76 lines (59 loc) · 2.75 KB
/
Control.asl
File metadata and controls
76 lines (59 loc) · 2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
state("Control_DX11", "DX11") { }
state("Control_DX12", "DX12") { }
startup
{
vars.gameTarget = new SigScanTarget(3,
"48 8B 05 ????????", // mov rax, [Control_DX1#.exe+????????]
"48 8B 48 30", // mov rcx, [rax+30]
"80 B9 ???????? 00"); // cmp byte ptr [rcx+?], 00
vars.inputManagerTarget = new SigScanTarget(10, "48 89 86 ?? ?? 00 00 48 89 35"); // signature to get InputManager instance pointer
}
init
{
vars.isFoundationPatch = modules.First().ModuleMemorySize >= 20418560; // foundation patch exe size, may break in the future
var module = modules.First();
var inputStr = module.ModuleName == "Control_DX11.exe" ? "input_rmdwin7_f.dll" : "input_rmdwin10_f.dll";
var scanner = new SignatureScanner(game, module.BaseAddress, module.ModuleMemorySize);
var gameScan = scanner.Scan((SigScanTarget)vars.gameTarget);
var inputModule = modules.Single(m => m.ModuleName == inputStr);
var imScanner = new SignatureScanner(game, inputModule.BaseAddress, inputModule.ModuleMemorySize);
var imScan = imScanner.Scan((SigScanTarget)vars.inputManagerTarget);
var offset = game.ReadValue<int>(gameScan);
var imOffset = game.ReadValue<int>(imScan);
var loadingOffset = game.ReadValue<int>(gameScan + 10);
if (vars.isFoundationPatch)
loadingOffset += 3;
Thread.Sleep(2500); // Give the game a chance to initialize..
// Boolean for loading
vars.isLoading = new MemoryWatcher<bool>(new DeepPointer(module.ModuleName, (int)((long)(gameScan + offset + 4) - (long)module.BaseAddress), 0x30, loadingOffset));
// ClientState hash
vars.state = new MemoryWatcher<uint>(new DeepPointer(module.ModuleName, (int)((long)(gameScan + offset + 4) - (long)module.BaseAddress), 0x30, vars.isFoundationPatch ? 0x138 : 0x1A8));
// InputManager.playerControlEnabled
vars.playerControlEnabled = new MemoryWatcher<bool>(new DeepPointer(inputModule.ModuleName, (int)((long)(imScan + imOffset + 4) - (long)inputModule.BaseAddress), vars.isFoundationPatch ? 0x7D : 0x8D));
}
update
{
vars.isLoading.Update(game);
vars.state.Update(game);
vars.playerControlEnabled.Update(game);
}
exit
{
timer.IsGameTimePaused = true;
}
start
{
return vars.state.Current == 0xE89FFD52 && !vars.playerControlEnabled.Old && vars.playerControlEnabled.Current;
}
isLoading
{
return vars.isLoading.Current || vars.state.Current == 0x469239DF || vars.state.Current == 0xD439EBF1 || vars.state.Current == 0xB5C73550 || vars.state.Current == 0x63C25A55 || vars.state.Current == 0;
}
/*
Used state hashes (FNV-1a):
0x469239DF = ClientStatePlatformServicesLogon
0xD439EBF1 = ClientStateStart
0xB5C73550 = ClientStateSplashScreen
0x63C25A55 = ClientStateMainMenu
0xE89FFD52 = ClientStateInGame
*/