예제 #1
0
double CScript::CreateCollectionEx(const char* CmdStr, char* retStr)
{
    CGUID ret;
    ret = NULL_GUID;

    // 返回的guid变量名
    char* szRetGUID = GetStringParam(CmdStr, 0);
    if(!szRetGUID) return -1;
    //##获取lRegionID的编号,如果是0,则设置为当前场景的id
    char* rgnID	= GetStringParam( CmdStr, 9 );
    if(!rgnID)
    {
        M_FREE( szRetGUID, sizeof(char)*MAX_VAR_LEN );
        return -1;
    }

    CGUID lRegionID;

    if(CScript::GetGeneralVariableList())
        lRegionID = CScript::GetGeneralVariableList()->GetGuidValue(rgnID);
    if(lRegionID == NULL_GUID && p_SrcShape)
        lRegionID = ((CPlayer*)p_SrcShape)->GetVariableList()->GetGuidValue(rgnID);
    if(lRegionID == NULL_GUID)
        lRegionID = GetVariableList()->GetGuidValue(rgnID);

    if( lRegionID == NULL_GUID && m_pRegion )
    {
        lRegionID = m_pRegion->GetExID();
    }

    char* p			= GetStringParam( CmdStr, 1 );
    if( p != NULL )
    {
        double nCounts 	= GetIntParam( CmdStr, 2 );
        double nLeft		= GetIntParam( CmdStr, 3 );
        double nTop		= GetIntParam( CmdStr, 4 );
        double nRight		= GetIntParam( CmdStr, 5 );
        double nBottom	= GetIntParam( CmdStr, 6 );
        char* strStart = GetStringParam( CmdStr, 7 );
        char* strEnd	= GetStringParam(CmdStr,8);
        double rgnType		= GetIntParam( CmdStr, 10 );
        int   iDir			= GetIntParam(CmdStr, 11);

        if( nCounts == ERROR_CODE || nLeft == ERROR_CODE || nRight == ERROR_CODE ||
                nTop == ERROR_CODE || nBottom == ERROR_CODE )
        {
            M_FREE( p, sizeof(char)*MAX_VAR_LEN );
            M_FREE( strStart, sizeof(char)*MAX_VAR_LEN );
            M_FREE( strEnd, sizeof(char)*MAX_VAR_LEN );
            M_FREE( szRetGUID, sizeof(char)*MAX_VAR_LEN );
            M_FREE( rgnID, sizeof(char)*MAX_VAR_LEN );
            return 0.0f;
        }
        if (iDir==ERROR_CODE || iDir== INVILID_VALUE)
        {
            iDir= -1;
        }

        CServerRegion* pRegion	= NULL;

        switch((eRgnType)(long)rgnType)
        {
        case RGN_NORMAL:
            pRegion = GameManager::GetInstance()->GetRgnManager()->FindRgnByRgnGUID(RGN_NORMAL, lRegionID);
            break;
        case RGN_PERSONAL_HOUSE:
            pRegion = GameManager::GetInstance()->GetRgnManager()->FindRgnByRgnGUID(RGN_PERSONAL_HOUSE, lRegionID);
            break;
        case RGN_PERSONAL:
            pRegion = GameManager::GetInstance()->GetRgnManager()->FindRgnByRgnGUID(RGN_PERSONAL, lRegionID);
            break;
        case RGN_TEAM:
            pRegion = GameManager::GetInstance()->GetRgnManager()->FindRgnByRgnGUID(RGN_TEAM, lRegionID);
            break;
        }

        if( pRegion == NULL )
            pRegion = static_cast<CServerRegion*>( m_pRegion );

        if( pRegion )
        {
            LONG lNewX = 0;
            LONG lNewY = 0;
            pRegion -> GetRandomPosInRange( lNewX, lNewY, nLeft, nTop, nRight - nLeft, nBottom - nTop );
            CCollection* pLeader = pRegion -> AddCollection( p, lNewX, lNewY,iDir );
            if( pLeader == NULL )
            {
                M_FREE( p, sizeof(char)*MAX_VAR_LEN );
                M_FREE( strStart, sizeof(char)*MAX_VAR_LEN );
                M_FREE( strEnd, sizeof(char)*MAX_VAR_LEN );
                M_FREE( szRetGUID, sizeof(char)*MAX_VAR_LEN );
                M_FREE( rgnID, sizeof(char)*MAX_VAR_LEN );
                return 0;
            }

            //设置返回值guid
            if(szRetGUID)
            {
                int retFlag = SetScriptGuidValue((CMoveShape*)p_SrcShape, szRetGUID, pLeader->GetExID());
            }
            // 添加脚本
            if (strStart && strcmp(strStart,"0")!=0)
            {
                pLeader->SetStartCollectScript(strStart);
            }
            if (strEnd && strcmp(strEnd,"0")!=0)
            {
                pLeader->SetEndCollectScript(strEnd);
            }

            ret = pLeader -> GetExID();

            for (int i=0; i<nCounts-1; i++)
            {
                pRegion -> GetRandomPosInRange( lNewX, lNewY, nLeft, nTop, nRight - nLeft, nBottom - nTop );
                pLeader = pRegion -> AddCollection( p, lNewX, lNewY, rand()%8 );
                if (pLeader)
                {
                    if (strStart)
                    {
                        pLeader->SetStartCollectScript(strStart);
                    }
                    if (strEnd)
                    {
                        pLeader->SetEndCollectScript(strEnd);
                    }
                }
            }
        }


        M_FREE( p, sizeof(char)*MAX_VAR_LEN );
        M_FREE( strStart, sizeof(char)*MAX_VAR_LEN );
        M_FREE( strEnd, sizeof(char)*MAX_VAR_LEN );
    }

    M_FREE( szRetGUID, sizeof(char)*MAX_VAR_LEN );
    M_FREE( rgnID, sizeof(char)*MAX_VAR_LEN );
    return 0.0f;
}
예제 #2
0
double CScript::CreateCollection(const char* CmdStr, char* retStr)
{
    //static CGUID ret; ret = NULL_GUID;

    // 返回的guid变量名
    char* szRetGUID = GetStringParam(CmdStr, 0);
    if(!szRetGUID) return 0;

    //##获取lRegionID的编号,如果是0,则设置为当前场景的id
    double rgnID	= GetIntParam( CmdStr, 9 );

    char* p			= GetStringParam( CmdStr, 1 );
    if( p != NULL )
    {
        double nCounts 	= GetIntParam( CmdStr, 2 );
        double nLeft		= GetIntParam( CmdStr, 3 );
        double nTop		= GetIntParam( CmdStr, 4 );
        double nRight		= GetIntParam( CmdStr, 5 );
        double nBottom	= GetIntParam( CmdStr, 6 );
        char* strStart = GetStringParam( CmdStr, 7 );
        char* strEnd	= GetStringParam(CmdStr,8);
        int	  iDir		= GetIntParam(CmdStr,10);

        if( nCounts == ERROR_CODE || nLeft == ERROR_CODE || nRight == ERROR_CODE ||
                nTop == ERROR_CODE || nBottom == ERROR_CODE )
        {
            M_FREE( p, sizeof(char)*MAX_VAR_LEN );
            M_FREE( szRetGUID, sizeof(char)*MAX_VAR_LEN );
            M_FREE( strStart, sizeof(char)*MAX_VAR_LEN );
            M_FREE( strEnd, sizeof(char)*MAX_VAR_LEN );
            return (long)(&NULL_GUID);
        }
        if (iDir== ERROR_CODE || iDir== INVILID_VALUE)
        {
            iDir= -1;
        }

        CServerRegion* pRegion = NULL;
        pRegion = GameManager::GetInstance()->GetRgnManager()->FindRgnByTemplateID(RGN_NORMAL, rgnID);
        if(pRegion == NULL)
            pRegion = GameManager::GetInstance()->GetRgnManager()->FindRgnByTemplateID(RGN_PERSONAL, rgnID);
        if(pRegion == NULL)
            pRegion = GameManager::GetInstance()->GetRgnManager()->FindRgnByTemplateID(RGN_PERSONAL_HOUSE, rgnID);
        if(pRegion == NULL)
            pRegion = GameManager::GetInstance()->GetRgnManager()->FindRgnByTemplateID(RGN_TEAM, rgnID);
        if( pRegion == NULL )
            pRegion = static_cast<CServerRegion*>( m_pRegion );
        if( pRegion )
        {
            LONG lNewX = 0;
            LONG lNewY = 0;
            //定点刷,不管这个点上是否有其他Shape
            //pRegion -> GetRandomPosInRange( lNewX, lNewY, nLeft, nTop, nRight - nLeft, nBottom - nTop );
            CCollection* pLeader = pRegion -> AddCollection( p, nLeft, nTop, iDir);
            if( pLeader == NULL )
            {
                M_FREE( p, sizeof(char)*MAX_VAR_LEN );
                M_FREE( szRetGUID, sizeof(char)*MAX_VAR_LEN );
                M_FREE( strStart, sizeof(char)*MAX_VAR_LEN );
                M_FREE( strEnd, sizeof(char)*MAX_VAR_LEN );
                return 0.0;
            }

            //设置返回值guid
            if(szRetGUID)
            {
                int retFlag = SetScriptGuidValue((CMoveShape*)p_SrcShape, szRetGUID, pLeader->GetExID());
            }


            // 添加脚本
            if (strStart && strcmp(strStart,"0")!=0)
            {
                pLeader->SetStartCollectScript(strStart);
            }
            if (strEnd && strcmp(strEnd,"0")!=0)
            {
                pLeader->SetEndCollectScript(strEnd);
            }

            //			ret = pLeader -> GetExID();

            for (int i=0; i<nCounts-1; i++)
            {
                pRegion -> GetRandomPosInRange( lNewX, lNewY, nLeft, nTop, nRight - nLeft, nBottom - nTop );
                pLeader = pRegion -> AddCollection( p, lNewX, lNewY, rand()%8 );
                if (pLeader)
                {
                    if (strStart)
                    {
                        pLeader->SetStartCollectScript(strStart);
                    }
                    if (strEnd)
                    {
                        pLeader->SetEndCollectScript(strEnd);
                    }
                }
            }
        }

        M_FREE( p, sizeof(char)*MAX_VAR_LEN );
        M_FREE( strStart, sizeof(char)*MAX_VAR_LEN );
        M_FREE( strEnd, sizeof(char)*MAX_VAR_LEN );
    }

    M_FREE( szRetGUID, sizeof(char)*MAX_VAR_LEN );
    return 1.0f;
}