Пример #1
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;
            }
        }
    }
    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());
        }
    }
        public override NET_RESULT_DEFINE.PACKET_EXE Execute(PacketBase packet, ref Peer pPlayer)
        {
            GCNewItemBox pPacket = (GCNewItemBox)packet;

            //当前流程是主流程
            if (GameProcedure.GetActiveProcedure() == (GameProcedure)GameProcedure.s_ProcMain)
            {
                CObjectManager pObjectManager = CObjectManager.Instance;

                //检查位置是否合法
                fVector2 pos = new fVector2(pPacket.Position.m_fX, pPacket.Position.m_fZ);
                if (!WorldManager.Instance.ActiveScene.IsValidPosition(ref pos))
                {
                    LogManager.LogError("Valid Position @GCNewItemBoxHandler.Execute");
                    return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_ERROR);
                }

                if ((int)ITEMBOX_TYPE.ITYPE_DROPBOX == pPacket.ObjectType)
                {
                    bool    bMustCreater = true;
                    CObject pObj         = (CObject)(pObjectManager.FindServerObject((int)pPacket.MonsterID));
                    if (pObj != null && pObj is CObject_Character)
                    {
                        CObject_Character pCharacter = (CObject_Character)pObj;
                        if (!pCharacter.IsDie())
                        {
                            uint      idItemBox = (uint)pPacket.ObjectID;
                            uint      idOwner   = (uint)pPacket.OwnerID;
                            WORLD_POS posCreate = pPacket.Position;
                            pCharacter.AddDropBoxEvent(idItemBox, idOwner, ref posCreate);
                            bMustCreater = false;
                        }
                    }

                    if (bMustCreater)
                    {
                        //创建ItemBox
                        CTripperObject_ItemBox pBox = (CTripperObject_ItemBox)CObjectManager.Instance.NewTripperItemBox((int)pPacket.ObjectID);
                        pBox.Initial(null);
                        //设置位置
                        pBox.SetMapPosition(pPacket.Position.m_fX, pPacket.Position.m_fZ);
                        //设置掉落箱的归属
                        pBox.SetOwnerGUID((uint)pPacket.OwnerID);

                        CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_DROP_ITEMBOX);
                    }
                }
                else
                {
                    //创建矿物生长点
                    CTripperObject_Resource pResource = (CTripperObject_Resource)CObjectManager.Instance.NewTripperResource((int)pPacket.ObjectID);
                    if (!(pResource.SetResourceID((int)pPacket.ObjectType)))
                    {
                        //非法的资源ID
                        CObjectManager.Instance.DestroyObject(pResource);
                        return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
                    }
                    pResource.Initial(null);
                    //设置位置
                    pResource.SetMapPosition(pPacket.Position.m_fX, pPacket.Position.m_fZ);
                    jhCount++;
                }
            }
            return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
        }
    bool CanUseSkill(CActionItem skillItem, CObject_Character target)
    {
        if (skillItem == null)
        {
            return(false);
        }
        if (target == null)
        {
            return(false);
        }
        if (target.IsDie())
        {
            return(false);
        }
        switch (skillItem.GetType())
        {
        case ACTION_OPTYPE.AOT_SKILL:
        {
            SCLIENT_SKILL pSkill = skillItem.GetImpl() as SCLIENT_SKILL;
            if (pSkill == null)
            {
                break;
            }

            Vector3 avatarPos        = CObjectManager.Instance.getPlayerMySelf().GetPosition();
            Vector3 avatarPosOnPlane = new Vector3(avatarPos.x, 0, avatarPos.z);
            Vector3 targetPos        = new Vector3(-1, 0, -1);
            int     ServerID         = -1;
            targetPos = new Vector3(target.GetPosition().x, 0, target.GetPosition().z);
            ServerID  = target.ServerID;
            Vector3        PosOnPlane = new Vector3(targetPos.x, 0, targetPos.z);
            float          dir        = Vector3.Angle(avatarPosOnPlane, PosOnPlane);
            OPERATE_RESULT result     = pSkill.IsCanUse(CObjectManager.Instance.getPlayerMySelf().ID,
                                                        pSkill.m_nLevel,
                                                        ServerID,
                                                        targetPos.x,
                                                        targetPos.z,
                                                        dir);

            if (result == OPERATE_RESULT.OR_OK)
            {
                return(true);
            }
        }
        break;

        case ACTION_OPTYPE.AOT_PET_SKILL:
        {
            PET_SKILL pPetSkill = skillItem.GetImpl() as PET_SKILL;
            if (pPetSkill == null)
            {
                break;
            }
            if (Interface.Pet.Instance.IsFighting(pPetSkill.m_nPetNum))
            {
                return(true);
            }
        }
        break;
        }
        return(false);
    }
Пример #5
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);
    }