Files
JJBB/Assets/Project/Script/Player/Mission/DialogCore.cs

566 lines
21 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
/********************************************************************************
* 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);
}
}