예제 #1
0
        async Task ILoadableContent.LoadAsync(CancellationToken cancellationToken)
        {
            _object = await ReplaysManager.Instance.GetByIdAsync(_id);

            if (_object?.TrackId != null)
            {
                var trackObject = await TracksManager.Instance.GetByIdAsync(_object.TrackId);

                if (_object.TrackConfiguration != null)
                {
                    _trackObject = trackObject?.GetLayoutByLayoutId(_object.TrackConfiguration) ?? trackObject;
                }
                else
                {
                    _trackObject = trackObject;
                }
            }

            if (_object?.CarId != null)
            {
                _carObject = await CarsManager.Instance.GetByIdAsync(_object.CarId);

                _carSkinObject = _carObject == null ? null :
                                 (_object.CarSkinId != null ? await _carObject.SkinsManager.GetByIdAsync(_object.CarSkinId) : null) ?? _carObject.SelectedSkin;
            }

            if (_object?.WeatherId != null)
            {
                _weather = await WeatherManager.Instance.GetByIdAsync(_object.WeatherId);
            }
        }
예제 #2
0
        private static async Task UpdateAsyncInner(TrackObjectBase track)
        {
            if (!File.Exists(track.MapImage))
            {
                ModernDialog.ShowMessage("Map not found");
                return;
            }

            try {
                using (WaitingDialog.Create("Saving…")) {
                    var maps = track.MainTrackObject.MultiLayouts?.Select(x => x.MapImage).ToArray() ?? new[] { track.MapImage };
                    await Task.Run(() => {
                        using (var renderer = new TrackOutlineRenderer(maps, track.MapImage, track.PreviewImage)
                        {
                            LoadPreview = false
                        }) {
                            renderer.Initialize();
                            renderer.Width  = CommonAcConsts.TrackOutlineWidth;
                            renderer.Height = CommonAcConsts.TrackOutlineHeight;

                            TrackOutlineRendererTools.LoadSettings(track, renderer);
                            using (var holder = FileUtils.RecycleOriginal(track.OutlineImage)) {
                                renderer.Shot(holder.Filename);
                            }
                        }
                    });
                }
            } catch (Exception e) {
                NonfatalError.Notify("Can’t update outline", e);
            }
        }
예제 #3
0
 public TrackOutlineRendererWrapper(TrackObjectBase track, TrackOutlineRenderer renderer)
     : base(renderer, track.Name, CommonAcConsts.TrackOutlineWidth, CommonAcConsts.TrackOutlineHeight)
 {
     _helper = new AttachedHelper(this, new TrackOutlineRendererTools(track, renderer), 244, -80, false);
     Form.FormBorderStyle = FormBorderStyle.FixedToolWindow;
     Form.MaximizeBox     = false;
 }
예제 #4
0
        public static async Task Run(TrackObjectBase track)
        {
            var modelsFilename = track.ModelsFilename;

            Logging.Debug(modelsFilename);

            string kn5Filename = null;

            if (!File.Exists(modelsFilename))
            {
                modelsFilename = null;
                kn5Filename    = Path.Combine(track.Location, track.Id + ".kn5");
                if (!File.Exists(kn5Filename))
                {
                    ModernDialog.ShowMessage("Model not found");
                    return;
                }
            }

            TrackMapPreparationRenderer renderer = null;

            try {
                using (WaitingDialog.Create("Loading model…")) {
                    renderer = modelsFilename == null ?
                               new TrackMapPreparationRenderer(await Task.Run(() => Kn5.FromFile(kn5Filename))) :
                               new TrackMapPreparationRenderer(await Task.Run(() => TrackComplexModelDescription.CreateLoaded(modelsFilename)));
                }

                var wrapper = new TrackMapRendererWrapper(track, renderer);
                wrapper.Form.Icon = AppIconService.GetAppIcon();
                wrapper.Run();
            } finally {
                renderer?.Dispose();
            }
        }
예제 #5
0
 public bool setCurrentTrack(string trackId, string layoutId = null)
 {
     return(Sync(() => {
         _track = TracksManager.Instance.GetLayoutById(trackId, layoutId);
         return _track != null;
     }));
 }
예제 #6
0
        protected override Task <Tuple <string, bool> > GetStateAsync()
        {
            var match = Regex.Match(Id, @"^(.+)_(\d+)$");

            if (!match.Success)
            {
                return(Task.FromResult <Tuple <string, bool> >(null));
            }

            var postfix     = $" #{match.Groups[2].Value}";
            var baseTrackId = match.Groups[1].Value;

            if (baseTrackId.Contains(@"__"))
            {
                var trackId = baseTrackId.Replace(@"__", @"/");
                Track = TracksManager.Instance.GetLayoutById(trackId);
                if (Track != null)
                {
                    return(Task.FromResult(Tuple.Create(Track.LayoutName + postfix, true)));
                }
            }

            var track = TracksManager.Instance.GetById(baseTrackId);

            Track = track;
            return(Task.FromResult(track != null ? Tuple.Create(track.DisplayNameWithoutCount + postfix, true) : null));
        }
예제 #7
0
            public ViewModel(TrackObjectBase track, TrackMapPreparationRenderer renderer)
            {
                Track    = track;
                Renderer = renderer;
                Renderer.SetFilter(this);

                Surfaces = SurfaceDescription.LoadAll(Path.Combine(track.DataDirectory, "surfaces.ini")).ToList();

                _save = new SaveHelper <SaveableData>(".TrackMapRendererTools:" + track.Id, () => new SaveableData {
                    Filter            = Filter,
                    IgnoreCase        = FilterIgnoreCase,
                    UseFxaa           = UseFxaa,
                    Scale             = Scale,
                    Margin            = Margin,
                    AiLaneWidth       = AiLaneWidth,
                    AiLaneActualWidth = AiLaneActualWidth,
                }, o => {
                    if (o.Filter == null)
                    {
                        UpdateFilter(Surfaces.Where(x => x.ShouldBeVisibleOnMap()));
                    }
                    else
                    {
                        Filter = o.Filter;
                    }

                    FilterIgnoreCase  = o.IgnoreCase;
                    UseFxaa           = o.UseFxaa;
                    Scale             = o.Scale;
                    Margin            = o.Margin;
                    AiLaneWidth       = o.AiLaneWidth;
                    AiLaneActualWidth = o.AiLaneActualWidth;
                }, storage: CacheStorage.Storage);
                _save.Initialize();
            }
예제 #8
0
        void ILoadableContent.Load()
        {
            _object = ReplaysManager.Instance.GetById(_id);

            if (_object?.TrackId != null)
            {
                var trackObject = TracksManager.Instance.GetById(_object.TrackId);
                if (_object.TrackConfiguration != null)
                {
                    _trackObject = trackObject?.GetLayoutByLayoutId(_object.TrackConfiguration) ?? trackObject;
                }
                else
                {
                    _trackObject = trackObject;
                }
            }

            if (_object?.CarId != null)
            {
                _carObject     = CarsManager.Instance.GetById(_object.CarId);
                _carSkinObject = _carObject == null ? null :
                                 (_object.CarSkinId != null ? _carObject.SkinsManager.GetById(_object.CarSkinId) : null) ?? _carObject.SelectedSkin;
            }

            if (_object?.WeatherId != null)
            {
                _weather = WeatherManager.Instance.GetById(_object.WeatherId);
            }
        }
예제 #9
0
        public void Show(ServerEntry server)
        {
            ServerEntry = server;

            if (!ReferenceEquals(DataContext, this))
            {
                DataContext = this;
                InitializeComponent();
                Show();

                Owner = Application.Current?.MainWindow;

                _timer = new DispatcherTimer {
                    Interval  = TimeSpan.FromSeconds(1),
                    IsEnabled = true
                };
                _timer.Tick += OnTick;
            }

            Car   = server.SelectedCarEntry?.CarObject;
            Track = server.Track;

            try {
                _ignoreSkinChange = true;
                Skin = server.GetSelectedCarSkin();
            } finally {
                _ignoreSkinChange = false;
            }

            Buttons = new[] {
                CreateExtraStyledDialogButton("Go.Button", AppStrings.Common_Go, () => ServerEntry?.JoinCommand.Execute(ServerEntry.ActualJoin), () => Ready),
                CancelButton
            };
        }
            public void Apply(TrackOutlineRenderer renderer, TrackObjectBase track)
            {
                var value = ExtraLayoutIds;

                renderer.SetActiveMaps(value == null ? new string[0] :
                                       track.MainTrackObject.MultiLayouts?.Where(x => value.ArrayContains(x.LayoutId)).Select(x => x.MapImage).ToArray());
            }
        public static void LoadSettings(TrackObjectBase track, TrackOutlineRenderer renderer)
        {
            SaveHelper <PerLayoutSaveable> .LoadOrReset(".TrackOutlineRendererTools:l:" + track.IdWithLayout, CacheStorage.Storage).Apply(renderer, track);

            SaveHelper <PerTrackSaveable> .LoadOrReset(".TrackOutlineRendererTools:" + track.Id, CacheStorage.Storage).Apply(renderer);

            SaveHelper <GlobalSaveable> .LoadOrReset(".TrackOutlineRendererTools", ValuesStorage.Storage).Apply(renderer);
        }
예제 #12
0
            public ViewModel([NotNull] ServerPresetObject acObject, TrackObjectBase track, CarObject[] cars) : base(acObject)
            {
                SelectedObject.PropertyChanged += AcObject_PropertyChanged;

                Track = track;
                Cars  = new BetterObservableCollection <CarObject>(cars);
                Cars.CollectionChanged += Cars_CollectionChanged;
            }
예제 #13
0
 public void OnTrackVersionChanged(TrackObjectBase track)
 {
     if (!_trackVersionIsWrong || !PortExtended.HasValue || Track != track)
     {
         return;
     }
     CheckPostUpdate();
 }
예제 #14
0
 /// <summary>
 /// Gets description for ReadMe.txt inside shared archive.
 /// </summary>
 /// <returns></returns>
 private static string GetDescription([CanBeNull] CarObject car, [CanBeNull] TrackObjectBase track)
 {
     return(car == null
             ? (track == null ? ToolsStrings.Common_AcReplay : $"{ToolsStrings.Common_AcReplay} ({track.Name})")
             : (track == null
                     ? $"{ToolsStrings.Common_AcReplay} ({car.DisplayName})"
                     : $"{ToolsStrings.Common_AcReplay} ({car.DisplayName}, {track.Name})"));
 }
예제 #15
0
 public void OnTrackVersionChanged(TrackObjectBase track)
 {
     if (!_trackVersionIsWrong || !HasDetails || Track != track)
     {
         return;
     }
     CheckPostUpdate();
 }
예제 #16
0
 public static Task Run(TrackObjectBase track, bool aiLane)
 {
     try {
         return(RunInner(track, aiLane));
     } catch (Exception e) {
         VisualCppTool.OnException(e, "Can’t update map");
         return(Task.Delay(0));
     }
 }
예제 #17
0
 public static Task UpdateAsync(TrackObjectBase track)
 {
     try {
         return(UpdateAsyncInner(track));
     } catch (Exception e) {
         VisualCppTool.OnException(e, "Can’t update outline");
         return(Task.Delay(0));
     }
 }
예제 #18
0
        public static Task <GeoTagsEntry> TryToLocateAsync([NotNull] TrackObjectBase track)
        {
            var data = DataProvider.Instance.TrackParams[track.MainTrackObject.Id];

            if (data.ContainsKey(@"LATITUDE") && data.ContainsKey(@"LONGITUDE"))
            {
                return(Task.FromResult(new GeoTagsEntry(data.GetDouble("LATITUDE", 0d), data.GetDouble("LONGITUDE", 0d))));
            }
            return(track.Country != null?TryToLocateAsync(track.Country, track.City) : Task.FromResult <GeoTagsEntry>(null));
        }
예제 #19
0
        private void UpdateSelected(TrackObjectBase track)
        {
            var item = _countriesInformationList.FirstOrDefault(x => x.DisplayName == track.Country);

            if (item == null)
            {
                return;
            }
            CountriesListBox.SelectedItem = item;
            CountriesListBox.ScrollIntoView(item);
        }
예제 #20
0
        void ILoadableContent.Load()
        {
            _object = ServerPresetsManager.Instance.GetById(_id);
            if (_object == null)
            {
                return;
            }

            _track = _object.TrackId == null ? null : TracksManager.Instance.GetLayoutById(_object.TrackId, _object.TrackLayoutId);
            _cars  = _object.CarIds.Select(x => CarsManager.Instance.GetById(x)).ToArray();
        }
예제 #21
0
            private async Task <Tuple <string, string> > LoadData()
            {
                Car     = null;
                CarSkin = null;
                Track   = null;

                string uri;

                if (EventId.Contains(@"/"))
                {
                    var splitted = EventId.Split('/');
                    uri = $"http://www.radiators-champ.com/RSRLiveTiming/index.php?page=rank&track={splitted[0]}&car={splitted[1]}";
                }
                else
                {
                    uri = $"http://www.radiators-champ.com/RSRLiveTiming/index.php?page=event_rank&eventId={EventId}";
                }

                string page;

                using (var client = new WebClient {
                    Headers =
                    {
                        [HttpRequestHeader.UserAgent] = InternalUtils.GetKunosUserAgent(),
                        [@"X-User-Agent"] = CmApiProvider.UserAgent
                    }
                }) {
                    page = await client.DownloadStringTaskAsync(uri);
                }

                var carIdMatch         = Regex.Match(page, @"\bdata-car=""([\w-]+)""");
                var trackIdMatch       = Regex.Match(page, @"\bdata-track=""([\w-]+)""");
                var trackLayoutIdMatch = Regex.Match(page, @"\bdata-track-layout=""([\w-]+)""");

                if (!carIdMatch.Success || !trackIdMatch.Success)
                {
                    return(null);
                }

                var carId         = carIdMatch.Groups[1].Value;
                var trackId       = trackIdMatch.Groups[1].Value;
                var trackLayoutId = trackLayoutIdMatch.Success ? trackLayoutIdMatch.Groups[1].Value : null;

                if (trackLayoutId == trackId)
                {
                    trackLayoutId = null; // TODO: temporary fix
                }

                Car     = CarsManager.Instance.GetById(carId);
                CarSkin = Car?.SelectedSkin;
                Track   = TracksManager.Instance.GetLayoutById(trackId, trackLayoutId);

                return(new Tuple <string, string>(carId, trackId));
            }
예제 #22
0
        public SelectTrackDialog([NotNull] TrackObjectBase selectedTrackConfiguration)
        {
            _instance = new WeakReference <SelectTrackDialog>(this);

            DataContext = new ViewModel(selectedTrackConfiguration);
            InitializeComponent();

            Model.PropertyChanged  += Model_PropertyChanged;
            BackgroundImage0.Source = UriToCachedImageConverter.Convert(Model.CurrentPreviewImage);

            Buttons = new[] { OkButton, CancelButton };
        }
            public MapParams(TrackObjectBase track)
            {
                Track = track;

                var config = new IniFile(Path.Combine(track.DataDirectory, "map.ini"));

                _offsetX = config["PARAMETERS"].GetDouble("X_OFFSET", 0d);
                _offsetY = config["PARAMETERS"].GetDouble("Z_OFFSET", 0d);
                var scaleFactor = config["PARAMETERS"].GetDouble("SCALE_FACTOR", 1d);

                _configSizeX = config["PARAMETERS"].GetDouble("WIDTH", 1e3) * scaleFactor;
                _configSizeY = config["PARAMETERS"].GetDouble("HEIGHT", 1e3) * scaleFactor;
            }
예제 #24
0
        async Task ILoadableContent.LoadAsync(CancellationToken cancellationToken)
        {
            _object = await ServerPresetsManager.Instance.GetByIdAsync(_id);

            if (_object == null)
            {
                return;
            }

            _track = _object.TrackId == null ? null : await TracksManager.Instance.GetLayoutByIdAsync(_object.TrackId, _object.TrackLayoutId);

            _cars = (await _object.CarIds.Select(x => CarsManager.Instance.GetByIdAsync(x)).WhenAll(4)).ToArray();
        }
예제 #25
0
            public ViewModel(TrackObjectBase track, TrackMapPreparationRenderer renderer)
            {
                Track    = track;
                Renderer = renderer;
                Renderer.SetFilter(this);

                Surfaces = SurfaceDescription.LoadAll(Path.Combine(track.DataDirectory, "surfaces.ini")).ToList();
                UpdateFilter(Surfaces.Where(x => x.ShouldBeVisibleOnMap()));

                _useFxaa = Renderer.UseFxaa;
                _margin  = Renderer.Margin;
                _scale   = Renderer.Scale;
            }
예제 #26
0
        private static async Task RunInner(TrackObjectBase track, bool aiLane)
        {
            string modelsFilename = null, kn5Filename = null, aiLaneFilename = null;

            if (!aiLane)
            {
                modelsFilename = track.ModelsFilename;
                if (!File.Exists(modelsFilename))
                {
                    modelsFilename = null;
                    kn5Filename    = Path.Combine(track.Location, track.Id + ".kn5");
                    if (!File.Exists(kn5Filename))
                    {
                        ModernDialog.ShowMessage("Model not found");
                        return;
                    }
                }
            }
            else
            {
                aiLaneFilename = track.AiLaneFastFilename;
                if (!File.Exists(aiLaneFilename))
                {
                    ModernDialog.ShowMessage("AI lane not found");
                    return;
                }
            }

            await PrepareAsync();

            TrackMapPreparationRenderer renderer = null;

            try {
                using (WaitingDialog.Create("Loading model…")) {
                    renderer = aiLaneFilename == null ?
                               modelsFilename == null ?
                               new TrackMapPreparationRenderer(await Task.Run(() => Kn5.FromFile(kn5Filename))) :
                               new TrackMapPreparationRenderer(await Task.Run(() => TrackComplexModelDescription.CreateLoaded(modelsFilename))) :
                               new TrackMapPreparationRenderer(await Task.Run(() => AiSpline.FromFile(aiLaneFilename)));
                }

                var wrapper = new TrackMapRendererWrapper(track, renderer);
                wrapper.Form.Icon = AppIconService.GetAppIcon();
                wrapper.Run();
            } catch (Exception e) {
                NonfatalError.Notify("Can’t update map", e);
            } finally {
                renderer?.Dispose();
            }
        }
예제 #27
0
 public static void Show(TrackObjectBase track)
 {
     // TODO
     if (!InternalUtils.IsAllRight)
     {
         return;
     }
     if (Application.Current?.MainWindow is MainWindow)
     {
         _selectNextTrack         = track.Id;
         _selectNextTrackLayoutId = track.LayoutId;
         NavigateToPage();
     }
 }
예제 #28
0
            public ViewModel(TrackObjectBase track)
            {
                Track = track;

                if (track.GeoTags != null)
                {
                    Latitude  = track.GeoTags.Latitude;
                    Longitude = track.GeoTags.Longitude;
                }
                else
                {
                    Latitude  = null;
                    Longitude = null;
                }
            }
예제 #29
0
        public SelectTrackDialog([NotNull] TrackObjectBase selectedTrackConfiguration)
        {
            _instance = new WeakReference <SelectTrackDialog>(this);

            DataContext = new ViewModel(selectedTrackConfiguration);
            InputBindings.AddRange(new[] {
                new InputBinding(ToggleFavouriteCommand, new KeyGesture(Key.B, ModifierKeys.Control))
            });
            InitializeComponent();

            Model.PropertyChanged  += Model_PropertyChanged;
            BackgroundImage0.Source = UriToCachedImageConverter.Convert(Model.CurrentPreviewImage);

            Buttons = new[] { OkButton, CancelButton };
        }
예제 #30
0
        public static TrackObjectBase Show([CanBeNull] TrackObjectBase track)
        {
            if (track == null)
            {
                track = TracksManager.Instance.GetDefault();
                if (track == null)
                {
                    return(null);
                }
            }

            var dialog = new SelectTrackDialog(track);

            dialog.ShowDialog();
            return(!dialog.IsResultOk || dialog.Model.SelectedTrackConfiguration == null ? track : dialog.Model.SelectedTrackConfiguration);
        }