Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Captain territorial
Valheim Territory Ward Mod - Zone-based building, interaction, and intrusion control
CHANGELOG
Changelog / 변경 로그
[1.0.22] - 2026-07-13
Files Modified / 수정 파일
Config.cs
- ✅improve1 : [Config.cs] Fuel consumption interval rescaled to start at 3 minutes for Lv1 and increase by 1 minute per level (Lv1=3 → Lv8=10), replacing the previous "interval = level number" (1~8) scale
- ✅improve1 : [Config.cs] 연료 소모 간격을 Lv1=3분 시작, 레벨업마다 1분씩 증가(Lv1=3 ~ Lv8=10)하도록 재조정 — 기존 "간격=레벨 숫자"(1~8분) 방식에서 변경
[1.0.21] - 2026-07-13
Files Modified / 수정 파일
Config.cs · InteractionBlockPatch.cs · TerritoryWardController.cs
- ✅improve1 : [Config.cs] Fuel system simplified — secondary fuel is now always Resin at every level, and the varied non-wood secondary items (GreydwarfEye/Entrails/Feathers/Ooze/JotunPuffs/Grausten/FreezeGland) were removed. Primary fuel is now a regional wood per biome (Wood/RoundLog/ElderBark/FineWood/YggdrasilWood); Mountain (no regional wood) uses Obsidian, and Ocean/Ashlands (no regional wood) combine two wood types via a new optional 3rd fuel slot (fuel_tertiary). Amounts follow ceil(level/2) for the wood total
- ✅improve1 : [Config.cs] 연료 체계 단순화 — 모든 레벨의 보조 연료가 항상 수지로 통일되고, 레벨별로 제각각이던 비목재 보조 아이템(그레이드워프눈/창자/깃털/점액/요툰버섯/그라우스텐/얼음분비선)을 제거. 주 연료는 지역별 나무로 변경(나무/원목/고대나무껍질/경목/이그드라실나무). 산은 지역 나무가 없어 흑요석 사용, 바다/애쉬랜드는 지역 나무가 없어 나무 2종을 신규 3번째 연료 슬롯(fuel_tertiary)으로 합쳐서 요구. 나무 수량은 ceil(레벨/2) 규칙 적용
- ✅improve2 : [Config.cs] GetFuelTiers() no longer accumulates every tier up to the current level — it now returns only the base Lv1 tier plus the ward's own current-level tier (e.g. a Lv4 ward can only use Lv1 or Lv4 fuel, not Lv2/Lv3)
- ✅improve2 : [Config.cs] GetFuelTiers()가 더 이상 현재 레벨까지 모든 티어를 누적하지 않고, 기본 Lv1 티어 + 현재 레벨 자신의 티어 딱 2개만 반환하도록 변경 (예: Lv4 와드는 Lv1 또는 Lv4 연료만 사용 가능, Lv2/Lv3 연료는 사용 불가)
- ✅new1 : [TerritoryWardController.cs] ResolvedTier/consumption/hover-text methods extended to support an optional 3rd fuel item (NameC/AmountC) for the Ocean/Ashlands two-wood tiers
- ✅new1 : [TerritoryWardController.cs] ResolvedTier와 소모/호버텍스트 관련 메서드들에 선택적 3번째 연료 아이템(NameC/AmountC) 지원 추가 — 바다/애쉬랜드의 나무 2종 조합 티어용
- ✅fix1 : [InteractionBlockPatch.cs] The "Lv1~N 연료" hover label implied a continuous range, which is no longer accurate now that only 2 discrete tiers are ever selectable — changed to "Lv1/LvN 연료"
- ✅fix1 : [InteractionBlockPatch.cs] "Lv1~N 연료" 호버 라벨이 연속 범위를 암시했는데 이제 딱 2개 티어만 선택 가능해져 부정확해짐 — "Lv1/LvN 연료"로 변경
[1.0.20] - 2026-07-13
Files Modified / 수정 파일
InteractionBlockPatch.cs
- ✅fix1 : [InteractionBlockPatch.cs] The shield-active hover line used a raw
<color=cyan>tag while every other colored element in the same text used the {Cyan} ("#00FFFF") constant — TMP failed to parse this one and showed the literal tag text instead of coloring it. Now uses the same {Cyan} constant as the rest of the panel - ✅fix1 : [InteractionBlockPatch.cs] 실드 활성 중 표시 줄만 다른 곳과 다르게
<color=cyan>리터럴을 써서 TMP가 파싱하지 못하고 태그 글자가 그대로 노출되던 문제 수정 — 같은 패널 다른 곳에서 이미 정상 동작하는 {Cyan}("#00FFFF") 상수로 통일
[1.0.19] - 2026-07-13
Files Modified / 수정 파일
InteractionBlockPatch.cs · Localization.cs · TerritoryWardController.cs
- ✅new1 : [TerritoryWardController.cs] Deactivating the Lv5+ shield early now banks the remaining time (tw_shield_remaining) instead of discarding it — reactivating while banked time remains resumes for free (no Surtling Core consumed); RPC_ActivateShield now takes an explicit duration parameter so both a fresh 1-hour activation and a banked-time resume share the same RPC
- ✅new1 : [TerritoryWardController.cs] Lv5+ 실드를 만료 전에 끄면 남은 시간을 버리지 않고 배너킹(tw_shield_remaining)하도록 변경 — 배너킹된 시간이 있는 동안 재활성화하면 슈르트링 코어 소모 없이 무료로 재개됨. RPC_ActivateShield가 지속시간을 파라미터로 받도록 변경해 신규 1시간 활성화와 배너킹 재개를 같은 RPC로 처리
- ✅fix1 : [TerritoryWardController.cs] Shield dome VFX and actual protection radius were frozen at whatever level the ward was when the shield was first activated — ApplyLevel() now also updates the live ShieldGenerator's radius fields when the shield is active, so upgrading the ward while shielded grows the dome/protection immediately
- ✅fix1 : [TerritoryWardController.cs] 실드 돔 VFX와 실제 보호 반경이 최초 활성화 시점의 레벨 크기에 고정되던 문제 수정 — ApplyLevel()에서 실드가 켜져 있으면 ShieldGenerator의 반경 필드도 함께 갱신, 실드 켠 채로 업그레이드해도 즉시 커짐
- ✅improve1 : [InteractionBlockPatch.cs] Shield hover hint now shows a free "resume" hint (with banked minutes) instead of the item-cost hint when banked time is available
- ✅improve1 : [InteractionBlockPatch.cs] 배너킹된 잔여시간이 있을 때 호버텍스트가 아이템 요구 힌트 대신 무료 "재개" 힌트(남은 분 표시)를 보여주도록 변경
- ✅new2 : [Localization.cs] Added territoryward_shield_resumed / territoryward_shield_resume_hint (Korean/English)
- ✅new2 : [Localization.cs] territoryward_shield_resumed / territoryward_shield_resume_hint 키 추가 (한/영)
[1.0.18] - 2026-07-13
Files Modified / 수정 파일
InteractionBlockPatch.cs
- ✅fix1 : [InteractionBlockPatch.cs] Found the true root cause of the storage crash: InventoryGrid (a session-wide singleton reused for every container) defaults m_width/m_height to 4 — if the ward's storage happens to also be 4 wide the very first time any container is opened this session, the "size changed" check spuriously passes and the slot list (m_elements) is never built, causing GetElement() to fail (previously masked as a NullReferenceException instead of the crash). Added a Prefix on InventoryGrid.UpdateInventory() that invalidates m_width whenever m_elements.Count doesn't match width*height, forcing vanilla's own rebuild to run correctly
- ✅fix1 : [InteractionBlockPatch.cs] 창고 크래시의 진짜 원인을 찾음: InventoryGrid(세션 전체에서 재사용되는 싱글톤)의 m_width/m_height 기본값이 4라서, 이번 세션 첫 컨테이너가 마침 폭 4인 와드 창고면 "크기 변경" 감지가 우연히 통과되어 슬롯 리스트(m_elements)가 한 번도 생성되지 않고, 그 결과 GetElement()가 실패(이전엔 NullReferenceException으로 위장되어 나타남)하던 문제. InventoryGrid.UpdateInventory()에 Prefix를 추가해 m_elements 개수가 width*height와 다르면 m_width를 무효화, 바닐라 리빌드 로직이 정상적으로 실행되도록 강제
- ✅improve1 : [InteractionBlockPatch.cs] GetElement() safety-net patch no longer masks a fully-empty element list with a null fallback (which caused the NullReferenceException) — it now only clamps/falls back when elements exist, and lets the original exception surface otherwise
- ✅improve1 : [InteractionBlockPatch.cs] GetElement() 안전망이 m_elements가 완전히 비어있을 때 null로 폴백해 NullReferenceException을 유발하던 부분을 수정 — 요소가 있을 때만 clamp 후 폴백하고, 없으면 원본 예외를 그대로 노출
[1.0.17] - 2026-07-13
Files Modified / 수정 파일
InteractionBlockPatch.cs
- ✅fix1 : [InteractionBlockPatch.cs] Added a Harmony safety-net patch on InventoryGrid.GetElement() that catches any out-of-range gridPos index (root-caused fix in TerritoryWardController.cs may not cover every edge case) and falls back to slot 0 instead of throwing ArgumentOutOfRangeException, logging a warning for diagnosis instead of crashing
- ✅fix1 : [InteractionBlockPatch.cs] InventoryGrid.GetElement()에 Harmony 안전망 패치 추가 — gridPos 인덱스가 범위를 벗어나면(근본 수정으로 못 잡는 엣지 케이스 대비) ArgumentOutOfRangeException 대신 0번 슬롯으로 안전하게 폴백하고 경고 로그만 남김
[1.0.16] - 2026-07-13
Files Modified / 수정 파일
TerritoryWardController.cs
-
✅fix1 : [TerritoryWardController.cs] The Mathf.Max growth-only guard alone didn't fully prevent the storage crash — added active repositioning of any item whose saved gridPos falls outside the current width/height (via Inventory.FindEmptySlot) right after resizing, and persist via Container.Save() when this client owns the ward
-
✅fix1 : [TerritoryWardController.cs] 창고 크기를 줄이지 않는 것만으로는 크래시를 완전히 막지 못해, 리사이즈 직후 현재 width/height를 벗어난 gridPos를 가진 아이템을 Inventory.FindEmptySlot()으로 빈 칸에 재배치하도록 추가. 소유자 클라이언트인 경우 Container.Save()로 즉시 저장
[1.0.15] - 2026-07-13
Files Modified / 수정 파일
TerritoryWardController.cs
- ✅fix1 : [TerritoryWardController.cs] Fixed ArgumentOutOfRangeException crash when opening the fuel storage (InventoryGrid.GetElement indexing past m_elements when the grid was resized smaller than an item's saved gridPos) — storage resize now only grows (Mathf.Max against the current size), never shrinks
- ✅fix1 : [TerritoryWardController.cs] 연료 창고를 열 때 발생하던 ArgumentOutOfRangeException 크래시 수정 — 창고가 기존 아이템의 gridPos보다 작게 리사이즈되면서 InventoryGrid.GetElement()가 범위를 벗어난 인덱스에 접근하던 문제. 창고 크기는 이제 현재 크기 대비 Mathf.Max로만 적용되어 절대 줄어들지 않음
- ✅fix2 : [TerritoryWardController.cs] Shield VFX was looking up ShieldGenerator on the "Haldor" prefab, which doesn't have that component at all (confirmed against Jotunn's prefab list) — always failed and spammed a warning every frame while the shield was active. Now looks up "charred_shieldgenerator" (the vanilla piece that actually has ShieldGenerator), and the failure is now logged only once instead of every frame
- ✅fix2 : [TerritoryWardController.cs] 실드 VFX가 ShieldGenerator 컴포넌트가 아예 없는 "Haldor" 프리팹에서 찾으려 해서(Jotunn 프리팹 목록으로 확인) 매번 실패하고, 실드가 켜져 있는 동안 매 프레임 경고 로그가 쏟아지던 문제 수정 — 실제로 ShieldGenerator를 가진 바닐라 피스 "charred_shieldgenerator"에서 찾도록 변경하고, 실패해도 1회만 로그 남기도록 수정
[1.0.14] - 2026-07-13
Files Modified / 수정 파일
TerritoryWardController.cs
- ✅fix1 : [TerritoryWardController.cs] Storage grid not showing/rendering when opening the fuel container — added a defensive re-apply of ApplyLevel() right before opening the storage (Q key), so the resize is guaranteed fresh at open-time regardless of any Start()/RPC timing race
- ✅fix1 : [TerritoryWardController.cs] 연료 창고를 열었을 때 그리드가 안 보이던 문제 대응 — Q키로 창고를 여는 시점에 ApplyLevel()을 한 번 더 재적용해, Start()/RPC 타이밍과 무관하게 항상 최신 크기가 반영되도록 안전장치 추가
- ✅improve1 : [TerritoryWardController.cs] Added diagnostic logging in ApplyLevel()'s storage resize block (null container/inventory, and applied vs actual width/height) to pin down the root cause if the issue persists
- ✅improve1 : [TerritoryWardController.cs] ApplyLevel()의 창고 리사이즈 블록에 진단 로그 추가(컨테이너/인벤토리 null 여부, 적용값 vs 실제값) — 문제가 재현될 경우 원인을 바로 특정할 수 있도록
[1.0.13] - 2026-07-13
Files Modified / 수정 파일
SimpleVFX.cs · TerritoryWardController.cs · VFXManager.cs
- ✅new1 : [VFXManager.cs] Added PlayUpgradeEffect() — plays vfx_shieldgenerator_refuel + sfx_fader_bell on successful ward upgrade
- ✅new1 : [VFXManager.cs] PlayUpgradeEffect() 추가 — 와드 업그레이드 성공 시 vfx_shieldgenerator_refuel VFX + sfx_fader_bell 효과음 재생
- ✅new2 : [SimpleVFX.cs] Added PlayVFX() for playing arbitrary vanilla VFX prefabs by name (mirrors PlaySound's ZNetScene lookup + no-networking instantiate pattern, now shared via PlayZNetScenePrefab)
- ✅new2 : [SimpleVFX.cs] 임의의 바닐라 VFX 프리팹을 이름으로 재생하는 PlayVFX() 추가 (PlaySound와 동일한 ZNetScene 조회+비네트워킹 인스턴스화 로직을 PlayZNetScenePrefab으로 공유)
- ✅improve1 : [TerritoryWardController.cs] TryUpgrade() now calls VFXManager.PlayUpgradeEffect() right after a successful upgrade RPC
- ✅improve1 : [TerritoryWardController.cs] TryUpgrade() 성공 직후 VFXManager.PlayUpgradeEffect() 호출 추가
[1.0.12] - 2026-07-13
Files Modified / 수정 파일
Config.cs · InteractionBlockPatch.cs · Plugin.cs · TerritoryWardController.cs
- ✅new1 : [Config.cs] Added upgrade_key/shield_key/range_ring_key/fuel_storage_key to the General section (KeyCode entries) — all 4 territory ward keybinds are now rebindable from the F1 config menu; shield key default changed from J to K
- ✅new1 : [Config.cs] General 섹션에 upgrade_key/shield_key/range_ring_key/fuel_storage_key(KeyCode) 추가 — 영토 와드 키 4종 전부 F1 메뉴에서 재배정 가능. 실드 키 기본값 J→K로 변경
- ✅improve1 : [Plugin.cs] UpgradeButton/ShieldButton/RangeRingButton now use Jotunn's ButtonConfig.Config (config-backed) instead of a hardcoded Key, so they follow the new F1 keybind settings automatically
- ✅improve1 : [Plugin.cs] UpgradeButton/ShieldButton/RangeRingButton이 하드코딩된 Key 대신 Jotunn ButtonConfig.Config(설정 연동)를 사용하도록 변경 — F1에서 바꾼 키가 자동으로 반영됨
- ✅improve2 : [TerritoryWardController.cs] Fuel storage key (Q) is now read from TerritoryConfig.FuelStorageKey instead of a hardcoded KeyCode.Q
- ✅improve2 : [TerritoryWardController.cs] 연료 창고 키(Q)를 하드코딩 대신 TerritoryConfig.FuelStorageKey에서 읽도록 변경
- ✅fix1 : [InteractionBlockPatch.cs] Hover text key hints ([Q]/[U]/[J]) were hardcoded letters that would no longer match the actual bound key once rebindable — now display the live configured KeyCode instead
- ✅fix1 : [InteractionBlockPatch.cs] 호버텍스트의 [Q]/[U]/[J] 힌트가 키를 재배정해도 계속 옛 글자를 보여주던 불일치 수정 — 실제 설정된 KeyCode를 동적으로 표시
[1.0.11] - 2026-07-13
Files Modified / 수정 파일
InteractionBlockPatch.cs · Localization.cs · TerritoryWardController.cs
- ✅fix1 : [InteractionBlockPatch.cs] Hover text divider no longer overshoots above the text (was center-pivoted at 700px fixed height, overlapping the top HUD) — now top-pivoted and sized dynamically from both columns' preferred height; column width increased another 15% (compounding to ~32% total)
- ✅fix1 : [InteractionBlockPatch.cs] 호버 텍스트 구분선이 화면 상단 HUD를 침범하던 문제 수정(중앙 pivot + 고정 700px 높이 → 상단 pivot + 두 컬럼의 실제 콘텐츠 높이 기반 동적 계산). 컬럼 폭도 추가 15% 확장(누적 약 32%)
- ✅new1 : [TerritoryWardController.cs] Added manual shield deactivation — pressing J while the Lv5+ territory shield is active now turns it off immediately via a new RPC_DeactivateShield (no item refund), instead of only auto-expiring after 1 hour
- ✅new1 : [TerritoryWardController.cs] Lv5+ 영토 보호막 수동 비활성화 기능 추가 — 실드 활성 중 J키를 누르면 신규 RPC_DeactivateShield로 즉시 꺼짐(아이템 환불 없음). 기존엔 1시간 자동 만료만 있었음
- ✅improve1 : [InteractionBlockPatch.cs] Shield hover hint now also shows "[J] Deactivate" to the creator while the shield is active (previously only remaining time was shown, with no key hint)
- ✅improve1 : [InteractionBlockPatch.cs] 실드 활성 중 호버텍스트에 설치자 전용 "[J] 비활성화" 힌트 추가 (기존엔 잔여 시간만 표시되고 키 힌트가 없었음)
- ✅new2 : [Localization.cs] Added territoryward_shield_deactivate_hint_key / territoryward_shield_stopped (Korean/English)
- ✅new2 : [Localization.cs] territoryward_shield_deactivate_hint_key / territoryward_shield_stopped 키 추가 (한/영)
[1.0.10] - 2026-07-13
Files Modified / 수정 파일
InteractionBlockPatch.cs · Captain_territorial.csproj
- ✅improve1 : [InteractionBlockPatch.cs] Territory ward hover text is now split into two side-by-side columns (each 15% wider than before) with a vertical divider between them, cutting the previous long single-column wrap height roughly in half; other objects' hover text is unaffected
- ✅improve1 : [InteractionBlockPatch.cs] 영토 와드 호버 텍스트를 좌우 2단 컬럼(각 폭 15% 증가) + 구분선 레이아웃으로 변경 — 기존 1단 텍스트의 과도한 줄바꿈으로 인한 세로 길이를 절반 가량으로 단축. 다른 오브젝트 호버 텍스트에는 영향 없음
- ✅new1 : [Captain_territorial.csproj] Added UnityEngine.UI / UnityEngine.UIModule references — required for the divider Image component used by the new hover text layout
- ✅new1 : [Captain_territorial.csproj] UnityEngine.UI / UnityEngine.UIModule 참조 추가 — 호버 텍스트 구분선(Image) 컴포넌트 사용에 필요
[1.0.9] - 2026-07-13
Files Modified / 수정 파일
TerritoryWardController.cs
- ✅fix1 : [TerritoryWardController.cs] Fuel storage container size now grows with ward level (Lv1 2x2 → Lv8 5x6) instead of staying fixed at 2x2 — ApplyLevel() now resizes the already-created Inventory instance directly, since Container.m_width/m_height are only read once at Awake()
- ✅fix1 : [TerritoryWardController.cs] 연료 보관 창고 크기가 2x2로 고정되어 있던 문제 수정 — 와드 레벨에 따라 창고 크기가 증가하도록 변경 (Lv1 2x2 → Lv8 5x6). Container.m_width/m_height는 Awake() 시점에만 참조되므로 ApplyLevel()에서 이미 생성된 Inventory 인스턴스의 크기를 직접 갱신
[1.0.8] - 2026-07-13
Files Modified / 수정 파일
BuildRestrictionPatch.cs · Config.cs · Plugin.cs · TerritoryWard.cs · TerritoryWardController.cs
- ✅new1 : [Config.cs] Added an
admin_bypasstoggle at the top of the General section — when enabled, ward placement limit, placement material cost, and upgrade material/coin cost are all bypassed (fuel upkeep is unaffected) - ✅new1 : [Config.cs] General 섹션 최상단에
admin_bypass토글 추가 — 켜면 와드 설치 개수 제한, 설치 재료비, 업그레이드 재료/골드 비용을 모두 무시함 (연료 유지비는 그대로 적용) - ✅improve1 : [Config.cs] Merged the "Level N" and "Upgrade Lv N" sections per level into a single "Level N - <biome>" section, moved the fuel consumption interval out of General into each level's own section, and renamed
fuel_a/b/item_a/bkeys tofuel_primary/secondary/upgrade_item_primary/secondaryfor clarity (existing custom values under the old keys reset to defaults) - ✅improve1 : [Config.cs] 레벨별 "Level N"/"Upgrade Lv N" 섹션을 "Level N - 바이옴명" 하나로 통합하고, General에 흩어져 있던 연료 소모 간격을 각 레벨 섹션으로 이동,
fuel_a/b·item_a/b키를fuel_primary/secondary·upgrade_item_primary/secondary로 개명해 가독성 개선 (기존 커스텀 값은 새 키 인식으로 기본값 리셋됨) - ✅new2 : [TerritoryWard.cs] Ward placement requirement (Wood x10 + Stone x10) is now dynamically cleared while Admin Bypass is enabled and restored when disabled, via a live toggle on
Piece.m_resources - ✅new2 : [TerritoryWard.cs] Admin Bypass가 켜져 있는 동안 와드 설치 재료 요구사항(나무x10+돌x10)을
Piece.m_resources실시간 토글로 비우고, 꺼지면 원래대로 복원 - ✅improve2 : [BuildRestrictionPatch.cs] Ward count limit check is now skipped while Admin Bypass is enabled
- ✅improve2 : [BuildRestrictionPatch.cs] Admin Bypass가 켜져 있는 동안 와드 설치 개수 제한 체크를 건너뜀
- ✅improve3 : [TerritoryWardController.cs] TryUpgrade() now skips the material/coin requirement check and inventory consumption while Admin Bypass is enabled
- ✅improve3 : [TerritoryWardController.cs] Admin Bypass가 켜져 있는 동안 TryUpgrade()에서 재료/골드 요구 체크와 인벤토리 소모를 건너뜀
- ✅improve4 : [Plugin.cs] Mod load message is now printed to the BepInEx console in cyan (falls back to a normal log line when no console window is available), matching the Captain_audio pattern
- ✅improve4 : [Plugin.cs] 모드 로드 메시지를 Captain_audio와 동일한 방식으로 BepInEx 콘솔에 청록색으로 출력 (콘솔 창이 없으면 일반 로그로 대체)
[1.0.7] - 2026-07-04
Files Modified / 수정 파일
BuildRestrictionPatch.cs
- ✅fix1 : [BuildRestrictionPatch.cs] Workbench, portal, boats (Raft/Karve/VikingShip/VikingShip_Ashlands), and cart can now be placed regardless of territory ward status, restoring original vanilla behavior (previously only the workbench was exempt from the ward build restriction)
- ✅fix1 : [BuildRestrictionPatch.cs] 작업대뿐 아니라 포탈, 배(래프트/카브/롱쉽/드라카르), 수레도 영토와드 상태와 무관하게 설치 가능하도록 수정 — 원래 바닐라 동작 복원 (기존에는 작업대만 와드 건설 제한에서 예외였음)
[1.0.6] - 2026-07-04
Files Modified / 수정 파일
Localization.cs · TerritoryWardController.cs
- ✅improve1 : [TerritoryWardController.cs] Resolve() now accepts a
warnIfMissingflag so callers can opt out of the ObjectDB-not-found warning for known-harmless cases - ✅improve1 : [TerritoryWardController.cs] Resolve()에
warnIfMissing옵션 추가 — 무해한 케이스에서 경고 로그를 선택적으로 끌 수 있도록 함 - ✅improve2 : [Localization.cs] RefreshWardDescription() no longer logs the 'Wood'/'Resin' not-found warning at main-menu startup (ObjectDB is not fully loaded yet at that point — harmless and already falls back correctly)
- ✅improve2 : [Localization.cs] RefreshWardDescription()이 메인 메뉴 진입 시점에 뜨던 'Wood'/'Resin' not found 경고를 더 이상 출력하지 않음 (이 시점은 ObjectDB가 아직 완전히 로드되지 않은 정상 과정이며, 이미 폴백 처리되어 있어 무해함)
[1.0.5] - 2026-07-02
Files Modified / 수정 파일
TerritoryWardController.cs
- ✅improve1 : [TerritoryWardController.cs] Resolve() now logs a warning when prefab name is not found in ObjectDB, making config typos immediately visible in the log
- ✅improve1 : [TerritoryWardController.cs] Resolve()가 ObjectDB에서 프리팹명을 찾지 못할 때 경고 로그 출력 — Config 오타 즉시 식별 가능
[1.0.4] - 2026-06-27
Files Modified / 수정 파일
Config.cs · Plugin.cs · TerritoryWardController.cs · scripts/auto-version.ps1(new)
- ✅new1 : [scripts/auto-version.ps1] Auto-version script — increments patch on build when .cs files changed, prepends CHANGELOG entry template, updates csproj + Plugin.cs
- ✅improve1 : [Config.cs] All ConfigEntries now use ConfigurationManagerAttributes { IsAdminOnly = true } — server config synced to all clients via Jotunn SynchronizationManager
- ✅improve2 : [Plugin.cs] Subscribed SynchronizationManager.OnConfigurationSynchronized to refresh ward description after initial server sync
- ✅fix1 : [TerritoryWardController.cs] Shield activation uses RPC_ActivateShield so owner(server) writes tw_shield_end — fixes multiplayer shield time desync
- ✅new1 : [scripts/auto-version.ps1] 자동 버전 스크립트 — .cs 변경 감지 시 빌드마다 패치 증가, CHANGELOG 헤더 자동 삽입, csproj + Plugin.cs 일괄 업데이트
- ✅improve1 : [Config.cs] 모든 ConfigEntry에 ConfigurationManagerAttributes { IsAdminOnly = true } 적용 — Jotunn SynchronizationManager로 서버 Config 전 클라이언트 자동 동기화
- ✅improve2 : [Plugin.cs] SynchronizationManager.OnConfigurationSynchronized 구독 — 서버 Config 최초 수신 시 와드 빌드 메뉴 설명문 자동 갱신
- ✅fix1 : [TerritoryWardController.cs] 실드 활성화를 RPC_ActivateShield로 변경 — owner(서버)가 tw_shield_end 기록하여 멀티플레이 실드 잔여 시간 동기화 수정
[1.0.1] - 2026-06-27
Files Modified / 수정 파일
TerritoryWard.cs · TerritoryWardController.cs · TerritoryWardUI.cs(new) · InteractionBlockPatch.cs · BuildRestrictionPatch.cs · ShieldBlockPatch.cs · Plugin.cs · Config.cs · Localization.cs
- ✅new1 : [TerritoryWardUI.cs] Extracted UI logic from TerritoryWardController into a new partial class — whitelist panel, intruder head labels, shield HUD display at screen bottom (82%)
- ✅new2 : [ShieldBlockPatch.cs] Added player damage protection inside shielded ward zone (Patch_Character_Damage_ShieldZone)
- ✅new3 : [TerritoryWardController.cs] Added chat notification on intrusion — RPC_ReportIntrusion now broadcasts to Chat.instance for all whitelist members via ZNetView.Everybody
- ✅fix1 : [InteractionBlockPatch.cs] Shield status (remaining minutes) now shown to ALL players in hover text, not just the creator; J-key hint still shows only to creator
- ✅improve1 : [TerritoryWard.cs + BuildRestrictionPatch.cs] Replaced FindObjectsOfType<PrivateArea>() with static s_wards cache — eliminates frame drops during construction ghost movement
- ✅improve2 : [TerritoryWardController.cs] Cached Reflection FieldInfo (s_hoveringField) as static readonly — removes per-frame Reflection overhead in Update loop
- ✅improve3 : [TerritoryWardController.cs] Cached GetComponent<Piece>() as m_piece field, removed redundant GetComponent<ZNetView>() call in InteractionBlockPatch
- ✅improve4 : [Plugin.cs] Added OnDestroy() with _harmony.UnpatchSelf() — prevents stale patches on plugin reload
- ✅improve5 : [TerritoryWardController.cs] Added CancelInvoke() in OnDestroy — prevents dangling InvokeRepeating after ward destruction
- ✅improve6 : [Config.cs] Fixed List<FuelTier> capacity initialization (new List<>(uptoLevel) instead of default)
- ✅improve7 : [Localization.cs] Added territoryward_shield_hud and territoryward_intrusion_chat localization keys (Korean/English)
- ✅new1 : [TerritoryWardUI.cs] 와드 컨트롤러에서 UI 로직을 partial 클래스로 분리 — 화이트리스트 패널, 침입자 머리 위 레이블, 실드 HUD(화면 하단 82% 위치)
- ✅new2 : [ShieldBlockPatch.cs] 실드 활성 구역 내 플레이어 데미지 차단 추가 (Patch_Character_Damage_ShieldZone)
- ✅new3 : [TerritoryWardController.cs] 침입 감지 시 채팅 알림 추가 — RPC_ReportIntrusion이 ZNetView.Everybody RPC로 화이트리스트 전원 채팅창에 기록
- ✅fix1 : [InteractionBlockPatch.cs] 실드 상태(남은 시간) 호버텍스트를 설치자 전용에서 모든 플레이어에게 표시로 변경; J키 힌트는 설치자에게만 유지
- ✅improve1 : [TerritoryWard.cs + BuildRestrictionPatch.cs] FindObjectsOfType<PrivateArea>() → static s_wards 캐시로 교체 — 건설 고스트 이동 시 프레임 드롭 원인 제거
- ✅improve2 : [TerritoryWardController.cs] Reflection FieldInfo(s_hoveringField) static readonly 캐싱 — Update 루프 내 반복 Reflection 오버헤드 제거
- ✅improve3 : [TerritoryWardController.cs] GetComponent<Piece>() → m_piece 필드 캐싱, InteractionBlockPatch 내 중복 GetComponent<ZNetView>() 제거
- ✅improve4 : [Plugin.cs] OnDestroy() + _harmony.UnpatchSelf() 추가 — 플러그인 리로드 시 패치 잔류 방지
- ✅improve5 : [TerritoryWardController.cs] OnDestroy에 CancelInvoke() 추가 — 와드 파괴 후 InvokeRepeating 누수 방지
- ✅improve6 : [Config.cs] List<FuelTier> capacity 초기화 수정 (new List<>(uptoLevel))
- ✅improve7 : [Localization.cs] territoryward_shield_hud, territoryward_intrusion_chat 로컬라이즈 키 추가 (한국어/영어)
[1.0.0] - 2026-06-26
Files Modified / 수정 파일
Plugin.cs · TerritoryWard.cs · TerritoryWardController.cs · TerritoryWardUI.cs · Config.cs · Localization.cs · BuildRestrictionPatch.cs · InteractionBlockPatch.cs · ShieldBlockPatch.cs · DoorAutoClosePatch.cs · IntrusionAlertPatch.cs
- ✅new1 : Initial release — Territory Ward mod for Valheim (BepInEx + Harmony + Jotunn)
- ✅new2 : Lv1~8 level system with ZDO-based state storage (tw_level)
- ✅new3 : U-key upgrade trigger with Config-based material/gold cost system
- ✅new4 : Range ring display during construction; R-key manual toggle within 5m of ward
- ✅new5 : Intrusion alert system — fuel-low warnings + intruder alerts (IntrusionAlertPatch.cs)
- ✅new6 : Door auto-close — DoorAutoClosePatch.cs (owner only, 5s default delay)
- ✅new7 : Whitelist UI — creator Shift+E opens IMGUI panel (member list + kick + add online players)
- ✅new8 : Minimap pin — auto-updated on ward load / level-up / destruction
- ✅new9 : J-key shield activation at Lv5+ — consumes SurtlingCore x1 → 1h protection zone
- ✅new10 : Shield VFX — dynamic Haldor ShieldGenerator clone (TW_ShieldVFX)
- ✅new11 : Shield zone — all structures (WearNTear) + monsters (BaseAI.FindEnemy) blocked inside
- ✅new12 : Intrusion chat alert, intruder head label (red, 1h), sfx_morgen_alert sound
- ✅new1 : 초기 릴리스 — Valheim 영토 와드 모드 (BepInEx + Harmony + Jotunn)
- ✅new2 : ZDO 기반 Lv1~8 레벨 시스템 (tw_level)
- ✅new3 : U키 업그레이드 트리거, Config 기반 재료/골드 비용 체계
- ✅new4 : 건설 중 범위 링 표시; R키로 와드 5m 이내에서 수동 토글
- ✅new5 : 침입 경고 시스템 — 연료 부족 경고 + 침입자 알림 (IntrusionAlertPatch.cs)
- ✅new6 : 문 자동 닫힘 — DoorAutoClosePatch.cs (설치자 전용, 기본 5초 딜레이)
- ✅new7 : 화이트리스트 UI — 설치자 Shift+E → IMGUI 패널 (멤버 목록 + 추방 + 온라인 플레이어 추가)
- ✅new8 : 미니맵 핀 — 와드 로드/레벨업/파괴 시 자동 갱신
- ✅new9 : Lv5+ k키 실드 활성화 — SurtlingCore 1개 소모 → 1시간 데미지 보호
- ✅new10 : 실드 VFX — Haldor ShieldGenerator 동적 클론 (TW_ShieldVFX)
- ✅new11 : 실드 구역 — 모든 건물(WearNTear) + 몬스터(BaseAI.FindEnemy) 차단
- ✅new12 : 침입 채팅 알림, 침입자 머리 위 빨간 텍스트(1시간), sfx_morgen_alert 사운드