コード例 #1
0
        public static Task <SourceDemo> TimeExact(this SourceDemo demo, int endTick = 0, int startTick = 0)
        {
            if (demo.Messages.Count == 0)
            {
                throw new InvalidOperationException("Cannot time demo without any parsed messages.");
            }

            var synced = false;
            var last   = 0;

            foreach (DemoMessage msg in demo.Messages)
            {
                if (msg.IsType <SyncTick>())
                {
                    synced = true;
                }

                if (!synced)
                {
                    msg.Tick = 0;
                }
                else if (msg.Tick < 0)
                {
                    msg.Tick = last;
                }

                last = msg.Tick;
            }

            if (endTick < 1)
            {
                endTick = demo.Messages.Last().Tick;
            }

            var delta = endTick - startTick;

            if (delta < 0)
            {
                throw new Exception("Start tick is greater than end tick.");
            }

            var ipt = demo.GetIntervalPerTick();

            demo.PlaybackTicks = delta;
            demo.PlaybackTime  = ipt * delta;
            return(Task.FromResult(demo));
        }
コード例 #2
0
        public async Task <string> ParseCommandAsync(string command)
        {
            switch (command.ToLower())
            {
            case "header":
                return($"HeaderId\t{_demo.HeaderId}\n" +
                       $"Protocol\t{_demo.Protocol}\n" +
                       $"NetworkProtocol\t{_demo.NetworkProtocol}\n" +
                       $"GameDirectory\t{_demo.GameDirectory}\n" +
                       $"MapName\t{_demo.MapName}\n" +
                       $"ServerName\t{_demo.ServerName}\n" +
                       $"ClientName\t{_demo.ClientName}\n" +
                       $"PlaybackTime\t{_demo.PlaybackTime.ToString("N3")}\n" +
                       $"PlaybackTicks\t{_demo.PlaybackTicks}\n" +
                       $"PlaybackFrames\t{_demo.PlaybackFrames}\n" +
                       $"SignOnLength\t{_demo.SignOnLength}");

            case "header-id":
                return($"HeaderId\t{_demo.HeaderId}");

            case "protocol":
                return($"Protocol\t{_demo.Protocol}");

            case "netproc":
            case "net-protocol":
                return($"NetworkProtocol\t{_demo.NetworkProtocol}");

            case "dir":
            case "game-dir":
                return($"GameDirectory\t{_demo.GameDirectory}");

            case "map":
            case "map-name":
                return($"MapName\t{_demo.MapName}");

            case "server":
            case "server-name":
                return($"ServerName\t{_demo.ServerName}");

            case "client":
            case "client-name":
                return($"ClientName\t{_demo.ClientName}");

            case "time":
                return($"PlaybackTime\t{_demo.PlaybackTime.ToString("N3")}");

            case "ticks":
                return($"PlaybackTicks\t{_demo.PlaybackTicks}");

            case "frames":
                return($"FrameCount\t{_demo.PlaybackFrames}");

            case "signon":
            case "signonlength":
                return($"SignOnLength\t{_demo.SignOnLength}");

            // Data
            case "tickrate":
                return($"Tickrate\t{_demo.GetTickrate()}");

            case "ipt":
            case "interval-per-tick":
                return($"IntervalPerTick\t{_demo.GetIntervalPerTick().ToString("N3")}");

            // Returns nothing
            case "time-exact":
                await _demo.TimeExact();

                break;

            case "time-sf":
            case "time-flag":
                await _demo.TimeFlagAsync();

                break;

            case "speedrun":
                if (!_discovered)
                {
                    await Adjustments.DiscoverAsync();

                    _discovered = true;
                }
                await _demo.AdjustAsync();

                break;
            }
            return(default);