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()) { // TO DO: fix later //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; //} } // TO DO: fix later //if (m_pHost.m_pMoveTargetGFX) //{ // if (iDestType != DEST_PUSH) // m_pHost.m_pMoveTargetGFX.Stop(); //} } void ResetUseAutoPF() { m_bResetAutoPF = true; } // Tick routine public virtual bool Tick(float dwDeltaTime) { //UpdateResetUseAutoPF(); //if (m_bSwitchTo2D) //{ // SwitchToDest2D(); // m_bSwitchTo2D = false; // return true; //} //if (IsAutoPF()) //{ // if (CECIntelligentRoute::Instance().IsIdle()) // { // // 智能寻路模式未成功时,等待下个 Tick 切换到 DEST_2D 模式 // return true; // } // if (m_pHost.IsFlying()) // { // // 中途切换到飞行模式时,切换到 DEST_2D 模式 // CECIntelligentRoute::Instance().ResetSearch(); // m_bSwitchTo2D = true; // return true; // } //} //base.Tick(dwDeltaTime); //if (m_pHost.IsRooting()) // return true; //if (m_bUseAutoMoveDialog) //{ // if (m_pHost.IsFlying()) // { // m_bAutoFly = false; // m_bAutoFlyPending = false; // } // if (m_bAutoFly && !m_bAutoFlyPending && !m_pHost.IsFlying()) // { // if (m_pHost.CmdFly()) // { // m_bAutoFly = false; // m_bAutoFlyPending = true; // } // } //} //else //{ // // Make sure 'Win_AutoPlay' dialog doesn't show up // CECGameUIMan pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); // pGameUI.AutoMoveShowDialog(false); //} ////寻路过程中找到NPC对象转为WorkTrace状态 //if ((m_vMoveDest - m_pHost.GetPos()).MagnitudeH() <= 5.0f) //{ // if (m_iNPCTempleId) // { // CECNPC pNPC = g_pGame.GetGameRun().GetWorld().GetNPCMan().FindNPCByTempleID(m_iNPCTempleId); // if (pNPC && m_pHost.SelectTarget(pNPC->GetNPCID())) // { // CECHPWorkTrace pWork = m_pWorkMan.CreateNPCTraceWork(pNPC, m_iTaskId); // if (pWork) // { // m_bAutoLand = false; //防止飞行状态寻路结束,转到worktrace之前自动着陆,进入workfall。 // Finish(); // m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickRunWorkCommand(pWork, true)); // return true; // } // } // } //} //float fDeltaTime = dwDeltaTime; //if (m_pHost.m_iMoveEnv == CECPlayer::MOVEENV_GROUND || // m_pHost.m_iMoveEnv == CECPlayer::MOVEENV_WATER && m_pHost.IsJumping() && (m_pHost.m_CDRInfo.vAbsVelocity.y > 0 || m_pHost.m_CDRInfo.fYVel > 0)) //{ // // Play appropriate actions // if (!m_pHost.IsJumping() && !m_pHost.IsPlayingAction(CECPlayer::ACT_TRICK_RUN) && // m_pHost.m_iMoveMode != CECPlayer::MOVE_SLIDE && !m_bMeetSlide) // { // int iAction = m_pHost->GetMoveStandAction(true); // m_pHost.PlayAction(iAction, false); // } // Tick_Walk(fDeltaTime); //} //else // (m_pHost->m_iMoveEnv == CECPlayer::MOVEENV_AIR || m_pHost->m_iMoveEnv == CECPlayer::MOVEENV_WATER) //{ // m_pHost->ResetJump(); // // Play appropriate actions // if (!m_bGliding) // { // int iAction = m_pHost.GetMoveStandAction(true); // m_pHost.PlayAction(iAction, false); // } // Tick_FlySwim(fDeltaTime); //} return true; } // Reset work public virtual void Reset() { } // Work is cancel public virtual void Cancel() { } // This work is do player moving ? public virtual bool IsMoving() { return true; } // Copy work data public virtual bool CopyData(CECHPWork pWork) { return true; } // Play move target effect public void PlayMoveTargetGFX(A3DVECTOR3 vPos, A3DVECTOR3 vNormal) { } // User press cancel button public void PressCancel() { m_bReadyCancel = true; } public void SetUseAutoMoveDialog(bool bUseAutoMoveDialog) { } public bool GetUseAutoMoveDialog() { return m_bUseAutoMoveDialog; } public bool GetAutoMove() { return true; } 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() { return m_bAutoFly;} bool IsAutoPF(){ return m_iDestType == Types.DEST_AUTOPF; } // Finish work void Finish() { } void SetTaskNPCInfo(int tid, int taskid) { } void SwitchToDest2D() { //int tid, taskid; //tid = m_iNPCTempleId; //taskid = m_iTaskId; //CECGameUIMan* pGameUI = g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan(); //pGameUI->SetAutoMoveShowDialogTarget((int)m_vMoveDest.x, (int)m_vMoveDest.z); //SetDestination(CECHPWorkMove::DEST_2D, m_vMoveDest); //SetTaskNPCInfo(tid, taskid); //SetUseAutoMoveDialog(true); } // On first tick protected virtual void OnFirstTick() { } // Tick routine of walking on ground protected bool Tick_Walk(float fDeltaTime) { return true; } // Tick routine of flying or swimming protected bool Tick_FlySwim(float fDeltaTime) { return true; } // Start gliding protected void Glide(float fMoveTime, A3DVECTOR3 vMoveDirH, float fDeltaTime, bool bFly) { } // Calculate vertical speed when fly or swim protected float CalcFlySwimVertSpeed(float fSpeed1, float fPushDir, float fPushAccel, float fDeltaTime) { return 0; } protected void ClearResetUseAutoPF() { } protected void UpdateResetUseAutoPF() { // if (!m_bResetAutoPF) // { // return; // } // CECIntelligentRoute::Instance().SetUsage(CECIntelligentRoute::enumUsageWorkMove); // CECIntelligentRoute::Instance().ResetSearch(); // if (m_iDestType == DEST_2D || m_iDestType == DEST_3D) // { //# ifdef SHOW_AUTOMOVE_FOOTPRINTS // g_AutoPFFollowPoints.clear(); // g_AutoPFPathPoints.clear(); //#endif // } // else if (IsAutoPF()) // { // bool bSwitchTo2D(true); // while (true) // { // if (m_pHost->IsFlying()) // { // break; // } // CECHostBrushTest brushTester(m_pHost->GetPos(), m_pHost->m_CDRInfo.vExtent, m_pHost->m_CDRInfo.fStepHeight); // if (CECIntelligentRoute::Instance().Search(m_pHost->GetPos(), m_vMoveDest, &brushTester) != CECIntelligentRoute::enumSearchSuccess) // { // break; // } // bSwitchTo2D = false; // break; // } // if (bSwitchTo2D) // { // m_bSwitchTo2D = true; // } // } // ClearResetUseAutoPF(); } }