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_bypass toggle 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/b keys to fuel_primary/secondary/upgrade_item_primary/secondary for 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
warnIfMissing flag 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 사운드