public void Update()
    {
        if (!execute_)
        {
            return;
        }
        if (targetID_ == MacroDefine.INVALID_ID)
        {
            return;
        }
        if (CObjectManager.Instance.getPlayerMySelf().IsAutoFight())
        {
            return;
        }
        CObject_Character pChar = CObjectManager.Instance.FindServerObject(targetID_) as CObject_Character;

        if (pChar == null || pChar.IsDie())
        {
            enterFightStat_    = false;
            waitSendSkillTime_ = 0;
            return;
        }
        if (!enterFightStat_)
        {
            return;
        }
        if (pChar.CannotBeAttack())
        {
            return;
        }

        if (!canUseNextSkill_)
        {
            waitNextSkill();
            return;
        }

        bool needSend = false;

        if (needWaitSendSkill_)
        {
            uint curTime = GameProcedure.s_pTimeSystem.GetTimeNow();
            if (curTime - waitSendSkillTime_ >= MIN_ACTION_TIME)
            {
                needSend           = true;
                waitSendSkillTime_ = curTime;
            }
        }
        else
        {
            needSend = true;
        }

        if (needSend)
        {
            tActionItem curSkill = getSuitAbleSkill(pChar);
            if (curSkill == null)
            {
                curSkill = CActionSystem.Instance.GetDefaultAction();
            }
            CActionItem_Skill skill = curSkill as CActionItem_Skill;
            needWaitSendSkill_ = !skill.AutoKeepOn();
            Vector3 fvMouseHitPlan = pChar.GetPosition();
            CursorMng.Instance.MouseCommand_Set(false, pChar, fvMouseHitPlan, curSkill);
            CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetLeft());
        }
    }
Exemplo n.º 2
0
    public void LockNearestTargetToHit()
    {
        CObject_Character pNearestTarget = LockNearestEnemy();

        //下边为挂机增加自动攻击

        if (AutoReleaseSkill.Instance.isAutoSkill())
        {
            if (AutoReleaseSkill.Instance.CanUseNextSkill())
            {
                CObject_Character target = mMainTarget as CObject_Character;
                if (target != null && !target.CannotBeAttack())
                {
                    mNearestTargetOLD = target;
                }
                if (mNearestTargetOLD == null || mNearestTargetOLD.IsDie())
                {
                    mNearestTargetOLD = pNearestTarget;
                }
                bool needSend = false;
                if (mNeedWaitSkillSend)
                {
                    uint curTime = GameProcedure.s_pTimeSystem.GetTimeNow();
                    if (curTime - mWaitSkillSend >= 1000)
                    {
                        needSend       = true;
                        mWaitSkillSend = curTime;
                    }
                }
                else
                {
                    needSend = true;
                }

                if (needSend)
                {
                    tActionItem suitAbleItem = AutoReleaseSkill.Instance.getSuitAbleSkill(mNearestTargetOLD);
                    if (suitAbleItem == null)
                    {
                        suitAbleItem = CActionSystem.Instance.GetDefaultAction();
                    }
                    CActionItem_Skill curSkill = suitAbleItem as CActionItem_Skill;
                    mNeedWaitSkillSend = !curSkill.AutoKeepOn();
                    Vector3 fvMouseHitPlan = Vector3.zero;
                    if (mNearestTargetOLD != null)
                    {
                        fvMouseHitPlan = mNearestTargetOLD.GetPosition();
                    }
                    CursorMng.Instance.MouseCommand_Set(false, mNearestTargetOLD, fvMouseHitPlan, suitAbleItem);
                    GameProcedure.s_pGameInterface.AutoHitState = 1;
                    CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetLeft());
                    GameProcedure.s_pGameInterface.AutoHitState = 0;
                }
            }
            else
            {
                AutoReleaseSkill.Instance.waitNextSkill();
            }
        }
        else
        {
            CObject_Character target = mMainTarget as CObject_Character;
            if (target != pNearestTarget)
            {
                if (target != null && !target.CannotBeAttack())
                {
                    mNearestTargetOLD = target;
                }
            }

            if (mNearestTargetOLD != pNearestTarget &&
                (mNearestTargetOLD == null || mNearestTargetOLD.IsDie()))
            {
                mNearestTargetOLD = pNearestTarget;
                Vector3 fvMouseHitPlan = Vector3.zero;
                bool    needSend       = false;
                if (mNeedWaitSkillSend)
                {
                    uint curTime = GameProcedure.s_pTimeSystem.GetTimeNow();
                    if (curTime - mWaitSkillSend >= 1000)
                    {
                        needSend       = true;
                        mWaitSkillSend = curTime;
                    }
                }
                else
                {
                    needSend = true;
                }

                if (needSend)
                {
                    tActionItem suitAbleItem = null;
                    if (AutoReleaseSkill.Instance.isAutoSkill())
                    {
                        if (AutoReleaseSkill.Instance.CanUseNextSkill())
                        {
                            suitAbleItem = AutoReleaseSkill.Instance.getSuitAbleSkill(pNearestTarget);
                        }
                        else
                        {
                            AutoReleaseSkill.Instance.waitNextSkill();
                        }
                    }

                    if (suitAbleItem == null)
                    {
                        suitAbleItem = CActionSystem.Instance.GetDefaultAction();
                    }
                    CActionItem_Skill curSkill = suitAbleItem as CActionItem_Skill;
                    mNeedWaitSkillSend = !curSkill.AutoKeepOn();
                    if (mNearestTargetOLD != null)
                    {
                        fvMouseHitPlan = mNearestTargetOLD.GetPosition();
                    }
                    CursorMng.Instance.MouseCommand_Set(false, mNearestTargetOLD, fvMouseHitPlan, suitAbleItem);
                    GameProcedure.s_pGameInterface.AutoHitState = 1;
                    CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetLeft());
                    GameProcedure.s_pGameInterface.AutoHitState = 0;
                }

                //if (suitAbleItem == null)
                //{
                //    suitAbleItem = CActionSystem.Instance.GetDefaultAction();
                //}
                //CursorMng.Instance.MouseCommand_Set(false, pNearestTarget, fvMouseHitPlan, suitAbleItem);
                ////  CAI_MySelf aiSelf = (CAI_MySelf)(CObjectManager.Instance.getPlayerMySelf().CharacterLogic_GetAI());
                //// if (aiSelf.GetMySelfAI() == ENUM_MYSELF_AI.MYSELF_AI_GUAJI)
                ////无需判定,一定是挂机状态
                //{
                //    GameProcedure.s_pGameInterface.AutoHitState = 1;
                //}
                //CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetLeft());
                //GameProcedure.s_pGameInterface.AutoHitState = 0;
                //mNearestTargetOLD = pNearestTarget;
            }
        }
    }
Exemplo n.º 3
0
    public OPERATE_RESULT IsCanUse_CheckTarget(int idUser, int idTargetObj, float fTargetX, float fTargetZ, float fDir)
    {
        switch ((ENUM_SELECT_TYPE)m_pDefine.m_nSelectType)
        {
        case ENUM_SELECT_TYPE.SELECT_TYPE_NONE:
            break;

        case ENUM_SELECT_TYPE.SELECT_TYPE_CHARACTER:
        {
            if (idTargetObj == MacroDefine.INVALID_ID)
            {
                CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_INFO_FIGHT, "没有目标");
                return(OPERATE_RESULT.OR_NO_TARGET);
            }
            // m_nTargetMustInSpecialState--> 0:活的;1:死的; -1:没有要求
            bool TargetMustAliveFlag = (m_pDefine.m_nTargetMustInSpecialState == 0);

            CObject_Character pTargetObj = (CObject_Character)CObjectManager.Instance.FindServerObject(idTargetObj);
            if (pTargetObj == null)
            {
                return(OPERATE_RESULT.OR_ERROR);
            }
            else if (pTargetObj.CannotBeAttack())                    // 敌对状态时,也要判断npc是否可以被攻击 [9/26/2011 Ivan edit]
            {
                CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_INFO_FIGHT, "无效目标");
                return(OPERATE_RESULT.OR_INVALID_TARGET);
            }
            CObject_Character pThisObj = (CObject_Character)CObjectManager.Instance.FindObject(idUser);
            if (pThisObj == null)
            {
                return(OPERATE_RESULT.OR_ERROR);
            }

            //阵营判断
            _CAMP_DATA    cap_a     = pThisObj.GetCampData();
            _CAMP_DATA    cap_b     = pTargetObj.GetCampData();
            ENUM_RELATION eCampType = CampStand.Instance.CalcRelationType(cap_a.m_nCampID, cap_b.m_nCampID);

            // 通过PK模式判断是否为敌人 [8/19/2011 edit by ZL]
            if (eCampType != ENUM_RELATION.RELATION_ENEMY)
            {
                int tempRelation = CObjectManager.Instance.getPlayerMySelf().GetRelationOther(pTargetObj);
                if (tempRelation != -1)
                {
                    eCampType = (ENUM_RELATION)tempRelation;
                }
            }
            if (m_pDefine.m_nFriendness < 0 && eCampType == ENUM_RELATION.RELATION_ENEMY)
            {
            }
            else if (m_pDefine.m_nFriendness > 0 && eCampType == ENUM_RELATION.RELATION_FRIEND)
            {
            }
            else if (m_pDefine.m_nFriendness == 0)
            {
            }
            else
            {
                return(OPERATE_RESULT.OR_INVALID_TARGET);
            }

            if (!pTargetObj.IsDie() &&
                TargetMustAliveFlag)
            {                    // 该技能只对活目标有效
            }
            else if (pTargetObj.IsDie() &&
                     !TargetMustAliveFlag)
            {                    // 该技能只对死目标有效
            }
            else
            {
                CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_INFO_FIGHT, "无效目标");
                return(OPERATE_RESULT.OR_INVALID_TARGET);
            }
        }
        break;

        case ENUM_SELECT_TYPE.SELECT_TYPE_POS:
        {
            if (!(fTargetX >= 0.0f && fTargetZ >= 0.0f))
            {
                CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_INFO_FIGHT, "无效目标");
                return(OPERATE_RESULT.OR_INVALID_TARGET_POS);
            }
        }
        break;

        case ENUM_SELECT_TYPE.SELECT_TYPE_DIR:
            break;

        case ENUM_SELECT_TYPE.SELECT_TYPE_SELF:
            break;
        }
        return(OPERATE_RESULT.OR_OK);
    }