using System.Collections.Generic; using vnxbqy.UI; using UnityEngine; using UnityEngine.Events; public class GA_NpcCollect : GA_NpcFunc { private bool m_CanCollect = true; private bool m_IsMainWinOpen = false; private int m_ReplaceNpcID = -1; private FairyCampType belongType = FairyCampType.None; int belongTypeEx = 0; //当前水晶归属阵营 protected override void OnPrefabLoadFinished(bool result, Object prefab) { if (m_ReplaceNpcID != -1) { var _npcConfig = NPCConfig.Get(m_ReplaceNpcID); if (prefab) { if (_npcConfig.NPCEffect != 0) { //npc出现特效需随着模型变化而变化 if (m_AppearEffect) { SFXPlayUtility.Instance.Release(m_AppearEffect); m_AppearEffect = null; } m_AppearEffect = SFXPlayUtility.Instance.PlayBattleEffect(_npcConfig.NPCEffect, this); } 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().CrystalBelongChangeEvent += CrystalBelongChangeEvent; // 获取归属 FairyCampType _type = (FairyCampType)ModelCenter.Instance.GetModel().fairyLeagueHelp.GetCrystalBelongCamp(npcID); int _offset = 0; if (_type == FairyCampType.Blue) { _offset = 8; } else if (_type == FairyCampType.Red) { _offset = 13; } npcID = npcID + _offset; belongType = _type; } } else if (ModelCenter.Instance.GetModel().GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID) == GeneralDefine.CrossBattleFieldMapID) { var crossModel = ModelCenter.Instance.GetModel(); crossModel.CrystalBelongChangeEvent += CrystalBelongChangeEventEx; // 获取归属 belongTypeEx = crossModel.GetCrystalFaction(npcID); npcID = crossModel.GetNewCrystalID(npcID, belongTypeEx); } 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(); _model.updateMissionEvent += UpdateMissionEvent; } CheckCanCollect(); m_IsMainWinOpen = WindowCenter.Instance.IsOpen(); 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 static bool xmlsCollectFinished = false; private void UpdateMissionEvent() { DungeonModel _model = ModelCenter.Instance.GetModel(); _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(); 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)) { PrepareHandler.Instance.Arrive(this); } else { PrepareHandler.Instance.Leave(this); } } } } protected override void OnTaskRefresh(int _nowNPCid, int _nPCLamp, Dictionary _dic) { base.OnTaskRefresh(_nowNPCid, _nPCLamp, _dic); CheckCanCollect(); } public override void OnClick() { if (!GeneralDefine.SpecialNpcIDs.Contains(NpcConfig.NPCID)// 不是特殊npc && !m_CanCollect) { return; } if (NpcConfig.NPCID == GeneralDefine.GatherSoulDZ) { return; } GA_Hero _hero = PlayerDatas.Instance.hero; if (_hero == null) { return; } _hero.LockTarget = this; _hero.SelectTarget = this; float _chkDistSqrt = MathUtility.DistanceSqrtXZ(_hero.Pos, Pos); // 这里判断是否要走向此对象 if (_chkDistSqrt > 4) { _hero.MoveToPosition(Pos, 1f); } PrepareHandler.Instance.TriggerOnShowCollect(ServerInstID, NpcConfig.NPCID); } protected override void HandleOnClick() { // if (NpcConfig.NPCID != GeneralDefine.GatherSoulDZ) // { // base.HandleOnClick(); // } } 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(); _model.updateMissionEvent -= UpdateMissionEvent; PrepareHandler.Instance.OnPrepareEndSuccess -= OnPrepareEndSuccess; if (PlayerDatas.Instance.baseData.MapID == 31220) { ModelCenter.Instance.GetModel().CrystalBelongChangeEvent -= CrystalBelongChangeEvent; } else if (_model.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID) == GeneralDefine.CrossBattleFieldMapID) { var crossModel = ModelCenter.Instance.GetModel(); crossModel.CrystalBelongChangeEvent -= CrystalBelongChangeEventEx; } PrepareHandler.Instance.Leave(this); GA_Hero _hero = PlayerDatas.Instance.hero; if (_hero != null) { if (_hero.SelectTarget != null && ServerInstID == _hero.SelectTarget.ServerInstID) { SelectionManager.Release(SelectionManager.E_Type.Green); _hero.SelectTarget = null; } if (_hero.LockTarget == this) { _hero.LockTarget = null; } } } public override bool CanBeSelected() { if (PlayerDatas.Instance.baseData.MapID == 31230) { return !xmlsCollectFinished; } return base.CanBeSelected(); } public override void OnSelect() { 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 { m_CanCollect = true; TaskModel _model = ModelCenter.Instance.GetModel(); if (!_model.IsGather(NpcConfig.NPCID)) { m_CanCollect = false; } } PrepareHandler.Instance.Leave(this); } public override void OnUnSelect() { base.OnUnSelect(); PrepareHandler.Instance.Leave(this); 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().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; } } private void CrystalBelongChangeEventEx() { // 获取归属 var crossModel = ModelCenter.Instance.GetModel(); var _type = crossModel.GetCrystalFaction(NpcConfig.NPCID); if (belongTypeEx != _type) { if (_type == 1) { SFXPlayUtility.Instance.PlayBattleEffect(3029, this); } else if (_type == 2) { SFXPlayUtility.Instance.PlayBattleEffect(3030, this); } var _npcID = m_ReplaceNpcID = crossModel.GetNewCrystalID(NpcConfig.NPCID, _type); var _npcConfig = NPCConfig.Get(_npcID); if (_npcConfig != null) { InstanceResourcesLoader.AsyncLoadNpc(_npcConfig.NPCID, OnPrefabLoadFinished); } belongTypeEx = _type; } } }