using BrewMonster; using BrewMonster.Managers; using BrewMonster.Network; using BrewMonster.Scripts; using CSNetwork.GPDataType; using PerfectWorld.Scripts.Managers; 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()) { // When target is another player (e.g. duel opp), pass bForceAttack so CECTracedPlayer sends correct PVP mask bool bForceAttack = (m_pHost.IsInDuel() && m_idTarget == m_pHost.GetDuelOpponentId()) || EC_Utility.glb_GetForceAttackFlag(null); CECHPWorkTrace pWork = (CECHPWorkTrace)m_pWorkMan.CreateWork(Host_work_ID.WORK_TRACEOBJECT); pWork.SetTraceTarget(pWork.CreatTraceTarget(idTraceTarget, CECHPWorkTrace.Trace_reason.TRACE_ATTACK, bForceAttack)); m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickCommand1(pWork)); return true; } return true; } // Reset work public override 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)PLAYER_ACTION_TYPE.ACT_ATTACK_1 + Random.Range(0, 3), true, 200, false); m_idTarget = m_pHost.m_idSelTarget; } };