Exemplo n.º 1
0
        public Room GetRoomForPosition(BlockPos pos)
        {
            long index3d = MapUtil.Index3dL(pos.X / chunksize, pos.Y / chunksize, pos.Z / chunksize, chunkMapSizeX, chunkMapSizeZ);

            ChunkRooms chunkrooms;
            Room       room;

            lock (roomsByChunkIndexLock)
            {
                roomsByChunkIndex.TryGetValue(index3d, out chunkrooms);
            }

            if (chunkrooms != null)
            {
                Room firstEnclosedRoom = null;
                Room firstOpenedRoom   = null;

                for (int i = 0; i < chunkrooms.Rooms.Count; i++)
                {
                    room = chunkrooms.Rooms[i];
                    if (room.Location.Contains(pos))
                    {
                        if (firstEnclosedRoom == null && room.ExitCount == 0)
                        {
                            firstEnclosedRoom = room;
                        }
                        if (firstOpenedRoom == null && room.ExitCount > 0)
                        {
                            firstOpenedRoom = room;
                        }
                    }
                }

                if (firstEnclosedRoom != null)
                {
                    return(firstEnclosedRoom);
                }
                if (firstOpenedRoom != null)
                {
                    return(firstOpenedRoom);
                }

                room = FindRoomForPosition(pos, chunkrooms);
                chunkrooms.AddRoom(room);

                return(room);
            }



            ChunkRooms rooms = new ChunkRooms();

            room = FindRoomForPosition(pos, rooms);
            rooms.AddRoom(room);

            lock (roomsByChunkIndexLock)
            {
                roomsByChunkIndex[index3d] = rooms;
            }

            return(room);
        }