static IN_RANGE_RESULT SkillInRange(float fSrcX, float fSrcZ, float fDstX, float fDstZ, float fMinRange, float fMaxRange) { IN_RANGE_RESULT nResult = IN_RANGE_RESULT.irrInvalid; float fDistanceXY = 0f; fDistanceXY = KAI_SEARCH_CHARACTER.s_GetDistance2(fSrcX, fSrcZ, fDstX, fDstZ); if ((fDistanceXY - 0.5f > fMaxRange)) { return(IN_RANGE_RESULT.irrTooFar); } if ((fDistanceXY < fMinRange)) { return(IN_RANGE_RESULT.irrTooClose); } nResult = IN_RANGE_RESULT.irrInRange; Exit0: return(nResult); }
static int KeepRange(KCharacter pCharacter, float fMinRange, float fMaxRange) { int nResult = 0; int nRetCode = 0; float fCurrentDistance = 0f; float fKeepRange = 0f; float fFarRange = 0f; float fMoveDistance = 0f; float fAngle = 0f; float fSelfDstX = 0f; float fSelfDstZ = 0f; KCharacter pTarget = null; if (pCharacter.m_pSelectTarget.GetTargetType() != TARGET_TYPE.ttNpc && pCharacter.m_pSelectTarget.GetTargetType() != TARGET_TYPE.ttPlayer) { goto Exit0; } nRetCode = pCharacter.m_pSelectTarget.GetTarget(ref pTarget); if (nRetCode == 0 && pTarget == null) { goto Exit0; } // 自己和自己不用保持距离 if ((pCharacter.m_dwID != pTarget.m_dwID) == false) { return(1); } UnityEngine.Vector3 pos = pCharacter.m_pEntity.GetPos(); UnityEngine.Vector3 targetPos = pTarget.m_pEntity.GetPos(); fCurrentDistance = KAI_SEARCH_CHARACTER.s_GetDistance2(pos.x, pos.z, targetPos.x, targetPos.z); fKeepRange = (pCharacter.m_fTouchRange + pTarget.m_fTouchRange); fFarRange = (fMaxRange + pCharacter.m_fTouchRange + pTarget.m_fTouchRange); fKeepRange = Math.Max(fKeepRange, fMinRange); fFarRange = Math.Max(fFarRange, fKeepRange); if ((fCurrentDistance <= fKeepRange || fCurrentDistance >= fFarRange) == false) { return(1); } if (fCurrentDistance <= fKeepRange) { } else if (fCurrentDistance > fFarRange) { fMoveDistance = fCurrentDistance - (fFarRange + fKeepRange); //fAngle = angle_360(ref pos, ref targetPos); //fAngle = fAngle * 180f / 3.141592f; } if ((fMoveDistance > 0.5f) == false) { return(1); } // 需要移动 * UnityEngine.Mathf.Deg2Rad //fSelfDstX = pos.x + fMoveDistance * UnityEngine.Mathf.Cos(fAngle); //fSelfDstZ = pos.z + fMoveDistance * UnityEngine.Mathf.Sin(fAngle); fSelfDstX = targetPos.x; fSelfDstZ = targetPos.z; pCharacter.RunTo(fSelfDstX, fSelfDstZ); nResult = 2; Exit0: return(nResult); }
int SetupBullet(KSKILL_BULLET pBullet, KCharacter pCaster, ref KTarget rTarget) { int nResult = 0; int nRetCode = 0; float fCasterX = 0f; float fCasterZ = 0f; float fTargetX = 0f; float fTargetZ = 0f; KCharacter pTarget = null; float fTouchRange = 0f; float fDistance = 0f; float fHitDelay = 0f; if (pBullet == null) { goto Exit0; } if (pCaster == null) { goto Exit0; } if (rTarget == null) { goto Exit0; } pBullet.dwBulletID = FirstFightMgr.Instance().m_SkillManager.m_dwBulletIDIndex++; pBullet.pTarget = rTarget; pBullet.pSkillSrc = pCaster; pBullet.dwSkillSrcID = pCaster.m_dwID; pBullet.pSkillPointer = this; pBullet.pNext = null; switch (m_pBaseInfo.nCastMode) { case KSKILL_CAST_MODE.scmTargetSingle: break; default: break; } pCaster.GetAbsoluteCoordinate(ref fCasterX, ref fCasterZ); rTarget.GetTarget(ref fTargetX, ref fTargetZ); nRetCode = rTarget.GetTarget(ref pTarget); if (pTarget != null) { fTouchRange = pTarget.m_fTouchRange; } fDistance = KAI_SEARCH_CHARACTER.s_GetDistance2(fCasterX, fCasterZ, fTargetX, fTargetZ); if (fDistance > fTouchRange) { fDistance -= fTouchRange; } if (m_fBulletVelocity > 0f) { fHitDelay = (fDistance / m_fBulletVelocity); } int nHitDelay = ((int)(fHitDelay * 16)) + (int)FirstFightMgr.Instance().m_nGameLoop + m_pBaseInfo.nHitDelay; pBullet.nEndFrame = nHitDelay; nResult = 1; Exit0: return(nResult); }