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
| Date uploaded | 2 days ago |
| Version | 1.0.38 |
| Download link | korCaptain-Captain_territorial-1.0.38.zip |
| Downloads | 21 |
| Dependency string | korCaptain-Captain_territorial-1.0.38 |
This mod requires the following mods to function
denikson-BepInExPack_Valheim
BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.
Preferred version: 5.4.2333ValheimModding-Jotunn
Jötunn (/ˈjɔːtʊn/, 'giant'), the Valheim Library was created with the goal of making the lives of mod developers easier. It enables you to create mods for Valheim using an abstracted API so you can focus on the actual content creation.
Preferred version: 2.29.1README
Captain Territorial - Valheim Territory Ward Mod
한국어 설명 보기 | English Description
📸 ScreenShot~!
🏰 Territory Ward Overview
(스크린샷 준비 중 / Screenshots coming soon)
🇰🇷 한국어 (Korean)
개요
Captain Territorial은 발헤임에 영토 관리 시스템을 추가하는 모드입니다.
와드를 설치하고 연료를 공급해 영토를 활성화하면, 구역 내 건설·상호작용·침입자 제어를 모두 관리할 수 있습니다.
Lv1~8 전 레벨이 완전히 구현되어 있으며, 레벨이 오를수록 반경·연료·연료 창고 크기가 함께 커집니다.
Lv5 이상에서는 실드로 구역 내 모든 건물과 플레이어를 완전히 보호하세요!
📦 필수 모드 (Dependencies)
| 모드 | 버전 | 필수 여부 |
|---|---|---|
| BepInExPack_Valheim | 5.4.2200+ | 필수 |
| Jotunn | 2.20.0+ | 필수 |
| ConfigurationManager | 최신 | 권장 (GUI 설정용) |
✨ 주요 특징
영토 와드 시스템
- 와드를 설치해 반경 내 영토를 정의 (Lv1 10m ~ Lv8 30m)
- 연료를 소모해 와드를 ON 상태 유지
- ON 상태에서만 구역 내 건설 및 상호작용 가능
- OFF 시 구역 내 모든 건설/사용 차단
- 레벨이 오를수록 연료 창고 크기도 자동으로 커짐 (Lv1 2x2 → Lv8 5x6)
연료 시스템 (지역별 나무 + 수지)
- 보조 연료는 Lv5(그레이드워프 눈)를 제외한 모든 레벨에서 수지(Resin) 1개로 통일
- 주 연료는 바이옴에 맞는 지역별 나무(나무/원목/고대나무껍질/경목/이그드라실 나무). 나무가 없는 산/바다/애쉬랜드는 흑요석 또는 나무 2종 조합으로 대체
- 와드는 기본(Lv1) 연료 또는 현재 레벨 자신의 연료, 이 두 가지 중 재고가 있는 쪽으로 자동 소모 (중간 레벨의 연료는 사용 불가)
- 연료 소모 시 와드 위에 오라 VFX + 완료 효과음 재생
화이트리스트 & 침입자 경고
- Shift+E (설치자): 멤버 관리 UI 열기 — 서버에 한 번이라도 접속했던 모든 캐릭터가 온라인/오프라인 상관없이 한 목록에 표시되며(허용됨 ✔ / 미허용 ☐), 이름을 클릭하면 즉시 허용·추방이 토글됨. 현재 접속 중이면 이름 옆에 "(온라인)" 표시
- Shift+R (비설치자): 와드 스스로 가입/탈퇴 (예전엔 Shift+E였으나, 바닐라 E(사용) 입력과 겹쳐 오작동하는 문제로 Shift+R로 변경됨)
- 승인되지 않은 플레이어가 구역 내 상자 또는 작업대를 사용하려 시도하면 (단순히 구역 안으로 걸어 들어오는 것만으로는 발동하지 않음, 10초 쿨다운):
- 경고음(sfx_morgen_alert) 재생
- 화이트리스트 전원(설치자+허용된 멤버)에게 화면 중앙 경고 메시지
- 침입자 머리 위 빨간 "침입자" 레이블 (1시간 유지)
- 화이트리스트 전원 채팅창 알림 전송
범위 링 & 미니맵 핀
- 건설(피스 배치) 중 와드 근처에 있으면 범위 링 자동 표시
- R키: 와드 5m 이내에서 범위 링 수동 ON/OFF 토글
- 와드 로드 / 레벨업 / 파괴 시 미니맵 핀 자동 갱신
문 자동 닫힘
- 구역 내 문을 열면 5초 후 자동으로 닫힘 (설치자 전용)
- Config에서 딜레이 시간 조정 가능
Lv5+ 영토 실드
- K키(기본값): SurtlingCore 1개 소모 → 1시간 보호 시작
- 실드 활성 중 다시 K키를 누르면 즉시 비활성화 — 이때 남은 시간은 사라지지 않고 저장됨(배너킹)
- 저장된 시간이 남아있는 동안 재활성화하면 아이템 소모 없이 그 시간부터 재개
- 실드 반경은 와드의 현재 레벨 반경과 항상 동기화 — 실드를 켠 채로 업그레이드해도 즉시 커짐
- 실드 활성 중:
- 구역 내 모든 건물(WearNTear) 데미지 차단
- 구역 내 플레이어 데미지 차단
- 구역 내 몬스터 타겟 획득 불가
- 투사체(화살 등) 돔 경계에서 차단
- 몬스터가 경계에 가까워지면 미리 방향을 돌려 도망치고, 그래도 안으로 들어오면 즉시 경계 밖으로 밀려남 — 실질적으로 몬스터가 구역 안에 존재할 수 없음
- 화려한 실드 VFX 돔 표시
- 실드 남은 시간: 와드 호버 텍스트에 모든 플레이어에게 표시
- 구역 안에 있을 때 화면 하단에 HUD로 잔여 시간 표시
업그레이드 VFX/SFX
- 와드 업그레이드 성공 시 이펙트 + 효과음 재생
관리자 바이패스 (Admin Bypass)
- F1 Config에서 켜면 설치 개수 제한·설치 재료비·업그레이드 재료/골드 비용을 전부 무시하고 즉시 설치·업그레이드 가능
- 연료 유지비는 그대로 적용됨 — 테스트/운영 목적의 관리자 전용 스위치
⌨️ 키 바인딩 (F1 Config에서 재배정 가능)
| 키 (기본값) | 대상 | 설명 |
|---|---|---|
| U | 설치자 | 영토 와드 업그레이드 (재료 소모) |
| K | 설치자 (Lv5+) | 영토 실드 활성화/비활성화 |
| R | 누구나 | 범위 링 수동 ON/OFF (와드 5m 이내에서만) |
| Shift+R | 비설치자 | 와드 가입 / 탈퇴 |
| Q | 누구나 (와드 호버 중) | 연료 창고 열기 |
| Shift+E | 설치자 | 화이트리스트 멤버 관리 UI 열기 |
U/K/R/Q 4개 키 모두 F1 ConfigurationManager의 General 섹션에서 자유롭게 재배정할 수 있습니다.
🏰 레벨 시스템 (Lv1~8, 전 레벨 완전 구현)
와드를 업그레이드하면 반경·연료·연료 창고 크기가 함께 커집니다.
모든 수치는 F1 Config에서 서버 관리자가 조정 가능합니다.
| 레벨 | 바이옴 | 기본 반경 | 주 연료 | 소모 간격 |
|---|---|---|---|---|
| Lv1 | 초원 | 10m | 나무 | 3분 |
| Lv2 | 검은숲 | 13m | 원목 | 4분 |
| Lv3 | 늪지 | 16m | 고대나무껍질 | 5분 |
| Lv4 | 산 | 19m | 흑요석 | 6분 |
| Lv5 | 평원 — 실드 해금 | 22m | 경목 | 7분 |
| Lv6 | 바다 | 25m | 나무 + 원목 | 8분 |
| Lv7 | 미스트랜드 | 28m | 이그드라실 나무 | 9분 |
| Lv8 | 애쉬랜드 | 30m | 나무 + 이그드라실 나무 | 10분 |
보조 연료는 Lv5(그레이드워프 눈 1개)를 제외한 모든 레벨에서 수지(Resin) 1개로 공통. 와드는 Lv1 연료 또는 자신의 레벨 연료, 두 가지만 선택해 쓸 수 있습니다.
👥 화이트리스트 UI 사용법
- 설치한 와드에 가까이 접근 (설치자만 가능)
- Shift+E 키로 멤버 관리 패널 열기
- 알려진 캐릭터 목록에 서버에 한 번이라도 접속했던 모든 캐릭터가 표시됨 — 허용된 멤버는 ✔, 아직 허용 안 된 캐릭터는 ☐로 표시되고, 현재 접속 중이면 이름 옆에 "(온라인)"이 붙음
- 이름을 클릭하면 즉시 허용/추방이 토글됨 (오프라인 캐릭터도 클릭해서 미리 추가 가능)
- 닫기 버튼으로 패널 종료
비설치자는 Shift+E 대신 Shift+R을 눌러 스스로 가입/탈퇴할 수 있습니다.
🛡️ 영토 실드 사용법
- 와드를 Lv5 이상으로 업그레이드
- 와드 연료 창고에 SurtlingCore 1개 보관
- 와드 근처에서 K키(기본값) 클릭 → SurtlingCore 1개 소모, 1시간 보호 시작
- 실드 돔 VFX 생성 + 화면에 활성 메시지 표시 (반경은 와드 레벨에 자동으로 맞춰짐)
- 호버 텍스트에 남은 시간 실시간 표시 (모든 플레이어)
- 구역 안에 있으면 화면 하단에 잔여 시간 HUD 표시
- 다시 K키를 누르면 즉시 비활성화 — 남은 시간은 버려지지 않고 저장됨
- 저장된 시간이 남아있는 동안 재활성화하면 아이템 소모 없이 재개, 다 쓰면 다시 SurtlingCore 필요
⚙️ 설정 관리 (Configuration)
ConfigurationManager (F1 키)를 사용하면 게임 내에서 GUI로 모든 설정을 조정할 수 있습니다.
Config 파일 위치
BepInEx/config/KorCaptain_territorial_ward.cfg
| 카테고리 | 설명 |
|---|---|
| General | 시스템 ON/OFF, 와드 최대 설치 수, 문 자동 닫힘 딜레이, 보호막 아이템, 키 바인딩(U/K/R/Q), 관리자 바이패스 |
| Level 1 ~ Level 8 | 반경, 연료(주/보조/추가) 종류·수량, 소모 간격, 업그레이드 재료·골드 |
⚠️ 서버 동기화(Server Sync): 모든 설정 항목은 서버 어드민 전용입니다. 서버 관리자(발헤임
adminlist에 등록된 계정)가 F1에서 값을 바꾸면 그 값이 접속 중인 모든 클라이언트에 즉시 강제 적용됩니다. 비관리자 클라이언트는 F1에서 이 항목들을 수정할 수 없으며(잠김), 자신의 로컬.cfg파일에 다른 값을 저장해뒀더라도 서버 접속 시 서버의 값으로 무시되고 덮어써집니다.
📥 설치 방법
- 권장: r2modman / Thunderstore에서 자동 설치
- 수동:
BepInEx/plugins/Captain_territorial/폴더에 DLL 복사
⚠️ 서버와 클라이언트(플레이어) 양쪽 모두 이 모드를 설치해야 합니다. 한쪽만 설치하면 접속이 거부되거나 정상 동작하지 않습니다 (
NetworkCompatibility: EveryoneMustHaveMod).
🌐 English
Overview
Captain Territorial is a territory management mod for Valheim.
Place a Territory Ward, supply fuel to keep it active, and control who can build, interact, and enter your zone.
All levels (Lv1–8) are fully implemented — radius, fuel, and storage size all scale up as the ward levels up.
At Lv5+, activate the Shield to fully protect all structures and players inside!
📦 Dependencies
| Mod | Version | Required |
|---|---|---|
| BepInExPack_Valheim | 5.4.2200+ | Required |
| Jotunn | 2.20.0+ | Required |
| ConfigurationManager | Latest | Recommended (GUI settings) |
✨ Key Features
Territory Ward System
- Place a ward to define a radius-based territory (10m at Lv1 up to 30m at Lv8)
- Consume fuel to keep the ward ON
- Building and interaction only allowed inside an active ward zone
- Ward OFF = all construction and item use blocked
- Fuel storage size grows automatically with level (2x2 at Lv1 → 5x6 at Lv8)
Fuel System (Regional Wood + Resin)
- Secondary fuel is 1x Resin at every level except Lv5, which uses GreydwarfEye instead
- Primary fuel is a biome-appropriate regional wood (Wood / RoundLog / ElderBark / FineWood / YggdrasilWood). Biomes without a natural wood (Mountain / Ocean / Ashlands) use Obsidian or a combination of two wood types instead
- A ward can consume either its base (Lv1) fuel or its own current-level fuel, whichever is in stock (intermediate levels' fuel cannot be used)
- Consuming fuel plays an aura VFX and completion sound above the ward
Whitelist & Intrusion Alerts
- Shift+E (creator): Open member management UI — shows every character that has ever connected to the server, online or offline, in a single list (allowed = ✔, not allowed = ☐). Click a name to instantly toggle allow/kick; an "(Online)" tag appears next to currently connected players
- Shift+R (non-creator): Join/leave the ward yourself (moved from Shift+E, which conflicted with vanilla E/Use input and misfired)
- When an unauthorized player attempts to use a chest or crafting station inside the zone (simply walking into the zone does NOT trigger this; 10s cooldown per alert):
- Alert sound (sfx_morgen_alert)
- Center-screen warning message for every whitelist member (owner + permitted members)
- Red "침입자 / Intruder" label above their head (lasts 1 hour)
- Chat notification broadcast to all whitelist members
Range Ring & Minimap Pin
- Ward radius ring auto-displays during construction near the ward
- R key: Manually toggle range ring within 5m of the ward
- Minimap pin auto-updated on ward load / level-up / destruction
Door Auto-Close
- Doors inside the ward zone automatically close after 5 seconds (owner only)
- Delay configurable via Config
Lv5+ Territory Shield
- K key (default): Consume 1x SurtlingCore → starts 1 hour of protection
- Pressing K again while active deactivates immediately — the remaining time is banked, not lost
- Reactivating while banked time remains resumes for free (no item consumed)
- Shield radius always stays in sync with the ward's current level radius — upgrading while shielded grows it instantly
- While shield is active:
- All structures (WearNTear) in zone: damage blocked
- All players in zone: damage blocked
- Monsters inside zone: cannot acquire targets
- Projectiles (arrows, etc.) are blocked at the dome boundary
- Monsters near the boundary turn and flee in advance, and any that still get inside are immediately pushed back outside — monsters effectively cannot exist inside the zone
- Shield VFX dome displayed
- Shield remaining time shown in hover text to all players
- HUD displayed at screen bottom when inside the zone
Upgrade VFX/SFX
- Plays a visual effect and sound cue when the ward upgrade succeeds
Admin Bypass
- Toggle in F1 Config to ignore the placement limit, placement material cost, and upgrade material/gold cost entirely — instant placement/upgrade
- Fuel upkeep still applies as normal — an admin-only switch for testing/operations
⌨️ Key Bindings (rebindable in F1 Config)
| Key (default) | Target | Description |
|---|---|---|
| U | Creator | Upgrade Territory Ward (consumes materials) |
| K | Creator (Lv5+) | Activate/deactivate Territory Shield |
| R | Anyone | Toggle range ring ON/OFF (within 5m of ward) |
| Shift+R | Non-creator | Join / leave ward |
| Q | Anyone (hovering the ward) | Open fuel storage |
| Shift+E | Creator | Open whitelist member management UI |
All 4 keys (U/K/R/Q) can be freely rebound in the General section of the F1 ConfigurationManager.
🏰 Level System (Lv1~8, fully implemented)
Upgrading the ward grows its radius, fuel requirement, and storage size together.
All values are adjustable by server admins via F1 Config.
| Level | Biome | Default Radius | Primary Fuel | Interval |
|---|---|---|---|---|
| Lv1 | Meadows | 10m | Wood | 3 min |
| Lv2 | Black Forest | 13m | RoundLog | 4 min |
| Lv3 | Swamp | 16m | ElderBark | 5 min |
| Lv4 | Mountain | 19m | Obsidian | 6 min |
| Lv5 | Plains — Shield unlocked | 22m | FineWood | 7 min |
| Lv6 | Ocean | 25m | Wood + RoundLog | 8 min |
| Lv7 | Mistlands | 28m | YggdrasilWood | 9 min |
| Lv8 | Ashlands | 30m | Wood + YggdrasilWood | 10 min |
Secondary fuel is always 1x Resin, except Lv5 which uses 1x GreydwarfEye instead. A ward can only use its Lv1 fuel or its own level's fuel.
🛡️ How to Use the Shield
- Upgrade the ward to Lv5 or higher
- Place 1x SurtlingCore in the ward's fuel storage
- Stand near the ward and press K (default) → consumes 1x SurtlingCore, starts 1 hour of protection
- Shield dome VFX appears + activation message displayed (radius automatically matches the ward's level)
- Remaining time shown in hover text for all players
- HUD at screen bottom shows remaining time while inside the zone
- Press K again to deactivate immediately — the remaining time is banked, not discarded
- Reactivating while banked time remains resumes for free; once it runs out, SurtlingCore is required again
⚙️ Configuration
Use ConfigurationManager (F1 key) to adjust all settings in-game via GUI.
Config file location
BepInEx/config/KorCaptain_territorial_ward.cfg
| Category | Description |
|---|---|
| General | System on/off, max ward count, door auto-close delay, shield item, key bindings (U/K/R/Q), Admin Bypass |
| Level 1 ~ Level 8 | Radius, fuel (primary/secondary/tertiary) type & amount, consumption interval, upgrade materials & gold |
⚠️ Server Sync: Every setting is server-admin-only. When the server admin (an account listed in Valheim's
adminlist) changes a value in F1, it is immediately force-applied to all connected clients. Non-admin clients cannot edit these settings in F1 (locked), and even if a client has a different value saved in their own local.cfgfile, it is ignored and overwritten by the server's value upon connecting.
📥 Installation
- Recommended: Install via r2modman / Thunderstore
- Manual: Copy DLL to
BepInEx/plugins/Captain_territorial/
⚠️ Both the server and every client (player) must install this mod. If only one side has it, connections will be rejected or the mod won't function correctly (
NetworkCompatibility: EveryoneMustHaveMod).
CHANGELOG
Changelog / 변경 로그
[1.0.37] - 2026-07-25
Files Modified / 수정 파일
TerritoryWard.cs
- ✅fix1 : [TerritoryWard.cs] Build/interaction range checks used full 3D distance, so placing pieces too high above a ward's center silently failed the range check even though the player was horizontally well within the ward's radius — building height was effectively capped by the ward radius (and thus its level) for no intended reason. Switched to the vanilla PrivateArea.IsInside() horizontal-only (XZ) check, so height is no longer restricted while the horizontal range limit is unchanged
- ✅fix1 : [TerritoryWard.cs] 건설/상호작용 범위 판정이 3D 거리를 사용해, 수평으로는 와드 반경 안이어도 너무 높이 지으면 범위 밖으로 판정되어 건축이 막히던 문제 수정 — 결과적으로 건물 높이가 의도치 않게 와드 반경(레벨)에 종속되어 있었음. 바닐라 PrivateArea.IsInside()의 수평(XZ) 전용 판정으로 교체해, 너비(반경) 제한은 그대로 두고 높이 제한만 완전히 제거함 (모든 레벨에 동일 적용)
[1.0.36] - 2026-07-18
Files Modified / 수정 파일
KnownPlayersRegistry.cs · KnownPlayersSync.cs(new) · PermittedToggleAlwaysPatch.cs · Plugin.cs · TerritoryWardController.cs
- ✅fix1 : [KnownPlayersRegistry.cs] Fixed a race condition where a member added and then quickly kicked before the periodic scan recorded them would vanish from the known-characters list entirely (neither in the permitted list nor the registry) — RecordPlayer is now also called at the exact moment of add/kick, not just on the polling tick
- ✅fix1 : [KnownPlayersRegistry.cs] 추가 직후 곧바로 추방하면(주기 스캔이 기록할 틈이 없었던 경우) 알려진 캐릭터 목록에서 완전히 사라져버리던 경쟁 조건 수정 — 폴링 시점뿐 아니라 추가/추방이 실제로 일어나는 순간에도 즉시 기록하도록 변경
- ✅new1 : [KnownPlayersSync.cs] Known-characters data is now server-authoritative and synced to clients over the network (ZRoutedRpc), instead of only being saved to a local file — a real dedicated-server setup previously meant clients could never see who the server had recorded, since that file only existed on the server machine. The server now records/persists this data exclusively, pushes updates to all clients when it changes, and responds to a client's request (sent whenever the Shift+E panel opens) with the current list; clients now also persist their own local cache of what the server sent them
- ✅new1 : [KnownPlayersSync.cs] 알려진 캐릭터 데이터를 서버 권위(authoritative) 구조로 바꾸고 네트워크(ZRoutedRpc)로 클라이언트에 동기화하도록 개선 — 기존엔 로컬 파일에만 저장해서 실제 데디케이티드 서버 환경에서는 그 파일이 서버 기기에만 있어 클라이언트가 절대 볼 수 없었음. 이제 서버만 기록/저장을 전담하고, 변경이 생기면 전체 클라이언트에 즉시 전파하며, Shift+E 패널을 열 때마다 클라이언트가 서버에 최신 목록을 요청함. 클라이언트도 서버가 보내준 목록을 자기 로컬에 캐시로 저장
[1.0.35] - 2026-07-18
Files Modified / 수정 파일
TerritoryWardUI.cs
- ✅fix1 : [TerritoryWardUI.cs] The ward creator (owner) was showing up in their own whitelist panel as an addable/kickable entry, since the periodic character scan records every player including the owner — but the owner always has access via PrivateArea.IsCreator() regardless of the permitted list, so listing them was confusing and pointless. The creator's PlayerID is now excluded from the merged list
- ✅fix1 : [TerritoryWardUI.cs] 와드 설치자(관리자) 본인이 자기 화이트리스트 패널에 추가/추방 가능한 항목으로 함께 표시되던 문제 수정 — 주기 스캔이 설치자를 포함한 모든 캐릭터를 기록하다 보니 발생. 설치자는 PrivateArea.IsCreator()로 허용 목록과 무관하게 항상 접근 권한을 가지므로 목록에 표시할 필요가 없음. 설치자의 PlayerID를 통합 리스트에서 제외하도록 수정
[1.0.34] - 2026-07-18
Files Modified / 수정 파일
KnownPlayersRegistry.cs(new) · Localization.cs · PermittedToggleAlwaysPatch.cs(new) · Plugin.cs · TerritoryWardUI.cs
- ✅fix1 : [PermittedToggleAlwaysPatch.cs] Adding/kicking whitelist members silently failed whenever the ward was turned on (protection active) — vanilla PrivateArea.RPC_TogglePermitted refuses to run while IsEnabled() is true. Added a Harmony patch that bypasses this guard for territory ward instances only, so add/kick now works regardless of the ward's on/off state
- ✅fix1 : [PermittedToggleAlwaysPatch.cs] 와드가 켜진(보호 활성) 상태에서 화이트리스트 추가/추방이 조용히 실패하던 문제 수정 — 바닐라 PrivateArea.RPC_TogglePermitted가 IsEnabled()==true면 실행을 거부하는 것이 원인이었음. 영토 와드 인스턴스에서만 이 가드를 우회하는 Harmony 패치를 추가해 켜짐/꺼짐 상태와 무관하게 추가/추방이 동작하도록 수정
- ✅fix2 : [TerritoryWardUI.cs] Found and fixed a pre-existing bug while reworking this code: the old "add online player" button stored the peer's temporary per-session connection ID (ZNet.GetUID(), regenerated every game launch) instead of the character's real PlayerID, so PrivateArea.HaveLocalAccess() could never match it — added players never actually gained access even though the UI showed them as added
- ✅fix2 : [TerritoryWardUI.cs] 이번 작업 중 기존 버그 발견 및 수정: 예전 "온라인 플레이어 추가" 버튼이 실제 캐릭터 PlayerID 대신 매 실행마다 바뀌는 임시 접속 세션 ID(ZNet.GetUID())를 저장하고 있어, PrivateArea.HaveLocalAccess()가 절대 매칭되지 않았음 — UI에는 추가된 것처럼 보여도 실제 권한은 한 번도 부여되지 않던 문제
- ✅new1 : [KnownPlayersRegistry.cs] Added a global, disk-persisted registry that records every character (PlayerID + name) seen connecting to this server, so ward owners can whitelist someone even while they're offline
- ✅new1 : [KnownPlayersRegistry.cs] 이 서버에 접속했던 모든 캐릭터(PlayerID+이름)를 기록해두는 전역 레지스트리를 신규 추가, 디스크에 영속화되어 오프라인인 캐릭터도 화이트리스트 추가 후보로 표시 가능해짐
- ✅new2 : [TerritoryWardUI.cs] Whitelist panel now shows one unified, clickable list (online + offline) instead of separate "permitted"/"add online" sections — click a character's name to toggle add/kick, with an online tag for currently connected players. Characters that share the same PlayerID history naturally appear as separate rows, so one person's two characters both show up individually
- ✅new2 : [TerritoryWardUI.cs] 화이트리스트 패널을 기존 "허용된 멤버"/"온라인 추가" 2단 구성에서 온라인·오프라인을 모두 포함한 통합 클릭 리스트로 개편 — 캐릭터 이름을 클릭하면 추가/추방이 토글되고, 온라인이면 태그로 표시됨. PlayerID가 캐릭터 세이브 단위로 별도 발급되므로 같은 사람의 캐릭터 2개도 자연스럽게 별도 항목으로 나열됨
[1.0.33] - 2026-07-18
Files Modified / 수정 파일
InteractionBlockPatch.cs · TerritoryWardController.cs
- ✅fix5 : [TerritoryWardController.cs] Non-creator self join/leave moved from Shift+E to Shift+(range ring key, default R) — it shared the physical E key with vanilla's own Interact ("Use") input, so pressing Shift+E could also trigger the ward's plain-E On/Off toggle at the same time and the join/leave action would fail to apply. Moving it to Shift+R (not used by vanilla Interact at all) removes the conflict; Shift+E is now exclusively the creator's whitelist panel toggle
- ✅fix5 : [TerritoryWardController.cs] 비설치자 스스로 가입/탈퇴하는 키를 Shift+E에서 Shift+(범위 링 키, 기본 R)로 이동 — 바닐라 Interact("Use") 입력이 물리적으로 같은 E키를 쓰다 보니 Shift+E를 누르면 와드의 평범한 E On/Off 토글도 같이 발동해서 가입/탈퇴가 제대로 먹히지 않던 문제. 바닐라 Interact와 전혀 무관한 R키로 옮겨서 충돌을 없앴고, Shift+E는 이제 설치자의 화이트리스트 패널 전용으로만 남음
- ✅new3 : [TerritoryWardController.cs] Permitted (whitelisted) members can now also activate/deactivate the Lv5+ shield with the K key — previously restricted to the ward's creator only
- ✅new3 : [TerritoryWardController.cs] 허용된(화이트리스트) 멤버도 K키로 Lv5+ 실드를 활성화/비활성화할 수 있도록 변경 — 기존엔 설치자만 가능했음
- ✅improve3 : [InteractionBlockPatch.cs] Shield activation/deactivation hover hints and the leave-hint key label now reflect the above two changes (shown to permitted members too; leave hint now shows Shift+R instead of Shift+E)
- ✅improve3 : [InteractionBlockPatch.cs] 실드 활성화/비활성화 호버 힌트가 허용 멤버에게도 표시되도록 하고, 탈퇴 힌트 키 표기를 Shift+E에서 Shift+R로 변경
[1.0.31] - 2026-07-17
Files Modified / 수정 파일
ShieldBlockPatch.cs
- ✅fix4 : [ShieldBlockPatch.cs] Thrown projectiles (arrows, spears, rocks) from monsters still flew straight through the shield dome — the previous NullReferenceException guard on ShieldGenerator.OnProjectileHit fully skipped the vanilla method for the VFX-only dummy, which also skipped the projectile destroy/impact logic, not just the crashing RPC call. Now performs the destroy + Projectile.OnHit impact handling directly (skipping only the network-dependent RPC/fuel/UpdateShield calls that don't apply to a non-networked cosmetic object), so incoming projectiles are actually stopped at the boundary again
- ✅fix4 : [ShieldBlockPatch.cs] 몬스터가 던진 투척물(화살/창/돌)이 실드 돔을 그대로 뚫고 들어오던 문제 — 이전에 추가한 ShieldGenerator.OnProjectileHit NullReferenceException 가드가 VFX 전용 더미에 대해 원본 메서드 전체를 건너뛰어서, 크래시 원인이던 RPC 호출뿐 아니라 투사체 파괴/피격 처리까지 함께 사라졌던 것이 원인. 네트워크 의존 로직(RPC/연료/UpdateShield)만 건너뛰고 투사체 파괴 + Projectile.OnHit 피격 처리를 직접 수행하도록 수정해 투사체가 다시 경계에서 막히도록 변경
[1.0.30] - 2026-07-17
Files Modified / 수정 파일
Config.cs
- ✅improve1 : [Config.cs] Lv5 secondary fuel changed from Feathers x5 to Greydwarf Eye x1
- ✅improve1 : [Config.cs] 레벨 5 보조 연료를 깃털 5개 → 그레이드워프 눈 1개로 변경
[1.0.29] - 2026-07-17
Files Modified / 수정 파일
ShieldBlockPatch.cs
- ✅fix3 : [ShieldBlockPatch.cs] Monsters could still slip inside the shielded ward's boundary — Patch_MonsterAI_UpdateAI_ShieldZone only steers AI intent (Flee), so fast monsters could cross the 3m buffer within a single tick, and non-MonsterAI creatures weren't covered at all. Added a Harmony prefix on Character.UpdateMotion (the point where all movement is finally applied to the Rigidbody, for every creature type) that clamps any non-tamed creature found inside the radius to just outside the boundary and applies an outward pushback via the vanilla Character.ApplyPushback API, guaranteeing no penetration regardless of speed or AI type
- ✅fix3 : [ShieldBlockPatch.cs] 실드가 켜진 와드 경계 안으로 몬스터가 여전히 들어올 수 있던 문제 — Patch_MonsterAI_UpdateAI_ShieldZone은 AI의 이동 의도(Flee)만 바꾸므로 빠른 몬스터는 한 틱 사이에 3m 버퍼를 통과할 수 있었고, MonsterAI가 아닌 AI 타입은 애초에 대상이 아니었음. 모든 생물의 이동이 최종적으로 Rigidbody에 반영되는 지점인 Character.UpdateMotion에 Harmony prefix를 추가해, 반경 안에 있는 길들여지지 않은 생물을 경계 바로 바깥으로 즉시 고정하고 바닐라 Character.ApplyPushback API로 바깥쪽 넉백을 걸어 속도나 AI 종류와 무관하게 진입을 완전히 차단
[1.0.28] - 2026-07-17
Files Modified / 수정 파일
ShieldBlockPatch.cs
- ✅fix1 : [ShieldBlockPatch.cs] Fixed NullReferenceException in vanilla ShieldGenerator.OnProjectileHit — the VFX-only shield dummy ("TW_ShieldVFX", no ZNetView) was being registered into ShieldGenerator's global instance list and treated as a live gameplay shield by CheckProjectile(), crashing on m_nview.InvokeRPC since m_nview stays null. Added a Harmony prefix that skips vanilla shield logic whenever m_nview is null
- ✅fix1 : [ShieldBlockPatch.cs] 바닐라 ShieldGenerator.OnProjectileHit의 NullReferenceException 수정 — VFX 전용 실드 더미("TW_ShieldVFX", ZNetView 없음)가 ShieldGenerator 전역 인스턴스 목록에 등록되어 CheckProjectile()에 의해 실제 게임플레이 실드로 취급되고, m_nview가 null인 채로 InvokeRPC를 호출해 크래시가 발생하던 문제. m_nview가 null이면 바닐라 실드 로직을 건너뛰는 Harmony prefix 추가
- ✅fix2 : [ShieldBlockPatch.cs] Monsters were visibly walking into the shield dome before being repelled — Patch_MonsterAI_UpdateAI_ShieldZone only triggered Flee once a monster had already crossed the boundary (0m buffer). Added a 3m buffer so monsters turn back before touching the dome
- ✅fix2 : [ShieldBlockPatch.cs] 몬스터가 실드 돔 안으로 들어왔다가 밀려나는 것처럼 보이던 문제 — Patch_MonsterAI_UpdateAI_ShieldZone이 몬스터가 경계를 이미 넘은 뒤(여유 0m)에야 Flee를 발동시키던 것을, 돔에 닿기 전 3m 여유를 두고 미리 방향을 틀도록 수정
[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 사운드