using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using System; namespace vnxbqy.UI { public class BossShowModel : Singleton { public BossShowModel() { BossShowing = false; showTargetList = new List(); TimeMgr.Instance.OnSyntonyEvent += OnSyntonyEvent; StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish; } GameObject bossShowCam; private ActorShowConfig actorShowModel; TaskModel m_TaskModel; TaskModel taskmodel { get { return m_TaskModel ?? (m_TaskModel = ModelCenter.Instance.GetModel()); } } public int NpcID { get; private set; } public int reqDungeonLineId = -1; public List showTargetList { get; private set; } public bool BossShowing { get; private set; } public Camera showCamera { get; private set; } public ShowActor showHero { get; private set; } public List showNpcs = new List(); public bool satisfyStep { get; private set; } private bool serverNotify = false; private int cacheMapId = 0; private Int3 taskInfo = Int3.zero; private const string BOSS_SHOW_KEY = "BossShow"; public event Action bossShowPreparedEvent; public event Action bossShowCompletedEvent; public void StartBossShow(int npcId) { if (!ActorShowConfig.GetActorShowModel(PlayerDatas.Instance.baseData.MapID, npcId, out actorShowModel)) { return; } Start(PlayerDatas.Instance.baseData.MapID, npcId); } public void Start(int mapId, int npcId) { try { reqDungeonLineId = -1; if (!ActorShowConfig.GetActorShowModel(mapId, npcId, out actorShowModel)) { return; } satisfyStep = SatisfyBossShowStep(actorShowModel); SaveBossShowStep(actorShowModel); //if (actorShowModel.BindMissionID != 0) //{ // MissionDetailDates missionDetailDates = null; // taskmodel.allMissionDict.TryGetValue(actorShowModel.BindMissionID, out missionDetailDates); // if (missionDetailDates == null || missionDetailDates.MissionState != 1) // { // return; // } // if (GetMisstionShow(actorShowModel.BindMissionID)) // { // return; // } // SetMisstionShow(actorShowModel.BindMissionID); //} if (BossShowing && StageLoad.Instance.currentStage is DungeonStage) { return; } BossShowing = true; NpcID = npcId; if (actorShowModel.type != 3) { ActiveBossModel(true); } ActiveBossShowCam(true); CameraController.Instance.CameraObject.enabled = false; if (WindowCenter.Instance.IsOpen()) { WindowJumpMgr.Instance.ClearJumpData(); WindowCenter.Instance.Close(); WindowCenter.Instance.Close(); WindowCenter.Instance.Open(); } ActiveUI(false); var _hero = PlayerDatas.Instance.hero; if (_hero != null && !_hero.ActorInfo.serverDie) { _hero.Behaviour.StopHandupAI(true); } TimeMgr.Instance.Register(TimeMgr.SyntonyType.BossShow, (float)actorShowModel.length / 1000); if (actorShowModel.showNameTime > 0) { TimeMgr.Instance.Register(TimeMgr.SyntonyType.BossShowName, (float)actorShowModel.showNameTime / 1000); } if (actorShowModel.Dialogue > 0 && actorShowModel.DialogueTime > 0) { TimeMgr.Instance.Register(TimeMgr.SyntonyType.BossShowDialogue, (float)actorShowModel.DialogueTime / 1000); } if (actorShowModel.soundId > 0) { if (actorShowModel.soundTime == 0) { PlaySound(actorShowModel.soundId); } else { TimeMgr.Instance.Register(TimeMgr.SyntonyType.BossShowSound, (float)actorShowModel.soundTime / 1000); } } if (bossShowPreparedEvent != null) { bossShowPreparedEvent(); } } catch (Exception e) { BossShowing = false; Debug.LogError(e.Message + e.StackTrace); } } public void StartBossShow(int mapId, int lineId) { if (BossShowing) { return; } var configs = ActorShowConfig.GetValues(); ActorShowConfig _showModel = null; foreach (var config in configs) { if (config.MapID == mapId && config.line == lineId) { _showModel = config; break; } } if (_showModel != null) { SnxxzGame.Instance.StartCoroutine(Co_StartBossShow(_showModel)); } } public void StopBossShow() { if (!BossShowing) { return; } BossShowing = false; SoundPlayer.Instance.StopUIAudio(); SoundPlayer.Instance.musicAudioSource.mute = false; ActiveBossShowCam(false); if (NpcID != 0) { ActiveBossModel(false); } ActiveDialogue(false); CameraController.Instance.CameraObject.enabled = true; ActiveUI(true); if (serverNotify) { CA223_tagCMNPCShowEnd pak = new CA223_tagCMNPCShowEnd(); pak.EndType = 0; pak.NPCID = (uint)NpcID; GameNetSystem.Instance.SendInfo(pak); } var _handleFight = true; if (ActorShowConfig.GetActorShowModel(PlayerDatas.Instance.baseData.MapID, NpcID, out actorShowModel)) { if (actorShowModel.type == 3 || actorShowModel.type == 2) { _handleFight = false; CB104_tagCMClientStartFB _pak = new CB104_tagCMClientStartFB(); GameNetSystem.Instance.SendInfo(_pak); } if (actorShowModel.type == 3) { SendGuideComplete((DungeonShowType)actorShowModel.NpcID); } if (actorShowModel.BindMissionID.x != 0) { taskmodel.AutomaticTripToTask(taskmodel.currentMission); } } var _hero = PlayerDatas.Instance.hero; if (_handleFight && _hero != null && !_hero.ActorInfo.serverDie) { bool _needStart = false; int _dgDataID = ModelCenter.Instance.GetModel().GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID); var dungeonOpen = DungeonOpenTimeConfig.Get(_dgDataID); if (dungeonOpen != null) { if (dungeonOpen.DoFight == 1) { _needStart = true; } } else { if (!ClientSceneManager.Instance.IsClientFightMode) { _needStart = true; } } if (_needStart) { _hero.Behaviour.StartHandupAI(); } } TimeMgr.Instance.UnRegister(TimeMgr.SyntonyType.BossShow); TimeMgr.Instance.UnRegister(TimeMgr.SyntonyType.BossShowName); TimeMgr.Instance.UnRegister(TimeMgr.SyntonyType.BossShowDialogue); TimeMgr.Instance.UnRegister(TimeMgr.SyntonyType.BossShowSound); if (bossShowCompletedEvent != null) { bossShowCompletedEvent(); } } private void OnSyntonyEvent(TimeMgr.SyntonyType type) { if (type == TimeMgr.SyntonyType.BossShow) { StopBossShow(); } else if (type == TimeMgr.SyntonyType.BossShowName) { ActiveBossName(); } else if (type == TimeMgr.SyntonyType.BossShowDialogue) { ActiveDialogue(true); } else if (type == TimeMgr.SyntonyType.BossShowSound) { if (actorShowModel != null) { PlaySound(actorShowModel.soundId); } } } private void PlaySound(int _soundId) { SoundPlayer.Instance.musicAudioSource.mute = true; SoundPlayer.Instance.PlayUIAudio(_soundId); } private void ActiveBossShowCam(bool _active) { var prefab = UILoader.LoadBossShow(actorShowModel.cam); if (_active && (actorShowModel.type == 3 || showTargetList.Count > 0)) { bossShowCam = UnityEngine.Object.Instantiate(prefab); RaycastHit _hit; var _pos = actorShowModel.type == 3 ? new Vector3((float)actorShowModel.PosX[0] / 200, 0, actorShowModel.PosY[0] / 200) : showTargetList[0].m_Model.transform.position; var _origin = _pos; if (actorShowModel.Height.Length > 1) { _origin.x = (float)actorShowModel.Height[0] / 200; _origin.y = 0; _origin.z = (float)actorShowModel.Height[1] / 200; } _origin.y = 100f; Ray _ray = new Ray(_origin, Vector3.down); float height = 0; if (Physics.Raycast(_ray, out _hit, 100f, LayerUtility.WalkbleMask)) { height = _hit.point.y; } showCamera = GetBossShowCam(bossShowCam.transform); bossShowCam.transform.position = actorShowModel.type == 3 ? _pos.SetY(height) : showTargetList[0].m_Model.transform.position.SetY(height); if (actorShowModel != null) { bossShowCam.transform.rotation = MathUtility.GetClientRotationFromAngle(actorShowModel.NpcFace[0]); } else { bossShowCam.transform.rotation = showTargetList[0].m_Model.transform.rotation; } bossShowCam.SetActive(true); } else { if (bossShowCam != null) { bossShowCam.SetActive(false); UnityEngine.Object.Destroy(bossShowCam); } } } public void ActiveBossModel(bool _active) { if (!_active) { if (showTargetList.Count > 0) { for (int i = 0; i < showTargetList.Count; i++) { if (showTargetList[i].npcId == 1) { showTargetList[i].Destroy(); continue; } List list = GetShowActor(showTargetList[i].npcId); if (list == null) { list = new List(); showActorDic.Add(showTargetList[i].npcId, list); } showTargetList[i].Disappear(); list.Add(showTargetList[i]); } } showTargetList.Clear(); showHero = null; showNpcs.Clear(); } else { showHero = null; showNpcs.Clear(); showTargetList.Clear(); for (int i = 0; i < actorShowModel.NpcFace.Length; i++) { List list = GetShowActor(actorShowModel.showNpcs[i]); ShowActor showActor = null; if (list != null && list.Count > 0) { showActor = list[0]; list.RemoveAt(0); } if (showActor == null) { var _instanceid = GetInstanceId(); showActor = new ShowActor(actorShowModel.showNpcs[i], i, _instanceid, actorShowModel); m_ShowActorInstanceDict.Add(_instanceid, showActor); if (actorShowModel.showNpcs[i] == 1 && i < actorShowModel.showName.Length && actorShowModel.showName[i] == 1) { showHero = showActor; } } else { showActor.Appear(i, actorShowModel); } if (actorShowModel.showNpcs[i] != 1 && i < actorShowModel.showName.Length && actorShowModel.showName[i] == 1) { showNpcs.Add(showActor); } showTargetList.Add(showActor); } } } private void ActiveUI(bool _active) { UIRoot uiRoot = WindowCenter.Instance.uiRoot; uiRoot.EnableCanvas(_active, uiRoot.baseCanvas, uiRoot.lifeBarCanvas, uiRoot.nameCanvas, uiRoot.normalCanvas, uiRoot.modalCanvas, uiRoot.tipsCanvas, uiRoot.systemCanvas, uiRoot.recycleBin, uiRoot.fightCanvasGroup.damageNumGroups[0].parent); if (!_active) { CameraUtility.RemoveCullingMask(CameraManager.uiCamera, LayerUtility.UIEffectLayer); if (!WindowCenter.Instance.IsOpen()) { BossShowWin.bossShowId = actorShowModel.ID; WindowCenter.Instance.Open(); } } else { CameraUtility.AddCullingMask(CameraManager.uiCamera, LayerUtility.UIEffectLayer); if (WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Close(); } } } public event Action OnBossNameEvent; public void ActiveBossName() { if (OnBossNameEvent != null) { OnBossNameEvent(); } } private void ActiveDialogue(bool _show) { if (_show && !WindowCenter.Instance.IsOpen()) { var _task = ModelCenter.Instance.GetModel(); _task._TaskNow = actorShowModel.Dialogue; WindowCenter.Instance.Open(); } else if (!_show && WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Close(); } } public Transform GetBossShowCamAnimator(Transform parent) { Animator animator = parent.GetComponent(); if (animator != null) { return parent; } foreach (Transform child in parent) { var trans = GetBossShowCamAnimator(child); if (trans == null) { continue; } else { return trans; } } return null; } public Camera GetBossShowCam(Transform parent) { Camera cam = parent.GetComponent(); if (cam != null) { return cam; } foreach (Transform child in parent) { cam = GetBossShowCam(child); if (cam == null) { continue; } else { return cam; } } return null; } public void ReceivePackage(H0827_tagMissionDesc vNetData) { var _taskInfo = new Int3((int)vNetData.MissionID, vNetData.MissionState, vNetData.DiscriptionIndex); if (_taskInfo != taskInfo) { taskInfo = _taskInfo; if (DTC0403_tagPlayerLoginLoadOK.finishedLogin) { var configs = ActorShowConfig.GetValues(); foreach (var config in configs) { if (config.BindMissionID == taskInfo) { Start(config.MapID, config.NpcID); if (PlayerDatas.Instance.hero != null) { PlayerDatas.Instance.hero.StopAll(); } return; } } } } } public void OnNpcAppear(int npcID) { if (BossShowing) { return; } if (!ActorShowConfig.GetActorShowModel(PlayerDatas.Instance.baseData.MapID, npcID, out actorShowModel)) { return; } if (actorShowModel.type != 1) { return; } serverNotify = false; StartBossShow(npcID); } private bool GetMisstionShow(int missionID) { return LocalSave.GetBool(StringUtility.Contact(BOSS_SHOW_KEY, PlayerDatas.Instance.PlayerId, missionID)); } public void SetMisstionShow(int missionID, bool value = true) { LocalSave.SetBool(StringUtility.Contact(BOSS_SHOW_KEY, PlayerDatas.Instance.PlayerId, missionID), value); } public void StartBossShow(uint npcID) { if (BossShowing) { return; } if (!ActorShowConfig.GetActorShowModel(PlayerDatas.Instance.baseData.MapID, (int)npcID, out actorShowModel)) { return; } if (actorShowModel.type != 0) { return; } serverNotify = true; StartBossShow((int)npcID); } private void OnStageLoadFinish() { if (!(StageLoad.Instance.currentStage is DungeonStage)) { cacheMapId = 0; } if (PlayerDatas.Instance.baseData.MapID == cacheMapId || cacheMapId == 0) { cacheMapId = PlayerDatas.Instance.baseData.MapID; return; } cacheMapId = PlayerDatas.Instance.baseData.MapID; var list = ActorShowConfig.GetValues(); ActorShowConfig _showModel = null; foreach (var config in list) { if (config.MapID == PlayerDatas.Instance.baseData.MapID && (config.line == 1000 || config.line == reqDungeonLineId) && config.type == 2) { if (!RequireBossShow(config.MapID, config.line)) { break; } _showModel = config; break; } else if (config.MapID == PlayerDatas.Instance.baseData.MapID && config.type == 3) { SnxxzGame.Instance.StartCoroutine(Co_StartSceneShow(config)); return; } } if (_showModel != null) { SnxxzGame.Instance.StartCoroutine(Co_StartBossShow(_showModel)); } } IEnumerator Co_StartBossShow(ActorShowConfig _showModel) { StartBossShow(_showModel.NpcID); yield return null; } IEnumerator Co_StartSceneShow(ActorShowConfig _showModel) { if (GetState((DungeonShowType)_showModel.NpcID)) { yield break; } var _dungeonCfg = DungeonOpenTimeConfig.Get(_showModel.MapID); if (_dungeonCfg != null && _dungeonCfg.FBType != 1) { var _team = ModelCenter.Instance.GetModel(); if (_team.myTeam.GetOnlineMemberCount() > 1) { SetState((DungeonShowType)_showModel.NpcID); SendGuideComplete((DungeonShowType)_showModel.NpcID); yield break; } } SetState((DungeonShowType)_showModel.NpcID); StartBossShow(_showModel.NpcID); yield return null; } public Dictionary> showActorDic = new Dictionary>(); public List GetShowActor(int npcID) { List list = null; showActorDic.TryGetValue(npcID, out list); return list; } private Dictionary m_ShowActorInstanceDict = new Dictionary(); public ShowActor GetShowActorInstance(int _instance) { if (m_ShowActorInstanceDict.ContainsKey(_instance)) { return m_ShowActorInstanceDict[_instance]; } return null; } private static int presentInstanceId = 0; public int GetInstanceId() { return presentInstanceId++; } private List m_DungeonStates = new List(); public void UpdateState(uint[] _states) { if (_states == null) { return; } var _start = (int)DungeonShowType.None / 31; if (_start < _states.Length) { var _index = 0; for (int i = _start; i < _states.Length; i++) { if (m_DungeonStates.Count <= _index) { m_DungeonStates.Add(_states[i]); } else { m_DungeonStates[_index] = _states[i]; } _index++; } } } public bool GetState(DungeonShowType _type) { int _key = (int)_type; var _start = _key / 31 - (int)DungeonShowType.None / 31; var _index = _key - (_key / 31) * 31; if (_start < m_DungeonStates.Count && _start >= 0) { return MathUtility.GetBitValue(m_DungeonStates[_start], (ushort)_index); } return false; } public void SetState(DungeonShowType _type, bool _state = true) { int _key = (int)_type; var _start = _key / 31 - (int)DungeonShowType.None / 31; var _index = _key - (_key / 31) * 31; if (_start >= m_DungeonStates.Count) { m_DungeonStates.Add((uint)MathUtility.SetBitValue(0, (ushort)_index, _state)); } else { m_DungeonStates[_start] = (uint)MathUtility.SetBitValue((int)m_DungeonStates[_start], (ushort)_index, _state); } } private void SendGuideComplete(DungeonShowType _type, bool _state = true) { CA222_tagCMSetGuideOK _pak = new CA222_tagCMSetGuideOK(); _pak.GuideIndex = (byte)_type; _pak.IsOK = _state ? (byte)1 : (byte)0; GameNetSystem.Instance.SendInfo(_pak); } public enum DungeonShowType : byte { None = 200, DemonJar = 201, FairyLand = 202, //后续IL开发添加预设 default1, default2, default3, default4, default5, default6, default7, default8, default9, default10, } private void SaveBossShowStep(ActorShowConfig config, bool value = true) { if (config.step == 0) { return; } var playerId = PlayerDatas.Instance.baseData.PlayerID; LocalSave.SetBool(StringUtility.Contact("BossShowStep_", playerId, "_", config.MapID, "_", config.NpcID), value); } private bool SatisfyBossShowStep(ActorShowConfig config) { if (config.step == 0) { return false; } var playerId = PlayerDatas.Instance.baseData.PlayerID; return LocalSave.GetBool(StringUtility.Contact("BossShowStep_", playerId, "_", config.MapID, "_", config.NpcID)); } #region 魔族法宝特殊判断 bool RequireBossShow(int mapId, int lineId) { if (mapId != 41110) { return true; } var model = ModelCenter.Instance.GetModel(); var list = model.GetTreasureCategory(TreasureCategory.Demon); for (int i = 0; i < list.Count; i++) { TreasureDungeon treasureDungeon; if (model.TryGetTreasureDungeon(list[i], out treasureDungeon)) { var count = treasureDungeon.dungeonInfos.Count; if (count > 0 && treasureDungeon.dungeonInfos[0].lineId == lineId) { var maxLevel = treasureDungeon.dungeonInfos[count - 1].level; if (treasureDungeon.currentLevel < maxLevel - 1) { return false; } } } } return true; } #endregion } }