NullReferenceFix
Fixes recurring NullReferenceException/log spam (ZNetScene.RemoveObjects, AzuCraftyBoxes, EnemyHud conflicts, TMP missing glyphs), oversized item tooltip shake/cut-off (two columns), and KeenCombat sk
模組介紹 作者原文
NullReferenceFix
A small collection of independent Harmony patches, each fixing one specific recurring bug —
mostly NullReferenceExceptions that repeat every single frame for the rest of your play
session once triggered (spamming the log and wasting CPU), plus the occasional leaked-resource
bug that quietly accumulates until it causes lag or a freeze. Every patch targets a different
root cause and can trigger (or not) completely independently of the others.
한국어 설명 보기 | English Description
🇰🇷 한국어 (Korean)
개요
NullReferenceFix는 서로 독립적인 여러 개의 작은 Harmony 패치를 모아둔 모드입니다. 대부분은
한 번 터지면 세션이 끝날 때까지 매 프레임 반복해서 터지는 NullReferenceException 버그를
담당하고, 일부는 조용히 누적되다가 렉이나 프리징을 유발하는 리소스 누수를 담당합니다. 패치마다
원인이 다르고, 서로 완전히 독립적으로 발동합니다 — 즉 설치된 다른 모드 구성에 따라 일부 패치는
평생 한 번도 발동하지 않을 수도 있습니다.
현재 7가지 버그를 고칩니다:
- 바닐라 발헤임 자체 버그 (ZNetScene.RemoveObjects)
- AzuCraftyBoxes 모드 버그 (제작함 근처 재료 확인)
- EnemyHud를 건드리는 모드 간 충돌 (EpicMMOSystem 등)
- 바닐라 발헤임 TMP 폰트의 비라틴 스크립트(한글/일본어/중국어/아랍어 등) 글리프 누락 경고 (닉네임/길드명 등이 공백으로 표시됨)
- 바닐라 발헤임 아이템 툴팁이 화면보다 클 때 발생하는 화면 흔들림/잘림 (스탯·효과를 많이 추가하는 모드 사용 시)
- Azumatt AAA_Crafting 제작창(제작/업그레이드 탭) 아이템 호버 툴팁이 화면 오른쪽 끝에서 흔들리고 잘리는 문제 (화면 가운데 고정 + 2열 분할)
- KeenCombat의 무기 스킬 툴팁("BLINK STRIKE" 등)이 무기가 아닌 아이템에도 표시되는 문제 (비무기 아이템에서만 제거)
📦 필수 모드 (Dependencies)
| 모드 | 버전 | 필수 여부 |
|------|------|----------|
| BepInExPack_Valheim | 5.4.2200+ | 필수 |
| AzuCraftyBoxes | 아무 버전 | 선택 — 설치되어 있을 때만 해당 패치가 활성화됩니다 |
| EpicMMOSystem | 아무 버전 | 선택 — 설치되어 있지 않아도 다른 두 패치는 정상 작동합니다 |
이 모드는 어떤 조합으로 설치해도 안전합니다. 위 모드들이 없어도 해당 패치만 조용히
비활성화될 뿐, 나머지 패치는 그대로 작동합니다.
🐛 버그 1 — ZNetScene.RemoveObjects (바닐라 발헤임)
같은 프레임 안에서 어떤 ZNetView의 GameObject가 다른 경로로 먼저 파괴되면, 바닐라
ZNetScene.RemoveObjects가 그 오브젝트를 내부 추적 딕셔너리(m_instances)에서 제거하기도
전에 NullReferenceException을 던집니다. 이 예외 때문에 문제의 entry가 딕셔너리에서 끝내
제거되지 못하고 남아버리고, 그 결과 다음 프레임에도 똑같은 예외가 또 발생 — 이 과정이
세션이 끝날 때까지 매 프레임 무한 반복됩니다.
이건 특정 모드가 만든 버그가 아니라 발헤임 엔진 자체의 오래된 결함입니다. 모드를 하나도
설치하지 않아도 발생할 수 있으며, 몬스터 스폰/디스폰이 잦은 상황(전투, 대규모 소환 등)일수록
더 쉽게 걸립니다.
이 모드가 하는 일: ZNetScene.RemoveObjects에 Harmony Finalizer 패치를 추가해 해당
예외만 정확히 잡아내고, 이미 파괴된(fake-null) ZNetView entry를 m_instances에서 직접
제거합니다.
🐛 버그 2 — AzuCraftyBoxes 제작함 조건 확인
AzuCraftyBoxes는 근처에서 본 모든 제작함을 HashSet에 정적으로 계속 쌓아둡니다.
상자가 철거될 때는 Container.OnDestroyed 패치로 항목을 지우지만, 일부 파괴 경로(구역/청크
언로드 등)는 이 메서드를 거치지 않고 GameObject를 바로 파괴해버려서, 이미 죽은(fake-null)
Container가 세트에 그대로 남습니다. 이후 제작 메뉴가 열려 있는 동안 매 프레임 실행되는
재료 확인 로직이 이 죽은 항목의 GetPrefabName()을 호출하면서 NullReferenceException이
반복 발생합니다 — 제작 메뉴를 닫기 전까지 계속됩니다.
이 모드가 하는 일: AzuCraftyBoxes가 설치되어 있을 때만 활성화되는 패치로, 해당 예외를
잡아내고 파괴된 Container 항목들을 세트에서 직접 제거합니다.
🐛 버그 3 — EnemyHud를 건드리는 모드 간 충돌 (EpicMMOSystem 등)
일부 팩션/마켓플레이스 계열 모드는 자체 EnemyHud.LateUpdate 패치 안에서 EnemyHud.ShowHud를
직접 강제로 재호출해 HUD를 즉시 새로고침하려 합니다. 그런데 이 재호출이 이미 로그아웃했거나
디스폰된 캐릭터를 대상으로 발생하면, 그 캐릭터의 HUD 항목(m_huds)이 아직 정리되지 않은 채
남아있을 수 있고, 이걸 전제로 동작하는 다른 모드의 ShowHud 패치(예: EpicMMOSystem의 PvP
플레이어 이름 색상 표시 패치 DataMonsters.MonsterColorTexts)가 죽은 참조를 건드리면서
NullReferenceException이 반복 발생합니다.
이 모드가 하는 일: EpicMMOSystem이나 특정 모드를 콕 집어 패치하지 않고, 발헤임 기본
EnemyHud.ShowHud에 Finalizer를 걸어서 어떤 모드의 postfix에서 터지든 잡아내고, 문제의
오래된 m_huds 항목과 남은 HUD GameObject를 직접 정리합니다. 그러면 다음 프레임에 정상적인
새 항목이 만들어집니다.
🐛 버그 4 — TMP 비라틴 스크립트 글리프 누락 경고
발헤임 바닐라·TMP 내장 폰트(예: Valheim-Prstartk, LiberationSans SDF)는 라틴 문자만
커버하고, 한글·일본어·중국어·아랍어·히브리어·태국어 등 비라틴 스크립트 글리프는 자체 글리프
테이블과 폴백 체인에 포함하지 않습니다. 플레이어 닉네임·길드명처럼 사용자가 직접 입력한
비라틴 텍스트가 이런 폰트로 렌더링되는 TMP_Text 오브젝트(예: EpicMMOSystem의 네임플레이트/
길드명/정보 패널)를 통해 표시될 때마다 "The character with Unicode value... was not found
in the [...] font asset..." 경고가 반복 출력되고, 해당 글자는 공백이나 네모(□)로 대체됩니다.
발헤임은 자체 다국어 로컬라이제이션을 위해 스크립트별 Noto 계열 폰트(NotoSansKR,
NotoSansJP, NotoSansSC, NotoSansArabic 등 11개 스크립트 + 이모지)를 이미 게임 파일에
내장하고 있지만, 플레이어가 직접 입력하는 텍스트용 TMP 전역 폴백 목록에는 연결되어 있지
않습니다.
이 모드가 하는 일: 발헤임이 지원하는 각 언어의 폰트를 찾아 세션당 한 번 TMP의 전역 폴백
목록(TMP_Settings.fallbackFontAssets)에 전부 등록합니다. 새 폰트를 번들링하지 않고 발헤임이
이미 갖고 있는 리소스만 사용하며, 어떤 모드가 만든 TMP 텍스트든 상관없이 어떤 언어의 텍스트든
공백/네모 대신 정상적으로 표시되도록 합니다.
🐛 버그 5 — 화면보다 큰 아이템 툴팁 (화면 흔들림 / 잘림)
스탯·효
安裝與使用 安裝:BepInEx 外掛
- 本站下載的壓縮包就是模組本體,通常是 BepInEx 外掛(解壓後得到 .dll 或外掛資料夾)。
- 建議流程:用社群模組管理器(如 r2modman)選中本遊戲後匯入該模組,管理器會自動裝好 BepInEx 前置並處理依賴。
- 手動流程:先在遊戲目錄裝好 BepInEx 載入器,再把解壓出的 .dll 或外掛資料夾放進 BepInEx/plugins/。
- 啟動遊戲,BepInEx 控制台會列印載入日誌;確認這個模組出現在日誌裡即為安裝成功。
帶「前置依賴」的模組需要一併安裝,否則不會載入。功能開關通常在遊戲內或外掛自帶的設定檔裡調整。 多人連線時,主機與所有用戶端需要安裝一致的模組。
下面這些內容需要先安裝,否則該模組不會生效: