177 lines
5.7 KiB
C#
177 lines
5.7 KiB
C#
|
/********************************************************************************
|
|||
|
* 文件名: 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<ObjManager>.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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|