This commit is contained in:
2026-10-07 01:55:53 +08:00
parent 499eea39aa
commit 1321ed6c01
5 changed files with 131 additions and 20 deletions
@@ -4519,6 +4519,25 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
return;
}
var targetSit = list_Sits[dispPos];
// ⭐⭐ 战神散射(三发+锁定):发送端每发都带 isSanShe/isSuoDing 和3个激光目标GUID(monsterIDs)
// → 其他玩家的座位跟着补齐3个锁位 + 刷新散射标记:3条激光 + 2个散射起点球
// (JGFXLeftParent/JGFXRightParent) 一起显示。
// ⭐ 这条路是"自动凑满3个目标"时唯一的信号(自动补位/自动凑目标不会走锁定同步),
// 只在锁定同步里处理的话,不开手动点鱼别人就看不到散射表现。
// ⚠ 只处理别人的座位:本地座位自己的三发锁位由本地锁定系统维护,不能被网络数据覆盖
if (targetSit != currSitData && targetSit.currentZhanShenData != null)
{
bool scatter = data.isSanShe && data.isSuoDing;
if (targetSit.isScatterLaserOn != scatter)
{
targetSit.isScatterLaserOn = scatter;
// 退出散射:清掉远端多出来的锁位(主锁保留,仍显示1条激光 + 主锁定圈)
if (!scatter) targetSit.HideTripleLockIcons();
}
if (scatter) ApplyTripleLockSlotsFromGuids(targetSit, data.monsterIDs);
}
// ⭐ 座位镜像:网络角度是"源角度"(发送方下方座位系),按该座位显示位置还原成世界角度
FireBullet(targetSit, SeatMirror.SourceAngleToWorld(data.angle, targetSit.IsFlipped),
data.isSanShe, data.twoRTruuect, data.isSuoDing, sync.bulletIds, data.monsterIDs, bulletGolds);
@@ -4552,21 +4571,67 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
if (dispPos == currSitData.posID) return;
var data = FrameDataParser.Parse<FrameData_ChangeAutoTarget>(sync.frameData);
var sit = list_Sits[dispPos];
if (data.targetGuid == null)
if (data.targetGuid == null || data.targetGuid.Count == 0)
{
list_Sits[dispPos].ClearLock();
sit.ClearLock();
return;
}
MonsterContral monster = CreateFishManager.Instance.fishDatas_hashCodekey[data.targetGuid[0]];
// ⭐⭐ 战神三发散射:发送端把3个锁位一起同步过来([0]=主锁目标,[1]/[2]=散射目标)。
// 以前只取了 [0],远端锁位永远只有1个 → 远端激光只有1条,
// 散射左右起点球(JGFXLeftParent/JGFXRightParent)不激活 → 别人的视角看不到两个小球。
// 这里按整份列表补齐远端锁位:远端表现与发送端一致(3条激光 + 2个起点球 + 2个额外锁定圈)。
// 注:统一用 ResolveLockTransform(colliderList 第一个活跃 → lockPoint → transform),
// 网络同步过来的 colliderIndex 不再使用(客户端之间 colliderList 顺序可能不一致)
var targets = new List<(MonsterContral monster, Transform hitPos)>();
foreach (var guid in data.targetGuid)
{
if (string.IsNullOrEmpty(guid)) continue;
if (!CreateFishManager.Instance.fishDatas_hashCodekey.TryGetValue(guid, out var m) || m == null) continue;
targets.Add((m, ResolveLockTransform(m)));
}
// ⭐ 统一用 ResolveLockTransform:colliderList 第一个活跃 → lockPoint → transform
// 注:网络同步过来的 colliderIndex 在统一逻辑下不再使用,因为客户端之间
// colliderList 顺序可能不一致,统一用"第一个活跃"更稳定
Transform hitPos = ResolveLockTransform(monster);
if (targets.Count > 1)
{
sit.SetTripleLockTargets(targets);
}
else
{
// 单发锁定:清掉三发锁位(远端不再显示散射起点球/额外激光/额外锁定圈)
sit.HideTripleLockIcons();
if (targets.Count == 1)
sit.SetLockTarget(targets[0].monster, targets[0].hitPos);
else
sit.ClearLock();
}
}
list_Sits[dispPos].SetLockTarget(monster, hitPos);
/// <summary>
/// ⭐ 按 guid 列表给座位补齐"三发锁位"(远端散射表现用):
/// 有效目标>1 → SetTripleLockTargets(3条激光 + 2个散射起点球 + 2个额外锁定圈一起出来);
/// 否则清掉三发锁位(该座位按单发显示,主锁不动)。
/// ⚠ 只给其他玩家的座位用:本地座位的三发锁位由本地锁定系统维护,绝不能被网络数据覆盖。
/// </summary>
private void ApplyTripleLockSlotsFromGuids(SitPosData sit, List<string> guids)
{
var targets = new List<(MonsterContral monster, Transform hitPos)>();
if (guids != null)
{
foreach (var guid in guids)
{
if (string.IsNullOrEmpty(guid)) continue;
if (!CreateFishManager.Instance.fishDatas_hashCodekey.TryGetValue(guid, out var m) || m == null) continue;
if (m.isDead || !m.gameObject.activeInHierarchy) continue;
targets.Add((m, ResolveLockTransform(m)));
}
}
if (targets.Count > 1)
sit.SetTripleLockTargets(targets);
else
sit.HideTripleLockIcons();
}
public void SyncGameData_RendromDieFish(SyncGameData sync)