using CSNetwork.GPDataType; using UnityEngine; using static BrewMonster.Scripts.CECHPWorkSpell.Spell_magic_state; namespace BrewMonster.Scripts { /////////////////////////////////////////////////////////////////////////// // // Class CECHPWorkSpell // /////////////////////////////////////////////////////////////////////////// public class CECHPWorkSpell : CECHPWork { public static class Spell_magic_state { public const int ST_INCANT = 0, ST_SPELL = 1; } public CECHPWorkSpell(CECHPWorkMan pWorkMan) : base(Host_work_ID.WORK_SPELLOBJECT, pWorkMan) { m_OverTimeCnt = new CECCounter(); m_dwMask = Work_mask.MASK_SPELLOBJECT; m_dwTransMask = Work_mask.MASK_STAND | Work_mask.MASK_MOVETOPOS | Work_mask.MASK_TRACEOBJECT; Reset(); } public CECHPWorkSpell(int iWorkID, CECHPWorkMan pWorkMan) : base(iWorkID, pWorkMan) { } protected CECSkill m_pSkill; // Skill object protected CECCounter m_OverTimeCnt; // Over time counter protected int m_iState; protected int m_idTarget; // Target id // Prepare cast public void PrepareCast(int idTarget, CECSkill pSkill, int iIncantTime) { m_pSkill = pSkill; m_iState = ST_INCANT; m_idTarget = idTarget; if (iIncantTime < 0) iIncantTime = 0x7fffffff; else iIncantTime *= 2; m_OverTimeCnt.SetPeriod(iIncantTime); m_OverTimeCnt.Reset(); } // Change state public void ChangeState(int iState) { m_iState = iState; } // Get state public int GetState() { return m_iState; } public CECSkill GetSkill() { return m_pSkill; } // Tick routine public override bool Tick(float dwDeltaTime) { base.Tick(dwDeltaTime * 1000); if (m_OverTimeCnt.IncCounter(dwDeltaTime * 1000,out float fCounter,out float fPeriod)) { m_bFinished = true; } if (m_idTarget != 0) { m_pHost.TurnFaceTo(m_idTarget); } if (!m_pHost.IsPlayingAction()) { m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FIGHTSTAND); } return true; } protected override void OnFirstTick() { m_pHost.m_iMoveMode = (int)MoveMode.MOVE_STAND; } public override void Reset() { base.Reset(); m_OverTimeCnt.Reset(); m_pSkill = null; m_iState = ST_INCANT; m_idTarget = 0; } // Copy work data public override bool CopyData(CECHPWork pWork) { return false; } // Cancel work public override void Cancel() { m_pHost.TurnFaceTo(0); base.Cancel(); } } /////////////////////////////////////////////////////////////////////////// // // Class CECHPWorkSpellMatcher // /////////////////////////////////////////////////////////////////////////// // 根据技能 ID 匹配 CECHPWorkSpell // Match CECHPWorkSpell based on skill ID public class CECHPWorkSpellMatcher : CECHPWorkMatcher { private CECSkill m_pSkill; public CECHPWorkSpellMatcher(CECSkill pSkill) { m_pSkill = pSkill; } public override bool Match(CECHPWork pWork, int priority, bool isDelayWork) { bool bMatching = false; if (pWork != null && pWork.GetWorkID() == CECHPWork.Host_work_ID.WORK_SPELLOBJECT) { CECHPWorkSpell pWorkSpell = pWork as CECHPWorkSpell; if (pWorkSpell != null && m_pSkill == pWorkSpell.GetSkill()) { bMatching = true; } } return bMatching; } } }