using UnityEngine;
|
using vnxbqy.UI;
|
using System.Collections.Generic;
|
using UnityEngine.Events;
|
using System;
|
|
|
public class PrepareHandler : Singleton<PrepareHandler>
|
|
{
|
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<GA_NpcCollect> m_ArriveList = new List<GA_NpcCollect>();
|
public UnityAction<uint, int> OnShowCollectIcon;
|
public UnityAction<uint, int> 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<PrepareWin>();
|
}
|
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<NormalCollectWin>();
|
}
|
|
_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<NormalCollectWin>();
|
}
|
|
_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<int, int> OnPrepareEnd;
|
|
public void ServerPrepareEnd(H0813_tagPrepareEnd h0813)
|
{
|
isPreparing = false;
|
|
if (H0812 == null)
|
{
|
Debug.Log("服务端拉进度条结束,H0812 是空的");
|
return;
|
}
|
|
WindowCenter.Instance.Close<PrepareWin>();
|
|
if (h0813.PlayerID == PlayerDatas.Instance.baseData.PlayerID)
|
{
|
WindowCenter.Instance.Close<NormalCollectWin>();
|
}
|
|
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);
|
}
|
}
|
}
|
|
}
|