Existem 2 problemas difíceis na ciência da computação. Atribuindo nomes a nomes, invalidação de cache e erros pontuais.
Este é um problema de invalidação de cache.
Se você tem um registro de "é isso aí dentro", sempre que um bloco é colocado ou removido, é muito fácil atualizá-lo e sua região por meio de um preenchimento de inundação.
Para otimizar isso, convém ter um conjunto de camadas de "insididez".
Uma "célula" é uma região cercada por blocos colocados por jogadores (até um determinado tamanho).
Uma "sala" é uma célula com blocos de plano de fundo.
"Inside" é uma sala com uma porta, uma luz e uma cadeira.
Ao colocar um bloco de primeiro plano colocado pelo jogador, faça uma caminhada no sentido horário / anti-horário para ver se uma nova célula é formada. Ao remover um bloco de primeiro plano colocado pelo jogador, examine se ele quebra alguma célula - se houver, veja se uma nova célula é formada ao mesclar as duas.
Quando uma nova célula é formada ou não formada, verifique se é uma sala ou um interior.
As células podem acompanhar quantos blocos de plano de fundo precisam ser uma sala. Em seguida, uma contagem simples quando uma célula é formada, um bloco de segundo plano é adicionado ou removido da célula pode determinar se é uma sala.
Da mesma forma, as células podem acompanhar quantas cadeiras e fontes de luz (e de fato objetos de todos os tipos) estão dentro delas. Então a verificação interna é trivial.
Uma contagem de entradas também pode ser feita.
Então, aumentamos o mapa com "células". Quando os blocos são adicionados ou removidos, verificamos a célula do local e aumentamos / diminuímos a contagem na célula.
Use uma caminhada no sentido horário / anti-horário para definir o interior e o exterior de uma célula quando um bloco em primeiro plano for adicionado ou removido. Como o tamanho das células é limitado, essa caminhada terá um número limitado de etapas.
Como bônus, agora você tem uma maneira barata de falar sobre salas "opulantes" ou "a sala é abençoada por uma fonte sagrada" ou qualquer outra coisa sobre uma sala, pois as salas têm uma contagem de cada tipo de objeto dentro delas. (Ou, como as salas são limitadas em tamanho, basta fazer uma iteração; isso remove um cache).
Cada local está em no máximo uma célula, para que você possa armazenar o ID da célula de cada local no mapa principal.