247 lines
8.1 KiB
C#
247 lines
8.1 KiB
C#
using CSNetwork.GPDataType;
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Class CECHPWorkTrace
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
enum TraceObjectType
|
|
{
|
|
TRACE_NONE = 0,
|
|
TRACE_PLAYER,
|
|
TRACE_MATTER,
|
|
TRACE_NPC,
|
|
TRACE_TASKNPC
|
|
};
|
|
|
|
abstract class CECTracedObject
|
|
{
|
|
//friend CECHPWorkTrace;
|
|
protected int m_iTraceType;
|
|
protected int m_iObjectId;
|
|
protected int m_iReason;
|
|
protected bool m_bMoreClose;
|
|
protected CECHostPlayer m_pHost;
|
|
|
|
public CECTracedObject(int type, int id, CECHostPlayer pHost, int ireason)
|
|
{
|
|
m_iTraceType = type;
|
|
m_iObjectId = id;
|
|
m_iReason = ireason;
|
|
m_pHost = pHost;
|
|
m_bMoreClose = false;
|
|
}
|
|
public CECTracedObject(CECTracedObject rhs)
|
|
{
|
|
m_iTraceType = rhs.m_iTraceType;
|
|
m_iObjectId = rhs.m_iObjectId;
|
|
m_iReason = rhs.m_iReason;
|
|
m_bMoreClose = rhs.m_bMoreClose;
|
|
m_pHost = rhs.m_pHost;
|
|
}
|
|
|
|
public abstract bool OnTargetMissing();
|
|
public abstract A3DVECTOR3 GetTargetPos();
|
|
public abstract bool OnTouched();
|
|
public abstract CECTracedObject Clone();
|
|
|
|
// TO DO: fix later
|
|
public virtual bool IsTargetMissing()
|
|
{
|
|
//if (m_iObjectId != 0)
|
|
//{
|
|
// CECObject pObj = g_pGame->GetGameRun()->GetWorld()->GetObject(m_iObjectId, 0);
|
|
// if (pObj)
|
|
// {
|
|
// return false;
|
|
// }
|
|
//}
|
|
//return true;
|
|
return false;
|
|
}
|
|
// TO DO: fix later
|
|
//public virtual A3DVECTOR3 GetMovePos();
|
|
|
|
public int GetObjectID()
|
|
{
|
|
return m_iObjectId;
|
|
}
|
|
public bool CanTouchMoreClose()
|
|
{
|
|
return m_bMoreClose;
|
|
}
|
|
public void SetMoveCloseFlag(bool bMoveClode)
|
|
{
|
|
m_bMoreClose = bMoveClode;
|
|
}
|
|
public int GetTraceReason()
|
|
{
|
|
return m_iReason;
|
|
}
|
|
public bool CanTouchFrom(A3DVECTOR3 vHostPos)
|
|
{
|
|
while (m_iObjectId != 0)
|
|
{
|
|
A3DVECTOR3 vTargetPos = new A3DVECTOR3(0f, 0f, 0f);
|
|
vTargetPos = GetTargetPos();
|
|
|
|
int iTouchReason = 0;
|
|
if (m_iReason == CECHPWorkTrace.Trace_reason.TRACE_ATTACK)
|
|
iTouchReason = 1;
|
|
else if (m_iReason == CECHPWorkTrace.Trace_reason.TRACE_SPELL)
|
|
iTouchReason = 2;
|
|
else if (m_iReason == CECHPWorkTrace.Trace_reason.TRACE_TALK)
|
|
iTouchReason = 3;
|
|
|
|
float fMaxCut = m_bMoreClose ? -1.0f : 1.0f;
|
|
|
|
CECObject pObject = g_pGame->GetGameRun()->GetWorld()->GetObject(m_iObjectId, 0);
|
|
|
|
float fTouchRadius = 0.0f;
|
|
if (GPDataTypeHelper.ISPLAYERID(m_iObjectId))
|
|
{
|
|
if (m_iReason == CECHPWorkTrace.Trace_reason.TRACE_TALK)
|
|
{
|
|
fTouchRadius = 0.0f;
|
|
}
|
|
else
|
|
{
|
|
CECPlayer pPlayer = pObject as CECPlayer;
|
|
fTouchRadius = pPlayer.GetTouchRadius();
|
|
}
|
|
return m_pHost.CanTouchTarget(vHostPos, vTargetPos, fTouchRadius, iTouchReason, fMaxCut);
|
|
}
|
|
else if (GPDataTypeHelper.ISNPCID(m_iObjectId))
|
|
{
|
|
CECNPC pNPC = pObject as CECNPC;
|
|
fTouchRadius = pNPC.GetTouchRadius();
|
|
return m_pHost.CanTouchTarget(vHostPos, vTargetPos, fTouchRadius, iTouchReason, fMaxCut);
|
|
}
|
|
else if (GPDataTypeHelper.ISMATTERID(m_iObjectId))
|
|
{
|
|
CECMatter pMatter = (pObject) as CECMatter;
|
|
return pMatter.CalcDist(vHostPos, true) < pMatter.GetGatherDist();
|
|
}
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
public int GetTraceType();
|
|
public CECObject GetTargetObject();
|
|
};
|
|
|
|
|
|
class CECHPWorkTrace : CECHPWork
|
|
{
|
|
// Trace reason
|
|
public static class Trace_reason
|
|
{
|
|
public const int TRACE_NONE = -1,
|
|
TRACE_ATTACK = 0, // Normal attack
|
|
TRACE_PICKUP = 1, // Pickup object
|
|
TRACE_TALK = 2, // Go to talk
|
|
TRACE_SPELL = 3, // Cast magic
|
|
TRACE_GATHER = 4; // Gather object
|
|
}
|
|
// Constructor and Destructor
|
|
public CECHPWorkTrace(CECHPWorkMan pWorkMan)
|
|
{
|
|
|
|
}
|
|
|
|
// Change trace target
|
|
//void ChangeTarget(int idTarget, int iReason, bool bUseAutoPF=false);
|
|
// 设定traceobject
|
|
public void SetTraceTarget(CECTracedObject pTraceObj, bool bUseAutoPF = false)
|
|
{
|
|
|
|
}
|
|
|
|
CECTracedObject CreatTraceTarget(int iTraceObjId, int iReason, bool bForceAttack = false);
|
|
|
|
// Tick routine
|
|
virtual bool Tick(DWORD 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);
|
|
|
|
// User press cancel button
|
|
void PressCancel();
|
|
// Set move close flag
|
|
void SetMoveCloseFlag(bool bMoveClose) { m_pTraceObject->SetMoveCloseFlag(bMoveClose); }
|
|
|
|
// Set / Get force attack flag
|
|
void SetForceAttack(bool bTrue) { m_bForceAttack = bTrue; }
|
|
bool GetForceAttack() { return m_bForceAttack; }
|
|
// Set / Get prepared skill
|
|
void SetPrepSkill(CECSkill* pSkill) { m_pPrepSkill = pSkill; }
|
|
CECSkill* GetPrepSkill() { return m_pPrepSkill; }
|
|
// Get target ID
|
|
int GetTarget() { return m_pTraceObject->GetObjectID(); }
|
|
// Get trace reason
|
|
int GetTraceReason() { return m_pTraceObject->GetTraceReason(); }
|
|
// AutoPF
|
|
void SetUseAutoPF(bool bUse);
|
|
bool GetUseAutoPF()const;
|
|
bool IsAutoPF()const;
|
|
|
|
void SetActionDone(bool bActionDone) { m_bActionDone = bActionDone; }
|
|
|
|
void OnTargetMissing();
|
|
|
|
void OnTouchTarget();
|
|
bool CanTouch();
|
|
|
|
protected: // Attributes
|
|
|
|
bool m_bHaveMoved; // Have moved flag
|
|
bool m_bMeetSlide; // true, meet slide
|
|
bool m_bCheckTouch; // Check whether touch target in this frame
|
|
A3DVECTOR3 m_vCurDirH; // Current move direction
|
|
bool m_bReadyCancel; // true, ready to cancel
|
|
bool m_bMoreClose; // Move close flag
|
|
bool m_bForceAttack; // Force attack flag
|
|
CECSkill* m_pPrepSkill; // Skill prepared to be casted
|
|
bool m_bActionDone; // 目标行为成功发出
|
|
bool m_bShouldResetUseAutoPF;
|
|
bool m_bUseAutoPFResetValue;
|
|
bool m_bUseAutoPF; // Use CECIntelligentRoute::Search
|
|
DWORD m_dwAutoPFNextCheckTime; // 下次检查时间
|
|
|
|
CECTracedObject* m_pTraceObject; // 定义trace目标对象
|
|
|
|
protected: // Operations
|
|
|
|
// On first tick
|
|
virtual void OnFirstTick();
|
|
|
|
// Trace on ground
|
|
bool Trace_Walk(float fDeltaTime);
|
|
// Trace in air and water
|
|
bool Trace_FlySwim(float fDeltaTime);
|
|
|
|
// Stop move when touch target
|
|
void StopMove(bool bFinish);
|
|
// Handle the case that target died when host is tracing it
|
|
bool OnTargetDied(CECObject* pTarget);
|
|
// Is valid time to touch target ?
|
|
bool IsGoodTimeToTouch();
|
|
// Check prepare skill
|
|
void CheckPrepSkill();
|
|
bool GetTargetCurPos(A3DVECTOR3 &pos);
|
|
A3DVECTOR3 GetCurMovingDest();
|
|
void UpdateUseAutoPF();
|
|
|
|
void ReplaceTarget(CECTracedObject* ptraceobj);
|
|
|
|
void ResetUseAutoPF(bool bUseAutoPF);
|
|
void UpdateResetUseAutoPF();
|
|
void ClearResetUseAutoPF();
|
|
}; |