using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using GCGame.Table; using Games.LogicObj; using Games.Mission; using Games.GlobeDefine; using Module.Log; using Games.Item; public class MissionInfoController : UIControllerBase { public GameObject m_GameObj; //接受任务界面信息 public Text[] m_NpcName; // 对话NPC public Image m_NpcSprite; //任务NPC头像 public UICameraTexture[] _NpcCameraTexture; public Text m_MissionAwardInfo; //任务奖励信息 public Text[] m_MissionConent; //任务内容 public GameObject playerPanel; public GameObject npcPanel; private int m_CurMissionID; //当前任务ID private MissionUIType m_MissionType = MissionUIType.TYPE_NONE; public List _RemainText; public enum MissionUIType { TYPE_NONE, TYPE_ACCETP, TYPE_COMPLETE, } enum DialogType { None = -1, Player = 0, Npc = 1, } public class MissionUIInfo { public MissionUIInfo(int missionID, MissionUIType type) { _nMissionID = missionID; _type = type; } public int _nMissionID; public MissionUIType _type; } public static void ShowNpcDialogUI(int nDialogID) { UIManager.ShowUI(UIInfo.MissionInfoController, OnShowNpcDialogUI, nDialogID); } static void OnShowNpcDialogUI(bool bSuccess, object dialogID) { if (!bSuccess) { LogModule.ErrorLog("load MissionInfoController fail"); return; } int nDialogID = (int)dialogID; if (null != MissionInfoController.Instance()) { MissionInfoController.Instance().DoShowNPCDialog(nDialogID); } } /// /// 显示对话框 /// /// /// 是否是任务 /// /// /// 任务ID/对白ID /// public static void ShowMissionDialogUI(int nMissionID) { Tab_MissionBase table = TableManager.GetMissionBaseByID(nMissionID, 0); if (table != null) { // NPC 距离判断 Obj_NPC TargetNpc = Singleton.GetInstance().CareNPC; // 是否已接取 bool isHaveMission = GameManager.gameManager.MissionManager.IsHaveMission(nMissionID); MissionState misState = (MissionState)GameManager.gameManager.MissionManager.GetMissionState(nMissionID); Tab_MissionBase missionBase = TableManager.GetMissionBaseByID(nMissionID, 0); if (missionBase == null) { LogModule.ErrorLog("MissionBase is null , id : " + nMissionID); return; } Tab_MissionLogic missionLogic = TableManager.GetMissionLogicByID(missionBase.LogicID, 0); if (missionLogic == null) { LogModule.ErrorLog("MissionLogic is null, id is : " + missionBase.LogicID); return; } if (isHaveMission) { int index = GameManager.gameManager.MissionManager.getCurMissionIndex(nMissionID); bool isFinalMission = GameManager.gameManager.MissionManager.getCurMissionTypeCount(nMissionID) - 1 == index ? true : false; if (isFinalMission) { misState = MissionState.Mission_Completed; //最后一个任务是对话的时候,打开对话框的时候就设置任务为完成状态。 } } if (isHaveMission && misState != MissionState.Mission_Failed) { if (MissionState.Mission_Completed == misState) { if (table.MissionType == (int)MISSIONTYPE.MISSION_INSEC || table.MissionType == (int)MISSIONTYPE.MISSION_TREASURE || table.MissionType == (int)MISSIONTYPE.MISSION_CIRCLE || (table.CompleteDataID > 0 && table.CompleteDataID == TargetNpc.BaseAttr.RoleBaseID)) //师门,藏宝图 任务自动弹出对话框 { ShowMissionDialogUI(nMissionID, MissionInfoController.MissionUIType.TYPE_COMPLETE); } } } else { bool isCanAcceptMission = GameManager.gameManager.MissionManager.CanAcceptMission(nMissionID); if (isCanAcceptMission) { if (table.MissionType == (int)MISSIONTYPE.MISSION_INSEC || table.MissionType == (int)MISSIONTYPE.MISSION_TREASURE || table.MissionType == (int)MISSIONTYPE.MISSION_CIRCLE || (table.AcceptDataID > 0 && table.AcceptDataID == TargetNpc.BaseAttr.RoleBaseID)) { ShowMissionDialogUI(nMissionID, MissionInfoController.MissionUIType.TYPE_ACCETP); } } } if (GuideLogic.Instance()) { GuideLogic.Instance().NextMissionID = -1; } } } public static void ShowMissionDialogUI(int nMissionID, MissionUIType type) { MissionUIInfo curInfo = new MissionUIInfo(nMissionID, type); UIManager.ShowUI(UIInfo.MissionInfoController, OnShowMissionDialogUI, curInfo); } static void OnShowMissionDialogUI(bool bSuccess, object dialogID) { if (!bSuccess) { LogModule.ErrorLog("load MissionInfoController fail"); return; } MissionUIInfo curInfo = (MissionUIInfo)dialogID; if (null != MissionInfoController.Instance() && curInfo != null) { MissionInfoController.Instance().MissionUI(curInfo._nMissionID, curInfo._type); } } void Awake() { SetInstance(this); } // Use this for initialization void Start() { if (m_GameObj) { m_GameObj.SetActive(true); } } // Update is called once per frame void FixedUpdate() { if (Time.frameCount % 15 != 0) { if (gameObject.activeSelf) { if (false == Singleton.GetInstance().IsInDialogArea()) { //UIManager.CloseUI(UIInfo.MissionInfoController); OnCloseClick(); } } } } void OnDisable() { CleanUp(); //NPC 对话完需隐藏脚底光环 //GameManager.gameManager.ActiveScene.DeactiveSelectCircle(); _NpcCameraTexture[(int)DialogType.Npc].DestroyObj(); } void OnDestroy() { SetInstance(null); } private DialogType curDialogType = DialogType.None; void ShowPanel(DialogType type) { curDialogType = type; npcPanel.gameObject.SetActive(type == DialogType.Npc); playerPanel.gameObject.SetActive(type == DialogType.Player); } void CleanUp() { for (int index = 0; index < m_MissionConent.Length; index++) { m_MissionConent[index].text = ""; } m_DialogIndex = -1; m_CurMissionID = 0; m_MissionType = MissionUIType.TYPE_NONE; _RemainText[0].text = ""; _RemainText[1].text = ""; } private int _NpcSoundLimitTime = -1; void DoShowNPCDialog(int nDialogID) { // 先清理 CleanUp(); Tab_NpcDialog DialogLine = TableManager.GetNpcDialogByID(nDialogID, 0); if (DialogLine != null) { if (m_MissionConent[(int)DialogType.Npc]) { m_MissionConent[(int)DialogType.Npc].text = StrDictionary.GetClientString_WithNameSex(DialogLine.Dialog); } } NpcDialogUI(MissionUIType.TYPE_NONE); if(GlobalData.NextNpcSoundTime == -1) { GameManager.gameManager.SoundManager.StopSoundEffect(GlobalData._PlayingSoundID, 1); GlobalData._PlayingSoundID = DialogLine.SoundId; GameManager.gameManager.SoundManager.PlaySoundEffect(DialogLine.SoundId, 1); } else { if(GlobalData.ServerAnsiTime > GlobalData.NextNpcSoundTime) { GameManager.gameManager.SoundManager.StopSoundEffect(GlobalData._PlayingSoundID, 1); GlobalData._PlayingSoundID = DialogLine.SoundId; GameManager.gameManager.SoundManager.PlaySoundEffect(DialogLine.SoundId, 1); if (_NpcSoundLimitTime == -1) { _NpcSoundLimitTime = int.Parse(TableManager.GetSystemParamByID(51, 0).StringValue); } GlobalData.NextNpcSoundTime += _NpcSoundLimitTime; } } } // Npc头像 //private int _LastNpcModelId = -1; void NpcDialogUI(MissionUIType m_Type) { if (m_Type == MissionUIType.TYPE_NONE) //没有任务状态的时候进行默认的NPC对话 { ShowPanel(DialogType.Npc); } Obj_NPC TargetNpc = Singleton.GetInstance().CareNPC; Tab_RoleBaseAttr baseAttr = null; Tab_RoleBaseAttr roleBase = null; Tab_CharModel charModel = null; Tab_MissionBase missionBase = TableManager.GetMissionBaseByID(m_CurMissionID, 0); if (missionBase.MissionType == (int)MISSIONTYPE.MISSION_INSEC) //师门任务NPC头像 { if (missionBase != null && missionBase.MissionType == 3) { if (m_Type == MissionUIType.TYPE_ACCETP) { baseAttr = TableManager.GetRoleBaseAttrByID(GlobeVar.GetMasterRolebaseId(GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession), 0); } else { baseAttr = TableManager.GetRoleBaseAttrByID(TargetNpc.RoleBaseID, 0); } if (baseAttr == null) { return; } roleBase = TableManager.GetRoleBaseAttrByID(baseAttr.Id, 0); if (roleBase == null) { return; } charModel = TableManager.GetCharModelByID(baseAttr.CharModelID, 0); if (null == charModel) { return; } { m_NpcName[(int)DialogType.Npc].text = roleBase.Name; if (missionBase.MissionType == 3) { m_NpcName[(int)DialogType.Npc].text = baseAttr.Name; } _NpcCameraTexture[(int)DialogType.Npc].isPreview = true; _NpcCameraTexture[(int)DialogType.Npc].InitModelPath(charModel.ResPath, charModel, LoadAssetBundle.BUNDLE_PATH_MODEL,false); } } return; } //int nNpcDataID = TargetNpc.BaseAttr.DataID; if (TargetNpc.ModelID < 0) { return; } roleBase = TableManager.GetRoleBaseAttrByID(TargetNpc.BaseAttr.RoleBaseID, 0); if (roleBase == null) { return; } charModel = TableManager.GetCharModelByID(TargetNpc.ModelID, 0); if (null == charModel) { return; } { var uiTexture = _NpcCameraTexture[(int)DialogType.Npc]; m_NpcName[(int)DialogType.Npc].text = roleBase.Name; uiTexture.InitModelPath(charModel.ResPath, charModel); // 统一加载流程,现在模型本身也不会反复加载,因此消耗是可以忽略的 // if (_LastNpcModelId == charModel.Id) // uiTexture.EnableRawImage(); // else // { // _LastNpcModelId = charModel.Id; // uiTexture.InitModelPath(charModel.ResPath, charModel); // } } } private int _LastPlayerModelId = -1; void PlayerDialogUI() { m_NpcName[(int)DialogType.Player].text = Singleton.Instance.MainPlayer.BaseAttr.RoleName; //if (_LastPlayerModelId == Singleton.Instance.MainPlayer.ModelID) //{ // return; //} _LastPlayerModelId = Singleton.Instance.MainPlayer.ModelID; _NpcCameraTexture[(int)DialogType.Player].isPreview = true; _NpcCameraTexture[(int)DialogType.Player].InitPlayerModel(Singleton.Instance.MainPlayer, false, delegate () { _NpcCameraTexture[(int)DialogType.Player]._FakeObj.renderCamera.orthographicSize = 1.3f; if (!_NpcCameraTexture[(int)DialogType.Player]._RawImage.isActiveAndEnabled) { _NpcCameraTexture[(int)DialogType.Player]._RawImage.gameObject.SetActive(true); } }); } // 接任务和交任务UI public void MissionUI(int nMissionID, MissionUIType type) { // 先清理 CleanUp(); ShowMissionDialog(nMissionID, type); } int m_DialogIndex = -1; public void ShowMissionDialog(int nMissionID, MissionUIType type) { if (nMissionID < 0) { return; } m_CurMissionID = nMissionID; Tab_MissionDictionary MDLine = TableManager.GetMissionDictionaryByID(nMissionID, 0); if (MDLine == null) { return; } Tab_MissionDialog DialogTab = null; if (type == MissionUIType.TYPE_ACCETP) { DialogTab = TableManager.GetMissionDialogByID(MDLine.MissionAcceptDialogID, 0); } else { DialogTab = TableManager.GetMissionDialogByID(MDLine.MissionFinishDialogID, 0); } if (DialogTab == null) return; m_DialogIndex++; string DialogStr = DialogTab.GetDialogbyIndex(m_DialogIndex); bool isNpc = DialogTab.GetDialogTypebyIndex(m_DialogIndex); if (string.IsNullOrEmpty(DialogStr) || DialogStr == "-1") { MissionDialogOver(); return; } if (isNpc) { ShowPanel(DialogType.Npc); m_MissionConent[(int)DialogType.Npc].text = StrDictionary.GetClientString_WithNameSex(DialogStr); } else { ShowPanel(DialogType.Player); m_MissionConent[(int)DialogType.Player].text = StrDictionary.GetClientString_WithNameSex(DialogStr); } if (type == MissionUIType.TYPE_ACCETP) { if (m_DialogIndex <= 0) { if(MDLine.AcceptSoundId != -1 && MDLine.AcceptSoundId != GlobalData._PlayingSoundID) { GameManager.gameManager.SoundManager.StopSoundEffect(GlobalData._PlayingSoundID, 1); GlobalData._PlayingSoundID = MDLine.AcceptSoundId; GameManager.gameManager.SoundManager.PlaySoundEffect(MDLine.AcceptSoundId, 1); } } } else if (type == MissionUIType.TYPE_COMPLETE) { if (m_DialogIndex <= 0) { if(MDLine.CompleteSoundID != -1 && MDLine.CompleteSoundID != GlobalData._PlayingSoundID) { GameManager.gameManager.SoundManager.StopSoundEffect(GlobalData._PlayingSoundID, 1); GlobalData._PlayingSoundID = MDLine.CompleteSoundID; GameManager.gameManager.SoundManager.PlaySoundEffect(MDLine.CompleteSoundID, 1); } } } m_MissionType = type; if (isNpc) NpcDialogUI(m_MissionType); else PlayerDialogUI(); GameManager.gameManager.SoundManager.PlaySoundEffect(128); if (DialogTab.ContinueTime > 0) { StartCoroutine(NextDialog(DialogTab.ContinueTime / 1000)); SetRemainText(DialogTab.ContinueTime / 1000); }else { for(int index = 0; index < _RemainText.Count; index++) { _RemainText[index].gameObject.SetActive(false); } } } IEnumerator NextDialog(int waitTime) { while(true) { yield return new WaitForSeconds(1.0f); waitTime--; if(waitTime <= 0) { ShowMissionDialog(m_CurMissionID, m_MissionType); SetRemainText(0); yield break; } SetRemainText(waitTime); } } public void SetRemainText(int remainTime) { for(int index = 0; index < _RemainText.Count; index++) { if (!_RemainText[index].gameObject.activeInHierarchy) _RemainText[index].gameObject.SetActive(true); _RemainText[index].text = "(" + remainTime + ")"; } } public void MissionDialogOver() { if (m_MissionType == MissionUIType.TYPE_ACCETP) { GameManager.gameManager.SoundManager.PlaySoundEffect(135); if (!GameManager.gameManager.MissionManager.IsHaveMission(m_CurMissionID)) GameManager.gameManager.MissionManager.AcceptMission(m_CurMissionID, MissionManager.AcceptMissionType.MISSIONID); } else if (m_MissionType == MissionUIType.TYPE_COMPLETE) { GameManager.gameManager.SoundManager.PlaySoundEffect(135); GameManager.gameManager.MissionManager.CompleteMission(m_CurMissionID); } RingMissionAutoSearch(); //师门 在点击完对话后自动寻路 m_DialogIndex = -1; //全部判断完之后再关闭,这边会清理一次信息 UIManager.CloseUI(UIInfo.MissionInfoController); } public void DialogClick() { if (m_DialogIndex < 0) { MissionDialogOver(); } else { StopAllCoroutines(); ShowMissionDialog(m_CurMissionID, m_MissionType); } } public void RingMissionAutoSearch() { Tab_MissionBase missionbase = TableManager.GetMissionBaseByID(m_CurMissionID, 0); if (missionbase == null) { return; } if (Singleton.GetInstance() != null && Singleton.GetInstance().CareNPC != null && Singleton.GetInstance().CareNPC.RoleBaseID == missionbase.CompleteDataID //如果当前发布任务NPC跟完成任务NPC是同一个NPC,这边在接到任务之后不会自动寻路 && GameManager.gameManager.MissionManager.GetMissionState(m_CurMissionID) != (int)Games.Mission.MissionState.Mission_Accepted) { return; } if (missionbase.MissionType == (int)MISSIONTYPE.MISSION_INSEC) { if (GameManager.gameManager.MissionManager.GetMissionState(GameManager.gameManager.MissionManager.GetMissionInSecId()) == (int)MissionState.Mission_Accepted) { GameManager.gameManager.MissionManager.MissionPathFinder(GameManager.gameManager.MissionManager.GetMissionInSecId()); } } } /// /// 接受任务 /// public void MissionAccept() { UIManager.CloseUI(UIInfo.MissionInfoController); GameManager.gameManager.SoundManager.PlaySoundEffect(135); GameManager.gameManager.MissionManager.AcceptMission(m_CurMissionID, MissionManager.AcceptMissionType.MISSIONID); } /// /// 完成任务 /// public void MissionComplete() { UIManager.CloseUI(UIInfo.MissionInfoController); GameManager.gameManager.SoundManager.PlaySoundEffect(135); GameManager.gameManager.MissionManager.CompleteMission(m_CurMissionID); } public void OnCloseClick() { if (m_MissionType == MissionUIType.TYPE_ACCETP) { GameManager.gameManager.MissionManager.AcceptMission(m_CurMissionID, MissionManager.AcceptMissionType.MISSIONID); } UIManager.CloseUI(UIInfo.MissionInfoController); } public void ItemTipClick(object itemID) { int nItemID = (int)itemID; if (nItemID <= -1) { return; } GameItem item = new GameItem(); item.DataID = nItemID; if (item.IsEquipMent()) { SpecialItemClick(item); EquipTooltipsLogic.ShowEquipTooltip(item, ItemTooltipsLogic.ShowType.Info, transform.position); } else { ItemTooltipsLogic.ShowItemTooltip(item, ItemTooltipsLogic.ShowType.Info, transform.position); } } void SpecialItemClick(GameItem gItem) { int nItemStarLevel = 0; if (m_CurMissionID == 233) { nItemStarLevel = 12; } else if (m_CurMissionID == 234) { nItemStarLevel = 24; } else if (m_CurMissionID == 235) { nItemStarLevel = 36; } if (nItemStarLevel > 0) { gItem.StarLevel = nItemStarLevel; } } }