/******************************************************************************** * 文件名:DialogCore.cs * 全路径: \Script\Mission\DialogCore.cs * 创建人: 贺文鹏 * 创建时间:2014-02-17 * * 功能说明: 客户端的对话逻辑,包括NPC对话、任务对话。 * * 修改记录: *********************************************************************************/ using UnityEngine; using System.Collections; using System.Collections.Generic; using Games.LogicObj; using Games.GlobeDefine; using Games.Mission; using GCGame.Table; using Module.Log; public class DialogCore : Singleton { //当前关注的NPC,调用BeginDialog的时候,如果这个不为空,则直接读取Obj_Npc中的对话相关数据 private Obj_NPC m_CareNPC; public Obj_NPC CareNPC { get { return m_CareNPC; } set { m_CareNPC = value; } } //当无Obj_Npc的时候,也可以直接用DialogID来触发简单对话 private int m_nDialogID; public int DialogID { get { return m_nDialogID; } set { m_nDialogID = value; } } ////////////////////////////////////////////////////////////////////////// //对话相关接口 ////////////////////////////////////////////////////////////////////////// // 弹出最近对话框 --寻路完响应 public void AutoDialog(int nMissionID) { Tab_MissionBase MissionBase = TableManager.GetMissionBaseByID(nMissionID, 0); if (MissionBase == null) { return; } Obj_NPC targetNpc = null; foreach (var obj in ObjManager.Instance.ObjPools.Values) { var objChar = obj as Obj_Character; if (objChar != null && (objChar.BaseAttr.RoleBaseID == MissionBase.AcceptDataID || objChar.BaseAttr.RoleBaseID == MissionBase.CompleteDataID)) { targetNpc = objChar as Obj_NPC; break; } } if (targetNpc == null) return; if (null != Singleton.GetInstance().MainPlayer) { Singleton.GetInstance().MainPlayer.SetSelectTarget(targetNpc); } if (!targetNpc.IsHaveMission(nMissionID)) return; Show(targetNpc); } //开始对话窗口,根绝参数来确定有无关心NPC //对外只提供这一个接口,之后确定是显示对白还是显示任务 public void Show(Obj_NPC objNpc) { m_CareNPC = objNpc; if (m_CareNPC == null) { return; } //UIManager.ShowUI(UIInfo.ActivePresious, OnOPenActivePresiousWnd, objNpc.ServerID); if (false == IsInDialogArea()) { return; } // 弹出已完成任务 if (true == PopCompletedMission()) { return; } //答题任务 if (true == IsMissionQuestion(m_CareNPC)) { return; } //选择对话 if (true == SpecialDialog(m_CareNPC)) { return; } // 弹出可接任务 if (true == PopCanAcceptedMission()) { return; } //是否所有任务都已接取 if (true == AllMissionAccept()) { return; } ShowText(m_CareNPC.DefaultDialogID); } // 遍历弹出已完成任务 bool PopCompletedMission() { //师门可完成 foreach (KeyValuePair oldPair in GameManager.gameManager.MissionManager.MissionList.m_aMission) { if (oldPair.Value != null) { int missionId = oldPair.Value.m_nMissionID; Tab_MissionBase missionBase = TableManager.GetMissionBaseByID(missionId, 0); if (missionBase == null) { continue; } Tab_MissionDictionary missionDic = TableManager.GetMissionDictionaryByID(missionId, 0); if (missionDic == null) { continue; } //任务未接的时候不做判断(神奇BUG) if(GameManager.gameManager.MissionManager.MissionList.m_aMission[missionId].m_yStatus == (int)MissionState.Mission_NotAccept) { continue; } int curMissionIndex = GameManager.gameManager.MissionManager.getCurMissionIndex(missionId); //当前进行的任务下标 Tab_MissionLogic missionLogic = TableManager.GetMissionLogicByID(missionBase.LogicID, 0); if (missionLogic == null) { continue; } if (m_CareNPC.RoleBaseID == missionDic.CompleteNpcDataID && (GameManager.gameManager.MissionManager.MissionList.m_aMission[missionId].m_yStatus == (int)MissionState.Mission_Completed || missionLogic.GetLogicTypebyIndex(curMissionIndex) == (int)TableType.Table_Delivery)) { //副本杀怪任务 if (missionLogic.GetLogicTypebyIndex(curMissionIndex) == (int)TableType.Table_CopySceneMonster || missionLogic.GetLogicTypebyIndex(curMissionIndex) == (int)TableType.Table_MissionAdvanceCopy) //需要弹出可以进入副本的对话框 { //判断状态 if (GameManager.gameManager.MissionManager.MissionList.m_aMission[missionId].m_yStatus != (int)MissionState.Mission_Completed) { continue; } } MissionInfoController.ShowMissionDialogUI(missionId, MissionInfoController.MissionUIType.TYPE_COMPLETE); return true; } } continue; } // 显示已完成任务 for (int i = 0; i < m_CareNPC.MissionList.Count; ++i) { int missionID = m_CareNPC.MissionList[i]; if (missionID < 0) { return false; } Tab_MissionBase table = TableManager.GetMissionBaseByID(missionID, 0); if (table == null) { LogModule.ErrorLog("CAN'T FIND MISSION : " + missionID); continue; } bool bIsHaveMission = GameManager.gameManager.MissionManager.IsHaveMission(missionID); if (false == bIsHaveMission) { continue; } if (table.CompleteDataID != m_CareNPC.BaseAttr.RoleBaseID) { continue; } Tab_MissionLogic missionLogic = TableManager.GetMissionLogicByID(table.LogicID, 0); int m_index = GameManager.gameManager.MissionManager.getCurMissionIndex(missionID); int m_Count = GameManager.gameManager.MissionManager.getCurMissionTypeCount(missionID); MissionState misState = (MissionState)GameManager.gameManager.MissionManager.GetMissionState(missionID); if (missionLogic.GetLogicTypebyIndex(m_index) == (int)TableType.Table_Delivery || missionLogic.GetLogicTypebyIndex(m_index) == (int)TableType.Table_Story) { if (++m_index == m_Count) { misState = MissionState.Mission_Completed; } } //帮会跑商任务 if (table.MissionType == (int)MISSIONTYPE.MISSION_GUILDTRANSPORT) { misState = (MissionState)GameManager.gameManager.MissionManager.GetMissionState(missionID); } if (table.MissionType != (int)MISSIONTYPE.MISSION_DAILY && MissionState.Mission_Completed == misState) { ShowMission(missionID); return true; } } return false; } bool AllMissionAccept() { for (int i = 0; i < m_CareNPC.MissionList.Count; ++i) { int missionID = m_CareNPC.MissionList[i]; if (missionID < 0) { continue; } Tab_MissionBase table = TableManager.GetMissionBaseByID(missionID, 0); if (table == null) { continue; } if (table.AcceptDataID != m_CareNPC.BaseAttr.RoleBaseID) { continue; } bool have = GameManager.gameManager.MissionManager.IsHaveMission(missionID); if (!have) { return false; } } ShowText(m_CareNPC.DefaultDialogID); return true; } // 遍历弹出可接任务 bool PopCanAcceptedMission() { // 显示可接任务 for (int i = 0; i < m_CareNPC.MissionList.Count; ++i) { int missionID = m_CareNPC.MissionList[i]; if (missionID < 0) { continue; } Tab_MissionBase table = TableManager.GetMissionBaseByID(missionID, 0); if (table == null) { continue; } if(table.MissionType == (int)MISSIONTYPE.MISSION_INSEC) { //判断当前NPC是否是对应的师门NPC if(GlobeVar.GetMasterRolebaseId(GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession) != m_CareNPC.RoleBaseID) { continue; } } if (table.AcceptDataID != m_CareNPC.BaseAttr.RoleBaseID) { continue; } bool bCanAcceptMission = GameManager.gameManager.MissionManager.CanAcceptMission(missionID); if (bCanAcceptMission) { ShowMission(missionID); return true; } } return false; } public void Show(int nDialogID) { m_CareNPC = null; m_nDialogID = nDialogID; } //显示任务 void ShowMission(int nMissionId) { if (GlobeVar.INVALID_ID == nMissionId) { return; } MissionInfoController.ShowMissionDialogUI(nMissionId); } //显示对白 void ShowText(int nDialogId) { if (GlobeVar.INVALID_ID == nDialogId) { return; } MissionInfoController.ShowNpcDialogUI(nDialogId); } // 对话区域半径判断 public bool IsInDialogArea(Vector3 vPos) { if (null == Singleton.GetInstance().MainPlayer) return false; //int nLevel = GameManager.gameManager.RunningScene; Vector3 userPos = Singleton.GetInstance().MainPlayer.Position; float dis = Mathf.Abs(Vector3.Distance(userPos, vPos)); if (dis < 4) { return true; } return false; } public bool IsInDialogArea() { if (m_CareNPC == null) { return true; } return IsInDialogArea(m_CareNPC.Position); } bool IsMissionQuestion(Obj_NPC obj) { foreach(var mission in GameManager.gameManager.MissionManager.MissionList.m_aMission) { var missionId = mission.Key; var missionBase = TableManager.GetMissionBaseByID(missionId, 0); if (missionBase == null) continue; var missionLogic = TableManager.GetMissionLogicByID(missionBase.LogicID, 0); if (missionLogic == null) continue; var curMissionIndex = GameManager.gameManager.MissionManager.getCurMissionIndex(missionBase.Id); var missionState = GameManager.gameManager.MissionManager.GetMissionState(missionId); if (missionState == (int)Games.Mission.MissionState.Mission_Accepted && missionLogic.GetLogicTypebyIndex(curMissionIndex) == (int)Games.Mission.TableType.Table_MissionQuestion) { var missionDicTab = TableManager.GetMissionDictionaryByID(missionId, 0); if (missionDicTab.GetTargetNpcDataIDbyIndex(curMissionIndex) == obj.BaseAttr.RoleBaseID) { UIManager.ShowUI(UIInfo.MissionQuestionRoot, delegate (bool bSucess, object param) { if (bSucess) { var missionQuestionId = missionLogic.GetLogicIDbyIndex(curMissionIndex); MissionQuestionRoot.Instance.ShowQuestion(missionId, missionQuestionId); } }); return true; } else { Module.Log.LogModule.ErrorLog("当前任务需要寻找的NPC ID 为 : " + missionDicTab.GetTargetNpcDataIDbyIndex(curMissionIndex) + ", 当前对话NPC ID 为 : " + obj.BaseAttr.RoleBaseID); continue; } } } return false; } bool SpecialDialog(Obj_NPC obj) { if (obj && (obj.BaseAttr.RoleBaseID == GlobeVar.MARRY_NPCID || obj.BaseAttr.RoleBaseID == GlobeVar.DIVORCE_NPCID || obj.BaseAttr.RoleBaseID == GlobeVar.PARADE_NPCID) ) { //MarryRootLogic.ShowMarryDialogUI(obj.BaseAttr.RoleBaseID); return true; } //如果开关关闭,奖励NPC就按照普通NPC一样对话 if (obj && obj.BaseAttr.RoleBaseID == GlobeVar.AWARD_NPCID) { //if (!GameManager.gameManager.PlayerDataPool.IsServerFlagOpen(SERVER_FLAGS_ENUM.FLAG_CYFANS)) { return false; } } //显示带选项的对话框 if (obj.DefaultDialogID != -1) { Tab_NpcDialog _npcDialogInfo = TableManager.GetNpcDialogByID(obj.DefaultDialogID, 0); if (_npcDialogInfo != null && _npcDialogInfo.OptionDialogId != -1) { if (_npcDialogInfo.OptionDialogType == (int)Games.Mission.OptionDialogType.OPenUI) { Tab_NpcOptionDialog optionDialog = TableManager.GetNpcOptionDialogByID(_npcDialogInfo.OptionDialogId, 0); if (optionDialog != null) { for(int i=0;i= 2) { OptionDialogLogic.ShowOptionDialogUI(obj); return true; } } return false; } // 寻路后逻辑处理 public void MissionLogic(int nMissionID) { Tab_MissionBase table = TableManager.GetMissionBaseByID(nMissionID, 0); Tab_MissionLogic missionLogic = TableManager.GetMissionLogicByID(table.LogicID, 0); MissionState misState = (MissionState)GameManager.gameManager.MissionManager.GetMissionState(nMissionID); if (MissionState.Mission_Accepted == misState) { var nTableType = missionLogic.GetLogicTypebyIndex(GameManager.gameManager.MissionManager.getCurMissionIndex(nMissionID)); if (nTableType == ((int)TableType.Table_KillMonster) || nTableType == ((int)TableType.Table_LootItem) || nMissionID == 25 || nMissionID == 33 || nMissionID == 36) { if (Singleton.GetInstance().MainPlayer && Singleton.GetInstance().MainPlayer.OwnSkillInfo[0].IsValid()) { var ownSkill = Singleton.GetInstance().MainPlayer.OwnSkillInfo[0]; Singleton.GetInstance().MainPlayer.RemoveSelectTarget(); Singleton.GetInstance().MainPlayer.TryStartTargetSkill(ownSkill); } return; } } // 弹出对话 AutoDialog(nMissionID); } }