public override bool UpdateNodes(TrinityGrid grid, Structures.Avoidance avoidance) { var actor = Core.Actors.RactorByRactorId <TrinityActor>(avoidance.RActorId); if (actor == null || !actor.IsValid) { return(false); } CleanUpRotators(); var part = avoidance.Definition.GetPart(actor.ActorSnoId); if (part?.MovementType == MovementType.Rotation) { Rotator rotator; if (!_rotators.TryGetValue(actor.RActorId, out rotator)) { rotator = CreateNewRotator(actor); _rotators.Add(actor.RActorId, rotator); Task.FromResult(rotator.Rotate()); } var centerNodes = grid.GetNodesInRadius(actor.Position, 8f); var radAngle = MathUtil.ToRadians(rotator.Angle); var nodes = grid.GetRayLineAsNodes(actor.Position, MathEx.GetPointAt(actor.Position, 28f, radAngle)).SelectMany(n => n.AdjacentNodes).ToList(); var futureRadAngle = MathUtil.ToRadians((float)rotator.GetFutureAngle(TimeSpan.FromMilliseconds(500))); nodes.AddRange(grid.GetRayLineAsNodes(actor.Position, MathEx.GetPointAt(actor.Position, 28f, futureRadAngle)).SelectMany(n => n.AdjacentNodes)); nodes.AddRange(centerNodes); nodes = nodes.Distinct().ToList(); const int defaultWeightModification = 32; HandleNavigationGrid(grid, nodes, avoidance, actor, 0f, defaultWeightModification); } else { var telegraphNodes = grid.GetNodesInRadius(actor.Position, 12f); const int defaultWeightModification = 12; HandleNavigationGrid(grid, telegraphNodes, avoidance, actor, 0f, defaultWeightModification); } Core.DBGridProvider.AddCellWeightingObstacle(actor.RActorId, ObstacleFactory.FromActor(actor)); return(true); }
public bool UpdateNodes(TrinityGrid grid, Structures.Avoidance avoidance) { var actor = Core.Actors.RactorByRactorId <TrinityActor>(avoidance.RActorId); if (actor == null || !actor.IsValid) { return(false); } var fireChainFriendList = Core.Avoidance.CurrentAvoidances.Where(c => c != avoidance && c.ActorSno == avoidance.ActorSno) .ToList(); var appliedAvoidanceNode = false; foreach (var fireChainFriend in fireChainFriendList) { var friend = Core.Actors.RactorByRactorId <TrinityActor>(fireChainFriend.RActorId); if (friend == null || !friend.IsValid) { continue; } var nodes = grid.GetRayLineAsNodes(actor.Position, friend.Position).SelectMany(n => n.AdjacentNodes); AvoidanceFlags flags = AvoidanceFlags.Avoidance; int weightModification = BaseAvoidanceHandler.DefaultWeightModification; if (avoidance.Settings.Prioritize) { flags |= AvoidanceFlags.CriticalAvoidance; weightModification = BaseAvoidanceHandler.CriticalWeightModification; } grid.FlagAvoidanceNodes(nodes, flags, avoidance, weightModification); appliedAvoidanceNode = true; } if (appliedAvoidanceNode) { Core.DBGridProvider.AddCellWeightingObstacle(actor.RActorId, ObstacleFactory.FromActor(actor)); return(true); } return(false); }
protected void HandleNavigationGrid(AvoidanceFlags defaultFlags, TrinityGrid grid, IEnumerable <AvoidanceNode> nodes, Structures.Avoidance avoidance, TrinityActor actor, float radius, int normalWeightModificationOverride = 0) { AvoidanceFlags flags = defaultFlags; int weightModification = DefaultWeightModification; if (normalWeightModificationOverride != 0) { weightModification = normalWeightModificationOverride; } if (avoidance.Settings.Prioritize) { weightModification = CriticalWeightModification; flags |= AvoidanceFlags.CriticalAvoidance; } grid.FlagAvoidanceNodes(nodes, flags, avoidance, weightModification); Core.DBGridProvider.AddCellWeightingObstacle(actor.RActorId, ObstacleFactory.FromActor(actor, radius)); }