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