Files
test/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs
T
2025-10-03 19:10:14 +07:00

250 lines
6.8 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 (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 (ISNPCID(m_iObjectId))
{
CECNPC pNPC = pObject as CECNPC;
fTouchRadius = pNPC.GetTouchRadius();
return m_pHost.CanTouchTarget(vHostPos, vTargetPos, fTouchRadius, iTouchReason, fMaxCut);
}
else if (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)
{
}
public: // Attributes
public: // Operations
// 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();
};