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 sweapeds = new List(); List TelePaths = new List(); 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.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.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.Instance.MainPlayer.MainPlayMoveToPos(pos, 1.5f, bIsAutoSearch: true); return; } } Stop(); } }