594 lines
15 KiB
C++
594 lines
15 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "DistributeManager.h"
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagDistributeNode * CDistributeNodePool::m_pHeadOfFreeList=NULL;
|
|||
|
|
const int CDistributeNodePool::BLOCK_SIZE = 20;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define DISTRIBUTE_WAIT_TIMESTAMP 10 //<2F>ȴ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
CDistributeNodePool::CDistributeNodePool()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CDistributeNodePool::~CDistributeNodePool()
|
|||
|
|
{
|
|||
|
|
if(m_pHeadOfFreeList!=NULL)
|
|||
|
|
{
|
|||
|
|
tagDistributeNode * pDistributeNode=m_pHeadOfFreeList;
|
|||
|
|
while(pDistributeNode!=NULL)
|
|||
|
|
{
|
|||
|
|
//<2F><>ȫ<EFBFBD>ͷ<EFBFBD>
|
|||
|
|
m_pHeadOfFreeList = pDistributeNode->pNextDistributeNode;
|
|||
|
|
SafeDelete(pDistributeNode);
|
|||
|
|
pDistributeNode=m_pHeadOfFreeList;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagDistributeNode * CDistributeNodePool::AllocNode()
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡͷ<C8A1><CDB7><EFBFBD><EFBFBD>
|
|||
|
|
tagDistributeNode *pDistributeNode = m_pHeadOfFreeList;
|
|||
|
|
if(pDistributeNode!=NULL)
|
|||
|
|
m_pHeadOfFreeList = pDistributeNode->pNextDistributeNode;
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
|
for(int nIndex=0;nIndex<BLOCK_SIZE;nIndex++)
|
|||
|
|
{
|
|||
|
|
tagDistributeNode * pNewBlock = new tagDistributeNode;
|
|||
|
|
pNewBlock->pNextDistributeNode=m_pHeadOfFreeList;
|
|||
|
|
m_pHeadOfFreeList=pNewBlock;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
pDistributeNode = m_pHeadOfFreeList;
|
|||
|
|
m_pHeadOfFreeList=pDistributeNode->pNextDistributeNode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return pDistributeNode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>ͷŽ<CDB7><C5BD><EFBFBD>
|
|||
|
|
VOID CDistributeNodePool::FreeNode(void * pNode)
|
|||
|
|
{
|
|||
|
|
//<2F>黹<EFBFBD><E9BBB9><EFBFBD><EFBFBD>
|
|||
|
|
tagDistributeNode * pDeadNode = static_cast<tagDistributeNode*>(pNode);
|
|||
|
|
pDeadNode->pNextDistributeNode = m_pHeadOfFreeList;
|
|||
|
|
m_pHeadOfFreeList = pDeadNode;
|
|||
|
|
pNode=NULL;
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
CDistributeManager::CDistributeManager()
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
m_pHeadNode=NULL;
|
|||
|
|
m_wNodeCount=0;
|
|||
|
|
m_wAndroidCount=0;
|
|||
|
|
m_wRealCount=0;
|
|||
|
|
m_cbDistributeRule=0;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>
|
|||
|
|
m_SameTableMap.InitHashTable(10003);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CDistributeManager::~CDistributeManager()
|
|||
|
|
{
|
|||
|
|
//<2F>Ƴ<EFBFBD><C6B3>ڵ<EFBFBD>
|
|||
|
|
RemoveAll();
|
|||
|
|
|
|||
|
|
//<2F>ͷŶ<CDB7><C5B6><EFBFBD>
|
|||
|
|
m_SameTableBuffer.Append(m_SameTableActive);
|
|||
|
|
for(INT_PTR nIndex=0;nIndex<m_SameTableBuffer.GetCount();nIndex++)
|
|||
|
|
{
|
|||
|
|
SafeDelete(m_SameTableBuffer[nIndex]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>Ƴ<EFBFBD>Ԫ<EFBFBD><D4AA>
|
|||
|
|
m_SameTableBuffer.RemoveAll();
|
|||
|
|
m_SameTableActive.RemoveAll();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BOOL CDistributeManager::InsertDistributeNode(const tagDistributeInfo & DistributeInfo)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
|
|||
|
|
if (SearchNode(DistributeInfo.pIServerUserItem) != NULL)
|
|||
|
|
{
|
|||
|
|
// <20><>־;
|
|||
|
|
#if _DEBUG
|
|||
|
|
IServerUserItem* pMeServerUserItem = DistributeInfo.pIServerUserItem;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ;
|
|||
|
|
TCHAR szDescribe[128] = TEXT("");
|
|||
|
|
_sntprintf_s(szDescribe, CountArray(szDescribe), TEXT("player [%s] <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, GetUserStatus:[%d]. m_wAndroidCount=%d, m_wRealCount=%d, m_wNodeCount=%d."),
|
|||
|
|
pMeServerUserItem->GetNickName(), pMeServerUserItem->GetUserStatus(), m_wAndroidCount, m_wRealCount, m_wNodeCount);
|
|||
|
|
CTraceService::TraceString(szDescribe, TraceLevel_Warning);
|
|||
|
|
#endif
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ͷ<><CDB7><EFBFBD>ж<EFBFBD>
|
|||
|
|
if(m_pHeadNode==NULL)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
m_pHeadNode = m_DistributeNodePool.AllocNode();
|
|||
|
|
ASSERT(m_pHeadNode!=NULL);
|
|||
|
|
if(m_pHeadNode==NULL) return false;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
m_pHeadNode->pNextDistributeNode=NULL;
|
|||
|
|
m_pHeadNode->pPrepDistributeNode=NULL;
|
|||
|
|
CopyMemory(&m_pHeadNode->DistributeInfo,&DistributeInfo,sizeof(DistributeInfo));
|
|||
|
|
m_pHeadNode->DistributeInfo.pPertainNode=m_pHeadNode;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagDistributeNode * pDistributeNode = m_DistributeNodePool.AllocNode();
|
|||
|
|
ASSERT(pDistributeNode!=NULL);
|
|||
|
|
if(pDistributeNode==NULL) return false;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
|
|||
|
|
pDistributeNode->pNextDistributeNode=NULL;
|
|||
|
|
pDistributeNode->pPrepDistributeNode=NULL;
|
|||
|
|
CopyMemory(&pDistributeNode->DistributeInfo,&DistributeInfo,sizeof(DistributeInfo));
|
|||
|
|
pDistributeNode->DistributeInfo.pPertainNode=pDistributeNode;
|
|||
|
|
|
|||
|
|
//<2F><>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
|
|||
|
|
if(m_pHeadNode->pNextDistributeNode!=NULL)
|
|||
|
|
{
|
|||
|
|
m_pHeadNode->pNextDistributeNode->pPrepDistributeNode=pDistributeNode;
|
|||
|
|
pDistributeNode->pNextDistributeNode=m_pHeadNode->pNextDistributeNode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pDistributeNode->pPrepDistributeNode=m_pHeadNode;
|
|||
|
|
m_pHeadNode->pNextDistributeNode=pDistributeNode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
|
if(DistributeInfo.pIServerUserItem->IsAndroidUser())
|
|||
|
|
++m_wAndroidCount;
|
|||
|
|
else
|
|||
|
|
++m_wRealCount;
|
|||
|
|
++m_wNodeCount;
|
|||
|
|
|
|||
|
|
// <20><>־;
|
|||
|
|
#if _DEBUG
|
|||
|
|
IServerUserItem* pMeServerUserItem = DistributeInfo.pIServerUserItem;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ;
|
|||
|
|
TCHAR szDescribe[128] = TEXT("");
|
|||
|
|
_sntprintf_s(szDescribe, CountArray(szDescribe), TEXT("player [%s] InsertDistributeNode, GetUserStatus:[%d]. m_wAndroidCount=%d, m_wRealCount=%d, m_wNodeCount=%d."),
|
|||
|
|
pMeServerUserItem->GetNickName(), pMeServerUserItem->GetUserStatus(), m_wAndroidCount, m_wRealCount, m_wNodeCount);
|
|||
|
|
CTraceService::TraceString(szDescribe, TraceLevel_Warning);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
VOID CDistributeManager::RemoveDistributeNode(const IServerUserItem * pIServerUserItem)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD>
|
|||
|
|
tagDistributeNode *pDistributeNode=SearchNode(pIServerUserItem);
|
|||
|
|
if(pDistributeNode!=NULL)
|
|||
|
|
RemoveDistributeNode(pDistributeNode);
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
VOID CDistributeManager::RemoveDistributeNode(tagDistributeNode * pDistributeNode)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
|
|||
|
|
if(pDistributeNode==NULL) return;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
|
|||
|
|
if(SearchNode(pDistributeNode->DistributeInfo.pIServerUserItem)==NULL) return;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagDistributeNode *pPrepNode=pDistributeNode->pPrepDistributeNode;
|
|||
|
|
tagDistributeNode *pNextNode=pDistributeNode->pNextDistributeNode;
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(pPrepNode!=NULL)
|
|||
|
|
{
|
|||
|
|
if(pNextNode!=NULL)
|
|||
|
|
{
|
|||
|
|
pPrepNode->pNextDistributeNode=pNextNode;
|
|||
|
|
pNextNode->pPrepDistributeNode=pPrepNode;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//<2F><>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
|
|||
|
|
if(pPrepNode->pNextDistributeNode==pDistributeNode)
|
|||
|
|
pPrepNode->pNextDistributeNode=NULL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(pNextNode!=NULL)
|
|||
|
|
{
|
|||
|
|
pNextNode->pPrepDistributeNode=NULL;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD>ͷ
|
|||
|
|
m_pHeadNode=pNextNode;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_pHeadNode=NULL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
|
if(pDistributeNode->DistributeInfo.pIServerUserItem->IsAndroidUser())
|
|||
|
|
--m_wAndroidCount;
|
|||
|
|
else
|
|||
|
|
--m_wRealCount;
|
|||
|
|
--m_wNodeCount;
|
|||
|
|
|
|||
|
|
// <20><>־;
|
|||
|
|
#if _DEBUG
|
|||
|
|
IServerUserItem* pMeServerUserItem = pDistributeNode->DistributeInfo.pIServerUserItem;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ;
|
|||
|
|
TCHAR szDescribe[128] = TEXT("");
|
|||
|
|
_sntprintf_s(szDescribe, CountArray(szDescribe), TEXT("player [%s] RemoveDistributeNode, GetUserStatus:[%d]. m_wAndroidCount=%d, m_wRealCount=%d, m_wNodeCount=%d."),
|
|||
|
|
pMeServerUserItem->GetNickName(), pMeServerUserItem->GetUserStatus(), m_wAndroidCount, m_wRealCount, m_wNodeCount);
|
|||
|
|
CTraceService::TraceString(szDescribe, TraceLevel_Warning);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
//<2F><>ȫ<EFBFBD>ͷ<EFBFBD>
|
|||
|
|
m_DistributeNodePool.FreeNode(pDistributeNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
VOID CDistributeManager::RemoveAll()
|
|||
|
|
{
|
|||
|
|
//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|||
|
|
while(m_pHeadNode!=NULL) RemoveDistributeNode(m_pHeadNode);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
m_pHeadNode=NULL;
|
|||
|
|
m_wNodeCount=0;
|
|||
|
|
m_wAndroidCount=0;
|
|||
|
|
m_wRealCount=0;
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ִ<>з<EFBFBD><D0B7><EFBFBD>
|
|||
|
|
WORD CDistributeManager::PerformDistribute(CDistributeInfoArray & DistributeInfoArray,WORD wNeedCount)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagDistributeNode * pMoveNode=NULL;
|
|||
|
|
tagDistributeNode * pMoveStartNode=NULL;
|
|||
|
|
if(m_pHeadNode!=NULL && m_wNodeCount>1)
|
|||
|
|
{
|
|||
|
|
pMoveNode = m_pHeadNode;
|
|||
|
|
WORD wRandNodeIndex=rand()%m_wNodeCount;
|
|||
|
|
while(wRandNodeIndex-->0)
|
|||
|
|
{
|
|||
|
|
if(pMoveNode==NULL)
|
|||
|
|
{
|
|||
|
|
pMoveNode = m_pHeadNode;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
pMoveNode = pMoveNode->pNextDistributeNode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
if(pMoveNode!=NULL) pMoveStartNode = pMoveNode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//
|
|||
|
|
if(pMoveNode==NULL) return 0;
|
|||
|
|
|
|||
|
|
//<2F><>ȡʱ<C8A1><CAB1><EFBFBD><EFBFBD>
|
|||
|
|
DWORD dwCurrentStamp = (DWORD)time(NULL);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
bool bAllRealPlayer = (m_wRealCount >= wNeedCount);
|
|||
|
|
WORD wNeedAndroidNum = 0;
|
|||
|
|
if (!bAllRealPlayer)
|
|||
|
|
{
|
|||
|
|
wNeedAndroidNum = wNeedCount - m_wRealCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BOOL bFirstSuccess = TRUE;
|
|||
|
|
|
|||
|
|
//<2F>ȴ<EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
if (dwCurrentStamp - pMoveNode->DistributeInfo.dwInsertStamp < DISTRIBUTE_WAIT_TIMESTAMP)
|
|||
|
|
bFirstSuccess = FALSE;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˹<EFBFBD><CBB9><EFBFBD>;
|
|||
|
|
IServerUserItem * pIServerUserItem = pMoveNode->DistributeInfo.pIServerUserItem;
|
|||
|
|
if (pIServerUserItem->IsAndroidUser() == true) break;
|
|||
|
|
|
|||
|
|
//<2F>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (DistributeInfoArray.GetCount() > 0 && DistributeInfoArray[0].wDistribute != pMoveNode->DistributeInfo.wDistribute)
|
|||
|
|
bFirstSuccess = FALSE;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (bFirstSuccess == TRUE && DistributeInfoArray.GetCount() == wNeedCount - 1 &&
|
|||
|
|
FilterRuleIsAllAndroid(DistributeInfoArray, pMoveNode->DistributeInfo.pIServerUserItem))
|
|||
|
|
bFirstSuccess = FALSE;
|
|||
|
|
|
|||
|
|
//ͬIP<49><50><EFBFBD><EFBFBD>
|
|||
|
|
if (bFirstSuccess == TRUE && (m_cbDistributeRule&DISTRIBUTE_SAME_ADDRESS) == 0 &&
|
|||
|
|
FilterRuleExitsIPAddr(DistributeInfoArray, pMoveNode->DistributeInfo.dwClientAddr) == TRUE)
|
|||
|
|
bFirstSuccess = FALSE;
|
|||
|
|
|
|||
|
|
//ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (bFirstSuccess == TRUE && (m_cbDistributeRule&DISTRIBUTE_LAST_TABLE) == 0 &&
|
|||
|
|
FilterRuleIsLastSameTable(DistributeInfoArray, pMoveNode->DistributeInfo.pIServerUserItem->GetUserID()) == TRUE)
|
|||
|
|
bFirstSuccess = FALSE;
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD>ɹ<EFBFBD>
|
|||
|
|
if (bFirstSuccess == TRUE) DistributeInfoArray.Add(pMoveNode->DistributeInfo);
|
|||
|
|
|
|||
|
|
//<2F><>ǰ<EFBFBD>ƽ<EFBFBD>
|
|||
|
|
pMoveNode = pMoveNode->pNextDistributeNode;
|
|||
|
|
if (pMoveNode == NULL) pMoveNode = m_pHeadNode;
|
|||
|
|
|
|||
|
|
//<2F>ɹ<EFBFBD><C9B9>ж<EFBFBD>
|
|||
|
|
if (DistributeInfoArray.GetCount() >= wNeedCount) break;
|
|||
|
|
|
|||
|
|
} while (pMoveNode && pMoveNode != pMoveStartNode);
|
|||
|
|
|
|||
|
|
//<2F>ɹ<EFBFBD><C9B9>ж<EFBFBD>
|
|||
|
|
if (DistributeInfoArray.GetCount() >= wNeedCount)
|
|||
|
|
{
|
|||
|
|
return (WORD)DistributeInfoArray.GetCount();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD>û<EFBFBD>;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BOOL bFirstSuccess=TRUE;
|
|||
|
|
|
|||
|
|
//<2F>ȴ<EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
if(dwCurrentStamp-pMoveNode->DistributeInfo.dwInsertStamp< DISTRIBUTE_WAIT_TIMESTAMP)
|
|||
|
|
bFirstSuccess=FALSE;
|
|||
|
|
|
|||
|
|
//<2F>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(DistributeInfoArray.GetCount()>0 && DistributeInfoArray[0].wDistribute!=pMoveNode->DistributeInfo.wDistribute)
|
|||
|
|
bFirstSuccess=FALSE;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˹<EFBFBD><CBB9><EFBFBD>;(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>);
|
|||
|
|
if (bFirstSuccess && bAllRealPlayer && (pMoveNode->DistributeInfo.pIServerUserItem != NULL) &&
|
|||
|
|
pMoveNode->DistributeInfo.pIServerUserItem->IsAndroidUser())
|
|||
|
|
bFirstSuccess = FALSE;
|
|||
|
|
|
|||
|
|
if (bFirstSuccess && !bAllRealPlayer && GetAndroidNum(DistributeInfoArray) >= wNeedAndroidNum )
|
|||
|
|
{
|
|||
|
|
bFirstSuccess = FALSE;
|
|||
|
|
bAllRealPlayer = true;
|
|||
|
|
wNeedAndroidNum = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(bFirstSuccess==TRUE && DistributeInfoArray.GetCount()==wNeedCount-1 &&
|
|||
|
|
FilterRuleIsAllAndroid(DistributeInfoArray,pMoveNode->DistributeInfo.pIServerUserItem))
|
|||
|
|
bFirstSuccess=FALSE;
|
|||
|
|
|
|||
|
|
//ͬIP<49><50><EFBFBD><EFBFBD>
|
|||
|
|
if(bFirstSuccess==TRUE && (m_cbDistributeRule&DISTRIBUTE_SAME_ADDRESS)==0 &&
|
|||
|
|
FilterRuleExitsIPAddr(DistributeInfoArray,pMoveNode->DistributeInfo.dwClientAddr)==TRUE)
|
|||
|
|
bFirstSuccess=FALSE;
|
|||
|
|
|
|||
|
|
//ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(bFirstSuccess==TRUE && (m_cbDistributeRule&DISTRIBUTE_LAST_TABLE)==0 &&
|
|||
|
|
FilterRuleIsLastSameTable(DistributeInfoArray,pMoveNode->DistributeInfo.pIServerUserItem->GetUserID())==TRUE)
|
|||
|
|
bFirstSuccess=FALSE;
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD>ɹ<EFBFBD>
|
|||
|
|
if(bFirstSuccess==TRUE) DistributeInfoArray.Add(pMoveNode->DistributeInfo);
|
|||
|
|
|
|||
|
|
//<2F><>ǰ<EFBFBD>ƽ<EFBFBD>
|
|||
|
|
pMoveNode=pMoveNode->pNextDistributeNode;
|
|||
|
|
if(pMoveNode==NULL) pMoveNode = m_pHeadNode;
|
|||
|
|
|
|||
|
|
//<2F>ɹ<EFBFBD><C9B9>ж<EFBFBD>
|
|||
|
|
if(DistributeInfoArray.GetCount()==wNeedCount) break;
|
|||
|
|
|
|||
|
|
}while(pMoveNode && pMoveNode!=pMoveStartNode);
|
|||
|
|
|
|||
|
|
return (WORD)DistributeInfoArray.GetCount();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1>Ϣ
|
|||
|
|
tagSameTableInfo * CDistributeManager::GetUserSameTableInfo(DWORD dwUserID)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagSameTableInfo * pSameTableInfo;
|
|||
|
|
if(m_SameTableMap.Lookup(dwUserID,pSameTableInfo)==FALSE)
|
|||
|
|
{
|
|||
|
|
pSameTableInfo = ActiveSameTableInfo();
|
|||
|
|
m_SameTableMap[dwUserID] = pSameTableInfo;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return pSameTableInfo;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD>Ϣ
|
|||
|
|
VOID CDistributeManager::RemoveUserSameTableInfo(DWORD dwUserID)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagSameTableInfo * pSameTableInfo;
|
|||
|
|
if(m_SameTableMap.Lookup(dwUserID,pSameTableInfo)==TRUE)
|
|||
|
|
{
|
|||
|
|
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD>Ϣ
|
|||
|
|
m_SameTableMap.RemoveKey(dwUserID);
|
|||
|
|
RemoveSameTableInfo(pSameTableInfo);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagSameTableInfo * CDistributeManager::ActiveSameTableInfo()
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>
|
|||
|
|
if(m_SameTableBuffer.GetCount()>0)
|
|||
|
|
{
|
|||
|
|
tagSameTableInfo * pSameTableInfo = m_SameTableBuffer.GetAt(0);
|
|||
|
|
m_SameTableBuffer.RemoveAt(0);
|
|||
|
|
m_SameTableActive.Add(pSameTableInfo);
|
|||
|
|
return pSameTableInfo;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagSameTableInfo * pSameTableInfo = new tagSameTableInfo;
|
|||
|
|
if(pSameTableInfo==NULL) throw(TEXT("<EFBFBD>ڴ治<EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>!"));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD>
|
|||
|
|
ZeroMemory(pSameTableInfo,sizeof(tagSameTableInfo));
|
|||
|
|
m_SameTableActive.Add(pSameTableInfo);
|
|||
|
|
|
|||
|
|
return pSameTableInfo;
|
|||
|
|
}
|
|||
|
|
catch(...)
|
|||
|
|
{
|
|||
|
|
ASSERT(FALSE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
VOID CDistributeManager::RemoveSameTableInfo(tagSameTableInfo * pSameTableInfo)
|
|||
|
|
{
|
|||
|
|
ZeroMemory(pSameTableInfo,sizeof(tagSameTableInfo));
|
|||
|
|
m_SameTableBuffer.Add(pSameTableInfo);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>Ҷ<EFBFBD><D2B6><EFBFBD>
|
|||
|
|
for(INT_PTR nIndex=0;nIndex<m_SameTableActive.GetCount();nIndex++)
|
|||
|
|
{
|
|||
|
|
if(m_SameTableActive[nIndex]==pSameTableInfo)
|
|||
|
|
{
|
|||
|
|
m_SameTableActive.RemoveAt(nIndex);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD>
|
|||
|
|
tagDistributeNode * CDistributeManager::SearchNode(const IServerUserItem * const pIServerUserItem)
|
|||
|
|
{
|
|||
|
|
if(m_pHeadNode==NULL) return NULL;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
tagDistributeNode *pMoveNode=m_pHeadNode;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD>
|
|||
|
|
while(pMoveNode!=NULL)
|
|||
|
|
{
|
|||
|
|
//<2F>ӿ<EFBFBD><D3BF>ж<EFBFBD>
|
|||
|
|
if(pMoveNode->DistributeInfo.pIServerUserItem==pIServerUserItem)
|
|||
|
|
return pMoveNode;
|
|||
|
|
|
|||
|
|
//<2F><>ǰ<EFBFBD>ƽ<EFBFBD>
|
|||
|
|
pMoveNode=pMoveNode->pNextDistributeNode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//IPַͬ
|
|||
|
|
BOOL CDistributeManager::FilterRuleExitsIPAddr(const CDistributeInfoArray & DistributeInfoArray,DWORD dwClientAddr)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ͬIP
|
|||
|
|
for(INT_PTR nIndex=0;nIndex<DistributeInfoArray.GetCount();nIndex++)
|
|||
|
|
{
|
|||
|
|
if(DistributeInfoArray[nIndex].dwClientAddr==dwClientAddr)
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
BOOL CDistributeManager::FilterRuleIsAllAndroid(const CDistributeInfoArray & DistributeInfoArray,IServerUserItem * const pIServerUserItem)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
|
|||
|
|
if(pIServerUserItem==NULL || DistributeInfoArray.GetCount()==0) return FALSE;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
WORD wAndroidCount=0;
|
|||
|
|
|
|||
|
|
//ͳ<>ƻ<EFBFBD><C6BB><EFBFBD>
|
|||
|
|
for(INT_PTR nIndex=0;nIndex<DistributeInfoArray.GetCount();nIndex++)
|
|||
|
|
{
|
|||
|
|
if(DistributeInfoArray[nIndex].pIServerUserItem->IsAndroidUser()==true)
|
|||
|
|
++wAndroidCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return (wAndroidCount==DistributeInfoArray.GetCount()) && pIServerUserItem->IsAndroidUser();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>Ͼ<EFBFBD>ͬ<EFBFBD><CDAC>
|
|||
|
|
BOOL CDistributeManager::FilterRuleIsLastSameTable(const CDistributeInfoArray & DistributeInfoArray,DWORD dwUserID)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
|
|||
|
|
if(DistributeInfoArray.GetCount()==0) return FALSE;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tagSameTableInfo * pSameTableInfo=NULL;
|
|||
|
|
|
|||
|
|
for(INT_PTR nIndex=0;nIndex<DistributeInfoArray.GetCount();nIndex++)
|
|||
|
|
{
|
|||
|
|
pSameTableInfo = GetUserSameTableInfo(DistributeInfoArray[nIndex].pIServerUserItem->GetUserID());
|
|||
|
|
if(pSameTableInfo!=NULL)
|
|||
|
|
{
|
|||
|
|
for(WORD i=0;i<pSameTableInfo->wPlayerCount;i++)
|
|||
|
|
{
|
|||
|
|
if(pSameTableInfo->wPlayerIDSet[i]==dwUserID) return TRUE;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
WORD CDistributeManager::GetAndroidNum(const CDistributeInfoArray & DistributeInfoArray)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
WORD wAndroidCount = 0;
|
|||
|
|
INT_PTR nSize = DistributeInfoArray.GetCount();
|
|||
|
|
|
|||
|
|
//ͳ<>ƻ<EFBFBD><C6BB><EFBFBD>
|
|||
|
|
for (INT_PTR nIndex = 0; nIndex < nSize; nIndex++)
|
|||
|
|
{
|
|||
|
|
if (DistributeInfoArray[nIndex].pIServerUserItem->IsAndroidUser() == true)
|
|||
|
|
++wAndroidCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return wAndroidCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|