public GameReader(ProcessMemory pmem, IntPtrEx module, int moduleSize) { this._mem = pmem; this._module = module; this._moduleSize = moduleSize; this._state = new GameStateInfo(); var offsets = this._mem.FindOffsets(new NamedPattern[] { new NamedPattern(Offsets.ClientName, Offsets.ClientPattern, Offsets.ClientPatternPtrLocation), new NamedPattern(Offsets.MeetingHudName, Offsets.MeetingHudPattern, Offsets.MeetingHudPatternPtrLocation), new NamedPattern(Offsets.GameDataName, Offsets.GameDataPattern, Offsets.GameDataPatternPtrLocation), new NamedPattern(Offsets.ShipStatusName, Offsets.ShipStatusPattern, Offsets.ShipStatusPatternPtrLocation) }, this._module, this._moduleSize); foreach (var offset in offsets) { switch (offset.Name) { case Offsets.ClientName: Offsets.ClientBase = offset.Offset; break; case Offsets.MeetingHudName: Offsets.MeetingHudBase = offset.Offset; break; case Offsets.GameDataName: Offsets.GameDataBase = offset.Offset; break; case Offsets.ShipStatusName: Offsets.ShipStatusBase = offset.Offset; break; } } if (Offsets.ClientBase == 0 || Offsets.MeetingHudBase == 0 || Offsets.GameDataBase == 0 || Offsets.ShipStatusBase == 0) { throw new InvalidProcessException(); } }
private void EventDispatcherLoop() { var mem = new ProcessMemory(this._proc); var reader = new GameReader(mem, this._module, this._moduleSize); reader.GameStarted += (o, e) => this.TriggerEvent(o, e); reader.GameEnded += (o, e) => this.TriggerEvent(o, e); reader.PlayerJoined += (o, e) => this.TriggerEvent(o, e); reader.PlayerLeft += (o, e) => this.TriggerEvent(o, e); reader.PlayerDied += (o, e) => this.TriggerEvent(o, e); reader.PlayerImpostorStatusChanged += (o, e) => this.TriggerEvent(o, e); reader.MeetingStarted += (o, e) => this.TriggerEvent(o, e); reader.MeetingEnded += (o, e) => this.TriggerEvent(o, e); while (!this._ct.IsCancellationRequested) { reader.DoRead(); Thread.Yield(); } }