private bool PrivateIsTileInRangeOfSprinklers(IEnumerable <SObject> sprinklers, GameLocation location, Vector2 tileLocation, bool isForAllSprinklers) { var sprinklersList = sprinklers.ToList(); foreach (var sprinkler in sprinklersList) { if (!sprinkler.IsSprinkler()) { continue; } var info = GetSprinklerInfo(sprinkler); var manhattanDistance = ((int)tileLocation.X - (int)sprinkler.TileLocation.X) + ((int)tileLocation.Y - (int)sprinkler.TileLocation.Y); if (manhattanDistance > GetFloodFillSprinklerRange(info.Power)) { if (SprinklerBehavior is not ISprinklerBehavior.Independent || !info.Layout.Contains(tileLocation - sprinkler.TileLocation)) { continue; } } goto afterSimpleCheck; } return(false); afterSimpleCheck :; if (isForAllSprinklers) { return(SprinklerBehavior.GetSprinklerTiles( new GameLocationMap(location, CustomWaterableTileProviders) ).Contains(new IntPoint((int)tileLocation.X, (int)tileLocation.Y))); } else if (SprinklerBehavior is ISprinklerBehavior.Independent independent) { return(independent.GetSprinklerTiles( new GameLocationMap(location, CustomWaterableTileProviders), sprinklersList .Where(s => s.IsSprinkler()) .Select(s => (position: new IntPoint((int)s.TileLocation.X, (int)s.TileLocation.Y), info: GetSprinklerInfo(s))) ).Contains(new IntPoint((int)tileLocation.X, (int)tileLocation.Y))); } else { throw new InvalidOperationException("Current sprinkler behavior does not allow independent sprinkler activation."); } }
public void ActivateSprinklersInLocation(GameLocation location) { if (location.IsOutdoors && Game1.IsRainingHere(location)) { return; } if (Game1.player.team.SpecialOrderRuleActive("NO_SPRINKLER")) { return; } IMap map = new GameLocationMap(location, CustomWaterableTileProviders); var sprinklerTiles = SprinklerBehavior.GetSprinklerTiles(map); foreach (var sprinklerTile in sprinklerTiles) { map.WaterTile(sprinklerTile); } foreach (var sprinkler in location.Objects.Values.Where(o => o.IsSprinkler())) { sprinkler.ApplySprinklerAnimation(location); } }