- CobolCraft는 COBOL로 구현된 Minecraft 서버로, 작성 시점 최신 버전인 Minecraft 1.21.4를 지원함
- 이미 무한 지형 생성, 동적 청크 로딩, 월드·플레이어 데이터 디스크 저장, 기존 월드 가져오기, 멀티플레이, 서버 상태 표시, 블록 파괴·설치, 인벤토리, 제작, 아이템 줍기, 채팅, 명령어 등을 구현함
- 다중 상태·방향·상호작용을 가진 블록은 동작을 제대로 구현하려면 전용 코드가 많이 필요하며, 아직 지원되지 않는 블록이 많음
- Linux x86_64 또는 arm64에서 GnuCOBOL로 개발됐고, Docker를 이용한 배포도 가능하지만 Windows 같은 다른 운영체제 지원은 테스트되지 않음
- Minecraft의 기본 datapack과 공식 서버·클라이언트
.jar에서 JSON 데이터를 추출해 컴파일 시 COBOL 코드 생성과 런타임 데이터 로딩에 사용함
CobolCraft가 구현한 Minecraft 서버 기능
- CobolCraft는 COBOL로 작성된 Minecraft 서버이며 Minecraft 1.21.4를 지원함
- 구현된 기능은 다음을 포함함
- 무한 지형 생성과 동적 청크 로딩
- 월드와 플레이어 데이터의 디스크 저장
- Minecraft 파일 포맷 지원과 기존 월드 가져오기
- 동시 접속 플레이어 수를 설정할 수 있는 멀티플레이
- 서버 목록에서 온라인으로 보이게 하는 ping/server status
- 블록 파괴와 설치, 자동 생성된 loot table 코드
- 오른쪽 클릭 기반 블록 상호작용
- 플레이어 인벤토리
- 2x2와 3x3 제작
- 아이템 엔티티와 아이템 줍기
- 채팅
- 게임 내 명령어와 대화형 콘솔 명령어
server.properties 기반 설정
whitelist.json에 저장되는 지속형 whitelist
- 매우 기본적인 블록·플레이어 충돌과 엔티티 물리
- 낙하 피해, void 피해, 사망, 리스폰
블록 지원 범위와 한계
- 상태, 방향, 상호작용을 여러 개 가진 블록은 올바른 동작을 위해 전문화된 코드가 많이 필요함
- 아직 지원되지 않는 블록이 많음
- 동작하는 블록에는 다음이 포함됨
- torches
- slabs
- stairs
- logs 같은 rotated pillars
- 비상호작용 buttons
- doors
- trapdoors
- beds
- signs
빌드와 실행 환경
- CobolCraft는 GnuCOBOL로 개발됐으며 Linux에서 실행하는 것을 목표로 함
- 대상 아키텍처는 x86_64와 arm64
- Windows 같은 다른 운영체제 지원은 테스트되지 않음
- Docker를 사용하면 플랫폼 독립 배포가 가능함
- Linux 배포에 필요한 항목은 다음과 같음
- GnuCOBOL 3.1.2 이상
- 성능상 GnuCOBOL 3.2 이상 권장
make
gcc, g++
zlib
- 공식 서버
.jar 다운로드에 필요한 curl
- 서버
.jar에서 데이터를 추출하는 데 필요한 Java 21 이상
- 빌드와 실행 명령은 다음과 같음
make --jobs=$(nproc)
make run
- Docker Hub 이미지를 사용하거나 직접 빌드해서 실행할 수 있음
docker pull meyfa/cobolcraft:latest
git clone https://github.com/meyfa/CobolCraft.git cobolcraft && cd cobolcraft
docker build --tag meyfa/cobolcraft .
서버 설정과 네트워크 접근
- 서버 설정은
server.properties 파일을 수정해 수행함
- 이 파일은 첫 실행 시 지원되는 모든 옵션의 기본값과 함께 자동 생성됨
server-port: 기본값 25565
level-name: 기본값 "world"
white-list: 기본값 false
motd: 기본값 "CobolCraft"
max-players: 기본값 10, 최대 100
- 기본적으로 서버는
localhost:25565를 통해 자기 시스템에서만 접근 가능함
- 로컬 네트워크, VPN, 포트 포워딩, 임대 서버 등 외부에서 접근 가능하게 하려면 Docker 실행 시
0.0.0.0:25565:25565로 포트를 바인딩할 수 있음
docker run --rm -it -p 0.0.0.0:25565:25565 meyfa/cobolcraft
COBOL로 Minecraft 서버를 만든 이유
- 개발자는 이전에 COBOL 경험이 전혀 없었지만, COBOL에 대한 소문과 낙인을 보고 언어를 더 알아보고 싶어 했음
- 언어를 배우는 가장 좋은 방법으로 무언가를 직접 작성하는 방식을 택함
- Minecraft 코드의 복잡성과 규모 때문에 COBOL로 Minecraft 서버를 작성하는 선택은 좋으면서도 나쁜 아이디어였다고 평가함
- 다른 언어에서는 쉬운 작업을 처음부터 만들어야 했음
- JSON 파싱과 인코딩
- 여러 종류의 바이너리 데이터 처리
- 실시간 멀티플레이 네트워킹
- 객체지향적인 Minecraft 시스템을 절차형 언어로 옮기는 작업
- 급격한 학습 곡선은 COBOL과 그 개념을 깊이 조사하고 이해하게 만들었고, 그 과정이 보람 있었다고 밝힘
- COBOL을 처음 쓰는 사람에게는 GnuCOBOL Programmer's Guide를 권장함
- Minecraft 프로토콜 학습 자료로는 wiki.vg documentation을 참고할 수 있음
- 경우에 따라 Wireguard 같은 도구로 실제 서버 트래픽을 보는 것도 정보 흐름을 이해하는 데 도움이 될 수 있음
소스 구성과 실행 바이너리
- COBOL 소스 코드는 주로
src/ 디렉터리에 있음
src/main.cob이 진입점
src/server.cob에는 서버 시작 코드와 게임 로직이 있음
codegen/ 디렉터리에는 COBOL로 작성된 코드 생성기가 있음
- Minecraft 기본 datapack 같은 JSON 데이터에서 추가 소스 코드를 생성함
cpp/ 디렉터리에는 COBOL로 처리하기 어려운 운영체제 연동을 위한 C++ 소스가 있음
- 저수준 TCP 소켓 관리
- 정밀 타이밍
- 프로세스 시그널 처리
- 모든 COBOL과 C++ 소스는 하나의
cobolcraft 바이너리로 컴파일됨
Minecraft 데이터 추출과 JSON 처리
- 공식 Minecraft Java Edition 서버와 클라이언트 애플리케이션에는 많은 데이터가 들어 있음
- 블록, 아이템, 엔티티 타입
- biomes
- 패킷 protocol ID
- 곡괭이로 캘 수 있는 블록 같은 tags
- recipes
- 블록을 부쉈을 때 어떤 조건에서 어떤 아이템이 떨어지는지 나타내는 loot tables
- CobolCraft의
Makefile에는 공식 .jar를 다운로드하고 데이터를 JSON으로 추출하는 대상이 있음
- 추출된 JSON 데이터는 두 방식으로 사용됨
- 컴파일 시 블록 loot table 같은 COBOL 코드를 자동 생성
- 런타임에 데이터를 메모리로 로드
- 두 작업 모두 COBOL로 작성되고 유닛 테스트가 완료된 범용 JSON 파서를 사용함
테스트와 업데이트
- 유닛 테스트는
tests/ 디렉터리에 있음
- 테스트는 copybook 기반의 커스텀 테스트 프레임워크를 사용함
- 테스트 스위트, 유닛, assertion을 추적함
- 실행 끝에 요약을 제공함
- 테스트 실행 명령은
make test임
- 테스트의 주된 목표는 디버깅이 어려운 JSON·바이너리 데이터 인코딩과 디코딩 같은 영역을 검증하는 것임
- 게임 로직 자체 테스트는 그만큼 중요하지 않다고 봄
- 새 Minecraft 버전으로 서버를 업데이트하는 절차와 테스트 단계는
Updating.md에 있음
라이선스와 상표
- CobolCraft는 MIT License로 배포됨
- “Minecraft”는 Mojang Synergies AB의 상표임
- CobolCraft는 Mojang과 제휴하거나 Mojang의 보증을 받은 프로젝트가 아님