How To

마인크래프트와 스트림 데크의 만남: 완전 기능형 레드스톤 구조물

Last updated:

  이 페이지는 DeepL 에서 자동으로 번역되었습니다. Switch to English

우리 커뮤니티는 항상 창의적이고 재미있는 작품으로 놀라움을 선사해 왔고, 이번 작품은 그 중에서도 가장 돋보일 수도 있습니다. 최근에는 Stream Deck이 점점 더 많은 곳에서 등장하고 있다는 이야기를 많이 듣고 있습니다. Stream Deck 모듈과 컴퓨터에서 사용할 수 있는 Virtual Stream Deck이 그 예시입니다. 그런데 이제? Minecraft에 등장했습니다.

영감

약 한 달 전, Elgato 커뮤니티 전문가 한 명이 Elgato 트위터에 15키 스트림 데크를 Minecraft로 제작한 작품을 게시했습니다. 친근한 경쟁심에 사로잡혀, 이 개념을 실제 작동하는 현실로 구현하는 방법을 고민하기 시작했습니다. 제가 만든 것은 상상할 수 있을 만큼 완벽하지는 않으며, 잘못 보면 고장날 수도 있지만, 결과에 매우 만족합니다!

이 빌드는 다른 모니터에 숨겨진 6개의 키로 구성된 가상 스트림 데크(Virtual Stream Deck)로 구동되며, 게임 내에서 활성화된 상태에 따라 SD 버튼을 누르는 복잡한 부분을 처리하는 매우 임시적인 Node.js 스크립트가 사용됩니다. 또한 이 스크립트는 VSD 디스플레이를 마인크래프트에서 표시할 수 있는 형식으로 변환하는 역할도 담당합니다.

unnamed

마인크래프트 측에서는 레드스톤 구조가 매우 단순합니다. 화면 뒤쪽에서 각 버튼은 조정된 스컬크 센서(게임 내 소리 센서) 한 쌍을 사용하여 입력 이벤트를 감지합니다. 이 경우 입력 이벤트는 버튼에 눈덩이가 떨어지는 것(신호 강도 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의 한쪽 끝에서 다른 쪽 끝까지 거의 뻗어 있습니다.

unnamed (1)

TheAppleFreak의 다른 작품도 확인해 보세요:

기사 내 제품