using BrewMonster.Network; using CSNetwork.GPDataType; using UnityEngine; using static CECPlayer; using Types = BrewMonster.Scripts.CECHPWorkMove.DestTypes; namespace BrewMonster.Scripts { public class CECHPWorkMove : CECHPWork { public static class DestTypes { public const int DEST_2D = 0, DEST_3D = 1, DEST_DIR = 2, DEST_PUSH = 3, DEST_STANDJUMP = 4, DEST_AUTOPF = 5; // Movement type } private const uint MoveInputMask = 0x0F; // MD_FORWARD | MD_RIGHT | MD_BACK | MD_LEFT 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 A3DVECTOR3 vDir = new A3DVECTOR3(); 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 ���ö�����ij������ʧЧ�� // ���ַ���Ϊ�����ɡ�����ӽ�������ͷź����ϰ�ס'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 != 0) { CECNPC pNPC = EC_Game.GetGameRun().GetWorld().GetNPCMan().FindNPCByTempleID(m_iNPCTempleId); if (pNPC && m_pHost.SelectTarget(pNPC.GetNPCID())) { CECHPWorkTrace pWork = m_pWorkMan.CreateNPCTraceWork(pNPC, m_iTaskId); if (pWork != null) { m_bAutoLand = false; //��ֹ����״̬Ѱ·������ת��worktrace֮ǰ�Զ���½������workfall�� Finish(); m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickRunWorkCommand(pWork, true)); return true; } } } }*/ float fDeltaTime = dwDeltaTime; if (m_pHost.m_iMoveEnv == (int)MoveEnvironment.MOVEENV_GROUND || m_pHost.m_iMoveEnv == (int)MoveEnvironment.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((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_TRICK_RUN) && m_pHost.m_iMoveMode != (int)MoveMode.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 public void Finish() { m_bFinished = true; Cancel(); // Close 'Win_AutoPlay' dialog if it exists //CECGameUIMan* pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); //pGameUI.AutoMoveShowDialog(false); if (m_bUseAutoMoveDialog) { if (m_bAutoLand) { m_bAutoLand = false; //if (g_pGame.GetGameRun().GetHostPlayer().IsFlying()) // g_pGame.GetGameRun().GetHostPlayer().CmdFly(false); } m_bUseAutoMoveDialog = false; m_fAutoHeight = -1.0f; m_bAutoFly = false; m_bReachedHeight = true; } //�������׷������ m_iNPCTempleId = 0; m_iTaskId = 0; } 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) { A3DVECTOR3 vCurPos = m_pHost.GetPos(); ref CDR_INFO cdr = ref m_pHost.m_CDRInfo; if (m_pHost.m_iMoveMode == (int)MoveMode.MOVE_SLIDE) { m_pHost.PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_JUMP_LOOP, false); A3DVECTOR3 vDir; if (m_iDestType == DestTypes.DEST_DIR) { vDir = m_vCurDir; } else if (m_iDestType == DestTypes.DEST_PUSH) { vDir = GetCurrentModelDir(); } #if ENABLE_CEC_INTELLIGENT_ROUTE else if (IsAutoPF()) { vDir = CECIntelligentRoute.Instance().GetCurDest() - vCurPos; vDir.y = 0.0f; vDir.Normalize(); } #endif else { vDir = m_vMoveDest - vCurPos; vDir.y = 0.0f; vDir.Normalize(); } float fMaxSpeedV = 0.0f; m_bMeetSlide = m_pHost.m_MoveCtrl.MeetSlope(vDir, fMaxSpeedV); cdr.fYVel = EC_Utility.a_ClampFloor(cdr.fYVel, -fMaxSpeedV); if (m_pHost.m_GndInfo.bOnGround) m_vCurDir = vDir; vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vCurDir, m_pHost.GetGroundSpeed(), fDeltaTime); if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) { m_pHost.m_MoveCtrl.SetSlideLock(true); cdr.fYVel = 0.0f; Finish(); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), m_pHost.GetGroundSpeed(), (int)GPMoveMode.GP_MOVE_SLIDE); } else { m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); #if ENABLE_CEC_INTELLIGENT_ROUTE if (IsAutoPF() && CECIntelligentRoute.Instance().IsMoveOn()) CECIntelligentRoute.Instance().OnPlayerPosChange(vCurPos); #endif #if SHOW_AUTOMOVE_FOOTPRINTS if (IsAutoPF() || m_iDestType == DestTypes.DEST_2D) g_AutoPFFollowPoints.Add(vCurPos); #endif m_pHost.m_MoveCtrl.SendMoveCmd( vCurPos, 2, GPDataTypeHelper.g_vOrigin, EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), (int)GPMoveMode.GP_MOVE_SLIDE); } } else if (!m_bMeetSlide) { float fSpeed = m_pHost.GetGroundSpeed(); int iMoveMode = m_pHost.m_bWalkRun ? (int)GPMoveMode.GP_MOVE_RUN : (int)GPMoveMode.GP_MOVE_WALK; if (m_pHost.IsJumping()) iMoveMode = (int)GPMoveMode.GP_MOVE_JUMP; else if (!m_pHost.m_GndInfo.bOnGround) iMoveMode = (int)GPMoveMode.GP_MOVE_FALL; if (m_bReadyCancel && m_pHost.m_GndInfo.bOnGround) { Finish(); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, iMoveMode); return true; } if ((GetMoveRelDirMask() & MoveInputMask) != 0) m_iDestType = DestTypes.DEST_PUSH; if (m_iDestType == DestTypes.DEST_2D) { float fDist; if (m_pHost.m_GndInfo.bOnGround) { m_vCurDir = m_vMoveDest - vCurPos; m_vCurDir.y = 0.0f; fDist = m_vCurDir.Normalize(); } else { fDist = (m_vMoveDest - vCurPos).MagnitudeH(); } vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vCurDir, fSpeed, fDeltaTime, m_pHost.m_fVertSpeed); UpdateFacingFromDelta(vCurPos); if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) { cdr.fYVel = 0.0f; Finish(); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, iMoveMode); } else if (m_pHost.m_GndInfo.bOnGround && cdr.vTPNormal != Vector3.zero) { A3DVECTOR3 vMoveDelta = vCurPos - m_pHost.GetPos(); vMoveDelta.y = 0.0f; float fMoveDist = vMoveDelta.Normalize(); if (fMoveDist >= fDist) { Finish(); m_bUseAutoMoveDialog = false; m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, iMoveMode); } else { m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); m_pHost.m_MoveCtrl.SendMoveCmd( vCurPos, 0, m_vMoveDest, EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), iMoveMode); } #if SHOW_AUTOMOVE_FOOTPRINTS g_AutoPFFollowPoints.Add(vCurPos); #endif } else { #if SHOW_AUTOMOVE_FOOTPRINTS g_AutoPFFollowPoints.Add(vCurPos); #endif m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); m_pHost.m_MoveCtrl.SendMoveCmd( vCurPos, 1, m_vMoveDest, EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), iMoveMode); } } else if (m_iDestType == DestTypes.DEST_DIR) { vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vCurDir, fSpeed, fDeltaTime, m_pHost.m_fVertSpeed); UpdateFacingFromDelta(vCurPos); m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) { cdr.fYVel = 0.0f; Finish(); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, iMoveMode); } else if (m_pHost.m_GndInfo.bOnGround) { m_pHost.m_MoveCtrl.SendMoveCmd( vCurPos, 2, GPDataTypeHelper.g_vOrigin, EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), iMoveMode); } else { m_pHost.m_MoveCtrl.SendMoveCmd( vCurPos, 1, m_vMoveDest, EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), iMoveMode); } } else if (m_iDestType == DestTypes.DEST_STANDJUMP) { if (!m_pHost.IsJumping()) { Finish(); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, iMoveMode); } else { vCurPos = m_pHost.m_MoveCtrl.GroundMove(GPDataTypeHelper.g_vOrigin, 0.0f, fDeltaTime, m_pHost.m_fVertSpeed); m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) { m_pHost.ResetJump(); Finish(); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, iMoveMode); } else { m_pHost.m_MoveCtrl.SendMoveCmd( vCurPos, 0, m_vMoveDest, EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), iMoveMode); } } } else if (m_iDestType == DestTypes.DEST_PUSH) { A3DVECTOR3 vMoveDir = GPDataTypeHelper.g_vOrigin; bool bFinish = false; /*if (m_pHost.GetPushDir(vMoveDir, MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_BACK | MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT, fDeltaTime)) { if (!vMoveDir.IsZero()) { //m_pHost.StartModelMove(vMoveDir, GPDataTypeHelper.g_vAxisY, 0); } vCurPos = m_pHost.m_MoveCtrl.GroundMove(vMoveDir, fSpeed, fDeltaTime, m_pHost.m_fVertSpeed); m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); } else { if (!m_bUseAutoMoveDialog) bFinish = true; else m_iDestType = DestTypes.DEST_2D; }*/ if (bFinish || m_pHost.m_MoveCtrl.MoveBlocked() >= 3) { if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) cdr.fYVel = 0.0f; Finish(); m_pHost.m_vVelocity.Clear(); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, iMoveMode); } else { m_pHost.m_vVelocity = vMoveDir * fSpeed; m_pHost.m_MoveCtrl.SendMoveCmd( vCurPos, 2, GPDataTypeHelper.g_vOrigin, m_pHost.m_vVelocity, iMoveMode); } } else if (m_iDestType == DestTypes.DEST_PUSH) { m_iDestType = DestTypes.DEST_2D; } #if ENABLE_CEC_INTELLIGENT_ROUTE else if (IsAutoPF()) { float fDist = 0.0f; A3DVECTOR3 vCurDest = CECIntelligentRoute.Instance().GetCurDest(); if (m_pHost.m_GndInfo.bOnGround) { m_vCurDir = vCurDest - vCurPos; m_vCurDir.y = 0.0f; fDist = m_vCurDir.Normalize(); } else { fDist = (vCurDest - vCurPos).MagnitudeH(); } vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vCurDir, fSpeed, fDeltaTime, m_pHost.m_fVertSpeed); if (!m_vCurDir.IsZero()) { //m_pHost.StartModelMove(m_vCurDir, GPDataTypeHelper.g_vAxisY, 100); //m_pHost.ChangeModelTargetDirAndUp(m_vCurDir, GPDataTypeHelper.g_vAxisY); UpdateFacingFromDelta(vCurPos); } if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) { cdr.fYVel = 0.0f; Finish(); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, iMoveMode); } else { m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); CECIntelligentRoute.Instance().OnPlayerPosChange(vCurPos); if (CECIntelligentRoute.Instance().IsPathFinished()) { Finish(); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, iMoveMode); } else { m_pHost.m_MoveCtrl.SendMoveCmd( vCurPos, 1, vCurDest, EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), iMoveMode); } } } #else else if (IsAutoPF()) { m_bSwitchTo2D = true; } #endif } else { m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), m_pHost.GetGroundSpeed(), (int)GPMoveMode.GP_MOVE_SLIDE); Finish(); } 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(); } protected virtual uint GetMoveRelDirMask() { // TODO: hook up CECHostPlayer move-direction flags when available. return 0; } private void UpdateFacingFromDelta(A3DVECTOR3 nextPos) { A3DVECTOR3 prevPos = m_pHost.GetPos(); Vector3 delta = EC_Utility.ToVector3(nextPos - prevPos); delta.y = 0.0f; if (delta.sqrMagnitude > 1e-6f) { delta.Normalize(); m_pHost.SetDirAndUp(delta, Vector3.up); } } private A3DVECTOR3 GetCurrentModelDir() { Vector3 forward = m_pHost != null ? m_pHost.transform.forward : Vector3.forward; return new A3DVECTOR3(forward.x, forward.y, forward.z); } } }