Files
mir_server/server/SessionServer/SSProto.h

265 lines
8.8 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _SS_PROTO_H_
#define _SS_PROTO_H_
//账号状态标志位
/*
enum tagSessionCmd
{
//效验用户名和密码,以及是否能够登陆 角色名称shortString,密码shortString
cLoginSyn = 1,
//选择服务器(erroridShort int)
cSelectServer =2,
//创建一个账户,用于创建账户测试的,账户的名字和密码
cCreateAccount =3,
//效验用户名和密码,以及是否能够登陆的结果 (serveridint)
sLoginAck = 1,
//选择服务器的结果 (serveridint,resshort int,Host: short string, port:short int)
sSelectServer = 2,
//创建一个账户的结果
sCreateAccount =3,
};
*/
/**
256
25664K则会造成较多的内存浪费
**/
typedef struct tagGameSession
{
Uint64 nSessionID; //会话ID
int nServerIndex; //会话登录的服务器ID
int nIsRawLogin; //是否在原始服务器登录
LONGLONG nIPAddr; //会话登录的IP地址支持IPv6
TICKCOUNT dwSessionTick; //会话建立的时间
jxSrvDef::GSSTATE nState; //会话状态(登录、查询角色还是已经进入游戏)
jxSrvDef::ACCOUNT sAccount; //会话账号
TICKCOUNT dwTimeOut; //会话超时时间(在等待查询角色以及等待进入游戏状态下有效)
int nConfimSrvCount;//确认会话是否登录,需要等待回应的服务器数量
int nGmLevel; //GM等级
UINT64 lKey; //登陆的随机key
}GAMESESSION, *PGAMESESSION;
/**
**/
typedef struct tagCharGateRoute
{
int nServerIndex; //服务器ID
int nRouteCount; //路由地址数量
struct
{
char sHost[124]; //服务器地址(客户端支持域名)
int nPort; //服务器端口
} RouteTable[16]; //路由表
}CHARGATEROUTE, *PCHARGATEROUTE;
/**
线
**/
typedef struct tagAdminLoginRecord
{
enum eRecordType
{
alAccount = 0, //记录是一个账号
alIPAddress, //记录是一个IP地址
} eRecType;
char sRecData[124]; //如果eRecType为alAccount则表示账号为alIPAddress则表示IP地址
}ADMINLOGINRECORD, *PADMINLOGINRECORD;
/*
** IDID等信息
*/
typedef struct tagLogicServerInfo
{
int server_id; // 服务器ID
int cserver_id; // 连接的公共服务器ID
char serverName[32]; // 服务器名称
}LOGICSERVERINFO, *PLOGICSERVERINFO;
/*
**
*/
class CommServerClient
{
public:
CommServerClient()
{
}
~CommServerClient()
{
Clear();
}
void Clear()
{
ClientList.trunc(0);
}
void Add(const int nClientServerId)
{
bool bRepeat = false;
for (INT_PTR i = 0; i < ClientList.count(); i++)
{
if (nClientServerId == ClientList[i])
{
OutputMsg(rmError, _T("发现重复的ClientServerId配置[cserverid=%d serverid=%d]"),
cserver_id,
nClientServerId);
bRepeat = true;
break;
}
}
if (!bRepeat)
ClientList.add(nClientServerId);
}
void Trace()
{
//OutputMsg(rmTip, _T("公共服务器[%d]连接的客户端数量为:"), cserver_id, (int)ClientList.count());
for (INT_PTR i = 0; i < ClientList.count(); i++)
{
OutputMsg(rmTip, _T("客户端_%2d服务器ID:%d"), (int)(i+1), (int)ClientList[i]);
}
}
int cserver_id; // 公共服务器ID
CBaseList<int> ClientList; // 连接的客户逻辑服务器ID列表
};
class CommServerClientList
{
public:
~CommServerClientList()
{
Clear();
}
void Clear()
{
for (INT_PTR i = 0; i < m_ClientList.count(); i++)
{
m_ClientList[i].Clear();
}
}
void AddClient(const int nCommServerId, const int nClientServerId)
{
if (nCommServerId == nClientServerId)
return;
CommServerClient *pServerClient = GetServerClient(nCommServerId);
if (!pServerClient)
{
CommServerClient sc;
sc.cserver_id = nCommServerId;
INT_PTR nIdx = m_ClientList.add(sc);
pServerClient = (CommServerClient *)&m_ClientList.get(nIdx);
}
pServerClient->Add(nClientServerId);
}
CommServerClient* GetServerClient(const int nCommServerId) const
{
for (INT_PTR i = 0; i < m_ClientList.count(); i++)
{
if (nCommServerId == m_ClientList[i].cserver_id)
return &m_ClientList[i];
}
return NULL;
}
void Trace()
{
for (INT_PTR i = 0; i < m_ClientList.count(); i++)
{
m_ClientList[i].Trace();
}
}
private:
CBaseList<CommServerClient> m_ClientList;
};
//客户端登录失败错误号
#define LOGINERR_USRNOTEXISTS -1 //用户不存在
#define LOGINERR_PSWDFAILURE -2 //密码错误
#define LOGINERR_USERDISABLED -3 //账号已被禁用
#define LOGINERR_USERNOTAVAILABLE -4 //尚未激活游戏
#define LOGINERR_LOGINLOCKCHECKFAIL -5 //
#define LOGINERR_DISABLELOGINTHISGAME -6 //
#define LOGINERR_ALREADYLOGIN -7
#define LOGINERR_SERVERBUSY -8
#define LOGINERR_LOGINONWAITING -9
#define LOGINERR_INPUT_SECURENUMBER -10
#define LOGINERR_USERFULL -11
/* 网关模块内部消息定义
*******************************************/
#define GTIM_CONFIM_SESSION_RESULT 10001 //会话服务器向网关用户投递确认会话是否在线的结果(Param1=会话IDParam2=是否在线(0:1))
#define GTIM_CONFIRM_OPEN_SESSION 10012 //确认已经打开了会话
/* 会话服务器模块内部消息定义
*******************************************/
#define SSIM_POST_CLOSE_SESSION 20001 //按会话ID关闭会话(Param1=会话ID,Param2=会话连续在线时间(用于防沉迷中统计在线时间))
#define SSIM_USER_EXISTS_OF_SESSION_RESULT 20002 //网关按会话ID检查用户是否存在后向DBSSClient返回的消息(Param1=会话ID,Param2=BOOL)
#define SSIM_CHANGE_SESSION_STATE 20003 //网关向SessionServer投递改变会话状态的消息(Param1=会话ID,Param2=会话状态)
#define SSIM_GATE_USER_CLOSED 20004 //网关向SessionServer投递网关用户已关闭的消息(Param1=会话ID)
#define SSIM_POST_ALL_CLIENT_MSG 20005 //向所有会话服务器的客户端发送消息(Param1=服务器类型,Param2=数据包,Param3=数据包大小)
#define SSIM_CONFIM_SESSION_ONLINE 20006 //确认会话是否在线(Param1=会话ID,Param2=服务器ID)
#define SSIM_CONFIM_SESSION_RESULT 20007 //数据或引擎客户端返回会话是否在线(Param1=会话ID,Param2=是否在线0:1)
#define SSIM_CLOSE_SESSION_BY_ACCOUNT 20008 //通过账号字符串查找并关闭会话(Param1=字符串指针)
#define SSIM_DEBUG_PRINT_SESSIONS 20009 //调试消息:打印全局会话(Param1=会话数量)
#define SSIM_QUERY_YUANBAO_COUNT 20010 // 查询元宝数量
#define SSIM_WITHDRAW_YUANBAO 20011 // 提取元宝
#define SSIM_CLOSE_SESSION_BY_ACCOUNTID 20012 //通过accountid关闭会话
#define SSIM_KICK_ONLINE_CROSSSERVER_ACTOR 20013 //踢掉在线的跨服用户
/* SQL查询语句定义
*******************************************/
// 此处定义各种SQL查询语句使用存储过程调用SQL查询
//加载角色网关路由表(QUERY)
static LPCSTR szLoadCharGateRouteTable = "call loadcharactorserveraddress()";
//加载管理员登录表(QUERY)
static LPCSTR szLoadAdministLoginTable = "call loadadministlogintable()";
// 加载服务器信息列表
static LPCSTR szLoadServerInfoList = "call loadlogicserverinfolist()";
static LPCSTR szUserLoginGetGlobalUser = "call logingetglobaluser(\"%s\")";//用户登录时依据账号查询数据(QUERY)
static LPCSTR szUpdateUserLogin= "call updateGlobaluserLogin(%u,%lu)";
static LPCSTR szUpdateUsernlineTime="call updateGlobaluserOnlineTime(%u,%u)";
static LPCSTR szGetFcmTime= "call getFcmTime(%u)"; //获取防沉迷的时间
static LPCSTR szCreateAccount= "call createglobaluser(\"%s\",\"%s\",\"%s\")"; //创建一个账户,参数为名字,密码和身份证号码
static LPCSTR szSessionLoadUserItem = "call loaduseritem(%u,%u,%d)";//获取角色的活动背包内容,[账户id角色id,serverindex]
static LPCSTR szSessionGetUserItem = "call getuseritem(%u,%u,%lld,%d)";//领取物品[账户id角色id,消息id]
static LPCSTR szSessionDelUserItem = "call deleteuseritem(%lld)";//删除用户的活动背包
static LPCSTR szGetSASeriesInfo = "call getvaseriesinfo(%llu)"; // 查询增值服务器序列号信息
static LPCSTR szDeleteSASeries = "call deletevaseries(%llu, %u, %u, \"%s\")"; // 删除增值序列号
static LPCSTR szDeleteCSRank = "call deletecsrank(%d)"; //删除跨服排行[客户端服务器ID]
static LPCSTR szSaveCsRank = "insert into csrank(actorid,actorname,sex,job,serverindex,value) values"; //更新跨服战力排行[角色ID,服务器ID,职业,战力]
static LPCSTR szLoadCsRank = "call loadcsrank()"; //获取每个职业战力第一名单
#endif