コード例 #1
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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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));
        }