This commit is contained in:
2026-09-26 15:35:40 +08:00
parent b777f0f6aa
commit cbaf4afd95
47 changed files with 454 additions and 60 deletions
@@ -130,6 +130,8 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
[Tooltip("按 M 键生成的鱼编号(配置 fishNumber)")]
public string debugSpawnFishNumber = "11043";
public bool isleft = true;
[Tooltip("按M键批量模式:激活=本地在所有普通鱼路线上各生成一条(不走服务端);不激活=走服务端出一条")]
public bool debugSpawnAllLines = false;
private Dictionary<string, CharacterStateType> frozenFishStates = new Dictionary<string, CharacterStateType>();
private Dictionary<string, bool> frozenFishIsMoves = new Dictionary<string, bool>();
@@ -333,7 +335,23 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
Debug.LogWarning("[CreateFishManager] 当前未在房间中(roomId 为空),无法出鱼");
return;
}
APIManager.TempSpawnFish(roomId, debugSpawnFishNumber,1,30, isleft?1:2);
// ⭐ debugSpawnAllLines 激活:本地在所有普通鱼路线("曲线"+id)上各生成一条(不走服务端);
// 不激活:走服务端 AdminApi 出一条(现状)
if (debugSpawnAllLines)
{
int spawned = 0;
foreach (var key in MonsterMoveLine.dic_BezierCurveDatas.Keys)
{
if (key == null || !key.StartsWith("曲线")) continue;
if (!int.TryParse(key.Substring(2), out int rid)) continue;
if (ManualSpawn(debugSpawnFishNumber, rid, 30)) spawned++;
}
Debug.Log($"[CreateFishManager] 调试批量出鱼(所有路线): fishNumber={debugSpawnFishNumber}, 共生成{spawned}条");
}
else
{
APIManager.TempSpawnFish(roomId, debugSpawnFishNumber,1,30, isleft?1:2);
}
}
}
@@ -2078,28 +2096,30 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
}
// 特殊鱼:金币飞向炮台(池化,动画事件播完手动回池)
// ⭐ Get 不设置位置:DieEffect_TSY(ZDX 炸弹蟹等)爆奖完全用预制体里配置好的位置(含 y 轴);
// 只有 BJBase 金币特效按鱼死亡位置摆放(startPoint 依赖)
var award = EffectPool.Instance.Get(
monster.effect_DieAward != null ? monster.effect_DieAward : dieFXPrefabAward,
monster.transform.position, Quaternion.identity, currGameType.subPanelParent.parent,
currGameType.subPanelParent.parent,
autoReturn: false);
try
{
award.GetComponent<RectTransform>().anchoredPosition =
CoordinateTransformation.WorldPos_ToCanvas(
monster.transform.position,
GetUiCanvas());
}
catch
{
award.transform.position = monster.transform.position;
}
var coinScript = award.GetComponent<BJBase>();
if (coinScript != null)
{
// 普通爆奖(BJBase 体系)
// 普通爆奖(BJBase 体系):摆到鱼死亡位置(画布坐标),startPoint 依赖
try
{
award.GetComponent<RectTransform>().anchoredPosition =
CoordinateTransformation.WorldPos_ToCanvas(
monster.transform.position,
GetUiCanvas());
}
catch
{
award.transform.position = monster.transform.position;
}
coinScript.startPoint = award.transform.position;
coinScript.Init(killFish.gold, sitData.transform.position, killFish.userId, sitData.posID, killFish.param);
coinScript.isLocalCoin = sitData.user == GameManager.Instance.user.id;
@@ -90,9 +90,17 @@ namespace Assets.MyGame.Scripts.Net
case "BeginGame":
{
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg.ToString()).arguments[0];
roomMainPanel.subUIManager.CloseAll();
roomMainPanel.StartGame(msg);
roomMainPanel.UpdateUserData(va);
if (roomMainPanel != null && roomMainPanel.IsChessGameActive && va.state == 2)
{
// 对局中收到 BeginGame = 断线重连/取消挂起的房间同步:只刷新玩家数据,不重置对局
roomMainPanel.UpdateUserData(va);
}
else
{
roomMainPanel.subUIManager.CloseAll();
roomMainPanel.StartGame(msg);
roomMainPanel.UpdateUserData(va);
}
}
break;
@@ -174,6 +182,12 @@ namespace Assets.MyGame.Scripts.Net
{
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQDefeated);
}
// 服务端已结算:本地对局同步置结束 + 停表(防后台方回前台后对局还在跑)
if (roomMainPanel != null)
{
roomMainPanel.StopWaitCountdown();
roomMainPanel.MarkChessGameOverByServer();
}
// 结算后按结果实时更新房间双方金币显示
roomMainPanel.ApplySettlementGold(va);
}
@@ -222,7 +236,16 @@ namespace Assets.MyGame.Scripts.Net
}
break;
case "Disconnect":
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQWin);
{
// 对方断线 { userId, disconnectTime, timeoutSeconds }:只提示等待重连,
// 服务端超时未重连会自动判负推 GameEnd(心跳里的 CheckTimeout 也会触发检查)
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
string disUserId = va["userId"]?.ToString();
int disTimeout = 60;
if (va.ContainsKey("timeoutSeconds") && va["timeoutSeconds"] != null)
int.TryParse(va["timeoutSeconds"].ToString(), out disTimeout);
if (roomMainPanel != null) roomMainPanel.OnOpponentDisconnected(disUserId, disTimeout);
}
break;
case "GameError":
{
@@ -251,6 +274,7 @@ namespace Assets.MyGame.Scripts.Net
{
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
Debug.Log($"[Chess] 重连: userId={va["userId"]}, userName={va["userName"]}");
if (roomMainPanel != null) roomMainPanel.OnOpponentReconnected(va["userId"]?.ToString());
}
break;
@@ -272,6 +296,8 @@ namespace Assets.MyGame.Scripts.Net
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQWin);
else
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQDefeated);
// 服务端已结算:本地对局同步置结束(防后台方回前台后对局还在跑)
if (roomMainPanel != null) roomMainPanel.MarkChessGameOverByServer();
// 结算后按结果实时更新房间双方金币显示
roomMainPanel.ApplySettlementGold(winUserId);
}
@@ -316,9 +342,9 @@ namespace Assets.MyGame.Scripts.Net
case "PlayerAfkNotice":
{
// 玩家挂起通知 { userId }(房间组推送;挂起仅表现提示,不影响服务端操作校验)
// 表现层(座位挂起标记)由 UI 对话接入
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<PlayerAfkNoticeData>>(msg).arguments[0];
Debug.Log($"[Chess] 玩家挂起: userId={va?.userId}");
if (roomMainPanel != null) roomMainPanel.OnPlayerAfkNotice(va?.userId);
}
break;
@@ -327,6 +353,7 @@ namespace Assets.MyGame.Scripts.Net
// 玩家取消挂起通知 { userId }(房间组推送;发起者本人另收 BeginGame 恢复房间同步)
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<PlayerAfkNoticeData>>(msg).arguments[0];
Debug.Log($"[Chess] 玩家取消挂起: userId={va?.userId}");
if (roomMainPanel != null) roomMainPanel.OnPlayerCancelAfkNotice(va?.userId);
}
break;