159 lines
4.1 KiB
C++
159 lines
4.1 KiB
C++
|
||
/*
|
||
*用于管理游戏里职业和阵营的平衡
|
||
*比如战士、法师、道士,在随机选择的时候选择最小的推荐给玩家,避免职业失衡
|
||
*同样的是阵营的,在游戏初始化的时候装载,每添加一条记录在内存里更新,定期存盘一次
|
||
*避免每次查询职业的平衡都去数据表里查找
|
||
*/
|
||
#pragma once
|
||
|
||
// 玩家阵营分布
|
||
struct PlayerZYDistribute
|
||
{
|
||
PlayerZYDistribute()
|
||
{
|
||
Reset();
|
||
}
|
||
|
||
void Reset()
|
||
{
|
||
/*m_nServerIdx = 0;
|
||
for (INT_PTR i = 0; i < zyMax; i++)
|
||
m_anPlayerCount[i] = -1;*/
|
||
ZeroMemory(this, sizeof(*this));
|
||
}
|
||
|
||
INT_PTR m_nServerIdx; // 服务器Id
|
||
INT_PTR m_anPlayerCount[zyMax]; // 记录三个阵营的玩家数量
|
||
};
|
||
// 玩家职业分布
|
||
struct PlayerJobDistribute
|
||
{
|
||
PlayerJobDistribute()
|
||
{
|
||
Reset();
|
||
}
|
||
|
||
void Reset()
|
||
{
|
||
/*m_nServerIdx = 0;
|
||
for (INT_PTR i = 0; i < enMaxVocCount; i++)
|
||
m_anPlayerCount[i] = -1;*/
|
||
ZeroMemory(this, sizeof(*this));
|
||
}
|
||
INT_PTR m_nServerIdx; // 服务器Id
|
||
INT_PTR m_anPlayerCount[enMaxVocCount]; // 记录各个职业的玩家数量
|
||
};
|
||
|
||
struct PlayerNameDistribute
|
||
{
|
||
|
||
int nServerIdx; // 服务器Id
|
||
int guildid; //
|
||
char sName[32]; // 记录各个职业的玩家数量
|
||
|
||
PlayerNameDistribute()
|
||
{
|
||
ZeroMemory(this, sizeof(*this));
|
||
}
|
||
};
|
||
|
||
class CJobZyCountMgr
|
||
{
|
||
public:
|
||
CJobZyCountMgr();
|
||
|
||
//设置参数
|
||
void SetParam(CSQLConenction* pSql)
|
||
{
|
||
m_SQLConnection = pSql;
|
||
}
|
||
|
||
// DB服务器启动的时候自动加载玩家阵营分布数据
|
||
VOID LoadZyInitData();
|
||
// 保存玩家阵营分布数据(定时保存)
|
||
VOID SaveZyData();
|
||
|
||
// 新玩家创号
|
||
void OnNewPlayerCreated(int nSrvIdx, tagZhenying zy, tagActorVocation voc,char sName[32]);
|
||
|
||
//当新行会创建的时候
|
||
void OnNewGuildNameCreate(int nSrvIdx, char *sName, int nGuildId);
|
||
|
||
// DB服务器启动的时候自动加载玩家职业分布数据
|
||
VOID LoadJobInitData();
|
||
// 保存玩家职业分布数据(定时保存)
|
||
VOID SaveJobData();
|
||
|
||
|
||
// 获取优选职业(当前最少的职业)
|
||
int GetPriorityJob(int nSrvIdx);
|
||
|
||
// 获取可以选择的阵营(阵营人数低于35%的才能选择),返回按位的掩码
|
||
int GetOptionalZy(int nSrvIdx);
|
||
|
||
// 获取优选阵营(当前最少的阵营)
|
||
tagZhenying GetPriorityZY(int nSrvIdx);
|
||
|
||
//是否装载了职业数据
|
||
bool HasLoadJobData()
|
||
{
|
||
return m_bLoadJobData ;
|
||
}
|
||
|
||
//是否装载了正营数据
|
||
bool HasLoadZyData()
|
||
{
|
||
return m_bLoadZyData;
|
||
}
|
||
|
||
//是否装载了玩家名称数据
|
||
bool HasLoadActorNameData()
|
||
{
|
||
return m_bLoadNameData;
|
||
}
|
||
|
||
// DB服务器启动的时候自动加载玩家名称数据
|
||
void LoadActorNameInitData();
|
||
|
||
//装载行会列表
|
||
void LoadGuildNameInitData();
|
||
|
||
//判断是否名称已存在,如果判断在所有的几个服就输入-1
|
||
bool IsActorNameExist(char* sName,int nServerindex=-1);
|
||
|
||
//修改名字
|
||
void ChangeNameToList(char* sName,char* srcName,int nServerIndex);
|
||
|
||
//名字是否存在
|
||
bool IsGuildNameExist(char* sName,int nServerindex=-1);
|
||
//删除行会
|
||
bool RemoveGuildById(int Guild);
|
||
|
||
//int GetStrLenUtf8(LPCTSTR sName);
|
||
private:
|
||
|
||
// 用于创建角色选择阵营和职业
|
||
bool m_bLoadJobData;// 是否已经加载了初始的阵营、职业分布数据(针对DB断开重连的情况)
|
||
|
||
bool m_bLoadZyData;// 是否已经加载了初始的阵营、职业分布数据(针对DB断开重连的情况)
|
||
|
||
wylib::container::CBaseList<PlayerZYDistribute> m_vecZyDist; // 玩家阵营分布
|
||
wylib::container::CBaseList<PlayerJobDistribute> m_vecJobDist; // 玩家职业分布
|
||
bool m_bZyDataDirty;
|
||
bool m_bJobDataDirty;
|
||
CCSLock m_zyLock;
|
||
CCSLock m_jobLock;
|
||
CSQLConenction* m_SQLConnection; //数据库连接对象
|
||
|
||
wylib::container::CBaseList<PlayerNameDistribute> m_vecNameDist; // 已使用的玩家名称
|
||
|
||
|
||
wylib::container::CBaseList<PlayerNameDistribute> m_guildNameDist; //已使用过的行会的名称
|
||
|
||
bool m_bLoadNameData;// 是否已经加载了初始的玩家名称数据
|
||
bool m_bLoadGuildNameData; //是否装载过行会数据
|
||
|
||
CCSLock m_nameLock;
|
||
CCSLock m_guildNameLock; //行会名字的锁
|
||
}; |