122 lines
3.6 KiB
C#
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();
|
|
}
|
|
} |