Files
2026-03-03 13:56:44 +08:00

165 lines
4.3 KiB
C++

#ifndef DISTRIBUTE_MANAGER_HEAD_FILE
#define DISTRIBUTE_MANAGER_HEAD_FILE
#pragma once
#include "Stdafx.h"
//////////////////////////////////////////////////////////////////////////////////
//同桌信息
struct tagSameTableInfo
{
WORD wPlayerCount; //玩家数目
DWORD wPlayerIDSet[16]; //玩家集合
};
//分组数据
struct tagDistributeInfo
{
WORD wDistribute; //分配等级
DWORD dwClientAddr; //玩家地址
DWORD dwInsertStamp; //插入时间
IServerUserItem * pIServerUserItem; //用户接口
VOID * pPertainNode; //所属结点
};
//分组结点
struct tagDistributeNode
{
tagDistributeNode * pPrepDistributeNode; //前一结点
tagDistributeNode * pNextDistributeNode; //下一结点
tagDistributeInfo DistributeInfo; //分组信息
tagDistributeNode()
{
pPrepDistributeNode=NULL;
pNextDistributeNode=NULL;
}
~tagDistributeNode()
{
pPrepDistributeNode=NULL;
pNextDistributeNode=NULL;
}
};
//////////////////////////////////////////////////////////////////////////////////
//类型定义
typedef CWHArray<tagDistributeInfo> CDistributeInfoArray; //分组数组
typedef CWHArray<tagSameTableInfo *> CSameTableArray; //同坐数组
typedef CMap<DWORD,DWORD,tagSameTableInfo *, tagSameTableInfo*> CSameTableMap; //同桌信息
//////////////////////////////////////////////////////////////////////////////////
//结点池
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; //机器数目
//存储变量
protected:
CSameTableArray m_SameTableBuffer; //同桌缓冲
CSameTableArray m_SameTableActive; //同桌数组
CSameTableMap m_SameTableMap; //同桌字典
//管理变量
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; }
//功能函数
public:
//移除结点
VOID RemoveAll();
//插入结点
BOOL InsertDistributeNode(const tagDistributeInfo & DistributeInfo);
//移除结点
VOID RemoveDistributeNode(tagDistributeNode * pDistributeNode);
//移除结点
VOID RemoveDistributeNode(const IServerUserItem * pIServerUserItem);
//执行分组
WORD PerformDistribute(CDistributeInfoArray & DistributeInfoArray,WORD wNeedCount);
//功能函数
public:
//查找结点
tagDistributeNode* SearchNode(const IServerUserItem * const pIServerUserItem);
//获取信息
tagSameTableInfo * GetUserSameTableInfo(DWORD dwUserID);
//移除信息
VOID RemoveUserSameTableInfo(DWORD dwUserID);
//内部函数
protected:
//激活对象
tagSameTableInfo * ActiveSameTableInfo();
//移除对象
VOID RemoveSameTableInfo(tagSameTableInfo * pSameTableInfo);
//获得机器人的数目;
WORD GetAndroidNum(const CDistributeInfoArray & DistributeInfoArray);
//规则函数
protected:
//IP同址
inline BOOL FilterRuleExitsIPAddr(const CDistributeInfoArray & DistributeInfoArray,DWORD dwClientAddr);
//机器过滤
inline BOOL FilterRuleIsAllAndroid(const CDistributeInfoArray & DistributeInfoArray, IServerUserItem * const pIServerUserItem);
//上局同桌
inline BOOL FilterRuleIsLastSameTable(const CDistributeInfoArray & DistributeInfoArray,DWORD dwUserID);
};
//////////////////////////////////////////////////////////////////////////////////
#endif