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; } } } } } }
//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; } } } } } }
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); }