Skip to content
신선한 자몽 농장
Go back

[Game] 마인크래프트 모드 충돌 해결하기

문제가 발생했다.

서버를 정상적으로 구축하고 운영하고 이틀 째 되는 날 아침 출근 시간 부터 누가 날 찾아재낀다. 뭔가 하고 봤더니만 모루로 “내구성”과 “수선” 인챈트를 장비에 붙일 수 없는 문제가 발생하고 있다. 두 인챈트는 마인크래프트, 그 중 여러 RPG와 공장 모드가 섞인 서버에서는 매우 중요한 옵션이라 필히 고쳐야 했다. 이제부터 원인을 찾아 해결하는 과정을 기록해보자


제일 먼저 로그를 보자

원래 문제가 생기면 제일 먼저 하는게 로그 부터 보는거다. 그런데 이런 경우는 처음이다. 분명 인챈트를 시도하면 X 로 불가 표시만 나오고 오류가 발생하지 않는다. 더군다나 JEI 모드를 통해 사용 가능한 모든 레시피를 찾아봐도 “내구성”과 “수선” 두 항목만 장비에 적용 가능한 레시피가 표시되지 않는다. 그렇다면 이건 오류가 아니라 특정 모드로 인해 의도된 기능일 확률이 높다.

어떤 모드가 문제일까

현재 내 서버에는 매우 많은 모드가 돌아가고 있다.

모드 목록 (총 130+개)

이렇게 많은 모드에서 뭐가 문제일까 참 찾기도 힘들고 당황스러운 상태이다.

우선 의심될만한 모드를 먼저 분류해보기로 했다.

인챈트 관련 모드

처음 의심한건 인챈트와 여러 옵션을 부여해주는 ApothicEnchanting 모드를 의심했다. 해당 모드는 인챈트 성능과 관련된 모드인지라 기존에 설정했던 인챈트 관련 설정을 최초 구성으로 원복해봤다. 그래도 여전히 이슈는 동일한 상태였다.

다음 의심해본건 Create mod의 애드온으로 인챈트 관련 장비를 추가해주는 create-enchantment-industry 모드였다. 해당 모드를 제거해봐도 여전히 동일한 상태이다.

그렇다면 지난 서버에서 사용하지 않고 새로 추가한 인챈트를 재활용하게 해주는 grind enchantments 모드를 제거했다. 하지만 역시나 동일한 상태였고 여기서 뭘 해봐야할지 막막한 상황이었다.


AI의 도움을 받아보자

도무지 감도 안잡히는 이 상황에서 내 미천한 두뇌로는 한계가 있다는걸 인정하고 최신 기술의 도움을 받아보고자 했다. 역시 이럴 때 가장 믿을만한건 Claude 뿐이다. 동작 로그와 모드 리스트 그리고 이슈 케이스를 설명했다. 그런데 의심했던 모드 리스트와 동일한 대답을 해줬다. 갑자기 신뢰도가 확 떨어졌다.


이분탐색을 해보자

사실 AI가 알려준 모드들을 이미 다 의심했다가 아니라는 결론을 낸 상태였으니 더 이상 기댈 곳이 없었다. 그래서 머릿속에 떠오른 건 예전에 배운 알고리즘 지식이었다. 130개 모드 중 범인을 찾아야 하는 상황, 이건 그냥 이분탐색 문제 아닌가.

방법은 간단하다.

  1. 전체 모드를 절반으로 나눠 한쪽을 통째로 제거한 후 테스트
  2. 문제가 사라지면 제거한 쪽에 원인이 있는 것
  3. 문제가 남아있으면 남긴 쪽에 원인이 있는 것
  4. 해당 그룹을 다시 반으로 나눠서 반복
  5. 약 8~10회 정도 반복하면 특정 가능

다만 서버를 매번 재시작해야 하는 게 문제였는데, 서버에서 테스트하면 사용자들에게 민폐라 싱글플레이어 월드를 따로 만들어서 테스트했다. 서버 중단 없이 진행할 수 있어서 이 방식이 훨씬 효율적이었다.

한 가지 함정이 있었다. 모드들 사이에 의존성이 있다는 걸 간과했다. 무작정 절반을 지웠다가 의존 모드가 없어서 아예 로딩조차 안 되는 상황이 몇 번 생겼다. 그래서 이분탐색 전에 모드 간 의존 관계를 먼저 파악해두는 게 중요하다.


이분탐색 중 발견된 부수적인 문제들

이분탐색을 진행하다가 인챈트 문제와는 별개로 크래시가 나는 경우가 생겼다.

watut + Iris 충돌

모드 절반을 제거하고 테스트하는데 갑자기 게임이 시작도 못 하고 튕겼다. 로그를 보니 이런 내용이었다.

Invalid shaders/core/particle.json: File not found
at com.corosus.watut.ShaderInstanceBlur

watut 모드가 셰이더 파일을 로드하려는데, Iris가 해당 경로를 변경해버려서 파일을 찾지 못하는 거였다. 셰이더팩을 끄고 테스트해봐도 Iris 자체가 로드되어 있으면 똑같이 크래시가 났다. 이분탐색 중에는 그냥 watut를 빼고 진행했다.

fdlib + Iris 충돌

비슷하게 fdlib도 문제였다.

Failed to load shaders
at FDPostShadersReloadableResourceListener.initializeShaders

fdlib는 Qliphoth Awakening 보스 모드의 라이브러리인데 얘도 Iris와 셰이더 충돌이 있었다. fdbosses가 fdlib를 의존성으로 요구하니까 같이 빼야 했다.

이분탐색 중 의도치 않은 크래시가 계속 발생하면 원인 모드를 엉뚱하게 특정할 수 있으니, 진행 전에 이런 충돌 모드들을 미리 제거해두는 게 좋다.


드디어 찾았다

그렇게 몇 시간을 투자해서 범위를 좁혀나갔더니 드디어 의심 가는 그룹이 나왔다. Spellbooks 계열 모드들을 제거했을 때 인챈트가 정상 작동했다.

그런데 여기서 또 함정이 있었다. irons_spellbooks 자체는 문제가 없었다. 문제는 다음 세 모드의 조합이었다.

이 세 개가 함께 로드될 때 NeoForge의 RegisterEvent 처리 중 이런 오류가 발생하고 있었다.

Ice and Fire: Spellbooks (ice_and_fire_spellbooks) encountered an error while dispatching
the net.neoforged.neoforge.registries.RegisterEvent event
java.lang.NoClassDefFoundError:
net/acetheeldritchking/aces_spell_utils/entity/render/armor/EmissiveGenericCustomArmorRenderer

ice_and_fire_spellbooksaces_spell_utils의 렌더러 클래스를 참조하는데, 초기화 실패로 RegisterEvent 처리 자체가 중단됐던 것이다. 이 과정에서 인챈트 레지스트리 초기화가 불완전하게 완료되어 수선과 내구성의 적용 가능 아이템 데이터가 손상됐다.

크리에이티브 모드에서는 이 데이터 유효성 검사를 건너뛰기 때문에 정상 작동했고, 서바이벌에서는 손상된 레지스트리를 그대로 참조하니까 X만 표시됐던 것이다. 서버 로그에 에러가 없었던 것도, 인챈트 자체의 오류가 아니라 레지스트리가 조용히 망가진 탓이었다.

처음부터 이 조합을 의심했다면 훨씬 빨리 찾았겠지만, 해당 문제를 구글링해도 마땅한 자료가 없어서 직접 이분탐색으로 파내야 했다.

문제 모드 버전 정보는 아래와 같다.

모드버전
aces_spell_utils1.2.5-1.21.1
ice_and_fire_spellbooks2.3.2-1.21.1
cataclysm_spellbooks1.1.11-1.21

해결

서버와 클라이언트 양쪽에서 문제 모드 3개를 제거했다.

irons_spellbooks 자체는 제거하지 않아도 된다. 마법서, 주문, 아케인 앤빌 등 핵심 기능은 그대로 쓸 수 있다.

서버를 재시작하고 테스트해보니 수선과 내구성 인챈트가 정상적으로 모루에서 적용됐다. 이틀 동안 사람들을 괴롭히던 문제가 해결되는 순간이었다.


마무리

이번 문제를 해결하면서 든 생각은 두 가지다.

첫 번째는 이런 모드 충돌 문제는 로그에 에러가 안 뜰 수도 있다는 것이다. 분명히 뭔가 잘못됐는데 로그가 조용하면 더 무서운 상황이다. 레지스트리가 조용히 손상되는 케이스가 이런 경우다.

두 번째는 이분탐색은 역시 강력하다는 것이다. 130개 모드 중에서 정보도 없고 로그도 없는 상황에 단서라고는 “크리에이티브는 되고 서바이벌은 안 된다”는 것뿐이었는데, 논리적으로 범위를 좁혀나가니까 결국 찾을 수 있었다.

삽질도 결국 방법만 맞으면 끝이 있다.



Previous Post
처음이자 마지막 ASRock 메인보드를 떠나보내며
Next Post
Synology 대용량 파일 업로드 실패 해결하기