160 lines
5.2 KiB
C#
160 lines
5.2 KiB
C#
using CSNetwork.GPDataType;
|
|
using UnityEngine;
|
|
|
|
public class CECHPWorkMove : CECHPWork
|
|
{
|
|
public static class Types
|
|
{
|
|
public const int DEST_2D = 0,
|
|
DEST_3D = 1,
|
|
DEST_DIR = 2,
|
|
DEST_PUSH = 3,
|
|
DEST_STANDJUMP = 4,
|
|
DEST_AUTOPF = 5; // Movement type
|
|
}
|
|
|
|
protected A3DVECTOR3 m_vMoveDest; // Move destination position or direction
|
|
protected int m_iDestType; // Destination type
|
|
protected bool m_bHaveDest; // true, have destination
|
|
protected bool m_bMeetSlide; // true, meet slide
|
|
protected A3DVECTOR3 m_vCurDir; // Current move direction
|
|
protected bool m_bReadyCancel; // true, ready to cancel
|
|
protected bool m_bGliding; // glide
|
|
protected float m_fGlideTime;
|
|
protected float m_fGlideSpan;
|
|
protected float m_fGlideAng;
|
|
protected float m_fGlideVel; // glide angular vel
|
|
protected float m_fGlidePitch; // glide pitch angle
|
|
protected float m_fCurPitch;
|
|
protected float m_fPushPitch;
|
|
protected float m_fPushLean;
|
|
|
|
protected bool m_bUseAutoMoveDialog; // Auto move
|
|
protected float m_fAutoHeight; // Height of auto moving destination
|
|
protected bool m_bAutoLand; // Auto land when arrive at destination
|
|
protected bool m_bAutoFly; // Auto fly
|
|
protected bool m_bReachedHeight;// Player reached specified height
|
|
protected bool m_bAutoFlyPending; // Mark whether a fly command had been executed
|
|
|
|
protected int m_iNPCTempleId;
|
|
protected int m_iTaskId;
|
|
protected bool m_bSwitchTo2D;
|
|
|
|
protected bool m_bResetAutoPF;
|
|
|
|
public CECHPWorkMove(CECHPWorkMan pWorkMan) : base (Host_work_ID.WORK_MOVETOPOS, pWorkMan)
|
|
{
|
|
m_dwMask = Work_mask.MASK_MOVETOPOS;
|
|
m_dwTransMask = Work_mask.MASK_STAND | Work_mask.MASK_TRACEOBJECT | Work_mask.MASK_FOLLOW;
|
|
Reset();
|
|
}
|
|
|
|
public CECHPWorkMove(int iWorkID, CECHPWorkMan pWorkMan) : base(iWorkID, pWorkMan)
|
|
{
|
|
}
|
|
|
|
// Set destination position or direction
|
|
public void SetDestination(int iDestType, A3DVECTOR3 vMoveDest)
|
|
{
|
|
m_iDestType = iDestType;
|
|
m_vMoveDest = vMoveDest;
|
|
m_bHaveDest = true;
|
|
m_bGliding = false;
|
|
//m_pHost->SetAdjustOrient(false); // 2014-9-10 徐文彬:在 CECHPWorkMove 创建的时候都会调用此函数,会导致其它时机通过 SetDestDirAndUp 调用对人物的朝向调整失效。
|
|
// 重现方法为:月仙“望月咏”技能释放后、马上按住'A'或'D'等移动键并摁住不放,将导致人物施法方向偏离目标而朝向移动方向(需多次尝试)
|
|
|
|
//清空任务信息
|
|
m_iTaskId = 0;
|
|
m_iNPCTempleId = 0;
|
|
ResetUseAutoPF();
|
|
|
|
if (iDestType == Types.DEST_DIR)
|
|
{
|
|
m_vCurDir = vMoveDest;
|
|
if (m_bUseAutoMoveDialog)
|
|
{
|
|
m_bUseAutoMoveDialog = false;
|
|
m_bAutoLand = false;
|
|
m_fAutoHeight = -1.0f;
|
|
m_bAutoFly = false;
|
|
m_bReachedHeight = true;
|
|
m_bAutoFlyPending = false;
|
|
}
|
|
}
|
|
else if (iDestType == Types.DEST_2D || iDestType == Types.DEST_3D)
|
|
{
|
|
m_vCurDir = vMoveDest - new A3DVECTOR3(m_pHost.transform.position.x, m_pHost.transform.position.y, m_pHost.transform.position.z);
|
|
m_vCurDir.y = 0.0f;
|
|
m_vCurDir.Normalize();
|
|
}
|
|
else if (IsAutoPF())
|
|
{
|
|
m_vCurDir = CECIntelligentRoute::Instance().GetCurDest() - m_pHost->GetPos();
|
|
m_vCurDir.y = 0.0f;
|
|
m_vCurDir.Normalize();
|
|
if (m_bUseAutoMoveDialog)
|
|
{
|
|
// 此处禁用 m_bUseAutoMoveDialog,见 SetUseAutoMoveDialog 中说明
|
|
m_bUseAutoMoveDialog = false;
|
|
m_bAutoLand = false;
|
|
m_fAutoHeight = -1.0f;
|
|
m_bAutoFly = false;
|
|
m_bReachedHeight = true;
|
|
m_bAutoFlyPending = false;
|
|
}
|
|
}
|
|
|
|
if (m_pHost.m_pMoveTargetGFX)
|
|
{
|
|
if (iDestType != DEST_PUSH)
|
|
m_pHost.m_pMoveTargetGFX.Stop();
|
|
}
|
|
}
|
|
|
|
void ResetUseAutoPF()
|
|
{
|
|
m_bResetAutoPF = true;
|
|
}
|
|
|
|
// Tick routine
|
|
virtual bool Tick(uint dwDeltaTime)
|
|
{
|
|
|
|
}
|
|
// Reset work
|
|
virtual void Reset();
|
|
// Work is cancel
|
|
virtual void Cancel();
|
|
|
|
// This work is do player moving ?
|
|
virtual bool IsMoving() { return true; }
|
|
// Copy work data
|
|
virtual bool CopyData(CECHPWork* pWork);
|
|
|
|
// Play move target effect
|
|
void PlayMoveTargetGFX(const A3DVECTOR3& vPos, const A3DVECTOR3& vNormal);
|
|
|
|
// User press cancel button
|
|
void PressCancel() { m_bReadyCancel = true; }
|
|
|
|
void SetUseAutoMoveDialog(bool bUseAutoMoveDialog);
|
|
bool GetUseAutoMoveDialog() { return m_bUseAutoMoveDialog; }
|
|
bool GetAutoMove();
|
|
|
|
void SetAutoLand(bool bAutoLand) { m_bAutoLand = bAutoLand; }
|
|
bool GetAutoLand() { return m_bAutoLand; }
|
|
|
|
void SetAutoHeight(float fHeight) { m_fAutoHeight = fHeight; m_bAutoFly = true; m_bReachedHeight = false; }
|
|
float GetAutoHeight() { return m_fAutoHeight; }
|
|
bool IsAutoFly() const { return m_bAutoFly;}
|
|
|
|
bool IsAutoPF()const{ return m_iDestType == DEST_AUTOPF; }
|
|
|
|
// Finish work
|
|
void Finish();
|
|
|
|
void SetTaskNPCInfo(int tid, int taskid);
|
|
|
|
void SwitchToDest2D();
|
|
}
|