コード例 #1
0
        public void UpdateNodes(TrinityGrid grid, Structures.Avoidance avoidance)
        {
            foreach (var actor in avoidance.Actors)
            {
                if (actor == null || !actor.IsValid)
                {
                    //Core.Logger.Log(LogCategory.Avoidance, $"<CircularAvoidanceHandler> actor is null or invalid for {avoidance.Definition.Name}");
                    continue;
                }

                var part = avoidance.Definition.GetPart(actor.ActorSnoId);
                if (part == null)
                {
                    continue;
                }

                var radius      = Math.Max(part.Radius, actor.Radius);
                var finalRadius = radius * avoidance.Settings.DistanceMultiplier;
                var nodes       = grid.GetNodesInRadius(actor.Position, finalRadius);

                if (avoidance.Settings.Prioritize)
                {
                    //Core.Logger.Log(LogCategory.Avoidance, $"<CircularAvoidanceHandler> marking {nodes.Count} nodes critical for actor {actor}, def={avoidance.Definition.Name}");
                    Core.DBGridProvider.AddCellWeightingObstacle(actor.ActorSnoId, finalRadius);
                    grid.FlagAvoidanceNodes(nodes, AvoidanceFlags.Avoidance | AvoidanceFlags.CriticalAvoidance,
                                            avoidance, 50);
                }
                else
                {
                    //Core.Logger.Log(LogCategory.Avoidance, $"<CircularAvoidanceHandler> marking {nodes.Count} nodes for actor {actor}, def={avoidance.Definition.Name}");
                    grid.FlagAvoidanceNodes(nodes, AvoidanceFlags.Avoidance, avoidance, 10);
                }
            }
        }
コード例 #2
0
        public void UpdateNodes(TrinityGrid grid, Structures.Avoidance avoidance)
        {
            foreach (var actor in avoidance.Actors)
            {
                if (actor == null)
                {
                    continue;
                }

                var part = avoidance.Definition.GetPart(actor.ActorSnoId);

                if (actor.IsDead || actor.CommonData == null || !actor.CommonData.IsValid || actor.CommonData.IsDisposed)
                {
                    Core.Logger.Verbose("Actor {0} CommonData Invalid ({1})", actor.InternalName, part.Name);
                    continue;
                }

                if (part.Type == PartType.VisualEffect)
                {
                    if (actor.Attributes.GetAttribute <bool>(part.Attribute, (int)part.Power))
                    {
                        Core.Logger.Log("Power {0} on {1} ({1}) in Attribute {2}", part.Power, actor.InternalName, part.Name, part.Attribute);
                        var nodes = grid.GetRayLineAsNodes(actor.Position, MathEx.GetPointAt(actor.Position, 30f, actor.Rotation)).SelectMany(n => n.AdjacentNodes).Distinct();
                        grid.FlagAvoidanceNodes(nodes, AvoidanceFlags.Avoidance, avoidance, 10);
                    }
                }
                else
                {
                    var obstacleNodes = grid.GetNodesInRadius(actor.Position, part.Radius);
                    grid.FlagAvoidanceNodes(obstacleNodes, AvoidanceFlags.NavigationBlocking, avoidance, 5);
                }
            }
        }
        public void UpdateNodes(TrinityGrid grid, Structures.Avoidance avoidance)
        {
            foreach (var actor in avoidance.Actors)
            {
                if (actor == null || !actor.IsValid)
                {
                    continue;
                }

                var part = avoidance.Definition.GetPart(actor.Animation);
                if (part == null)
                {
                    continue;
                }

                var radius      = Math.Max(part.Radius, actor.Radius);
                var finalRadius = radius * avoidance.Settings.DistanceMultiplier;
                var nodes       = grid.GetNodesInRadius(actor.Position, finalRadius);

                if (actor.Animation != part.Animation)
                {
                    continue;
                }

                if (avoidance.Settings.Prioritize)
                {
                    Core.DBGridProvider.AddCellWeightingObstacle(actor.ActorSnoId, finalRadius);
                    grid.FlagAvoidanceNodes(nodes, AvoidanceFlags.Avoidance | AvoidanceFlags.CriticalAvoidance, avoidance, 50);
                }
                else
                {
                    grid.FlagAvoidanceNodes(nodes, AvoidanceFlags.Avoidance, avoidance, 10);
                }
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        public void UpdateNodes(TrinityGrid grid, Structures.Avoidance avoidance)
        {
            CleanUpRotators();

            foreach (var actor in avoidance.Actors)
            {
                if (actor == null || !actor.IsValid || actor.IsDead || actor.CommonData == null || actor.CommonData.IsDisposed)
                {
                    continue;
                }

                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, 6f);
                    var radAngle    = MathUtil.ToRadians(rotator.Angle);
                    var nodes       = grid.GetRayLineAsNodes(actor.Position, MathEx.GetPointAt(actor.Position, 26f, 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, 26f, futureRadAngle)).SelectMany(n => n.AdjacentNodes));
                    nodes.AddRange(centerNodes);
                    nodes = nodes.Distinct().ToList();
                    grid.FlagAvoidanceNodes(nodes, AvoidanceFlags.Avoidance, avoidance, 30);
                }
                else
                {
                    var telegraphNodes = grid.GetNodesInRadius(actor.Position, 10f);
                    grid.FlagAvoidanceNodes(telegraphNodes, AvoidanceFlags.Avoidance, avoidance, 10);
                }
            }
        }
コード例 #6
0
        public override bool UpdateNodes(TrinityGrid grid, Structures.Avoidance avoidance)
        {
            var actor = Core.Actors.RactorByRactorId <TrinityActor>(avoidance.RActorId);

            if (actor == null || !actor.IsValid || actor.IsDead)
            {
                return(false);
            }

            var part = avoidance.Definition.GetPart(actor.ActorSnoId);

            if (part == null)
            {
                return(false);
            }

            if (part.Type == PartType.VisualEffect)
            {
                if (actor.Attributes.GetAttribute <bool>(part.Attribute, (int)part.Power))
                {
                    Core.Logger.Log("Power {0} on {1} ({1}) in Attribute {2}", part.Power, actor.InternalName, part.Name, part.Attribute);
                    var nodes = grid.GetRayLineAsNodes(actor.Position, MathEx.GetPointAt(actor.Position, 30f, actor.Rotation)).SelectMany(n => n.AdjacentNodes).Distinct();

                    HandleNavigationGrid(grid, nodes, avoidance, actor, 0f);
                    return(true);
                }
            }
            else
            {
                var obstacleNodes = grid.GetNodesInRadius(actor.Position, part.Radius);

                const int weightOverride = 5;
                HandleNavigationGrid(AvoidanceFlags.NavigationBlocking, grid, obstacleNodes, avoidance, actor, 0f, weightOverride);
                return(true);
            }

            return(false);
        }
コード例 #7
0
        public override bool UpdateNodes(TrinityGrid grid, Structures.Avoidance avoidance)
        {
            var actor = Core.Actors.RactorByRactorId <TrinityActor>(avoidance.RActorId);

            if (actor == null || !actor.IsValid)
            {
                return(false);
            }

            var part = avoidance.Definition.GetPart(actor.ActorSnoId);

            if (part == null)
            {
                return(false);
            }

            var radius      = Math.Max(part.Radius, actor.Radius);
            var finalRadius = radius * avoidance.Settings.DistanceMultiplier;
            var nodes       = grid.GetNodesInRadius(actor.Position, finalRadius);

            HandleNavigationGrid(grid, nodes, avoidance, actor, finalRadius);
            return(true);
        }