From 69585ff9d8460e13a1c9babbc577e5c21de16370 Mon Sep 17 00:00:00 2001 From: Jage9 Date: Sat, 21 Feb 2026 03:47:43 -0500 Subject: [PATCH] Fix Ctrl+V paste and split user/item landing tones --- client/public/version.js | 2 +- client/src/audio/audioEngine.ts | 6 +++++- client/src/main.ts | 21 +++++++++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/client/public/version.js b/client/public/version.js index 3d3deb0..9a054c3 100644 --- a/client/public/version.js +++ b/client/public/version.js @@ -1,5 +1,5 @@ // Maintainer-controlled web client version. // Format: YYYY.MM.DD Rn (example: 2026.02.20 R2) -window.CHGRID_WEB_VERSION = "2026.02.21 R92"; +window.CHGRID_WEB_VERSION = "2026.02.21 R93"; // Optional display timezone for timestamps. Falls back to America/Detroit if unset/invalid. window.CHGRID_TIME_ZONE = "America/Detroit"; diff --git a/client/src/audio/audioEngine.ts b/client/src/audio/audioEngine.ts index e4405b3..2d9349c 100644 --- a/client/src/audio/audioEngine.ts +++ b/client/src/audio/audioEngine.ts @@ -253,10 +253,14 @@ export class AudioEngine { this.playSound({ freq: isDefault ? 659.25 : 440, duration: 0.1, type: 'sine', gain: 0.35 }); } - sfxTileOccupantPing(): void { + sfxTileItemPing(): void { this.playSound({ freq: 1320, duration: 0.12, type: 'sine', gain: 0.45 }); } + sfxTileUserPing(): void { + this.playSound({ freq: 880, duration: 0.12, type: 'sine', gain: 0.45 }); + } + async playSpatialSample(url: string, sourcePosition: { x: number; y: number }, gain = 1): Promise { await this.ensureContext(); const { audioCtx, sfxGainNode } = this; diff --git a/client/src/main.ts b/client/src/main.ts index 702623c..744fe62 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -572,6 +572,21 @@ function pasteIntoActiveTextInput(raw: string): boolean { return true; } +async function handlePasteShortcut(): Promise { + let pasted = internalClipboardText; + try { + const clipboardText = await navigator.clipboard?.readText(); + if (typeof clipboardText === 'string') { + pasted = clipboardText; + internalClipboardText = clipboardText; + } + } catch { + // Clipboard read can fail without user gesture/permissions; fallback to internal clipboard. + } + if (!pasteIntoActiveTextInput(pasted)) return; + updateStatus('pasted'); +} + function isTextEditingMode(mode: typeof state.mode): boolean { return mode === 'nickname' || mode === 'chat' || mode === 'itemPropertyEdit'; } @@ -779,13 +794,14 @@ function handleMovement(): void { const tileAnnouncements: string[] = []; if (namesOnTile.length > 0) { tileAnnouncements.push(namesOnTile.join(', ')); + audio.sfxTileUserPing(); } if (itemsOnTile.length > 0) { tileAnnouncements.push(itemsOnTile.map((item) => itemLabel(item)).join(', ')); + audio.sfxTileItemPing(); } if (tileAnnouncements.length > 0) { updateStatus(tileAnnouncements.join('. ')); - audio.sfxTileOccupantPing(); } } @@ -2066,7 +2082,8 @@ function setupInputHandlers(): void { return; } if (code === 'KeyV') { - updateStatus('pasted'); + void handlePasteShortcut(); + return; } }