This commit is contained in:
2026-09-29 00:45:16 +08:00
parent f05f1580bd
commit c91eaef60b
3 changed files with 226 additions and 76 deletions
@@ -3565,6 +3565,21 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
Transform lockTr = ResolveLockTransform(monster, out colliderIndex, true);
// ⭐ lockPoint 和 colliderList 全部未激活 → 不锁定这条鱼
if (lockTr == null) return;
// ⭐⭐⭐ 战神 + 三发 + 锁定(散射三个锁定圈):手动点击 = 占主锁位,
// 原来的主锁位自动挤到子锁位,子锁位依次后移,最多锁3个
if (IsZhanShenTripleMode())
{
// 已经在锁位上的鱼 → 不重复加
if (currSitData.IsFishInTripleSlots(monster.guid)) return;
currSitData.PushTripleLockSlot(monster, lockTr);
currSitData.isManualLock = true;
_autoLockActivated = true;
SyncLock(currSitData.GetTripleLockGuids(), colliderIndex);
return;
}
// ⭐ 标记为手动锁定:不受路径进度(0.1~0.9)限制,鱼离场前一直锁定
currSitData.isManualLock = true;
currSitData.SetLockTarget(monster, lockTr);
@@ -3573,6 +3588,15 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// ⭐ 手动锁定成功 → 激活自动锁定(该鱼死亡后自动转换目标)
_autoLockActivated = true;
}
/// <summary>是否处于 战神 + 三发 + 锁定 模式(散射激光 + 3个锁定圈)</summary>
private bool IsZhanShenTripleMode()
{
return currSitData != null
&& currSitData.currentZhanShenData != null
&& toggle_Three != null && toggle_Three.isOn
&& toggle_Lock != null && toggle_Lock.isOn;
}
private void UpdateLockFX()
{
@@ -3650,36 +3674,42 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
}
private void CheckLockTargetValid()
{
// ⭐⭐⭐ 三发模式:每个锁位独立维护 —— 鱼死了 或 路径离场时,只补那一个锁位,其他锁位不动
// ⭐⭐⭐ 三发模式:每个锁位独立维护 —— 鱼死了/路径离场时只补那一个锁位,其他锁位不动。
// 补位只尝试一次:补到了就锁上;补不到该锁位转"空置等手动点击"(不再自动补)。
// (Count 由 SetTripleLockTargets 建立;HideTripleLockIcons 才清成 0)
if (currSitData.tripleLockTargets.Count > 0)
{
// ⭐ 补齐到3个锁位(三发=最多3个目标):某位暂时没鱼可补就留空占位,下一帧继续尝试
while (currSitData.tripleLockTargets.Count < 3)
{
currSitData.tripleLockTargets.Add(null);
currSitData.tripleLockPositions.Add(null);
}
// ⭐ 固定3个锁位(三发=最多3个目标)
currSitData.EnsureTripleLockSlots(3);
for (int i = currSitData.tripleLockTargets.Count - 1; i >= 0; i--)
{
var t = currSitData.tripleLockTargets[i];
// ⭐ 鱼死了(被回收/销毁) → 补这一个锁位
if (t == null || !t.gameObject.activeInHierarchy)
// ---- 该锁位有鱼:判断是否需要更换 ----
if (t != null && t.gameObject.activeInHierarchy)
{
RefillTripleLockSlot(i);
// ⭐ 玩家手动点选的锁位 → 离场前一直跟,死了才换。
// 手动身份是跟着鱼走的:被挤到子锁位后依然是手动,不会被自动换掉
if (currSitData.IsTripleSlotManual(i)) continue;
// ⭐ 路径离场(超出 0.1~0.9) 或 被 SuoDing 取消勾选 → 只补这一个锁位
if (!IsFishPathLockable(t) || !IsFishAllowedBySuoDing(t))
RefillTripleLockSlot(i);
continue;
}
// ⭐ 主锁位是玩家手动锁的 → 离场前一直跟,不自动更换
if (i == 0 && currSitData.isManualLock) continue;
// ---- 该锁位空着 ----
// ⭐ "空置等手动点击"状态 → 不再自动补位,必须玩家点击才锁
if (currSitData.IsTripleSlotIdle(i)) continue;
// ⭐ 自动锁定的锁位:路径离场(超出 0.1~0.9) 或 被 SuoDing 取消勾选
// → 只补这一个锁位,其他锁位不动
if (!IsFishPathLockable(t) || !IsFishAllowedBySuoDing(t))
RefillTripleLockSlot(i);
// ⭐ 刚打死后重新检测:只尝试这一次,成功就锁上,失败则转成"空置等手动"
RefillTripleLockSlot(i);
}
// ⭐ 三个锁位全空 → 暂时不锁定,等玩家手动点击才锁(关掉自动锁定激活标记)
if (!currSitData.HasAnyTripleTarget)
_autoLockActivated = false;
return;
}
@@ -4220,13 +4250,23 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
auto = currSitData.IsAutoAttackOn
};
// ⭐ 战神 三发 + 锁定:查找 3 个优先级目标,写入 monsterIDs(FireLaser 分散打三个用)
// 正常炮台三合一打主锁目标(monCotl_Lock 已由 SyncLock/SyncBotLock 同步),不需要 monsterIDs
// ⭐ 战神 三发 + 锁定:3个锁定目标写入 monsterIDs(FireLaser 分散打三个用)
// ⭐ 优先用当前维护的3个锁位(玩家手动点选的目标) → 打哪锁哪
// 锁位上没有有效目标时才按优先级现找。正常炮台三合一打主锁目标
// (monCotl_Lock 已由 SyncLock/SyncBotLock 同步),不需要 monsterIDs
if (isSanShe && isLock && currSitData.currentZhanShenData != null)
{
var targets = FindFireTargets(3);
if (targets.Count > 0)
fireData.monsterIDs = targets.Select(t => t.monster.guid).ToList();
var lockedGuids = currSitData.GetTripleLockGuids();
if (lockedGuids.Count > 0)
{
fireData.monsterIDs = lockedGuids;
}
else
{
var targets = FindFireTargets(3);
if (targets.Count > 0)
fireData.monsterIDs = targets.Select(t => t.monster.guid).ToList();
}
}
SyncGameData sgd = new SyncGameData