566 lines
21 KiB
C#
566 lines
21 KiB
C#
/********************************************************************************
|
||
* 文件名: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<DialogCore>
|
||
{
|
||
//当前关注的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<ObjManager>.GetInstance().MainPlayer)
|
||
{
|
||
Singleton<ObjManager>.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<int, Games.Mission.CurOwnMission> 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<ObjManager>.GetInstance().MainPlayer)
|
||
return false;
|
||
|
||
//int nLevel = GameManager.gameManager.RunningScene;
|
||
Vector3 userPos = Singleton<ObjManager>.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<optionDialog.getOptionFuncCount();i++)
|
||
{
|
||
string missionStr = optionDialog.GetOptionParambyIndex(i);
|
||
int missionID = -1;
|
||
if(int.TryParse(missionStr,out missionID) && GameManager.gameManager.MissionManager.IsHaveMission(missionID))
|
||
{
|
||
UIPathData uidata = null;
|
||
if(UIPathData.m_DicUIName.TryGetValue(optionDialog.GetOptionTextbyIndex(i),out uidata))
|
||
{
|
||
UIManager.ShowUI(uidata);
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//判断是否是一条龙进副本
|
||
if (_npcDialogInfo.OptionDialogType == (int)Games.Mission.OptionDialogType.OneDragon)
|
||
{
|
||
if (OneDragonAuto.One_DragonAuto != null)
|
||
{
|
||
OneDragonAuto.One_DragonAuto.OneDragonEnterCopyNpc = obj.ServerID;
|
||
if (OneDragonAuto.One_DragonAuto.NeedCheckOneDragonEnterCopy == true)
|
||
if (OneDragonAuto.One_DragonAuto.CheckEnterCopy() == true)
|
||
return true;
|
||
}
|
||
}
|
||
|
||
//需要任务在身
|
||
if (_npcDialogInfo.OptionDialogType == (int)Games.Mission.OptionDialogType.NeedMission
|
||
|| _npcDialogInfo.OptionDialogType == (int)Games.Mission.OptionDialogType.CopyScene||
|
||
_npcDialogInfo.OptionDialogType == (int)Games.Mission.OptionDialogType.OPenUI)
|
||
{
|
||
bool hasFind = false;
|
||
foreach (var m_Mission in GameManager.gameManager.MissionManager.MissionList.m_aMission)
|
||
{
|
||
if(GameManager.gameManager.MissionManager.GetMissionState(m_Mission.Value.m_nMissionID) != (int)Games.Mission.MissionState.Mission_Accepted)
|
||
{
|
||
continue;
|
||
}
|
||
int curMissionIndex = GameManager.gameManager.MissionManager.getCurMissionIndex(m_Mission.Value.m_nMissionID);
|
||
Tab_MissionBase missionBase = TableManager.GetMissionBaseByID(m_Mission.Value.m_nMissionID, 0);
|
||
if (missionBase != null )
|
||
{
|
||
Tab_MissionLogic missionLogic = TableManager.GetMissionLogicByID(missionBase.LogicID, 0);
|
||
if (missionLogic != null)
|
||
{
|
||
if(missionBase.MissionType == (int)MISSIONTYPE.MISSION_TREASURE
|
||
|| (missionLogic.GetLogicTypebyIndex(curMissionIndex) == (int)TableType.Table_CopySceneMonster)
|
||
|| (missionLogic.GetLogicTypebyIndex(curMissionIndex) == (int)TableType.Table_MissionAdvanceCopy))
|
||
{
|
||
Tab_MissionDictionary missionDic = TableManager.GetMissionDictionaryByID(missionBase.Id, 0);
|
||
if (missionDic != null)
|
||
{
|
||
if (missionDic.GetTargetNpcDataIDbyIndex(curMissionIndex) == obj.BaseAttr.RoleBaseID)
|
||
{
|
||
hasFind = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if(!hasFind)
|
||
return false;
|
||
}
|
||
OptionDialogLogic.ShowOptionDialogUI(obj);
|
||
return true;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
int index = 0;
|
||
Tab_NpcDialog _npcDialogInfo = TableManager.GetNpcDialogByID(obj.DefaultDialogID, 0);
|
||
if (_npcDialogInfo == null)
|
||
return false;
|
||
for (int i = 0; i < _npcDialogInfo.getMissionIDCount(); i++)
|
||
{
|
||
int missionId = _npcDialogInfo.GetMissionIDbyIndex(i);
|
||
Games.Mission.MissionState misState = (Games.Mission.MissionState)GameManager.gameManager.MissionManager.GetMissionState(missionId);
|
||
if (/*GameManager.gameManager.MissionManager.CanAcceptMission(missionId) ||*/ misState == Games.Mission.MissionState.Mission_Completed)
|
||
{
|
||
Tab_MissionBase mission = TableManager.GetMissionBaseByID(missionId, 0);
|
||
if (mission != null)
|
||
{
|
||
index++;
|
||
}
|
||
}
|
||
}
|
||
if (index >= 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<ObjManager>.GetInstance().MainPlayer
|
||
&& Singleton<ObjManager>.GetInstance().MainPlayer.OwnSkillInfo[0].IsValid())
|
||
{
|
||
var ownSkill = Singleton<ObjManager>.GetInstance().MainPlayer.OwnSkillInfo[0];
|
||
Singleton<ObjManager>.GetInstance().MainPlayer.RemoveSelectTarget();
|
||
Singleton<ObjManager>.GetInstance().MainPlayer.TryStartTargetSkill(ownSkill);
|
||
}
|
||
return;
|
||
}
|
||
}
|
||
// 弹出对话
|
||
AutoDialog(nMissionID);
|
||
}
|
||
}
|