示例#1
0
 /// <summary>
 /// StartReplayService method implementation
 /// </summary>
 private void StartReplayService()
 {
     try
     {
         _svchost.StartService(this);
         ReplayClient replaymanager = new ReplayClient();
         replaymanager.Initialize();
         try
         {
             IReplay client = replaymanager.Open();
             try
             {
                 client.WarmUp();
             }
             catch (Exception e)
             {
                 this.EventLog.WriteEntry(string.Format("Error on WarmUp ReplayService : {0}.", e.Message), EventLogEntryType.Error, 1001);
             }
             finally
             {
                 replaymanager.Close(client);
             }
         }
         finally
         {
             replaymanager.UnInitialize();
         }
     }
     catch (Exception e)
     {
         this.EventLog.WriteEntry(string.Format("Error when starting ReplayService : {0}.", e.Message), EventLogEntryType.Error, 1001);
     }
 }
示例#2
0
        public ReplayStats(IReplay replayer)
        {
            _replayer = replayer;
            _vectors  = replayer.Vectors.ToList();

            TotalSegments = _vectors.Count();
            StartTime     = _vectors[0].Time;
            EndTime       = _vectors[TotalSegments - 1].Time;
            TotalTime     = EndTime - StartTime;

            Velocities = new List <double>();
            Velocities.Add(0);
            for (var i = 1; i < TotalSegments; i++)
            {
                var distance = _vectors[i].Vector.magnitude;
                var time     = (_vectors[i].Time - _vectors[i - 1].Time).TotalMilliseconds;
                if (time == 0)
                {
                    Velocities.Add(0);
                }
                else
                {
                    Velocities.Add(distance / time);
                }
            }

            var sortedVelocities = Velocities.OrderBy(x => x).ToList();

            MaxVelocity = sortedVelocities.Last();
            MinVelocity = sortedVelocities.First();

            TotalDistance   = _vectors.Aggregate(0f, (x, y) => y.Vector.magnitude);
            AverageVelocity = Velocities.Aggregate(0f, (x, y) => (float)(x + y)) / Velocities.Count;
        }
示例#3
0
        public ReplayStats(IReplay replayer)
        {
            _replayer = replayer;
            _vectors  = replayer.Vectors.ToList();

            TotalSegments = _vectors.Count();
            StartTime     = _vectors[0].Time;
            EndTime       = _vectors[TotalSegments - 1].Time;
            TotalTime     = EndTime - StartTime;

            Velocities = new List<double>();
            Velocities.Add(0);
            for (var i = 1; i < TotalSegments; i++)
            {
                var distance = _vectors[i].Vector.magnitude;
                var time = (_vectors[i].Time - _vectors[i - 1].Time).TotalMilliseconds;
                if (time == 0)
                    Velocities.Add(0);
                else
                    Velocities.Add(distance / time);
            }

            var sortedVelocities = Velocities.OrderBy(x => x).ToList ();
            MaxVelocity = sortedVelocities.Last();
            MinVelocity = sortedVelocities.First();

            TotalDistance = _vectors.Aggregate(0f, (x, y) => y.Vector.magnitude);
            AverageVelocity = Velocities.Aggregate(0f, (x, y) => (float)(x + y)) / Velocities.Count;
        }
示例#4
0
        // All players should execute build actions, train/morph units while observers can not.
        public static IEnumerable <IPlayer> ExtractObservers(IReplay replay)
        {
            IList <IPlayer> players = new List <IPlayer>(replay.Players);

            foreach (IAction action in replay.Actions)
            {
                // make collection of actions instead + what is ActionType.Target ?? how is A-Move recorded? Which actions can and can't observers do???
                if (action.ActionType == ActionType.Build || action.ActionType == ActionType.Train || action.ActionType == ActionType.UnitMorph || action.ActionType == ActionType.BuildingMorph || action.ActionType == ActionType.Research || action.ActionType == ActionType.UseCheat)
                {
                    if (players.Count > 0)
                    {
                        players.Remove(action.Player);
                    }
                    else
                    {
                        break;
                    }
                    //return null;
                }
            }
            foreach (var player in players)
            {
                player.IsObserver = true;
            }
            return(players);
        }
示例#5
0
        /// <summary>
        /// Decompress and retrieve the <see cref="ReplayMoveData"/> from the current replay.
        /// </summary>
        /// <param name="replay">Instance of the replay.</param>
        public static IReadOnlyList <ReplayMoveData> GetReplayMoveData(this IReplay replay)
        {
            if (replay == null)
            {
                throw new ArgumentNullException(nameof(replay));
            }

            var decompressedData       = SevenZipLZMAHelper.Decompress(replay.CompressedReplayData.ToArray());
            var decompressedDataString = Encoding.UTF8.GetString(decompressedData);

            var moveData = new List <ReplayMoveData>();

            foreach (var replayData in decompressedDataString.Split(','))
            {
                var contents = replayData.Split('|');
                if (contents.Length < 4)
                {
                    continue;
                }

                moveData.Add(new ReplayMoveData(long.Parse(contents[0]), float.Parse(contents[1]), float.Parse(contents[2]), int.Parse(contents[3])));
            }

            return(moveData.AsReadOnly());
        }
示例#6
0
 /// <summary>
 /// Close method implementation
 /// </summary>
 public void Close(IReplay client)
 {
     if (client != null)
     {
         ((IClientChannel)client).Close();
     }
 }
        public static IPlayer ExtractWinner(IReplay replay)
        {
            IList <IPlayer> players = new List <IPlayer>(replay.Players);

            foreach (IAction action in replay.Actions)
            {
                if (action.ActionType == ActionType.LeaveGame)
                {
                    LeaveGameAction a = (LeaveGameAction)action;
                    switch (a.LeaveGameType)
                    {
                    case LeaveGameType.Dropped:
                        return(null);

                    case LeaveGameType.Quit:
                        players.Remove(a.Player);
                        break;

                    default:
                        throw new InvalidOperationException();
                    }
                }
            }

            if (players.Count() == 1)
            {
                return(players[0]);
            }

            return(null);
        }
示例#8
0
        public static void PrintActionType <T>(IReplay replay)
        {
            var actions1 = replay.Actions.Where(x => x is T)
                           .OrderBy(x => x.Frame)
                           .ToList <IAction>();

            foreach (var a in actions1)
            {
                if (typeof(T) == typeof(BuildAction))
                {
                    System.Console.Write("{0,10} - {2,-15} - {1,10}", a.Frame, a.ActionType, a.Player.Name);
                    System.Console.Write(" - {0}", ((BuildAction)a).ObjectType);
                }
                else if (typeof(T) == typeof(GenericObjectTypeAction))
                {
                    System.Console.Write("{0,10} - {2,-15} - {1,10}", a.Frame, a.ActionType, a.Player.Name);
                    System.Console.Write(" - {0}", ((GenericObjectTypeAction)a).ObjectType);
                }
                else
                {
                    System.Console.Write(a);
                }

                System.Console.WriteLine();
            }
        }
 public void RealTimeReplay(string saveStateFile)
 {
     var savedState = VirtualProfilerSaveState.LoadFromFile(saveStateFile);
     Global.Launcher.SaveState = savedState;
     if (Objects.ReplayController == null) throw new ApplicationException("No replay adapter found.");
     _activeReplayer = new RealTimeReplayer(Objects.ReplayController.LineRenderer, SubjectLogger.Load(savedState.RunSettings.SubjectPositionPath));
     Objects.ReplayController.StartReplay(_activeReplayer);
 }
示例#10
0
        public void StopReplay()
        {
            if (Objects.ReplayController != null)
                Objects.ReplayController.StopReplay();

            Objects.ReplayCamera.enabled = false;
            Objects.RuntimeCamera.enabled = true;

            _activeReplayer = null;
        }
示例#11
0
            public bool Equals(IReplay other)
            {
                var v = other as Event;

                if (v == null)
                {
                    return(false);
                }
                return(_id == v._id && _name == v._name && _eventAttributes == v._eventAttributes && _type == v._type);
            }
示例#12
0
            public bool Equals(IReplay other)
            {
                var v = other as Field;

                if (v == null)
                {
                    return(false);
                }
                return(_id == v._id && _name == v._name && _type == v._type && _fieldAttributes == v._fieldAttributes);
            }
示例#13
0
            public bool Equals(IReplay other)
            {
                var v = other as Constructor;

                if (v == null)
                {
                    return(false);
                }
                return(_id == v._id && _parameters.SequenceEqual(v._parameters) && _ilGen.Equals(v._ilGen));
            }
示例#14
0
            public bool Equals(IReplay other)
            {
                var v = other as MethodOverride;

                if (v == null)
                {
                    return(false);
                }
                return(_id == v._id && _methodBuilder.Equals(v._methodBuilder) && _baseMethod == v._baseMethod);
            }
示例#15
0
        public static IReplay Read(OsuBinaryReader reader, IReplay outobj = null, bool minimalLoad = true, int?version = null)
        {
            if (outobj == null)
            {
                outobj = new Replay();
            }
            outobj.PlayMode               = (PlayMode)reader.ReadByte();
            outobj.Version                = reader.ReadInt32();
            outobj.MapHash                = reader.ReadString();
            outobj.PlayerName             = reader.ReadString();
            outobj.ReplayHash             = reader.ReadString();
            outobj.C300                   = reader.ReadInt16();
            outobj.C100                   = reader.ReadInt16();
            outobj.C50                    = reader.ReadInt16();
            outobj.Geki                   = reader.ReadInt16();
            outobj.Katu                   = reader.ReadInt16();
            outobj.Miss                   = reader.ReadInt16();
            outobj.TotalScore             = reader.ReadInt32();
            outobj.MaxCombo               = reader.ReadInt16();
            outobj.Perfect                = reader.ReadBoolean();
            outobj.Mods                   = reader.ReadInt32();
            outobj.ReplayData             = reader.ReadString();
            outobj.DateTicks              = reader.ReadInt64();
            outobj.Date                   = GetDate(outobj.DateTicks);
            outobj.CompressedReplayLength = reader.ReadInt32();
            if (outobj.CompressedReplayLength > 0)
            {
                if (minimalLoad)
                {
                    reader.ReadBytes(outobj.CompressedReplayLength);
                }
                else
                {
                    outobj.CompressedReplay = reader.ReadBytes(outobj.CompressedReplayLength);
                }
            }

            version = version ?? outobj.Version;
            if (version >= 20140721)
            {
                outobj.OnlineScoreId = reader.ReadInt64();
            }
            else if (version >= 20121008)
            {
                outobj.OnlineScoreId = reader.ReadInt32();
            }

            if ((((Mods)outobj.Mods) & DataTypes.Mods.Tp) != 0)
            {
                outobj.AdditionalMods = reader.ReadDouble();
            }

            return(outobj);
        }
示例#16
0
        public void InstantReplay(string saveStateFile)
        {
            var savedState = VirtualProfilerSaveState.LoadFromFile(saveStateFile);

            Global.Launcher.SaveState = savedState;
            if (Objects.ReplayController == null)
            {
                throw new ApplicationException("No replay adapter found.");
            }
            _activeReplayer = new InstantReplayer(Objects.ReplayController.LineRenderer, SubjectLogger.Load(savedState.RunSettings.SubjectPositionPath));
            Objects.ReplayController.StartReplay(_activeReplayer);
        }
示例#17
0
        public void StopReplay()
        {
            if (Objects.ReplayController != null)
            {
                Objects.ReplayController.StopReplay();
            }

            Objects.ReplayCamera.enabled  = false;
            Objects.RuntimeCamera.enabled = true;

            _activeReplayer = null;
        }
        /// <summary>
        /// CheckForReplay method implementation
        /// </summary>
        public bool Check(List <string> servernames, ReplayRecord record)
        {
            bool tempresult = false;

            try
            {
                lock (_lock)
                {
                    tempresult = _manager.AddToReplay(record);
                    if (tempresult)
                    {
                        if ((record.MustDispatch) && (servernames != null))
                        {
                            foreach (string fqdn in servernames)
                            {
                                ReplayClient replaymanager = new ReplayClient();
                                try
                                {
                                    replaymanager.Initialize(fqdn);
                                    IReplay client = replaymanager.Open();

                                    try
                                    {
                                        record.MustDispatch = false;
                                        tempresult          = client.Check(servernames, record);
                                    }
                                    catch (Exception e)
                                    {
                                        _log.WriteEntry(string.Format("Error on Check Remote Service method : {0} => {1}.", fqdn, e.Message), EventLogEntryType.Error, 1011);
                                    }
                                    finally
                                    {
                                        replaymanager.Close(client);
                                    }
                                }
                                catch (Exception e)
                                {
                                    _log.WriteEntry(string.Format("Error on Check Remote Service method : {0} => {1}.", fqdn, e.Message), EventLogEntryType.Error, 1011);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                _log.WriteEntry(string.Format("Error on Check Service method : {0}.", e.Message), EventLogEntryType.Error, 1010);
            }
            return(tempresult);
        }
示例#19
0
            public bool Equals(IReplay other)
            {
                var v = other as Method;

                if (v == null)
                {
                    return(false);
                }
                return(_id == v._id &&
                       _name == v._name &&
                       _returns == v._returns &&
                       _methodAttributes == v._methodAttributes &&
                       _parameters.SequenceEqual(v._parameters) &&
                       _ilGen.Equals(v._ilGen));
            }
        /// <summary>
        /// Reset method implementation
        /// </summary>
        public void Reset(List <string> servernames)
        {
            try
            {
                lock (_lock)
                {
                    _manager.Reset();
                }
                if (servernames != null)
                {
                    foreach (string fqdn in servernames)
                    {
                        ReplayClient replaymanager = new ReplayClient();
                        try
                        {
                            replaymanager.Initialize(fqdn);
                            IReplay client = replaymanager.Open();

                            try
                            {
                                client.Reset(null);
                            }
                            catch (Exception e)
                            {
                                _log.WriteEntry(string.Format("Error on Check Remote Service method : {0} => {1}.", fqdn, e.Message), EventLogEntryType.Error, 1011);
                            }
                            finally
                            {
                                replaymanager.Close(client);
                            }
                        }
                        catch (Exception e)
                        {
                            _log.WriteEntry(string.Format("Error on Check Remote Service method : {0} => {1}.", fqdn, e.Message), EventLogEntryType.Error, 1011);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                _log.WriteEntry(string.Format("Error on Reset Service method : {0}.", e.Message), EventLogEntryType.Error, 1011);
            }
        }
示例#21
0
        private IEnumerable <IPlayer> GetPlayers(PlayerType type, IReplay replay)
        {
            switch ((int)type)
            {
            // none
            case 0:
                return(Enumerable.Empty <IPlayer>());

            // winners
            case 1:
                return(replay.Winners);

            // losers
            case 2:
                return(replay.Players.Except(replay.Observers).Except(replay.Winners));

            // winners + losers
            case 3:
                return(replay.Players.Except(replay.Observers));

            // observers
            case 4:
                return(replay.Observers);

            // winners + observers
            case 5:
                return(replay.Observers.Union(replay.Winners));

            // losers + observers
            case 6:
                return(replay.Players.Except(replay.Winners));

            // winners + losers + observers
            case 7:
                return(replay.Players);

            default:
                throw new Exception();
            }
        }
示例#22
0
        /// <summary>
        /// Pause method iplementation
        /// </summary>

        public static void Reset(List <string> computers)
        {
            ReplayClient manager = new ReplayClient();

            manager.Initialize();
            try
            {
                IReplay client = manager.Open();
                try
                {
                    client.Reset(computers);
                }
                finally
                {
                    manager.Close(client);
                }
            }
            finally
            {
                manager.UnInitialize();
            }
        }
示例#23
0
        /// <summary>
        /// Continue method iplementation
        /// </summary>
        public static bool Check(List <string> computers, ReplayRecord record)
        {
            ReplayClient manager = new ReplayClient();

            manager.Initialize();
            try
            {
                IReplay client = manager.Open();
                try
                {
                    return(client.Check(computers, record));
                }
                finally
                {
                    manager.Close(client);
                }
            }
            finally
            {
                manager.UnInitialize();
            }
        }
示例#24
0
 public static void Write(this IReplay replay, OsuBinaryWriter writer, bool dbMode = true)
 {
     if (dbMode)
     {
         replay.OsuOldReplayFix();
     }
     writer.Write((byte)replay.PlayMode);
     writer.Write(replay.Version);
     writer.Write(replay.MapHash);
     writer.Write(replay.PlayerName);
     writer.Write(replay.ReplayHash);
     writer.Write(replay.C300);
     writer.Write(replay.C100);
     writer.Write(replay.C50);
     writer.Write(replay.Geki);
     writer.Write(replay.Katu);
     writer.Write(replay.Miss);
     writer.Write(replay.TotalScore);
     writer.Write(replay.MaxCombo);
     writer.Write(replay.Perfect);
     writer.Write(replay.Mods);
     writer.Write(dbMode ? "" : replay.ReplayData);
     writer.Write(replay.Date.Ticks);
     if (dbMode)
     {
         writer.Write(-1);
     }
     else
     {
         writer.Write(replay.CompressedReplayLength);
         if (replay.CompressedReplayLength > 0)
         {
             writer.Write(replay.ReplayData);
         }
     }
     writer.Write(replay.OnlineScoreId);
 }
示例#25
0
 /// <summary>
 ///
 /// </summary>
 /// <rant>For whatever reason all of my replays before around 2015(mind you, I still have my 2011 replays)
 /// were treated by osu! as invalid, with as it turns out, invalidated whole database.</rant>
 /// <param name="replay"></param>
 private static void OsuOldReplayFix(this IReplay replay)
 {
     replay.Version = 20170503;
 }
示例#26
0
 public static Beatmap GetMap(this IReplay replay, IMapDataManager mapCacher)
 {
     return(mapCacher.GetByHash(replay.MapHash));
 }
示例#27
0
 private ReplayDecorator(File <IReplay> replayFile)
 {
     _replayFile = replayFile;
     _replay     = replayFile.Content;
 }
示例#28
0
 public void StartReplay(IReplay replayer)
 {
     _replayer = replayer;
     _isStarted = true;
 }
示例#29
0
 public MethodOverride(int id, IILMethod methodBuilder, MethodInfo baseMethod)
 {
     _id            = id;
     _methodBuilder = (IReplay)methodBuilder;
     _baseMethod    = baseMethod;
 }
示例#30
0
 public void SetAddOnMethod(IILMethod method)
 {
     _addOnMethod = (IReplay)method;
 }
示例#31
0
 public void SetRemoveOnMethod(IILMethod method)
 {
     _removeOnMethod = (IReplay)method;
 }
示例#32
0
 public void StartReplay(IReplay replayer)
 {
     _replayer  = replayer;
     _isStarted = true;
 }
示例#33
0
        //public static IPlayer ExtractWinner(IReplay replay)
        //{
        //    IList<IPlayer> players = new List<IPlayer>(replay.Players);

        //    foreach (IAction action in replay.Actions) {

        //        if (action.ActionType == ActionType.LeaveGame) {

        //            LeaveGameAction a = (LeaveGameAction)action;
        //            switch (a.LeaveGameType) {
        //                case LeaveGameType.Dropped:
        //                    return null;

        //                case LeaveGameType.Quit:
        //                    players.Remove(a.Player);
        //                    break;
        //                default:
        //                    throw new InvalidOperationException();
        //            }
        //        }
        //    }

        //    if (players.Count() == 1) {
        //        return players[0];
        //    }

        //    return null;
        //}


        //  What about OBSERVERS?? They don't have to leave the game or don't get dropped before it ends?? Do they remain in the players list??
        // yes observers stay in the list... Have to find a way to remove them, how?
        public static IEnumerable <IPlayer> ExtractWinners(IReplay replay)
        {
            IList <IPlayer> players   = new List <IPlayer>(replay.Players);
            IList <IPlayer> observers = new List <IPlayer>(replay.Observers);

            foreach (IAction action in replay.Actions)
            {
                if (action.ActionType == ActionType.LeaveGame)
                {
                    LeaveGameAction a = (LeaveGameAction)action;
                    switch (a.LeaveGameType)
                    {
                    case LeaveGameType.Dropped:
                        players.Remove(a.Player);
                        // once I get player teams to work, I have to only add this to players of the other team obviously...
                        foreach (var aPlayer in players)
                        {
                            aPlayer.OpponentDropped = true;
                        }
                        break;

                    case LeaveGameType.Quit:
                        players.Remove(a.Player);
                        break;

                    default:
                        players.Remove(a.Player);
                        break;
                        // why throw an exception if the actiontype has been identified to be leavegame? Maybe there are other possible values for the type of leavegame action...
                        //throw new InvalidOperationException();
                    }
                }
                //if (action.ActionType == ActionType.Build)
                //{
                //    BuildAction a = (BuildAction)action;
                //    if (a.Player.IsObserver == null)
                //    {
                //        a.Player.IsObserver = false;
                //    }
                //}
            }
            // your code for IsObserver doesn't make much sense, it's not remembered past this function!!
            if (players.Count() == 0)
            {
                return(players.AsEnumerable());
            }
            //for (int i = players.Count - 1; i >= 0; i--)
            //{
            //    if (players[i].IsObserver == null)
            //    {
            //        players[i].IsObserver = true;
            //        players.RemoveAt(i);
            //    }
            //}
            for (int i = players.Count - 1; i >= 0; i--)
            {
                if (observers.Contains(players[i]))
                {
                    players.RemoveAt(i);
                }
            }
            if (players.Count() == 0)
            {
                return(players.AsEnumerable());
            }
            // should be ExtractWinnerSSSS => what about 2v2, 3v3, 4v4 !!?
            return(players.AsEnumerable <IPlayer>());
        }