/******************************************************************************** * 文件名: TeleportPoint.cs * 全路径: \Script\Player\TeleportPoint.cs * 创建人: 李嘉 * 创建时间:2013-10-25 * * 功能说明:游戏传送点逻辑 * 修改记录: *********************************************************************************/ using Games.Events; using Games.GlobeDefine; using GCGame; using GCGame.Table; using Module.Log; using UnityEngine; namespace Games.LogicObj { public class Obj_Teleport_Init_Data : ObjParent_Init_Data { public Tab_Teleport Teleport; public Obj_Teleport_Init_Data() { CleanUp(); } public override void CleanUp() { base.CleanUp(); Teleport = null; } } public class Obj_TeleportPoint : ObjParent { public Tab_Teleport teleportData; private bool _active; private TeleportDistanceModule _distanceModule; private bool m_bEnterPKSceneCancel; private GameObject _rootObj; public Obj_TeleportPoint() { m_ObjType = GameDefine_Globe.OBJ_TYPE.OBJ_TELEPORTPOINT; } public override UIPathData HeadUiPath { get { return Obj_NPCHeadUI.pathData; } } public override bool Init(ObjParent_Init_Data initData) { var result = base.Init(initData); if (!result) return false; var teleport = initData as Obj_Teleport_Init_Data; if (teleport == null || teleport.Teleport == null) { gameObject.SetActive(false); Destroy(gameObject); return false; } enabled = false; teleportData = teleport.Teleport; gameObject.name = "Teleport_" + teleportData.Id; _distanceModule = new TeleportDistanceModule(m_ObjTransform, teleportData.ActiveRadius); _active = true; return true; } protected override void Awake() { base.Awake(); _rootObj = transform.GetChild(0).gameObject; } protected void OnBecameVisible() { enabled = true; if (_rootObj) _rootObj.SetActive(true); } protected void OnBecameInvisible() { enabled = false; if (_rootObj) _rootObj.SetActive(false); } private void Update() { if (_active) { var mainPlayer = _distanceModule.UpdateDistance(); // 仅允许走路触发传送机制 // 客户端跟随的玩家不主动发起传送。如果之后修改为走路流程,也应该由服务器发起传送,以减少意料外情况的发生 if (mainPlayer != null && !mainPlayer.IsFollowTeam && mainPlayer.MovementState <= MoveState.MainPlayMove && !mainPlayer.IsMountClient()) if (teleportData.DstSceneID < 0) { LogModule.ErrorLog("同场景传送已经改为JumpPoint处理,检查Teleport配表并移动到Jump表中!"); } // 跨场景传送 else if (Utils.IsCanPK(teleportData.DstSceneID) && !Utils.IsIncPKValue(teleportData.DstSceneID)) { if (!m_bEnterPKSceneCancel) { // 永久锁定传送点,直到玩家做出决策 _active = false; MessageBoxLogic.OpenOKCancelBox(StrDictionary.GetClientDictionaryString("#{2672}"), "", EnterNonePKValueSceneOK, EnterNonePKValueSceneCancel); } } else { SendChangeScene(); } } } private void EnterNonePKValueSceneOK() { if (_distanceModule != null) { _distanceModule.RefreshTime(); _active = true; } if (teleportData != null) { SendChangeScene(); teleportData = null; m_bEnterPKSceneCancel = false; } } private void EnterNonePKValueSceneCancel() { if (_distanceModule != null) { _distanceModule.RefreshTime(); _active = true; } m_bEnterPKSceneCancel = true; } private void SendChangeScene() { //向服务器发起切场景请求 if (GameManager.gameManager.OnLineState) { //自动寻路处理 GameManager.gameManager.AutoSearch.ProcessTelepoint(this); Singleton.Instance.MainPlayer.startGhost = Time.unscaledTime + 5; var sceneData = CommonUtility.TryGetTable(teleportData.DstSceneID, a => TableManager.GetSceneClassByID(a, 0)); if (sceneData != null) { SceneData.RequestChangeScene((int)CG_REQ_CHANGE_SCENE.CHANGETYPE.TELEPORT, teleportData.Id,teleportData.DstSceneID, -1, (int)teleportData.DstPosX, (int)teleportData.DstPosZ); } } else { //自动寻路处理 GameManager.gameManager.AutoSearch.ProcessTelepoint(this); LoadingWindow.LoadScene((GameDefine_Globe.SCENE_DEFINE) teleportData.DstSceneID); } } } }