Commit Graph
192 Commits
Author SHA1 Message Date
adminandClaude Fable 5 a2a0e85831 Spawn hider statues in resolution phase for classic mode too
Classic hit path now captures a statue record like conversion does;
rename the statue infrastructure (CaptureStatue/SpawnStatues/
DespawnStatues/_statueRecords) since it is no longer conversion-only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 22:37:11 +02:00
adminandClaude Fable 5 14015d7134 Ignore drag-releases in slider double-click reset; tune HUD slider defaults
A pointer-up after a drag no longer counts as a click (dragging flag +
press-to-release distance within the existing tolerance), so drag ->
release -> click cannot trigger a reset anymore. PaintHud prefab:
pointer tolerance 4 px, HalfLambert default back to 0.5.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 22:37:03 +02:00
adminandClaude Fable 5 7fb0ff54b1 Add double-click-to-reset on all sliders (interval + pointer tolerance) and sync PaintHud slider defaults
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:28:22 +02:00
adminandClaude Fable 5 b30db72e0c Add ledge grab: walking over an edge attaches to the wall below (not while sprinting)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:28:22 +02:00
adminandClaude Fable 5 66f890869f Move Play Scene window menu entry to Tools/Play Scene
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 13:26:04 +02:00
adminandClaude Fable 5 0be503c927 Add SoundEffect audio system (ScriptableObject-based) with test assets
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 13:25:56 +02:00
adminandClaude Fable 5 5dbdc0e6b2 Add Picture Texture field to PictureFrameBuilder
Assigned texture drives the picture material BaseMap via a per-frame
material instance (asset untouched, frames sharing a material stay
independent) and takes priority for aspect resolution. New default
picture material Frame Picture.mat wired in the script defaults.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 07:53:54 +02:00
adminandClaude Fable 5 6a15a68a2e Make picture frame properties relative and fix picture aspect ratio
Frame thickness, corner radius, padding, inner depth and picture depth
are now normalized factors (scale with Size, no dead clamp zones).
Picture aspect is computed inside-out so padding and frame thickness
no longer distort the image. New Frame Inner.mat as inner default.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 21:32:19 +02:00
adminandClaude Fable 5 850c92bcce Derive picture frame size from picture texture aspect ratio
Replace Width/Height with a single Size (longer side); the shorter side
follows the picture material's base map source-image aspect (editor-
resolved, serialized for builds, 1:1 fallback). Add Range attributes on
all frame parameters and default material references (new Frame.mat).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 20:33:18 +02:00
adminandClaude Fable 5 5c6657d9d0 PictureFrameBuilder: auto box colliders + coalesced rebuild in Update
Rebuild now runs once per frame via ExecuteAlways Update (OnValidate only
sets a dirty flag + QueuePlayerLoopUpdate), fixing inspector drag stutter
from stacked delayCalls. Adds automatic BoxCollider generation (4 frame
bars, opening slab, optional pedestal box for raised pictures) with an
ownership list so manual colliders stay untouched. Corner radius is
intentionally ignored for colliders.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 20:07:54 +02:00
adminandClaude Fable 5 210d0adc3e Add PictureFrameBuilder procedural picture frame component
Editor-tunable frame mesh: sliced scaling (constant profile), 4 material
submeshes (picture/interior/frame/back), padding, frame thickness/depth,
rounded outer edges (quarter-cylinder strips + eighth-sphere corner caps).
Frame Inner Depth sets the interior plane; Picture Depth is relative to it
(positive = recessed, negative = raised pedestal) with auto perimeter walls.
Meshes are per-instance, DontSave, rebuilt in OnEnable/OnValidate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 19:19:59 +02:00
adminandClaude Fable 5 36ce4a66df Add VideoClipPlaylist component for sequential gapless clip playback
Plays a list of items (clip + percentage range) on a VideoPlayer.
Double-buffers via a second player (auto-created child incl. AudioSource
copy) and drives the screen texture through a MaterialPropertyBlock,
flipping only once the next player delivers frames - no black/freeze gap.
Editor drawer renders each item as clip row + min-max percent range slider.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 16:38:57 +02:00
adminandClaude Fable 5 ff01e07fa1 Add editor tool to create ping-pong videos from VideoClips via ffmpeg
Right-click a VideoClip -> Process -> Ping-Pong Video: runs ffmpeg in the
background (forward + reversed video concat, audio played twice), writes
<name>_pingpong.mp4 next to the source and imports it. Supports
multi-select, silent clips (video-only retry), progress display and
unique output paths.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 16:09:34 +02:00
adminandClaude Fable 5 ae36b2076d Add step pass to wall climb for small ledges on walls and ceilings
Ground-stepOffset analogue for climbing (wallStepOffset, default 0.1):
when climb movement is blocked by a small ledge, the capsule lifts
along the wall normal in pre-swept sub-steps and continues, with a
short servo hold to prevent being pulled back into the ledge. Ground
detach while climbing down now requires floor that extends away from
the wall, so narrow step tops no longer cause a mid-wall exit.

Wall->ceiling handoff additionally checks OverheadIsPassableStep():
if the overhead surface is only a small protrusion within the step
allowance, the handoff is skipped and the step pass carries the
capsule over the edge. Genuine overhangs hand off unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 15:45:31 +02:00
adminandClaude Fable 5 270c42d85b Add host-configurable match settings persisted in settings
- GameSettings: 7 match fields (mode, hunter count, hide/seek/resolve
  durations, radar ping interval/lifetime) with authored defaults
- MatchSettingSlider (new): enum-driven panel binder, seeds from
  settings, saves on change; lifetime label shows one decimal
  (invariant culture)
- MatchManager: ApplyHostMatchSettings() on StartMatch (clamped);
  phase message now carries ping interval so clients tick correctly

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 22:04:54 +02:00
adminandClaude Fable 5 0ab92933de Support styled multi-text nameplate label containers
PlayerNameplates clones a GameObject container instead of a single
TMP_Text and drives all TMP_Text children (text + distance font size),
so the label template can be authored with layered texts (e.g. outline
or shadow copies) in the editor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 20:40:56 +02:00
adminandClaude Fable 5 4c6a452f9d Fix late joiners never seeing earlier peers behind the paint reveal gate
Applying a snapshot now also raises the replica's sequence horizon: a
snapshot covers all events up to its captured cutoff. Previously the
horizon only advanced with the live stamp stream, so the server replica
of a player who never painted served snapshots with cutoff 0 - late
joiners then waited forever for the published baseline cutoff and the
reveal gate never opened (third client could not see the second).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 20:40:48 +02:00
adminandClaude Fable 5 b71cd61533 Add match result evaluation with live scoreboard in the Esc menu
MatchManager tracks per-participant outcomes from match start (hunter /
hiding / found / converted / left), freezes hit rows with seek time and
finder name, and decides the winner at seek end (any untouched hider ->
hiders win). Results replicate via a Match_Result named message,
broadcast live on hide start, every hit and mid-match leave (no-op once
the winner is frozen), with late joiners served the current state.

MatchResultScreen renders the scoreboard as a section of the session
panel: winner banner ("Match in progress" while live), summary counts
and pooled rows (name, outcome, time, found by); the section hides when
no result data exists. OnlineSessionBrowserUI auto-opens the Esc
overlay when the Resolution sub-phase begins.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 20:40:36 +02:00
adminandClaude Fable 5 262a20326a Hide hider nameplates from hunters during seek phase
Generalize the body-renderer gate to all avatars so nameplates inherit
the existing visibility matrix (hide phase, found hiders, paint reveal,
conversion settle), and add the one case the body gate cannot cover:
hunters see camouflaged hider bodies during seek, so suppress hider
names for a local hunter viewer while LocalSubPhase == Seek.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 15:05:48 +02:00
adminandClaude Fable 5 0e7ce0c410 Add player names: settings persistence, replication, screen-space nameplates
- GameSettings: playerName field persisted in Settings.json
- NetworkPlayerSetup: owner-written DisplayName NetworkVariable
  (seeded from settings on spawn, sanitized/truncated, live rename push)
- PlayerNameField: binds the session panel name input to settings
- PlayerNameplates: screen-space overlay labels above players with
  distance-based font scaling (clamped min/max), pooling, FP self-hide

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 14:58:15 +02:00
adminandClaude Fable 5 78ab6e2dd6 Fix wall climb on thin boards: rim detection, vault, edge-normal hardening
The swept-sphere probes tilt their contact normal while rolling over a
thin board's edge, which faked slope top-outs, ceiling hand-offs and
bare-rim vaults mid-face. Confirmed via temporary exit-path logging
(stripped again) and fixed at the verified causes:

- RaycastWallFace: confirm "face flattened into a slope" with a thin,
  strictly horizontal ray instead of trusting the tilted sphere normal
  (a vertical board still reads steep; real ramps still top out).
- Rim judging: the full-capsule span probe is the arbiter — while it
  still sees a steep face anywhere along the capsule, re-adopt that true
  normal (breaking the tilt self-amplification feedback loop) and keep
  climbing; only a persistent rim (wallTopOutConfirm debounce) vaults.
- WallContinuesAbove: band-sampled horizontal sweep so a grazed shelf
  edge above never reads as a cleared rim.
- Bare rim: parks by default (upward motion clamped); holding up vaults
  over the edge via MantleOverEdge, headroom-gated.
- ProbeWallSpan sweeps strictly horizontally; center probe always
  rejects down-facing hits (edge grazes), wall->ceiling hand-off only
  via the explicit head-gap check against clearly down-facing surfaces.
- Slope/ground top-outs additionally gated on a genuine stand
  (HasStandableTop) so a board's own top edge no longer detaches.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 12:51:34 +02:00
adminandClaude Fable 5 6c03e5d3f6 Refactor Assets/Scripts: trim restating comments, minor structure cleanups
Sweep over 48 files (Editor/ excluded): remove comments that restate the
code, condense class summaries, fix three stale doc statements
(HsvColorPicker alpha bar, PaintHud layoutPrefab, MasterVolume
FallbackDefault). Inline two single-use wrappers (IsPointerOverUi,
BuildModes), drop an unused using, replace a magic literal with the
existing ParallaxBase constant, and convert ~10 UnityEngine.Object null
checks to the implicit-bool convention. No serialized fields, signatures,
RPC/NetworkVariable names, defaults, or #if blocks touched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 08:29:18 +02:00
adminandClaude Fable 5 eeee5fc2f0 Refactor PlayerCharacterController: volumetric climb probes, slim comments
- Replace all thin raycast climb probes with capsule-width SphereCasts:
  fixes drop on thin boards (mid-face contact never lost, top-out only
  fires at the real top edge) and edge flicker on curved surfaces
  (continuous contact normal instead of per-frame face flips)
- Remove WallProbeTangentSamples fan fallback (obsolete with SphereCasts)
- Collapse WallInFront/WallPresentAtOffset/WallHitAt into WallPresentAt,
  inline ApplyMeshOffset wrapper
- Trim redundant comments, keep non-obvious rationale and tooltips
- No serialized fields removed or renamed (prefab values intact)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 08:09:12 +02:00
adminandClaude Opus 4.8 e5b5138232 PlayerController: robust wall-climb hold on thin boards
ProbeWall now falls back to a horizontal multi-sample fan across the capsule
cross-section when the center ray misses, so a thin/narrow board keeps its
grab instead of dropping after wallExitGrace (which stays at 0.15). The
top-out mantle no longer commits on the first probe miss: it requires the
top-edge signature (wall at foot, moving up, headroom clear) to persist for
wallTopOutConfirm (new tunable, default 0.06s) and uses hardened multi-sample
foot/headroom probes, so a transient mid-face miss or a VHACD hull gap no
longer triggers a false mantle.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 07:23:56 +02:00
adminandClaude Opus 4.8 f4d31b0c24 ConcealmentMeter: add per-collider AABB broadphase in the voxel loop
Cache each environment candidate's world AABB once per evaluation and gate
the expensive per-voxel tests (Collider.ClosestPoint, ContainsWorld, concave
raycast) behind a cheap bounds.Contains prefilter. Collapses the hot loop
from O(voxel x colliders) worth of ClosestPoint/raycast calls to O(voxel x
few) for dense collider clusters (VHACD hulls, furniture), removing the
framedrop when overlapping many colliders. Conservative AABB test never
drops a real hit, so EmbeddedPercent is identical, just cheaper.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 07:23:48 +02:00
adminandClaude Opus 4.8 50781e32d2 Camo: generalize brightness + add persistent saturation
Move brightness out of the half-lambert diffuse term to a final exposure
multiply on the whole shaded body color (diffuse + GI + specular), and add
a saturation grade (0 = neutral, -1 = grayscale, >0 = boosted) on the same
final stage. Saturation rides as a 4th component on CamoKnobs (Vector3 ->
Vector4) so it inherits all three persistence paths: HUD JSON, network
replication (_camo NetworkVariable), and painting-slot metadata. Wires the
renamed Slider_Brightness and new Slider_Saturation. Bumps HudFileVersion
and PaintMetaVersion with load-time remaps so existing paintings keep their
look (old 1=neutral saturation remaps to 0=neutral).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 07:23:40 +02:00
adminandClaude Opus 4.8 deee9d6ca1 Add SkyboxEnvironmentUpdater: runtime sky reflection + ambient
New [ExecuteAlways] component that renders the skybox (or an optional override material) into a custom reflection cubemap and refreshes DynamicGI so smooth/metallic materials reflect the sky without a baked LightingData asset. Uses a deferred apply plus a synchronous warm-render so the ambient probe resolves after domain reload; runs the reflection capture as a stripped CameraType.Reflection to avoid the URP MIP-bind error. Exposes reflection intensity (0..4) and optional ambient override.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 18:18:59 +02:00
admin b74123188b Setup lighting (GI, AO) 2026-07-07 13:28:49 +02:00
admin 669b4e1308 Add Majoras Mask, update gitignore 2026-07-07 11:16:43 +02:00
adminandClaude Opus 4.8 1fbd66095c Radar ping: anchor sweeps to seek start so they stay in sync with the HUD
RunSeekPhase fired the interval ping from an accumulating countdown that discarded each cycle's frame overshoot and drifted seconds late over a match, while the HUD ping countdown is anchored absolutely to _seekStartTime. Fire on absolute interval boundaries (n*interval from _seekStartTime) instead, sharing the HUD's anchor so the on-screen timer hits 0:00 the same moment the sweep fires. A missed boundary is skipped, never bursted.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 22:36:59 +02:00
adminandClaude Opus 4.8 ee01b3b8ab MeshPainter: resample saved paint to avatar resolution on load
Drop the resolution gate in LoadPaintByName/ReadMapPng. A slot saved at any size is now bilinearly resampled per map to the current avatar's textureSize (new ResampleBilinear/Bilerp helpers, running on the stored bytes with no gamma conversion to match downstream consumption), so any painting loads onto any avatar regardless of the size it was saved at.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 22:36:53 +02:00
adminandClaude Opus 4.8 9d16524ded FurShell: remove scale-influence, curvature scales with player scale
Drop the _FurScaleInfluence blend (fur stays a constant world length at
any avatar size, as tuned to influence 0) and scale the gravity curvature
droop by the avatar world scale (_FurObjScale) instead, so the bend tracks
the player: hider 0.5 => smaller droop, hunter 1.5 => bigger droop.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 17:31:05 +02:00
adminandClaude 9dc8f21528 FurShell: scale-aware length/curvature + X-ray glow mirror
The fur is drawn from a CPU-baked unit-scale mesh whose instance matrix
carries the avatar's world scale, so the extrusion scaled fully 1:1 with
the player (hider 0.5 / hunter 1.5). That read as too-short fur on the
small hider and too-long on the big hunter, and the curvature droop was
sized off the raw unity_ObjectToWorld which doesn't carry the per-instance
scale in the RenderMeshInstanced path.

- FurShellRenderer pushes the avatar's lossyScale (_FurObjScale) plus a new
  Fur Scale Influence (0..1, default 0.5) that blends the fur SIZE between
  fully proportional (1) and a constant world length (0). The shader
  pre-divides the object-space displacement so the net world length follows
  effScale; curl droop and wind use the same effScale, keeping the curl
  SHAPE invariant across avatar sizes and influence settings.
- The body's see-through X-ray reveal (forward half) is mirrored onto the
  visible fur so strands glow WITH the reveal instead of hiding it under
  opaque fur. FurShellRenderer pulls the live colour/pulse/flash from the
  sibling MeshPainter (new getters), in phase with the body. A new X-Ray
  Fur Strength (default 0.2) tames the per-shell accumulation, since the
  body writes the glow once (opaque) but the fur stacks N transparent
  shells that each composite it.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 16:33:21 +02:00
adminandClaude Opus 4.8 bfcd84afe4 Add manual radar ping, blip refresh/fade, and resolution statue barrier
- Manual hider ping on "E": server-authoritative RequestManualPing gated to
  Seek + living hider; shared EmitRadarPings path so interval and manual pings
  produce identical blips. Ping key read client-side in GameModeManager, role-
  gated and excluded in FreeCam (E is fly-up there).
- Radar refreshes an existing blip for the same transform target instead of
  duplicating it (lifetime resets to the configured value) via RadarTarget.Refresh.
- Blips fade in/out independently of the disc fade: per-blip MoveTowards factor
  multiplied on top of the radar fade, refresh-safe, with separate in/out speeds.
- Resolution countdown waits for conversion statues to load: generalized the
  match-start loading barrier (RunReadinessBarrier over _barrierTargets, hold
  phase carried in MsgBeginLoad) and run it a second time over statue IDs before
  starting the real resolveDuration. Only holds for Conversion with real statues.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 13:59:28 +02:00
adminandClaude Opus 4.8 043fafa796 MatchManager: Debug-ContextMenu-Label umbenannt
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 12:23:49 +02:00
adminandClaude Opus 4.8 cad5015d42 Radar: fade in/out statt hartem Enable-Toggle
Gemeinsamer 0..1-Fade-Faktor treibt Disc-Alpha (baseAlpha * fade via MPB),
Blip-Alpha (RadarTarget, im Gleichschritt) und Radar-Scale (0.8 -> 1.0).
Fade-in/-out-Speed separat einstellbar; Kamera bleibt an solange fade > 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 12:23:42 +02:00
adminandClaude Opus 4.8 414beaa403 Add player-collision toggle and make conversion statues follow it
Add a per-machine "Players Collide" switch on GameModeManager: a
self-healing reconciler routes the local capsule through other avatars'
body colliders via Physics.IgnoreCollision when disabled, re-asserting
every frame while off to survive the late-created runtime MeshCollider,
conversion respawns and teleport resets. Expose Active/ActiveVersion/
BodyCollider on NetworkPlayerSetup for the reconciler.

Give MatchStatue the same Active registry + BodyCollider pattern so the
frozen conversion statues obey the same toggle (they carry their own
paint MeshCollider but are deliberately not NetworkPlayerSetup avatars).
Also drive the statue's steady X-ray reveal in Resolution, matching an
un-found hider.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 11:17:19 +02:00
adminandClaude Opus 4.8 0f108fce47 Add conversion statues shown in resolution phase
In Conversion mode, capture a snapshot (pose index + paint) of each hider
at conversion time and materialize a frozen, painted statue at the found
spot for the resolution phase, independent of the now-hunter avatar.

- MatchStatue.cs (new): server-init pose/paint, network-driven pose then
  freeze, reveal-gate (hidden until paint applied), kills inherited sim.
- PlayerPaintSync: _isStatue (sibling auto-detect) suppresses the three
  auto-behaviours so MatchStatue drives the paint flow deterministically.
- MatchManager: statuePrefab; capture in ConvertToHunter; spawn on
  resolution enter; despawn + record clear on EndMatch/teardown/start.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 09:33:15 +02:00
adminandClaude Opus 4.8 0a1e286a34 Add debug skip-to-next-subphase for MatchManager
Server-authoritative skip flag consumed by each phase wait loop
(loading barrier, hide/resolution wait, seek phase), routed via
authority like RequestEndMatch. Exposed as a [ContextMenu] and
public method; single transition per trigger, cleared on teardown.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 08:12:00 +02:00
adminandClaude Opus 4.8 a2c8a2c75d Freeze players during map load: kill gravity and hide own mesh
- PlayerCharacterController: GravityEnabled toggle. When off, hold
  vertical velocity at zero and skip steep-slope sliding so a frozen
  avatar neither falls nor drifts; true is byte-for-byte the old path.
- GameModeManager: during Loading, additionally disable gravity and
  hide the local body (SkinnedMesh + fur shell), re-asserted each frame
  to catch the mid-load lobby->match respawn. Restored (body shown,
  gravity on) before ActiveMode.Enter() on release to Hide.
- MatchManager: enter Loading *before* SwapScenes so still-bound lobby
  avatars are frozen before their floor unloads. Fixes the player
  falling into the void during the lobby->map scene swap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 07:55:40 +02:00
adminandClaude Opus 4.8 fba4780c0e Add match-start readiness barrier (Loading phase)
Gate the Lobby-to-world transition on a new MatchSubPhase.Loading before
Hide: movement stays frozen and the Hide countdown does not start until
every connected client has spawned all match avatars and applied their
paintings.

- MatchManager: Loading phase; matchLoadTimeout tunable; Match_BeginLoad
  broadcasts the respawned avatar NetworkObjectIds (+ generation tag),
  Match_Ready collects per-client ACKs (host self-checks locally); barrier
  coroutine in RunMatchPhases before Hide; disconnect/teardown cleanup.
- GameModeManager: freeze local player (movement/paint/tab) during Loading,
  restored via ActiveMode.Enter() on transition to Hide (no camera jump).
- NetworkPlayerSetup: treat Loading like Hide in ComputeVisible so a
  fast-loading client cannot reveal a hider early.
- MatchHud: "Loading" phase label.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 22:07:59 +02:00
adminandClaude Opus 4.8 de82ce25de Radar-Sichtbarkeitsgates, Hider-Pings im Seek + Ping-Countdown
Radar: nur sichtbar bei >=1 Target, in First-Person und in der Seek-Phase
(Overlay-Kamera getoggelt, Blip-Skripte laufen weiter). Singleton fuer
Server-Zugriff. GameModeManager: Kamera + Tab-Moduswechsel erst ab
gebundenem Lobby-Player (Inert-Zustand ohne Player, Orbit-Input geparkt).

MatchManager: Server tickt im Seek alle radarPingInterval (30s) und
broadcastet noch nicht gefundene Hider (NetworkObjectId + radarPingLifetime
3s) nur an Hunter-Clients; jeder Hunter loest lokal auf und spawnt Blips.
Ping-Loop in die Seek-Coroutine gefaltet (EndMatch stoppt ihn mit).

MatchHud: Ping-Countdown lokal aus Seek-Start + Kadenz berechnet, Format
m:ss (0:30..0:01), ausserhalb Seek / bei deaktivierten Pings 0:00.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 21:45:10 +02:00
adminandClaude Opus 4.8 f5de233e0c Add radar blip system: Radar spawner + directional RadarTarget
Radar.Spawn(transform, lifetime) clones the "Target Template", names it
"Target" and attaches a RadarTarget that self-destructs after lifetime.

RadarTarget aims each frame toward camera->target (full 3D LookRotation),
drives the point renderer's _BaseColor from a forward-bearing gradient
(ahead/side/behind depth cue lost in the flat disc projection) via a
MaterialPropertyBlock, and scales the point renderer transform by
camera->target distance.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 20:46:58 +02:00
adminandClaude Opus 4.8 e571375cab feat(ui): move HSV swatch onto the SV handle
HsvColorPicker: read the color swatch from the SV handle's child
("Handle/Swatch") instead of a standalone root child; drop the dead
leftover-alpha bar and root-swatch fallback handling.
PaintHudPanel.prefab: restructure the picker so the swatch lives under
the SV handle and wire _swatch accordingly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 17:26:57 +02:00
adminandClaude Opus 4.8 48975c0f20 perf(paint): stronger X-ray hit flash + kill spawn/respawn freeze
X-ray hit flash: drive a dedicated flash mode instead of the normal
reveal - pulse off (steady), intensity boost (xrayFlashBoost, default 3x),
snap-on, then restore authored color/pulse exactly. Fixes the weak/dark
flicker where the 0.35s hit window often caught only the pulse's near-off
plateau.

Spawn/respawn freeze: pool GPU RenderTextures across despawn->respawn
(TeardownGpu recycles, CreateRT pops) so a hider->hunter conversion no
longer churns ~70MB of RT alloc/free on every observer; reuse staging
textures to cut per-map GC. Defer the blank base-seed on reveal-gated
remote replicas (DeferInitialSeed) - the real pixels arrive with the
snapshot apply anyway; gate the FurShellRenderer alongside the body so a
deferred replica never shows the pooled RT's stale fur; EnsureBackendSeeded
+ TryCaptureSnapshot guard against capture-before-reseed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 15:14:20 +02:00
adminandClaude Opus 4.8 9290ef650b Hunter shot: replicated laser beam + X-ray hit flash; snapshot apply in-place reseed
- Laser.shader + HunterLaserBeam: additive HDR beam, fade in/out over opacity
  and thickness, code-driven LineRenderer, tunable emission multiplier.
- FirstPersonMode: TryShoot computes world endpoint, fires beam with lateral
  muzzle offset (right) so it isn't dead-center from hunter view.
- NetworkPlayerSetup: shot relay RPCs (owner->server->all) + hit-flash RPC
  (server->all), flash OR-branch in ComputeXRay.
- MatchManager: hit reveal broadcasts X-ray flash first, delays hider removal
  by hitRevealDelay so the glow is visible before the body vanishes.
- MeshPainter reseed: in-place fast path avoids full GPU backend teardown on
  snapshot apply (no ~70MB RT churn), fixes spawn/paint-load hitch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 14:18:55 +02:00
adminandClaude Opus 4.8 ed09d6a1b0 Netcode: receiver-side paint reveal gate + fur pipette gating
Hide remote avatars until this client has actually applied a snapshot
reaching the owner-published baseline cutoff, preventing the default
grey/white material from flashing before a player's painting has loaded.

- PlayerPaintSync: owner-authoritative _publishedCutoff NetworkVariable,
  receiver tracks _appliedCutoff; explicit blank publish for never-painted
  avatars so they still reveal.
- NetworkPlayerSetup: cache _paintSync, hide body renderers on spawn, gate
  UpdateVisibility on PaintRevealReady.
- MeshPainter.Pick: fur toggle now follows pickedHeight (own paint-mesh
  only), matching the Occlusion/Height pipette behaviour.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 12:08:46 +02:00
adminandClaude Opus 4.8 1b783a39be Fur: Albedo-gekoppelte Länge, Toggle-Gate, Soft-Edge, World-Gravity, Pipette & FP-Hide
- Fur-Map trägt nur noch R = Länge (linearer Datenkanal); Farbe kommt per-texel
  aus der Live-Albedo-RT (an _BaseMap des Shell-Shaders gebunden)
- Toggle_Fur als echtes Gate (IsChannelActive = fur), Default aus, furLength 0.5
- Weicher Alpha-Übergang (radial/tip/length coverage) statt Hard-Clip; Transparent-
  Pass mit Depth-Bias (Offset -1,-1) gegen Body-Durchflimmern
- Root dunkler / Tip heller aus gemalter Farbe abgeleitet (kein Fix-Tint)
- Gravity/Curl in World-Space nach Transform (unabhängig von Mesh-Rotation)
- Pipette aktiviert Fur-Toggle immer; liest R-Kanal als Länge
- First-Person blendet FurShellRenderer mit aus
- Netzwerk (FlagFur), Undo, Persistence (fur.png R=Länge) mitgezogen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 23:40:58 +02:00
adminandClaude Opus 4.8 7536e8ec8b Fur als 4. Paint-Map + Ziel-Opacity-Blend
Fur wird die vierte kanonische Paint-Map (RGB=Farbe, A=Länge). Integration
über Seed (kahl), GPU/CPU-Paint, Undo, Netzwerk-Sync, Persistence (fur.png,
v6) und Live-RT-Hook im FurShellRenderer. HUD-Binding (Toggle/Picker/Alpha)
aktiviert. Fur-Alpha lerpt jetzt zu einer Ziel-Opacity (Slider_FurOpacity)
statt additiv Richtung 1 zu akkumulieren (zwei Brush-Passes: Fade + Deposit).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 21:35:53 +02:00
adminandClaude Opus 4.8 43791abc79 Add fur-map support, skinned driver, and world-down curvature to fur shell
FurShell now reads an RGBA fur map (RGB = per-texel strand colour,
A = fur length) so the standalone look can be driven per-texel. Alpha 0
clips the whole shell stack (root included) so a painted body shows
through; _SolidRoot keeps the opaque base shell only for the full-coverage
prototype. White map default keeps the standalone prototype unchanged.

FurShellRenderer drops the MeshFilter requirement and resolves its mesh
per frame: on a SkinnedMeshRenderer it borrows the SkinnedColliderBaker's
per-frame baked pose so the fur follows the animation with no extra bake.

Curvature/gravity now bends strands toward WORLD down (converted into
object space via unity_WorldToObject) instead of object-local down, so a
rotated player mesh droops downward correctly. Identity rotation is
unchanged, so the test sphere is unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 20:47:15 +02:00