state("VHOLUME-Win64-Shipping") {} init { var module = modules.First(); var scanner = new SignatureScanner(game, module.BaseAddress, module.ModuleMemorySize); IntPtr ptr = scanner.Scan(new SigScanTarget("56 48 4F 4C 53 50 44 52")); // "VHOLSPDR" if (ptr == IntPtr.Zero) throw new Exception("VHOLUME telemetry block not found"); int version = memory.ReadValue(ptr + 0x08); int size = memory.ReadValue(ptr + 0x0C); if (version != 1 || size != 160) throw new Exception("Unsupported telemetry layout: v" + version + " size " + size); print("[VHOLUME] block at 0x" + ptr.ToString("X")); vars.seqwatch = new MemoryWatcher(ptr + 0x10) { Name = "SeqLock" }; vars.resets = new MemoryWatcher(ptr + 0x24) { Name = "FullResets" }; vars.compl = new MemoryWatcher(ptr + 0x14) { Name = "Completions" }; vars.runStarted = new MemoryWatcher(ptr + 0x49) { Name = "RunStarted" }; vars.runTime = new MemoryWatcher(ptr + 0x30) { Name = "RunTime" }; vars.watchers = new MemoryWatcherList { vars.resets, vars.compl, vars.runStarted, vars.runTime //new MemoryWatcher(ptr + 0x2C) { Name = "Category" }, //new MemoryWatcher(ptr + 0x40) { Name = "LastSplit" }, //new MemoryWatcher(ptr + 0x48) { Name = "TimerRunning" }, //new StringWatcher(ptr + 0x50, ReadStringType.UTF8, 16) { Name = "Level" }, }; } update { vars.seqwatch.Update(game); if (vars.seqwatch.Current % 2 != 0) return false; vars.watchers.UpdateAll(game); } split { return vars.compl.Current > vars.compl.Old; } reset { return vars.resets.Current > vars.resets.Old; } start { return vars.runStarted.Current > 0; } isLoading { return true; } gameTime { return TimeSpan.FromSeconds(vars.runTime.Current); }