목표: 구리 블럭으로 포탈 게이트를 만들고, 바다의 심장 아이템으로 게이트를 활성화 시키기
참고 기능: 흑요석으로 불을 붙이고 네더 포탈을 활성화 시키는 기능
추측한 원리 및 과정
- Fire 블록이 흑요석 위에 설치되었을 때, 아래가 흑요석이라면 포탈 게이트의 구성을 확인하고 사이에 있는 Air 블록들을 포탈 블럭으로 바꾸는 방식
선정한 Block Hooking 과정
1. Fire 블록을 설치할 수 있는 아이템(라이터, 화염구) 등에서 설치되는 블럭이 Fire 블록이 아닌 대체하는 블록(이하, 가짜 불 블록)을 설치하도록 기능
2. 가짜 불 블록이 설치되었을 때, 원하는 프레임이 구성되어있는지 확인
3-1. 구성되지 않았다면 가짜 불 블록이 있던 위치에 Fire 블록으로 대체
3-2. 구성되었다면 2번 과정에서 산출한 사이 Air블록들을 커스텀 포탈 블록으로 대체
선정한 Item Hooking 과정
- 주요 포인트
1) 바다의 심장이라는 아이템을 사용하였을 때, AfterEvents 중에서 ItemUseOn 이벤트가 아닌 ItemUse 이벤트만 호출 시키기 때문에 사용하고자한 위치를 특정하기 어려움.
2) BeforeEvents 중에서는 ItemUseOn 이벤트를 호출하긴 하는데, 클릭을 누르고 있는 동안 다회차로 호출되는 문제가 있음
3) 때문에 BeforeEvents를 호출하는 과정에서 이를 소스코드로 제어하기 보다는 가짜 아이템을 바다의 심장으로 위장시켜 바다의 심장 역할을 대체하는 것이 간단하다고 판단.
4) 바다의 심장 아이템 생성 및 사용처: buried_treasure loot_table에서만 습득 가능, conduit 제작에서 재료로 활용
- 과정
1. 바다의 심장의 모습을 가진 가짜 아이템(이하, 가짜 심장)이 사용하였을 때, 가짜 불 블록을 설치하는 block_placer Component를 가지도록 설계
2. chests/buriedtreasure.json에서 바다의 심장 대신, 가짜 심장 아이템이 들어있도록 작성
3. recipes에 conduit을 제작할 때, 가짜 심장 아이템을 사용하도록 작성
4. AfterEvents 중 ItemUseOn이 발생시키는 라이터와 화염구 같은 아이템은 블록을 바꾸는 방식으로 해결 가능
- 스크립트 설계를 포기한 이유
1. 사용하고자 하는 아이템의 습득 경로 및 사용 경로가 매우 적음 => 염색약, 물약 재료등 사용처도 많고 습득 경로도 많은 아이템의 경우는 경우의 수를 다 차단하기엔 어려움
2. 인덱스로 구성된 것 같은 마인크래프트 블록은 중복처리를 좌표 형태로 구성 가능성이 있으나 몇 가지 우려지점이 발생.
- 추측 사항: Behaviour 팩은 서버를 가동 시키는 클라이언트에서만 실행(Dedicated건 Listen이건).
- 우려 사항
- 게이트 형태로 다루기에는 서버단에서 발생하는 이야기라 난해.
- 리퀘스트 형태로 다루려면, 전달해야하는 정보가 많아지는데, 이걸 중복 처리를 해야하는 것이 귀찮음. => 이게 주된 이유, 로직 고민하다가 백날천날로 밀려남.
- 굳이굳이 처리할 수 있다고 만들어둔 itemUseOn AfterEvent 핸들러를 못쓰는게 열받음. => BeforeEvent 핸들러는 있는데 왜 AfterEvent 핸들러로는 작동하지 않는지(아이템의 성향에 따라 작동하는게 다르다는 것은 이해함)가 마음에 들지 않음. 이벤트 콜을 하기 위해서 callback들을 걸어놔도 여전히 이 콜백들을 중복 처리를 해야하기 때문에 원리 파악하고 재구성하는데 시간이 걸리기 때문에 하기 싫습니다. 돈 받고 만드는 것도 아닌데요...
근본적인 원인
- Addon을 작성할 때 사용하는 Behaviour Pack에서는 기존 블럭의 json들을 override하는 것을 허용하지 않습니다. 파일명으로 하기 보다는 내부의 identifier를 활용하여 블럭의 작동방식에 대해 기술할 수 있는데, 이때 "minecraft:"를 활용하는 것을 허용하지 않는 것으로 알고 있습니다.
그래도 가급적 스크립트나 고유 json에서 다뤄졌으면 좋겠는 이유
현재 방식은 기존 아이템을 게임 내에서 단절 및 배제하고 대용 커스텀 아이템이 그 자리를 대체하는 방식이기 때문에 사용 폭이 제한이 되어있습니다. 또한 새로운 업데이트를 통해 새로운 루트가 생긴다면, 정상적으로 작동하지 않을 가능성이 높습니다. 언제든 작동하지 않을 가능성이 높은 컨텐츠는 유지 보수에 시간과 에너지를 지속적으로 투자하게 되기 때문에 관리를 해줄 수 없는 크리에이터들에게는 부담을, 즐겁게 사용하는 사용자들에게는 불완전함을 전달하는 계기가 될 것이라고 생각합니다.
'개발자로 > MinecraftMod' 카테고리의 다른 글
ProccupationWar #007, BDS 패킷 테스트 (0) | 2024.11.20 |
---|---|
ProccupationWar #006, 특수 블록 게이트 생성(Minecraft BE Addon) (0) | 2024.11.14 |
ProccupationWar #004 (0) | 2024.11.05 |
ProccupationWar #003 (0) | 2024.09.23 |
ItemLocker #001 (0) | 2024.07.07 |