우리 커뮤니티는 항상 창의적이고 재미있는 작품으로 놀라움을 선사해 왔고, 이번 작품은 그 중에서도 가장 돋보일 수도 있습니다. 최근에는 Stream Deck이 점점 더 많은 곳에서 등장하고 있다는 이야기를 많이 듣고 있습니다. Stream Deck 모듈과 컴퓨터에서 사용할 수 있는 Virtual Stream Deck이 그 예시입니다. 그런데 이제? Minecraft에 등장했습니다.
약 한 달 전, Elgato 커뮤니티 전문가 한 명이 Elgato 트위터에 15키 스트림 데크를 Minecraft로 제작한 작품을 게시했습니다. 친근한 경쟁심에 사로잡혀, 이 개념을 실제 작동하는 현실로 구현하는 방법을 고민하기 시작했습니다. 제가 만든 것은 상상할 수 있을 만큼 완벽하지는 않으며, 잘못 보면 고장날 수도 있지만, 결과에 매우 만족합니다!
이 빌드는 다른 모니터에 숨겨진 6개의 키로 구성된 가상 스트림 데크(Virtual Stream Deck)로 구동되며, 게임 내에서 활성화된 상태에 따라 SD 버튼을 누르는 복잡한 부분을 처리하는 매우 임시적인 Node.js 스크립트가 사용됩니다. 또한 이 스크립트는 VSD 디스플레이를 마인크래프트에서 표시할 수 있는 형식으로 변환하는 역할도 담당합니다.
마인크래프트 측에서는 레드스톤 구조가 매우 단순합니다. 화면 뒤쪽에서 각 버튼은 조정된 스컬크 센서(게임 내 소리 센서) 한 쌍을 사용하여 입력 이벤트를 감지합니다. 이 경우 입력 이벤트는 버튼에 눈덩이가 떨어지는 것(신호 강도 2) 또는 바람 충전 폭발 소리(신호 강도 15)입니다. 각 쌍은 단일 명령 블록으로 연결되며, 이 명령 블록이 트리거되면 게임 내 채팅에 1에서 8개의 공백을 입력합니다. 측면에 위치한 페이지 뒤로/앞으로 버튼도 지시등 제어용 추가 회로가 조금 더 있지만, 나머지 기능은 동일합니다.
이 프로젝트를 위해 작성한 맞춤형 Node.js 스크립트에서 대부분의 핵심 기능이 구현되었습니다. 프로그램이 처음 실행될 때, Virtual Stream Deck (VSD) 창이나 Minecraft 게임 창 중 하나를 선택할 수 있도록 하는 특수 정보를 획득한 후, VSD 창의 좌표도 함께 얻습니다. 모든 설정 완료 후에는 두 개의 루프가 동시에 실행됩니다: 입력 루프와 표시 루프입니다.
프로그램의 입력 부분은 두 부분 중 이해하기 더 쉬운 부분입니다. Minecraft가 실행될 때마다 가장 중요한 이벤트를 텍스트 파일인 latest.log에 로그 파일로 저장합니다. 중요한 점은 이 로그 파일에 채팅에서 수신된 메시지도 포함된다는 점입니다. 따라서 조금만 현명한 코드를 추가하면 공백만 포함된 메시지를 포함한 로그 항목만 확인할 수 있습니다. 이러한 메시지가 도착하면 공백의 수를 세고 이를 기반으로 누를 버튼을 결정합니다. 버튼은 상단에서 하단으로, 왼쪽에서 오른쪽으로 순서대로 배열되어 있으며(페이지 뒤로/앞으로 이동을 위한 추가 버튼 2개도 있습니다). 버튼이 선택되면 특수한 데스크톱 자동화 라이브러리를 사용하여 마우스를 매우 빠르게 Minecraft 창 밖으로 이동시키고, 모든 것을 제어하는 Virtual Stream Deck의 해당 버튼을 클릭한 후 Minecraft의 제어권으로 다시 돌아갑니다(이 작업을 위해 F3+P를 눌러야 합니다; 그렇지 않으면 게임이 초점을 잃을 때 일시 중지됩니다). 마우스를 움직이지 않을 때 이 동작이 발생하면 매우 매끄럽게 진행됩니다! 만약 그렇다면, 보통은 정말 끔찍하게 깨지죠 lol
버튼을 누르는 것은 문제없이 작동하지만, Stream Deck의 진정한 매력은 각 키 아래에 프로그래밍 가능한 디스플레이가 있다는 점입니다. 이 기능을 Minecraft 내에서 어떻게 구현할 수 있을까요? 제가 선택한 방법은 아마도 가장 우아한 방법은 아닐 수 있지만, 작동하기 때문에 제가 중요하게 생각하는 부분입니다! 초당 4회, 스크립트는 VSD 창을 스크린샷으로 캡처합니다. 버튼이 특정 크기(기본 크기인 52x52 픽셀이 잘 작동합니다)로 설정되어 있다고 가정하면, 스크린샷을 버튼 크기만 잘라내고 8x8 픽셀로 재조정합니다. 이 과정이 완료되면, 자른 이미지의 각 픽셀을 순차적으로 검사하며, 해당 픽셀의 색상과 가장 가까운 블록을 찾아내는 복잡한 코드를 실행합니다. (GitHub의 kult0922에게 깊은 감사를 드립니다. 그는 이미지를 마인크래프트 픽셀 아트로 변환하는 웹사이트를 만들고 소스 코드를 공개했습니다! 이 코드가 없었다면 이 프로젝트는 훨씬 더 오래 걸렸을 것입니다). 나머지 다섯 개의 버튼에 대해 동일한 과정을 반복합니다.
블록 목록을 얻는 것은 좋은 단계이지만, 이를 게임에 적용하는 것은 여전히 문제입니다. 채팅 명령어를 실행할 수 있다면 /setblock 명령어를 반복적으로 사용해 각 픽셀을 하나씩 업데이트할 수 있지만, 이 방법은 매우 느리고 비효율적입니다. 더 나은 도구는 vanilla 게임에 내장된 Structure Block입니다. 이 도구는 구조물의 미리 만들어진 '설계도'를 게임 세계에 배치하는 기능을 포함합니다. 저는 스크립트가 Minecraft가 기대하는 형식으로 설계도를 생성하는 방법을 알아냈고, 설계도가 설계도 폴더에 저장되면 게임 내 Structure Block에 현재 화면 상태에 맞는 설계도를 참조하도록 지시하는 채팅 명령어를 실행할 수 있습니다(각 개별 프레임은 고유한 파일 이름을 가져야 하며, 이는 작업을 약간 복잡하게 만듭니다). 이 작업이 완료되면, 작은 레드스톤 회로가 활성화된 설계도를 세계에 반복적으로 복사하는 구조를 만들면 작동하는 화면이 완성됩니다!
결국에는 대부분 사용할 수 있는 Stream Deck을 얻게 되지만, Minecraft 안에서 말이죠! 제 스크립트는 주로 제 컴퓨터에서만 실행되도록 설계되었지만, 멀티플레이어 서버에서 실행되도록 개선할 수 있을 것 같습니다! 이 프로젝트의 원본 프로토타입은 실제로 Windows Subsystem for Android에서 실행되는 Stream Deck Mobile 인스턴스에서 작동했습니다. 기술적으로 말하면, 모든 것을 완전히 다른 장치나 가상 머신에서 실행할 수 있다는 의미입니다. 물론 그게 좋은 아이디어인지 여부는 완전히 다른 문제지만… 실용성 같은 걱정 때문에 실험을 멈추지 마세요 :)
흥미로운 사실: 상단에 있는 Stream Deck 로고는 24개의 맵을 사용해 제작되었습니다. 로고의 구조는 End void에 위치해 있지만, 너무 커서 void의 한쪽 끝에서 다른 쪽 끝까지 거의 뻗어 있습니다.
TheAppleFreak의 다른 작품도 확인해 보세요:
기사 내 제품