using asap.core; using GameCore; using LitJson; using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; public struct RodStateEvent { public int RoleID; } public partial class FishingDuelManager { public int seed; public int WeatherType { get; private set; } = 0;//0晴天 1雨天 bool hasRedFish;//0无红鱼 1有红鱼 public bool IsRobot { get; private set; } public int MachingState = 0;// 1一方准备好 2双方准备好 public int SceneState = 0;// 1一方准备好 2双方准备好 public int RodState = 0;// 1一方准备好 2双方准备好 public int GameOverState = 0;//1一方钓完 2双方钓完 bool IsCancel = false; public async void StartMaching() { selfIsLastFish = false; //随机地图 //等待匹配成功,或者匹配失败(机器人),开始对战 //传入段位,可匹配段位列表,杯数,选择倍率,地图列表,随机种子seed int rank = eventSolomain.RankTier; List matchTierList = eventSolomain.MatchTierList; int trophy = duelData.progress; int mag = magnification; List mapIDs = await GetRandmMap(); seed = new System.Random().Next(); MachingState = 0; SceneState = 0; RodState = 0; GameOverState = 0; IsCancel = false; bool isSuccess = await MachingSuccess(); if (IsCancel) { return; } //DuelFishingDataSave duelFishingDataSave = null; if (!isSuccess) { //if (duelFishingDataSave != null) //{ // duelData.mapId = duelFishingDataSave.mapId; // seed = duelFishingDataSave.seed; // enemySolomain = _tables.TbEventSolomain.DataMap[duelFishingDataSave.rankTier]; //} //else { if (mapIDs.Count == 1) { duelData.mapId = mapIDs[0]; } else { duelData.mapId = mapIDs[UnityEngine.Random.Range(0, mapIDs.Count)]; } int robotTier = eventSolomain.MatchTierList[UnityEngine.Random.Range(0, eventSolomain.MatchTierList.Count)]; enemySolomain = _tables.TbEventSolomain.DataMap[robotTier]; } //============匹配失败=============== //============匹配失败=============== } WeatherType = new System.Random(seed).Next(0, 2); GetFishItemID(new System.Random(seed)); SetTraitID(); List carLevels = SetSelfModel(); if (isSuccess) { IsRobot = false; } else { IsRobot = true; //if (duelFishingDataSave != null) //{ // PlayerRobot(duelFishingDataSave); //} //else { MachRobot();//匹配机器人 } } SendFishCardLevel(carLevels); Debug.Log($"本局鱼Seed:{seed} WeatherType {WeatherType}"); } public void CancelMaching() { //发送取消请求 IsCancel = true; } #region 匹配成功 //选鱼杆之后再传鱼杆ID、鱼杆等级、鱼杆星级等数据 //SetEnemyRodData(rodData.ID, rodLevel, star); async Task MachingSuccess() { double maxMatchTime = eventSoloConfig.MaxMatchTime * 1000; while (maxMatchTime > 0) { DateTime loopStartTime = DateTime.Now; try { //if (NetworkManager.Instance.HasMachingSuccess()) //{ // duelData.mapId = NetworkManager.Instance.GetMachingMapID(); // enemySolomain = NetworkManager.Instance.GetMachingEnemySolomain(); // seed = NetworkManager.Instance.GetMachingSeed(); //enemyModel = new DuelPlayerModel(); //enemyModel.Init(ID, Name, Avatar,Mag,eventSoloConfig.MaxFailCount); //enemyChatModel = new DuelChatModel();//真人 //enemyChatModel = new DuelRobotChatModel();//复刻真人 // return true; //} } catch (Exception ex) { Debug.LogError($"匹配检查过程中发生异常:{ex.Message}"); // 可根据需求选择:继续重试(仅打日志)或终止匹配(return false) // return false; } TimeSpan loopElapsed = DateTime.Now - loopStartTime; maxMatchTime -= loopElapsed.TotalMilliseconds; if (IsCancel || maxMatchTime < 1000) { return false; } await Task.Delay(1000); maxMatchTime -= 1000f; if (IsCancel || maxMatchTime < 0) { return false; } } return false; } //=========同步鱼卡信息========== void SendFishCardLevel(List carLevels) { selfModel.Init(carLevels); //传输鱼卡等级 if (!IsRobot) { //NetworkManager.Instance.SendFishCardLevel(carLevels); } MachingState++; } //获得对手鱼卡等级 void ReceiveEnemyFishCardLevel(List carLevels) { enemyModel.Init(carLevels); ReceiveEnemyRodData(_tables.TbRodData.DataList[0].ID, 0, 0);//默认鱼杆信息 MachingState++; } //=========同步鱼卡信息========== //=========同步鱼竿信息========== public void SendRodData(DuelRodData duelRod) { selfModel.SetRodData(duelRod); if (!IsRobot) { //NetworkManager.Instance.SendRodData(id, rodLevel, rodStar); } RodState++; GContext.Publish(new RodStateEvent() { RoleID = 0 }); } //获得对手鱼竿等级 public void ReceiveEnemyRodData(DuelRodData duelRod) { enemyModel.SetRodData(duelRod); RodState++; GContext.Publish(new RodStateEvent() { RoleID = 1 }); } //=========同步鱼竿信息========== //=========同步场景完成信息========== public void SendChangeScene() { if (!IsRobot) { //NetworkManager.Instance.SendSceneData(mapId); } SceneState++; } public void ReceiveEnemyChangeScene() { SceneState++; } //=========同步场景完成信息========== #endregion public void ReceiveEnemyRodData(int id, int rodLevel, int rodStar) { DuelRodData duelRod = new DuelRodData { rodId = id, rodLevel = rodLevel, rodStar = rodStar }; enemyModel.SetRodData(duelRod); } /// /// 对手操作 /// /// public void ReceiveFishingQueue(RobotFishingQueue robotFishing) { bool gameOver; switch (robotFishing.changeState) { case FishingChangeState.Cast: enemyModel.CastRod(robotFishing.fishItemId); if (enemyModel.IsLastFish() && !selfModel.IsLastFish()) { enemyChatModel.SendMessage((int)RobotDuelChatType.FirstLastFishStart); ReceiveFishingEvent receiveFishingEvent = new ReceiveFishingEvent(); receiveFishingEvent.value = LocalizationMgr.GetFormatTextValue("UI_EventFishingDuelPanel_38", enemyModel.PlayerName); GContext.Publish(receiveFishingEvent); } break; //case FishingChangeState.StartFishing: // enemyModel.StartFishing(); // break; case FishingChangeState.FishingSuccess: FishInfoData data = selfModel.GetDuelFishingData(enemyModel.index, robotFishing.fishItemId, robotFishing.point, robotFishing.fishCardAdd, robotFishing.fishingRodAdd); gameOver = enemyModel.StopFishing(data); if (gameOver) { SetFishingOver(2); enemyChatModel.SendMessage((int)RobotDuelChatType.FirstLastFishSuccess); } else { enemyChatModel.SendMessage((int)RobotDuelChatType.FishingSuccess); } break; case FishingChangeState.FishingFail: gameOver = enemyModel.StopFishing(new FishInfoData()); if (gameOver) { SetFishingOver(2); } break; default: break; } } #region 聊天处理 public void SendQuickMessage(int id) { //本地转发 selfChatModel.SendMessage(id); //远端转发 if (!IsRobot) { //NetworkManager.Instance.SendQuickMessage(id); } } //接收对手消息 public void ReceiveQuickMessage(int id) { enemyChatModel.ReceiveMessage(id); } #endregion #region 网络接受对手操作 #endregion //往服务器传数据 public void SendDuelFishingData() { var solomain = eventSolomain; if (enemySolomain.RankTier < eventSolomain.RankTier) { solomain = enemySolomain; } List DuelFishingDatas = new List(); foreach (var data in selfModel.DuelFishingDatas) { if (data.fishItemId > 0) { DuelFishingData showData = new DuelFishingData { slienceTime = data.slienceTime, //castingTime = data.castingTime, fishingTime = data.fishingTime, isWin = data.isWin, fishItemId = data.fishItemId, point = data.point, failNum = data.failNum, fishCardAdd = data.fishCardAdd, fishRodAdd = data.fishRodAdd }; DuelFishingDatas.Add(showData); } } DuelFishingDataSave duelFishingDataSave = new DuelFishingDataSave { rankTier = solomain.RankTier, mapId = duelData.mapId, seed = seed, playerID = selfModel.PlayerID, setRodTime = selfModel.SetRodTime, playerName = selfModel.PlayerName, carLevels = selfModel.CarLevels, playerAvatar = selfModel.PlayerAvatar, rankScore = selfModel.RankScore, mag = selfModel.Mag, rodId = selfModel.RodId, rodLevel = selfModel.RodLevel, rodStar = selfModel.RodStar, selfDuelFishingDatas = DuelFishingDatas }; string json = JsonMapper.ToJson(duelFishingDataSave); Debug.Log("本局上传对战数据" + json); //NetworkManager.Instance.SendDuelFishingData(json); } } public class ReceiveFishingEvent { public string value; } //往服务器存褚操作数据 public class DuelFishingDataSave { public int rankTier { get; set; } public int mapId { get; set; } public int seed { get; set; } public string playerID { get; set; } public int setRodTime { get; set; } //设置鱼竿时间 public string playerName { get; set; } public List carLevels { get; set; } = new List(6); public string playerAvatar { get; set; } public int rankScore { get; set; } public int mag { get; set; } = 1; public int rodId { get; set; } public int rodLevel { get; set; } public int rodStar { get; set; } public List selfDuelFishingDatas { get; set; } }