示例#1
0
        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();
            }
        }
示例#2
0
        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();
            }
        }