Files
test/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs
T
2025-10-09 15:31:53 +07:00

156 lines
4.4 KiB
C#

using BrewMonster;
using BrewMonster.Network;
using CSNetwork.GPDataType;
using PerfectWorld.Scripts.Managers;
using PerfectWorld.Scripts.Player;
using UnityEngine;
class CECHPWorkPostTickCommand1 : CECHPWorkPostTickRunWorkCommand
{
public CECHPWorkPostTickCommand1(CECHPWork pWork) : base(pWork, true)
{
}
public virtual bool Run(CECHPWorkMan pWorkMan)
{
if (!base.Run(pWorkMan))
{
return false;
}
//AP_ActionEvent(AP_EVENT_MELEEOUTOFRANGE);
return true;
}
};
///////////////////////////////////////////////////////////////////////////
//
// Class CECHPWorkMelee
//
///////////////////////////////////////////////////////////////////////////
class CECHPWorkMelee : CECHPWork
{
protected int m_idTarget; // Target id
protected int m_iIdleTime; // Idle time
protected int m_iIdleTimeCnt; // Idle time counter
// Constructor and Destructor
public CECHPWorkMelee(CECHPWorkMan pWorkMan) : base(Host_work_ID.WORK_HACKOBJECT, pWorkMan)
{
m_dwMask = Work_mask.MASK_HACKOBJECT;
m_dwTransMask = Work_mask.MASK_STAND | Work_mask.MASK_MOVETOPOS | Work_mask.MASK_TRACEOBJECT;
Reset();
}
// Tick routine
public virtual bool Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
if (m_idTarget != 0 || m_idTarget == m_pHost.m_PlayerInfo.cid)
{
m_bFinished = true;
return true;
}
// If target turn to be un-attackable, cancel action
if (m_pHost.AttackableJudge(m_idTarget, true) == 0)
{
UnityGameSession.c2s_CmdCancelAction();
//g_pGame.GetGameSession().c2s_CmdCancelAction();
m_bFinished = true;
return true;
}
if (m_iIdleTimeCnt < m_iIdleTime)
{
m_iIdleTimeCnt += (int)dwDeltaTime;
if (m_iIdleTimeCnt < m_iIdleTime)
return true;
m_iIdleTimeCnt = m_iIdleTime;
}
// Face to target
//m_pHost.TurnFaceTo(m_idTarget);
int idTraceTarget = 0;
if (GPDataTypeHelper.ISPLAYERID(m_idTarget))
{
EC_ElsePlayer pPlayer = EC_ManMessageMono.Instance.GetECManPlayer.GetElsePlayer(m_idTarget);
if (!pPlayer || pPlayer.IsDead()) // Taget has missed ?
return true;
// if (!m_pHost.CanTouchTarget(pPlayer.GetServerPos(), pPlayer.GetTouchRadius(), 1, 0.8f))
if (!m_pHost.CanTouchTarget(pPlayer.GetPos(), pPlayer.GetTouchRadius(), 1))
idTraceTarget = m_idTarget;
}
else if (GPDataTypeHelper.ISNPCID(m_idTarget))
{
CECNPC pNPC = EC_ManMessageMono.Instance._CECNPCMan.GetNPC(m_idTarget);
if (!pNPC || pNPC.IsDead()) // Taget has missed ?
return true;
if (!m_pHost.CanTouchTarget(pNPC.GetPos(), pNPC.GetTouchRadius(), 1))
idTraceTarget = m_idTarget;
}
if (idTraceTarget != 0 && !m_pHost.IsRooting())
{
CECHPWorkTrace pWork = (CECHPWorkTrace)m_pWorkMan.CreateWork(Host_work_ID.WORK_TRACEOBJECT);
pWork.SetTraceTarget(pWork.CreatTraceTarget(idTraceTarget, CECHPWorkTrace.Trace_reason.TRACE_ATTACK));
m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickCommand1(pWork));
return true;
}
return true;
}
// Reset work
public virtual void Reset()
{
base.Reset();
m_idTarget = 0;
m_iIdleTime = 0;
m_iIdleTimeCnt = 0;
}
// Copy work data
public virtual bool CopyData(CECHPWork pWork)
{
if (!base.CopyData(pWork))
return false;
CECHPWorkMelee pSrc = (CECHPWorkMelee)pWork;
m_idTarget = pSrc.m_idTarget;
m_iIdleTime = pSrc.m_iIdleTime;
m_iIdleTimeCnt = pSrc.m_iIdleTimeCnt;
return true;
}
public virtual void Cancel()
{
// TO DO: fix later
//m_pHost.TurnFaceTo(0);
}
// Get attack target
public int GetTarget() { return m_idTarget; }
// Set idle time
public void SetIdleTime(int iTime)
{
m_iIdleTime = iTime;
m_iIdleTimeCnt = 0;
}
// Get idle time
public int GetIdleTime() { return m_iIdleTime; }
// On first tick
protected virtual void OnFirstTick()
{
m_pHost.m_iMoveMode = (int)MoveMode.MOVE_STAND;
m_pHost.PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_ATTACK_1 + Random.Range(0, 3), true, 200, false);
m_idTarget = m_pHost.m_idSelTarget;
}
};