public void PathingThreadAction(PathingContext context)
        {
            foreach (var colony in ServerManager.ColonyTracker.ColoniesByID.Values)
            {
                List <IPandaZombie> canSpawn = PandaZombies.Where(p => p.MinColonists < colony.FollowerCount).ToList();

                if (canSpawn.Count > 0 && colony.DifficultySetting.ShouldSpawnZombies(colony))
                {
                    var bannerGoal = colony?.Banners?.FirstOrDefault();

                    if (bannerGoal == null)
                    {
                        continue;
                    }

                    var cs = ColonyState.GetColonyState(colony);

                    if (cs.ColonyRef.OwnerIsOnline())
                    {
                        Vector3Int positionFinal;
                        var        max = Math.RoundToInt(colony.FollowerCount / 100) + 1;

                        if (max == 0)
                        {
                            max = 1;
                        }

                        for (int i = 0; i < max; i++)
                        {
                            var zombie = canSpawn.GetRandomItem();

                            switch (((MonsterSpawner)MonsterTracker.MonsterSpawner).TryGetSpawnLocation(context, bannerGoal.Position, bannerGoal.SafeRadius, 200, 500f, out positionFinal))
                            {
                            case MonsterSpawner.ESpawnResult.Success:
                                if (context.Pathing.TryFindPath(ref context, positionFinal, bannerGoal.Position, out var path, 2000000000) == EPathFindingResult.Success)
                                {
                                    _spawnQueue.Enqueue(zombie.GetNewInstance(path, colony));
                                }

                                break;

                            case MonsterSpawner.ESpawnResult.NotLoaded:
                            case MonsterSpawner.ESpawnResult.Impossible:
                                colony.OnZombieSpawn(true);
                                break;

                            case MonsterSpawner.ESpawnResult.Fail:
                                colony.OnZombieSpawn(false);
                                break;
                            }
                        }
                    }
                }
            }
        }
Exemple #2
0
 //public static bool IsCornerTouchAllowed(int cornerX, int cornerZ, int adjCardinal1X, int adjCardinal1Z, int adjCardinal2X, int adjCardinal2Z, PathingContext pc)
 public static void Postfix(ref bool __result, int cornerX, int cornerZ, PathingContext pc)
 {
     if (!__result)
     {
         foreach (Thing thing in pc.map.thingGrid.ThingsListAtFast(new IntVec3(cornerX, 0, cornerZ)))
         {
             if (thing is Blueprint || thing is Frame && TouchPathEndModeUtility.MakesOccupiedCellsAlwaysReachableDiagonally(thing.def))
             {
                 __result = true;
                 return;
             }
         }
     }
 }
        public void PathingThreadAction(PathingContext context)
        {
            if (BossActive)
            {
                foreach (var colony in ServerManager.ColonyTracker.ColoniesByID.Values)
                {
                    var bannerGoal = colony.Banners.FirstOrDefault();

                    if (bannerGoal == null)
                    {
                        continue;
                    }

                    var cs = ColonyState.GetColonyState(colony);

                    if (cs.BossesEnabled &&
                        cs.ColonyRef.OwnerIsOnline() &&
                        colony.FollowerCount > CurrentPandaBoss.MinColonists)
                    {
                        if (CurrentPandaBoss != null && !SpawnedBosses.ContainsKey(cs))
                        {
                            Vector3Int positionFinal;
                            switch (((MonsterSpawner)MonsterTracker.MonsterSpawner).TryGetSpawnLocation(context, bannerGoal.Position, bannerGoal.SafeRadius, 200, 500f, out positionFinal))
                            {
                            case MonsterSpawner.ESpawnResult.Success:
                                if (context.Pathing.TryFindPath(positionFinal, bannerGoal.Position, out var path, 2000000000) == EPathFindingResult.Success)
                                {
                                    var pandaboss = (IPandaBoss)CurrentPandaBoss.GetNewInstance(path, colony);
                                    _pandaBossesSpawnQueue.Enqueue(pandaboss);
                                    SpawnedBosses.Add(cs, pandaboss);
                                }

                                break;

                            case MonsterSpawner.ESpawnResult.NotLoaded:
                            case MonsterSpawner.ESpawnResult.Impossible:
                                colony.OnZombieSpawn(true);
                                break;

                            case MonsterSpawner.ESpawnResult.Fail:
                                CantSpawnBoss(cs);
                                break;
                            }
                        }
                    }
                }
            }
        }
Exemple #4
0
        public static bool Prefix(ref bool __result, int cornerX, int cornerZ, PathingContext pc)
        {
            if (!Settings.Get().ReplaceStuff_CornerBuildable)
            {
                return(true);
            }

            //public static bool IsCornerTouchAllowed(int cornerX, int cornerZ, int adjCardinal1X, int adjCardinal1Z, int adjCardinal2X, int adjCardinal2Z, Map map)
            if (pc.map.thingGrid.ThingsAt(new IntVec3(cornerX, 0, cornerZ))
                .Any(t => TouchPathEndModeUtility.MakesOccupiedCellsAlwaysReachableDiagonally(t.def)))
            {
                __result = true;
                return(false);
            }
            return(true);
        }