Ejemplo n.º 1
0
        internal static Vector3 SimpleUnstucker()
        {
            var   myPos    = Trinity.Player.Position;
            float rotation = Trinity.Player.Rotation;

            const double totalPoints = 2 * Math.PI;
            const double start       = 0;
            const double step        = Math.PI / 4;

            const float minDistance  = 10f;
            const float maxDistance  = 25f;
            const float stepDistance = 5f;

            HashSet <GridPoint> gridPoints = new HashSet <GridPoint>();

            int navigationObstacleFail = 0;

            for (double r = start; r <= totalPoints; r += step)
            {
                for (float d = minDistance; d <= maxDistance; d += stepDistance)
                {
                    float   newDirection = (float)(rotation + r);
                    Vector3 newPos       = MathEx.GetPointAt(myPos, d, newDirection);

                    if (!MainGridProvider.CanStandAt(MainGridProvider.WorldToGrid(newPos.ToVector2())))
                    {
                        continue;
                    }

                    // If this hits a known navigation obstacle, skip it
                    if (CacheData.NavigationObstacles.Any(o => MathEx.IntersectsPath(o.Position, o.Radius, myPos, newPos)))
                    {
                        navigationObstacleFail++;
                        continue;
                    }

                    // use distance as weight
                    gridPoints.Add(new GridPoint(newPos, (int)d, d));
                }
            }

            if (!gridPoints.Any())
            {
                Logger.LogDebug(LogCategory.UserInformation, "Unable to generate new unstucker position! navObsticle={0} - trying RANDOM point!", navigationObstacleFail);

                Random random    = new Random();
                int    distance  = random.Next(5, 30);
                float  direction = (float)random.NextDouble();

                return(MathEx.GetPointAt(myPos, distance, direction));
            }
            Navigator.Clear();

            var bestPoint = gridPoints.OrderByDescending(p => p.Weight).FirstOrDefault();

            Logger.LogDebug(LogCategory.UserInformation, "Generated Unstuck position {0} distance={1:0.0} navObsticle={2}",
                            NavHelper.PrettyPrintVector3(bestPoint.Position), bestPoint.Distance, navigationObstacleFail);
            return(bestPoint.Position);
        }
Ejemplo n.º 2
0
 public override string ToString()
 {
     return
         (String.Format("power={0} pos={1} acdGuid={2} preWait={3} postWait={4} timeSinceAssigned={5} timeSinceUse={6} range={7}",
                        SNOPower,
                        NavHelper.PrettyPrintVector3(TargetPosition),
                        TargetACDGUID,
                        WaitTicksBeforeUse,
                        WaitTicksAfterUse,
                        TimeSinceAssigned,
                        TimeSinceUse,
                        MinimumRange));
 }