コード例 #1
0
ファイル: KAISearchTactics.cs プロジェクト: zuojiashun/src
    public override bool OperatorSearch(KCharacter pCharacter)
    {
        bool bRetCode = false;

        bRetCode = KAI_SEARCH_CHARACTER.SearchCharacter(ref this.m_pResult, pCharacter, m_pSelf, this.m_fDistance2, this.m_nRelation);

        if (bRetCode)
        {
            return(false);
        }

        return(true);
    }
コード例 #2
0
ファイル: KAIAction.cs プロジェクト: zuojiashun/src
    public static int AISearchEnemy(KCharacter pCharacter, KAIAction pActionData)
    {
        int nResult  = 0;
        int nRetCode = 0;

        int         nBranchFound    = 1;
        int         nBranchNotFound = 2;
        int         nRange          = pActionData.m_nParam[0];
        TARGET_TYPE eTargetType     = TARGET_TYPE.ttInvalid;

        KSearchForAnyCharacter Tactic = new KSearchForAnyCharacter();

        Tactic.m_pSelf      = pCharacter;
        Tactic.m_fDistance2 = (float)nRange;
        Tactic.m_nRelation  = (int)SCENE_OBJ_RELATION_TYPE.sortEnemy;

        KAI_SEARCH_CHARACTER.AISearchCharacter <KSearchForAnyCharacter>(Tactic);
        if (Tactic.m_pResult == null)
        {
            return(nBranchNotFound);
        }

        if (KCharacter.IS_PLAYER(Tactic.m_pResult.m_dwID))
        {
            eTargetType = TARGET_TYPE.ttPlayer;
        }
        else
        {
            eTargetType = TARGET_TYPE.ttNpc;
        }

        nRetCode = pCharacter.SelectTarget(eTargetType, Tactic.m_pResult.m_dwID);
        if (nRetCode == 0)
        {
            goto Exit0;
        }

        nResult = nBranchFound;
Exit0:
        return(nResult);
    }
コード例 #3
0
ファイル: KSkill.cs プロジェクト: zuojiashun/src
    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);
    }
コード例 #4
0
ファイル: KAIAction.cs プロジェクト: zuojiashun/src
    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);
    }
コード例 #5
0
ファイル: KSkill.cs プロジェクト: zuojiashun/src
    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);
    }