public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }
            if (Brush == null)
            {
                return;
            }
            if (Radius <= 0)
            {
                return;
            }

            var sc = coord.ToScreenCoordinate(true, true);

            var screenBorderPadding = Hud.Window.Size.Height * 0.01f;

            var radius = RadiusTransformator != null?RadiusTransformator.TransformRadius(Radius) : Radius;

            switch (Shape)
            {
            case GroundShape.X:
                if (Brush.StrokeStyle.DashStyle == SharpDX.Direct2D1.DashStyle.Solid)
                {
                    _shadowBrush.StrokeWidth = Brush.StrokeWidth >= 0 ? Brush.StrokeWidth + 1 : Brush.StrokeWidth - 1;
                    _shadowBrush.DrawWorldPlus(radius, coord.X, coord.Y, coord.Z);
                }
                Brush.DrawWorldPlus(radius, coord.X, coord.Y, coord.Z);
                break;
            }
        }
예제 #2
0
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }
            if (Brush == null)
            {
                return;
            }
            if (Radius <= 0)
            {
                return;
            }
            if (ShapePainter == null)
            {
                return;
            }

            float x, y, radius;

            CalculateCoordinateAndRadius(coord, out x, out y, out radius);

            ShapePainter.Paint(x, y, radius, Brush, ShadowBrush);
        }
예제 #3
0
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }

            var painter = Hud.GetPlugin <GroundLabelDecoratorPainterPlugin>();

            if (painter == null)
            {
                return;
            }

            if ((CountDownFrom != null) && (actor != null))
            {
                var remaining = CountDownFrom.Value - ((Hud.Game.CurrentGameTick - actor.CreatedAtInGameTick) / 60.0f);
                if (remaining < 0)
                {
                    remaining = 0;
                }

                var vf = (remaining > 1.0f) ? "F0" : "F1";
                text = remaining.ToString(vf, CultureInfo.InvariantCulture);
            }

            painter.EnqueLabelForPaint(this, coord, text);
        }
예제 #4
0
        /// <summary>
        /// Paints the decorator.
        /// </summary>
        /// <param name="coord">The coordinate of the texture.</param>
        /// <param name="text">Unused.</param>
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }

            if (SnoItem != null)
            {
                Texture = Hud.Texture.GetItemTexture(SnoItem);
            }

            if (Texture == null)
            {
                return;
            }
            if (Radius <= 0)
            {
                return;
            }
            CalculateCoordinateAndRadius(coord, out float mapX, out float mapY, out float radius);

            var width  = Texture.Width * radius;
            var height = Texture.Height * radius;

            Texture.Draw(mapX - width / 2, mapY - height / 2, width, height);
        }
예제 #5
0
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }
            if (LabelFont == null)
            {
                return;
            }
            if (string.IsNullOrEmpty(text))
            {
                return;
            }

            float mapx, mapy;

            Hud.Render.GetMinimapCoordinates(coord.X, coord.Y, out mapx, out mapy);

            var layout = LabelFont.GetTextLayout(text);

            if (!Up)
            {
                LabelFont.DrawText(layout, mapx - layout.Metrics.Width / 2, mapy + RadiusOffset);
            }
            else
            {
                LabelFont.DrawText(layout, mapx - layout.Metrics.Width / 2, mapy - RadiusOffset - layout.Metrics.Height);
            }
        }
예제 #6
0
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }
            if (Brush == null)
            {
                return;
            }
            if (Radius <= 0)
            {
                return;
            }
            if (ShapePainter == null)
            {
                return;
            }

            var radius = RadiusTransformator != null?RadiusTransformator.TransformRadius(Radius) : Radius;

            var rotation = RotationTransformator != null?RotationTransformator.TransformRotation(Rotation) : Rotation;

            ShapePainter.Paint(coord.X, coord.Y, coord.Z, radius, rotation, Brush, ShadowBrush);
        }
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }
            if (!IsEnabledFunc.Invoke())
            {
                return;
            }
            if (Brush == null)
            {
                return;
            }
            if (Radius <= 0)
            {
                return;
            }

            var missingPercent = FilledPercentFunc == null
                ? 0f
                : (100f - FilledPercentFunc.Invoke()) / 100f;

            coord = actor == null
                ? coord
                : actor.FloorCoordinate;

            var sectionsCounts = SectionsCountFunc.Invoke(this);

            Draw(coord, StartAngle, EndAngle, sectionsCounts, missingPercent, BackgroundBrush, Brush);
        }
예제 #8
0
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }
            if (actor == null)
            {
                return;
            }

            var rad     = Radius / 1200.0f * Hud.Window.Size.Height;
            var max     = CountDownFrom;
            var elapsed = (Hud.Game.CurrentGameTick - actor.CreatedAtInGameTick) / 60.0f;

            if (elapsed > max)
            {
                elapsed = max;
            }

            var screenCoord = coord.ToScreenCoordinate();
            var startAngle  = Convert.ToInt32(360 / max * elapsed) - 90;
            var endAngle    = 360 - 90;

            using (var pg = Hud.Render.CreateGeometry())
            {
                using (var gs = pg.Open())
                {
                    gs.BeginFigure(new Vector2(screenCoord.X, screenCoord.Y), FigureBegin.Filled);
                    for (int angle = startAngle; angle <= endAngle; angle++)
                    {
                        var mx     = rad * (float)Math.Cos(angle * Math.PI / 180.0f);
                        var my     = rad * (float)Math.Sin(angle * Math.PI / 180.0f);
                        var vector = new Vector2(screenCoord.X + mx, screenCoord.Y + my);
                        gs.AddLine(vector);
                    }
                    gs.EndFigure(FigureEnd.Closed);
                    gs.Close();
                }
                BackgroundBrushFill.DrawGeometry(pg);
            }

            using (var pg = Hud.Render.CreateGeometry())
            {
                using (var gs = pg.Open())
                {
                    gs.BeginFigure(new Vector2(screenCoord.X, screenCoord.Y), FigureBegin.Filled);
                    for (int angle = endAngle; angle <= startAngle + 360; angle++)
                    {
                        var mx     = rad * (float)Math.Cos(angle * Math.PI / 180.0f);
                        var my     = rad * (float)Math.Sin(angle * Math.PI / 180.0f);
                        var vector = new Vector2(screenCoord.X + mx, screenCoord.Y + my);
                        gs.AddLine(vector);
                    }
                    gs.EndFigure(FigureEnd.Closed);
                    gs.Close();
                }
                BackgroundBrushEmpty.DrawGeometry(pg);
            }
        }
예제 #9
0
 public int monsterDensityAroundCursor(float distance)
 {
     if (!Hud.Game.Me.IsInTown)
     {
         IScreenCoordinate coord = Hud.Game.Me.FloorCoordinate.ToScreenCoordinate(); //Hud.Render.GetCursorPos();
         coord.X = Hud.Window.CursorX;
         coord.Y = Hud.Window.CursorY;
         IWorldCoordinate cursor = coord.ToWorldCoordinate();
         int count = 0;
         foreach (IMonster monster in Hud.Game.AliveMonsters)
         {
             if (monster.FloorCoordinate.XYDistanceTo(cursor) < distance)
             {
                 count++;
             }
         }
         if (drawCursorCircle)
         {
             cursorBrush.DrawWorldEllipse(distance, -1, cursor);
         }
         if (drawCursorLabel)
         {
             cursorDecorator.Paint(Hud.Window.CursorX - 10, Hud.Window.CursorY + 30, 50, 20, count.ToString(), null, "");
         }
         return(count);
     }
     return(0);
 }
예제 #10
0
 public DAV_WayPointSno(int act, uint areaSno, uint worldId, IWorldCoordinate mapCoord)
 {
     Act             = act;
     AreaSno         = areaSno;
     WorldId         = worldId;
     FloorCoordinate = mapCoord;
 }
        /// <summary>
        /// Paints the decorator.
        /// </summary>
        /// <param name="coord">The coordinate of the texture.</param>
        /// <param name="text">Unused.</param>
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled || Radius <= 0)
            {
                return;
            }

            if (Texture == null)
            {
                if (SnoItem != null)
                {
                    Texture = Hud.Texture.GetItemTexture(SnoItem);
                }

                if (Texture == null)
                {
                    return;
                }
            }

            CalculateCoordinateAndRadius(coord, out var mapX, out var mapY, out var radius);

            var width  = Texture.Width * radius;
            var height = Texture.Height * radius;

            Texture.Draw(mapX - (width / 2), mapY - (height / 2), width, height, OpacityMultiplier);
        }
        private static List <Vector2> ArcVectors(float radius, IWorldCoordinate coord, float start, float end, int sectionsCount)
        {
            var angleStep = (end - start) / sectionsCount;
            var vectors   = new List <Vector2>();

            for (var angle = start; angle <= end; angle += angleStep)
            {
                if (angle + angleStep > end) //if it's the last step, round the end
                {
                    angle = end;
                }

                //convert to radiant for ease of use, and set top == 0f, counter clockwise up to 360.
                var radians = (angle - 135f) * Math.PI / 180.0f;
                var cos     = (float)Math.Cos(radians);
                var sin     = (float)Math.Sin(radians);

                var mx = radius * cos;
                var my = radius * sin;

                var vector = coord.ToVector2(mx, my, 0);
                vectors.Add(vector);
            }

            return(vectors);
        }
        private IWorldCoordinate PointOnLine(IWorldCoordinate s, IWorldCoordinate t, float yards)
        {
            float distance = (float)Math.Sqrt(Math.Pow((t.X - s.X), 2) + Math.Pow((t.Y - s.Y), 2));
            float ratio    = yards / distance;

            float x3 = ratio * t.X + (1 - ratio) * s.X;
            float y3 = ratio * t.Y + (1 - ratio) * s.Y;

            return(Hud.Window.CreateWorldCoordinate(x3, y3, Hud.Game.Me.FloorCoordinate.Z));
        }
        public void CalculateCoordinateAndRadius(IWorldCoordinate coord, out float mapX, out float mapY, out float radius)
        {
            Hud.Render.GetMinimapCoordinates(coord.X, coord.Y, out mapX, out mapY);

            radius = Radius * Hud.Render.MinimapScale;

            if (RadiusTransformator != null)
            {
                radius = RadiusTransformator.TransformRadius(radius);
            }
        }
예제 #15
0
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled || Brush == null || Radius <= 0 || ShapePainter == null)
            {
                return;
            }

            CalculateCoordinateAndRadius(coord, out var x, out var y, out var radius);

            ShapePainter.Paint(x, y, radius, Brush, ShadowBrush);
        }
        public static void DrawWorldCirclePartial(this IBrush brush,
                                                  float radius, int sectionsCount, float stroke,
                                                  IWorldCoordinate coord,
                                                  float startAngle, float endAngle,
                                                  CapStyle endCapStyle = CapStyle.Flat, CapStyle startCapStyle = CapStyle.Flat,
                                                  float missingPercent = 0, IBrush bgBrush = null)
        {
            var fullAngleRange = endAngle - startAngle;
            var halfRange      = fullAngleRange / 2f;
            var halfStroke     = stroke / 2f;

            var start = Math.Max(startAngle, startAngle + halfRange * missingPercent);
            var end   = Math.Min(endAngle, endAngle - halfRange * missingPercent);

            if (start > end || start < 0 || end < 0 || start > 360)
            {
                return;
            }

            using (var pg = Hud.Render.CreateGeometry())
            {
                using (var gs = pg.Open())
                {
                    var outerVectors = ArcVectors(radius + halfStroke, coord, start, end, sectionsCount);
                    var innerVectors = ArcVectors(radius - halfStroke, coord, start, end, sectionsCount);

                    gs.BeginFigure(outerVectors.First(), FigureBegin.Filled);
                    foreach (var v in outerVectors.Skip(1))
                    {
                        gs.AddLine(v);
                    }

                    //TODO: if rounded cap, add half circle
                    innerVectors.Reverse();
                    foreach (var v in innerVectors)
                    {
                        gs.AddLine(v);
                    }
                    //TODO: if rounded cap, add half circle

                    gs.EndFigure(FigureEnd.Closed);
                    gs.Close();

                    if (bgBrush != null)
                    {
                        bgBrush.DrawGeometry(pg);
                    }

                    brush.DrawGeometry(pg);
                }
            }
        }
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }
            if (actor == null)
            {
                return;
            }

            SoundAlertManagerPlugin.Register <T>(actor, SoundAlert);
        }
 public void Paint(WorldLayer layer, IActor actor, IWorldCoordinate coord, string text)
 {
     if (!Enabled)
     {
         return;
     }
     foreach (var decorator in Decorators)
     {
         if (decorator.Enabled && (decorator.Layer == layer))
         {
             decorator.Paint(actor, coord, text);
         }
     }
 }
예제 #19
0
 public void PaintWorld(WorldLayer layer)
 {
     if (!Hud.Game.Me.IsInTown)
     {
         IScreenCoordinate coord  = Hud.Window.CreateScreenCoordinate(Hud.Window.CursorX, Hud.Window.CursorY);
         IWorldCoordinate  cursor = coord.ToWorldCoordinate();
         int count = 0;
         foreach (IMonster monster in Hud.Game.AliveMonsters)
         {
             if (monster.FloorCoordinate.XYDistanceTo(cursor) < Distance)
             {
                 count++;
             }
         }
         if (DrawCursorCircle)
         {
             CursorCircleBrush.DrawWorldEllipse(Distance, -1, cursor);
         }
         if (DrawCursorLabel)
         {
             float width  = Hud.Window.Size.Height * CursorLabelWRatio;
             float height = Hud.Window.Size.Height * CursorLabelHRatio;
             CursorLabelDecorator.Paint(coord.X + CursorLabelXOffset, coord.Y + CursorLabelYOffset, width, height, count.ToString(), null, "");
         }
         if (DrawTopLabel)
         {
             float x      = Hud.Window.Size.Width * TopLabelXRatio;
             float y      = Hud.Window.Size.Height * TopLabelYRatio;
             float width  = Hud.Window.Size.Height * TopLabelWRatio;
             float height = Hud.Window.Size.Height * TopLabelHRatio;
             TopLabelDecorator.Paint(x - width / 2, y, width, height, count.ToString(), null, "");
         }
         if (DrawCursorLine)
         {
             var player = Hud.Game.Me.ScreenCoordinate;
             LineBrush.DrawLine(player.X, player.Y, coord.X, coord.Y);
         }
         if (DrawDistanceLabel)
         {
             var   distance = Hud.Game.Me.FloorCoordinate.XYDistanceTo(cursor);
             float x        = Hud.Window.Size.Width * DistanceLabelXRatio;
             float y        = Hud.Window.Size.Height * DistanceLabelYRatio;
             float width    = Hud.Window.Size.Height * DistanceLabelWRatio;
             float height   = Hud.Window.Size.Height * DistanceLabelHRatio;
             TopLabelDecorator.Paint(x - width / 2, y, width, height, distance.ToString("F1", CultureInfo.InvariantCulture));
         }
     }
 }
예제 #20
0
 public int monsterDensityAroundPlayer(float distance)
 {
     if (!Hud.Game.Me.IsInTown)
     {
         IWorldCoordinate me = Hud.Game.Me.FloorCoordinate;
         int count           = 0;
         foreach (IMonster monster in Hud.Game.AliveMonsters)
         {
             if (monster.FloorCoordinate.XYDistanceTo(me) < distance)
             {
                 count++;
             }
         }
         return(count);
     }
     return(0);
 }
        private void DrawTargetLine(IWorldCoordinate awc, IWorldCoordinate twc, IMonster m, IMonster target)
        {
            IBrush cBrush = GreyBrush;

            if (m != null && target != null)
            {
                if (m.AnnId == target.AnnId)
                {
                    cBrush = GreenBrush;
                }
                else
                {
                    cBrush = RedBrush;
                    RedHitBoxDecorator.Paint(_layer, m, m.FloorCoordinate, string.Empty);
                }
            }
            cBrush.DrawLineWorld(awc, PointOnLine(awc, twc, HitYards), 4f);
        }
        private IWorldCoordinate[] PointOnOrthogonal(IWorldCoordinate swc, IWorldCoordinate twc, float offset)
        {
            float m     = (twc.Y - swc.Y) / (twc.X - swc.X);
            float orthm = -1 * (1 / m);
            float yoff  = twc.Y - orthm * twc.X;

            float x3 = (float)((twc.X * Math.Pow(orthm, 2) + twc.X - Math.Sqrt(Math.Pow(offset, 2) * Math.Pow(orthm, 2) + Math.Pow(offset, 2))) / (Math.Pow(orthm, 2) + 1));
            float x4 = (float)((twc.X * Math.Pow(orthm, 2) + twc.X + Math.Sqrt(Math.Pow(offset, 2) * Math.Pow(orthm, 2) + Math.Pow(offset, 2))) / (Math.Pow(orthm, 2) + 1));
            float y3 = orthm * x3 + yoff;
            float y4 = orthm * x4 + yoff;

            IWorldCoordinate[] x =
            {
                Hud.Window.CreateWorldCoordinate(x3, y3, Hud.Game.Me.FloorCoordinate.Z),
                Hud.Window.CreateWorldCoordinate(x4, y4, Hud.Game.Me.FloorCoordinate.Z)
            };
            return(x);
        }
        public void DrawSplit(IWorldCoordinate pwc, IWorldCoordinate mwc, IWorldCoordinate awc, IMonster target, List <IMonster> obstacles)
        {
            //get middle impale
            IWorldCoordinate middlewc = PointOnLine(awc, mwc, AdjacentYards);

            //get left and right impales
            IWorldCoordinate[] lr = PointOnOrthogonal(awc, middlewc, OppositeYards);

            //sort obstacles by distance
            if (target != null)
            {
                obstacles.Add(target);
            }
            if (obstacles.Any())
            {
                obstacles.Sort((x, y) => x.NormalizedXyDistanceToMe.CompareTo(y.NormalizedXyDistanceToMe));
            }

            //get first target for each impale projectile
            float    distance = (target != null) ? (float)target.NormalizedXyDistanceToMe + 2 * target.RadiusBottom : 0;
            IMonster tm       = FirstTarget(pwc, middlewc, obstacles, distance);
            IMonster tlr0     = FirstTarget(pwc, lr[0], obstacles, distance);
            IMonster tlr1     = FirstTarget(pwc, lr[1], obstacles, distance);

            //draw targetline for each impale and for maintarge
            if (target != null)
            {
                BlueBrush.DrawLineWorld(awc, target.FloorCoordinate, 4f);
            }
            DrawTargetLine(awc, middlewc, tm, target);
            DrawTargetLine(awc, lr[0], tlr0, target);
            DrawTargetLine(awc, lr[1], tlr1, target);

            //draw target hitbox
            if (target != null && tm != null && tlr0 != null && tlr1 != null && target.AnnId == tm.AnnId && target.AnnId == tlr0.AnnId && target.AnnId == tlr1.AnnId)
            {
                GreenHitBoxDecorator.Paint(_layer, target, target.FloorCoordinate, string.Empty);
            }
            else if (target != null)
            {
                BlueHitBoxDecorator.Paint(_layer, target, target.FloorCoordinate, string.Empty);
            }
        }
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }
            if (ActiveBrush == null || InactiveBrush == null)
            {
                return;
            }

            var distance = actor.NormalizedXyDistanceToMe;

            if (distance <= HideRange)
            {
                return;
            }

            var monsterCoord = coord.ToScreenCoordinate();
            var myCoords     = Hud.Game.Me.ScreenCoordinate;

            //Draw line to actor
            var start = PointOnLine(myCoords.X, myCoords.Y, monsterCoord.X, monsterCoord.Y, OnLineStartOffset);
            var end   = PointOnLine(monsterCoord.X, monsterCoord.Y, myCoords.X, myCoords.Y, OnLineEndOffset);

            if (distance < ActiveRange)
            {
                ActiveBrush.DrawLine(start.X, start.Y, end.X, end.Y, ActiveStrokeWidth);
            }
            else
            {
                InactiveBrush.DrawLine(start.X, start.Y, end.X, end.Y, InactiveStrokeWidth);
            }

            if (ShowText) //Draw text
            {
                var layout = TextFont.GetTextLayout(string.Format("{0:N0}", distance));
                var p      = PointOnLine(myCoords.X, myCoords.Y, monsterCoord.X, monsterCoord.Y, TextOffset);
                TextFont.DrawText(layout, p.X, p.Y);
                //textDistanceAway += 30; // avoid text overlap
            }
        }
예제 #25
0
        internal void EnqueLabelForPaint(GroundLabelDecorator decorator, IWorldCoordinate coord, string text)
        {
            if (string.IsNullOrEmpty(text))
            {
                return;
            }

            if (!_registeredLabels.TryGetValue(coord, out var list))
            {
                list = new List <RegisteredLabel>();
                _registeredLabels.Add(coord, list);
            }

            list.Add(new RegisteredLabel()
            {
                Decorator = decorator,
                Coord     = coord,
                Text      = text
            });
        }
예제 #26
0
        public void Paint(IActor actor, IWorldCoordinate coord, string text)
        {
            if (!Enabled)
            {
                return;
            }
            if (Brush == null)
            {
                return;
            }

            var radius = Radius;

            if (radius == -1)
            {
                if (actor != null)
                {
                    radius = Math.Min(actor.RadiusBottom, 20);
                }
                else
                {
                    return;
                }
            }

            if (RadiusTransformator != null)
            {
                radius = RadiusTransformator.TransformRadius(radius);
            }

            if (HasShadow)
            {
                if (Brush.StrokeStyle.DashStyle == SharpDX.Direct2D1.DashStyle.Solid)
                {
                    _shadowBrush.StrokeWidth = Brush.StrokeWidth >= 0 ? Brush.StrokeWidth + 1 : Brush.StrokeWidth - 1;
                    _shadowBrush.DrawWorldEllipse(radius, -1, coord);
                }
            }

            Brush.DrawWorldEllipse(radius, -1, coord);
        }
        private IMonster FirstTarget(IWorldCoordinate s, IWorldCoordinate t, List <IMonster> obstacles, float distance)
        {
            IMonster         r = null;
            IWorldCoordinate c = null;

            foreach (IMonster m in obstacles)
            {
                float d = 0f;
                while (d <= distance)
                {
                    c = PointOnLine(s, t, d);
                    if (m.FloorCoordinate.XYDistanceTo(c) <= m.RadiusBottom)
                    {
                        r = m;
                        break;
                    }
                    d += 0.1f;
                }
            }
            return(r);
        }
        public void PaintWorld(WorldLayer layer)
        {
            //if (!IsNephalemRift || !IsGreaterRift || Hud.Game.Me.HeroClassDefinition.HeroClass != HeroClass.DemonHunter) return;
            if (Hud.Game.Me.HeroClassDefinition.HeroClass != HeroClass.DemonHunter)
            {
                return;
            }
            _layer = layer;

            //get player, mouse, animation-start coordinates
            IWorldCoordinate player = Hud.Game.Me.ScreenCoordinate.ToWorldCoordinate();
            IWorldCoordinate mouse  = Hud.Window.CreateScreenCoordinate(Hud.Window.CursorX, Hud.Window.CursorY).ToWorldCoordinate();
            IWorldCoordinate anim   = PointOnLine(player, mouse, AnimationYards);

            //get closest elite/boss target
            var elites = Hud.Game.AliveMonsters.Where(x => (x.Rarity == ActorRarity.Boss || x.Rarity == ActorRarity.Champion || x.Rarity == ActorRarity.Rare) &&
                                                      x.IsOnScreen &&
                                                      x.NormalizedXyDistanceToMe <= HitYards
                                                      ).ToList();

            elites.Sort((x, y) => x.NormalizedXyDistanceToMe.CompareTo(y.NormalizedXyDistanceToMe));
            var target = elites.FirstOrDefault();

            //no targets in area
            if (target == null || !target.FloorCoordinate.IsValid)
            {
                return;
            }

            //get all possible intercepting obstacles
            var trash = Hud.Game.AliveMonsters.Where(x => x.FloorCoordinate.IsValid &&
                                                     x.IsOnScreen &&
                                                     !(x.Rarity == ActorRarity.Boss || x.Rarity == ActorRarity.Champion || x.Rarity == ActorRarity.Rare) &&
                                                     x.NormalizedXyDistanceToMe <= target.NormalizedXyDistanceToMe &&
                                                     target.FloorCoordinate.XYDistanceTo(x.FloorCoordinate) <= target.NormalizedXyDistanceToMe
                                                     );

            //draw split
            DrawSplit(player, mouse, anim, target, trash.ToList());
        }
예제 #29
0
        public static Vector2 ToVector2(this IWorldCoordinate coords, float offsetWorldX = 0, float offsetWorldY = 0, float offsetWorldZ = 0, float translateX = 0, float translateY = 0)
        {
            offsetWorldX += coords.X;
            offsetWorldY += coords.Y;
            offsetWorldZ += coords.Z;

            var referer = Hud.Game.Me.FloorCoordinate;
            var xd      = offsetWorldX - referer.X;
            var yd      = offsetWorldY - referer.Y;
            var zd      = offsetWorldZ - referer.Z;

            var w = -0.515 * xd + -0.514 * yd + -0.686 * zd + 97.985;
            var X = (-1.682 * xd + 1.683 * yd + 0 * zd + 7.045e-3) / w;
            var Y = (-1.54 * xd + -1.539 * yd + 2.307 * zd + 6.161) / w;

            var aspectChange = coords.Window.Size.Width / (double)coords.Window.Size.Height / (4.0f / 3.0f); // 4:3 = default aspect ratio

            X /= aspectChange;

            var rX = (float)((X + 1) / 2 * coords.Window.Size.Width);
            var rY = (float)((1 - Y) / 2 * coords.Window.Size.Height);

            return(new Vector2(rX + translateX, rY + translateY));
        }
예제 #30
0
        public void PaintWorld(WorldLayer layer)
        {
            if (Hud.Game.IsInTown)
            {
                return;
            }

            IWorldCoordinate WizPosition = Hud.Game.Players.First().FloorCoordinate;
            int WizardsIngame            = 0;

            foreach (var player in Hud.Game.Players)
            {
                if (player.HeroClassDefinition.HeroClass == HeroClass.Wizard)
                {
                    WizPosition = player.FloorCoordinate;
                    WizardsIngame++;
                }
            }

            float mindist = float.MaxValue;
            var   actors  = Hud.Game.Actors.Where(x => x.SnoActor.Sno == ActorSnoEnum._generic_proxy && x.GetAttributeValueAsInt(Hud.Sno.Attributes.Power_Buff_1_Visual_Effect_None, Hud.Sno.SnoPowers.OculusRing.Sno) == 1);

            if (actors.Count() > 0)
            {
                var closest = actors.First();

                foreach (var actor in actors)
                {
                    float dist = actor.FloorCoordinate.XYDistanceTo(WizPosition);
                    if (dist < mindist)
                    {
                        closest = actor;
                        mindist = dist;
                    }
                }
                foreach (var actor in actors)
                {
                    if (WizardsIngame == 1)
                    {
                        if (actor == closest)
                        {
                            if (mindist < 13.3f)
                            {
                                DecoratorInside.Paint(layer, actor, actor.FloorCoordinate, null);
                            }
                            else
                            {
                                DecoratorClosest.Paint(layer, actor, actor.FloorCoordinate, null);
                            }
                        }
                        else
                        {
                            DecoratorBase.Paint(layer, actor, actor.FloorCoordinate, null);
                        }
                    }
                    else
                    {
                        DecoratorBase.Paint(layer, actor, actor.FloorCoordinate, null);
                    }
                }
            }
        }