Пример #1
0
    protected Amplitude.Unity.Game.Orders.Order FollowPath(ArmyWithTask army, WorldPath path)
    {
        if (path == null || !path.IsValid)
        {
            return(null);
        }
        int num = -1;

        for (int i = 0; i < path.WorldPositions.Length; i++)
        {
            if (path.WorldPositions[i] == army.Garrison.WorldPosition)
            {
                num = i;
                break;
            }
        }
        if (num == path.Length - 1)
        {
            return(null);
        }
        if (num == -1)
        {
            return(null);
        }
        IPathfindingContextProvider pathfindingContextProvider = army.Garrison as IPathfindingContextProvider;

        if (pathfindingContextProvider == null)
        {
            return(null);
        }
        IGameService service = Services.GetService <IGameService>();

        Diagnostics.Assert(service != null);
        IPathfindingService service2 = service.Game.Services.GetService <IPathfindingService>();

        Diagnostics.Assert(service2 != null);
        WorldPosition worldPosition = WorldPosition.Invalid;
        int           num2          = 0;

        for (int j = num + 1; j < path.WorldPositions.Length; j++)
        {
            if (service2.IsTilePassable(path.WorldPositions[j], pathfindingContextProvider, (PathfindingFlags)0, null) && service2.IsTileStopable(path.WorldPositions[j], pathfindingContextProvider, (PathfindingFlags)0, null))
            {
                worldPosition = path.WorldPositions[j];
                num2++;
                if (num2 >= 2)
                {
                    break;
                }
            }
        }
        if (worldPosition == WorldPosition.Invalid)
        {
            return(null);
        }
        return(new OrderGoTo(army.Garrison.Empire.Index, army.Garrison.GUID, worldPosition)
        {
            Flags = (PathfindingFlags)0
        });
    }
Пример #2
0
    protected WorldPath ComputePathToPosition(ArmyWithTask army, WorldPosition targetPosition, WorldPath currentPath)
    {
        if (currentPath != null && currentPath.Destination == targetPosition && currentPath.Origin == army.Garrison.WorldPosition)
        {
            for (int i = 0; i < currentPath.WorldPositions.Length; i++)
            {
                if (currentPath.WorldPositions[i] == army.Garrison.WorldPosition)
                {
                    return(currentPath);
                }
            }
        }
        IPathfindingContextProvider pathfindingContextProvider = army.Garrison as IPathfindingContextProvider;

        if (pathfindingContextProvider == null)
        {
            return(null);
        }
        PathfindingContext pathfindingContext = pathfindingContextProvider.GenerateContext();

        pathfindingContext.Greedy = true;
        WorldPosition     worldPosition     = army.Garrison.WorldPosition;
        PathfindingResult pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, worldPosition, targetPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreFogOfWar, null);

        if (pathfindingResult == null)
        {
            return(null);
        }
        WorldPath worldPath = new WorldPath();

        worldPath.Build(pathfindingResult, army.Garrison.GetPropertyValue(SimulationProperties.MovementRatio), 1, false);
        return(worldPath);
    }