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

363 lines
12 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Games.Mission;
using Games.Scene;
using GCGame.Table;
using UnityEngine;
//主要是处理主角到某个点路径路标显示
public class RoadSignManager
{
public enum RoadType
{
None,
Mission,
Gharry
}
public int _LastChangeSceneType = (int) CG_REQ_CHANGE_SCENE.CHANGETYPE.TELEPORT;
private float LastUpdateTime;
private readonly List<GameObject> m_CacheSignObjs = new List<GameObject>();
private Vector3 m_CurrDestentPos = Vector3.zero;
private float m_destentPosX = -1;
private float m_destentPosZ = -1;
private int m_destentSceneID = -1;
private float m_LastInputTime;
private int m_RoadTypeNumber; //标记当前的路标是哪个系统添加的 算法 RoadType*100000+index
private GameObject SignCloneObj;
private readonly List<int> sweapeds = new List<int>();
public RoadSignManager()
{
ShowSign = false;
}
public bool ShowSign { get; private set; }
private int GetRoadTypeNumber(RoadType type, int index)
{
return (int) type * 100000 + index;
}
public void InitRoadSignData(RoadType type, int index, int desSceneID, float PosX, float PosZ)
{
m_RoadTypeNumber = GetRoadTypeNumber(type, index);
m_destentSceneID = desSceneID;
m_destentPosX = PosX;
m_destentPosZ = PosZ;
CreateRoadSign();
}
public void AutoMoveStart()
{
if (GameManager.gameManager.AutoSearch.IsAutoSearching || m_CurrDestentPos == Vector3.zero)
return;
ShowSign = false;
var point = new AutoSearchPoint(GameManager.gameManager.RunningScene, m_CurrDestentPos.x, m_CurrDestentPos.z);
if (GameManager.gameManager && GameManager.gameManager.AutoSearch)
{
GameManager.gameManager.AutoSearch.BuildPath(point);
var mission = GameManager.gameManager.MissionManager.GetMissionByType(MISSIONTYPE.MISSION_GUILDPAOSHANG);
if (m_destentSceneID == GameManager.gameManager.RunningScene && mission != null && mission.m_yStatus == 1)
{
//判断当前任务是否需要寻找NPC提交
var missionDic = TableManager.GetMissionDictionaryByID(mission.m_nMissionID);
if (missionDic != null)
{
var roleBase = TableManager.GetRoleBaseAttrByID(missionDic.CompleteNpcDataID);
if (roleBase != null) GameManager.gameManager.AutoSearch.Path.AutoSearchTargetName = roleBase.Name;
}
}
GameManager.gameManager.AutoSearch.Path.autoSearchRadius = 1.5f;
if (m_RoadTypeNumber == GetRoadTypeNumber(RoadType.Gharry, 0))
GameManager.gameManager.AutoSearch.Path.finishCallBack = delegate { RoadStateChange(Vector3.zero); };
}
ShowSign = true;
}
private void CreateRoadSign()
{
sweapeds.Clear();
if (SignCloneObj == null) InitSignGameObject();
if (GameManager.gameManager.RunningScene != m_destentSceneID)
CreateNode();
else
Start(m_destentPosX, m_destentPosZ);
}
private void InitSignGameObject()
{
LoadAssetBundle.Instance.LoadGameObject(LoadAssetBundle.BUNDLE_PATH_EFFECT, "tx_ui_lubiao",
delegate(string assetName, GameObject resObj, Hashtable hashParam) { SignCloneObj = resObj; },
new Hashtable());
}
private void FindPathOver(Node node)
{
if (node == null)
return;
var nextScene = -1;
while (node != null)
{
if (node._Parent != null && node._Parent._sceneID == GameManager.gameManager.RunningScene)
{
nextScene = node._sceneID;
break;
}
node = node._Parent;
}
if (nextScene == -1)
return;
var teles = TableManager.GetTeleport().Values;
foreach (var tele in teles)
if (tele.SrcSceneID == GameManager.gameManager.RunningScene && tele.DstSceneID == nextScene)
Start(tele.SrcPosX, tele.SrcPosZ);
}
private bool CreateNode()
{
var LeafNodes = new List<Node>();
var Nodes = new List<Node>();
Nodes.Add(new Node(GameManager.gameManager.RunningScene, null));
while (Nodes.Count > 0)
{
for (var n = 0; n < Nodes.Count; n++)
{
var teles = TableManager.GetTeleport().Values;
foreach (var tele in teles)
if (tele.SrcSceneID == Nodes[n]._sceneID)
{
if (sweapeds.Contains(tele.DstSceneID)) //环路的处理
continue;
sweapeds.Add(tele.DstSceneID);
var node = new Node(tele.DstSceneID, Nodes[n]);
LeafNodes.Add(node);
if (tele.DstSceneID == m_destentSceneID)
{
FindPathOver(node);
return true;
}
}
}
Nodes.Clear();
Nodes.AddRange(LeafNodes);
LeafNodes.Clear();
}
return true;
}
public void UpdateSign()
{
if (ShowSign == false || m_CurrDestentPos == Vector3.zero || LoadingWindow._IsLoadingScene)
return;
//需要处理多久玩家没操作
if (Input.touchCount > 0 || Input.anyKey || LoadingWindow._IsLoadingScene)
{
m_LastInputTime = Time.realtimeSinceStartup;
}
else if (m_LastInputTime + 8 < Time.realtimeSinceStartup)
{
m_LastInputTime = Time.realtimeSinceStartup;
AutoMoveStart();
}
if (Time.realtimeSinceStartup - LastUpdateTime < 0.5f)
return;
LastUpdateTime = Time.realtimeSinceStartup;
if (Singleton<ObjManager>.Instance.MainPlayer == null) return;
if (SignCloneObj == null)
{
InitSignGameObject();
return;
}
ShowSignImage();
}
private void ShowSignImage()
{
var pointId = 0;
var totleDistanc = 0;
var distance = 0f;
var path = Singleton<ObjManager>.Instance.MainPlayer.NavAgent.path;
Singleton<ObjManager>.Instance.MainPlayer.NavAgent.CalculatePath(m_CurrDestentPos, path);
var lastPos = Vector3.zero;
var Pos = Vector3.zero;
Transform LastPoint = null;
var Shows = new List<GameObject>();
for (var i = 0; i < path.corners.Length; i++)
{
if (i + 1 >= path.corners.Length)
break;
var start = path.corners[i];
var end = path.corners[i + 1];
var length = Vector3.Distance(start, end);
while (distance < length)
{
// 最后一个点把长度保留到下一段路径
Pos = Vector3.Lerp(start, end, distance / length);
GameObject SignGameObj = null;
if (pointId < m_CacheSignObjs.Count)
{
SignGameObj = m_CacheSignObjs[pointId];
}
else
{
SignGameObj = Object.Instantiate(SignCloneObj);
SignGameObj.transform.SetParent(GameManager.gameManager.AutoSearch.transform);
SignGameObj.transform.localScale = Vector3.one;
m_CacheSignObjs.Add(SignGameObj);
}
pointId++;
Shows.Add(SignGameObj);
SignGameObj.transform.position = ActiveScene.GetTerrainPosition(Pos);
if (LastPoint != null)
LastPoint.LookAt(SignGameObj.transform);
LastPoint = SignGameObj.transform;
distance = distance + 3;
totleDistanc += 3;
if (totleDistanc > 20)
break;
}
distance -= length;
if (totleDistanc > 20)
break;
}
for (var i = 0; i < m_CacheSignObjs.Count; i++)
m_CacheSignObjs[i].SetActive(false);
for (var i = 1; i < Shows.Count - 1; i++) Shows[i].SetActive(true);
}
public void OnDestroy()
{
Clearup();
for (var i = 0; i < m_CacheSignObjs.Count; i++)
if (m_CacheSignObjs[i] != null)
{
Object.Destroy(m_CacheSignObjs[i]);
m_CacheSignObjs[i].SetActive(false);
}
m_CacheSignObjs.Clear();
}
private void Clearup()
{
m_destentSceneID = -1;
m_destentPosX = -1;
m_destentPosZ = -1;
m_RoadTypeNumber = 0;
if (GameManager.gameManager && GameManager.gameManager.AutoSearch)
GameManager.gameManager.AutoSearch.Stop();
m_CurrDestentPos = Vector3.zero;
ShowSign = false;
for (var i = 0; i < m_CacheSignObjs.Count; i++)
if (m_CacheSignObjs[i] != null)
m_CacheSignObjs[i].SetActive(false);
}
public void Start(float Posx, float Posz)
{
m_CurrDestentPos = ActiveScene.GetTerrainPosition(new Vector3(Posx, 0, Posz));
ShowSign = true;
UpdateSign();
AutoMoveStart();
}
public void Stop(RoadType type, int index)
{
if (GetRoadTypeNumber(type, index) != m_RoadTypeNumber)
return;
Clearup();
}
public void LeaveScene()
{
m_CurrDestentPos = Vector3.zero;
if (ShowSign)
GameManager.gameManager.AutoSearch.Stop();
}
public void ChangeSceneOver()
{
if (ShowSign == false)
return;
//如果是传送点并且不是去寻找马车就不请求马车的位置
if (_LastChangeSceneType != (int) CG_REQ_CHANGE_SCENE.CHANGETYPE.TELEPORT ||
m_RoadTypeNumber == GetRoadTypeNumber(RoadType.Gharry, 0))
AskGharryPos();
}
public void AskGharryPos()
{
var send = (CG_REQ_GHARRY_POS) PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_GHARRY_POS);
send.Nilparam = 1;
send.SendPacket();
}
public void RoadStateChange(Vector3 gharryPos)
{
if (Singleton<ObjManager>.Instance.MainPlayer == null)
return;
var mission = GameManager.gameManager.MissionManager.GetMissionByType(MISSIONTYPE.MISSION_GUILDPAOSHANG);
if (mission == null || mission.m_yStatus != 1)
return;
var missionDic = TableManager.GetMissionDictionaryByID(mission.m_nMissionID);
if (missionDic == null)
return;
var obj = Singleton<ObjManager>.Instance.FindObjCharacterInScene(GameManager.gameManager.PlayerDataPool
.nGharryObjID);
if (obj == null && gharryPos == Vector3.zero)
{
AskGharryPos();
return;
}
if (obj != null)
{
gharryPos = obj.Position;
gharryPos.y = GameManager.gameManager.RunningScene;
}
if ((int) gharryPos.y != GameManager.gameManager.RunningScene ||
Vector2.Distance(Singleton<ObjManager>.Instance.MainPlayer.Position.RemoveY(), gharryPos.RemoveY()) > 4)
GameManager.gameManager.AutoSearch.RoadSignManager.InitRoadSignData(RoadType.Gharry, 0, (int) gharryPos.y,
gharryPos.x, gharryPos.z);
else
GameManager.gameManager.AutoSearch.RoadSignManager.InitRoadSignData(RoadType.Mission, mission.m_nMissionID,
missionDic.CompleteNpcSceneID, missionDic.CompleteNpcPosX, missionDic.CompleteNpcPosZ);
}
public class Node
{
public List<Node> _Childs = new List<Node>();
public Node _Parent;
public int _sceneID;
public Node(int sceneID, Node Parent)
{
_sceneID = sceneID;
_Parent = Parent;
if (Parent != null)
Parent._Childs.Add(this);
_Childs.Clear();
}
}
}