void UpdatePlayerPositions(WorldState ws) { foreach (Player p in ws.Players) { TF2Net.Data.Vector worldPos = p.Position.Value; Team? t = p.Team.Value; Class?c = p.Class.Value; bool? isDead = p.IsDead.Value; if (worldPos == null || (t != Team.Red && t != Team.Blue) || (!c.HasValue || c.Value == Class.Undefined || c.Value == Class.Civilian) || (!isDead.HasValue || isDead == true) || !p.InPVS) { IconsGrid.Dispatcher.InvokeAsync(() => { var i = GetPlayerImage(p); i.Visibility = Visibility.Hidden; }); continue; } IconsGrid.Dispatcher.InvokeAsync(() => { var i = GetPlayerImage(p); Point displayPos = TranslateCoordinate(new Point(worldPos.X, worldPos.Y)); Thickness newMargin = i.Margin; newMargin.Top = displayPos.Y - 25; newMargin.Left = displayPos.X - 25; i.Margin = newMargin; { string existingSource = null; BitmapImage src = i.Source as BitmapImage; if (src != null) { existingSource = src.UriSource.AbsoluteUri; } string newSource = ClassIcons[t.Value][c.Value]; if (existingSource != newSource) { i.Source = new BitmapImage(new Uri(newSource)); } } i.Visibility = Visibility.Visible; }); } }
void Explosion(TFExplosion exp) { TF2Net.Data.Vector origin = new TF2Net.Data.Vector(exp.Origin); exp = null; IconsGrid.Dispatcher.InvokeAsync(() => { Viewbox vb = new Viewbox(); DoubleAnimation a; { System.Windows.Shapes.Path explosion = new System.Windows.Shapes.Path(); explosion.Data = (Geometry)FindResource("ExplosionPath"); explosion.Fill = Brushes.Orange; vb.Child = explosion; a = new DoubleAnimation(0, new Duration(TimeSpan.FromSeconds(0.75))); explosion.BeginAnimation(OpacityProperty, a); } vb.Width = 35; vb.Height = 35; Random r = new Random(); vb.RenderTransform = new RotateTransform(r.NextDouble() * 360, vb.Width / 2, vb.Height / 2); SetPosition(new Point(origin.X, origin.Y), vb); IconsGrid.Children.Add(vb); // Automatically remove the control new DispatcherTimer(a.Duration.TimeSpan + TimeSpan.FromSeconds(1), DispatcherPriority.Normal, (s, e) => IconsGrid.Children.Remove(vb), IconsGrid.Dispatcher); }); }
void UpdateRocketPositions(WorldState ws) { Dictionary <TFRocket, Image> newRockets = new Dictionary <TFRocket, Image>(); foreach (Entity e in ws.EntitiesInPVS) { if (e.Class.Classname != "CTFProjectile_Rocket") { continue; } TFRocket rocket = new TFRocket(e); TF2Net.Data.Vector position = rocket.Position.Value; if (position == null) { continue; } TF2Net.Data.Vector angle = rocket.Angle.Value; if (angle == null) { continue; } Team?team = rocket.Team.Value; if (team != Team.Red && team != Team.Blue) { continue; } Image elip; if (!m_OldRockets.TryGetValue(rocket, out elip)) { IconsGrid.Dispatcher.Invoke(() => { elip = new Image(); if (team.Value == Team.Red) { elip.Source = new BitmapImage(new Uri("pack://siteoforigin:,,,/images/projectiles/pill_red.png")); } else { elip.Source = new BitmapImage(new Uri("pack://siteoforigin:,,,/images/projectiles/pill_blue.png")); } elip.Width = 15; elip.Height = 15; elip.SetValue(RenderOptions.BitmapScalingModeProperty, BitmapScalingMode.HighQuality); elip.HorizontalAlignment = HorizontalAlignment.Left; elip.VerticalAlignment = VerticalAlignment.Top; RotateTransform rotate = new RotateTransform(angle.X); elip.RenderTransform = rotate; IconsGrid.Children.Add(elip); }); } else { m_OldRockets.Remove(rocket); } elip.Dispatcher.InvokeAsync(() => { Point adjusted = TranslateCoordinate(new Point(position.X, position.Y)); Thickness m = elip.Margin; m.Left = adjusted.X - 7.5; m.Top = adjusted.Y - 7.5; elip.Margin = m; }); newRockets.Add(rocket, elip); } foreach (var kvPair in m_OldRockets) { IconsGrid.Dispatcher.InvokeAsync(() => IconsGrid.Children.Remove(kvPair.Value)); } m_OldRockets = newRockets; }