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