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); }