395 lines
14 KiB
C#
395 lines
14 KiB
C#
using CSNetwork.GPDataType;
|
||
using UnityEngine;
|
||
|
||
namespace BrewMonster.Scripts
|
||
{
|
||
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 ���ö�����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)
|
||
// {
|
||
// 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
|
||
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)
|
||
{
|
||
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();
|
||
}
|
||
|
||
}
|
||
}
|