This commit is contained in:
2026-07-20 22:32:52 +08:00
parent 61b9b9a3e6
commit 9977ce1fc9
17 changed files with 254 additions and 109 deletions
@@ -286,12 +286,9 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
targetSit.isBot = false;
targetSit.ShowWaiting();
}
// ⭐ 房主:新真人玩家加入时,把当前场上所有活鱼广播一遍,
// 让新玩家立即同步看到场上鱼状态(不用等房主下次出鱼)
if (CreateFishManager.Instance != null && CreateFishManager.Instance.fangzhu)
{
CreateFishManager.Instance.BroadcastExistingFishes();
}
// ⭐ 新玩家同步走"主动请求"流程:
// 新玩家资源加载完毕后会主动发 requestSyncFish,
// 房主收到后才广播场上活鱼(避免新玩家还没加载完就收包丢失)
}
JoinGame(roomJoinNotice.position, roomJoinNotice.gold, roomJoinNotice.diamond, roomJoinNotice.cannonMultiple, 0, roomJoinNotice.userId, roomJoinNotice.cannonId, roomJoinNotice.wingsId);
@@ -550,19 +547,17 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
}
toggle_BaoZou.onValueChanged.AddListener(on =>
{
// UI 开关只是触发,但最终状态以 currGameType 为准
CreateFishManager.Instance.currGameType.isFrenzy = on;
SetFrenzy(on);
if (on)
if (!on) return;
if (_localBaoZouCount <= 0)
{
currFrenzyTime = frenzyDuration;
// ⭐ 激活时本地扣减一张(暂无扣减 API,仅 UI 显示)
if (_localBaoZouCount > 0)
{
_localBaoZouCount--;
UpdateSkillPropsUI();
}
toggle_BaoZou.SetIsOnWithoutNotify(false);
return;
}
// 只发请求,效果等 UsePropNotice 回调触发
WebSocketSendList.UseProp(
GameManager.Instance.gameData.currRoomData.roomId,
GameManager.Instance.user.BaseInfo.number,
"40006", 0);
});
toggle_SkillAuto.onValueChanged.AddListener(on =>
{
@@ -574,38 +569,17 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
}
});
toggle_BingFeng.onValueChanged.AddListener(on => {
if (on)
if (!on) return;
if (_localBingFengCount <= 0)
{
// 开始冰冻
currBingFengTime = bingFengDuration;
// ⭐ 激活时本地扣减一张(暂无扣减 API,仅 UI 显示)
if (_localBingFengCount > 0)
{
_localBingFengCount--;
UpdateSkillPropsUI();
}
if (bingFengEffect != null)
{
if (_bingFengInstance == null)
_bingFengInstance = Instantiate(bingFengEffect);
_bingFengInstance.SetActive(true);
}
CreateFishManager.Instance.FreezeAllFish();
PauseAllFishAnimations();
SyncFreeze(true);
}
else
{
// 手动关闭 → 解冻
if (_bingFengInstance != null)
_bingFengInstance.SetActive(false);
if (CreateFishManager.Instance.isFrozen)
{
CreateFishManager.Instance.UnfreezeAllFish();
ResumeAllFishAnimations();
SyncFreeze(false);
}
toggle_BingFeng.SetIsOnWithoutNotify(false);
return;
}
// 只发请求,效果等 UsePropNotice 回调触发
WebSocketSendList.UseProp(
GameManager.Instance.gameData.currRoomData.roomId,
GameManager.Instance.user.BaseInfo.number,
"40007", 0);
});
@@ -716,7 +690,23 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// ⭐ 进度条加载完毕:房主创建一批初始鱼(进度 0.2~0.8),屏幕开局就有鱼
// 只在房主端调用,通过 SyncGameData 广播给所有客户端
CreateFishManager.Instance.CreateInitialFishes(Random.Range(10, 21));
// 非房主(后加入的真人玩家):发"请求同步鱼"让房主广播场上活鱼
// 这里只发请求,实际接收广播在 CreateFishManager.CreateFish(已做 guid 去重)
if (CreateFishManager.Instance.fangzhu)
{
CreateFishManager.Instance.CreateInitialFishes(Random.Range(10, 21));
}
else
{
var req = new SyncGameData
{
sitPos = GameManager.Instance.gameData.roomJoinNotice.position,
frameType = FrameDataType.requestSyncFish,
time = BeijingTimeManager.Instance.CurrentTimestampMs,
frameData = null
};
WebSocketSendList.SyncGameData(req);
}
JinDuTiao.SetProgress(1);
await Task.Delay(300);
@@ -2034,6 +2024,39 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
WebSocketSendList.SyncGameData(sgd);
}
/// <summary>
/// UsePropNotice 回调:服务器确认道具使用后,激活对应效果
/// </summary>
public void OnUsePropNotice(string userId, string propNumber)
{
switch (propNumber)
{
case "40006": // 暴走
_localBaoZouCount--;
UpdateSkillPropsUI();
CreateFishManager.Instance.currGameType.isFrenzy = true;
SetFrenzy(true);
currFrenzyTime = frenzyDuration;
toggle_BaoZou.SetIsOnWithoutNotify(true);
break;
case "40007": // 冰封
_localBingFengCount--;
UpdateSkillPropsUI();
currBingFengTime = bingFengDuration;
toggle_BingFeng.SetIsOnWithoutNotify(true);
if (bingFengEffect != null)
{
if (_bingFengInstance == null)
_bingFengInstance = Instantiate(bingFengEffect);
_bingFengInstance.SetActive(true);
}
CreateFishManager.Instance.FreezeAllFish();
PauseAllFishAnimations();
break;
}
}
public void SyncGameData_FreezeFish(SyncGameData sync)
{
if (sync.sitPos == currSitData.posID) return; // 自己发的不管