public static void SendBeamsToPlayer(this IZone zone, Player player, GridDistricts districts) { var beams = player.CurrentPosition.ToCellCoord().GetNeighbours(districts).SelectMany(cellCoord => { var area = cellCoord.ToArea(); return(zone.Beams.All.Where(b => area.Contains(b.SourcePosition))); }); foreach (var beam in beams) { player.Session.SendBeamIfVisible(beam); } }
public IEnumerable <CellCoord> GetNeighbours(GridDistricts gridDistricts = GridDistricts.All) { var mask = 0x80; do { var district = gridDistricts & (GridDistricts)mask; if (district == GridDistricts.Undefined) { continue; } var n = _neighbours[district]; n.x += x; n.y += y; yield return(n); } while ((mask >>= 1) > 0); }