Advertisement
Woytman

ClientManagerLogin.cpp

Mar 31st, 2017
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 17.09 KB | None | 0 0
  1.  
  2. #include "stdafx.h"
  3.  
  4. #include "ClientManager.h"
  5.  
  6. #include "Main.h"
  7. #include "Config.h"
  8. #include "QID.h"
  9. #include "Cache.h"
  10.  
  11. extern std::string g_stLocale;
  12. extern bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab);
  13. extern int g_test_server;
  14. extern int g_log;
  15.  
  16. bool CClientManager::InsertLogonAccount(const char * c_pszLogin, DWORD dwHandle, const char * c_pszIP)
  17. {
  18.     char szLogin[LOGIN_MAX_LEN + 1];
  19.     trim_and_lower(c_pszLogin, szLogin, sizeof(szLogin));
  20.  
  21.     itertype(m_map_kLogonAccount) it = m_map_kLogonAccount.find(szLogin);
  22.  
  23.     if (m_map_kLogonAccount.end() != it)
  24.         return false;
  25.  
  26.     CLoginData * pkLD = GetLoginDataByLogin(c_pszLogin);
  27.  
  28.     if (!pkLD)
  29.         return false;
  30.  
  31.     pkLD->SetConnectedPeerHandle(dwHandle);
  32.     pkLD->SetIP(c_pszIP);
  33.  
  34.     m_map_kLogonAccount.insert(TLogonAccountMap::value_type(szLogin, pkLD));
  35.     return true;
  36. }
  37.  
  38. bool CClientManager::DeleteLogonAccount(const char * c_pszLogin, DWORD dwHandle)
  39. {
  40.     char szLogin[LOGIN_MAX_LEN + 1];
  41.     trim_and_lower(c_pszLogin, szLogin, sizeof(szLogin));
  42.  
  43.     itertype(m_map_kLogonAccount) it = m_map_kLogonAccount.find(szLogin);
  44.  
  45.     if (it == m_map_kLogonAccount.end())
  46.         return false;
  47.  
  48.     CLoginData * pkLD = it->second;
  49.  
  50.     if (pkLD->GetConnectedPeerHandle() != dwHandle)
  51.     {
  52.         sys_err("%s tried to logout in other peer handle %lu, current handle %lu", szLogin, dwHandle, pkLD->GetConnectedPeerHandle());
  53.         return false;
  54.     }
  55.  
  56.     if (pkLD->IsPlay())
  57.     {
  58.         pkLD->SetPlay(false);
  59.         SendLoginToBilling(pkLD, false);
  60.     }
  61.  
  62.     if (pkLD->IsDeleted())
  63.     {
  64.         delete pkLD;
  65.     }
  66.  
  67.     m_map_kLogonAccount.erase(it);
  68.     return true;
  69. }
  70.  
  71. bool CClientManager::FindLogonAccount(const char * c_pszLogin)
  72. {
  73.     char szLogin[LOGIN_MAX_LEN + 1];
  74.     trim_and_lower(c_pszLogin, szLogin, sizeof(szLogin));
  75.  
  76.     if (m_map_kLogonAccount.end() == m_map_kLogonAccount.find(szLogin))
  77.         return false;
  78.  
  79.     return true;
  80. }
  81.  
  82. void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketGDLoginByKey * p)
  83. {
  84. #ifdef ENABLE_LIMIT_TIME
  85.     static int s_updateCount = 0;
  86.     static int s_curTime = time(0);
  87.     if (s_updateCount > 100)
  88.     {
  89.         s_curTime = time(0);
  90.         s_updateCount = 0;
  91.     }
  92.  
  93.     ++s_updateCount;
  94.     if (s_curTime >= GLOBAL_LIMIT_TIME)
  95.     {
  96.         sys_err("Server life time expired.");
  97.         exit(0);
  98.         return;
  99.     }
  100. #endif
  101.     CLoginData * pkLoginData = GetLoginData(p->dwLoginKey);
  102.  
  103.     char szLogin[LOGIN_MAX_LEN + 1];
  104.     trim_and_lower(p->szLogin, szLogin, sizeof(szLogin));
  105.     if (!pkLoginData)
  106.     {
  107.         sys_log(0, "LOGIN_BY_KEY key not exist %s %lu", szLogin, p->dwLoginKey);
  108.         pkPeer->EncodeReturn(HEADER_DG_LOGIN_NOT_EXIST, dwHandle);
  109.         return;
  110.     }
  111.  
  112.     TAccountTable & r = pkLoginData->GetAccountRef();
  113.     if (FindLogonAccount(r.login))
  114.     {
  115.         sys_log(0, "LOGIN_BY_KEY already login %s %lu", r.login, p->dwLoginKey);
  116.         TPacketDGLoginAlready ptog;
  117.         strlcpy(ptog.szLogin, szLogin, sizeof(ptog.szLogin));
  118.         pkPeer->EncodeHeader(HEADER_DG_LOGIN_ALREADY, dwHandle, sizeof(TPacketDGLoginAlready));
  119.         pkPeer->Encode(&ptog, sizeof(TPacketDGLoginAlready));
  120.         return;
  121.     }
  122.  
  123.     if (strcasecmp(r.login, szLogin))
  124.     {
  125.         sys_log(0, "LOGIN_BY_KEY login differ %s %lu input %s", r.login, p->dwLoginKey, szLogin);
  126.         pkPeer->EncodeReturn(HEADER_DG_LOGIN_NOT_EXIST, dwHandle);
  127.         return;
  128.     }
  129.  
  130.     if (memcmp(pkLoginData->GetClientKey(), p->adwClientKey, sizeof(DWORD) * 4))
  131.     {
  132.         const DWORD * pdwClientKey = pkLoginData->GetClientKey();
  133.  
  134.         sys_log(0, "LOGIN_BY_KEY client key differ %s %lu %lu %lu %lu, %lu %lu %lu %lu", r.login, p->adwClientKey[0], p->adwClientKey[1], p->adwClientKey[2], p->adwClientKey[3], pdwClientKey[0], pdwClientKey[1], pdwClientKey[2], pdwClientKey[3]);
  135.         pkPeer->EncodeReturn(HEADER_DG_LOGIN_NOT_EXIST, dwHandle);
  136.         return;
  137.     }
  138.  
  139.     TAccountTable * pkTab = new TAccountTable;
  140.     memset(pkTab, 0, sizeof(TAccountTable));
  141.  
  142.     pkTab->id = r.id;
  143.     trim_and_lower(r.login, pkTab->login, sizeof(pkTab->login));
  144.     strlcpy(pkTab->passwd, r.passwd, sizeof(pkTab->passwd));
  145.     strlcpy(pkTab->social_id, r.social_id, sizeof(pkTab->social_id));
  146.     strlcpy(pkTab->status, "OK", sizeof(pkTab->status));
  147.  
  148.     ClientHandleInfo * info = new ClientHandleInfo(dwHandle);
  149.     info->pAccountTable = pkTab;
  150.     strlcpy(info->ip, p->szIP, sizeof(info->ip));
  151.  
  152.     sys_log(0, "LOGIN_BY_KEY success %s %lu %s", r.login, p->dwLoginKey, info->ip);
  153.     char szQuery[QUERY_MAX_LEN];
  154.     snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, pid5, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), r.id);
  155.     CDBManager::instance().ReturnQuery(szQuery, QID_LOGIN_BY_KEY, pkPeer->GetHandle(), info);
  156. }
  157.  
  158. void CClientManager::RESULT_LOGIN_BY_KEY(CPeer * peer, SQLMsg * msg)
  159. {
  160.     CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  161.     ClientHandleInfo * info = (ClientHandleInfo *) qi->pvData;
  162.     if (msg->uiSQLErrno != 0)
  163.     {
  164.         peer->EncodeReturn(HEADER_DG_LOGIN_NOT_EXIST, info->dwHandle);
  165.         delete info;
  166.         return;
  167.     }
  168.  
  169.     char szQuery[QUERY_MAX_LEN];
  170.     if (msg->Get()->uiNumRows == 0)
  171.     {
  172.         DWORD account_id = info->pAccountTable->id;
  173.         char szQuery[QUERY_MAX_LEN];
  174.  
  175.         snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, pid5, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), account_id);
  176.         std::auto_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER));
  177.         sys_log(0, "RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:%d", account_id);
  178.  
  179.         if (pMsg->Get()->uiNumRows == 0)
  180.         {
  181.             sys_log(0, "RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:%d", account_id);
  182.             snprintf(szQuery, sizeof(szQuery), "INSERT INTO player_index%s (id) VALUES(%u)", GetTablePostfix(), info->pAccountTable->id);
  183.             CDBManager::instance().ReturnQuery(szQuery, QID_PLAYER_INDEX_CREATE, peer->GetHandle(), info);
  184.         }
  185.         return;
  186.     }
  187.  
  188.     MYSQL_ROW row = mysql_fetch_row(msg->Get()->pSQLResult);
  189.  
  190.     int col = 0;
  191.     for (; col < PLAYER_PER_ACCOUNT; ++col)
  192.         str_to_number(info->pAccountTable->players[col].dwID, row[col]);
  193.  
  194.     str_to_number(info->pAccountTable->bEmpire, row[col++]);
  195.     info->account_index = 1;
  196.  
  197.     extern std::string g_stLocale;
  198.     if (g_stLocale == "gb2312")
  199.     {
  200.         snprintf(szQuery, sizeof(szQuery), "SELECT "
  201.         "id, "
  202.         "name, "
  203.         "job, "
  204.         "level, "
  205.         "alignment, "
  206.         "st, "
  207.         "ht, "
  208.         "dx, "
  209.         "iq, "
  210.         "part_main, "
  211.         "part_hair, "
  212.         #ifdef __SASH_SYSTEM__
  213.         "part_sash, "
  214.         #endif
  215.         "x, "
  216.         "y, "
  217.         "skill_group, "
  218.         "change_name "
  219.         "FROM player%s WHERE account_id=%u", GetTablePostfix(), info->pAccountTable->id);
  220.     }
  221.     else
  222.     {
  223.         snprintf(szQuery, sizeof(szQuery), "SELECT "
  224.         "id, "
  225.         "name, "
  226.         "job, "
  227.         "level, "
  228.         "playtime, "
  229.         "st, "
  230.         "ht, "
  231.         "dx, "
  232.         "iq, "
  233.         "part_main, "
  234.         "part_hair, "
  235.         #ifdef __SASH_SYSTEM__
  236.         "part_sash, "
  237.         #endif
  238.         "x, "
  239.         "y, "
  240.         "skill_group, "
  241.         "change_name "
  242.         "FROM player%s WHERE account_id=%u", GetTablePostfix(), info->pAccountTable->id);
  243.     }
  244.  
  245.  
  246. // PLAYER_INDEX_CREATE_BUG_FIX
  247. void CClientManager::RESULT_PLAYER_INDEX_CREATE(CPeer * pkPeer, SQLMsg * msg)
  248. {
  249.     CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  250.     ClientHandleInfo * info = (ClientHandleInfo *) qi->pvData;
  251.  
  252.     char szQuery[QUERY_MAX_LEN];
  253.     snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, pid5, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), info->pAccountTable->id);
  254.     CDBManager::instance().ReturnQuery(szQuery, QID_LOGIN_BY_KEY, pkPeer->GetHandle(), info);
  255. }
  256. // END_PLAYER_INDEX_CREATE_BUG_FIX
  257.  
  258. TAccountTable * CreateAccountTableFromRes(MYSQL_RES * res)
  259. {
  260.     char input_pwd[PASSWD_MAX_LEN + 1];
  261.     MYSQL_ROW row = NULL;
  262.     DWORD col;
  263.  
  264.     row = mysql_fetch_row(res);
  265.     col = 0;
  266.  
  267.     TAccountTable * pkTab = new TAccountTable;
  268.     memset(pkTab, 0, sizeof(TAccountTable));
  269.  
  270.     // Ăąąř° ÄĂ·ł °Í¸¸ Âü°í ÇŃ´Ů (JOIN QUERY¸¦ Ŕ§ÇŃ °Í ŔÓ)
  271.     strlcpy(input_pwd, row[col++], sizeof(input_pwd));
  272.     str_to_number(pkTab->id, row[col++]);
  273.     strlcpy(pkTab->login, row[col++], sizeof(pkTab->login));
  274.     strlcpy(pkTab->passwd, row[col++], sizeof(pkTab->passwd));
  275.     strlcpy(pkTab->social_id, row[col++], sizeof(pkTab->social_id));
  276.     str_to_number(pkTab->bEmpire, row[col++]);
  277.  
  278.     for (int j = 0; j < PLAYER_PER_ACCOUNT; ++j)
  279.         str_to_number(pkTab->players[j].dwID, row[col++]);
  280.  
  281.     strlcpy(pkTab->status, row[col++], sizeof(pkTab->status));
  282.  
  283.     if (strcmp(pkTab->passwd, input_pwd))
  284.     {
  285.         delete pkTab;
  286.         return NULL;
  287.     }
  288.  
  289.     return pkTab;
  290. }
  291.  
  292. void CreateAccountPlayerDataFromRes(MYSQL_RES * pRes, TAccountTable * pkTab)
  293. {
  294.     if (!pRes)
  295.         return;
  296.  
  297.     for (DWORD i = 0; i < mysql_num_rows(pRes); ++i)
  298.     {
  299.         MYSQL_ROW row = mysql_fetch_row(pRes);
  300.         int col = 0;
  301.  
  302.         DWORD player_id = 0;
  303.         !row[col++] ? 0 : str_to_number(player_id, row[col - 1]);
  304.  
  305.         if (!player_id)
  306.             continue;
  307.  
  308.         int j;
  309.  
  310.         for (j = 0; j < PLAYER_PER_ACCOUNT; ++j)
  311.         {
  312.             if (pkTab->players[j].dwID == player_id)
  313.             {
  314.                 CPlayerTableCache * pc = CClientManager::instance().GetPlayerCache(player_id);
  315.                 TPlayerTable * pt = pc ? pc->Get(false) : NULL;
  316.  
  317.                 if (pt)
  318.                 {
  319.                     strlcpy(pkTab->players[j].szName, pt->name, sizeof(pkTab->players[j].szName));
  320.  
  321.                     pkTab->players[j].byJob         = pt->job;
  322.                     pkTab->players[j].byLevel           = pt->level;
  323.                     pkTab->players[j].dwPlayMinutes     = pt->playtime;
  324.                     pkTab->players[j].byST          = pt->st;
  325.                     pkTab->players[j].byHT          = pt->ht;
  326.                     pkTab->players[j].byDX          = pt->dx;
  327.                     pkTab->players[j].byIQ          = pt->iq;
  328.                     pkTab->players[j].wMainPart         = pt->parts[PART_MAIN];
  329.                     pkTab->players[j].wHairPart         = pt->parts[PART_HAIR];
  330.                     #ifdef __SASH_SYSTEM__
  331.                     pkTab->players[j].wSashPart         = pt->parts[PART_SASH];
  332.                     #endif
  333.                     pkTab->players[j].x             = pt->x;
  334.                     pkTab->players[j].y             = pt->y;
  335.                     pkTab->players[j].skill_group       = pt->skill_group;
  336.                     pkTab->players[j].bChangeName       = 0;
  337.                 }
  338.                 else
  339.                 {
  340.                     if (!row[col++])
  341.                         *pkTab->players[j].szName = '\0';
  342.                     else
  343.                         strlcpy(pkTab->players[j].szName, row[col - 1], sizeof(pkTab->players[j].szName));
  344.  
  345.                     pkTab->players[j].byJob         = 0;
  346.                     pkTab->players[j].byLevel       = 0;
  347.                     pkTab->players[j].dwPlayMinutes = 0;
  348.                     pkTab->players[j].byST          = 0;
  349.                     pkTab->players[j].byHT          = 0;
  350.                     pkTab->players[j].byDX          = 0;
  351.                     pkTab->players[j].byIQ          = 0;
  352.                     pkTab->players[j].wMainPart     = 0;
  353.                     pkTab->players[j].wHairPart     = 0;
  354.                     #ifdef __SASH_SYSTEM__
  355.                     pkTab->players[j].wSashPart     = 0;
  356.                     #endif
  357.                     pkTab->players[j].x             = 0;
  358.                     pkTab->players[j].y             = 0;
  359.                     pkTab->players[j].skill_group   = 0;
  360.                     pkTab->players[j].bChangeName   = 0;
  361.  
  362.                     str_to_number(pkTab->players[j].byJob, row[col++]);
  363.                     str_to_number(pkTab->players[j].byLevel, row[col++]);
  364.                     str_to_number(pkTab->players[j].dwPlayMinutes, row[col++]);
  365.                     str_to_number(pkTab->players[j].byST, row[col++]);
  366.                     str_to_number(pkTab->players[j].byHT, row[col++]);
  367.                     str_to_number(pkTab->players[j].byDX, row[col++]);
  368.                     str_to_number(pkTab->players[j].byIQ, row[col++]);
  369.                     str_to_number(pkTab->players[j].wMainPart, row[col++]);
  370.                     str_to_number(pkTab->players[j].wHairPart, row[col++]);
  371.                     #ifdef __SASH_SYSTEM__
  372.                     str_to_number(pkTab->players[j].wSashPart, row[col++]);
  373.                     #endif
  374.                     str_to_number(pkTab->players[j].x, row[col++]);
  375.                     str_to_number(pkTab->players[j].y, row[col++]);
  376.                     str_to_number(pkTab->players[j].skill_group, row[col++]);
  377.                     str_to_number(pkTab->players[j].bChangeName, row[col++]);
  378.                 }
  379.  
  380.                 sys_log(0, "%s %lu %lu hair %u",
  381.                         pkTab->players[j].szName, pkTab->players[j].x, pkTab->players[j].y, pkTab->players[j].wHairPart);
  382.                 break;
  383.             }
  384.         }
  385.         /*
  386.            if (j == PLAYER_PER_ACCOUNT)
  387.            sys_err("cannot find player_id on this account (login: %s id %lu account %lu %lu %lu)",
  388.            pkTab->login, player_id,
  389.            pkTab->players[0].dwID,
  390.            pkTab->players[1].dwID,
  391.            pkTab->players[2].dwID);
  392.            */
  393.     }
  394. }
  395.  
  396. void CClientManager::RESULT_LOGIN(CPeer * peer, SQLMsg * msg)
  397. {
  398.     CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  399.     ClientHandleInfo * info = (ClientHandleInfo *) qi->pvData;
  400.  
  401.     if (info->account_index == 0)
  402.     {
  403.         // °čÁ¤ŔĚ ľřł×?
  404.         if (msg->Get()->uiNumRows == 0)
  405.         {
  406.             sys_log(0, "RESULT_LOGIN: no account");
  407.             peer->EncodeHeader(HEADER_DG_LOGIN_NOT_EXIST, info->dwHandle, 0);
  408.             delete info;
  409.             return;
  410.         }
  411.  
  412.         info->pAccountTable = CreateAccountTableFromRes(msg->Get()->pSQLResult);
  413.  
  414.         if (!info->pAccountTable)
  415.         {
  416.             sys_log(0, "RESULT_LOGIN: no account : WRONG_PASSWD");
  417.             peer->EncodeReturn(HEADER_DG_LOGIN_WRONG_PASSWD, info->dwHandle);
  418.             delete info;
  419.         }
  420.         else
  421.         {
  422.             ++info->account_index;
  423.  
  424.             char queryStr[512];
  425.             extern std::string g_stLocale;
  426. if (g_stLocale == "gb2312")
  427.             {
  428.                 snprintf(queryStr, sizeof(queryStr), "SELECT "
  429.                 "id, "
  430.                 "name, "
  431.                 "job, "
  432.                 "level, "
  433.                 "alignment, "
  434.                 "st, "
  435.                 "ht, "
  436.                 "dx, "
  437.                 "iq, "
  438.                 "part_main, "
  439.                 "part_hair, "
  440.                 #ifdef __SASH_SYSTEM__
  441.                 "part_sash, "
  442.                 #endif
  443.                 "x, "
  444.                 "y, "
  445.                 "skill_group, "
  446.                 "change_name "
  447.                 "FROM player%s WHERE account_id=%u", GetTablePostfix(), info->pAccountTable->id);
  448.             }
  449.             else
  450.             {
  451.                 snprintf(queryStr, sizeof(queryStr), "SELECT "
  452.                 "id, "
  453.                 "name, "
  454.                 "job, "
  455.                 "level, "
  456.                 "playtime, "
  457.                 "st, "
  458.                 "ht, "
  459.                 "dx, "
  460.                 "iq, "
  461.                 "part_main, "
  462.                 "part_hair, "
  463.                 #ifdef __SASH_SYSTEM__
  464.                 "part_sash, "
  465.                 #endif
  466.                 "x, "
  467.                 "y, "
  468.                 "skill_group, "
  469.                 "change_name "
  470.                 "FROM player%s WHERE account_id=%u", GetTablePostfix(), info->pAccountTable->id);
  471.             }
  472.  
  473.             CDBManager::instance().ReturnQuery(queryStr, QID_LOGIN, peer->GetHandle(), info);
  474.         }
  475.         return;
  476.     }
  477.     else
  478.     {
  479.         if (!info->pAccountTable) // ŔĚ·˛¸®´Â ľř°ÚÁö¸¸;;
  480.         {
  481.             peer->EncodeReturn(HEADER_DG_LOGIN_WRONG_PASSWD, info->dwHandle);
  482.             delete info;
  483.             return;
  484.         }
  485.  
  486.         // ´Ů¸Ą ÄÁłŘĽÇŔĚ ŔĚąĚ ·Î±×ŔÎ ÇŘąö·Č´Ů¸é.. ŔĚąĚ Á˘ĽÓÇß´Ů°í ş¸ł»ľß ÇŃ´Ů.
  487.         if (!InsertLogonAccount(info->pAccountTable->login, peer->GetHandle(), info->ip))
  488.         {
  489.             sys_log(0, "RESULT_LOGIN: already logon %s", info->pAccountTable->login);
  490.  
  491.             TPacketDGLoginAlready p;
  492.             strlcpy(p.szLogin, info->pAccountTable->login, sizeof(p.szLogin));
  493.  
  494.             peer->EncodeHeader(HEADER_DG_LOGIN_ALREADY, info->dwHandle, sizeof(TPacketDGLoginAlready));
  495.             peer->Encode(&p, sizeof(p));
  496.         }
  497.         else
  498.         {
  499.             sys_log(0, "RESULT_LOGIN: login success %s rows: %lu", info->pAccountTable->login, msg->Get()->uiNumRows);
  500.  
  501.             if (msg->Get()->uiNumRows > 0)
  502.                 CreateAccountPlayerDataFromRes(msg->Get()->pSQLResult, info->pAccountTable);
  503.  
  504.             //PREVENT_COPY_ITEM
  505.             CLoginData * p = GetLoginDataByLogin(info->pAccountTable->login);
  506.             memcpy(&p->GetAccountRef(), info->pAccountTable, sizeof(TAccountTable));
  507.  
  508.             //END_PREVENT_COPY_ITEM
  509.             peer->EncodeHeader(HEADER_DG_LOGIN_SUCCESS, info->dwHandle, sizeof(TAccountTable));
  510.             peer->Encode(info->pAccountTable, sizeof(TAccountTable));
  511.  
  512.         }
  513.  
  514.         delete info->pAccountTable;
  515.         info->pAccountTable = NULL;
  516.         delete info;
  517.     }
  518. }
  519.  
  520. void CClientManager::QUERY_LOGOUT(CPeer * peer, DWORD dwHandle,const char * data)
  521. {
  522.     TLogoutPacket* packet = (TLogoutPacket*)data;
  523.  
  524.     if (!*packet->login)
  525.         return;
  526.  
  527.     CLoginData * pLoginData = GetLoginDataByLogin(packet->login);
  528.  
  529.     if (pLoginData == NULL)
  530.         return;
  531.  
  532.     int pid[PLAYER_PER_ACCOUNT];
  533.  
  534.     for (int n = 0; n < PLAYER_PER_ACCOUNT; ++n)
  535.     {
  536.         if (pLoginData->GetAccountRef().players[n].dwID == 0)
  537.         {
  538.             if (g_test_server)
  539.                 sys_log(0, "LOGOUT %s %d", packet->login, pLoginData->GetAccountRef().players[n].dwID);
  540.             continue;
  541.         }
  542.        
  543.         pid[n] = pLoginData->GetAccountRef().players[n].dwID;
  544.  
  545.         if (g_log)
  546.             sys_log(0, "LOGOUT InsertLogoutPlayer %s %d", packet->login, pid[n]);
  547.  
  548.         InsertLogoutPlayer(pid[n]);
  549.     }
  550.    
  551.     if (DeleteLogonAccount(packet->login, peer->GetHandle()))
  552.     {
  553.         if (g_log)
  554.             sys_log(0, "LOGOUT %s ", packet->login);
  555.     }
  556. }
  557.  
  558. void CClientManager::QUERY_CHANGE_NAME(CPeer * peer, DWORD dwHandle, TPacketGDChangeName * p)
  559. {
  560.     char queryStr[QUERY_MAX_LEN];
  561.  
  562.     if (g_stLocale == "sjis")
  563.         snprintf(queryStr, sizeof(queryStr),
  564.                 "SELECT COUNT(*) as count FROM player%s WHERE name='%s' collate sjis_japanese_ci AND id <> %u",
  565.                 GetTablePostfix(), p->name, p->pid);
  566.     else
  567.         snprintf(queryStr, sizeof(queryStr),
  568.             "SELECT COUNT(*) as count FROM player%s WHERE name='%s' AND id <> %u", GetTablePostfix(), p->name, p->pid);
  569.  
  570.     std::auto_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(queryStr, SQL_PLAYER));
  571.  
  572.     if (pMsg->Get()->uiNumRows)
  573.     {
  574.         if (!pMsg->Get()->pSQLResult)
  575.         {
  576.             peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0);
  577.             return;
  578.         }
  579.  
  580.         MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
  581.  
  582.         if (*row[0] != '0')
  583.         {
  584.             peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
  585.             return;
  586.         }
  587.     }  
  588.     else
  589.     {
  590.         peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0);
  591.         return;
  592.     }
  593.  
  594.     snprintf(queryStr, sizeof(queryStr),
  595.             "UPDATE player%s SET name='%s',change_name=0 WHERE id=%u", GetTablePostfix(), p->name, p->pid);
  596.  
  597.     std::auto_ptr<SQLMsg> pMsg0(CDBManager::instance().DirectQuery(queryStr, SQL_PLAYER));
  598.  
  599.     TPacketDGChangeName pdg;
  600.     peer->EncodeHeader(HEADER_DG_CHANGE_NAME, dwHandle, sizeof(TPacketDGChangeName));
  601.     pdg.pid = p->pid;
  602.     strlcpy(pdg.name, p->name, sizeof(pdg.name));
  603.     peer->Encode(&pdg, sizeof(TPacketDGChangeName));
  604. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement