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