SKILL_RESULT_CODE CastOnCasterArea(KCharacter pDisplayCaster, KCharacter pLogicCaster) { SKILL_RESULT_CODE nResult = SKILL_RESULT_CODE.srcFailed; int nRetCode = 0; KTarget pTarget = new KTarget(); KSKILL_BULLET pBullet = new KSKILL_BULLET(); float fX = 0f; float fZ = 0f; nRetCode = pTarget.SetTarget(pDisplayCaster); if (nRetCode == 0) { goto Exit0; } nRetCode = SetupBullet(pBullet, pLogicCaster, ref pTarget); if (nRetCode == 0) { goto Exit0; } if (pBullet.nEndFrame > FirstFightMgr.Instance().m_nGameLoop) { pLogicCaster.AddBullet(pBullet); } else { pDisplayCaster.GetAbsoluteCoordinate(ref fX, ref fZ); nRetCode = (int)ApplyOnArea(pBullet, fX, fZ); } nResult = SKILL_RESULT_CODE.srcSuccess; Exit0: return(nResult); }
public SKILL_RESULT_CODE CheckTargetRange(KCharacter pCaster, ref KTarget rTarget) { SKILL_RESULT_CODE nResult = SKILL_RESULT_CODE.srcFailed; int nRetCode = 0; float fMaxRange = 0f; float fCasterX = 0f; float fCasterZ = 0f; float fTargetX = 0f; float fTargetZ = 0f; float fTouchRange = 0f; pCaster.GetAbsoluteCoordinate(ref fCasterX, ref fCasterZ); nRetCode = rTarget.GetTarget(ref fTargetX, ref fTargetZ); if (nRetCode == 0) { goto Exit0; } fMaxRange = pCaster.m_fTouchRange + m_fMaxRadius + fTouchRange; nRetCode = (int)SkillInRange(fCasterX, fCasterZ, fTargetX, fTargetZ, m_fMinRadius, fMaxRange); if (nRetCode == (int)IN_RANGE_RESULT.irrTooClose) { return(SKILL_RESULT_CODE.srcTooCloseTarget); } if (nRetCode == (int)IN_RANGE_RESULT.irrTooFar) { return(SKILL_RESULT_CODE.srcTooFarTarget); } if (nRetCode != (int)IN_RANGE_RESULT.irrInRange) { goto Exit0; } nResult = SKILL_RESULT_CODE.srcSuccess; 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); }