156 lines
4.4 KiB
C#
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;
|
|
}
|
|
};
|