Files
JJBB/Assets/Project/Script/Player/Mission/DialogCore.cs
2024-08-23 15:49:34 +08:00

566 lines
21 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************************
* 文件名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);
}
}