이 문서는 마인크래프트 pixel 플러그인이 병합을 통해 새로운 데이터를 만들 때, 월드의 광원을 통한 조명과 관련된 문제를 해결한 방법에 대해 설명합니다.
본 README.md 문서는 여기입니다.
*이 문서는 병합을 사용하지 않을 경우 발생하지 않는 조명오류에 대해서 다룹니다. 만약 병합 기능을 전혀 사용하지 않는다면 살펴보지 않아도 될 수 있습니다.
마인크래프트의 빛과 광원
병합과 빛
그래서 어떻게 하고 있느냐
마인크래프트에서는 특정 블럭이 노출되어있는 밝기에 대한 정보까지도 월드 로드 시나, 혹은 실시간으로 계산하지 않고 파일에 저장합니다.
청크 데이터 중 BlockLight
이 그 데이터인데, 이 데이터는 블럭 각각이 어떤 밝기냐를 저장합니다. 예를 들어 횃불이 놓여있는 위치의 경우, 14가 되겠죠.
광원은 마인크래프트에서 빛을 발산하는 블럭인데, 이 블럭을 두거나 치울 경우 해당 빛의 밝기가 영향을 미치는 공간 안에 있는 모든 빛의 값이 업데이트됩니다.
이 공간 안에 다른 광원이 있었을 경우 그 광원까지 업데이트되며, 다른 빛 값이 있었을 경우 특정 알고리즘을 통해 계산한 값이 반영됩니다.
pixel 플러그인을 통해 병합을 수행하면, 엔티티 데이터와 블럭 각각의 데이터만 병합됩니다.
이 병합되는 데이터에 빛에 관한 정보는 포함되지 않기 때문에, 빛과 관련된 정보를 따로 병합해주지 않으면 병합 이후에는 모든 블럭별 빛의 값이 삭제되거나, 혹은 병합을 시도한 평행세계의 빛 값만 남아있게 됩니다.
여러 방법을 시도해봤습니다. API를 통해 가능했으면 했지만 그런 API는 없었고요.
정말 광원 하나하나를 돌며 공개된 계산 알고리즘을 써볼까도 했으나, 안그래도 느린 병합속도를 더 느리게 할 수는 없었고 알고리즘을 반영하면서
생길 버그를 잡는것도 고될것이라 예상이 되는 바, 가장 간단하고 빠른 아래의 방법을 사용했습니다.
그냥 광원 블럭 하나하나를 부쉈다가 다시 설치해주면 됩니다!
spigot에는 블럭의 모든 정보를 가져올 수 있는 API가 있으며, 그것을 기반으로 이전과 완전히 똑같은 데이터를 갖는 블럭을 설치할 수 있습니다.
속도도 그렇게 느리지 않습니다. 약 80000개가 넘는 광원블럭을 모두 재설치하는데 5초 남짓밖에 걸리지 않습니다.
이렇게 하면 마인크래프트가 스스로 다시 빛을 계산하게 할 수 있어, 현재는 그렇게 구현되어있습니다.