📄 distributedbmsgparser.cpp
字号:
#include "stdafx.h"
#include "DistributeDBMsgParser.h"
#include "DataBase.h"
#include "CommonDBMsgParser.h"
#include "UserTable.h"
#include "ServerTable.h"
#include "Network.h"
#include "UserManager.h"
extern int g_nServerSetNum;
extern DWORD g_dwMaxUser;
DBMsgFunc g_DBMsgFunc[] =
{
NULL,
RLoginCheckQuery,
RIpCheckQuery, /// eIpCheckQuery (GM酒捞乔俊 措茄 眉农)
RCheckMaxUser,
RLoginCheckQueryTest,
RTest,
};
void LoginCheckInit()
{
g_DB.FreeQuery(0, 0, "EXEC %s", "MP_CHARACTER_LoginInit");
/* 酒流 眠啊窍瘤 富巴... 橇肺矫廉 荐沥饶 眠啊 (LBS)
char txt[128];
sprintf(txt, "EXEC %s %d", "up_Server_ResetLoginMember", g_nServerSetNum);
g_DB.LoginQuery(eQueryType_FreeQuery, 0, 0, txt);
*/
}
/*
void LoginCheckDelete(DWORD UserID)//, DWORD dwConnectionIndex)
{
char txt[128];
sprintf(txt, "EXEC %s %d", "Up_Member_CheckOut", UserID);
g_DB.LoginQuery(eQueryType_FreeQuery, eNull, 0, txt);
}
BOOL LoginCheckQuery(char* id, char* pw, DWORD AuthKey, DWORD dwConnectionIndex)
{
char guery[128];
// id,pw,AuthKey,ServerGroupNum
sprintf(guery, "EXEC %s \'%s\', \'%s\', %d, %d", "Up_Member_CheckIn", id, pw, AuthKey, 1);
if(g_DB.LoginQuery(eQueryType_FreeQuery, eLoginCheckQuery, dwConnectionIndex, guery) == FALSE)
{
g_Console.Log(eLogDisplay,4,"DB is Busy ID:%d ConnectionIndex:%d",id,dwConnectionIndex);
return FALSE;
}
g_Console.Log(eLogDisplay,4,"IDPW_QUERY ID: %s, ConnectionIndex: %d",id,dwConnectionIndex);
return TRUE;
}
*/
BOOL IPCheckQuery(char* ip, DWORD AuthKey, DWORD dwConnectionIndex)
{
char query[128];
sprintf(query, "EXEC %s \'%s\', %d", "Up_Ip_CheckIn", ip, AuthKey);
if(g_DB.LoginQuery(eQueryType_FreeQuery, eIpCheckQuery, dwConnectionIndex, query) == FALSE)
{
g_Console.Log(eLogDisplay,4,"DB is Busy(IP_CHECK) IP:%s ConnectionIndex:%d", ip, dwConnectionIndex);
return FALSE;
}
// g_Console.Log(eLogDisplay,4,"IP_QUERY IP: %s, ConnectionIndex: %d", ip, dwConnectionIndex);
return TRUE;
}
void LoginError(DWORD dwConnectionIdx, DWORD AuthKey,DWORD ErrorCode,DWORD dwParam)
{
MSG_DWORD2 msguser;
msguser.Category = MP_USERCONN;
msguser.Protocol = MP_USERCONN_LOGIN_NACK;
msguser.dwData1 = ErrorCode;
msguser.dwData2 = dwParam;
g_pUserTable->SendToUser(dwConnectionIdx, AuthKey, &msguser, sizeof(msguser) );
// g_Console.Log(eLogDisplay,4," LOGINERROR Errorcode: %d, ConnectionIndex: %d",ErrorCode,dwConnectionIdx);
}
void RIpCheckQuery(LPQUERY pData, LPDBMESSAGE pMessage)
{
if(pMessage->dwResult == 0)
{
// DB Error(DB is busy)
return;
}
WORD Ecode =atoi((char*)pData->Data[0]);
DWORD AuthKey = atoi((char*)pData->Data[1]);
DWORD dwConnectionIdx = pMessage->dwID;
USERINFO* pUserInfo = g_pUserTable->FindUser(dwConnectionIdx);
if( pUserInfo == NULL ) //捞固 唱艾促.
return;
if( pUserInfo->dwUniqueConnectIdx != AuthKey ) // 捞固 唱啊绊 促弗 逞捞 甸绢柯 版快
return;
if( Ecode == 0 )
{
LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_INVALID_IP );
LoginCheckDelete( pUserInfo->dwUserID );
//LoginCheckDelete( pUserInfo->dwUserID);
return;
}
// 己傍
SERVERINFO* FastInfo = g_pServerTable->GetFastServer( AGENT_SERVER );
if(FastInfo == NULL)
{
LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_NOAGENTSERVER );
LoginCheckDelete( pUserInfo->dwUserID );
pUserInfo->dwUserID = 0;
return;
}
MSG_DWORD2BYTE msg;
msg.Category = MP_USERCONN;
msg.Protocol = MP_USERCONN_NOTIFY_USERLOGIN_SYN;
msg.dwObjectID = pUserInfo->dwUserID;
msg.dwData1 = AuthKey;
msg.dwData2 = dwConnectionIdx;
msg.bData = pUserInfo->UserLevel;
g_Network.Send2Server(FastInfo->dwConnectionIndex,(char*)&msg,sizeof(msg));
}
DWORD testTime[1024];
BOOL LoginCheckQueryTest(char* id, char* pw, DWORD AuthKey, DWORD dwConnectionIndex)
{
char guery[128];
sprintf(guery, "EXEC %s \'%s\', \'%s\', %d, %d", "Up_Member_CheckIn", id, pw, AuthKey, 1);
if(g_DB.LoginQuery(101, eLoginCheckQueryTest, dwConnectionIndex, guery) == FALSE)
{
g_Console.Log(eLogDisplay,4,"DB is Busy ID:%d ConnectionIndex:%d",id,dwConnectionIndex);
return FALSE;
}
g_Console.Log(eLogDisplay,4,"IDPW_QUERY ID: %s, ConnectionIndex: %d",id,dwConnectionIndex);
return TRUE;
}
void RLoginCheckQueryTest(LPQUERY pData, LPDBMESSAGE pMessage)
{
DWORD AuthKey =atoi((char*)pData->Data[2]);
testTime[AuthKey-1] = GetTickCount() - pMessage->dwID;
g_Console.Log(eLogDisplay,4,"IDPW TestReceived ID: %d Time: %d",AuthKey,testTime[AuthKey-1]);
if(AuthKey == 1024)
{
FILE* fp = fopen("test.txt","w");
for(int n=0;n<1024;++n)
fprintf(fp,"%d ElapsedTime: %d\n",n+1,testTime[n]);
fclose(fp);
}
}
//* MemberDB 背眉 累诀 2004.03.22
void LoginCheckDelete(DWORD UserID)
{
char txt[128];
sprintf(txt, "EXEC %s %d", "Up_GameLogout", UserID);
g_DB.LoginQuery(eQueryType_FreeQuery, eNull, 0, txt);
}
//*/
//* MemberDB 背眉 累诀 2004.03.22
BOOL LoginCheckQuery(char* id, char* pw, char* ip, WORD ServerNo, DWORD AuthKey, DWORD dwConnectionIndex, DWORD dwMaxUser, WORD ServerNum)
{
char guery[128];
// id,pw,AuthKey,ServerGroupNum
// MaxUser八荤且锭
sprintf(guery, "EXEC %s \'%s\', \'%s\', \'%s\', %d, \'%d\', %d, %d, %d",
"up_gameloginadult_free", id, pw, ip, ServerNo, AuthKey, dwMaxUser, gUserMGR.GetLimitAge(), ServerNum);
if(g_DB.LoginQuery(eQueryType_FreeQuery, eLoginCheckQuery, dwConnectionIndex, guery, FALSE) == FALSE)
{
g_Console.Log(eLogDisplay,4,"DB is Busy ID:%d ConnectionIndex:%d",id,dwConnectionIndex);
LoginError( dwConnectionIndex, AuthKey, LOGIN_ERROR_DISTSERVERISBUSY );
return FALSE;
}
return TRUE;
}
//*/
//* MemberDB 背眉 累诀 2004.03.22
void RLoginCheckQuery(LPQUERY pData, LPDBMESSAGE pMessage)
{
DWORD stateNo = atoi((char*)pData->Data[0]);
WORD ServerNo = atoi((char*)pData->Data[1]);
DWORD UserIdx = atoi((char*)pData->Data[2]);
/////////////////////////////////////////////////////////
// 搬力 包访 函荐 (酒流 荤侩救窃.)
// WORD Type = atoi((char*)pData->Data[3]); //搬力规侥
// WORD time = atoi((char*)pData->Data[4]); //巢篮矫埃??
// WORD bTen = atoi((char*)pData->Data[5]); //眉氰魄咯何
/////////////////////////////////////////////////////////
DWORD AuthKey = atoi((char*)pData->Data[6]);
BYTE UserLevel = atoi((char*)pData->Data[7]);
WORD AgentNo = atoi((char*)pData->Data[8]);
DWORD dwConnectionIdx = pMessage->dwID;
USERINFO* pUserInfo = g_pUserTable->FindUser(dwConnectionIdx);
if(pUserInfo == NULL) // 捞固 唱埃版快
{
LoginCheckDelete(UserIdx);
return;
}
ASSERT(pUserInfo->dwConnectionIndex == dwConnectionIdx);
if(pUserInfo->UserLevel == eUSERLEVEL_PROGRAMMER)
{
//////////////////////////////////////////////////////////////////////////
// testcode
FILE* fp = fopen("loginchk.txt","a");
fprintf(fp,"RLOGIN_Q %d\t%d\t%d\t%d\t%d\n",UserIdx,dwConnectionIdx,(DWORD)pUserInfo,pUserInfo->dwUniqueConnectIdx,AuthKey);
fclose(fp);
//////////////////////////////////////////////////////////////////////////
}
if(pUserInfo->dwUniqueConnectIdx != AuthKey) // 捞固 唱啊绊 促弗 逞捞 甸绢柯 版快
{
LoginCheckDelete(UserIdx);
return;
}
pUserInfo->dwUserID = UserIdx;
pUserInfo->UserLevel = UserLevel;
pUserInfo->State = stateNo;
// 捞镑俊辑 父距 肋给等 UserIdx啊 逞绢柯 版快
// g_Console.Log(eLogDisplay, 4, "ID/PW Check Received dwConnectionIdx:%d",dwConnectionIdx);
switch(stateNo)
{
case 1: // 立加 己傍.
{
// 蜡历饭骇 八荤
if(gUserMGR.IsValidUserLevel(UserLevel) == FALSE)
{
LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_INVALIDUSERLEVEL);
DisconnectUser(dwConnectionIdx);
LoginCheckDelete(UserIdx); // 荐沥夸!!!
return;
}
// g_Console.Log(eLogDisplay, 4, " ID/PW Success : dwConnectionIdx: %d",dwConnectionIdx);
if( UserLevel == eUSERLEVEL_GM )
{
char strIP[16] = {0,};
WORD wPort;
g_Network.GetUserAddress( dwConnectionIdx, strIP, &wPort );
IPCheckQuery( strIP, AuthKey, dwConnectionIdx );
}
else
{
SERVERINFO* pAgentServer = g_pServerTable->GetServer(AGENT_SERVER, AgentNo);
if(pAgentServer == NULL)
{
LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_NOAGENTSERVER);
DisconnectUser(dwConnectionIdx);
LoginCheckDelete(UserIdx); //OnDisconnectUser俊辑 龋免窍绰单.. 趣矫唱秦辑.
return;
}
MSG_DWORD2BYTE msg;
msg.Category = MP_USERCONN;
msg.Protocol = MP_USERCONN_NOTIFY_USERLOGIN_SYN;
msg.dwObjectID = UserIdx;
msg.dwData1 = AuthKey;
msg.dwData2 = dwConnectionIdx;
msg.bData = UserLevel;
g_Network.Send2Server(pAgentServer->dwConnectionIndex,(char*)&msg,sizeof(msg));
}
}
break;
case 2: // ID绝澜.
{
LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_WRONGIDPW);
}
break;
case 3: // 厚剐锅龋坷幅.
{
LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_WRONGIDPW);
}
break;
case 4: // 霸烙俊 立加吝.
{
if(g_nServerSetNum == ServerNo)
{
MSG_DWORD msg;
msg.Category = MP_USERCONN;
msg.Protocol = MP_USERCONN_NOTIFY_OVERLAPPEDLOGIN;
msg.dwData = UserIdx;
g_Network.Broadcast2AgentServer((char*)&msg,sizeof(msg));
LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_OVERLAPPEDLOGIN,0);
}
else
{
LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_OVERLAPPEDLOGININOTHERSERVER,ServerNo);
}
}
break;
case 5: // 喉钒等 拌沥. @state_num = 6捞搁 拌沥喉钒 (昆 包府葛靛俊辑 荤侩)
{
LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_BLOCKUSERLEVEL);
}
break;
case 7: // DB Connection Error
{
ASSERTMSG(0, "login check error ret 0");
}
break;
case 8: // 牢盔檬苞
{
LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_MAXUSER );
}
break;
case 14:
{
LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_NOT_CLOSEBETAWINNER );
}
break;
case 15: //己牢挤俊 固己斥磊啊 甸绢坷妨绊 沁促.
{
LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_MINOR_INADULTSERVER );
}
break;
case 50: // 雀盔呕硼茄 拌沥烙.
{
LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_SECEDEDACCOUNT);
}
break;
default:
{
ASSERT(0);
}
}
}
//*/
BOOL CheckMaxUser( char* id, char* pw, WORD ServerNo, DWORD AuthKey, DWORD dwConnectionIdx )
{
char guery[128];
sprintf( guery, "EXEC %s \'%s\', \'%s\', %d, %d", "Up_CheckMaxUser", id, pw, ServerNo, AuthKey );
if( g_DB.LoginQuery(eQueryType_FreeQuery, eCheckMaxUser, dwConnectionIdx, guery) == FALSE )
{
g_Console.Log( eLogDisplay, 4, "DB is Busy" );
return FALSE;
}
return TRUE;
}
void RCheckMaxUser( LPQUERY pData, LPDBMESSAGE pMessage )
{
char id[20] = {0,};
char pwd[20] = {0,};
DWORD MaxUser = atoi((char*)pData->Data[0]);
DWORD AuthKey = atoi((char*)pData->Data[3]);
SafeStrCpy(id, (char*)pData->Data[1], 20);
SafeStrCpy(pwd, (char*)pData->Data[2], 20);
DWORD dwConnectionIdx = pMessage->dwID;
USERINFO* pUserInfo = g_pUserTable->FindUser(dwConnectionIdx);
if(pUserInfo == NULL) // 捞固 唱埃版快
return;
if(pUserInfo->dwUniqueConnectIdx != AuthKey) // 捞固 唱啊绊 促弗 逞捞 甸绢柯 版快
return;
if( g_dwMaxUser <= MaxUser )
{
LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_MAXUSER );
return;
}
// MemberDB 背眉俊 蝶弗 2004.03.22
char ip[20] = {0,};
WORD port = 0;
g_Network.GetUserAddress(dwConnectionIdx, ip, &port);
// LoginCheckQuery(id, pwd, ip, g_nServerSetNum, AuthKey, dwConnectionIdx);
}
enum CHItem // 某腐磐 酒捞袍 沥焊甫 罐阑锭 荤侩
{
eCI_ObjectID = 0, eCI_DBIDX, eCI_IDX, eCI_Position, eCI_QPosition, eCI_Durability
};
void RTest(LPQUERY pData, LPDBMESSAGE pMessage)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -