Valheim
Install

Details

Last Updated
First Uploaded
Downloads
944
Likes
1
Size
304KB
Dependency string
korCaptain-Captain_territorial-1.0.86
Dependants
ADDatHost Valheim hosting
30% off!

Changelog / 변경 로그

2026-08-21 (v1.0.85)

  • Fixed the ward's shield still blocking hover tooltips and the "E" interact prompt for nearby objects (e.g. a chest) whenever the camera's raycast crossed the ward boundary, even while invisible — the passive shield's monster-block trigger box (TW_ShieldTrigger) had been moved to the piece_nonsolid layer to fix an earlier camera-clipping bug, but that layer is still included in Player.m_interactMask, so the invisible box (which has no Hoverable/Interactable) absorbed the player's hover raycast and stopped it from reaching anything behind it. Moved to the character_trigger layer instead — the same layer vanilla already uses for CraftingStation/EffectArea proximity detection — which is excluded from both the interact and remove-ray raycast masks while still triggering normally against character colliders, so monster push-back is unaffected
  • 카메라 시야가 와드 경계를 가로지르면(투명 상태여도) 상자 등 주변 오브젝트의 툴팁과 E 상호작용 프롬프트가 안 뜨던 문제 수정 — 패시브 보호막의 몬스터 물리 차단용 트리거 박스(TW_ShieldTrigger)가 과거 카메라 클리핑 버그 수정을 위해 piece_nonsolid 레이어로 옮겨졌었는데, 이 레이어가 여전히 Player.m_interactMask에 포함돼 있어 Hoverable/Interactable이 없는 이 투명 박스가 플레이어의 호버 레이캐스트를 그대로 가로채 뒤쪽 오브젝트에 닿지 못하게 막고 있었다. 바닐라가 CraftingStation/EffectArea 근접 감지에 이미 쓰는 character_trigger 레이어로 옮겨 해결 — 상호작용/제거 레이캐스트 마스크 어디에도 없으면서 캐릭터 콜라이더와의 트리거 충돌은 정상 동작하므로 몬스터 밀어내기 기능은 그대로 유지됨

2026-08-20 (v1.0.84)

  • Fixed the ward's hover info panel popping up even while not looking at it — the passive shield's monster-block trigger box (TW_ShieldTrigger, covering the whole ward footprint) was parented under the ward's own Hoverable object, so a camera raycast hitting this invisible box anywhere inside/near the ward area (e.g. just looking up at the sky while standing in the zone) got resolved to the ward's hover text via GetComponentInParent<Hoverable>(). The trigger object is now placed independently (matching the existing shield-dome VFX object's no-parent pattern) with its position/rotation copied explicitly, so it no longer leaks into hover detection while the physical monster-block behavior stays identical
  • 와드를 보고 있지 않아도 정보창이 뜨던 문제 수정 — 패시브 보호막의 몬스터 물리 차단용 트리거 박스(TW_ShieldTrigger, 와드 전체 범위를 덮음)가 와드 자신의 Hoverable 오브젝트의 자식으로 붙어있어, 와드 구역 안/근처 어디를 보든(예: 구역 안에서 하늘만 봐도) 카메라 레이가 이 투명 박스에 맞으면 GetComponentInParent<Hoverable>()이 와드 정보창으로 잘못 인식하고 있었다. 트리거 오브젝트를 기존 실드 돔 VFX 오브젝트와 동일한 무부모 방식으로 독립 배치(위치/회전만 명시적으로 복사)해 더 이상 호버 판정에 새지 않도록 수정 — 물리적 몬스터 차단 동작 자체는 그대로 유지됨
  • Fixed the camera still snapping into a near-first-person view near a ward's boundary even after the shield-dome VFX collider fix — the passive shield's monster-block trigger box (TW_ShieldTrigger) was on the same "piece" layer as the ward itself, which is included in every solid/camera-blocking raycast mask in vanilla Valheim. Moved it to the "piece_nonsolid" layer, which vanilla already uses specifically to mean "piece-related but excluded from solid/camera-block checks" while still fully participating in physical trigger overlap with characters, so the monster push-back behavior is unaffected
  • 실드 돔 VFX 콜라이더 수정 이후에도 와드 경계 근처에서 카메라가 여전히 1인칭처럼 당겨지던 문제 수정 — 패시브 보호막의 몬스터 물리 차단용 트리거 박스(TW_ShieldTrigger)가 와드 자신과 같은 "piece" 레이어를 쓰고 있었는데, 이 레이어는 바닐라 발헤임의 모든 고체/카메라 차단 레이캐스트 마스크에 포함되어 있었다. 발헤임이 이미 "피스 계열이지만 고체/카메라 차단 판정에서는 제외"용으로 쓰는 "piece_nonsolid" 레이어로 옮겨 해결 — 이 레이어에서도 캐릭터와의 물리 트리거 오버랩은 정상 동작하므로 몬스터 밀어내기 기능은 그대로 유지됨
  • Fixed the bottom-of-screen shield status text overlapping into an unreadable jumble when standing inside multiple overlapping wards (common when players deliberately stack 3-4 wards to extend territory) — every ward controller drew its own status text at the exact same fixed screen position. Overlapping wards now stack vertically in a stable order (based on ward registration order, so it doesn't flicker/reorder frame to frame) instead of drawing on top of each other
  • 와드를 여러 개 겹쳐 설치한 구역(영토 확장을 위해 3~4개씩 겹쳐 쓰는 경우가 흔함) 안에 있으면 화면 하단 보호 상태 텍스트가 전부 같은 좌표에 겹쳐 찍혀 읽을 수 없던 문제 수정 — 겹친 와드마다 자기 텍스트를 항상 같은 고정 좌표에 그리고 있었다. 이제 겹친 와드들이 안정적인 순서(와드 등록 순서 기준이라 프레임마다 순서가 바뀌지 않음)로 세로로 나란히 쌓여 표시됨

2026-08-19 (v1.0.81)

  • Fixed the camera snapping into a near-first-person view whenever the player got close to or stood inside a ward's shield dome. The dome's visual mesh is cloned from the vanilla Ashlands charred_shieldgenerator piece, which carries its own Collider(s); left in place, Valheim's camera-clipping raycast (which checks for solid geometry between the player and camera) treated the dome as a wall and pulled the camera in tight. The dome is purely a visual effect (rendered via the shield's screen-space image effect), so all colliders on the cloned dome are now stripped immediately after it's created
  • 와드 보호막 돔 근처/안쪽에 있을 때 카메라가 거의 1인칭처럼 바짝 당겨지던 문제 수정 — 돔 시각 효과는 바닐라 애쉬랜드 charred_shieldgenerator 피스에서 복제해오는데, 이 피스에 딸려있던 Collider가 그대로 남아있어 발헤임의 카메라 클리핑 레이캐스트(플레이어-카메라 사이 벽이 있는지 검사)가 돔을 벽으로 인식해 카메라를 당기고 있었다. 돔은 화면 이펙트로만 그려지는 순수 시각 요소이므로, 생성 직후 복제된 돔의 모든 Collider를 제거하도록 수정
  • Added a shield_dome_visible config toggle (General, default on) to hide the shield dome's screen visual entirely — the underlying shield gameplay (Lv5+ full invincibility, Lv1+ passive HP shield, monster physical block) is unaffected either way, only the on-screen dome rendering is gated
  • 보호막 돔 화면 표시를 완전히 끌 수 있는 shield_dome_visible 설정 추가(General, 기본 켜짐) — 꺼도 실드 게임플레이(레벨5+ 완전무적, 레벨1+ 패시브 HP 보호막, 몬스터 물리 차단)는 그대로 작동하고 화면 상 돔 표시만 사라짐

2026-08-17 (v1.0.79)

  • Fixed the passive shield's dome visual not showing (or barely showing) at Lv2+ wards, especially noticeable right after loading a save where the ward was already Lv2+ — the dome's actual on-screen size (localScale) is smoothed toward the target radius frame by frame in vanilla's ShieldGenerator.Update() rather than snapping instantly, and it was never set explicitly on creation, so it started from the source Ashlands prefab's own (much smaller) default scale. The gap was small enough to go unnoticed at Lv1 but grew with each level. Now snapped to the correct scale immediately both when the dome is first created and whenever the ward's level changes
  • 레벨2+ 와드에서 보호막 돔 그래픽이 안 보이거나 거의 안 보이던 문제 수정 — 특히 이미 레벨2+ 상태인 와드가 있는 세이브를 불러온 직후 두드러짐. 돔의 실제 화면 크기(localScale)는 바닐라 ShieldGenerator.Update()에서 목표 반경을 향해 매 프레임 서서히 보간될 뿐 즉시 스냅되지 않는데, 생성 시점에 한 번도 직접 설정한 적이 없어 원본 애쉬랜드 프리팹의 (훨씬 작은) 기본 스케일에서 시작하고 있었다. 레벨1은 격차가 작아 눈에 덜 띄었지만 레벨이 오를수록 격차가 커짐. 돔을 처음 만들 때와 와드 레벨이 바뀔 때 모두 즉시 정확한 크기로 스냅하도록 수정
  • Fixed the passive shield taking contact/attack drain damage from non-hostile wildlife (deer, boar, chicken, etc.) and any non-monster damage source (fall damage, fire, decay, friendly fire) as if it were a real monster attack, which could burn through a Lv1 shield's 200 HP in well under a minute with no actual monster present. All shield-drain paths (LateUpdate() contact drain, WearNTear/Character ApplyDamage absorption, and the Humanoid.StartAttack siege drain) now require the damage source to actually be a hostile monster faction (Character.IsMonsterFaction) — wildlife is still physically pushed back at the boundary as before, it just no longer costs shield HP
  • 사슴/멧돼지/닭 같은 비적대 야생동물과 낙사/화상/부식/PvP 등 몬스터가 아닌 피해까지 실제 몬스터 공격처럼 패시브 보호막을 깎던 문제 수정 — 몬스터가 전혀 없어도 야생동물이 경계에 닿기만 하면 레벨1 기준 200 HP 보호막이 1분도 안 돼 파괴될 수 있었다. 보호막을 깎는 모든 경로(LateUpdate() 접촉 드레인, WearNTear/Character ApplyDamage 흡수, Humanoid.StartAttack 공성 드레인)가 이제 실제 적대 몬스터(Character.IsMonsterFaction)의 피해일 때만 작동한다 — 야생동물은 기존처럼 경계에서 밀려나기만 하고 더 이상 보호막 체력을 소모하지 않는다
  • Fixed the passive shield still repeatedly dropping to 0 and slowly regenerating with no monster in sight even after the previous fix — the two projectile/object-hit drain paths (Projectile.FixedUpdate's boundary check and ShieldGenerator.OnProjectileHit, the latter also triggered by non-projectile hazard objects like Ashlands' Cinder ash/embers) never verified the source was actually a hostile monster, so a player's own arrow crossing the boundary or ambient Ashlands ash could drain the shield repeatedly faster than the default 1 HP/min regen could keep up. Both paths now require the projectile's owner to be a genuine monster faction (Character.IsMonsterFaction) before draining; the existing block/destroy behavior for those objects is unchanged
  • 이전 수정 이후에도 몬스터가 전혀 안 보이는데 보호막이 반복적으로 0이 됐다가 서서히 회복되던 문제 수정 — 발사체/오브젝트 피격 드레인 경로 2곳(Projectile.FixedUpdate 경계 검사와, 애쉬랜드 화산재/불씨 같은 비발사체 위험 오브젝트에도 호출되는 ShieldGenerator.OnProjectileHit)이 실제 공격 주체가 적대 몬스터인지 전혀 검증하지 않아, 플레이어 자신이 경계 너머로 쏜 화살이나 애쉬랜드 주변 환경 위험 요소만으로도 기본 회복량(1 HP/분)을 따라잡지 못할 만큼 빠르게 반복 드레인될 수 있었다. 두 경로 모두 이제 발사체 소유자가 실제 몬스터(Character.IsMonsterFaction)일 때만 보호막을 깎으며, 기존 차단/파괴 동작은 그대로 유지된다

2026-08-16 (v1.0.76)

  • Fixed monsters still briefly slipping a step or two inside the shield boundary before being pushed back, and fixed body-checking the boundary (without swinging a weapon) not costing any shield energy at all. OnTriggerStay reacts to Unity's physics trigger pass, but if Valheim's own character movement (CustomFixedUpdate, invoked manually from within some other script's FixedUpdate) runs after that pass completes for the same tick, our correction ends up chasing one tick behind. Added a LateUpdate() correction — guaranteed by Unity to run after every Update()/FixedUpdate() for that frame has finished — that re-confirms the final position every rendered frame and, whenever it actually had to push a hostile back, drains the shield by a new passive_shield_contact_damage_per_second amount (scaled by Time.deltaTime), independent of the existing exact-weapon-damage drain on actual attack swings
  • 몬스터가 경계를 살짝 넘어 한두 걸음 들어왔다가 밀쳐지던 문제와, 무기를 휘두르지 않고 몸으로만 부딪힐 때는 보호막 에너지가 전혀 깎이지 않던 문제 수정. OnTriggerStay는 Unity 물리 트리거 판정 시점에 반응하는데, Valheim 자체 캐릭터 이동(CustomFixedUpdate, 다른 스크립트의 FixedUpdate 안에서 수동 호출됨)이 같은 틱에서 그 판정 이후에 실행되면 우리 보정이 한 틱씩 늦게 쫓아가게 된다. 그 프레임의 모든 Update()/FixedUpdate() 처리가 끝난 뒤 Unity가 보장적으로 마지막에 호출해주는 LateUpdate()에서 매 렌더 프레임마다 최종 위치를 재확정하고, 실제로 밀어낸 경우(=몸으로 부딪힘)에는 새 passive_shield_contact_damage_per_second 설정값(Time.deltaTime로 스케일링)만큼 보호막을 깎도록 추가 — 실제 무기 스윙 시의 정확한 데미지 드레인과는 별개로 동작함
  • Fixed the physical block still not reliably stopping monsters from entering — repeatedly chasing Valheim's internal method call order (UpdateMotionCustomFixedUpdate) to find the "last" point in the tick kept getting outraced by some other internal step that moves the character afterward. Replaced with a Unity trigger collider (OnTriggerStay) covering the ward's full rectangle, which is driven by the physics engine itself rather than by guessing Valheim's custom update order — non-player, non-tamed characters inside get clamped back out and pushed every physics step regardless of what else is going on internally. Being a trigger (not solid), the owner and tamed animals can still walk in and out of their own base freely
  • 몬스터가 여전히 안정적으로 막히지 않던 물리 차단 문제 수정 — Valheim 내부 메서드 호출 순서(UpdateMotionCustomFixedUpdate)를 따라가며 "그 틱의 마지막 지점"을 계속 찾는 방식은, 그 이후에 캐릭터 위치를 바꾸는 또 다른 내부 처리에 매번 따라잡혀 뚫릴 수 있었다. 대신 와드 사각형 전체를 덮는 Unity 트리거 콜라이더(OnTriggerStay)로 교체 — Valheim의 커스텀 업데이트 순서를 추측하는 대신 물리 엔진 자체가 매 물리틱 신뢰성 있게 호출해준다. 비플레이어·비길들여진 캐릭터만 안에 있으면 매 틱 바깥으로 되밀어내며, 트리거(솔리드 아님)이므로 소유자와 길들인 동물은 평소처럼 자기 기지를 자유롭게 드나들 수 있음
  • Added a Lv1+ passive HP-based territory shield (200/400/600/800/1000/1200/1500/2000 by level) that always absorbs incoming damage while up, shows current/max on the ward hover text and HUD (e.g. 240 / 400), physically blocks monsters from entering while it holds, drains as monsters get stuck sieging the boundary, regenerates 1 HP per real-time minute once broken, and pauses while the existing Lv5+ full invincibility (K key) is active — reverting to the HP display once that ends
  • 레벨1부터 항상 켜져 있는 체력형 영토 보호막 추가(레벨별 200/400/600/800/1000/1200/1500/2000) — 데미지를 받으면 수치가 깎이고, 와드 호버 텍스트/HUD에 현재·최대 수치가 240 / 400 형식으로 표시되며, 살아있는 동안 몬스터가 물리적으로 안으로 들어오지 못하고 경계에서 막혀 보호막을 깎아나간다. 0이 되면 사라지고 실제 시간 1분당 1씩 자동 회복. 레벨5+ 기존 K키 완전무적이 켜져 있는 동안은 수치가 깎이지 않고 표시가 "완전무적"으로 전환되며, 종료 시 다시 수치 표시로 돌아옴
  • Fixed monsters still being able to walk fully inside the passive shield (the position-clamp ran as a Prefix on Character.UpdateMotion, so the AI's own UpdateWalking step — called from inside that same method — could re-advance the monster past the boundary on the same frame; moved to a Postfix and now also cancels the inward velocity component), fixed monster projectiles passing straight through instead of being blocked (vanilla ShieldGenerator.CheckProjectile's global-instance heuristic wasn't reliable with multiple simultaneous ward domes; added an independent per-ward rectangle check on Projectile.FixedUpdate), switched the passive shield's damage absorption from blocking WearNTear.Damage/Character.Damage outright (which skipped vanilla's hit spark/sound and the "base under attack" ward alert entirely, since those actually live inside the RPC-only RPC_DamageApplyDamage chain that never got invoked) to intercepting ApplyDamage's health-loss step instead, so the vanilla hit effects/alert still play in full while only the actual HP loss gets redirected into the shield, and added natural-spawn suppression inside active wards regardless of level/size via SpawnSystem.IsSpawnPointGood
  • 몬스터가 패시브 보호막 안으로 완전히 걸어 들어올 수 있던 문제 수정(위치 클램프가 Character.UpdateMotion의 Prefix로 걸려 있어, 같은 메서드 내부에서 호출되는 AI의 UpdateWalking 단계가 같은 프레임에 다시 경계 안쪽으로 밀고 들어올 수 있었음 — Postfix로 전환하고 안쪽 방향 속도 성분도 함께 제거), 몬스터 투사체가 그대로 뚫고 들어오던 문제 수정(바닐라 ShieldGenerator.CheckProjectile의 전역 인스턴스 기반 판정이 와드 여러 개가 동시에 돔을 등록하는 상황에서 신뢰할 수 없었음 — Projectile.FixedUpdate에 와드별 독립적인 사각형 경계 판정 추가), 보호막이 데미지를 흡수할 때 바닐라 피격 스파크/사운드와 "기지 공격받음" 와드 경고가 전혀 재생되지 않던 문제 수정(WearNTear.Damage/Character.Damage 자체를 막아 그 이펙트/알림이 들어있는 RPC_DamageApplyDamage 체인이 아예 호출되지 않았음 — 대신 ApplyDamage의 체력 차감 단계만 가로채도록 변경해 이펙트/알림은 그대로 재생하고 실제 피해만 보호막으로 돌림), 영토 와드 범위가 넓어져도 그 안에서 몬스터가 자연 스폰되지 않도록 SpawnSystem.IsSpawnPointGood에 레벨 무관 차단 추가
  • Fixed blocked monster projectiles not draining the passive shield's HP — the actual block was happening through vanilla's ShieldGenerator.OnProjectileHit (reached via the existing VfxGuard prefix), not the new independent Projectile.FixedUpdate check, so the drain call there was never reached; added a companion prefix on OnProjectileHit that identifies which ward's dummy shield generator got hit and drains it by that exact projectile's damage before it gets destroyed
  • 막힌 몬스터 투사체가 보호막 수치를 깎지 못하던 문제 수정 — 실제 차단은 (기존 VfxGuard prefix를 거쳐) 바닐라 ShieldGenerator.OnProjectileHit이 처리하고 있어서, 새로 추가했던 독립적인 Projectile.FixedUpdate 검사의 드레인 호출까지 도달하지 못했음 — OnProjectileHit에 이 히트가 어느 와드의 더미 실드 제너레이터인지 식별해 파괴되기 전에 정확한 투사체 데미지만큼 깎는 동반 prefix 추가
  • Fixed the physical block still letting monsters creep fully inside (the clamp patched Character.UpdateMotion, but Character.CustomFixedUpdate calls SyncVelocity() right after UpdateMotion returns, re-overwriting our velocity cancellation with the cached inward velocity every tick — moved the patch to CustomFixedUpdate itself, the true end-of-tick point, with an explicit owner check to match the original's gating) and fixed melee attacks against the boundary not draining the shield at all (replaced the 1Hz IsAlerted() + flat-rate siege tick, which wasn't reliably triggering and used an arbitrary damage number instead of the attacker's real damage, with an event-driven Humanoid.StartAttack postfix that drains the shield by that exact monster's current weapon damage whenever it swings while blocked at the boundary — PassiveShieldSiegeDamagePerSecond config removed as it's no longer used)
  • 몬스터가 여전히 보호막 안쪽으로 서서히 파고들던 문제 수정(클램프가 Character.UpdateMotion을 패치하고 있었는데, Character.CustomFixedUpdateUpdateMotion 직후 SyncVelocity()를 호출해 우리가 상쇄한 속도를 매 틱 캐시된 안쪽 방향 속도로 다시 덮어쓰고 있었음 — 패치 대상을 그 틱의 진짜 마지막 지점인 CustomFixedUpdate 자체로 옮기고 원본과 동일하게 소유자 체크를 명시적으로 추가), 경계에서 근접 공격을 해도 보호막이 전혀 깎이지 않던 문제 수정(신뢰도 낮게 발동하던 IsAlerted() + 고정 배율 기반 1초 주기 공성 틱을, 몬스터가 경계에 막힌 채 스윙할 때마다 그 몬스터의 실제 장착 무기 데미지만큼 정확히 깎는 이벤트 기반 Humanoid.StartAttack postfix로 교체 — 더 이상 쓰지 않는 PassiveShieldSiegeDamagePerSecond 설정 제거)

2026-08-12 (v1.0.70)

  • Sap Collector still could not be placed anywhere, even with zero Territory Wards on the map, despite the 1.0.65 changelog claiming it was already exempted — the always-allowed list had "SapCollector" (PascalCase, no prefix) while the real vanilla prefab name is piece_sapcollector, so the case-sensitive match never fired and placement always fell through to the ward-required block. Fixed the entry to piece_sapcollector
  • 와드가 전혀 없는 장소에서도 수액 채취기가 계속 설치되지 않던 문제 수정 — 1.0.65 changelog에는 이미 예외 처리됐다고 기록되어 있었지만, 항상 허용 목록에 "SapCollector"(PascalCase, 접두사 없음)로 등록되어 있었고 실제 바닐라 프리팹 이름은 piece_sapcollector라 대소문자 불일치로 매칭이 한 번도 성공하지 못해 계속 와드 필요 블록으로 떨어졌다. piece_sapcollector로 수정

[1.0.69] - 2026-08-10

  • ✅fix1 : Tree sapling placement was still blocked outside an active Territory Ward despite the 1.0.58 changelog claiming an exception — IsTreeSapling() matched a "sapling_" prefix, but real vanilla tree prefabs (Beech_Sapling, Birch_Sapling, FirTree_Sapling, Oak_Sapling, PineTree_Sapling) use a "_Sapling" suffix; the prefix form actually belongs to crop plants (sapling_carrot, sapling_onion, etc.), so the exception matched the exact opposite of what it was meant to and never fired for real trees. Switched the check to match the _Sapling suffix instead
  • ✅fix1 : 1.0.58 changelog에는 나무 묘목이 와드 상태와 무관하게 심어진다고 기록되어 있었지만, 실제로는 활성 와드 밖에서 계속 막혀 있던 버그 수정 — IsTreeSapling()"sapling_" 접두사로 매칭했는데, 실제 바닐라 나무 프리팹(Beech_Sapling, Birch_Sapling, FirTree_Sapling, Oak_Sapling, PineTree_Sapling)은 _Sapling 접미사 형식이고, 접두사 형식은 오히려 작물류(sapling_carrot, sapling_onion 등)에 해당해 정확히 반대로 매칭하고 있어 실제 나무는 한 번도 걸리지 않았다. 접미사 검사로 교체
  • ✅new1 : Territory Ward is no longer destructible by monster attacks at any level — the ward object itself is now always immune to WearNTear damage regardless of level or whether the Lv5+ shield is active. Previously the ward had no damage protection at all unless a Lv5+ owner manually activated the shield; other buildings inside the zone are unaffected and still only protected while that shield is on
  • ✅new1 : 영토 와드가 어떤 레벨에서도 몬스터 공격으로 파괴되지 않도록 수정 — 레벨이나 Lv5+ 실드 활성 여부와 무관하게 와드 오브젝트 자신은 항상 WearNTear 데미지에 면역이 된다. 이전에는 Lv5+ 설치자가 실드를 수동으로 켜지 않는 한 와드 자체에 아무 보호도 없었다. 구역 내 다른 건물은 영향받지 않으며 여전히 실드가 켜져 있을 때만 보호된다

[1.0.68] - 2026-08-10

  • ✅fix1 : The Harmony prefix added in 1.0.58 only guarded the name-based Inventory.RemoveItem(string, int, int, bool) overload against external "pull fuel from nearby containers" style access. It missed the ItemData-reference overloads (RemoveItem(ItemDrop.ItemData), RemoveItem(ItemDrop.ItemData, int), RemoveOneItem(ItemDrop.ItemData)), which is what let materials still get silently drained from ward storage when crafting elsewhere. All three are now guarded the same way, but withdrawal is still allowed when the ward's own fuel/shield consumption is in progress, or when a permitted player has the storage genuinely open in the container UI (manual drag/quick-move) — only access through a raw Inventory reference held by outside code is blocked
  • ✅fix1 : 1.0.58에서 추가한 Harmony prefix는 이름 기반 Inventory.RemoveItem(string, int, int, bool) 오버로드만 막고 있어, 다른 곳에서 제작할 때 이 오버로드가 아닌 ItemData 참조 기반 오버로드(RemoveItem(ItemDrop.ItemData), RemoveItem(ItemDrop.ItemData, int), RemoveOneItem(ItemDrop.ItemData))로 연료 창고 재료가 몰래 빠져나가는 경로는 막지 못했다. 세 오버로드 모두 같은 방식으로 차단하도록 추가했으며, 이 모드 자신의 연료/실드 소모나 허용된 플레이어가 실제로 창고 UI를 열어 직접 드래그/퀵무브하는 정당한 조작(InventoryGui.m_currentContainer가 이 저장고를 가리킬 때)은 그대로 허용된다 — 외부 코드가 Inventory 참조를 직접 들고 조작하는 경우만 차단된다
  • ✅fix2 : Fixed the Q-key fuel storage shortcut opening the ward's storage for any player hovering the ward, regardless of permission — it called Container.Interact() directly, bypassing the Player.Interact access gate that the vanilla E-key path goes through. Now checks PrivateArea.HaveLocalAccess() first and reports an intrusion alert + denial message instead of opening the UI for non-members
  • ✅fix2 : Q키로 연료 창고를 여는 단축키가 권한과 무관하게 와드를 호버 중인 아무 플레이어에게나 창고를 열어주던 문제 수정 — Container.Interact()를 직접 호출해 바닐라 E키 경로가 거치는 Player.Interact 접근 검사를 건너뛰고 있었다. 이제 먼저 PrivateArea.HaveLocalAccess()를 확인하고, 권한이 없으면 창고를 열지 않고 침입 경고와 거부 메시지만 표시한다
  • ✅improve1 : Territory Ward removal (hammer remove tool) was already restricted to the creator only; extended it so a server admin or host can also remove it, matching the same ZNet.LocalPlayerIsAdminOrHost() check already used elsewhere in this mod for admin bypass
  • ✅improve1 : 영토 와드 제거(망치 제거 도구)는 기존에도 설치자만 가능하도록 막혀 있었는데, 이 모드의 다른 관리자 우회 검사에서 이미 쓰던 ZNet.LocalPlayerIsAdminOrHost()를 그대로 사용해 서버 관리자/호스트도 제거할 수 있도록 확장했다

[1.0.67] - 2026-08-10

  • ✅new1 : Territory Shield (Lv5+) no longer ends after a single fixed 1-hour timer — it now auto-renews every hour by consuming 1x Surtling Core from ward storage as long as stock remains. Manual pause/resume (banked remaining time) is unchanged; when Surtling Core runs out the shield ends naturally with a one-time warning, and auto-renewal resumes automatically once more Surtling Core is stored
  • ✅new1 : Lv5+ 영토 보호(실드)가 더 이상 고정된 1시간 타이머로 끝나지 않습니다 — 연료 창고에 슈르트링 코어가 남아있는 한 매시간 1개씩 자동으로 소모하며 계속 갱신됩니다. 수동 정지/재개(잔여시간 보관) 동작은 그대로이며, 슈르트링 코어가 떨어지면 실드가 자연 종료되며 1회만 경고 메시지가 뜨고 코어를 다시 채우면 다음 체크에서 자동으로 갱신이 재개됩니다

[1.0.66] - 2026-08-09

  • ✅fix1 : [BuildRestrictionPatch.cs][InteractionBlockPatch.cs] Territory wards only check horizontal (XZ) position, but Valheim dungeon interiors are generated 5000m straight up from the entrance (same XZ, different Y) — a surface ward built near a dungeon entrance could incorrectly cover/restrict building and interactions inside that dungeon. Dungeon interiors (Character.InInterior, Y > 3000) are now always exempt from ward build and interaction restrictions
  • ✅fix1 : [BuildRestrictionPatch.cs][InteractionBlockPatch.cs] 영토 와드는 수평(XZ) 위치만 판정하는데, 발헤임 던전 내부는 입구에서 수직으로 5000m 위(같은 XZ, 다른 Y)에 생성된다 — 던전 입구 근처 지상에 와드를 지으면 던전 내부 건설/상호작용까지 잘못 영향을 받는 문제가 있었다. 이제 던전 내부(Character.InInterior, Y > 3000)는 와드의 건설·상호작용 제한을 항상 받지 않는다
  • ✅fix2 : Sap Collector (vanilla Mistlands piece, must be placed directly on Yggdrasil roots) had no exception and was incorrectly blocked outside active wards like any other building. Added to the always-allowed piece list alongside workbench/portal/cart/ships
  • ✅fix2 : 수액 채취기(바닐라 미스트랜드 피스, 이그드라실 뿌리 위에만 설치 가능)가 예외 처리가 없어 일반 건축물처럼 활성 와드 밖에서 설치가 막혀 있던 문제 수정 — 작업대/포탈/수레/배와 같은 항상 허용 목록에 추가

[1.0.65] - 2026-08-07

  • ✅fix1 : Territory ward pins are now always visible on the map instead of only appearing once the player walks close enough for the ward's GameObject to load — a new manager scans ZDOMan for every known territoryward ZDO every 5 seconds and keeps minimap pins in sync regardless of proximity. Removed the old per-instance pin add/remove in TerritoryWardController (fired only on local spawn/despawn) and wired the periodic scan into Plugin.cs
  • ✅fix1 : 영토 와드 핀이 플레이어가 가까이 가서 와드 오브젝트가 로드되어야만 지도에 보이던 문제 수정 — 새 매니저가 5초마다 ZDOMan에 알려진 모든 territoryward ZDO를 스캔해 거리와 무관하게 미니맵 핀을 항상 동기화한다. TerritoryWardController의 기존 인스턴스별 핀 추가/제거(로컬 스폰/디스폰 시에만 동작)를 제거하고 Plugin.cs에 주기 스캔을 연결함

[1.0.64] - 2026-08-06

  • ✅fix1 : Fixed a bug where the per-character ward_limit (default 2) could be bypassed by placing wards far apart — the local count only tallied wards currently loaded in TerritoryWard.s_wards, which drop out on zone unload. Placement now triggers a host-authoritative full-map ZDO scan that reverts the newest ward if it pushes the creator's count over the limit
  • ✅fix1 : 캐릭터당 ward_limit(기본 2개) 제한을 와드를 멀리 떨어뜨려 우회할 수 있던 버그 수정 — 로컬 카운트가 존 언로드 시 빠지는 TerritoryWard.s_wards만 셌던 것이 원인. 이제 배치 시 호스트가 맵 전체 ZDO를 스캔해 제한 초과 시 방금 배치된 와드를 자동 철거함

[1.0.63] - 2026-08-06

  • ✅improve1 : Baked in every value the user had already hand-tuned live via the in-game config UI as the new code defaults, so fresh installs/new saves start from the tested numbers instead of the original placeholders: Lv1 size 15→16.5m; Lv3 fuel amount 2→1 and interval 8→9min; Lv4 size 28.5→27.5m, fuel amount 2→1, interval 10→11min; Lv5 primary fuel FineWood→Barley, amount 3→1, interval 11→13min; Lv6 fuel amount 2→1, secondary amount 1→0, interval 12→15min; Lv7 primary fuel YggdrasilWood→Wood, interval 15→17min; Lv8 fuel amount 3→1, secondary amount 1→0, interval 16→20min. Legacy unbound leftover sections in the live config ([Level N], [Upgrade LvN]) were ignored since no current code reads them
  • ✅improve1 : 사용자가 게임 내 설정 UI로 이미 손수 조정해둔 값들을 코드 기본값으로 그대로 반영 — 새로 설치하거나 새 세이브를 시작해도 검증된 수치로 시작하도록: Lv1 크기 15→16.5m; Lv3 연료량 2→1, 간격 8→9분; Lv4 크기 28.5→27.5m, 연료량 2→1, 간격 10→11분; Lv5 주연료 FineWood→Barley, 연료량 3→1, 간격 11→13분; Lv6 연료량 2→1, 보조연료량 1→0, 간격 12→15분; Lv7 주연료 YggdrasilWood→Wood, 간격 15→17분; Lv8 연료량 3→1, 보조연료량 1→0, 간격 16→20분. 라이브 config에 남아있던 미사용 레거시 섹션([Level N], [Upgrade LvN])은 현재 코드가 읽지 않으므로 반영 대상에서 제외

[1.0.62] - 2026-08-06

  • ✅improve1 : Adjusted Territory Ward size once more — Lv1 anchored to 15x15m, every other level scaled by the same ratio (Lv1 15x15 → Lv8 45x45m)
  • ✅improve1 : 영토 와드 크기를 다시 조정 — Lv1을 15x15m 기준으로 하고 나머지 레벨도 동일 비율로 축소 (Lv1 15x15 → Lv8 45x45m)

[1.0.61] - 2026-08-06

  • ✅improve1 : Adjusted Territory Ward size again per feedback — Lv1 anchored to 20x20m, every other level scaled by the same ratio (Lv1 20x20 → Lv8 60x60m)
  • ✅improve1 : 영토 와드 크기를 다시 조정 — Lv1을 20x20m 기준으로 하고 나머지 레벨도 동일 비율로 축소 (Lv1 20x20 → Lv8 60x60m)

[1.0.60] - 2026-08-06

  • ✅improve1 : Territory Ward felt too large after the previous 3x increase, so scaled every level back down proportionally, anchored to the requested Lv1 25x25m (Lv1 25x25 → Lv8 75x75m)
  • ✅improve1 : 이전 3배 확대 후 영토 와드가 너무 크다는 피드백을 반영해, 요청받은 Lv1 25x25m을 기준으로 전 레벨을 동일 비율로 축소 (Lv1 25x25 → Lv8 75x75m)

[1.0.59] - 2026-08-06

  • ✅fix1 : Fixed non-creator self-join/leave (E key while OFF, or Shift+R) silently failing to stick even when the pre-check correctly allowed it. Two separate Harmony prefixes were both patching vanilla PrivateArea.RPC_TogglePermitted for territoryward instances — the older reflection-based one in InteractionBlockPatch.cs (added to let anyone self-toggle) and the newer one in PermittedToggleAlwaysPatch.cs (added to let the creator's whitelist UI add/kick members even while the ward is ON). Harmony runs every matching prefix regardless of another prefix's return value, so a non-creator's own join/leave request toggled the permitted list twice per attempt — once from each patch — and canceled itself out, leaving the player's membership unchanged no matter how many times they tried. Removed the redundant older patch and moved the "creator bypasses the ON-state restriction, everyone else must be OFF to join/leave" branching into the single remaining patch, and added the same OFF-only check with a proper "$territoryward_join_blocked_while_active" message to the Shift+R handler (previously it invoked the RPC unconditionally and failed silently while the ward was ON)
  • ✅fix1 : 비설치자 본인의 가입/탈퇴(OFF 상태에서 E키, 또는 Shift+R)가 사전 조건은 맞는데도 조용히 반영이 안 되던 버그 수정. 바닐라 PrivateArea.RPC_TogglePermitted를 영토 와드 인스턴스에 대해 서로 다른 두 개의 Harmony prefix가 동시에 패치하고 있었다 — InteractionBlockPatch.cs의 오래된 리플렉션 기반 패치(누구나 자가 토글 가능하게 하려고 추가)와, PermittedToggleAlwaysPatch.cs의 더 최근 패치(와드가 켜져 있어도 설치자의 화이트리스트 UI 추가/추방이 되게 하려고 추가). Harmony는 한 prefix의 반환값과 무관하게 같은 메서드에 걸린 모든 prefix를 전부 실행하기 때문에, 비설치자 본인의 가입/탈퇴 요청 한 번에 두 패치가 각각 한 번씩, 총 두 번 허용 목록을 토글해버려 서로 상쇄되어 아무리 시도해도 멤버십이 그대로였다. 중복된 구버전 패치를 제거하고, "설치자는 켜진 상태에서도 예외, 그 외엔 꺼져 있을 때만 가입/탈퇴 허용" 분기를 남은 패치 하나로 합쳤으며, Shift+R 핸들러에도 같은 OFF 전용 검사와 $territoryward_join_blocked_while_active 안내 메시지를 추가했다 (기존엔 켜진 상태에서도 무조건 RPC를 호출해 조용히 실패했음)

[1.0.58] - 2026-08-06

  • ✅improve1 : Tripled every level's Territory Ward width/depth default (Lv1 30x30 → Lv8 90x90m) since the previous rectangle-size fix still felt too small
  • ✅improve1 : 이전에 원형 반경과 비슷하게 맞췄던 영토 와드 가로/세로 기본값이 여전히 좁다는 피드백을 반영해 모든 레벨의 크기를 3배로 확대 (Lv1 30x30 → Lv8 90x90m)
  • ✅fix2 : Re-closed a previously-fixed loophole where the ward's fuel storage could be silently drained from outside (e.g. by another mod's "pull fuel from nearby containers" feature, or any external code holding a reference to the storage's Inventory) even though Player.Interact itself was already gated to permitted members only. Added a Harmony prefix on Inventory.RemoveItem(string, int, int, bool) — the name-based "withdraw N of this item" overload used by automated/scripted consumption — that no-ops for the ward's storage unless the withdrawal originates from this mod's own legitimate fuel/shield-item consumption (TerritoryWardController.RemoveFromWardStorage, gated by a reentrancy flag). Manual drag-and-drop by a permitted player, which uses a different ItemData-reference overload, is unaffected
  • ✅fix2 : 예전에 막았던 "와드 연료 창고가 외부에서 몰래 빠져나가는" 문제가 다시 풀려있던 것을 재수정. Player.Interact 자체는 이미 허용 멤버만 열 수 있게 막혀 있었지만, 다른 모드의 "근처 창고에서 연료 자동 인출" 같은 기능이나 이 저장고의 Inventory 참조를 직접 들고 있는 외부 코드는 그 검사를 거치지 않고 바로 아이템을 빼갈 수 있었다. 자동화된 소모가 흔히 쓰는 "이름으로 N개 인출" 오버로드인 Inventory.RemoveItem(string, int, int, bool)에 Harmony prefix를 추가해, 이 모드 자신의 정당한 연료/실드 아이템 소모(TerritoryWardController.RemoveFromWardStorage, 재진입 플래그로 판별)가 아니면 와드 창고에 대해서는 아무 동작도 하지 않도록 차단했다. 허용된 멤버가 UI에서 직접 드래그로 꺼내는 조작은 다른(ItemData 참조 기반) 오버로드를 쓰므로 영향받지 않는다
  • ✅new1 : Tree saplings (sapling_beech/birch/oak/pine/fir/yggashoot, etc.) can now be planted anywhere regardless of Territory Ward state, same as the workbench/portal/basic campfire exceptions. Crop seeds are unaffected since vanilla uses the opposite naming pattern (e.g. onion_sapling), so the new TerritoryWard.IsTreeSapling() prefix check only matches actual trees
  • ✅new1 : 나무 묘목(sapling_beech/birch/oak/pine/fir/yggashoot 등)은 작업대/포탈/기본 모닥불처럼 영토 와드 상태와 무관하게 어디서나 심을 수 있도록 예외 추가. 작물 씨앗은 바닐라 명명 규칙이 반대(onion_sapling 등 접미사 형식)라 새로 추가한 TerritoryWard.IsTreeSapling() 접두사 검사에 걸리지 않으므로, 실제 나무만 정확히 예외 처리된다

[1.0.57] - 2026-08-05

  • ✅fix1 : Territory Ward default sizes from the previous update (Lv1 3x4 ~ Lv8 6.5x6.5m) were far too small compared to the old circular radius (Lv1 10m ~ Lv8 30m), making the new rectangle feel cramped. Reverted the default width/depth of every level back to a square using the original radius value directly (Lv1 10x10 ~ Lv8 30x30m), so the footprint matches the pre-change scale while staying a rotatable rectangle
  • ✅fix1 : 이전 업데이트의 영토 와드 기본 크기(Lv1 3x4 ~ Lv8 6.5x6.5m)가 기존 원형 반경(Lv1 10m ~ Lv8 30m)에 비해 너무 작아 답답하다는 피드백을 반영. 모든 레벨의 기본 가로/세로 값을 기존 반경 값을 그대로 사용한 정사각형(Lv1 10x10 ~ Lv8 30x30m)으로 되돌려, 회전 가능한 사각형은 유지하면서 이전과 비슷한 크기감을 갖도록 수정

[1.0.56] - 2026-08-05

  • ✅improve1 : Territory Ward range changed from a circular radius to a per-level width x depth rectangle that rotates with the piece's placement orientation (Lv1 3x4 → Lv8 6.5x6.5m, replacing the old 10m~30m radius scale). Since vanilla PrivateArea.CheckAccess (used natively by Door, Container, MineRock5, Turret, WearNTear, etc. for ownership checks) calls PrivateArea.IsInside() internally, a single Harmony prefix on PrivateArea.IsInside() scoped to territoryward instances now redirects that check to the new rectangle test — this keeps every vanilla object built inside a ward consistent with the ward's actual boundary, not just this mod's own build/interaction patches. The Lv5+ shield's hard physical push-back (Character.UpdateMotion) was converted from a circular clamp to a nearest-edge rectangle clamp so monsters can no longer clip into a rectangle corner that a circular check would have missed; the shield dome VFX itself intentionally stays spherical (sized to the rectangle's circumscribed radius) since only the visible dome shape was requested to stay as-is. The ground range ring also switched from the vanilla circular CircleProjector to a new LineRenderer-based rectangle outline that matches the real boundary exactly
  • ✅improve1 : 영토 와드 범위를 원형 반경에서 레벨별 가로x세로 사각형으로 변경 — 피스 설치 회전 방향을 그대로 따라간다 (Lv1 3x4 → Lv8 6.5x6.5m, 기존 10m~30m 반경 스케일을 대체). 바닐라 PrivateArea.CheckAccess(Door/Container/MineRock5/Turret/WearNTear 등이 소유권 판정에 직접 사용)가 내부적으로 PrivateArea.IsInside()를 호출하는 점을 확인하고, territoryward 인스턴스에 한해 PrivateArea.IsInside() 자체를 Harmony로 가로채는 패치 하나로 사각형 판정을 적용했다 — 이 모드 자체의 건설/상호작용 패치뿐 아니라 와드 영역 안에 지어진 모든 바닐라 오브젝트의 소유권 판정까지 실제 경계와 정확히 일치하게 된다. Lv5+ 실드의 물리적 강제 밀어내기(Character.UpdateMotion)도 원형 클램프에서 사각형 최단 변 클램프로 교체해, 원형 판정이라면 놓쳤을 사각형 모서리로 몬스터가 파고드는 문제를 막았다. 실드 돔 VFX 자체는 사용자 요청대로 눈에 보이는 모양만 기존 구형(사각형을 감싸는 외접원 반경 기준)을 그대로 유지했다. 바닥의 범위 링도 바닐라 원형 CircleProjector 대신 실제 경계와 정확히 일치하는 신규 LineRenderer 사각형 윤곽으로 교체했다

[1.0.55] - 2026-08-04

[1.0.55] - 2026-08-04

  • ✅fix1 : Fixed the whitelist panel (Shift+E) showing a completely empty known-players list for clients who had already connected to the same dedicated server multiple times in the current game session. RegisterRpcs() used a static bool s_registered that, once set on the first ZNet.Awake, permanently blocked re-registration on every later reconnect — even though each reconnect creates a brand-new ZRoutedRpc.instance. This meant the sync RPC handler was never re-registered on the new instance and RequestFromServer() was never called again after the very first connection, silently breaking known-player sync for the rest of the session. Replaced the bool with a reference to the last-registered ZRoutedRpc instance so registration correctly re-runs whenever a genuinely new instance appears (i.e. every reconnect), and stays a no-op only when called again for the same instance
  • ✅fix1 : 같은 게임 세션에서 데디케이티드 서버에 이미 여러 번 접속했던 클라이언트의 경우, 화이트리스트 패널(Shift+E)에 알려진 캐릭터 목록이 완전히 비어 나오던 버그 수정. RegisterRpcs()가 정적(static) bool s_registered를 사용해 최초 ZNet.Awake 시점에 한 번 true가 되면 이후 재접속 때마다 재등록을 영구히 막아버렸는데, 실제로는 재접속할 때마다 ZRoutedRpc.instance가 완전히 새로 생성됨에도 그 새 인스턴스에는 동기화 RPC 핸들러가 다시 등록되지 않고 RequestFromServer()도 최초 접속 이후로는 다시 호출되지 않아, 세션 내내 알려진 캐릭터 동기화가 조용히 끊긴 상태로 남았음. bool 대신 마지막으로 등록했던 ZRoutedRpc 인스턴스 참조를 저장해, 진짜 새 인스턴스(=재접속)가 주어질 때마다 다시 등록하고 같은 인스턴스로 중복 호출될 때만 무시하도록 수정

[1.0.54] - 2026-08-04

[1.0.54] - 2026-08-04

  • ✅fix1 : Fixed the upgrade key (U) incorrectly showing "You are too far from the Territory Ward!" when the player was standing right next to the ward they intended to upgrade. Since Update() runs independently on every loaded ward instance and ZInput.GetButtonDown is a global input state, pressing U made every nearby ward react to the same keypress — including ones far from the player, which then displayed the "too far" message and masked the correct ward's result. The U-key branch now requires IsHoveredByLocalPlayer(gameObject), matching the same hover-gating pattern already used by the Q/Shift+E/R and shield (J) key handlers, so only the ward the player is actually aiming at reacts
  • ✅fix1 : 업그레이드(U키) 입력 시, 실제로는 업그레이드하려는 와드 바로 옆에 서 있는데도 "영토 와드와 너무 멀리 떨어져 있습니다!" 메시지가 잘못 뜨던 버그 수정. Update()가 로드된 모든 와드 인스턴스마다 개별 실행되고 ZInput.GetButtonDown은 전역 입력 상태이기 때문에, U키를 누르면 근처의 다른 와드들도 같은 입력에 반응해 자기 기준 거리로 "너무 멀리" 메시지를 띄우며 정작 조준 중인 와드의 처리 결과를 가려버렸음. Q/Shift+E/R키 및 실드(J키) 핸들러가 이미 쓰고 있던 IsHoveredByLocalPlayer(gameObject) 게이팅 패턴을 U키 분기에도 동일하게 추가해, 실제로 조준 중인 와드만 반응하도록 수정

[1.0.53] - 2026-08-04

  • ✅fix1 : Fixed admin_bypass waiving material costs and the ward limit for every player, not just admins — the config value itself is still synced to everyone by Jotunn (IsAdminOnly), which is correct and unchanged, but the actual bypass effect (skipping upgrade materials/coins, the ward install limit, and the install resource cost) is now additionally gated by ZNet.instance.LocalPlayerIsAdminOrHost() via the new TerritoryConfig.IsAdminBypassActive(). A regular client whose local config happens to have admin_bypass = true (or who simply isn't the host/an admin on the current server) no longer gets free installs/upgrades from it. The cached install-requirement bypass in TerritoryWard.cs is also now re-evaluated on every server connect (ZNet.Awake), not just when the setting changes, since the same player can be admin on one server and not on another
  • ✅fix1 : admin_bypass가 관리자뿐 아니라 모든 플레이어에게 재료비/설치 개수 제한을 면제해주던 버그 수정 — 설정값 자체는 Jotunn(IsAdminOnly)에 의해 모든 클라이언트에 동일하게 동기화되는 것이 맞고 그대로 유지하되, 실제 "면제" 효과(업그레이드 재료/골드, 와드 설치 개수 제한, 설치 재료비)는 새로 추가한 TerritoryConfig.IsAdminBypassActive()를 통해 ZNet.instance.LocalPlayerIsAdminOrHost()(호스트 본인이거나 서버 관리자 목록에 있는 경우)일 때만 적용되도록 추가로 제한함. 일반 클라이언트가 자신의 로컬 config에서 admin_bypass = true로 되어 있거나 단순히 그 서버의 호스트/관리자가 아니라면 더 이상 무료 설치/업그레이드 혜택을 받지 않는다. TerritoryWard.cs의 설치 재료 면제 캐시도 설정값이 바뀔 때뿐 아니라 서버 접속(ZNet.Awake) 시점마다 다시 계산하도록 함 — 같은 플레이어라도 어떤 서버에서는 관리자이고 다른 서버에서는 아닐 수 있기 때문

[1.0.52] - 2026-08-04

  • ✅fix1 : Fixed the Shift+E whitelist panel's "known characters" list showing characters from other, unrelated servers/worlds visited in the past. The registry now stores entries scoped by world UID (ZNet.m_world.m_uid) instead of one global cross-server file, so GetAll()/RecordPlayer()/ReplaceAll() only ever see the current world's history. Note: the on-disk file format changed (nested by world UID), so existing Captain_territorial_known_players.json data from before this update will not carry over — it gets repopulated automatically within seconds via the periodic scan and server sync
  • ✅improve1 : Added diagnostic logging to the intruder self-registration path (E key while a ward is disabled) — logs the player's permitted/enabled state, which branch was taken, RPC ownership check result, and whether the KnownPlayersRegistry record succeeded, to help diagnose reports of registration silently failing for specific players
  • ✅improve2 : TryUpgrade() now logs a warning whenever admin_bypass causes the material/coin check to be skipped, so free upgrades caused by a forgotten admin_bypass setting are immediately visible in the log
  • ✅fix1 : Shift+E 화이트리스트 패널의 "알려진 캐릭터" 목록에 과거 접속했던 무관한 다른 서버/월드의 캐릭터가 섞여 나오던 버그 수정. 전역 단일 파일 대신 월드 UID(ZNet.m_world.m_uid)로 구분된 저장 구조로 변경해, GetAll()/RecordPlayer()/ReplaceAll()이 항상 현재 월드의 이력만 보도록 함. 참고: 저장 파일 포맷이 월드별 중첩 구조로 바뀌어, 이번 업데이트 이전의 Captain_territorial_known_players.json 데이터는 이어지지 않음 — 주기 스캔과 서버 동기화로 몇 초 안에 자동으로 다시 채워짐
  • ✅improve1 : 침입자 자가등록 경로(와드 비활성화 상태에서 E키)에 진단 로그 추가 — 플레이어의 허용/활성 상태, 어느 분기로 진행됐는지, RPC 소유권 체크 결과, KnownPlayersRegistry 기록 성공 여부를 남겨 특정 플레이어의 등록 실패 원인 진단에 활용
  • ✅improve2 : TryUpgrade()에서 admin_bypass로 재료/골드 체크를 건너뛸 때마다 경고 로그를 남기도록 함 — admin_bypass를 꺼두는 것을 잊어 무료 업그레이드가 발생하는 경우 로그로 즉시 확인 가능

[1.0.51] - 2026-08-03

  • ✅fix1 : Fixed overlapping Territory Wards using AND semantics for access — if a point was covered by more than one active ward, having no access to even a single one of them blocked the interaction and fired an intrusion alert, even when the player had full access via another overlapping ward (e.g. standing in their own territory where a neighbor's ward also reaches). Both TerritoryWard.IsInsideActiveWardWithoutAccess() and IntrusionAlert.CheckAndAlert() now use OR semantics — access via any one overlapping active ward (as creator or permitted member, regardless of whether the wards share an owner or roster) is enough to pass; intrusion is only reported when none of the overlapping wards grant access. CheckAndAlert() also now iterates the canonical TerritoryWard.s_wards list instead of re-filtering PrivateArea.m_allAreas by name
  • ✅fix1 : 겹친 영토 와드가 접근권한을 AND 방식으로 판정하던 버그 수정 — 한 지점이 활성 와드 여러 개에 겹쳐 있으면, 그중 단 하나에라도 접근권한이 없으면 다른 와드에는 정당한 접근권한(설치자/허용 멤버)이 있어도 상호작용이 차단되고 침입 경고가 발동했다(예: 내 땅인데 옆 사람 와드 범위와 겹치는 곳에서 침입자 취급). TerritoryWard.IsInsideActiveWardWithoutAccess()IntrusionAlert.CheckAndAlert() 모두 OR 방식으로 변경 — 겹친 와드 중 어느 하나에라도 접근권한이 있으면(소유자가 같든 다르든, 허용 멤버 명단이 같든 다르든) 통과하고, 겹친 와드 전부에 접근권한이 없을 때만 침입 경고가 발동한다. CheckAndAlert()PrivateArea.m_allAreas를 이름으로 재필터링하던 방식 대신 캐논컬 리스트인 TerritoryWard.s_wards를 그대로 사용하도록 변경

[1.0.50] - 2026-08-03

  • ✅fix1 : Fixed the hover text literally showing "<color=gray>" instead of applying the color — Unity's rich-text color-name table only recognizes the British spelling "grey", not "gray", so the tag failed to parse and rendered as raw text. Both <color=gray> occurrences (join-blocked hint, shield-off hint) now use "grey" via a shared Gray constant
  • ✅fix1 : 호버 텍스트에 "<color=gray>" 태그가 색상 적용 없이 글자 그대로 노출되던 버그 수정 — Unity 리치텍스트 색상명 테이블은 "gray"가 아니라 영국식 철자 "grey"만 인식해서 태그 파싱이 실패했었음. <color=gray> 두 곳(가입 차단 힌트, 실드 꺼짐 힌트) 모두 공용 Gray 상수("grey")로 교체

[1.0.49] - 2026-08-03

  • ✅fix1 : Synced code-side config defaults with the live server's tuned .cfg (fuel intervals for Lv1–5/7–8, secondary-fuel amounts for Lv2–5/7 now default to 0, Lv5 secondary fuel corrected to Resin, Lv7 primary fuel amount corrected to 1) — new installs now start with the same balance already in production
  • ✅fix1 : 서버에 실제 적용 중인(튜닝된) .cfg 값에 맞춰 코드 기본값 동기화 (Lv1~5/7~8 연료 소모 간격, Lv2~5/7 보조 연료 소모량 0으로 정정, Lv5 보조 연료를 수지로 정정, Lv7 주 연료 소모량 1로 정정) — 새로 설치하는 서버도 현재 운영 밸런스와 동일하게 시작함

[1.0.48] - 2026-08-03

  • ✅fix1 : Fixed a bug where fuel would show "insufficient" forever even after depositing the correct item — if ObjectDB wasn't ready yet when the ward's Start() first resolved fuel item names (prefab name → localized token), the resolution silently fell back to the raw prefab name, which never matches real inventory items (CountItems always returned 0). Extracted RefreshFuelTiers() and made CheckConsumption() retry it automatically once ObjectDB becomes available, instead of permanently caching the failed resolution
  • ✅fix1 : 올바른 아이템을 넣어도 "연료가 부족합니다"가 계속 뜨던 버그 수정 — 와드 Start() 시점에 ObjectDB가 아직 준비되지 않은 상태로 연료 아이템 이름(프리팹명 → 로컬라이즈 토큰)을 해석하면 원본 프리팹명으로 조용히 폴백되는데, 이 이름은 실제 인벤토리 아이템과 절대 일치하지 않아(CountItems가 항상 0) 영구적으로 연료 부족 판정이 났음. RefreshFuelTiers()로 분리하고 CheckConsumption()ObjectDB 준비 후 자동 재시도하도록 수정 — 실패한 해석 결과를 영구 캐싱하지 않음

[1.0.47] - 2026-08-03

  • ✅fix1 : Extended the active-ward guard-stone bypass (previously Interact() only) to Door.GetHoverText() and Door.UseItem() as well — non-members no longer see a misleading "$piece_noaccess" hover tooltip on a door inside an active ward, and directly using a key item on such a door now works consistently with pressing E
  • ✅fix1 : 활성 와드 가드스톤 우회 범위를 (기존엔 Interact()만 해당) Door.GetHoverText(), Door.UseItem()까지 확장 — 비허용자가 활성 와드 안의 문에 호버링해도 "$piece_noaccess" 오해의 소지가 있는 툴팁이 더 이상 뜨지 않고, 열쇠 아이템을 직접 사용하는 경로도 E키와 동일하게 정상 작동

[1.0.46] - 2026-08-03

  • ✅fix1 : Fixed a bug where the ward's own fuel storage Container was fully accessible to anyone regardless of permission — it shared the ward's root GameObject name and was caught by an early bypass meant only for the ward's own toggle/join interaction. Storage now requires creator/permitted access at all times (on or off), same as before for other structures
  • ✅fix2 : Doors inside an ACTIVE territory ward could still silently fail to open for non-members — vanilla Door.Interact() re-checks PrivateArea.CheckAccess() internally regardless of the mod's own permission pass-through. Added Patch_Door_GuardStoneBypass to temporarily disable m_checkGuardStone while inside an active ward so the "door is always operable" design actually holds
  • ✅fix1 : 와드 자체의 연료 창고(Container)가 권한과 무관하게 누구에게나 열려있던 버그 수정 — 와드 본체와 같은 GameObject 이름을 공유해, 와드 토글/가입 전용으로 만든 우회 조건에 함께 걸려버렸음. 이제 On/Off 상태와 무관하게 항상 설치자/허용 멤버만 창고에 접근 가능
  • ✅fix2 : 활성화된 영토 와드 안의 문이 비허용자에게 실제로는 안 열릴 수 있던 문제 수정 — 바닐라 Door.Interact()가 모드의 권한 통과와 별개로 자체 PrivateArea.CheckAccess()를 다시 검사하고 있었음. Patch_Door_GuardStoneBypass를 추가해 활성 와드 범위 안에서는 m_checkGuardStone을 일시적으로 꺼서, "문만은 항상 열림" 설계가 실제로 보장되도록 함

[1.0.45] - 2026-08-02

  • ✅new1 : Added IsBasicCampfire() helper to identify the basic campfire (fire_pit) prefab, excluding variants like fire_pit_iron/fire_pit_haldor/fire_pit_hildir
  • ✅new2 : Basic campfire can now be placed anywhere regardless of Territory Ward state
  • ✅new3 : Basic campfire can now be lit/used regardless of Territory Ward ON/OFF or membership — same exemption as doors
  • ✅new1 : 기본 모닥불(fire_pit) 프리팹을 판별하는 IsBasicCampfire() 헬퍼 추가 — fire_pit_iron/fire_pit_haldor/fire_pit_hildir 등 다른 화로류는 제외
  • ✅new2 : 기본 모닥불은 영토 와드 상태와 무관하게 어디서나 설치 가능
  • ✅new3 : 기본 모닥불은 영토 와드 ON/OFF·멤버십 여부와 무관하게 사용(점화) 가능 — 문과 동일한 예외 적용

[1.0.44] - 2026-08-02

  • ✅fix1 : Doors can now also be opened by non-permitted players while the Territory Ward is ACTIVE (previously only exempted while the ward was OFF) — everything else (crafting stations, chests, etc.) stays blocked for non-members
  • ✅fix1 : 영토 와드가 활성화(ON) 상태여도 비허용자가 문은 열 수 있도록 예외 추가 (기존엔 비활성화 상태에서만 예외였음) — 제작대·상자 등 나머지 상호작용은 여전히 비허용자에게 차단됨
  • ✅fix2 : Restored the intrusion-alert notification for non-permitted crafting station/container attempts — Patch_Player_Interact now blocks these before Container.Interact/CraftingStation.Interact ever run, which silently skipped IntrusionAlertPatch.cs's own hooks on those methods; CheckAndAlert() is now invoked directly from the blocking prefix
  • ✅fix2 : 비허용자가 제작대/상자를 사용하려 할 때 침입 경고가 안 뜨던 문제 수정 — Patch_Player_Interact가 Container.Interact/CraftingStation.Interact 자체를 호출 전에 막아버려서, 그 메서드들에 붙은 IntrusionAlertPatch.cs의 훅이 실행되지 않고 있었음. 이제 차단 지점에서 CheckAndAlert()를 직접 호출해 경고가 다시 정상적으로 뜸

[1.0.43] - 2026-08-02

  • ✅improve1 : Doors can now always be opened even while the Territory Ward is deactivated — previously the OFF-state block applied to every interactable, which could lock players out of their own base
  • ✅improve1 : 영토 와드가 비활성화 상태여도 문은 항상 열 수 있도록 변경 — 기존엔 OFF 상태에서 모든 상호작용이 막혀 본인 집에서도 문에 갇힐 수 있었음

[1.0.42] - 2026-08-02

  • ✅fix1 : Beds inside a Territory Ward were losing their claimed spawn point whenever the ward turned off — deactivating the ward (or running out of fuel) also paused the Lv5+ shield, and the WearNTear damage block only applied while the shield was active, so monsters could destroy an unprotected bed and WearNTear.Destroy() would clear its owner's registered spawn. Beds inside any ward's radius are now always immune to damage regardless of the ward's on/off or shield state
  • ✅fix1 : 영토 와드 안의 침대가 와드를 끄면 등록된 스폰이 해제되던 문제 수정 — 와드를 비활성화(또는 연료 고갈)하면 Lv5+ 실드도 함께 일시정지되는데, WearNTear 데미지 차단은 실드가 켜져 있을 때만 적용되어 무방비 상태의 침대가 몬스터에게 파괴되면 WearNTear.Destroy()가 소유자의 등록된 스폰을 해제시켰음. 이제 침대는 와드의 On/Off·실드 상태와 무관하게 와드 반경 안에서 항상 파괴 불가

[1.0.41] - 2026-08-02

  • ✅improve1 : Non-members can now only join a Territory Ward while it is deactivated (OFF) — pressing E on an active ward as an outsider is blocked with a message instead of joining, and the hover hint reflects the same rule
  • ✅improve1 : 영토 와드는 이제 비활성화(OFF) 상태일 때만 비허용자가 가입할 수 있음 — 활성화 중에 E를 눌러도 가입되지 않고 안내 메시지가 뜨며, 호버 힌트도 동일하게 반영

[1.0.40] - 2026-08-02

  • ✅new1 : Added a Player.RemovePiece patch restricting Territory Ward removal to its original creator only — previously any permitted member could remove someone else's ward via vanilla PrivateArea.CheckAccess
  • ✅new1 : 영토 와드는 이제 오직 설치자만 제거할 수 있도록 Player.RemovePiece 패치 추가 — 기존엔 바닐라 PrivateArea.CheckAccess 특성상 허용된 멤버도 제거가 가능했음
  • ✅new2 : Player.Interact now blocks all interaction (crafting stations, chests, etc.) for non-permitted players inside an ACTIVE Territory Ward, not just while it's OFF — added TerritoryWard.IsInsideActiveWardWithoutAccess() helper (TerritoryWard.cs) and a new territoryward_not_permitted localization key
  • ✅new2 : 활성화(ON)된 영토 와드 안에서도 설치자/허용 멤버가 아니면 제작대·상자 등 모든 상호작용이 차단되도록 변경 (기존엔 OFF 상태에서만 차단됨) — TerritoryWard.cs에 IsInsideActiveWardWithoutAccess() 헬퍼 추가, territoryward_not_permitted 로컬라이즈 키 신규 추가

[1.0.39] - 2026-08-02

  • ✅improve1 : Level 1 ward's secondary fuel (Resin) upkeep cost changed from 1 to 0 per interval — Lv1 wards now only consume Wood
  • ✅improve1 : 레벨 1 와드의 보조 연료(수지) 소모량을 1에서 0으로 변경 — Lv1 와드는 이제 나무만 소모함

[1.0.37] - 2026-07-25

  • ✅fix1 : 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 : 건설/상호작용 범위 판정이 3D 거리를 사용해, 수평으로는 와드 반경 안이어도 너무 높이 지으면 범위 밖으로 판정되어 건축이 막히던 문제 수정 — 결과적으로 건물 높이가 의도치 않게 와드 반경(레벨)에 종속되어 있었음. 바닐라 PrivateArea.IsInside()의 수평(XZ) 전용 판정으로 교체해, 너비(반경) 제한은 그대로 두고 높이 제한만 완전히 제거함 (모든 레벨에 동일 적용)

[1.0.36] - 2026-07-18

  • ✅fix1 : 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 : 추가 직후 곧바로 추방하면(주기 스캔이 기록할 틈이 없었던 경우) 알려진 캐릭터 목록에서 완전히 사라져버리던 경쟁 조건 수정 — 폴링 시점뿐 아니라 추가/추방이 실제로 일어나는 순간에도 즉시 기록하도록 변경
  • ✅new1 : 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 : 알려진 캐릭터 데이터를 서버 권위(authoritative) 구조로 바꾸고 네트워크(ZRoutedRpc)로 클라이언트에 동기화하도록 개선 — 기존엔 로컬 파일에만 저장해서 실제 데디케이티드 서버 환경에서는 그 파일이 서버 기기에만 있어 클라이언트가 절대 볼 수 없었음. 이제 서버만 기록/저장을 전담하고, 변경이 생기면 전체 클라이언트에 즉시 전파하며, Shift+E 패널을 열 때마다 클라이언트가 서버에 최신 목록을 요청함. 클라이언트도 서버가 보내준 목록을 자기 로컬에 캐시로 저장

[1.0.35] - 2026-07-18

  • ✅fix1 : 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 : 와드 설치자(관리자) 본인이 자기 화이트리스트 패널에 추가/추방 가능한 항목으로 함께 표시되던 문제 수정 — 주기 스캔이 설치자를 포함한 모든 캐릭터를 기록하다 보니 발생. 설치자는 PrivateArea.IsCreator()로 허용 목록과 무관하게 항상 접근 권한을 가지므로 목록에 표시할 필요가 없음. 설치자의 PlayerID를 통합 리스트에서 제외하도록 수정

[1.0.34] - 2026-07-18

  • ✅fix1 : 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 : 와드가 켜진(보호 활성) 상태에서 화이트리스트 추가/추방이 조용히 실패하던 문제 수정 — 바닐라 PrivateArea.RPC_TogglePermitted가 IsEnabled()==true면 실행을 거부하는 것이 원인이었음. 영토 와드 인스턴스에서만 이 가드를 우회하는 Harmony 패치를 추가해 켜짐/꺼짐 상태와 무관하게 추가/추방이 동작하도록 수정
  • ✅fix2 : 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 : 이번 작업 중 기존 버그 발견 및 수정: 예전 "온라인 플레이어 추가" 버튼이 실제 캐릭터 PlayerID 대신 매 실행마다 바뀌는 임시 접속 세션 ID(ZNet.GetUID())를 저장하고 있어, PrivateArea.HaveLocalAccess()가 절대 매칭되지 않았음 — UI에는 추가된 것처럼 보여도 실제 권한은 한 번도 부여되지 않던 문제
  • ✅new1 : 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 : 이 서버에 접속했던 모든 캐릭터(PlayerID+이름)를 기록해두는 전역 레지스트리를 신규 추가, 디스크에 영속화되어 오프라인인 캐릭터도 화이트리스트 추가 후보로 표시 가능해짐
  • ✅new2 : 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 : 화이트리스트 패널을 기존 "허용된 멤버"/"온라인 추가" 2단 구성에서 온라인·오프라인을 모두 포함한 통합 클릭 리스트로 개편 — 캐릭터 이름을 클릭하면 추가/추방이 토글되고, 온라인이면 태그로 표시됨. PlayerID가 캐릭터 세이브 단위로 별도 발급되므로 같은 사람의 캐릭터 2개도 자연스럽게 별도 항목으로 나열됨

[1.0.33] - 2026-07-18

  • ✅fix5 : 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 : 비설치자 스스로 가입/탈퇴하는 키를 Shift+E에서 Shift+(범위 링 키, 기본 R)로 이동 — 바닐라 Interact("Use") 입력이 물리적으로 같은 E키를 쓰다 보니 Shift+E를 누르면 와드의 평범한 E On/Off 토글도 같이 발동해서 가입/탈퇴가 제대로 먹히지 않던 문제. 바닐라 Interact와 전혀 무관한 R키로 옮겨서 충돌을 없앴고, Shift+E는 이제 설치자의 화이트리스트 패널 전용으로만 남음
  • ✅new3 : Permitted (whitelisted) members can now also activate/deactivate the Lv5+ shield with the K key — previously restricted to the ward's creator only
  • ✅new3 : 허용된(화이트리스트) 멤버도 K키로 Lv5+ 실드를 활성화/비활성화할 수 있도록 변경 — 기존엔 설치자만 가능했음
  • ✅improve3 : 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 : 실드 활성화/비활성화 호버 힌트가 허용 멤버에게도 표시되도록 하고, 탈퇴 힌트 키 표기를 Shift+E에서 Shift+R로 변경

[1.0.32] - 2026-07-17

  • ✅improve2 : Clarified the "no players online" message in the Shift+E whitelist panel to make it clear this is normal (nobody else currently connected), not a missing button — add/kick were already single-click actions with no separate confirm step; the panel just showed no buttons when both lists were empty during solo testing
  • ✅improve2 : Shift+E 화이트리스트 패널의 "접속 중인 플레이어 없음" 문구를 더 명확하게 보강 — 추가/추방은 이미 클릭 한 번으로 즉시 적용되는 구조였고, 혼자(솔로) 테스트 시 두 목록이 모두 비어 버튼이 하나도 안 뜨는 정상 상태였던 것을 명확히 전달

[1.0.31] - 2026-07-17

  • ✅fix4 : 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 : 몬스터가 던진 투척물(화살/창/돌)이 실드 돔을 그대로 뚫고 들어오던 문제 — 이전에 추가한 ShieldGenerator.OnProjectileHit NullReferenceException 가드가 VFX 전용 더미에 대해 원본 메서드 전체를 건너뛰어서, 크래시 원인이던 RPC 호출뿐 아니라 투사체 파괴/피격 처리까지 함께 사라졌던 것이 원인. 네트워크 의존 로직(RPC/연료/UpdateShield)만 건너뛰고 투사체 파괴 + Projectile.OnHit 피격 처리를 직접 수행하도록 수정해 투사체가 다시 경계에서 막히도록 변경

[1.0.30] - 2026-07-17

  • ✅improve1 : Lv5 secondary fuel changed from Feathers x5 to Greydwarf Eye x1
  • ✅improve1 : 레벨 5 보조 연료를 깃털 5개 → 그레이드워프 눈 1개로 변경

[1.0.29] - 2026-07-17

  • ✅fix3 : 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 : 실드가 켜진 와드 경계 안으로 몬스터가 여전히 들어올 수 있던 문제 — Patch_MonsterAI_UpdateAI_ShieldZone은 AI의 이동 의도(Flee)만 바꾸므로 빠른 몬스터는 한 틱 사이에 3m 버퍼를 통과할 수 있었고, MonsterAI가 아닌 AI 타입은 애초에 대상이 아니었음. 모든 생물의 이동이 최종적으로 Rigidbody에 반영되는 지점인 Character.UpdateMotion에 Harmony prefix를 추가해, 반경 안에 있는 길들여지지 않은 생물을 경계 바로 바깥으로 즉시 고정하고 바닐라 Character.ApplyPushback API로 바깥쪽 넉백을 걸어 속도나 AI 종류와 무관하게 진입을 완전히 차단

[1.0.28] - 2026-07-17

  • ✅fix1 : 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 : 바닐라 ShieldGenerator.OnProjectileHit의 NullReferenceException 수정 — VFX 전용 실드 더미("TW_ShieldVFX", ZNetView 없음)가 ShieldGenerator 전역 인스턴스 목록에 등록되어 CheckProjectile()에 의해 실제 게임플레이 실드로 취급되고, m_nview가 null인 채로 InvokeRPC를 호출해 크래시가 발생하던 문제. m_nview가 null이면 바닐라 실드 로직을 건너뛰는 Harmony prefix 추가
  • ✅fix2 : 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 : 몬스터가 실드 돔 안으로 들어왔다가 밀려나는 것처럼 보이던 문제 — Patch_MonsterAI_UpdateAI_ShieldZone이 몬스터가 경계를 이미 넘은 뒤(여유 0m)에야 Flee를 발동시키던 것을, 돔에 닿기 전 3m 여유를 두고 미리 방향을 틀도록 수정

[1.0.27] - 2026-07-16

  • ✅new1 : Ward hover text now shows a "[Shift+E] Manage Online Members" hint above the "[E] Toggle Ward On/Off" line for the ward's creator, since Shift+E already opens the whitelist panel but was previously undocumented in the hover text
  • ✅new1 : 설치자용 호버 텍스트에 "[E] 와드 활성화 / 비활성화" 줄 위로 "[Shift+E] 온라인 멤버관리" 힌트를 추가 — Shift+E가 이미 화이트리스트 패널을 여는데도 호버 텍스트에 안내가 없던 문제 보완
  • ✅new2 : Added territoryward_member_manage_hint_key (Korean/English)
  • ✅new2 : territoryward_member_manage_hint_key 키 추가 (한/영)

[1.0.26] - 2026-07-16

  • ✅improve1 : Shift+E now also opens the player inventory (InventoryGui.Show(null, 1)) alongside the whitelist management panel so the mouse cursor is usable, and hides it again when the panel is toggled off
  • ✅improve1 : Shift+E로 화이트리스트 관리 패널을 열 때 마우스 포인터를 쓸 수 있도록 인벤토리 창(InventoryGui.Show(null, 1))도 함께 열고, 패널을 다시 끌 때 같이 닫도록 변경
  • ✅improve2 : Clicking the "Close" button in the whitelist panel now also hides the inventory window that was opened alongside it
  • ✅improve2 : 화이트리스트 패널의 "닫기" 버튼을 누르면 함께 열렸던 인벤토리 창도 같이 닫히도록 변경

[1.0.25] - 2026-07-16

  • ✅new1 : Monsters (MonsterAI) near an active-shielded ward are now repelled with the same Flee() mechanism vanilla uses for its own NoMonsters zones, instead of only being blocked from targeting once already inside — tamed creatures are excluded, matching vanilla's own exception
  • ✅new1 : 실드가 활성화된 와드 구역에 다가온 몬스터(MonsterAI)를 바닐라 NoMonsters 구역과 동일한 Flee() 방식으로 밀어내도록 변경 — 기존에는 구역 안에 들어온 뒤 타겟팅만 막았음. 길들인 동물은 바닐라와 동일하게 예외 처리

[1.0.24] - 2026-07-16

  • ✅fix1 : Hover text labels ("연료/범위/소유자/허용됨/재료" etc.) and key hints were hardcoded Korean literals instead of $tokens, so switching the game language to English still showed them in Korean even though the final string already passes through Localize(). Replaced with the corresponding tokens (reusing the previously unused territoryward_fuel_label / territoryward_range_label, plus new tokens for the rest)
  • ✅fix1 : 호버 텍스트 라벨("연료/범위/소유자/허용됨/재료" 등)과 키 힌트가 $token이 아니라 한글 리터럴로 하드코딩되어 있어, 최종 문자열이 이미 Localize()를 거치는데도 언어를 English로 바꿔도 한글로 남아있던 문제 수정 — 기존에 미사용이던 territoryward_fuel_label / territoryward_range_label을 재사용하고 나머지는 신규 토큰으로 교체
  • ✅fix2 : Minimap ward pin label was a hardcoded Korean literal ("영토 와드 Lv..") never passed through Localize(), so it stayed Korean regardless of language setting — now resolves $territoryward_name first
  • ✅fix2 : 미니맵 와드 핀 라벨("영토 와드 Lv..")이 Localize()를 거치지 않는 하드코딩 한글이라 언어 설정과 무관하게 항상 한글로 표시되던 문제 수정 — $territoryward_name을 먼저 해석해서 사용하도록 변경
  • ✅fix3 : IMGUI-drawn intruder label and the entire Shift+E whitelist management panel (title/labels/buttons) were hardcoded Korean literals with no Localize() call at all — now each call site resolves the corresponding token directly
  • ✅fix3 : IMGUI로 직접 그리는 침입자 레이블과 Shift+E 화이트리스트 관리 패널 전체(제목/라벨/버튼)가 Localize() 호출 자체가 없는 하드코딩 한글이었던 문제 수정 — 각 호출부에서 해당 토큰을 직접 해석하도록 변경
  • ✅new1 : Added 16 new territoryward_* tokens (Korean/English) for the labels/hints/panel text above
  • ✅new1 : 위 라벨/힌트/패널 텍스트용 신규 territoryward_* 토큰 16개 추가 (한/영)

[1.0.23] - 2026-07-16

  • ✅new1 : CheckConsumption() now auto-pauses (banks) the territory shield the instant the ward turns OFF (manual toggle or fuel-depletion auto-off), reusing the existing RPC_DeactivateShield banking logic instead of letting the timer keep running uselessly
  • ✅new1 : CheckConsumption()에서 와드가 꺼지는 순간(수동 토글 또는 연료 고갈 자동 Off) 기존 RPC_DeactivateShield 배너킹 로직을 재사용해 영토 보호를 자동으로 일시정지(잔여시간 보관)하도록 변경 — 더 이상 와드가 꺼진 채로 타이머만 무의미하게 소모되지 않음
  • ✅new2 : HandleShieldActivation() now blocks new activation and free banked-time resume while the ward is OFF, showing the existing "$territoryward_off_blocked" message
  • ✅new2 : HandleShieldActivation()이 와드가 꺼져 있는 동안 신규 활성화 및 배너킹 재개를 모두 차단하도록 변경 (기존 "$territoryward_off_blocked" 메시지 재사용)
  • ✅improve1 : DrawShieldHUD() now shows two distinct states at the bottom of the screen — active protection (sky blue) vs paused/ward-disabled with banked minutes remaining (gray) — instead of only showing while actively shielded
  • ✅improve1 : DrawShieldHUD()가 화면 하단에 "보호 활성"(하늘색)과 "일시정지·와드 비활성"(회색, 보관된 잔여시간 표시)을 구분해서 표시하도록 변경 — 기존에는 실드가 실제로 켜져 있을 때만 표시됨
  • ✅improve2 : Shield hover hint now shows a "ward disabled" notice instead of the activate/resume hint when the ward is OFF, matching the new activation block
  • ✅improve2 : 와드가 꺼져 있을 때 실드 호버 힌트가 활성화/재개 안내 대신 "와드 비활성" 안내를 표시하도록 변경 — 신규 활성화 차단 로직과 일치
  • ✅new3 : Added territoryward_shield_hud_paused / territoryward_shield_ward_off_hint (Korean/English)
  • ✅new3 : territoryward_shield_hud_paused / territoryward_shield_ward_off_hint 키 추가 (한/영)

[1.0.22] - 2026-07-13

  • ✅improve1 : 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 : 연료 소모 간격을 Lv1=3분 시작, 레벨업마다 1분씩 증가(Lv1=3 ~ Lv8=10)하도록 재조정 — 기존 "간격=레벨 숫자"(1~8분) 방식에서 변경

[1.0.21] - 2026-07-13

  • ✅improve1 : 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 : 연료 체계 단순화 — 모든 레벨의 보조 연료가 항상 수지로 통일되고, 레벨별로 제각각이던 비목재 보조 아이템(그레이드워프눈/창자/깃털/점액/요툰버섯/그라우스텐/얼음분비선)을 제거. 주 연료는 지역별 나무로 변경(나무/원목/고대나무껍질/경목/이그드라실나무). 산은 지역 나무가 없어 흑요석 사용, 바다/애쉬랜드는 지역 나무가 없어 나무 2종을 신규 3번째 연료 슬롯(fuel_tertiary)으로 합쳐서 요구. 나무 수량은 ceil(레벨/2) 규칙 적용
  • ✅improve2 : 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 : GetFuelTiers()가 더 이상 현재 레벨까지 모든 티어를 누적하지 않고, 기본 Lv1 티어 + 현재 레벨 자신의 티어 딱 2개만 반환하도록 변경 (예: Lv4 와드는 Lv1 또는 Lv4 연료만 사용 가능, Lv2/Lv3 연료는 사용 불가)
  • ✅new1 : ResolvedTier/consumption/hover-text methods extended to support an optional 3rd fuel item (NameC/AmountC) for the Ocean/Ashlands two-wood tiers
  • ✅new1 : ResolvedTier와 소모/호버텍스트 관련 메서드들에 선택적 3번째 연료 아이템(NameC/AmountC) 지원 추가 — 바다/애쉬랜드의 나무 2종 조합 티어용
  • ✅fix1 : 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 : "Lv1~N 연료" 호버 라벨이 연속 범위를 암시했는데 이제 딱 2개 티어만 선택 가능해져 부정확해짐 — "Lv1/LvN 연료"로 변경

[1.0.20] - 2026-07-13

  • ✅fix1 : 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 : 실드 활성 중 표시 줄만 다른 곳과 다르게 <color=cyan> 리터럴을 써서 TMP가 파싱하지 못하고 태그 글자가 그대로 노출되던 문제 수정 — 같은 패널 다른 곳에서 이미 정상 동작하는 {Cyan}("#00FFFF") 상수로 통일

[1.0.19] - 2026-07-13

  • ✅new1 : 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 : Lv5+ 실드를 만료 전에 끄면 남은 시간을 버리지 않고 배너킹(tw_shield_remaining)하도록 변경 — 배너킹된 시간이 있는 동안 재활성화하면 슈르트링 코어 소모 없이 무료로 재개됨. RPC_ActivateShield가 지속시간을 파라미터로 받도록 변경해 신규 1시간 활성화와 배너킹 재개를 같은 RPC로 처리
  • ✅fix1 : 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 : 실드 돔 VFX와 실제 보호 반경이 최초 활성화 시점의 레벨 크기에 고정되던 문제 수정 — ApplyLevel()에서 실드가 켜져 있으면 ShieldGenerator의 반경 필드도 함께 갱신, 실드 켠 채로 업그레이드해도 즉시 커짐
  • ✅improve1 : Shield hover hint now shows a free "resume" hint (with banked minutes) instead of the item-cost hint when banked time is available
  • ✅improve1 : 배너킹된 잔여시간이 있을 때 호버텍스트가 아이템 요구 힌트 대신 무료 "재개" 힌트(남은 분 표시)를 보여주도록 변경
  • ✅new2 : Added territoryward_shield_resumed / territoryward_shield_resume_hint (Korean/English)
  • ✅new2 : territoryward_shield_resumed / territoryward_shield_resume_hint 키 추가 (한/영)

[1.0.18] - 2026-07-13

  • ✅fix1 : 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 : 창고 크래시의 진짜 원인을 찾음: InventoryGrid(세션 전체에서 재사용되는 싱글톤)의 m_width/m_height 기본값이 4라서, 이번 세션 첫 컨테이너가 마침 폭 4인 와드 창고면 "크기 변경" 감지가 우연히 통과되어 슬롯 리스트(m_elements)가 한 번도 생성되지 않고, 그 결과 GetElement()가 실패(이전엔 NullReferenceException으로 위장되어 나타남)하던 문제. InventoryGrid.UpdateInventory()에 Prefix를 추가해 m_elements 개수가 width*height와 다르면 m_width를 무효화, 바닐라 리빌드 로직이 정상적으로 실행되도록 강제
  • ✅improve1 : 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 : GetElement() 안전망이 m_elements가 완전히 비어있을 때 null로 폴백해 NullReferenceException을 유발하던 부분을 수정 — 요소가 있을 때만 clamp 후 폴백하고, 없으면 원본 예외를 그대로 노출

[1.0.17] - 2026-07-13

  • ✅fix1 : 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 : InventoryGrid.GetElement()에 Harmony 안전망 패치 추가 — gridPos 인덱스가 범위를 벗어나면(근본 수정으로 못 잡는 엣지 케이스 대비) ArgumentOutOfRangeException 대신 0번 슬롯으로 안전하게 폴백하고 경고 로그만 남김

[1.0.16] - 2026-07-13

  • ✅fix1 : 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 : 창고 크기를 줄이지 않는 것만으로는 크래시를 완전히 막지 못해, 리사이즈 직후 현재 width/height를 벗어난 gridPos를 가진 아이템을 Inventory.FindEmptySlot()으로 빈 칸에 재배치하도록 추가. 소유자 클라이언트인 경우 Container.Save()로 즉시 저장

[1.0.15] - 2026-07-13

  • ✅fix1 : 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 : 연료 창고를 열 때 발생하던 ArgumentOutOfRangeException 크래시 수정 — 창고가 기존 아이템의 gridPos보다 작게 리사이즈되면서 InventoryGrid.GetElement()가 범위를 벗어난 인덱스에 접근하던 문제. 창고 크기는 이제 현재 크기 대비 Mathf.Max로만 적용되어 절대 줄어들지 않음
  • ✅fix2 : 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 : 실드 VFX가 ShieldGenerator 컴포넌트가 아예 없는 "Haldor" 프리팹에서 찾으려 해서(Jotunn 프리팹 목록으로 확인) 매번 실패하고, 실드가 켜져 있는 동안 매 프레임 경고 로그가 쏟아지던 문제 수정 — 실제로 ShieldGenerator를 가진 바닐라 피스 "charred_shieldgenerator"에서 찾도록 변경하고, 실패해도 1회만 로그 남기도록 수정

[1.0.14] - 2026-07-13

  • ✅fix1 : 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 : 연료 창고를 열었을 때 그리드가 안 보이던 문제 대응 — Q키로 창고를 여는 시점에 ApplyLevel()을 한 번 더 재적용해, Start()/RPC 타이밍과 무관하게 항상 최신 크기가 반영되도록 안전장치 추가
  • ✅improve1 : 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 : ApplyLevel()의 창고 리사이즈 블록에 진단 로그 추가(컨테이너/인벤토리 null 여부, 적용값 vs 실제값) — 문제가 재현될 경우 원인을 바로 특정할 수 있도록

[1.0.13] - 2026-07-13

  • ✅new1 : Added PlayUpgradeEffect() — plays vfx_shieldgenerator_refuel + sfx_fader_bell on successful ward upgrade
  • ✅new1 : PlayUpgradeEffect() 추가 — 와드 업그레이드 성공 시 vfx_shieldgenerator_refuel VFX + sfx_fader_bell 효과음 재생
  • ✅new2 : Added PlayVFX() for playing arbitrary vanilla VFX prefabs by name (mirrors PlaySound's ZNetScene lookup + no-networking instantiate pattern, now shared via PlayZNetScenePrefab)
  • ✅new2 : 임의의 바닐라 VFX 프리팹을 이름으로 재생하는 PlayVFX() 추가 (PlaySound와 동일한 ZNetScene 조회+비네트워킹 인스턴스화 로직을 PlayZNetScenePrefab으로 공유)
  • ✅improve1 : TryUpgrade() now calls VFXManager.PlayUpgradeEffect() right after a successful upgrade RPC
  • ✅improve1 : TryUpgrade() 성공 직후 VFXManager.PlayUpgradeEffect() 호출 추가

[1.0.12] - 2026-07-13

  • ✅new1 : 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 : General 섹션에 upgrade_key/shield_key/range_ring_key/fuel_storage_key(KeyCode) 추가 — 영토 와드 키 4종 전부 F1 메뉴에서 재배정 가능. 실드 키 기본값 J→K로 변경
  • ✅improve1 : 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 : UpgradeButton/ShieldButton/RangeRingButton이 하드코딩된 Key 대신 Jotunn ButtonConfig.Config(설정 연동)를 사용하도록 변경 — F1에서 바꾼 키가 자동으로 반영됨
  • ✅improve2 : Fuel storage key (Q) is now read from TerritoryConfig.FuelStorageKey instead of a hardcoded KeyCode.Q
  • ✅improve2 : 연료 창고 키(Q)를 하드코딩 대신 TerritoryConfig.FuelStorageKey에서 읽도록 변경
  • ✅fix1 : 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 : 호버텍스트의 [Q]/[U]/[J] 힌트가 키를 재배정해도 계속 옛 글자를 보여주던 불일치 수정 — 실제 설정된 KeyCode를 동적으로 표시

[1.0.11] - 2026-07-13

  • ✅fix1 : 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 : 호버 텍스트 구분선이 화면 상단 HUD를 침범하던 문제 수정(중앙 pivot + 고정 700px 높이 → 상단 pivot + 두 컬럼의 실제 콘텐츠 높이 기반 동적 계산). 컬럼 폭도 추가 15% 확장(누적 약 32%)
  • ✅new1 : 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 : Lv5+ 영토 보호막 수동 비활성화 기능 추가 — 실드 활성 중 J키를 누르면 신규 RPC_DeactivateShield로 즉시 꺼짐(아이템 환불 없음). 기존엔 1시간 자동 만료만 있었음
  • ✅improve1 : 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 : 실드 활성 중 호버텍스트에 설치자 전용 "[J] 비활성화" 힌트 추가 (기존엔 잔여 시간만 표시되고 키 힌트가 없었음)
  • ✅new2 : Added territoryward_shield_deactivate_hint_key / territoryward_shield_stopped (Korean/English)
  • ✅new2 : territoryward_shield_deactivate_hint_key / territoryward_shield_stopped 키 추가 (한/영)

[1.0.10] - 2026-07-13

  • ✅improve1 : 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 : 영토 와드 호버 텍스트를 좌우 2단 컬럼(각 폭 15% 증가) + 구분선 레이아웃으로 변경 — 기존 1단 텍스트의 과도한 줄바꿈으로 인한 세로 길이를 절반 가량으로 단축. 다른 오브젝트 호버 텍스트에는 영향 없음
  • ✅new1 : Added UnityEngine.UI / UnityEngine.UIModule references — required for the divider Image component used by the new hover text layout
  • ✅new1 : UnityEngine.UI / UnityEngine.UIModule 참조 추가 — 호버 텍스트 구분선(Image) 컴포넌트 사용에 필요

[1.0.9] - 2026-07-13

  • ✅fix1 : 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 : 연료 보관 창고 크기가 2x2로 고정되어 있던 문제 수정 — 와드 레벨에 따라 창고 크기가 증가하도록 변경 (Lv1 2x2 → Lv8 5x6). Container.m_width/m_height는 Awake() 시점에만 참조되므로 ApplyLevel()에서 이미 생성된 Inventory 인스턴스의 크기를 직접 갱신

[1.0.8] - 2026-07-13

  • ✅new1 : 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 : General 섹션 최상단에 admin_bypass 토글 추가 — 켜면 와드 설치 개수 제한, 설치 재료비, 업그레이드 재료/골드 비용을 모두 무시함 (연료 유지비는 그대로 적용)
  • ✅improve1 : 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 : 레벨별 "Level N"/"Upgrade Lv N" 섹션을 "Level N - 바이옴명" 하나로 통합하고, General에 흩어져 있던 연료 소모 간격을 각 레벨 섹션으로 이동, fuel_a/b·item_a/b 키를 fuel_primary/secondary·upgrade_item_primary/secondary로 개명해 가독성 개선 (기존 커스텀 값은 새 키 인식으로 기본값 리셋됨)
  • ✅new2 : 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 : Admin Bypass가 켜져 있는 동안 와드 설치 재료 요구사항(나무x10+돌x10)을 Piece.m_resources 실시간 토글로 비우고, 꺼지면 원래대로 복원
  • ✅improve2 : Ward count limit check is now skipped while Admin Bypass is enabled
  • ✅improve2 : Admin Bypass가 켜져 있는 동안 와드 설치 개수 제한 체크를 건너뜀
  • ✅improve3 : TryUpgrade() now skips the material/coin requirement check and inventory consumption while Admin Bypass is enabled
  • ✅improve3 : Admin Bypass가 켜져 있는 동안 TryUpgrade()에서 재료/골드 요구 체크와 인벤토리 소모를 건너뜀
  • ✅improve4 : 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 : 모드 로드 메시지를 Captain_audio와 동일한 방식으로 BepInEx 콘솔에 청록색으로 출력 (콘솔 창이 없으면 일반 로그로 대체)

[1.0.7] - 2026-07-04

  • ✅fix1 : 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 : 작업대뿐 아니라 포탈, 배(래프트/카브/롱쉽/드라카르), 수레도 영토와드 상태와 무관하게 설치 가능하도록 수정 — 원래 바닐라 동작 복원 (기존에는 작업대만 와드 건설 제한에서 예외였음)

[1.0.6] - 2026-07-04

  • ✅improve1 : Resolve() now accepts a warnIfMissing flag so callers can opt out of the ObjectDB-not-found warning for known-harmless cases
  • ✅improve1 : Resolve()에 warnIfMissing 옵션 추가 — 무해한 케이스에서 경고 로그를 선택적으로 끌 수 있도록 함
  • ✅improve2 : 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 : RefreshWardDescription()이 메인 메뉴 진입 시점에 뜨던 'Wood'/'Resin' not found 경고를 더 이상 출력하지 않음 (이 시점은 ObjectDB가 아직 완전히 로드되지 않은 정상 과정이며, 이미 폴백 처리되어 있어 무해함)

[1.0.5] - 2026-07-02

  • ✅improve1 : Resolve() now logs a warning when prefab name is not found in ObjectDB, making config typos immediately visible in the log
  • ✅improve1 : Resolve()가 ObjectDB에서 프리팹명을 찾지 못할 때 경고 로그 출력 — Config 오타 즉시 식별 가능
Thunderstore development is made possible with ads. Please consider making an exception to your adblock.