using System.Collections.Generic;
|
using Snxxz.UI;
|
|
using UnityEngine;
|
using UnityEngine.Events;
|
|
public class GA_NpcCollect : GA_NpcFunc
|
{
|
private static List<uint> m_ArrivedList = new List<uint>();
|
public static event UnityAction<uint, int> OnArrive;
|
public static event UnityAction<uint, int> OnLeave;
|
|
private bool m_CanCollect = true;
|
private bool m_IsMainWinOpen = false;
|
|
private int m_ReplaceNpcID = -1;
|
|
private FairyCampType belongType = FairyCampType.None;
|
|
protected override void OnPrefabLoadFinished(bool result, Object prefab)
|
{
|
if (m_ReplaceNpcID != -1)
|
{
|
var _npcConfig = NPCConfig.Get(m_ReplaceNpcID);
|
if (prefab)
|
{
|
if (!prefab.name.Contains(_npcConfig.MODE))
|
{
|
return;
|
}
|
}
|
}
|
|
if (m_Model)
|
{
|
if (m_LoadDefaultRes)
|
{
|
GameObjectPoolManager.Instance.ReleaseDefaultFuncNPC(m_Model);
|
}
|
else
|
{
|
bool _isReleased = false;
|
if (m_ReplaceNpcID != -1)
|
{
|
var _npcConfig = NPCConfig.Get(m_ReplaceNpcID);
|
if (m_Model.name.Contains(_npcConfig.MODE))
|
{
|
GameObject _toDestroy = InstanceResourcesLoader.LoadNpc(m_ReplaceNpcID);
|
if (_toDestroy)
|
{
|
GameObjectPoolManager.Instance.ReleaseGameObject(_toDestroy, m_Model);
|
_isReleased = true;
|
}
|
}
|
}
|
|
if (!_isReleased)
|
{
|
if (NpcConfig != null)
|
{
|
GameObject _toDestroy = InstanceResourcesLoader.LoadNpc(NpcConfig.NPCID);
|
if (_toDestroy)
|
{
|
GameObjectPoolManager.Instance.ReleaseGameObject(_toDestroy, m_Model);
|
}
|
}
|
else
|
{
|
Object.Destroy(m_Model);
|
}
|
}
|
}
|
|
m_Model = null;
|
m_Animator = null;
|
}
|
|
base.OnPrefabLoadFinished(result, prefab);
|
}
|
|
protected sealed override void HandleNpcConfig(int npcID)
|
{
|
if (npcID == 10404100)
|
{
|
if (PlayerDatas.Instance.baseData.Job == 2)
|
{
|
npcID = m_ReplaceNpcID = 10404101;
|
}
|
}
|
|
if (PlayerDatas.Instance.baseData.MapID == 31220)
|
{
|
if (npcID >= 30909001 && npcID <= 30909005)
|
{
|
ModelCenter.Instance.GetModel<FairyLeagueModel>().CrystalBelongChangeEvent += CrystalBelongChangeEvent;
|
|
// 获取归属
|
FairyCampType _type = (FairyCampType)ModelCenter.Instance.GetModel<FairyLeagueModel>().fairyLeagueHelp.GetCrystalBelongCamp(npcID);
|
int _offset = 0;
|
if (_type == FairyCampType.Blue)
|
{
|
_offset = 8;
|
}
|
else if (_type == FairyCampType.Red)
|
{
|
_offset = 13;
|
}
|
npcID = npcID + _offset;
|
|
belongType = _type;
|
}
|
}
|
|
NpcConfig = NPCConfig.Get(npcID);
|
}
|
|
public sealed override void RequestName()
|
{
|
base.RequestName();
|
|
var npcId = this.NpcConfig.NPCID;
|
if (npcId == 10404100)
|
{
|
if (PlayerDatas.Instance.baseData.Job == 2)
|
{
|
npcId = 10404101;
|
}
|
|
m_HeadUpName.SetNPCName(npcId);
|
}
|
else
|
{
|
if (m_ReplaceNpcID != -1)
|
{
|
m_HeadUpName.SetNPCName(m_ReplaceNpcID);
|
}
|
}
|
}
|
|
protected override void OnInit(GameNetPackBasic package)
|
{
|
base.OnInit(package);
|
|
NpcConfig = NPCConfig.Get((int)m_H0406.NPCID);
|
|
if (PlayerDatas.Instance.baseData.MapID == 31230)
|
{
|
DungeonModel _model = ModelCenter.Instance.GetModel<DungeonModel>();
|
_model.updateMissionEvent += UpdateMissionEvent;
|
}
|
|
CheckCanCollect();
|
|
m_IsMainWinOpen = WindowCenter.Instance.IsOpen<MainInterfaceWin>();
|
|
WindowCenter.Instance.windowAfterOpenEvent += CheckOpenCollectIcon;
|
WindowCenter.Instance.windowAfterCloseEvent += AfterCloseMainWin;
|
|
if (GeneralDefine.NpcPosOffset.ContainsKey(NpcConfig.NPCID))
|
{
|
Pos = GeneralDefine.NpcPosOffset[NpcConfig.NPCID];
|
//Debug.Log("矫正位置: " + Pos);
|
}
|
|
// 执行挖洞逻辑
|
if (NpcConfig.Dig == 1)
|
{
|
m_Dig = SoMap.CreateImpasse.GeneralCircle(Pos, NpcConfig.ModelRadius);
|
}
|
|
}
|
|
private void AfterCloseMainWin(Window obj)
|
{
|
if (obj is MainInterfaceWin)
|
{
|
m_IsMainWinOpen = false;
|
Leave();
|
}
|
}
|
|
private void CheckOpenCollectIcon(Window obj)
|
{
|
if (!m_CanCollect)
|
{
|
return;
|
}
|
|
if (obj is MainInterfaceWin)
|
{
|
m_IsMainWinOpen = true;
|
|
if (NpcConfig.NPCID != GeneralDefine.GatherSoulDZ)
|
{
|
GA_Hero _hero = PlayerDatas.Instance.hero;
|
|
if (_hero != null)
|
{
|
float _distSqrt = MathUtility.DistanceSqrtXZ(_hero.Pos, Pos);
|
|
if (_distSqrt < Mathf.Pow(NpcConfig.ModelRadius + 0.4f + GeneralDefine.CloseNpcDist, 2))
|
{
|
Arrive();
|
}
|
}
|
}
|
}
|
}
|
|
private static bool xmlsCollectFinished = false;
|
private void UpdateMissionEvent()
|
{
|
DungeonModel _model = ModelCenter.Instance.GetModel<DungeonModel>();
|
_model.updateMissionEvent -= UpdateMissionEvent;
|
if (_model.mission.hasCollect == 0)
|
{
|
PrepareHandler.Instance.OnPrepareEndSuccess += OnPrepareEndSuccess;
|
}
|
else
|
{
|
xmlsCollectFinished = true;
|
}
|
|
CheckCanCollect();
|
}
|
|
protected void OnPrepareEndSuccess()
|
{
|
PrepareHandler.Instance.OnPrepareEndSuccess -= OnPrepareEndSuccess;
|
xmlsCollectFinished = true;
|
CheckCanCollect();
|
}
|
|
protected override void OnFixedUpdate()
|
{
|
base.OnFixedUpdate();
|
|
if (!m_IsMainWinOpen)
|
{
|
m_IsMainWinOpen = WindowCenter.Instance.IsOpen<MainInterfaceWin>();
|
return;
|
}
|
|
if (!m_CanCollect)
|
{
|
return;
|
}
|
|
if (NpcConfig.NPCID != GeneralDefine.GatherSoulDZ)
|
{
|
GA_Hero _hero = PlayerDatas.Instance.hero;
|
|
if (_hero != null)
|
{
|
float _distSqrt = MathUtility.DistanceSqrtXZ(_hero.Pos, Pos);
|
|
if (_distSqrt < Mathf.Pow(NpcConfig.ModelRadius + 0.4f + GeneralDefine.CloseNpcDist, 2))
|
{
|
Arrive();
|
}
|
else
|
{
|
if (m_ArrivedList.Contains(ServerInstID))
|
{
|
if (OnLeave != null)
|
{
|
OnLeave(ServerInstID, NpcConfig.NPCID);
|
}
|
m_ArrivedList.Remove(ServerInstID);
|
}
|
}
|
}
|
}
|
}
|
|
protected override void OnTaskRefresh(int _nowNPCid, int _nPCLamp, Dictionary<int, int> _dic)
|
{
|
base.OnTaskRefresh(_nowNPCid, _nPCLamp, _dic);
|
|
CheckCanCollect();
|
}
|
|
public override void OnClick()
|
{
|
base.OnClick();
|
|
if (!GeneralDefine.SpecialNpcIDs.Contains(NpcConfig.NPCID)// 不是特殊npc
|
&& !m_CanCollect)
|
{
|
return;
|
}
|
|
if (NpcConfig.NPCID == GeneralDefine.GatherSoulDZ)
|
{
|
return;
|
}
|
|
if (!m_ArrivedList.Contains(ServerInstID))
|
{
|
if (OnArrive != null)
|
{
|
OnArrive(ServerInstID, NpcConfig.NPCID);
|
}
|
m_ArrivedList.Add(ServerInstID);
|
}
|
}
|
|
protected override void HandleOnClick()
|
{
|
if (NpcConfig.NPCID != GeneralDefine.GatherSoulDZ)
|
{
|
base.HandleOnClick();
|
}
|
else
|
{
|
var _hero = PlayerDatas.Instance.hero;
|
|
if (_hero != null)
|
{
|
float _distSqrt = MathUtility.DistanceSqrtXZ(_hero.Pos, Pos);
|
|
if (_distSqrt < Mathf.Pow(NpcConfig.ModelRadius + 0.4f + GeneralDefine.CloseNpcDist, 2))
|
{
|
Arrive();
|
}
|
}
|
}
|
}
|
|
protected override void OnUnit()
|
{
|
if (m_ReplaceNpcID != -1)
|
{
|
if (m_LoadDefaultRes)
|
{
|
GameObjectPoolManager.Instance.ReleaseDefaultFuncNPC(m_Model);
|
}
|
else
|
{
|
GameObject _prefab = InstanceResourcesLoader.LoadNpc(m_ReplaceNpcID);
|
GameObjectPoolManager.Instance.ReleaseGameObject(_prefab, m_Model);
|
}
|
|
m_Model = null;
|
m_ReplaceNpcID = -1;
|
}
|
|
base.OnUnit();
|
|
DungeonModel _model = ModelCenter.Instance.GetModel<DungeonModel>();
|
_model.updateMissionEvent -= UpdateMissionEvent;
|
PrepareHandler.Instance.OnPrepareEndSuccess -= OnPrepareEndSuccess;
|
|
if (PlayerDatas.Instance.baseData.MapID == 31220)
|
{
|
ModelCenter.Instance.GetModel<FairyLeagueModel>().CrystalBelongChangeEvent -= CrystalBelongChangeEvent;
|
}
|
|
if (m_ArrivedList.Contains(ServerInstID))
|
{
|
if (OnLeave != null)
|
{
|
OnLeave(ServerInstID, NpcConfig.NPCID);
|
}
|
m_ArrivedList.Remove(ServerInstID);
|
}
|
|
WindowCenter.Instance.windowAfterOpenEvent -= CheckOpenCollectIcon;
|
WindowCenter.Instance.windowAfterCloseEvent -= AfterCloseMainWin;
|
}
|
|
public override bool CanBeSelected()
|
{
|
if (PlayerDatas.Instance.baseData.MapID == 31230)
|
{
|
return !xmlsCollectFinished;
|
}
|
|
return base.CanBeSelected();
|
}
|
|
public override void OnSelect()
|
{
|
if (NpcConfig.NPCID == GeneralDefine.GatherSoulDZ)
|
{
|
var _model = ModelCenter.Instance.GetModel<GatherSoulDungeonModel>();
|
|
if (_model.GetAttackDefendSurplusCount() != 0
|
|| _model.GetIceDefendSurplusCount() != 0)
|
{
|
SelectionManager.RequestJH(this);
|
}
|
}
|
else
|
{
|
if (NpcConfig.NPCID != 10204200)
|
{
|
SelectionManager.Request(SelectionManager.E_Type.Green, this, NpcConfig.ModelRadius * 2);
|
}
|
|
GA_Hero _hero = PlayerDatas.Instance.hero;
|
Vector3 _forward = MathUtility.ForwardXZ(Pos, _hero.Pos);
|
|
_hero.Forward = _forward;
|
|
if (NpcConfig.AutomaticFace == 1)
|
{
|
_forward = MathUtility.ForwardXZ(_hero.Pos, Pos);
|
Forward = _forward;
|
}
|
}
|
}
|
|
private void CheckCanCollect()
|
{
|
if (PlayerDatas.Instance.baseData.MapID == 31230)
|
{
|
FuncConfigConfig _funcConfig = FuncConfigConfig.Get("FamilyPartyDeskNpcID");
|
m_CanCollect = int.Parse(_funcConfig.Numerical1) == NpcConfig.NPCID && !xmlsCollectFinished;
|
}
|
else
|
{
|
if (NpcConfig.NPCID == GeneralDefine.GatherSoulDZ)
|
{
|
m_CanCollect = true;
|
}
|
else
|
{
|
PlayerTaskDatas _model = ModelCenter.Instance.GetModel<PlayerTaskDatas>();
|
m_CanCollect = _model.IsGather(NpcConfig.NPCID);
|
}
|
}
|
|
if (!m_CanCollect)
|
{
|
if (m_ArrivedList.Contains(ServerInstID))
|
{
|
if (OnLeave != null)
|
{
|
OnLeave(ServerInstID, NpcConfig.NPCID);
|
}
|
m_ArrivedList.Remove(ServerInstID);
|
}
|
}
|
}
|
|
public override void OnUnSelect()
|
{
|
base.OnUnSelect();
|
if (m_ArrivedList.Contains(ServerInstID))
|
{
|
if (OnLeave != null)
|
{
|
OnLeave(ServerInstID, NpcConfig.NPCID);
|
}
|
m_ArrivedList.Remove(ServerInstID);
|
}
|
|
if (NpcConfig.NPCID == GeneralDefine.GatherSoulDZ)
|
{
|
SelectionManager.ReleaseJH();
|
}
|
}
|
|
public sealed override void RequestShadow()
|
{
|
if (NpcConfig.NPCID == 10204200
|
|| NpcConfig.NPCID == GeneralDefine.GatherSoulDZ)
|
{
|
return;
|
}
|
|
base.RequestShadow();
|
}
|
|
private void CrystalBelongChangeEvent()
|
{
|
// 获取归属
|
FairyCampType _type = (FairyCampType)ModelCenter.Instance.GetModel<FairyLeagueModel>().fairyLeagueHelp.GetCrystalBelongCamp(NpcConfig.NPCID);
|
int _offset = 0;
|
|
if (belongType != _type)
|
{
|
if (_type == FairyCampType.Blue)
|
{
|
SFXPlayUtility.Instance.PlayBattleEffect(3029, this);
|
_offset = 8;
|
}
|
else if (_type == FairyCampType.Red)
|
{
|
SFXPlayUtility.Instance.PlayBattleEffect(3030, this);
|
_offset = 13;
|
}
|
|
var _npcID = m_ReplaceNpcID = NpcConfig.NPCID + _offset;
|
var _npcConfig = NPCConfig.Get(_npcID);
|
if (_npcConfig != null)
|
{
|
InstanceResourcesLoader.AsyncLoadNpc(_npcConfig.NPCID, OnPrefabLoadFinished);
|
}
|
|
belongType = _type;
|
}
|
}
|
|
public void Arrive()
|
{
|
if (!m_CanCollect)
|
{
|
return;
|
}
|
|
if (!m_ArrivedList.Contains(ServerInstID))
|
{
|
if (OnArrive != null)
|
{
|
OnArrive(ServerInstID, NpcConfig.NPCID);
|
}
|
m_ArrivedList.Add(ServerInstID);
|
}
|
}
|
|
public void Leave()
|
{
|
if (m_ArrivedList.Contains(ServerInstID))
|
{
|
if (OnLeave != null)
|
{
|
OnLeave(ServerInstID, NpcConfig.NPCID);
|
}
|
m_ArrivedList.Remove(ServerInstID);
|
}
|
}
|
}
|