示例#1
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);
    }