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

870 lines
32 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.

/********************************************************************************
* 文件名: AutoSearchAgent.cs
* 全路径: \Script\Player\AutoSearch\AutoSearchAgent.cs
* 创建人: 李嘉
* 创建时间2014-01-02
*
* 功能说明:自动寻路代理,只要建立一个路径,就会自动控制主角进行自动寻路
* 寻路的具体路径保存在AutoSearchPath中
* 修改记录:
*********************************************************************************/
using Games.Events;
using Games.GlobeDefine;
using Games.LogicObj;
using Games.Scene;
using GCGame.Table;
using Module.Log;
using System.Collections.Generic;
using UnityEngine;
public struct MapConnectPath
{
//起始点
public int SrcSceneId { get; set; }
//结束点
public int DstSceneId { get; set; }
//传送点坐标X
public float TelePosX { get; set; }
//传送点坐标Y
public float TelePosZ { get; set; }
}
public class AutoSearchAgent : MonoBehaviour
{
//寻路最短距离的最大值
private const int m_nMinDistanceMaxValue = 65535;
// 切换场景时,寻路器锁定时间
private const float _sceneChangeLockTime = 2f;
//更新时间间隔
private readonly float m_fChangeSceneInterval = 5f; //跳场景更新时间间隔,单位为秒
private readonly float m_fUpdateInterval = 0.50f; //更新时间间隔,单位为秒
//是否自动寻路中标记位
private bool _isAutoSearching;
// 切换场景时,锁定寻路器一段时间
public static float unlockTime;
private int m_AutoSearchTargetID = -1;
private string m_AutoSearchTargetName;
private int m_bNotEnamyNpcFlag; // 非敌对NPC标记 避免NPC多余遍历
//场景通路图,可以在游戏开始后初始化
private List<MapConnectPath> m_ConnectPath;
private AutoSearchPoint m_EndPointCache;
public AutoSearchPoint EndPointCache
{
get
{
return m_EndPointCache;
}
}
private float m_fLastChangeGuildSceneUpdateTime; //上一次切换帮会场景时间
private float m_fLastChangeSceneInstUpdateTime; //上一次更新时间
private float m_fLastUpdateTime; //上一次更新时间
private bool _MissionFlyChangeSceneFlag = false;
public AutoSearchAgent()
{
FLastChangeSceneUpdateTime = 0;
}
// 自动寻路路径
public AutoSearchPath Path { get; set; }
public bool _IsNetAsk = false;
public bool IsAutoSearching
{
get { return _isAutoSearching; }
set
{
_isAutoSearching = value;
if (!_isAutoSearching && CenterTipsLogic.Instance()!=null)
{
CenterTipsLogic.Instance().OnAutoMoveStateChange();
}
}
}
//场景显示路标的
private RoadSignManager m_RoadSignManager = null;
public RoadSignManager RoadSignManager
{
get
{
if (m_RoadSignManager == null)
m_RoadSignManager = new RoadSignManager();
return m_RoadSignManager;
}
}
//多场景寻路
private AutoSearchTelePort m_AutoSearchTelePort = null;
public AutoSearchTelePort AutoSearchTelePort
{
get {
if (m_AutoSearchTelePort == null)
m_AutoSearchTelePort = new AutoSearchTelePort();
return m_AutoSearchTelePort;
}
}
public float FLastChangeSceneUpdateTime { set; get; }
//初始化场景通路图
public void InitMapConnectPath()
{
if (GameManager.gameManager.RunningScene == (int) GameDefine_Globe.SCENE_DEFINE.SCENE_LOGIN)
return;
//说明已经初始化过无需再次调用Init函数整个游戏过程中初始化一次即可
if (null != m_ConnectPath)
return;
//生成完整通路图
m_ConnectPath = new List<MapConnectPath>();
foreach (var key in TableManager.GetMapConnection().Keys)
{
var tableList = TableManager.GetMapConnectionByID(key);
if (null != tableList)
foreach (var conect in tableList)
{
var path = new MapConnectPath
{
SrcSceneId = conect.SourceSceneID,
DstSceneId = conect.DestSceneID,
TelePosX = conect.TelePosX,
TelePosZ = conect.TelePosZ
};
m_ConnectPath.Add(path);
}
}
}
//初始化
private void Awake()
{
Path = new AutoSearchPath();
Path.ResetPath();
IsAutoSearching = false;
m_EndPointCache = new AutoSearchPoint();
//InitMapConnectPath();
}
private void OnDestroy()
{
if (m_RoadSignManager != null)
m_RoadSignManager.OnDestroy();
}
public void LockAutoSearch(float time = _sceneChangeLockTime)
{
unlockTime = Time.realtimeSinceStartup + time;
}
private void LateUpdate()
{
RoadSignManager.UpdateSign();
}
private void Update()
{
//未寻路,不更新
if (!IsAutoSearching || Time.realtimeSinceStartup < unlockTime)
return;
//判断是否到了更新间隔
if (Time.time - m_fLastUpdateTime < m_fUpdateInterval) return;
m_fLastUpdateTime = Time.time;
var mainPlayer = ObjManager.Instance.MainPlayer;
if (null == mainPlayer)
return;
if (GameManager.gameManager.RunningScene != m_EndPointCache.SceneID)
{
// 注:传送是一个技能,因此需要满足技能使用条件
if (mainPlayer.CheckCanCastSkill() != SkillCastableCheckResult.Success
|| !mainPlayer.SkillAllowSkill
|| Time.time - FLastChangeSceneUpdateTime < m_fChangeSceneInterval)
return;
if (m_EndPointCache.GuildGuid != SceneData.sceneGuildGuid)
if (m_EndPointCache.GuildGuid != GlobeVar.INVALID_GUID)
{
FLastChangeSceneUpdateTime = Time.time;
mainPlayer.BackGuildMap(m_EndPointCache.GuildGuid);
return;
}
FLastChangeSceneUpdateTime = Time.time;
var sceneInfo = TableManager.GetSceneClassByID(m_EndPointCache.SceneID, 0);
if (sceneInfo != null)
{
if (m_EndPointCache.ChangeMapType == AutoSearchPoint.ChangeMap_Type.WORLDMAP)
{
SceneData.RequestChangeScene((int)m_EndPointCache.ChangeMapType, 0, m_EndPointCache.SceneID,
m_EndPointCache.SceneInstID, (int)sceneInfo.SafeX, (int)sceneInfo.SafeZ);
}
else
{
SceneData.RequestChangeScene((int)m_EndPointCache.ChangeMapType, 0, m_EndPointCache.SceneID,
m_EndPointCache.SceneInstID, (int)m_EndPointCache.PosX * 100, (int)m_EndPointCache.PosZ * 100);
}
return;
}
}
else
{
if (m_EndPointCache.SceneInstID != -1 && SceneData.SceneInst != m_EndPointCache.SceneInstID)
{
if (Time.time - FLastChangeSceneUpdateTime < m_fChangeSceneInterval)
return;
FLastChangeSceneUpdateTime = Time.time;
var packet =
(CG_SCENE_CHANGEINST) PacketDistributed.CreatePacket(MessageID.PACKET_CG_SCENE_CHANGEINST);
packet.SetSceneInst(m_EndPointCache.SceneInstID);
packet.SendPacket();
return;
}
if (m_EndPointCache.ChangeMapType == AutoSearchPoint.ChangeMap_Type.MISSIONFLY)
{
if (!_MissionFlyChangeSceneFlag)
{
UnityEngine.AI.NavMeshPath navMeshPath = new UnityEngine.AI.NavMeshPath();
bool needFly = false;
if (UnityEngine.AI.NavMesh.CalculatePath(mainPlayer.Position, new Vector3(m_EndPointCache.PosX, mainPlayer.Position.y, m_EndPointCache.PosZ), 1, navMeshPath))
{
if (navMeshPath.GetTotalDistance() < 10)
{
needFly = false;
}
else
{
needFly = true;
}
}
else
{
needFly = true;
}
if (needFly)
{
SceneData.RequestChangeScene((int)m_EndPointCache.ChangeMapType, 0, m_EndPointCache.SceneID,
m_EndPointCache.SceneInstID, (int)m_EndPointCache.PosX * 100, (int)m_EndPointCache.PosZ * 100);
_MissionFlyChangeSceneFlag = true;
#if UNITY_EDITOR
GUIData.AddNotifyData("飞鞋传送场景:" + m_EndPointCache.SceneID + "," + m_EndPointCache.PosX + "," + m_EndPointCache.PosZ);
Debug.Log("飞鞋传送场景:" + m_EndPointCache.SceneID + "," + m_EndPointCache.PosX + "," + m_EndPointCache.PosZ);
#endif
return;
}
else
{
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{86104}"));
}
}
}
if (m_EndPointCache.GuildGuid != SceneData.sceneGuildGuid)
if (m_EndPointCache.GuildGuid != GlobeVar.INVALID_GUID)
{
if (Time.time - m_fLastChangeGuildSceneUpdateTime < m_fChangeSceneInterval)
return;
m_fLastChangeGuildSceneUpdateTime = Time.time;
mainPlayer.BackGuildMap(m_EndPointCache.GuildGuid);
return;
}
}
FLastChangeSceneUpdateTime = 0;
m_fLastChangeSceneInstUpdateTime = 0;
m_fLastChangeGuildSceneUpdateTime = 0;
//寻路中首先判断是否结束
if (Path.IsFinish(mainPlayer.transform.position))
Finish();
// 如果角色停止移动或者到达位置,则重新开始移动
else if (Path.IsReachPoint(mainPlayer.transform.position) || mainPlayer.MovementState == MoveState.Static)
BeginMove();
//else if (Path.IsReachPoint(mainPlayer.transform.position))
// GotoNextPoint();
////如果此时未移动,则前往下一个点
//else if (mainPlayer.MovementState == MoveState.Static)
// BeginMove();
}
// 寻路找怪处理
// private void FindEnamyTick()
// {
// if (m_bNotEnamyNpcFlag != 0) return;
//
// //如果有目标名字则寻找该目标,进行交互
// if (Path.AutoSearchTargetName != "")
// {
// var obj = Singleton<ObjManager>.GetInstance()
// .FindObjCharacterInSceneByName(Path.AutoSearchTargetName);
// if (obj && obj.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_NPC)
// {
// var objNpc = obj as Obj_NPC;
// //根据目标NPC的势力确认是对话还是攻击
// if (Reputation.IsEnemy(objNpc) || Reputation.IsNeutral(objNpc))
// {
// Singleton<ObjManager>.GetInstance().MainPlayer.StopMove();
// Path.AutoSearchPosCache.Clear();
// Path.ResetPath();
// IsAutoSearching = false;
// m_EndPointCache.Clean();
//
// //如果是地方NPC则开始攻击
// Singleton<ObjManager>.GetInstance().MainPlayer.OnEnterCombat(objNpc);
// Singleton<ObjManager>.GetInstance().MainPlayer.EnterAutoCombat();
// m_bNotEnamyNpcFlag = 1;
// }
// else
// {
// m_bNotEnamyNpcFlag = 2;
// }
// }
// }
// }
//创建一条路径并且在Update中判断是否抵达
public void BuildPath(AutoSearchPoint endPoint, bool isNetAsk = false, string searchName = null, float dialogRadius = -1)
{
if(GameManager.gameManager.PlayerDataPool.IsInWeddingCar)
{
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{26013}"));
return;
}
//正在播放剧情
if (SceneMovieManager.Instance._PlayingMovie)
return;
if (Singleton<ObjManager>.Instance.MainPlayer.IsInPaoShang() && RoadSignManager.ShowSign)
{
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("{#34013}"));
return;
}
//组队跟随,不响应
if (GameManager.gameManager.PlayerDataPool.IsFollowTeam)
{
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{5128}"));
return;
}
var _mainPlayer = Singleton<ObjManager>.GetInstance().MainPlayer;
if (null == _mainPlayer) return;
if (GameManager.gameManager.ActiveScene.IsCopyScene() == false)
_mainPlayer.LeveAutoCombat();
// 同一个点,直接跳过
if (m_EndPointCache.SceneID == endPoint.SceneID
&& m_EndPointCache.PosX == endPoint.PosX
&& m_EndPointCache.PosZ == endPoint.PosZ
&& m_EndPointCache.ChangeMapType == endPoint.ChangeMapType)
return;
_MissionFlyChangeSceneFlag = false;
//停止正在进行的移动
if (_mainPlayer.MovementState > MoveState.Static)
_mainPlayer.StopMove();
if (OneDragonAuto.One_DragonAuto != null && isNetAsk)
OneDragonAuto.One_DragonAuto.NeedCheckOneDragonEnterCopy = false;
m_EndPointCache = endPoint;
Path.ResetPath();
m_bNotEnamyNpcFlag = 0;
Path.AddPathPoint(endPoint);
_IsNetAsk = isNetAsk;
if (searchName != null)
Path.AutoSearchTargetName = searchName;
if (dialogRadius != -1)
Path.autoSearchRadius = dialogRadius;
//设置开始自动寻路
IsAutoSearching = true;
// 如果是队长,让队员进入组队跟随
if (GameManager.gameManager.PlayerDataPool.TeamInfo.IsCaptain())
_mainPlayer.TeamLeaderEndCombat();
//如果是当前场景,则直接生成单点路径,进行移动
// if (GameManager.gameManager.RunningScene == endPoint.SceneID)
// {
// m_Path.AddPathPoint(endPoint);
// //设置开始自动寻路
// m_bIsAutoSearching = true;
// return;
// }
//根据当前点和目的地点来确定路径
// AutoSearchPoint startPoint = AutoSearchPoint.MakePoint(_mainPlayer.gameObject);
// if (true == FindPath(startPoint, endPoint))
// {
// m_bIsAutoSearching = true;
// return;
// }
}
//获得两个场景的通路长度
private int GetDisBySceneID(int srcId, int dstId)
{
foreach (var path in m_ConnectPath)
if (path.SrcSceneId == srcId && path.DstSceneId == dstId)
return 1;
return m_nMinDistanceMaxValue;
}
//搜索路径算法根据DJ算法生成最短路径
private bool FindPath(AutoSearchPoint startPoint, AutoSearchPoint endPoint)
{
var path = new List<int>(); //最后生成的最短路径图
//统计所有节点计算srcid的逆临街表放在nodeMap中
var nodeMap = new Dictionary<int, PathNodeInfo>();
foreach (var connectPath in m_ConnectPath)
{
if (false == nodeMap.ContainsKey(connectPath.SrcSceneId))
{
var info = new PathNodeInfo();
info.sceneId = connectPath.SrcSceneId;
info.dis = GetDisBySceneID(startPoint.SceneID, info.sceneId);
info.prevNode = startPoint.SceneID;
nodeMap.Add(info.sceneId, info);
}
if (false == nodeMap.ContainsKey(connectPath.DstSceneId))
{
var info = new PathNodeInfo();
info.sceneId = connectPath.DstSceneId;
info.dis = GetDisBySceneID(startPoint.SceneID, info.sceneId);
info.prevNode = startPoint.SceneID;
nodeMap.Add(info.sceneId, info);
}
}
var openList = new List<int>();
var closeList = new List<int>();
//放入开始点
openList.Add(startPoint.SceneID);
while (openList.Count > 0)
{
var minPt = openList[0];
var minDis = m_nMinDistanceMaxValue;
foreach (var openPoint in openList)
{
if (!nodeMap.ContainsKey(openPoint)) continue;
if (nodeMap[openPoint].dis < minDis)
{
minPt = openPoint;
minDis = nodeMap[openPoint].dis;
}
}
var minDisNode = minPt;
openList.Remove(minDisNode);
closeList.Add(minDisNode);
//展开该节点,更新所有邻接表的距离并把下一个或几个最短路径上的点放入openList。
foreach (var connectPath in m_ConnectPath)
if (connectPath.SrcSceneId == minDisNode)
{
var newDis = nodeMap[minDisNode].dis + GetDisBySceneID(minDisNode, connectPath.DstSceneId);
if (newDis < nodeMap[connectPath.DstSceneId].dis)
{
nodeMap[connectPath.DstSceneId].dis = newDis;
nodeMap[connectPath.DstSceneId].prevNode = minDisNode;
}
if (!openList.Contains(connectPath.DstSceneId) && !closeList.Contains(connectPath.DstSceneId))
openList.Add(connectPath.DstSceneId);
}
}
if (!nodeMap.ContainsKey(endPoint.SceneID)) return false;
//这里生成最短路径和下一个场景号,这里的邻接表已经记录了最短路径信息
if (nodeMap[endPoint.SceneID].dis < m_nMinDistanceMaxValue)
{
path.Insert(0, endPoint.SceneID);
var backId = nodeMap[endPoint.SceneID].prevNode;
while (backId != -1)
{
if (backId == startPoint.SceneID)
{
//int nextScn = path[0];
path.Insert(0, backId);
break;
}
path.Insert(0, backId);
backId = nodeMap[backId].prevNode;
}
}
if (path.Count > 1)
{
//生成路径
var beginScene = path[0];
var endScene = -1;
for (var i = 1; i < path.Count; ++i)
{
endScene = path[i];
foreach (var connectPath in m_ConnectPath)
if (connectPath.SrcSceneId == beginScene && connectPath.DstSceneId == endScene)
{
var point = new AutoSearchPoint(connectPath.SrcSceneId, connectPath.TelePosX,
connectPath.TelePosZ);
Path.AutoSearchPosCache.Add(point);
beginScene = endScene;
}
}
//最后加入目标点
Path.AutoSearchPosCache.Add(endPoint);
return true;
}
return false;
}
//切换场景的时候判断一下是否是自动寻路,如果不是自动寻路的就清除一下自动寻路的数据
public void OnChangeScene(int sceneId)
{
if(sceneId == -1)
{
StopAutoSerach();
return;
}
if (Path == null)
return;
if (Path.GetPathPosition(sceneId) == null) StopAutoSerach();
}
//寻路到帮会场景
public void BackGuild(ulong guildId, int roleId, float x, float z)
{
if (roleId == -1)
{
var guid = GameManager.gameManager.PlayerDataPool.GuildInfo.GuildGuid;
var mainPlayer = ObjManager.Instance.MainPlayer;
if (mainPlayer != null)
mainPlayer.BackGuildMap(guid);
else
{
// 保持之前玩家未创建也可以发送协议的逻辑
var send =
(CG_REQ_ENTER_GUILDMAP) PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_ENTER_GUILDMAP);
send.SetGuildGuid(guid);
send.SendPacket();
}
return;
}
var guildOther = TableManager.GetGuildOtherByID(0, 0);
if (guildOther != null)
{
var GuildSceneId = guildOther.SceneId;
var point = new AutoSearchPoint(GuildSceneId, x, z, -1, AutoSearchPoint.ChangeMap_Type.WORLDMAP,
guildId);
var RoleBase = TableManager.GetRoleBaseAttrByID(roleId, 0);
if (null != RoleBase && null != Path)
{
BuildPath(point);
Path.AutoSearchTargetName = RoleBase.Name;
Path.autoSearchRadius = RoleBase.DialogRadius;
}
}
}
public void StopAutoSerach()
{
FLastChangeSceneUpdateTime = 0;
m_fLastChangeGuildSceneUpdateTime = 0;
m_fLastChangeSceneInstUpdateTime = 0;
Path.ResetPath();
IsAutoSearching = false;
m_EndPointCache.Clean();
m_AutoSearchTargetName = "";
m_AutoSearchTargetID = -1;
if(Singleton<ObjManager>.Instance.MainPlayer!=null)
Singleton<ObjManager>.Instance.MainPlayer.StopMove();
}
//停止自动寻路
public void Stop()
{
StopAutoSerach();
AutoSearchTelePort.Stop();
}
public static UnityEngine.AI.NavMeshPath tempPath
{
get
{
if (_tempPath == null)
_tempPath = new UnityEngine.AI.NavMeshPath();
return _tempPath;
}
}
private static UnityEngine.AI.NavMeshPath _tempPath;
//向最新点移动
private void BeginMove()
{
var mainPlayer = ObjManager.Instance.MainPlayer;
if (null == mainPlayer)
return;
if (Path.AutoSearchPosCache.Count > 0)
{
//首先检测场景是否对应,如果不对则直接返回
if (GameManager.gameManager.RunningScene != m_EndPointCache.SceneID)
{
if (m_EndPointCache.GuildGuid != SceneData.sceneGuildGuid)
if (m_EndPointCache.GuildGuid != GlobeVar.INVALID_GUID)
{
FLastChangeSceneUpdateTime = Time.time;
Singleton<ObjManager>.Instance.MainPlayer.BackGuildMap(m_EndPointCache.GuildGuid);
return;
}
var sceneInfo = TableManager.GetSceneClassByID(m_EndPointCache.SceneID, 0);
if (sceneInfo != null)
{
if (m_EndPointCache.ChangeMapType == AutoSearchPoint.ChangeMap_Type.WORLDMAP)
{
SceneData.RequestChangeScene((int)m_EndPointCache.ChangeMapType, 0, m_EndPointCache.SceneID,
m_EndPointCache.SceneInstID, (int)sceneInfo.SafeX, (int)sceneInfo.SafeZ);
}
else
{
SceneData.RequestChangeScene((int)m_EndPointCache.ChangeMapType, 0, m_EndPointCache.SceneID,
m_EndPointCache.SceneInstID, (int)m_EndPointCache.PosX * 100, (int)m_EndPointCache.PosZ * 100);
}
return;
}
}
else
{
if (m_EndPointCache.SceneInstID != -1 && SceneData.SceneInst != m_EndPointCache.SceneInstID)
{
var packet =
(CG_SCENE_CHANGEINST)PacketDistributed.CreatePacket(MessageID.PACKET_CG_SCENE_CHANGEINST);
packet.SetSceneInst(m_EndPointCache.SceneInstID);
packet.SendPacket();
return;
}
if (m_EndPointCache.ChangeMapType == AutoSearchPoint.ChangeMap_Type.MISSIONFLY)
{
if (!_MissionFlyChangeSceneFlag)
{
UnityEngine.AI.NavMeshPath navMeshPath = new UnityEngine.AI.NavMeshPath();
bool needFly = false;
if (UnityEngine.AI.NavMesh.CalculatePath(mainPlayer.Position, new Vector3(m_EndPointCache.PosX, mainPlayer.Position.y, m_EndPointCache.PosZ), 1, navMeshPath))
{
if (navMeshPath.GetTotalDistance() < 10)
{
needFly = false;
}
else
{
needFly = true;
}
}
else
{
needFly = true;
}
if (needFly)
{
SceneData.RequestChangeScene((int)m_EndPointCache.ChangeMapType, 0, m_EndPointCache.SceneID,
m_EndPointCache.SceneInstID, (int)m_EndPointCache.PosX * 100, (int)m_EndPointCache.PosZ * 100);
_MissionFlyChangeSceneFlag = true;
#if UNITY_EDITOR
GUIData.AddNotifyData("飞鞋传送场景:" + m_EndPointCache.SceneID + "," + m_EndPointCache.PosX + "," + m_EndPointCache.PosZ);
Debug.Log("飞鞋传送场景:" + m_EndPointCache.SceneID + "," + m_EndPointCache.PosX + "," + m_EndPointCache.PosZ);
#endif
return;
}
}
}
if (m_EndPointCache.GuildGuid != SceneData.sceneGuildGuid)
if (m_EndPointCache.GuildGuid != GlobeVar.INVALID_GUID)
{
Singleton<ObjManager>.Instance.MainPlayer.BackGuildMap(m_EndPointCache.GuildGuid);
return;
}
}
//todo 武场特殊处理一下,后续一定要完善高度图误差
// if (GameManager.gameManager.RunningScene == (int)GameDefine_Globe.SCENE_DEFINE.SCENE_WUCHANG)
// {
// pos.y = 18.5f;
// }
if (mainPlayer.IsCanAcceptMoveOrder(true))
{
var pos = new Vector3(m_EndPointCache.PosX, 0, m_EndPointCache.PosZ);
pos = ActiveScene.GetTerrainPosition(pos);
if (CenterTipsLogic.Instance() != null)
{
CenterTipsLogic.Instance().OnAutoMoveStateChange();
}
var stopRange = Mathf.Max(0f, Path.autoSearchRadius);
mainPlayer.MainPlayMoveToPos(pos, stopRange, bIsAutoSearch: true);
if (IsAutoSearching &&
null != GameManager.gameManager.AutoSearch &&
GameManager.gameManager.AutoSearch.IsAutoSearching
&& GameManager.gameManager.PlayerDataPool.m_objMountParam.AdvanceMountId < 1 //当前有坐骑但是你没有骑乘
&& GameManager.gameManager.PlayerDataPool.m_objMountParam.AutoFlagMountID > 0)
{
if (mainPlayer.NavAgent != null && mainPlayer.NavAgent.isActiveAndEnabled &&
mainPlayer.NavAgent.hasPath)
{
var distance = mainPlayer.NavAgent.path.GetTotalDistance();
if ( /*distance > 50f &&*/ distance >= 10f)
mainPlayer.AskRideMount(false);
}
}
}
}
}
//自动寻路结束
private void Finish()
{
//如果有结束后的回调事件则回调
if (null != Path.FinishCallBackEvent &&
GameDefine_Globe.EVENT_DEFINE.EVENT_INVALID != Path.FinishCallBackEvent.EventID)
Singleton<EventSystem>.GetInstance().PushEvent(Path.FinishCallBackEvent);
if (Path.finishCallBack != null) Path.finishCallBack(Path.callBackParam);
m_AutoSearchTargetName = Path.AutoSearchTargetName;
m_AutoSearchTargetID = Path.AutoSearchTargetID;
AgentToNPC();
m_EndPointCache.Clean();
Path.ResetPath();
IsAutoSearching = false;
m_fLastUpdateTime = 0;
}
public void AgentToNPC(Obj_NPC npc = null)
{
if (npc != null && IsAutoSearching && Path.AutoSearchTargetRoleID != -1 && Path.AutoSearchTargetRoleID == npc.BaseAttr.RoleBaseID)
{
Stop();
Path.AutoSearchTargetRoleID = -1;
AutoSearchPoint point = new AutoSearchPoint(GameManager.gameManager.RunningScene, npc.Position.x, npc.Position.z, SceneData.SceneInst, AutoSearchPoint.ChangeMap_Type.WORLDMAP, SceneData.sceneGuildGuid);
if (GameManager.gameManager && GameManager.gameManager.AutoSearch)
{
GameManager.gameManager.AutoSearch.BuildPath(point);
GameManager.gameManager.AutoSearch.Path.AutoSearchTargetID = npc.ServerID;
GameManager.gameManager.AutoSearch.Path.autoSearchRadius = 1.5f;
}
return;
}
//如果有目标名字则寻找该目标,进行交互
if (m_AutoSearchTargetName != "" || m_AutoSearchTargetID != -1)
{
var obj = ObjManager.Instance.FindObjCharacterInScene(m_AutoSearchTargetID);
if (obj == null)
obj = ObjManager.Instance.FindObjCharacterInSceneByName(m_AutoSearchTargetName);
var mainPlayer = ObjManager.Instance.MainPlayer;
if (mainPlayer && obj && obj.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_NPC)
{
m_AutoSearchTargetName = "";
m_AutoSearchTargetID = -1;
var objNpc = (Obj_NPC)obj;
//根据目标NPC的势力确认是对话还是攻击
if (Reputation.CanAttack(objNpc))
{
//如果是地方NPC则开始攻击
if (!mainPlayer.isAutoCombat)
mainPlayer.OnEnterCombat(objNpc);
mainPlayer.EnterAutoCombat();
}
else
{
mainPlayer.SetClientTargetByClick(objNpc);
}
}
return;
}
}
//当自动寻路过程中遇到传送点
public void ProcessTelepoint(Obj_TeleportPoint telePoint)
{
//传送点数据异常,返回
if (null == telePoint || null == telePoint.gameObject) return;
//非自动寻路状态,返回
if (!IsAutoSearching) return;
//自动寻路状态,并且路径中有数值
if (Path.AutoSearchPosCache.Count > 0)
{
//判断是不是本次跨场景寻路所需传送点
var autoSearchPoint = new Vector2(Path.AutoSearchPosCache[0].PosX, Path.AutoSearchPosCache[0].PosZ);
var telePortPoint = new Vector2(telePoint.gameObject.transform.position.x,
telePoint.gameObject.transform.position.z);
//距离校验因为自动寻路点为2D所以转化为2D坐标验证
if (Vector2.Distance(autoSearchPoint, telePortPoint) <= 3.0f)
{
Path.AutoSearchPosCache.RemoveAt(0);
//如果此时路径点中无数据,则结束自动寻路
if (Path.AutoSearchPosCache.Count == 0) Finish();
}
}
}
private class PathNodeInfo
{
public int dis;
public int prevNode;
public int sceneId;
public PathNodeInfo()
{
sceneId = -1;
dis = m_nMinDistanceMaxValue;
prevNode = -1;
}
}
}