You are viewing a potentially older version of this package. View all versions.
korCaptain-NullReferenceFix-1.0.47 icon

NullReferenceFix

Fixes recurring NullReferenceException/log spam (ZNetScene.RemoveObjects, AzuCraftyBoxes, EnemyHud conflicts, TMP missing glyphs), and KeenCombat skill text on non-weapons.

Date uploaded a week ago
Version 1.0.47
Download link korCaptain-NullReferenceFix-1.0.47.zip
Downloads 375
Dependency string korCaptain-NullReferenceFix-1.0.47

This mod requires the following mods to function

denikson-BepInExPack_Valheim-5.4.2201 icon
denikson-BepInExPack_Valheim

BepInEx pack for Valheim. Preconfigured and includes unstripped Unity DLLs.

Preferred version: 5.4.2201

README

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 버그를 담당하고, 일부는 조용히 누적되다가 렉이나 프리징을 유발하는 리소스 누수를 담당합니다. 패치마다 원인이 다르고, 서로 완전히 독립적으로 발동합니다 — 즉 설치된 다른 모드 구성에 따라 일부 패치는 평생 한 번도 발동하지 않을 수도 있습니다.

현재 5가지 버그를 고칩니다:

  1. 바닐라 발헤임 자체 버그 (ZNetScene.RemoveObjects)
  2. AzuCraftyBoxes 모드 버그 (제작함 근처 재료 확인)
  3. EnemyHud를 건드리는 모드 간 충돌 (EpicMMOSystem 등)
  4. 바닐라 발헤임 TMP 폰트의 비라틴 스크립트(한글/일본어/중국어/아랍어 등) 글리프 누락 경고 (닉네임/길드명 등이 공백으로 표시됨)
  5. 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>에 정적으로 계속 쌓아둡니다. 상자가 철거될 때는 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 — KeenCombat 스킬 툴팁이 비무기 아이템에 표시됨

KeenCombat은 ItemDrop.ItemData.GetTooltip의 모든 오버로드 끝에 무기 스킬 설명(예: "BLINK STRIKE", 설명, 쿨타임)을 덧붙입니다. 다른 모드가 재료·음식·모드 추가 아이템에 무기용 스킬 타입을 지정해 두면 무기가 아닌 아이템에도 같은 스킬 툴팁이 붙습니다. KeenCombat에는 이 툴팁을 끄는 설정이 없습니다.

이 모드가 하는 일: KeenCombat의 패치 뒤에 실행되는 Postfix로, 무기(한손/양손/활·석궁)가 아닌 아이템에서만 덧붙은 스킬 블록을 제거합니다. 실제 무기의 스킬 툴팁은 그대로 유지됩니다. KeenCombat이 설치되어 있지 않으면 아무 일도 하지 않습니다.


회피(무시)가 아니라 청소입니다. 예외를 잡는 패치들은 예외 자체가 처음 한 번은 그대로 발생하고, 이 모드가 그걸 잡아낸 뒤 원인이 된 깨진 상태(딕셔너리/세트의 죽은 항목)를 실제로 지웁니다. 그래서 같은 entry로는 다시 터지지 않습니다 — 단순히 로그만 숨기고 깨진 상태를 계속 방치하는 방식이 아닙니다. 각 패치는 오직 대상 메서드(또는 없으면 아무 일도 하지 않는 선택적 대상)만 건드리며, 다른 모드의 코드를 수정하지는 않습니다.


📥 설치 방법
  1. 권장: r2modman/Thunderstore에서 자동 설치
  2. 수동: NullReferenceFix.dll을 BepInEx/plugins/ 폴더에 복사

이 버그들은 네트워크로 동기화되지 않는 로컬 상태 문제라서, 서버와 각 클라이언트가 각자 독립적으로 겪을 수 있습니다. 한쪽에만 설치하면 그쪽만 고쳐집니다 — 멀티플레이 환경이라면 서버 + 접속하는 모든 클라이언트에 설치하는 것을 권장합니다.


🏴󠁧󠁢󠁥󠁮󠁧󠁿 English

Overview

NullReferenceFix is a collection of independent, small Harmony patches. Most fix a specific bug where a NullReferenceException, once triggered, repeats every single frame for the rest of the session; a few fix a leaked-resource bug that quietly accumulates until it causes lag or a freeze. Every patch has a different root cause and triggers (or doesn't) completely independently — depending on your mod list, some patches may never activate at all.

It currently fixes 5 bugs:

  1. A vanilla Valheim engine bug (ZNetScene.RemoveObjects)
  2. An AzuCraftyBoxes mod bug (nearby-container requirement check)
  3. A vanilla Valheim item tooltip taller than the screen shaking and getting cut off (seen with mods that add many stats/effects)
  4. Azumatt's AAA_Crafting crafting-window (Craft/Upgrade tabs) item hover tooltip shaking and getting cut off at the right edge of the screen (now pinned to the screen center + two-column split)
  5. KeenCombat's weapon skill tooltip ("BLINK STRIKE" etc.) showing up on non-weapon items (removed from non-weapons only)

📦 Required Mods (Dependencies)
Mod Version Required
BepInExPack_Valheim 5.4.2200+ Required
AzuCraftyBoxes any Optional — that patch only activates if it's installed
EpicMMOSystem any Optional — the other two patches work fine without it

Safe to install in any combination. If a mod above isn't installed, its corresponding patch just stays inactive; the rest still work normally.


🐛 Bug 1 — ZNetScene.RemoveObjects (vanilla Valheim)

If a ZNetView's GameObject is destroyed by something else in the same frame that vanilla ZNetScene.RemoveObjects tries to clean it up, the method throws a NullReferenceException before it can reach the line that removes the stale entry from its internal tracking dictionary (m_instances). Because that entry never gets removed, the exact same exception fires again on the very next frame — and every frame after that, for the rest of the session.

This is vanilla engine behavior, not something any particular mod causes. It can happen with zero mods installed; busier games (more monster spawns/despawns, heavy combat) simply hit the underlying race condition more often.

What this patch does: adds a Harmony Finalizer to ZNetScene.RemoveObjects that catches only that specific exception and removes the already-destroyed (stale) ZNetView entry from m_instances directly.


🐛 Bug 2 — AzuCraftyBoxes nearby-container check

AzuCraftyBoxes keeps a static HashSet<Container> of every crafting container it has ever seen nearby. Container.OnDestroyed is patched to remove an entry when a box is demolished, but some destroy paths (e.g. a zone/chunk unload) destroy the GameObject without going through that method, leaving a Unity-destroyed (fake-null) Container sitting in the set. The next recipe check that walks nearby containers calls GetPrefabName() on the dead entry and throws NullReferenceException — every frame the crafting menu stays open.

What this patch does: only activates when AzuCraftyBoxes is installed; catches that exception and removes the destroyed Container entries from the set directly.


🐛 Bug 3 — Mod conflicts touching EnemyHud (EpicMMOSystem, etc.)

Some factions/marketplace-style mods call EnemyHud.ShowHud directly from their own EnemyHud.LateUpdate patch to force an immediate HUD refresh. If that re-entrant call targets a Character that already logged out or despawned, its HUD entry (m_huds) can still be sitting around uncleaned, and another mod's ShowHud patch that assumes a live entry — e.g. EpicMMOSystem's PvP player name-color patch, DataMonsters.MonsterColorTexts — dereferences the dead reference and throws NullReferenceException repeatedly.

What this patch does: instead of targeting EpicMMOSystem or any specific mod, it patches vanilla EnemyHud.ShowHud itself with a Finalizer, so it catches the exception no matter which installed mod's postfix throws it, then clears the stale m_huds entry (and its leftover HUD GameObject) so the next call rebuilds a clean one.


🐛 Bug 4 — Missing non-Latin script glyph warnings in TMP text

Vanilla/TMP-bundled fonts (e.g. Valheim-Prstartk, LiberationSans SDF) only cover Latin glyphs — Korean, Japanese, Chinese, Arabic, Hebrew, Thai, and other non-Latin scripts aren't in their own glyph table or fallback chain. Whenever player-authored non-Latin text — a nickname or guild name, for example — is rendered through a TMP_Text object using one of these fonts (e.g. EpicMMOSystem's nameplate/guild-name/info-panel objects), Unity logs a repeating "The character with Unicode value ... was not found in the [...] font asset..." warning and replaces the character with a blank space or a missing-glyph box (□). Valheim already ships a Noto-family font asset for every non-Latin script its own localization supports (NotoSansKR, NotoSansJP, NotoSansSC, NotoSansArabic, and 7 more, plus an emoji set) in its own game files, but none of them are wired into TMP's fallback list for arbitrary player-authored text.

What this patch does: finds each of Valheim's bundled per-language fonts and registers all of them into TMP's global fallback list (TMP_Settings.fallbackFontAssets) once per session. No new font is bundled — it reuses resources Valheim already ships — and it fixes rendering for any mod's TMP text in any of those languages, not just Korean and not just one specific mod's.


🐛 Bug 5 — KeenCombat skill tooltip shown on non-weapon items

KeenCombat appends a weapon skill block (e.g. "BLINK STRIKE", description, cooldown) to the end of every ItemDrop.ItemData.GetTooltip overload. When another mod gives materials, food or mod-added items a weapon skill type, those non-weapon items get the same skill tooltip too. KeenCombat has no setting to turn this tooltip off.

What this mod does: a postfix that runs after KeenCombat's own and removes the appended skill block only from items that are not weapons (one-handed / two-handed / bow-crossbow). Real weapons keep their skill tooltip. Does nothing if KeenCombat is not installed.


Cleanup, not evasion. For the exception-catching patches, the exception itself still fires once — this mod catches that one occurrence and then actually deletes the broken state (the dead dictionary/set entry) that caused it. The same entry can't throw again. It's not just hiding the log while leaving the broken state in place. Each patch only touches its own target method (or, if that target isn't present, does nothing at all) — no other mod's code is modified.


📥 Installation
  1. Recommended: Install via r2modman/Thunderstore
  2. Manual: Copy NullReferenceFix.dll into BepInEx/plugins/

These bugs are local state, not something synced over the network — the server and each client can hit them independently. Installing on only one side only fixes that side. In multiplayer, install it on the server and every connected client to be safe.


🎮 My Other Mods / 함께 즐기면 더 좋은 모드

🌳 CaptainSkillTree

스킬트리·직업·액티브 스킬·길드/파티 시스템을 추가하는 모드입니다. 모드가 많아질수록 이 수정 모드가 도움이 됩니다.

Adds a skill tree, job classes, active skills and a guild/party system. This fix is most useful in large modpacks like this.

👹 MonsterModifiers

몬스터에게 랜덤 속성을 부여해 난이도를 넓혀 주는 모드입니다.

Gives monsters random modifiers to widen the difficulty.

🎵 CaptainAudio

음악·환경음·효과음을 원하는 파일로 교체하는 모드입니다.

Replaces music, ambient sounds and sound effects with your own audio files.

🪦 FindTomb

사망 후 무덤 위치를 지도 핀과 방향 안내로 알려 줍니다.

Shows where your grave is with map pins and a direction guide after you die.

🏰 Captain Territorial

거점 구역의 건축·상호작용·침입을 제어하는 영토 와드 모드입니다.

A territory ward mod that controls building, interaction and intrusion inside a zone.

🗺️ PotalMap

지도에서 포탈을 클릭해 이동하고, 공개/개인/길드 접근 모드를 지원하는 모드입니다.

Teleport by clicking portals on the map, with Public/Private/Guild access modes.


📝 Credits / 크레딧

  • Developer / 개발자: KorCaptain
  • Framework / 프레임워크: BepInEx, Harmony

💬 Support / 지원


📜 License / 라이선스

Developer - KorCaptain


Enjoy a quieter log file! / 조용해진 로그를 즐기세요!

CHANGELOG

Changelog

2026-11-07 (v1.0.49)

  • A tooltip taller than the screen is no longer split into a second window on its right. It stays a single panel pinned to the top of the screen at screen height, shows the lines that fit, and the mouse wheel scrolls the text up and down (3 lines per notch) while the pointer stays on the item. Tooltips that fit on the screen are untouched. Adds the UnityEngine.InputLegacyModule reference for the wheel input.

한국어

  • 화면보다 긴 툴팁이 오른쪽에 둘째 창으로 나뉘어 나오던 동작을 없앴습니다. 이제 하나의 패널을 화면 상단에 화면 높이로 고정하고 들어가는 줄만 보여 주며, 마우스를 아이템 위에 둔 채 휠로 위/아래 스크롤합니다(칸당 3줄). 화면에 들어가는 툴팁은 그대로입니다. 휠 입력을 위해 UnityEngine.InputLegacyModule 참조를 추가했습니다.

2026-11-06 (v1.0.47)

  • Stops the repeating Missing prefab hash warnings and the lag they cause when a client joins a modded server without all of the server's mods. Vanilla ZNetScene.CreateObject returns null for a ZDO whose prefab does not exist but never marks it created, so every 33 ms it re-sorts and retries every such ZDO and logs the warning again (tens of thousands of lines in seconds). A Prefix now checks the prefab first; on a client a missing one is marked created once so it is skipped from then on, and the per-ZDO warning is replaced by one summary line every 10 s (hashes at debug level). Servers/hosts keep vanilla behavior (the invalid ZDO is still destroyed). ZDOs with a valid prefab take the vanilla path unchanged.

한국어

  • 서버의 모드를 다 설치하지 않은 클라이언트가 모드 서버에 접속할 때 반복되던 Missing prefab hash 경고와 그로 인한 랙을 막습니다. 바닐라 ZNetScene.CreateObject는 프리팹이 없는 ZDO에 null만 반환하고 생성 완료로 표시하지 않아, 33ms마다 해당 ZDO를 전부 다시 정렬·재시도하며 경고를 또 찍습니다(몇 초에 수만 줄). 이제 Prefix에서 프리팹을 먼저 확인해, 클라이언트는 프리팹이 없는 ZDO를 한 번만 생성 완료로 표시해 이후 건너뛰고, ZDO별 경고 대신 10초마다 요약 1줄만 남깁니다(해시는 디버그 로그). 서버/호스트는 바닐라 동작(잘못된 ZDO 파괴)을 유지하며, 프리팹이 정상인 ZDO는 바닐라 경로 그대로입니다.

2026-11-05 (v1.0.46)

  • Stops the repeating NullReferenceException from Procreation.Procreate (logged every update interval by the affected breeding animal). Procreate() dereferences the cached Tameable and the resolved self/offspring prefabs without null checks, so a creature that has a Procreation component but no Tameable (or an offspring prefab that does not resolve) throws on every tick. A Finalizer on the vanilla method now swallows the exception and logs once per creature name which field was null, so the mod that breaks the prefab can be identified. Healthy animals are unaffected.

한국어

  • 번식 동물이 갱신 주기마다 반복해서 찍던 Procreation.Procreate의 NullReferenceException을 막습니다. Procreate()는 캐시된 Tameable과 자기/새끼 프리팹을 null 검사 없이 사용하므로, Procreation은 있는데 Tameable이 없거나 새끼 프리팹이 해석되지 않는 생물은 매 틱마다 예외가 납니다. 바닐라 메서드에 Finalizer를 걸어 예외를 삼키고, 생물 이름별로 어떤 필드가 null이었는지 1회만 로그에 남겨 프리팹을 망가뜨리는 모드를 찾을 수 있게 했습니다. 정상 동물은 영향이 없습니다.

2026-11-03 (v1.0.44)

  • Targets lag that builds up slowly over a session and clears on reconnect (worst while building or using chests). AzuCraftyBoxes walks its static container set on every recipe/build check but never removes destroyed containers unless one is demolished normally, so chunk-unloaded chests pile up; they are now pruned every 30s (live containers untouched, no-op without AzuCraftyBoxes). Also adds an opt-in diagnostic (config Diagnostics > Enabled, off by default) that logs frame time, >100ms hitches, memory, ping and object counts (materials, textures, meshes, particles, lights, audio, rigidbodies, colliders, containers, characters, ZDOs) every 60s and writes a SUSPECT warning, with the biggest growing names, for any metric that rose in each of the last 4 samples, to pin down what causes slow lag.

한국어

  • 접속 후 시간이 지나며 서서히 쌓이고 재접속하면 풀리는 랙(건축·상자 작업 시 심함)에 대응합니다. AzuCraftyBoxes는 제작/건축 확인마다 정적 컨테이너 목록을 전부 순회하는데 파괴된 컨테이너는 정상 철거가 아니면 목록에서 지우지 않아 청크 언로드된 상자가 계속 쌓입니다. 30초마다 파괴된 항목만 정리합니다(살아있는 컨테이너는 그대로, AzuCraftyBoxes가 없으면 동작 안 함). 또한 선택형 진단 기능(Config Diagnostics > Enabled, 기본 꺼짐)을 추가해 켜면 60초마다 프레임 시간, 100ms 초과 끊김 횟수, 메모리, 핑, 오브젝트 개수(머티리얼·텍스처·메시·파티클·라이트·오디오·리지드바디·콜라이더·컨테이너·캐릭터·ZDO)를 로그로 남깁니다. 최근 4번 샘플 연속 증가한 항목은 늘어난 이름 상위 목록과 함께 SUSPECT 경고로 알려 랙 원인을 특정할 수 있게 합니다.

2026-11-02 (v1.0.39)

  • Restores the two-column split for item tooltips taller than the screen (the screen no longer shakes while hovering). It is a UITooltip.LateUpdate postfix with Priority.Last, so it runs after vanilla's clamp and every other mod's tooltip patch (e.g. TooltipExpansion) and its layout is the final one; tooltips that fit are left untouched. The first column fills the screen height, the second column to its right holds only the overflowing lines (open rich-text tags carried over), bottom-aligned to the first. Everything is guarded and wrapped in try/catch so it can never throw from the per-frame update (the cause of the NullReferenceException that got the old version removed in v1.0.35); on any failure the tooltip is left as it was and one warning is logged. AAA_Crafting's RecipeHoverTooltip is not touched.

한국어

  • 화면보다 큰 아이템 툴팁을 2열로 나누는 처리를 다시 적용합니다(마우스를 올려도 화면이 흔들리지 않음). UITooltip.LateUpdate의 Priority.Last Postfix라서 바닐라 보정과 다른 모드(TooltipExpansion 등)의 툴팁 패치가 모두 끝난 뒤 실행되어 이 모드의 배치가 최종값이 되며, 화면에 들어가는 툴팁은 건드리지 않습니다. 첫 열은 화면 높이를 가득 채우고 오른쪽 둘째 열에는 넘친 줄만(열려 있던 리치텍스트 태그 이어받음) 첫 열 아래선에 맞춰 표시합니다. 모든 접근에 null 가드와 try/catch를 넣어 매 프레임 업데이트에서 예외가 나지 않게 했고(v1.0.35에서 구버전이 제거된 NullReferenceException 대응), 실패하면 툴팁을 그대로 두고 경고를 1회만 남깁니다. AAA_Crafting의 RecipeHoverTooltip은 건드리지 않습니다.

2026-11-02 (v1.0.37)

  • Fixes the repeated "Renderer 'Alabarda ...' is registered with more than one LODGroup" warning (and the lag from it) seen with Warfare's AtgeirFlint_TW. VisEquipment.UpdateLodgroup now leaves out renderers that another LODGroup under the player's visual already owns; when vanilla's check misses none, the original runs unchanged.

한국어

  • Warfare AtgeirFlint_TW 장착 시 반복되던 "Renderer 'Alabarda ...' is registered with more than one LODGroup" 경고와 그로 인한 랙을 수정합니다. VisEquipment.UpdateLodgroup이 플레이어 비주얼 아래 다른 LODGroup이 이미 가진 렌더러를 플레이어 그룹에서 제외하며, 바닐라 검사가 놓친 렌더러가 없으면 원본을 그대로 실행합니다.

2026-11-01 (v1.0.35)

  • Removes the tall-tooltip handling (two-column split of oversized UITooltips and centering of AAA_Crafting's RecipeHoverTooltip). It threw a NullReferenceException on crafting-recipe hover, and other tooltip mods already handle oversized tooltips with a scroll view. Tooltips now behave as in vanilla.

한국어

  • 큰 툴팁 처리(화면보다 큰 UITooltip의 2열 분할, AAA_Crafting RecipeHoverTooltip의 중앙 정렬)를 제거합니다. 제작 레시피 호버에서 NullReferenceException이 났고, 화면을 넘는 툴팁은 다른 툴팁 모드가 이미 스크롤 뷰로 처리하고 있어 바닐라 동작으로 되돌립니다.

2026-11-01 (v1.0.33)

  • Reverts the ItemDrawers LocalizedName patch (v1.0.30 ~ v1.0.32) and the MusicMan StartMusic throttle (v1.0.29) after server lag (items not going into chests, drops not being picked up) got worse following those releases. No cause was found in the logs; removed as a precaution until it can be isolated.

한국어

  • 이 패치들이 들어간 뒤 서버 랙(아이템이 상자에 안 들어감, 드랍 줍기 실패)이 심해져 ItemDrawers LocalizedName 패치(v1.0.30 ~ v1.0.32)와 MusicMan StartMusic 스로틀(v1.0.29)을 되돌립니다. 로그에서 원인은 확인되지 않았으며, 원인을 가릴 때까지 예방 차원에서 제거합니다.

2026-10-31 (v1.0.30 ~ v1.0.32)

  • Fixes ItemDrawers' DrawerComponent.LocalizedName throwing a KeyNotFoundException every frame while the drawer window is open when the drawer holds an item that no longer exists in ObjectDB (removed/missing mod item). The raw prefab name is shown instead and a warning is logged once per missing item. Does nothing if ItemDrawers is not installed.

한국어

  • 서랍(ItemDrawers)에 ObjectDB에 더 이상 없는 아이템(제거/누락된 모드 아이템)이 들어 있을 때, 서랍 창을 여는 동안 DrawerComponent.LocalizedName이 매 프레임 KeyNotFoundException을 내던 문제를 고칩니다. 대신 원본 프리팹 이름을 표시하고 누락된 아이템마다 경고를 1회만 남깁니다. ItemDrawers가 없으면 아무 일도 하지 않습니다.

2026-10-31 (v1.0.29)

  • Stops the per-frame "Starting music ..." log/CPU storm that happens when Windows changes the audio device and Unity fails to re-initialize its sound system (observed ~355,000 log lines in one session and growing lag). Repeated restarts of the same music within 2 seconds while nothing is playing are skipped and a one-time warning is logged. Sound itself is not restored by this - restart the game after an audio device change.

한국어

  • Windows 오디오 장치가 바뀌고 유니티 사운드 시스템 재초기화가 실패했을 때 매 프레임 "Starting music ..." 로그가 찍히며 랙이 누적되던 현상을 차단합니다(한 세션에서 약 35.5만 줄 관측). 아무것도 재생 중이 아닐 때 같은 음악을 2초 안에 다시 시작하는 요청은 건너뛰고 경고를 1회만 남깁니다. 소리 자체가 복구되지는 않으니 오디오 장치 변경 후에는 게임을 재시작하세요.

2026-10-06 (v1.0.26)

  • Removes the weapon skill text ("BLINK STRIKE" etc.) that KeenCombat appends to every item tooltip from non-weapon items (an ItemData.GetTooltip postfix that runs after KeenCombat's own). Real weapons keep their skill tooltip; does nothing if KeenCombat is not installed.

한국어

  • KeenCombat이 모든 아이템 툴팁에 붙이는 무기 스킬 설명("BLINK STRIKE" 등)을 무기가 아닌 아이템에서 제거합니다(KeenCombat 패치 뒤에 실행되는 ItemData.GetTooltip Postfix). 실제 무기의 스킬 툴팁은 유지되고, KeenCombat이 없으면 아무 일도 하지 않습니다.

2026-10-04 (v1.0.25)

  • Removed the ZSFX orphan-cleanup patch (bug 4 in earlier README versions) and its README section. It was already not compiled into the mod: destroying vanilla sound/effect objects this way caused endless loading screens in a similar case, so it is intentionally dropped. The ZSFX entries of earlier versions below describe a patch that is no longer part of the mod.
  • Fixed a compiler null-reference warning in the tall-tooltip patch (no behavior change).

한국어

  • ZSFX 고아 오브젝트 정리 패치(이전 README의 버그 4)와 README 섹션을 제거했습니다. 이미 모드에 컴파일되어 있지 않던 패치이며, 바닐라 사운드/이펙트 오브젝트를 이런 식으로 Destroy()하면 유사한 사례에서 무한 로딩이 발생해 의도적으로 제외했습니다. 아래 이전 버전의 ZSFX 항목은 현재 모드에 포함되지 않은 패치에 대한 설명입니다.
  • 큰 툴팁 패치의 컴파일러 null 참조 경고를 수정했습니다(동작 변화 없음).

2026-10-04 (v1.0.24)

  • Fixed the same shaking/cut-off tooltip problem for the item hover tooltip of the crafting window's item list (Craft/Upgrade tabs) added by Azumatt's AAA_Crafting (RecipeHoverTooltip, a separate class from vanilla UITooltip). That tooltip is now always shown centered on the screen, and when it is taller than the screen it is split into two columns exactly like inventory tooltips (first column fills the screen, the overflow goes to a second column on the right, aligned to the bottom). Does nothing if AAA_Crafting is not installed.

한국어

  • Azumatt AAA_Crafting이 추가하는 제작창 아이템 목록(제작/업그레이드 탭)의 호버 툴팁(RecipeHoverTooltip, 바닐라 UITooltip과 별개 클래스)도 화면보다 길 때 흔들리고 잘리던 문제를 수정했습니다. 이 툴팁은 이제 항상 화면 가운데에 표시되며, 화면보다 길면 인벤토리 툴팁과 동일하게 2열로 분할됩니다(1열은 화면 가득, 넘친 줄은 오른쪽 2열에 아래 정렬). AAA_Crafting이 없으면 아무 동작도 하지 않습니다.

2026-10-03 (v1.0.23)

  • Fixed the screen shaking when hovering an item whose tooltip is taller than the screen (long tooltips from mods that add many stats/effects). Vanilla's Utils.ClampUIToScreen applies the top and bottom corrections one after the other, so a panel taller than the screen was pushed back and forth every frame. Such tooltips are now split into two columns: the first column fills the screen height and the second column opens to its right holding only the lines that did not fit, sized to its own content and aligned to the bottom edge of the first column so it grows upward and the reading flow continues from where the first column ends. The pair is pinned to the top of the screen. Also works with scroll-view tooltip mods such as Azumatt's TooltipExpansion, whose fixed scroll-view height is overridden to match each column. Tooltips that already fit are left untouched.

한국어

  • 화면보다 큰 툴팁이 뜨는 아이템에 마우스를 올리면 화면이 반복적으로 흔들리던 문제를 수정했습니다(스탯/효과를 많이 추가하는 모드로 툴팁이 길어지는 경우). 바닐라 Utils.ClampUIToScreen이 위·아래 보정을 연달아 적용해, 화면보다 큰 패널이 매 프레임 앞뒤로 밀리던 것이 원인입니다. 이제 이런 툴팁은 두 열로 나뉩니다: 첫 번째 열은 화면 높이를 가득 채우고, 두 번째 열은 그 오른쪽에 화면에 들어가지 않은 줄만 자기 내용 크기에 맞게 표시하되 첫 번째 열의 아래쪽 선에 맞춰 위로 자라도록 해 읽는 흐름이 첫 열 끝에서 이어지며, 두 열은 화면 상단에 고정됩니다. Azumatt의 TooltipExpansion 같은 스크롤 뷰 툴팁 모드와도 함께 동작합니다(고정된 스크롤 뷰 높이를 각 열에 맞게 덮어씀). 화면에 들어가는 툴팁은 전혀 건드리지 않습니다.

2026-09-09 (v1.0.18)

  • Verified compatibility with the Valheim Deep North (1.0) update (Unity 6000.0.75f1). Rebuilt against the freshly regenerated publicized reference DLLs and confirmed every reflection target this mod relies on (EnemyHud.m_huds, ZNetScene.m_instances, TextMeshProUGUI.LoadFontAsset/TextMeshPro.LoadFontAsset) is unchanged - no code changes were needed.

한국어

  • 발헤임 Deep North(1.0) 업데이트(Unity 6000.0.75f1)와의 호환성 확인. 새로 재생성한 publicize 참조 DLL로 재빌드했고, 이 모드가 의존하는 리플렉션 대상(EnemyHud.m_huds, ZNetScene.m_instances, TextMeshProUGUI.LoadFontAsset/TextMeshPro.LoadFontAsset)이 전부 그대로임을 확인 — 코드 변경 없음.

2026-08-17 (v1.0.17)

  • Initialize() now makes one immediate registration attempt before subscribing to the reactive log-warning listener added below in v1.0.16. If a target Noto fallback font is already resident in memory at Awake() time (e.g. loaded earlier by the game's own localization or another mod), it gets registered right away - so that script's very first missing-glyph warning/freeze is avoided entirely instead of only being caught after it already happened once. Falls straight through to the existing reactive subscription if nothing is found yet, with no retry timer of its own.

한국어

  • Initialize()가 바로 위 v1.0.16에서 추가한 반응형 로그 리스너를 구독하기 전에, 1회 즉시 등록을 먼저 시도하도록 추가. 대상 Noto 폴백 폰트가 Awake() 시점에 이미 메모리에 로드되어 있다면(예: 발헤임 자체 로컬라이제이션이나 다른 모드가 먼저 로드해둔 경우) 그 즉시 등록되어, 해당 스크립트의 첫 번째 글리프 누락 경고/프리징 자체가 아예 발생하지 않습니다. 아직 못 찾았다면 기존 반응형 구독으로 그대로 넘어가며, 별도의 재시도 타이머는 없습니다.

2026-08-17 (v1.0.16)

  • Replaced the polling coroutine (retried every 2s, up to 30 times) from the fix below with an event-driven one: Plugin.Awake() now subscribes once to Application.logMessageReceived, and font registration only runs when TMP actually logs a missing-glyph warning. Since that warning re-fires every time the same text re-renders, reacting to it is self-retrying without a separate timer, and outside of a session where it never happens, this does no background work at all. The handler unsubscribes itself once every target font is registered.

한국어

  • 아래 수정에 쓰였던 폴링 코루틴(2초 간격, 최대 30회 재시도)을 이벤트 반응형으로 교체: Plugin.Awake()가 Application.logMessageReceived를 한 번만 구독해두고, TMP가 실제로 글리프 누락 경고를 로그로 찍을 때만 폰트 등록을 시도합니다. 이 경고는 같은 텍스트가 다시 그려질 때마다 반복해서 찍히므로 별도 타이머 없이 자연스럽게 재시도되고, 경고가 한 번도 안 뜨는 세션에서는 아무 백그라운드 작업도 하지 않습니다. 타겟 폰트를 전부 등록하면 핸들러가 스스로 구독을 해제합니다.

2026-08-17 (v1.0.15)

  • Extended the previous Korean-only TMP fallback fix (below) to every non-Latin script Valheim itself ships a font for: Arabic, Armenian, Bengali, Devanagari, Georgian, Hebrew, Japanese, Korean, Malayalam, Simplified Chinese, Thai, plus Noto's emoji set. TMPKoreanFallbackFontRegistrar → TMPLocalizationFallbackFontRegistrar; the single-font lookup became a multi-font one that registers every bundled Noto font it can find into TMP's global fallback list, so any of those scripts render instead of showing blank spaces or missing-glyph boxes — not just Korean.

한국어

  • 이전에 한국어 전용이었던 TMP 폴백 수정(아래)을, 발헤임이 자체적으로 폰트를 내장한 모든 비라틴 스크립트로 확장: 아랍어·아르메니아어·벵골어·데바나가리(힌디)·조지아어·히브리어·일본어·한국어·말라얄람어·중국어(간체)·태국어 + 이모지. TMPKoreanFallbackFontRegistrar → TMPLocalizationFallbackFontRegistrar로 이름 변경했고, 단일 폰트 탐색이었던 로직을 다중 폰트 탐색으로 바꿔 발헤임에 내장된 Noto 계열 폰트를 찾는 대로 전부 TMP 전역 폴백 목록에 등록하도록 했습니다 — 한글뿐 아니라 해당 스크립트 전부가 공백/네모 대신 정상 표시됩니다.

2026-08-17 (v1.0.14)

  • Found & cleaned up: vanilla/TMP-bundled fonts (Valheim-Prstartk, LiberationSans SDF) lack Hangul glyphs, so player-authored or mod-added Korean text rendered through TMP_Text objects using them — most visibly EpicMMOSystem's nameplate/guild-name/info-panel text — showed up as blank spaces or missing-glyph boxes with repeating "character ... was not found in the [...] font asset..." warnings. Registers Valheim's own bundled NotoSansKR-Regular SDF font (already shipped for the game's Korean localization) into TMP's global fallback list once per session, via a short polling coroutine started from Plugin.Awake() rather than a Harmony hook on LoadFontAsset (a live session logged 500+ of these warnings with that hook never firing at all, proving it isn't actually invoked during normal play) — no new font bundled, fixes Korean rendering for any mod's TMP text regardless of which font it's assigned.

한국어

  • 바닐라·TMP 내장 폰트(Valheim-Prstartk, LiberationSans SDF)에 한글 글리프가 없어, 이런 폰트를 쓰는 TMP_Text 오브젝트(EpicMMOSystem의 네임플레이트/길드명/정보 패널 텍스트에서 가장 두드러짐)를 통해 표시되는 플레이어·모드 텍스트가 공백 또는 네모(□)로 나오고 "character ... was not found in the [...] font asset..." 경고가 반복되던 문제 발견 및 정리. 발헤임이 자체 한국어 로컬라이제이션용으로 이미 내장한 NotoSansKR-Regular SDF 폰트를 세션당 한 번 TMP 전역 폴백 목록에 등록하도록 했는데, 처음엔 LoadFontAsset에 거는 Harmony 훅으로 구현했다가 실제 플레이 세션에서 이 훅이 500회 넘게 경고가 발생하는 동안 단 한 번도 호출되지 않는 것을 로그로 확인 — 정상 플레이 중에는 아예 호출되지 않는 메서드였음이 드러나, Plugin.Awake()에서 시작하는 짧은 폴링 코루틴 방식으로 교체함. 새 폰트 번들링 없이, 어떤 모드의 TMP 텍스트든 할당된 폰트와 무관하게 한글이 정상 표시되도록 정리.

2026-08-16 (v1.0.9)

  • Found & cleaned up: a vanilla engine gap in ZSFX (Valheim's sound-playback component) with no self-destruct logic at all. Once a ZSFX-carrying vanilla SFX prefab finishes playing, nothing ever destroys it if it isn't tracked by a ZNetView — a pattern many mods hit when they instantiate a vanilla sound effect locally (e.g. ZNetScene.GetPrefab + Instantiate to play a one-off sound), most visibly with sound-heavy Mage-class skill/weapon mods repeatedly casting effects. Worse, MonoUpdaters.Update() iterates the entire static ZSFX.Instances list every frame, so each leaked instance adds a permanent per-frame cost — explaining a progressive slowdown that eventually freezes the game during Resources.UnloadUnusedAssets() (temporarily "fixed" by relogging, which force-reloads the scene). Not caused by any specific mod; it's an engine-level defect. Added a Postfix patch on ZSFX.CustomUpdate that destroys an instance only once it has finished playing, isn't looping, is past its initial play-delay window, and has no ZNetView — never touching anything that could be network-synced.

한국어

  • ZSFX(발헤임 기본 사운드 재생 컴포넌트)에 자체 소멸 로직이 아예 없는 바닐라 엔진 빈틈 발견 및 정리: ZSFX가 붙은 발헤임 기본 SFX 프리팹은 재생이 끝나도 ZNetView로 추적되지 않는 한 아무도 파괴해주지 않습니다 — 발헤임 기본 사운드를 로컬로 즉석 재생하는(ZNetScene.GetPrefab + Instantiate) 패턴을 쓰는 모드에서 흔히 발생하며, 사운드가 화려한 마법사 계열 스킬/무기 모드를 반복 사용할 때 특히 두드러집니다. 더 나아가 MonoUpdaters.Update()가 매 프레임 static ZSFX.Instances 리스트 전체를 순회하기 때문에, 새어나간 인스턴스 하나하나가 영구적인 프레임당 비용을 추가해 — 플레이 시간이 길어질수록 점점 느려지다 결국 Resources.UnloadUnusedAssets() 시점에 게임이 멈추는 증상으로 이어집니다(리접속으로 씬이 강제 재로드되면 일시적으로 해결됨). 특정 모드가 아닌 엔진 자체의 결함입니다. ZSFX.CustomUpdate에 Postfix 패치를 추가해, 재생이 끝났고·반복재생이 아니고·초기 재생 지연 구간도 지났고·ZNetView가 없는 인스턴스만 파괴하도록 했습니다 — 네트워크 동기화 대상은 절대 건드리지 않습니다.

1.0.7 - 1.0.8

  • Found & cleaned up: a recurring TextMeshPro warning ("The LiberationSans SDF Font Asset was not found. There is no Font Asset assigned to <name>."), most visibly on EpicMMOSystem's mmoname/guildname player nameplate text objects. Some mods create TMP text objects without ever assigning a font asset; TMP's own fallback tries to load a "LiberationSans SDF" resource that Valheim's build doesn't ship, fails, and logs the warning every time that text object re-initializes (e.g. each OnEnable). Rather than special-casing those two object names, this patches TextMeshProUGUI.LoadFontAsset/TextMeshPro.LoadFontAsset directly (the actual root cause, shared by any unfonted TMP text in the game) with a Prefix that assigns an already-loaded, valid TMP font asset before the vanilla check runs, so the normal code path executes instead of the warn-and-bail one.

한국어

  • 반복되는 TextMeshPro 경고("The LiberationSans SDF Font Asset was not found. There is no Font Asset assigned to <이름>.") 발견 및 정리: EpicMMOSystem의 플레이어 네임플레이트 mmoname/guildname 텍스트 오브젝트에서 가장 두드러지게 나타났습니다. 일부 모드가 폰트를 전혀 할당하지 않은 채 TMP 텍스트 오브젝트를 생성하면, TMP의 기본 폴백 로직이 발헤임 빌드에는 없는 "LiberationSans SDF" 리소스를 로드하려다 실패하고, 그 텍스트 오브젝트가 재초기화될 때마다(예: 매 OnEnable) 같은 경고를 반복 출력합니다. 해당 오브젝트 이름을 콕 집어 처리하는 대신, 실제 근본 원인인 TextMeshProUGUI.LoadFontAsset/TextMeshPro.LoadFontAsset(게임 내 폰트 미할당 TMP 텍스트 전체에 공통되는 지점)을 직접 패치했습니다. 바닐라 체크가 실행되기 전에 이미 로드되어 있는 유효한 TMP 폰트 애셋을 미리 할당하는 Prefix를 추가해, 경고 후 중단되는 경로 대신 정상 코드 경로를 타도록 했습니다.

1.0.6

  • Found & cleaned up: a conflict between EpicMMOSystem (WackyMole.EpicMMOSystem) and factions/marketplace-style mods. EpicMMOSystem's DataMonsters.MonsterColorTexts patch (player PvP name coloring) was throwing a repeating NullReferenceException every frame when a separate factions/marketplace-style mod force-called EnemyHud.ShowHud directly from its own EnemyHud.LateUpdate patch, targeting a Character whose HUD entry should already have been torn down (logged out / despawned). Instead of targeting EpicMMOSystem or any specific mod, this patches vanilla EnemyHud.ShowHud itself with a Finalizer so it catches the exception no matter which installed mod's postfix throws it, and directly cleans up the stale m_huds entry (and its leftover HUD GameObject) so the next call rebuilds a clean one.

한국어

  • EpicMMOSystem(WackyMole.EpicMMOSystem) ↔ 팩션/마켓플레이스 계열 모드 충돌 발견 및 정리: EpicMMOSystem의 DataMonsters.MonsterColorTexts(플레이어 PvP 이름 색상 표시) 패치가, 팩션/마켓플레이스 계열의 다른 모드가 EnemyHud.LateUpdate 패치 안에서 EnemyHud.ShowHud를 직접 강제 재호출할 때 이미 정리됐어야 할(로그아웃/디스폰된) 캐릭터의 남은 HUD 항목을 참조하면서 매 프레임 NullReferenceException을 반복 발생시키던 문제를 발견했습니다. EpicMMOSystem이나 특정 모드를 콕 집어 패치하는 대신 발헤임 기본 EnemyHud.ShowHud에 Finalizer를 걸어, 어떤 모드의 postfix에서 터지든 잡아내고 원인이 된 오래된 m_huds 항목(과 남은 HUD GameObject)을 직접 정리해서 다음 프레임에 정상적으로 새로 만들어지도록 청소 처리했습니다.

1.0.4 - 1.0.5

  • Found & cleaned up: a bug in AzuCraftyBoxes (Azumatt.AzuCraftyBoxes). AzuCraftyBoxes keeps a static HashSet<Container> of every crafting container it has ever seen nearby, but some destroy paths (e.g. a zone/chunk unload) destroy the GameObject without going through Container.OnDestroyed, leaving a Unity-destroyed (fake-null) Container sitting in the set. The recipe check that runs every frame while the crafting menu is open then dereferenced that dead entry, throwing NullReferenceException repeatedly. Added a patch (only active when AzuCraftyBoxes is installed) that catches the exception and directly removes the destroyed Container entries from the set.

한국어

  • AzuCraftyBoxes(Azumatt.AzuCraftyBoxes) 모드 문제 발견 및 정리: AzuCraftyBoxes가 근처에서 본 모든 제작함을 정적 HashSet<Container>에 계속 쌓아두는데, 구역/청크 언로드 등 일부 파괴 경로가 Container.OnDestroyed 정리 로직을 거치지 않고 GameObject를 바로 파괴해버려서 이미 죽은(fake-null) Container가 세트에 남아있는 것을 발견했습니다. 제작 메뉴가 열려 있는 동안 매 프레임 실행되는 재료 확인 로직이 이 죽은 항목을 건드리며 NullReferenceException을 반복 발생시켰습니다. AzuCraftyBoxes가 설치된 경우에만 활성화되는 패치를 추가해 해당 예외를 잡아내고, 파괴된 Container 항목들을 세트에서 직접 제거해 정리했습니다.

1.0.3 (Hotfix)

  • Fixed: the plugin DLL was accidentally missing from the previous releases (1.0.1, 1.0.2), so the mod did not work at all. This release restores the DLL.

한국어

  • 이전 배포(1.0.1, 1.0.2)에서 실수로 플러그인 DLL이 패키지에서 누락되어 모드가 전혀 동작하지 않던 문제를 수정했습니다.

1.0.1

  • Found & cleaned up: a vanilla Valheim engine bug (initial release). If a ZNetView's GameObject is destroyed by something else in the same frame that vanilla ZNetScene.RemoveObjects tries to clean it up, the method throws a NullReferenceException before it can remove the stale entry from its internal tracking dictionary (m_instances) — so the same exception then repeats every frame for the rest of the session. Not caused by any specific mod; it's an engine-level defect. Added a Finalizer patch on ZNetScene.RemoveObjects that catches the exception and directly removes the already-destroyed (stale) ZNetView entry from m_instances.

한국어

  • 바닐라 발헤임 엔진 문제 발견 및 정리 (최초 배포): 같은 프레임 안에서 어떤 ZNetView의 GameObject가 다른 경로로 먼저 파괴되면, 바닐라 ZNetScene.RemoveObjects가 그 오브젝트를 내부 추적 딕셔너리(m_instances)에서 제거하기도 전에 NullReferenceException을 던지고, 그 결과 문제의 entry가 끝내 제거되지 못한 채 남아 다음 프레임에도 똑같은 예외가 세션이 끝날 때까지 무한 반복되는 것을 발견했습니다. 특정 모드가 아닌 발헤임 엔진 자체의 결함입니다. ZNetScene.RemoveObjects에 Finalizer 패치를 추가해 해당 예외를 잡아내고, 이미 파괴된(fake-null) ZNetView entry를 m_instances에서 직접 제거해 정리했습니다.