From 7b08d68141d970ed9aa882cf57661272b47ff34a Mon Sep 17 00:00:00 2001 From: sasha Date: Mon, 13 Oct 2025 12:50:13 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B2=D0=B8=D0=B7=D1=83=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=B8=D0=BD=D0=B4=D0=B8=D0=BA=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=D1=8B=D1=81=D1=82=D1=80=D0=B5=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BD=D0=B0=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Реализована подсветка портов при выстрелах от ESP: **Типы подсветки:** - 🔴 Красная (miss) - выстрел на пустом порту (notshot) или ошибка (shotErr/shotErrA) - 🟡 Желтая (shot) - начало выстрела (startshot) - 🟢 Зеленая (hit) - успешный выстрел (shot) **Изменения:** 1. **useWebSocket.js:** - Добавлены команды выстрелов в список системных сообщений - shot, startshot, notshot, shotErr, shotErrA 2. **useGamePorts.js (handlePortMessage):** - case 'notshot' → highlight: 'miss' (1 сек) - case 'startshot' → highlight: 'shot' (2 сек) - case 'shot' → highlight: 'hit' (1 сек) + обновление патронов - case 'shotErr/shotErrA' → highlight: 'miss' (2 сек) **Логика:** - Попытка выстрела БЕЗ игры → красная подсветка 1 сек - Начало выстрела → желтая подсветка 2 сек - Успешный выстрел → зеленая подсветка 1 сек - Ошибка выстрела → красная подсветка 2 сек - Автоочистка через setTimeout 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- client/src/composables/game/useGamePorts.js | 61 +++++++++++++++++++++ client/src/composables/useWebSocket.js | 4 ++ 2 files changed, 65 insertions(+) diff --git a/client/src/composables/game/useGamePorts.js b/client/src/composables/game/useGamePorts.js index 7683d9d..27056b9 100644 --- a/client/src/composables/game/useGamePorts.js +++ b/client/src/composables/game/useGamePorts.js @@ -1051,6 +1051,67 @@ export function useGamePorts() { } break + case 'notshot': + // Попытка выстрела на пустом порту - красная подсветка + logger.info(`🔴 notshot на порту ${portNumber} - пустой порт`) + ports[portNumber].highlight = 'miss' + + // Автоочистка через 1 секунду + setTimeout(() => { + if (ports[portNumber].highlight === 'miss') { + ports[portNumber].highlight = null + } + }, 1000) + break + + case 'startshot': + // Начало выстрела - желтая подсветка + logger.info(`🟡 startshot на порту ${portNumber}`) + ports[portNumber].highlight = 'shot' + + // Автоочистка через 2 секунды (если не придет shot) + setTimeout(() => { + if (ports[portNumber].highlight === 'shot') { + ports[portNumber].highlight = null + } + }, 2000) + break + + case 'shot': + // Успешный выстрел - зеленая подсветка + logger.info(`🟢 shot на порту ${portNumber}, осталось патронов: ${data.patr}`) + ports[portNumber].highlight = 'hit' + + // Обновляем патроны если пришли в data + if (data.patr !== undefined) { + ports[portNumber].patr = data.patr + } + if (data.patrOk !== undefined) { + ports[portNumber].patrOk = data.patrOk + } + + // Автоочистка через 1 секунду + setTimeout(() => { + if (ports[portNumber].highlight === 'hit') { + ports[portNumber].highlight = null + } + }, 1000) + break + + case 'shotErr': + case 'shotErrA': + // Ошибка выстрела (осечка или замыкание) - красная подсветка + logger.info(`🔴 ${data.do} на порту ${portNumber}`) + ports[portNumber].highlight = 'miss' + + // Автоочистка через 2 секунды + setTimeout(() => { + if (ports[portNumber].highlight === 'miss') { + ports[portNumber].highlight = null + } + }, 2000) + break + default: logger.warn('Обрабатываю неизвестное сообщение порта как общее обновление:', data.do) // Пытаемся обработать как общее обновление порта diff --git a/client/src/composables/useWebSocket.js b/client/src/composables/useWebSocket.js index bb7dea6..208eaf7 100644 --- a/client/src/composables/useWebSocket.js +++ b/client/src/composables/useWebSocket.js @@ -55,6 +55,8 @@ export function useWebSocket() { data.do === 'start' || data.do === 'endGame' || data.do === 'pause' || data.do === 'resume' || data.do === 'bonus' || data.do === 'deleteGamer' || data.do === 'cancelGame' || data.do === 'move' || data.do === 'moveGamer' || + data.do === 'shot' || data.do === 'startshot' || data.do === 'notshot' || + data.do === 'shotErr' || data.do === 'shotErrA' || data.do === 'sharikStartGame' || data.do === 'sharikEndGame' || data.do === 'sharikCancelGame' || data.do === 'sharikDeleteGamer') { // Передаем системные сообщения в глобальный обработчик @@ -66,6 +68,8 @@ export function useWebSocket() { if (data.do === 'start' || data.do === 'endGame' || data.do === 'pause' || data.do === 'resume' || data.do === 'bonus' || data.do === 'deleteGamer' || data.do === 'cancelGame' || data.do === 'move' || data.do === 'moveGamer' || + data.do === 'shot' || data.do === 'startshot' || data.do === 'notshot' || + data.do === 'shotErr' || data.do === 'shotErrA' || data.do === 'sharikStartGame' || data.do === 'sharikEndGame' || data.do === 'sharikCancelGame' || data.do === 'sharikDeleteGamer') { // Продолжаем выполнение для promise обработки