using UnityEngine; using vnxbqy.UI; using System.Collections.Generic; using UnityEngine.Events; using System; public class PrepareHandler : Singleton { public struct ClientH0812 { public uint PlayerID; // 玩家id public byte PrepareState; //准备类型, TPreparingState public float MaxTime; //最大时间 public int PrepareID; //准备ID, 如果是技能, 则是技能ID } public ClientH0812 clientPrepareH0812; public H0812_tagBeginPrepare H0812 { get; private set; } public bool isPreparing = false; public enum E_PrepareType { pstDig = 1, // 挖宝 pstHorse,// 上马中 pstSkill,// 开始释放技能 根据字段CastTime pstTruck,// 开始拉镖 pstCollecting, // 访问采集NPC pstCatching,// 捕捉各类东西 pstTownPortal,// 回城 pstMissionCollecting,// 任务采集 pstCatchPet,// 捕捉宠物 //后续IL开发添加预设 default1, default2, default3, default4, default5, default6, default7, default8, default9, default10, pstMax, } public List m_ArriveList = new List(); public UnityAction OnShowCollectIcon; public UnityAction OnHideCollectIcon; public void TriggerOnShowCollect(uint sid, int npcId) { if (OnShowCollectIcon != null) { OnShowCollectIcon(sid, npcId); } } public void Init() { WindowCenter.Instance.windowAfterOpenEvent -= CheckOpenCollectIcon; WindowCenter.Instance.windowAfterOpenEvent += CheckOpenCollectIcon; WindowCenter.Instance.windowAfterCloseEvent -= CheckCloseCollectIcon; WindowCenter.Instance.windowAfterCloseEvent += CheckCloseCollectIcon; } private void CheckCloseCollectIcon(Window obj) { if (obj is MainInterfaceWin) { if (OnHideCollectIcon != null) { OnHideCollectIcon(0, 0); } } } private void CheckOpenCollectIcon(Window obj) { GA_Hero _hero = PlayerDatas.Instance.hero; if (_hero == null) { return; } if (obj is MainInterfaceWin) { if (m_ArriveList.Count > 0) { if (OnShowCollectIcon != null) { var _collect = _hero.SelectTarget as GA_NpcCollect; if (_collect == null) { _collect = m_ArriveList[0]; } OnShowCollectIcon(_collect.ServerInstID, _collect.NpcConfig.NPCID); } } } } public void HandleCallback(E_NpcType type, int npcID, uint sid) { var _hero = PlayerDatas.Instance.hero; if (_hero != null) { var _npc = _hero.SelectTarget as GA_NpcCollect; var _checkDis = 0f; if (_npc == null || !(_npc is GA_NpcCollect)) { var _list = GAMgr.Instance.GetTypeList(E_ActorClassType.NpcCollect); if (_list != null) { _list.Sort((a1, a2) => { var _d1 = MathUtility.DistanceSqrtXZ(a1.Pos, _hero.Pos); var _d2 = MathUtility.DistanceSqrtXZ(a2.Pos, _hero.Pos); if (_d1 > _d2) { return 1; } else if (_d1 < _d2) { return -1; } return 0; }); foreach (var _a in _list) { if (!(_a is GA_NpcCollect)) { continue; } _npc = _a as GA_NpcCollect; break; } } } if (_npc != null) { if (_hero.SelectTarget == null || !(_npc is GA_NpcCollect)) { _hero.SelectTarget = _npc; } if (OnShowCollectIcon != null) { OnShowCollectIcon(_npc.ServerInstID, _npc.NpcConfig.NPCID); } _checkDis = MathUtility.DistanceSqrtXZ(_hero.Pos, _npc.Pos); if (_checkDis < Math.Pow(_npc.NpcConfig.ModelRadius + 0.4f + GeneralDefine.CloseNpcDist, 2)) { NPCInteractProcessor.InvokeEvent(E_NpcType.Collect, _npc.NpcConfig.NPCID, _npc.ServerInstID); var _dir = MathUtility.ForwardXZ(_npc.Pos, _hero.Pos); _hero.Forward = _dir; } else { _hero.MoveToPosition(_npc.Pos, 2f); } } } } public void Arrive(GA_NpcCollect npc) { if (!m_ArriveList.Contains(npc)) { if (m_ArriveList.Count == 0) { if (OnShowCollectIcon != null) { OnShowCollectIcon(npc.ServerInstID, npc.NpcConfig.NPCID); } } m_ArriveList.Add(npc); } } public void Leave(GA_NpcCollect npc) { if (m_ArriveList.Contains(npc)) { m_ArriveList.Remove(npc); if (m_ArriveList.Count == 0) { if (OnHideCollectIcon != null) { OnHideCollectIcon(npc.ServerInstID, npc.NpcConfig.NPCID); } } } } public void ServerPrepareStart(H0812_tagBeginPrepare h0812) { // 做一些清理或者重置工作 if (H0812 != null) { Debug.LogWarningFormat("进度条处理: {0} 似乎没有结束.", (E_PrepareType)H0812.PrepareState); } H0812 = h0812; isPreparing = true; GActorPlayerBase _player = null; GActorFight _fighter = null; switch ((E_PrepareType)H0812.PrepareState) { case E_PrepareType.pstDig: break; case E_PrepareType.pstHorse: break; case E_PrepareType.pstSkill: _fighter = GAMgr.Instance.GetBySID(H0812.PlayerID) as GActorFight; if (H0812.PlayerID == PlayerDatas.Instance.PlayerId) { clientPrepareH0812 = new ClientH0812(); clientPrepareH0812.PlayerID = PlayerDatas.Instance.PlayerId; clientPrepareH0812.MaxTime = H0812.MaxTime * Constants.F_GAMMA; clientPrepareH0812.PrepareState = (byte)E_PrepareType.pstSkill; clientPrepareH0812.PrepareID = (int)H0812.PrepareID; WindowCenter.Instance.Open(); } else { Skill _skill = _fighter.SkillMgr.Get((int)H0812.PrepareID); _fighter.SkillMgr.CastSkill(_fighter.ServerInstID, _skill.id); _skill.SkillPreparing = true; _fighter.NextAction = 200; _fighter.SkillMgr.DoingPrepareSkill = true; } if (_fighter != null) { _fighter.SkillMgr.Get((int)H0812.PrepareID).SSkillPrepareStatus = Skill.E_SkillPrepareStatus.Begin; } break; case E_PrepareType.pstTruck: break; case E_PrepareType.pstCollecting: if (H0812.PlayerID == PlayerDatas.Instance.PlayerId) { WindowCenter.Instance.CloseImmediately("NormalCollectWin"); NormalCollectWin.s_CollectInfo = new ClientH0812() { PlayerID = PlayerDatas.Instance.PlayerId, PrepareState = (byte)E_PrepareType.pstMissionCollecting, MaxTime = H0812.MaxTime, PrepareID = (int)H0812.PrepareID, }; WindowCenter.Instance.Open(); } _player = GAMgr.Instance.GetBySID(H0812.PlayerID) as GActorPlayerBase; if (_player != null) { _player.Collect(); } if (H0812.PlayerID == PlayerDatas.Instance.PlayerId) { if (PlayerDatas.Instance.hero != null) { PlayerDatas.Instance.hero.Behaviour.StopHandupAI(true); } } break; case E_PrepareType.pstCatching: break; case E_PrepareType.pstTownPortal: break; case E_PrepareType.pstMissionCollecting: if (H0812.PlayerID == PlayerDatas.Instance.PlayerId) { WindowCenter.Instance.CloseImmediately("NormalCollectWin"); NormalCollectWin.s_CollectInfo = new ClientH0812() { PlayerID = PlayerDatas.Instance.PlayerId, PrepareState = (byte)E_PrepareType.pstMissionCollecting, MaxTime = H0812.MaxTime, PrepareID = (int)H0812.PrepareID, }; WindowCenter.Instance.Open(); } _player = GAMgr.Instance.GetBySID(H0812.PlayerID) as GActorPlayerBase; if (_player != null) { if (_player.MovingState != E_MovingState.Ride) { _player.Collect(); } } if (H0812.PlayerID == PlayerDatas.Instance.PlayerId) { if (PlayerDatas.Instance.hero != null) { PlayerDatas.Instance.hero.Behaviour.StopHandupAI(true); } } break; case E_PrepareType.pstCatchPet: break; } } public UnityEngine.Events.UnityAction OnPrepareEndSuccess; public UnityEngine.Events.UnityAction OnPrepareEnd; public void ServerPrepareEnd(H0813_tagPrepareEnd h0813) { isPreparing = false; if (H0812 == null) { Debug.Log("服务端拉进度条结束,H0812 是空的"); return; } WindowCenter.Instance.Close(); if (h0813.PlayerID == PlayerDatas.Instance.baseData.PlayerID) { WindowCenter.Instance.Close(); } GActorPlayerBase _player = null; if (h0813.Type == 0) { // 正常结束 switch ((E_PrepareType)H0812.PrepareState) { case E_PrepareType.pstDig: break; case E_PrepareType.pstHorse: break; case E_PrepareType.pstSkill: HandlerSkillPrepareEnd(h0813); break; case E_PrepareType.pstTruck: break; case E_PrepareType.pstCollecting: _player = GAMgr.Instance.GetBySID(h0813.PlayerID) as GActorPlayerBase; if (_player != null) { if (_player.IsCollect()) { _player.IdleImmediate(); } } break; case E_PrepareType.pstCatching: break; case E_PrepareType.pstTownPortal: break; case E_PrepareType.pstMissionCollecting: _player = GAMgr.Instance.GetBySID(h0813.PlayerID) as GActorPlayerBase; if (_player != null) { _player.IdleImmediate(); } break; case E_PrepareType.pstCatchPet: break; } if (OnPrepareEndSuccess != null) { OnPrepareEndSuccess(); } } else { // 异常结束 switch ((E_PrepareType)h0813.Type) { case E_PrepareType.pstDig: break; case E_PrepareType.pstHorse: break; case E_PrepareType.pstSkill: HandlerSkillPrepareException(h0813); break; case E_PrepareType.pstTruck: break; case E_PrepareType.pstCollecting: _player = GAMgr.Instance.GetBySID(h0813.PlayerID) as GActorPlayerBase; if (_player != null) { if (_player.IsCollect()) { _player.IdleImmediate(); } } break; case E_PrepareType.pstCatching: break; case E_PrepareType.pstTownPortal: break; case E_PrepareType.pstMissionCollecting: _player = GAMgr.Instance.GetBySID(h0813.PlayerID) as GActorPlayerBase; if (_player != null) { if (_player.IsCollect()) { _player.IdleImmediate(); } } break; case E_PrepareType.pstCatchPet: break; } //Debug.LogFormat("收到进度条结束异常情况: {0}", (E_PrepareType)h0813.Type); } if (OnPrepareEnd != null) { OnPrepareEnd((int)h0813.PlayerID, h0813.Type); } H0812 = null; } private void HandlerSkillPrepareEnd(H0813_tagPrepareEnd h0813) { GActorFight _actor = GAMgr.Instance.GetBySID(h0813.PlayerID) as GActorFight; if (_actor == null) { Debug.Log("服务端拉进度条结束 => 找不到角色"); return; } if (_actor != null) { Skill _skill = _actor.SkillMgr.Get((int)H0812.PrepareID); if (_skill != null) { _skill.DoPreparingEnd(h0813.PlayerID); } } } private void HandlerSkillPrepareException(H0813_tagPrepareEnd h0813) { GActorFight _actor = GAMgr.Instance.GetBySID(h0813.PlayerID) as GActorFight; if (_actor == null) { Debug.Log("服务端拉进度条异常 => 找不到角色"); return; } if (_actor != null) { Skill _skill = _actor.SkillMgr.Get((int)H0812.PrepareID); if (_skill != null) { _skill.DoPreparingFail(h0813.PlayerID); } } } }