Files
wnmj-normal/Servers/服务器组件/游戏服务器/DistributeManager.h
2026-03-03 13:56:44 +08:00

143 lines
3.7 KiB
C++

#ifndef DISTRIBUTE_MANAGER_HEAD_FILE
#define DISTRIBUTE_MANAGER_HEAD_FILE
#pragma once
#include "Stdafx.h"
//////////////////////////////////////////////////////////////////////////////////
//分组数据
struct tagDistributeInfo
{
WORD wDistribute; //分配等级
WORD wLastTableID; //上次桌子
DWORD dwClientAddr; //玩家地址
DWORD dwSequence; //列表序列
IServerUserItem * pIServerUserItem; //用户接口
VOID * pPertainNode; //所属结点
};
//分组结点
struct tagDistributeNode
{
tagDistributeNode * pPrepDistributeNode; //前一结点
tagDistributeNode * pNextDistributeNode; //下一结点
tagDistributeNode * pNextSameTableNode; //同桌结点
tagDistributeInfo DistributeInfo; //分组信息
tagDistributeNode()
{
pPrepDistributeNode=NULL;
pNextDistributeNode=NULL;
pNextSameTableNode=NULL;
}
~tagDistributeNode()
{
pPrepDistributeNode=NULL;
pNextDistributeNode=NULL;
pNextSameTableNode=NULL;
}
};
//////////////////////////////////////////////////////////////////////////////////
typedef CWHArray<tagDistributeInfo> CDistributeInfoArray; //分组数组
//////////////////////////////////////////////////////////////////////////////////
//结点池
class CDistributeNodePool
{
//管理变量
public:
static const int BLOCK_SIZE;
static tagDistributeNode * m_pHeadOfFreeList;
//函数定义
public:
//构造函数
CDistributeNodePool();
//析构函数
~CDistributeNodePool();
//功能函数
public:
//分配结点
tagDistributeNode * AllocNode();
//释放结点
VOID FreeNode(void * pNode);
};
//////////////////////////////////////////////////////////////////////////////////
//分组管理
class CDistributeManager
{
//数目变量
protected:
WORD m_wNodeCount; //结点数目
WORD m_wRealCount; //真人数目
WORD m_wAndroidCount; //机器数目
DWORD m_dwSequence; //分配序列
//管理变量
protected:
CDistributeNodePool m_DistributeNodePool; //结点池
tagDistributeNode * m_pHeadNode; //头部结点
//分组变量
protected:
BYTE m_cbDistributeRule; //分组规则
//函数定义
public:
//构造函数
CDistributeManager();
//析构函数
virtual ~CDistributeManager();
//内联函数
public:
//结点数目
inline WORD GetCount() { return m_wNodeCount; }
//真人数目
inline WORD GetRealCount() { return m_wRealCount; };
//机器数目
inline WORD GetAndroidCount() { return m_wAndroidCount; };
//设置规则
inline VOID SetDistributeRule(BYTE cbDistributeRule) { m_cbDistributeRule=cbDistributeRule; }
//内部函数
protected:
//查找结点
tagDistributeNode* SearchNode(const IServerUserItem * const pIServerUserItem);
//功能函数
public:
//插入结点
BOOL InsertDistributeNode(const tagDistributeInfo & DistributeInfo);
//移除结点
VOID RemoveDistributeNode(tagDistributeNode * pDistributeNode);
//移除结点
VOID RemoveDistributeNode(const IServerUserItem * pIServerUserItem);
//移除结点
VOID RemoveAll();
//执行分组
WORD PerformDistribute(CDistributeInfoArray & DistributeInfoArray,WORD wNeedCount);
//规则函数
protected:
//IP同址
inline BOOL FilterRuleExitsIPAddr(const CDistributeInfoArray & DistributeInfoArray,DWORD dwClientAddr);
//机器过滤
inline BOOL FilterRuleIsAllAndroid(const CDistributeInfoArray & DistributeInfoArray, IServerUserItem * const pIServerUserItem);
//相邻玩家
inline BOOL FilterRuleAdjacent(const CDistributeInfoArray & DistributeInfoArray, DWORD dwSequence);
};
//////////////////////////////////////////////////////////////////////////////////
#endif