GateInfo.cpp
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:12k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "dbsvr.h"
  3. #include "globalUserList.h"
  4. #include "../def/dbmgr.h"
  5. #include <stdio.h>
  6. #include "tableList.h"
  7. #include "processdbmsg.h"
  8. void GetLoadHumanRcd(CServerInfo* pServerInfo, _LPTLOADHUMAN lpLoadHuman, int nRecog);
  9. extern CWHList<CServerInfo*> g_xServerList;
  10. extern CWHList< GAMESERVERINFO * > g_xGameServerList;
  11. void CGateInfo::ReceiveOpenUser(char *pszPacket)
  12. {
  13. char *pszPos;
  14. int nSocket;
  15. int nLen = memlen(pszPacket);
  16. if (pszPos = (char *)memchr(pszPacket, '/', nLen))
  17. {
  18. nSocket = AnsiStrToVal(pszPacket);
  19. pszPos++;
  20. CUserInfo* pUserInfo = new CUserInfo;
  21. if (pUserInfo)
  22. {
  23. MultiByteToWideChar(CP_ACP, 0, pszPacket, -1, pUserInfo->szSockHandle, sizeof(pUserInfo->szSockHandle)/sizeof(TCHAR));
  24. MultiByteToWideChar(CP_ACP, 0, pszPos, -1, pUserInfo->szAddress, sizeof(pUserInfo->szAddress)/sizeof(TCHAR));
  25. pUserInfo->sock = nSocket;
  26. pUserInfo->nCertification = 0;
  27. pUserInfo->nClientVersion = 0;
  28. ZeroMemory(pUserInfo->szUserID, sizeof(pUserInfo->szUserID));
  29. xUserInfoList.AddNewNode(pUserInfo);
  30. InsertLogMsgParam(IDS_OPEN_USER, pUserInfo->szAddress);
  31. }
  32. }
  33. void CGateInfo::ReceiveCloseUser(char *pszPacket)
  34. {
  35. int nSocket = AnsiStrToVal(pszPacket);
  36. /*
  37. map<SOCKET, CUserInfo, less<SOCKET> >::iterator it = pGateInfo->UserInfoMap.find((SOCKET)nSocket);
  38. if (it != pGateInfo->UserInfoMap.end())
  39. {
  40. InsertLogMsgParam(IDS_CLOSE_USER, it->second.szAddress);
  41. pGateInfo->UserInfoMap.erase(it);
  42. } */
  43. }
  44. void CGateInfo::ReceiveSendUser(char *pszPacket)
  45. {
  46. char *pszPos;//, *pszPos2;
  47. int nSocket;
  48. int nLen = memlen(pszPacket);
  49. if ((pszPos = (char *)memchr(pszPacket, '/', nLen)))// && (pszPos2 = (char *)memchr(pszPacket, '$', nLen)))
  50. {
  51. nSocket = AnsiStrToVal(pszPacket);
  52. pszPos++;
  53. _LPTGATESENDBUFF lpSendUserData = new _TGATESENDBUFF;
  54. lpSendUserData->sock = (SOCKET)nSocket;
  55. memmove(lpSendUserData->szData, pszPos, memlen(pszPos));
  56. m_GateQ.PushQ((BYTE *)lpSendUserData);
  57. }
  58. }
  59. void CGateInfo::SendToGate(SOCKET cSock, char *pszPacket)
  60. {
  61. char szData[256];
  62. WSABUF buf;
  63. DWORD dwSendBytes;
  64. int nLen = memlen(pszPacket) - 1;
  65. szData[0] = '%';
  66. char *pszNext = ValToAnsiStr((int)cSock, &szData[1]);
  67. *pszNext++ = '/';
  68. *pszNext++ = '#';
  69. memmove(pszNext, pszPacket, nLen);
  70. pszNext += nLen;
  71. *pszNext++ = '!';
  72. *pszNext++ = '$';
  73. *pszNext++ = '';
  74. buf.len = pszNext - szData;
  75. buf.buf = szData;
  76. WSASend(sock, &buf, 1, &dwSendBytes, 0, NULL, NULL);
  77. }
  78. void CGateInfo::QueryCharacter(SOCKET s, char *pszPacket)
  79. {
  80. _TQUERYCHR tQueryChr[3];
  81. char szDecodeMsg[128];
  82. int nCnt = 0;
  83. char szQuery[256];
  84. ZeroMemory(tQueryChr, sizeof(tQueryChr));
  85. int nPos = fnDecode6BitBufA(pszPacket, szDecodeMsg, sizeof(szDecodeMsg));
  86. szDecodeMsg[nPos] = '';
  87. char *pszDevide = (char *)memchr(szDecodeMsg, '/', nPos);
  88. if (pszDevide)
  89. {
  90. *pszDevide++ = '';
  91. sprintf( szQuery, "SELECT * FROM TBL_CHARACTER WHERE FLD_LOGINID='%s'", pszDevide );
  92. CRecordset *pRec = GetDBManager()->CreateRecordset();
  93. if (pRec->Execute( szQuery ))
  94. {
  95. while (pRec->Fetch() && nCnt < 3)
  96. {
  97. tQueryChr[nCnt].btClass  = atoi( pRec->Get( "FLD_JOB" ) );
  98. tQueryChr[nCnt].btGender = atoi( pRec->Get( "FLD_GENDER" ) );
  99. strcpy( tQueryChr[nCnt].szName, pRec->Get( "FLD_CHARNAME" ) );
  100. ChangeSpaceToNull( tQueryChr[nCnt].szName );
  101. nCnt++;
  102. }
  103. }
  104. GetDBManager()->DestroyRecordset( pRec );
  105. _TDEFAULTMESSAGE DefaultMsg;
  106. char szEncodeMsg[32];
  107. char szEncodeData[256];
  108. char szEncodePacket[256];
  109. if (nCnt > 0 && nCnt < 3)
  110. {
  111. fnMakeDefMessageA(&DefaultMsg, SM_QUERYCHR, 0, nCnt, 0, 0);
  112. nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
  113. int nPos2 = fnEncode6BitBufA((unsigned char *)tQueryChr, szEncodeData, sizeof(_TQUERYCHR) * nCnt, sizeof(szEncodeData));
  114. memmove(szEncodePacket, szEncodeMsg, nPos);
  115. memmove(&szEncodePacket[nPos], szEncodeData, nPos2);
  116. szEncodePacket[nPos + nPos2] = '';
  117. SendToGate(s, szEncodePacket);
  118. }
  119. else
  120. {
  121. fnMakeDefMessageA(&DefaultMsg, SM_QUERYCHR_FAIL, 0, 0, 0, 0);
  122. nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
  123. szEncodeMsg[nPos] = '';
  124. SendToGate(s, szEncodeMsg);
  125. }
  126. }
  127. }
  128. void CGateInfo::DeleteExistCharacter(SOCKET s, _LPTCREATECHR lpTCreateChr)
  129. {
  130. _TDEFAULTMESSAGE DefaultMsg;
  131. char szEncodeMsg[32];
  132. char szQuery[256];
  133. CRecordset *pRec;
  134. sprintf( szQuery, "DELETE FROM TBL_CHARACTER WHERE FLD_LOGINID='%s' AND FLD_CHARNAME='%s'", lpTCreateChr->szID, lpTCreateChr->szName );
  135. pRec = GetDBManager()->CreateRecordset();
  136. pRec->Execute( szQuery );
  137. GetDBManager()->DestroyRecordset( pRec );
  138. sprintf( szQuery, "DELETE FROM TBL_CHARACTER_GENITEM WHERE FLD_LOGINID='%s' AND FLD_CHARNAME='%s'", lpTCreateChr->szID, lpTCreateChr->szName );
  139. pRec = GetDBManager()->CreateRecordset();
  140. pRec->Execute( szQuery );
  141. GetDBManager()->DestroyRecordset( pRec );
  142. sprintf( szQuery, "DELETE FROM TBL_CHARACTER_ITEM WHERE FLD_LOGINID='%s' AND FLD_CHARNAME='%s'", lpTCreateChr->szID, lpTCreateChr->szName );
  143. pRec = GetDBManager()->CreateRecordset();
  144. pRec->Execute( szQuery );
  145. GetDBManager()->DestroyRecordset( pRec );
  146. sprintf( szQuery, "DELETE FROM TBL_CHARACTER_MAGIC WHERE FLD_LOGINID='%s' AND FLD_CHARNAME='%s'", lpTCreateChr->szID, lpTCreateChr->szName );
  147. pRec = GetDBManager()->CreateRecordset();
  148. pRec->Execute( szQuery );
  149. GetDBManager()->DestroyRecordset( pRec );
  150. fnMakeDefMessageA(&DefaultMsg, SM_DELCHR_SUCCESS, 0, 4, 0, 0);
  151. int nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
  152. szEncodeMsg[nPos] = '';
  153. SendToGate(s, szEncodeMsg);
  154. }
  155. void CGateInfo::MakeNewCharacter(SOCKET s, _LPTCREATECHR lpTCreateChr)
  156. {
  157. //ERROR: 1=> Exist Charname, 2=>Wrong Name, 3=>Not enough Space, 4=>Error
  158. _TDEFAULTMESSAGE DefaultMsg;
  159. char szEncodeMsg[32];
  160. int nPos;
  161. char szQuery[2048];
  162. sprintf( szQuery, "SELECT FLD_CHARNAME FROM TBL_CHARACTER WHERE FLD_CHARNAME='%s'", lpTCreateChr->szName );
  163. CRecordset *pRec = GetDBManager()->CreateRecordset();
  164. pRec->Execute( szQuery );
  165. if (pRec->Fetch())
  166. {
  167. fnMakeDefMessageA(&DefaultMsg, SM_NEWCHR_FAIL, 0, 1, 0, 0);
  168. nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
  169. szEncodeMsg[nPos] = '';
  170. SendToGate(s, szEncodeMsg);
  171. GetDBManager()->DestroyRecordset( pRec );
  172. return;
  173. }
  174. GetDBManager()->DestroyRecordset( pRec );
  175. sprintf( szQuery, "SELECT COUNT(FLD_CHARNAME) AS FLD_COUNT FROM TBL_CHARACTER WHERE FLD_CHARNAME='%s'", lpTCreateChr->szName );
  176. pRec = GetDBManager()->CreateRecordset();
  177. if (pRec->Execute( szQuery ) || pRec->Fetch() )
  178. {
  179. if (atoi(pRec->Get( "FLD_COUNT" )) >= 3)
  180. {
  181. fnMakeDefMessageA(&DefaultMsg, SM_NEWCHR_FAIL, 0, 3, 0, 0);
  182. nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
  183. szEncodeMsg[nPos] = '';
  184. SendToGate(s, szEncodeMsg);
  185. GetDBManager()->DestroyRecordset( pRec );
  186. return;
  187. }
  188. GetDBManager()->DestroyRecordset( pRec );
  189. CTblStartPoint::TABLE *table = GetTblStartPoint()->Get( "4" );
  190. pRec = GetDBManager()->CreateRecordset();
  191. // TBL_CHARACTER 抛捞喉 眠啊
  192. sprintf(szQuery, "INSERT TBL_CHARACTER ("
  193. "FLD_LOGINID, FLD_CHARNAME, FLD_JOB, FLD_GENDER, FLD_LEVEL, FLD_DIRECTION, "
  194. "FLD_ATTACKMODE, FLD_CX, FLD_CY, FLD_MAPNAME, FLD_GOLD, FLD_HAIR, "
  195. "FLD_DRESS_ID, FLD_WEAPON_ID, FLD_LEFTHAND_ID, FLD_RIGHTHAND_ID, FLD_HELMET_ID, "
  196. "FLD_NECKLACE_ID, FLD_ARMRINGL_ID, FLD_ARMRINGR_ID, FLD_RINGL_ID, "
  197. "FLD_RINGR_ID, FLD_EXP) VALUES ( "
  198. "'%s', '%s', %d, %d, 1, 4, "
  199. "1, %d, %d, '%s', 0, 0, "
  200. "'0', '0', '0', '0', '0', "
  201. "'0', '0', '0', '0', "
  202. "'0', 0 )",
  203. lpTCreateChr->szID, lpTCreateChr->szName, lpTCreateChr->btClass, lpTCreateChr->btGender,
  204. table->posX, table->posY, table->mapName);
  205. pRec->Execute( szQuery );
  206. sprintf(szQuery, "INSERT TBL_CHARACTER_GENITEM (FLD_LOGINID, FLD_CHARNAME, FLD_ITEMINDEX) VALUES ('%s', '%s', 'G00080008000')",
  207. lpTCreateChr->szID, lpTCreateChr->szName);
  208. pRec->Execute( szQuery );
  209. GetDBManager()->DestroyRecordset( pRec );
  210. _TLOADHUMAN human;
  211. _TMAKEITEMRCD makeItem;
  212. memset( &human, 0, sizeof( human ) );
  213. memset( &makeItem, 0, sizeof( makeItem ) );
  214. strcpy( human.szUserID, lpTCreateChr->szID );
  215. strcpy( human.szCharName, lpTCreateChr->szName );
  216. // 乞汗 眠啊 (0: 巢, 1: 咯)
  217. makeItem.szStdType = 'B';
  218. makeItem.nStdIndex = lpTCreateChr->btGender ? 34 : 33;
  219. makeItem.nDura = 5000;
  220. makeItem.nDuraMax = 5000;
  221. MakeNewItem( NULL, &human, &makeItem, 0 );
  222. // 格八 眠啊
  223. makeItem.szStdType = 'A';
  224. makeItem.nStdIndex = 7;
  225. makeItem.nDura = 4000;
  226. makeItem.nDuraMax = 4000;
  227. MakeNewItem( NULL, &human, &makeItem, 0 );
  228. fnMakeDefMessageA(&DefaultMsg, SM_NEWCHR_SUCCESS, 0, 0, 0, 0);
  229. nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
  230. szEncodeMsg[nPos] = '';
  231. SendToGate(s, szEncodeMsg);
  232. return;
  233. }
  234. fnMakeDefMessageA(&DefaultMsg, SM_NEWCHR_FAIL, 0, 4, 0, 0);
  235. nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
  236. szEncodeMsg[nPos] = '';
  237. SendToGate(s, szEncodeMsg);
  238. GetDBManager()->DestroyRecordset( pRec );
  239. }
  240. void CGateInfo::GetSelectCharacter(SOCKET s, char *pszPacket)
  241. {
  242. char szDecodeMsg[128];
  243. char szServerIP[32];
  244. char szEncodeMsg[32];
  245. char szEncodeData[64];
  246. char szEncodePacket[256];
  247. _TDEFAULTMESSAGE DefaultMsg;
  248. // ORZ: Load Balancing, 立加荐啊 啊厘 利篮 霸捞飘 辑滚 IP 急琶
  249. GAMESERVERINFO *pBestServer = NULL;
  250. GAMESERVERINFO *pTemp;
  251. // EnterCriticalSection( &g_xGameServerList.m_cs );
  252. for ( PLISTNODE pNode = g_xGameServerList.GetHead();pNode; pNode = g_xGameServerList.GetNext( pNode ) )
  253. {
  254. pTemp = g_xGameServerList.GetData( pNode );
  255. if ( !pBestServer || pTemp->connCnt < pBestServer->connCnt )
  256. {
  257. pBestServer = pTemp;
  258. continue;
  259. }
  260. }
  261. pBestServer->connCnt++;
  262. // LeaveCriticalSection( &g_xGameServerList.m_cs );
  263. strcpy( szServerIP, pBestServer->ip );
  264. // ORZ: from here
  265. int nPos = fnDecode6BitBufA(pszPacket, szDecodeMsg, sizeof(szDecodeMsg));
  266. szDecodeMsg[nPos] = '';
  267. char *pszDevide = (char *)memchr(szDecodeMsg, '/', nPos);
  268. if (pszDevide)
  269. {
  270. *pszDevide++ = '';
  271. // 辑滚 急琶捞 啊瓷窍档废 荐沥
  272. _TLOADHUMAN tLoadHuman;
  273. CServerInfo* pServerInfo;
  274. memcpy(tLoadHuman.szUserID, szDecodeMsg, memlen(szDecodeMsg));
  275. memcpy(tLoadHuman.szCharName, pszDevide, memlen(pszDevide));
  276. ZeroMemory(tLoadHuman.szUserAddr, sizeof(tLoadHuman.szUserAddr));
  277. tLoadHuman.nCertification = 0;
  278. PLISTNODE pListNode = g_xServerList.GetHead();
  279. if (pListNode)
  280. pServerInfo = g_xServerList.GetData(pListNode);
  281. GetLoadHumanRcd(pServerInfo, &tLoadHuman, 0);
  282. fnMakeDefMessageA(&DefaultMsg, SM_STARTPLAY, 0, 0, 0, 0);
  283. nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
  284. int nPos2 = fnEncode6BitBufA((unsigned char *)szServerIP, szEncodeData, memlen(szServerIP) -1, sizeof(szEncodeData));
  285. memmove(szEncodePacket, szEncodeMsg, nPos);
  286. memmove(&szEncodePacket[nPos], szEncodeData, nPos2);
  287. szEncodePacket[nPos + nPos2] = '';
  288. // ORZ: 傈眉 府胶飘俊 眠啊茄促.
  289. // 鞍篮 酒捞叼啊 捞固 粮犁窍芭唱 皋葛府 何练殿狼 捞蜡肺 角菩且 荐 乐促.
  290. // if ( GetGlobalUserList()->Insert( tLoadHuman.szCharName, szServerIP ) )
  291. SendToGate(s, szEncodePacket);
  292. // else
  293. // {
  294. // fnMakeDefMessageA(&DefaultMsg, SM_STARTFAIL, 0, 0, 0, 0);
  295. // nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
  296. // szEncodeMsg[nPos] = '';
  297. // SendToGate(pGateInfo->sock, s, szEncodeMsg);
  298. // }
  299. }
  300. }