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

122 lines
3.6 KiB
C#

using GCGame.Table;
using System.Collections.Generic;
using Games.LogicObj;
using UnityEngine;
using Games.Scene;
public class AutoSearchTelePort
{
public class Node
{
public Node _Parent;
public int _sceneID;
public Node(int sceneID,Node Parent)
{
_sceneID = sceneID;
_Parent = Parent;
}
}
List<int> sweapeds = new List<int>();
List<int> TelePaths = new List<int>();
private int m_destentSceneID = -1;
private int m_destentInsID = -1;
private float m_destentPosX = -1;
private float m_destentPosZ = -1;
public void SetMapConnectPath(int desSceneID, float PosX, float PosZ, int insID = -1)
{
TelePaths.Clear();
sweapeds.Clear();
m_destentSceneID = desSceneID;
m_destentInsID = insID; //分线ID
m_destentPosX = PosX;
m_destentPosZ = PosZ;
CreateNode(GameManager.gameManager.RunningScene, null);
}
private bool CreateNode(int sceneID,Node Parent)
{
if(sceneID == m_destentSceneID)
{
while(Parent!=null)
{
TelePaths.Insert(0,Parent._sceneID);
Parent = Parent._Parent;
}
TelePaths.Add(m_destentSceneID);
ChangeSceneOver();
return true;
}
if (sweapeds.Contains(sceneID)) //环路的处理
return false;
sweapeds.Add(sceneID);
Node root = new Node(sceneID, Parent);
var teles = TableManager.GetTeleport().Values;
foreach (var tele in teles)
{
if(tele.SrcSceneID == sceneID)
{
if (CreateNode(tele.DstSceneID, root))
return true;
}
}
return false;
}
public void Stop()
{
TelePaths.Clear();
}
public void ChangeSceneOver()
{
if (TelePaths == null || TelePaths.Count <= 0)
return;
if (TelePaths.Contains(GameManager.gameManager.RunningScene))
TelePaths.RemoveAt(0);
int nextScene = TelePaths.Count>0?TelePaths[0]: GameManager.gameManager.RunningScene;
if(Singleton<ObjManager>.Instance.MainPlayer==null)
{
Stop();
return;
}
//到达目标场景
if(GameManager.gameManager.RunningScene == m_destentSceneID)
{
//切一下分线
if(m_destentInsID != -1 && SceneData.SceneInst != m_destentInsID)
{
var packet =
(CG_SCENE_CHANGEINST)PacketDistributed.CreatePacket(MessageID.PACKET_CG_SCENE_CHANGEINST);
packet.SetSceneInst(m_destentInsID);
packet.SendPacket();
return;
}
else
{
var pos = new Vector3(m_destentPosX, 0, m_destentPosZ);
pos = ActiveScene.GetTerrainPosition(pos);
Singleton<ObjManager>.Instance.MainPlayer.MainPlayMoveToPos(pos, 1.5f, bIsAutoSearch: true);
Stop();
return;
}
}
var teles = TableManager.GetTeleport().Values;
foreach (var tele in teles)
{
if(tele.SrcSceneID == GameManager.gameManager.RunningScene && tele.DstSceneID == nextScene)
{
var pos = new Vector3(tele.SrcPosX, 0, tele.SrcPosZ);
pos = ActiveScene.GetTerrainPosition(pos);
Singleton<ObjManager>.Instance.MainPlayer.MainPlayMoveToPos(pos, 1.5f, bIsAutoSearch: true);
return;
}
}
Stop();
}
}