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)); }
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);