From f64a6b5c9587197013b62d54299f1155ea5ed1d9 Mon Sep 17 00:00:00 2001 From: zhangyibo95 <690096405@qq.com> Date: Thu, 16 Jul 2026 16:40:32 +0800 Subject: [PATCH] =?UTF-8?q?update:=E6=96=B0=E5=A2=9E=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E9=87=8D=E8=BF=9E=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?tententen=E8=AF=AD=E9=9F=B3=EF=BC=8C=E4=BF=AE=E5=A4=8Dmvp?= =?UTF-8?q?=E6=96=A9=E8=8E=B7=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ShootProgress.vue | 4 + src/matchWebsocket.js | 3 + src/pages/battle-room.vue | 179 +++++++++++++++++++++++++++-- src/pages/friend-battle-result.vue | 9 +- src/pages/match-page.vue | 176 ++++++++++++++++++++-------- src/pages/melee-battle.vue | 50 +------- src/pages/practise-one.vue | 34 +----- src/pages/practise-two.vue | 34 +----- src/pages/team-battle.vue | 33 +----- src/pages/team-battle/index.vue | 55 +-------- src/utils/match.min.js | 2 +- src/utils/matchAdapter.js | 2 +- src/utils/matchProtocol.js | 2 + 13 files changed, 328 insertions(+), 255 deletions(-) diff --git a/src/components/ShootProgress.vue b/src/components/ShootProgress.vue index f2448bd..0e0d407 100644 --- a/src/components/ShootProgress.vue +++ b/src/components/ShootProgress.vue @@ -157,6 +157,10 @@ async function onReceiveMessage(msg) { key.push(arrow.ring ? `${arrow.ringX ? "X" : arrow.ring}环` : "未上靶"); if (arrow.angle) key.push(`向${getDirectionText(arrow.angle)}调整`); + const shouldPlayTententen = + arrow.threeConsecutive10Rings === true || + msg.shootData?.threeConsecutive10Rings === true; + if (!props.melee && shouldPlayTententen) key.push("tententen"); audioManager.play(key, false); } else if (msg.type === MESSAGETYPESV2.HalfRest) { halfTime.value = true; diff --git a/src/matchWebsocket.js b/src/matchWebsocket.js index 9ce0746..cc0b803 100644 --- a/src/matchWebsocket.js +++ b/src/matchWebsocket.js @@ -310,6 +310,9 @@ function getShootResultAudioKeys(shootData) { if (shootData.angle !== null && shootData.angle !== undefined) { keys.push(`向${getDirectionText(shootData.angle)}调整`); } + if (shootData.threeConsecutive10Rings === true) { + keys.push("tententen"); + } return keys; } diff --git a/src/pages/battle-room.vue b/src/pages/battle-room.vue index 294823b..d711151 100644 --- a/src/pages/battle-room.vue +++ b/src/pages/battle-room.vue @@ -1,6 +1,6 @@ diff --git a/src/pages/melee-battle.vue b/src/pages/melee-battle.vue index 8bf1cd3..2cc71cc 100644 --- a/src/pages/melee-battle.vue +++ b/src/pages/melee-battle.vue @@ -52,8 +52,6 @@ const readyTime = ref(DEFAULT_READY_TIME); let halfRestTimer = null; /** 控制设备离线提示弹窗的显示状态 */ const showOfflineModal = ref(false); -/** 记录每位玩家当前半场连续 10 环及以上次数,key 为 playerId,用于触发 tententen 音效 */ -const xRingStreaks = ref({}); let battleEnded = false; let skipNextRestoreOnShow = false; let restoreGeneration = 0; @@ -399,32 +397,6 @@ onLoad(async (options) => { // }); }); -/** - * 检测指定玩家连续 10 环及以上是否达到 3 箭,达到则在环数播报入队后追加 tententen 音效 - * @param {number|string} playerId - 本次射手的 ID(大乱斗中 ShootResult 保留 playerId) - * @param {boolean} isTenPlusRingShot - 本次射击是否为 10 环及以上 - */ -function isTenPlusRing(shot) { - return !!(shot?.ringX || Number(shot?.ring) >= 10); -} - -function checkAndPlayTententen(playerId, isTenPlusRingShot) { - if (!playerId) return; - const id = parseInt(playerId); - if (isTenPlusRingShot) { - xRingStreaks.value[id] = (xRingStreaks.value[id] || 0) + 1; - // 同一玩家连续 3 箭均为 10 环及以上,追加到环数音效队列尾部播放 - if (xRingStreaks.value[id] >= 3) { - xRingStreaks.value[id] = 0; - // nextTick 确保 HeaderProgress 的环数播报已入队后再追加 tententen,避免播放顺序颠倒 - nextTick(() => audioManager.play("tententen", false)); - } - } else { - // 低于 10 环或未上靶则重置该玩家的连续计数 - xRingStreaks.value[id] = 0; - } -} - async function onReceiveMessage(msg) { if (Array.isArray(msg)) return; if (msg.type === MESSAGETYPESV2.AboutToStart) { @@ -433,28 +405,10 @@ async function onReceiveMessage(msg) { leaveHalfRest(); recoverData(msg); } else if (msg.type === MESSAGETYPESV2.ShootResult) { - // 更新前快照各玩家本轮已射箭数,用于事后识别本次射手 - const curRound = playersScores.value[playersScores.value.length - 1] || {}; - const prevCounts = {}; - for (const pid of Object.keys(curRound)) { - prevCounts[pid] = (curRound[pid] || []).length; - } recoverData(msg); - // 对比更新后数据找出箭数增加的玩家(即本次射手),并读取其最新箭的 ring 数据 - const newRound = playersScores.value[playersScores.value.length - 1] || {}; - let shooterId = null; - let isTenPlusRingShot = false; - for (const pid of Object.keys(newRound)) { - const newLen = (newRound[pid] || []).length; - if (newLen > (prevCounts[pid] || 0)) { - shooterId = parseInt(pid); - const shot = newRound[pid][newLen - 1]; - isTenPlusRingShot = isTenPlusRing(shot); - break; - } + if (msg.shootData?.threeConsecutive10Rings === true) { + nextTick(() => audioManager.play("tententen", false)); } - // 检测同一玩家连续三箭 10 环及以上,触发 tententen 音效 - checkAndPlayTententen(shooterId, isTenPlusRingShot); } else if (msg.type === MESSAGETYPESV2.HalfRest) { halfTimeTip.value = true; halfRest.value = true; diff --git a/src/pages/practise-one.vue b/src/pages/practise-one.vue index fcac288..28390ad 100644 --- a/src/pages/practise-one.vue +++ b/src/pages/practise-one.vue @@ -1,5 +1,5 @@