Advertisement
Guest User

ClientManager.cpp

a guest
Feb 18th, 2020
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 142.04 KB | None | 0 0
  1.  
  2. #include "stdafx.h"
  3. #include "../../common/CommonDefines.h"
  4.  
  5. #include "../../common/billing.h"
  6. #include "../../common/building.h"
  7. #include "../../common/VnumHelper.h"
  8. #include "../../libgame/include/grid.h"
  9.  
  10. #include "ClientManager.h"
  11.  
  12. #include "Main.h"
  13. #include "Config.h"
  14. #include "DBManager.h"
  15. #include "QID.h"
  16. #include "GuildManager.h"
  17. #include "PrivManager.h"
  18. #include "MoneyLog.h"
  19. #include "ItemAwardManager.h"
  20. #include "Marriage.h"
  21. #include "Monarch.h"
  22. #include "BlockCountry.h"
  23. #include "ItemIDRangeManager.h"
  24. #include "Cache.h"
  25. #include <sstream>
  26. #ifdef __AUCTION__
  27. #include "AuctionManager.h"
  28. #endif
  29. extern int g_iPlayerCacheFlushSeconds;
  30. extern int g_iItemCacheFlushSeconds;
  31. extern int g_test_server;
  32. extern int g_log;
  33. extern std::string g_stLocale;
  34. extern std::string g_stLocaleNameColumn;
  35. bool CreateItemTableFromRes(MYSQL_RES * res, std::vector<TPlayerItem> * pVec, DWORD dwPID);
  36.  
  37. DWORD g_dwUsageMax = 0;
  38. DWORD g_dwUsageAvg = 0;
  39.  
  40. CPacketInfo g_query_info;
  41. CPacketInfo g_item_info;
  42.  
  43. int g_item_count = 0;
  44. int g_query_count[2];
  45. #ifdef ENABLE_PROTO_FROM_DB
  46. bool g_bMirror2DB = false;
  47. #endif
  48.  
  49. CClientManager::CClientManager() :
  50.     m_pkAuthPeer(NULL),
  51.     m_iPlayerIDStart(0),
  52.     m_iPlayerDeleteLevelLimit(0),
  53.     m_iPlayerDeleteLevelLimitLower(0),
  54.     m_bChinaEventServer(false),
  55.     m_iShopTableSize(0),
  56.     m_pShopTable(NULL),
  57.     m_iRefineTableSize(0),
  58.     m_pRefineTable(NULL),
  59.     m_bShutdowned(FALSE),
  60.     m_iCacheFlushCount(0),
  61.     m_iCacheFlushCountLimit(200)
  62. {
  63.     m_itemRange.dwMin = 0;
  64.     m_itemRange.dwMax = 0;
  65.     m_itemRange.dwUsableItemIDMin = 0;
  66.  
  67.     memset(g_query_count, 0, sizeof(g_query_count));
  68. #ifdef ENABLE_PROTO_FROM_DB
  69.     bIsProtoReadFromDB = false;
  70. #endif
  71. }
  72.  
  73. CClientManager::~CClientManager()
  74. {
  75.     Destroy();
  76. }
  77.  
  78. void CClientManager::SetPlayerIDStart(int iIDStart)
  79. {
  80.     m_iPlayerIDStart = iIDStart;
  81. }
  82.  
  83. void CClientManager::GetPeerP2PHostNames(std::string& peerHostNames)
  84. {
  85.     std::ostringstream oss(std::ostringstream::out);
  86.  
  87.     for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  88.     {
  89.         CPeer * peer = *it;
  90.         oss << peer->GetHost() << " " << peer->GetP2PPort() << " channel : " << (int)(peer->GetChannel()) << "\n";
  91.     }
  92.  
  93.     peerHostNames += oss.str();
  94. }
  95.  
  96. void CClientManager::Destroy()
  97. {
  98.     m_mChannelStatus.clear();
  99.     for (itertype(m_peerList) i = m_peerList.begin(); i != m_peerList.end(); ++i)
  100.         (*i)->Destroy();
  101.  
  102.     m_peerList.clear();
  103.  
  104.     if (m_fdAccept > 0)
  105.     {
  106.         socket_close(m_fdAccept);
  107.         m_fdAccept = -1;
  108.     }
  109. }
  110.  
  111. #define ENABLE_DEFAULT_PRIV
  112. #ifdef ENABLE_DEFAULT_PRIV
  113. static bool bCleanOldPriv = true;
  114. static bool __InitializeDefaultPriv()
  115. {
  116.     if (bCleanOldPriv)
  117.     {
  118.         std::auto_ptr<SQLMsg> pCleanStuff(CDBManager::instance().DirectQuery("DELETE FROM priv_settings WHERE value <= 0 OR duration <= NOW();", SQL_COMMON));
  119.         printf("DEFAULT_PRIV_EMPIRE: removed %u expired priv settings.\n", pCleanStuff->Get()->uiAffectedRows);
  120.     }
  121.     std::auto_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery("SELECT priv_type, id, type, value, UNIX_TIMESTAMP(duration) FROM priv_settings", SQL_COMMON));
  122.     if (pMsg->Get()->uiNumRows == 0)
  123.         return false;
  124.     MYSQL_ROW row = NULL;
  125.     while ((row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
  126.     {
  127.         if (!strcmp(row[0], "EMPIRE"))
  128.         {
  129.             // init
  130.             BYTE empire = 0;
  131.             BYTE type = 1;
  132.             int value = 0;
  133.             time_t duration_sec = 0;
  134.             // set
  135.             str_to_number(empire, row[1]);
  136.             str_to_number(type, row[2]);
  137.             str_to_number(value, row[3]);
  138.             str_to_number(duration_sec, row[4]);
  139.             // recalibrate time
  140.             time_t now_time_sec = CClientManager::instance().GetCurrentTime();
  141.             if (now_time_sec>duration_sec)
  142.                 duration_sec = 0;
  143.             else
  144.                 duration_sec -= now_time_sec;
  145.             // send priv
  146.             printf("DEFAULT_PRIV_EMPIRE: set empire(%u), type(%u), value(%d), duration(%u)\n", empire, type, value, duration_sec);
  147.             CPrivManager::instance().AddEmpirePriv(empire, type, value, duration_sec);
  148.         }
  149.         else if (!strcmp(row[0], "GUILD"))
  150.         {
  151.             // init
  152.             DWORD guild_id = 0;
  153.             BYTE type = 1;
  154.             int value = 0;
  155.             time_t duration_sec = 0;
  156.             // set
  157.             str_to_number(guild_id, row[1]);
  158.             str_to_number(type, row[2]);
  159.             str_to_number(value, row[3]);
  160.             str_to_number(duration_sec, row[4]);
  161.             // recalibrate time
  162.             time_t now_time_sec = CClientManager::instance().GetCurrentTime();
  163.             if (now_time_sec>duration_sec)
  164.                 duration_sec = 0;
  165.             else
  166.                 duration_sec -= now_time_sec;
  167.             // send priv
  168.             if (guild_id)
  169.             {
  170.                 printf("DEFAULT_PRIV_GUILD: set guild_id(%u), type(%u), value(%d), duration(%u)\n", guild_id, type, value, duration_sec);
  171.                 CPrivManager::instance().AddGuildPriv(guild_id, type, value, duration_sec);
  172.             }
  173.         }
  174.         else if (!strcmp(row[0], "PLAYER"))
  175.         {
  176.             // init
  177.             DWORD pid = 0;
  178.             BYTE type = 1;
  179.             int value = 0;
  180.             // set
  181.             str_to_number(pid, row[1]);
  182.             str_to_number(type, row[2]);
  183.             str_to_number(value, row[3]);
  184.             // send priv
  185.             if (pid)
  186.             {
  187.                 printf("DEFAULT_PRIV_PLAYER: set pid(%u), type(%u), value(%d)\n", pid, type, value);
  188.                 CPrivManager::instance().AddCharPriv(pid, type, value);
  189.             }
  190.         }
  191.     }
  192.     return true;
  193. }
  194.  
  195. static bool __UpdateDefaultPriv(const char* priv_type, DWORD id, BYTE type, int value, time_t duration_sec)
  196. {
  197.     char szQuery[1024];
  198.     snprintf(szQuery, 1024,
  199.         "REPLACE INTO priv_settings SET priv_type='%s', id=%u, type=%u, value=%d, duration=DATE_ADD(NOW(), INTERVAL %u SECOND);",
  200.         priv_type, id, type, value, duration_sec
  201.     );
  202.     std::auto_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_COMMON));
  203.     return pMsg->Get()->uiAffectedRows;
  204. }
  205. #endif
  206.  
  207. bool CClientManager::Initialize()
  208. {
  209.     int tmpValue;
  210.  
  211.     //BOOT_LOCALIZATION
  212.     if (!InitializeLocalization())
  213.     {
  214.         fprintf(stderr, "Failed Localization Infomation so exit\n");
  215.         return false;
  216.     }
  217. #ifdef ENABLE_DEFAULT_PRIV
  218.     if (!__InitializeDefaultPriv())
  219.     {
  220.         fprintf(stderr, "Failed Default Priv Setting so exit\n");
  221.         // return false;
  222.     }
  223. #endif
  224.     //END_BOOT_LOCALIZATION
  225.     //ITEM_UNIQUE_ID
  226.  
  227.     if (!InitializeNowItemID())
  228.     {
  229.         fprintf(stderr, " Item range Initialize Failed. Exit DBCache Server\n");
  230.         return false;
  231.     }
  232.     //END_ITEM_UNIQUE_ID
  233.  
  234. #ifdef ENABLE_PROTO_FROM_DB
  235.     int iTemp;
  236.     if (CConfig::instance().GetValue("PROTO_FROM_DB", &iTemp))
  237.     {
  238.         bIsProtoReadFromDB = !!iTemp;
  239.         fprintf(stdout, "PROTO_FROM_DB: %s\n", (bIsProtoReadFromDB)?"Enabled":"Disabled");
  240.     }
  241.     if (!bIsProtoReadFromDB && CConfig::instance().GetValue("MIRROR2DB", &iTemp))
  242.     {
  243.         g_bMirror2DB = !!iTemp;
  244.         fprintf(stdout, "MIRROR2DB: %s\n", (g_bMirror2DB)?"Enabled":"Disabled");
  245.     }
  246. #endif
  247.     if (!InitializeTables())
  248.     {
  249.         sys_err("Table Initialize FAILED");
  250.         return false;
  251.     }
  252.  
  253.     CGuildManager::instance().BootReserveWar();
  254.  
  255.     if (!CConfig::instance().GetValue("BIND_PORT", &tmpValue))
  256.         tmpValue = 5300;
  257.  
  258.     char szBindIP[128];
  259.  
  260.     if (!CConfig::instance().GetValue("BIND_IP", szBindIP, 128))
  261.         strlcpy(szBindIP, "0", sizeof(szBindIP));
  262.  
  263.     m_fdAccept = socket_tcp_bind(szBindIP, tmpValue);
  264.  
  265.     if (m_fdAccept < 0)
  266.     {
  267.         perror("socket");
  268.         return false;
  269.     }
  270.  
  271.     sys_log(0, "ACCEPT_HANDLE: %u", m_fdAccept);
  272.     fdwatch_add_fd(m_fdWatcher, m_fdAccept, NULL, FDW_READ, false);
  273.  
  274.     if (!CConfig::instance().GetValue("BACKUP_LIMIT_SEC", &tmpValue))
  275.         tmpValue = 600;
  276.  
  277.     m_looping = true;
  278.  
  279.     if (!CConfig::instance().GetValue("PLAYER_DELETE_LEVEL_LIMIT", &m_iPlayerDeleteLevelLimit))
  280.     {
  281.         sys_err("conf.txt: Cannot find PLAYER_DELETE_LEVEL_LIMIT, use default level %d", PLAYER_MAX_LEVEL_CONST + 1);
  282.         m_iPlayerDeleteLevelLimit = PLAYER_MAX_LEVEL_CONST + 1;
  283.     }
  284.  
  285.     if (!CConfig::instance().GetValue("PLAYER_DELETE_LEVEL_LIMIT_LOWER", &m_iPlayerDeleteLevelLimitLower))
  286.     {
  287.         m_iPlayerDeleteLevelLimitLower = 0;
  288.     }
  289.  
  290.     sys_log(0, "PLAYER_DELETE_LEVEL_LIMIT set to %d", m_iPlayerDeleteLevelLimit);
  291.     sys_log(0, "PLAYER_DELETE_LEVEL_LIMIT_LOWER set to %d", m_iPlayerDeleteLevelLimitLower);
  292.  
  293.     m_bChinaEventServer = false;
  294.  
  295.     int iChinaEventServer = 0;
  296.  
  297.     if (CConfig::instance().GetValue("CHINA_EVENT_SERVER", &iChinaEventServer))
  298.         m_bChinaEventServer = (iChinaEventServer);
  299.  
  300.     sys_log(0, "CHINA_EVENT_SERVER %s", CClientManager::instance().IsChinaEventServer()?"true":"false");
  301.  
  302.  
  303.     LoadEventFlag();
  304.  
  305.     // database character-setÀ» °­Á¦·Î ¸ÂÃã
  306.     if (g_stLocale == "big5" || g_stLocale == "sjis")
  307.         CDBManager::instance().QueryLocaleSet();
  308.  
  309.     return true;
  310. }
  311.  
  312. void CClientManager::MainLoop()
  313. {
  314.     SQLMsg * tmp;
  315.  
  316.     sys_log(0, "ClientManager pointer is %p", this);
  317.  
  318.     while (!m_bShutdowned)
  319.     {
  320.         while ((tmp = CDBManager::instance().PopResult()))
  321.         {
  322.             AnalyzeQueryResult(tmp);
  323.             delete tmp;
  324.         }
  325.  
  326.         if (!Process())
  327.             break;
  328.  
  329.         log_rotate();
  330.     }
  331.  
  332.     sys_log(0, "MainLoop exited, Starting cache flushing");
  333.  
  334.     signal_timer_disable();
  335.  
  336.     itertype(m_map_playerCache) it = m_map_playerCache.begin();
  337.  
  338.     while (it != m_map_playerCache.end())
  339.     {
  340.         CPlayerTableCache * c = (it++)->second;
  341.  
  342.         c->Flush();
  343.         delete c;
  344.     }
  345.     m_map_playerCache.clear();
  346.  
  347.  
  348.     itertype(m_map_itemCache) it2 = m_map_itemCache.begin();
  349.     while (it2 != m_map_itemCache.end())
  350.     {
  351.         CItemCache * c = (it2++)->second;
  352.  
  353.         c->Flush();
  354.         delete c;
  355.     }
  356.     m_map_itemCache.clear();
  357.  
  358.     // MYSHOP_PRICE_LIST
  359.     for (itertype(m_mapItemPriceListCache) itPriceList = m_mapItemPriceListCache.begin(); itPriceList != m_mapItemPriceListCache.end(); ++itPriceList)
  360.     {
  361.         CItemPriceListTableCache* pCache = itPriceList->second;
  362.         pCache->Flush();
  363.         delete pCache;
  364.     }
  365.  
  366.     m_mapItemPriceListCache.clear();
  367.     // END_OF_MYSHOP_PRICE_LIST
  368. }
  369.  
  370. void CClientManager::Quit()
  371. {
  372.     m_bShutdowned = TRUE;
  373. }
  374.  
  375. void CClientManager::QUERY_BOOT(CPeer* peer, TPacketGDBoot * p)
  376. {
  377.     const BYTE bPacketVersion = 6;
  378.  
  379.     std::vector<tAdminInfo> vAdmin;
  380.     std::vector<std::string> vHost;
  381.  
  382.     __GetHostInfo(vHost);
  383.     __GetAdminInfo(p->szIP, vAdmin);
  384.  
  385.     sys_log(0, "QUERY_BOOT : AdminInfo (Request ServerIp %s) ", p->szIP);
  386.  
  387.     DWORD dwPacketSize =
  388.         sizeof(DWORD) +
  389.         sizeof(BYTE) +
  390.         sizeof(WORD) + sizeof(WORD) + sizeof(TMobTable) * m_vec_mobTable.size() +
  391.         sizeof(WORD) + sizeof(WORD) + sizeof(TItemTable) * m_vec_itemTable.size() +
  392.         sizeof(WORD) + sizeof(WORD) + sizeof(TShopTable) * m_iShopTableSize +
  393.         sizeof(WORD) + sizeof(WORD) + sizeof(TSkillTable) * m_vec_skillTable.size() +
  394.         sizeof(WORD) + sizeof(WORD) + sizeof(TRefineTable) * m_iRefineTableSize +
  395.         sizeof(WORD) + sizeof(WORD) + sizeof(TItemAttrTable) * m_vec_itemAttrTable.size() +
  396.         sizeof(WORD) + sizeof(WORD) + sizeof(TItemAttrTable) * m_vec_itemRareTable.size() +
  397.         sizeof(WORD) + sizeof(WORD) + sizeof(TBanwordTable) * m_vec_banwordTable.size() +
  398.         sizeof(WORD) + sizeof(WORD) + sizeof(building::TLand) * m_vec_kLandTable.size() +
  399.         sizeof(WORD) + sizeof(WORD) + sizeof(building::TObjectProto) * m_vec_kObjectProto.size() +
  400.         sizeof(WORD) + sizeof(WORD) + sizeof(building::TObject) * m_map_pkObjectTable.size() +
  401. #ifdef __AUCTION__
  402.         sizeof(WORD) + sizeof(WORD) + sizeof(TPlayerItem) * AuctionManager::instance().GetAuctionItemSize() +
  403.         sizeof(WORD) + sizeof(WORD) + sizeof(TAuctionItemInfo) * AuctionManager::instance().GetAuctionSize() +
  404.         sizeof(WORD) + sizeof(WORD) + sizeof(TSaleItemInfo) * AuctionManager::instance().GetSaleSize() +
  405.         sizeof(WORD) + sizeof(WORD) + sizeof(TWishItemInfo) * AuctionManager::instance().GetWishSize() +
  406.         sizeof(WORD) + sizeof(WORD) + (sizeof(DWORD) + sizeof(DWORD) + sizeof(int)) * AuctionManager::instance().GetMyBidSize() +
  407. #endif
  408.         sizeof(time_t) +
  409.         sizeof(WORD) + sizeof(WORD) + sizeof(TItemIDRangeTable)*2 +
  410.         //ADMIN_MANAGER
  411.         sizeof(WORD) + sizeof(WORD) + 16 * vHost.size() +
  412.         sizeof(WORD) + sizeof(WORD) +  sizeof(tAdminInfo) *  vAdmin.size() +
  413.         //END_ADMIN_MANAGER
  414.         sizeof(WORD) + sizeof(WORD) + sizeof(TMonarchInfo) +
  415.         sizeof(WORD) + sizeof(WORD) + sizeof(MonarchCandidacy)* CMonarch::instance().MonarchCandidacySize() +
  416.         sizeof(WORD);
  417.  
  418.     peer->EncodeHeader(HEADER_DG_BOOT, 0, dwPacketSize);
  419.     peer->Encode(&dwPacketSize, sizeof(DWORD));
  420.     peer->Encode(&bPacketVersion, sizeof(BYTE));
  421.  
  422.     sys_log(0, "BOOT: PACKET: %d", dwPacketSize);
  423.     sys_log(0, "BOOT: VERSION: %d", bPacketVersion);
  424.  
  425.     sys_log(0, "sizeof(TMobTable) = %d", sizeof(TMobTable));
  426.     sys_log(0, "sizeof(TItemTable) = %d", sizeof(TItemTable));
  427.     sys_log(0, "sizeof(TShopTable) = %d", sizeof(TShopTable));
  428.     sys_log(0, "sizeof(TSkillTable) = %d", sizeof(TSkillTable));
  429.     sys_log(0, "sizeof(TRefineTable) = %d", sizeof(TRefineTable));
  430.     sys_log(0, "sizeof(TItemAttrTable) = %d", sizeof(TItemAttrTable));
  431.     sys_log(0, "sizeof(TItemRareTable) = %d", sizeof(TItemAttrTable));
  432.     sys_log(0, "sizeof(TBanwordTable) = %d", sizeof(TBanwordTable));
  433.     sys_log(0, "sizeof(TLand) = %d", sizeof(building::TLand));
  434.     sys_log(0, "sizeof(TObjectProto) = %d", sizeof(building::TObjectProto));
  435.     sys_log(0, "sizeof(TObject) = %d", sizeof(building::TObject));
  436.     //ADMIN_MANAGER
  437.     sys_log(0, "sizeof(tAdminInfo) = %d * %d ", sizeof(tAdminInfo) * vAdmin.size());
  438.     //END_ADMIN_MANAGER
  439.     sys_log(0, "sizeof(TMonarchInfo) = %d * %d", sizeof(TMonarchInfo));
  440.  
  441.     peer->EncodeWORD(sizeof(TMobTable));
  442.     peer->EncodeWORD(m_vec_mobTable.size());
  443.     peer->Encode(&m_vec_mobTable[0], sizeof(TMobTable) * m_vec_mobTable.size());
  444.  
  445.     peer->EncodeWORD(sizeof(TItemTable));
  446.     peer->EncodeWORD(m_vec_itemTable.size());
  447.     peer->Encode(&m_vec_itemTable[0], sizeof(TItemTable) * m_vec_itemTable.size());
  448.  
  449.     peer->EncodeWORD(sizeof(TShopTable));
  450.     peer->EncodeWORD(m_iShopTableSize);
  451.     peer->Encode(m_pShopTable, sizeof(TShopTable) * m_iShopTableSize);
  452.  
  453.     peer->EncodeWORD(sizeof(TSkillTable));
  454.     peer->EncodeWORD(m_vec_skillTable.size());
  455.     peer->Encode(&m_vec_skillTable[0], sizeof(TSkillTable) * m_vec_skillTable.size());
  456.  
  457.     peer->EncodeWORD(sizeof(TRefineTable));
  458.     peer->EncodeWORD(m_iRefineTableSize);
  459.     peer->Encode(m_pRefineTable, sizeof(TRefineTable) * m_iRefineTableSize);
  460.  
  461.     peer->EncodeWORD(sizeof(TItemAttrTable));
  462.     peer->EncodeWORD(m_vec_itemAttrTable.size());
  463.     peer->Encode(&m_vec_itemAttrTable[0], sizeof(TItemAttrTable) * m_vec_itemAttrTable.size());
  464.  
  465.     peer->EncodeWORD(sizeof(TItemAttrTable));
  466.     peer->EncodeWORD(m_vec_itemRareTable.size());
  467.     peer->Encode(&m_vec_itemRareTable[0], sizeof(TItemAttrTable) * m_vec_itemRareTable.size());
  468.  
  469.     peer->EncodeWORD(sizeof(TBanwordTable));
  470.     peer->EncodeWORD(m_vec_banwordTable.size());
  471.     peer->Encode(&m_vec_banwordTable[0], sizeof(TBanwordTable) * m_vec_banwordTable.size());
  472.  
  473.     peer->EncodeWORD(sizeof(building::TLand));
  474.     peer->EncodeWORD(m_vec_kLandTable.size());
  475.     peer->Encode(&m_vec_kLandTable[0], sizeof(building::TLand) * m_vec_kLandTable.size());
  476.  
  477.     peer->EncodeWORD(sizeof(building::TObjectProto));
  478.     peer->EncodeWORD(m_vec_kObjectProto.size());
  479.     peer->Encode(&m_vec_kObjectProto[0], sizeof(building::TObjectProto) * m_vec_kObjectProto.size());
  480.  
  481.     peer->EncodeWORD(sizeof(building::TObject));
  482.     peer->EncodeWORD(m_map_pkObjectTable.size());
  483.  
  484.     itertype(m_map_pkObjectTable) it = m_map_pkObjectTable.begin();
  485.  
  486.     while (it != m_map_pkObjectTable.end())
  487.         peer->Encode((it++)->second, sizeof(building::TObject));
  488.  
  489.     // Auction Boot
  490. #ifdef __AUCTION__
  491.     AuctionManager::instance().Boot (peer);
  492. #endif
  493.     time_t now = time(0);
  494.     peer->Encode(&now, sizeof(time_t));
  495.  
  496.     TItemIDRangeTable itemRange = CItemIDRangeManager::instance().GetRange();
  497.     TItemIDRangeTable itemRangeSpare = CItemIDRangeManager::instance().GetRange();
  498.  
  499.     peer->EncodeWORD(sizeof(TItemIDRangeTable));
  500.     peer->EncodeWORD(1);
  501.     peer->Encode(&itemRange, sizeof(TItemIDRangeTable));
  502.     peer->Encode(&itemRangeSpare, sizeof(TItemIDRangeTable));
  503.  
  504.     peer->SetItemIDRange(itemRange);
  505.     peer->SetSpareItemIDRange(itemRangeSpare);
  506.  
  507.     //ADMIN_MANAGER
  508.     peer->EncodeWORD(16);
  509.     peer->EncodeWORD(vHost.size());
  510.  
  511.     for (size_t n = 0; n < vHost.size(); ++n)
  512.     {
  513.         peer->Encode(vHost[n].c_str(), 16);
  514.         sys_log(0, "GMHosts %s", vHost[n].c_str());
  515.     }
  516.  
  517.     peer->EncodeWORD(sizeof(tAdminInfo));
  518.     peer->EncodeWORD(vAdmin.size());
  519.  
  520.     for (size_t n = 0; n < vAdmin.size(); ++n)
  521.     {
  522.         peer->Encode(&vAdmin[n], sizeof(tAdminInfo));
  523.         sys_log(0, "Admin name %s ConntactIP %s", vAdmin[n].m_szName, vAdmin[n].m_szContactIP);
  524.     }
  525.     //END_ADMIN_MANAGER
  526.  
  527.     //MONARCH
  528.     peer->EncodeWORD(sizeof(TMonarchInfo));
  529.     peer->EncodeWORD(1);
  530.     peer->Encode(CMonarch::instance().GetMonarch(), sizeof(TMonarchInfo));
  531.  
  532.     CMonarch::VEC_MONARCHCANDIDACY & rVecMonarchCandidacy = CMonarch::instance().GetVecMonarchCandidacy();
  533.  
  534.     size_t num_monarch_candidacy = CMonarch::instance().MonarchCandidacySize();
  535.     peer->EncodeWORD(sizeof(MonarchCandidacy));
  536.     peer->EncodeWORD(num_monarch_candidacy);
  537.     if (num_monarch_candidacy != 0) {
  538.         peer->Encode(&rVecMonarchCandidacy[0], sizeof(MonarchCandidacy) * num_monarch_candidacy);
  539.     }
  540.     //END_MONARCE
  541.  
  542.     if (g_test_server)
  543.         sys_log(0, "MONARCHCandidacy Size %d", CMonarch::instance().MonarchCandidacySize());
  544.  
  545.     peer->EncodeWORD(0xffff);
  546. }
  547.  
  548. void CClientManager::SendPartyOnSetup(CPeer* pkPeer)
  549. {
  550.     TPartyMap & pm = m_map_pkChannelParty[pkPeer->GetChannel()];
  551.  
  552.     for (itertype(pm) it_party = pm.begin(); it_party != pm.end(); ++it_party)
  553.     {
  554.         sys_log(0, "PARTY SendPartyOnSetup Party [%u]", it_party->first);
  555.         pkPeer->EncodeHeader(HEADER_DG_PARTY_CREATE, 0, sizeof(TPacketPartyCreate));
  556.         pkPeer->Encode(&it_party->first, sizeof(DWORD));
  557.  
  558.         for (itertype(it_party->second) it_member = it_party->second.begin(); it_member != it_party->second.end(); ++it_member)
  559.         {
  560.             sys_log(0, "PARTY SendPartyOnSetup Party [%u] Member [%u]", it_party->first, it_member->first);
  561.             pkPeer->EncodeHeader(HEADER_DG_PARTY_ADD, 0, sizeof(TPacketPartyAdd));
  562.             pkPeer->Encode(&it_party->first, sizeof(DWORD));
  563.             pkPeer->Encode(&it_member->first, sizeof(DWORD));
  564.             pkPeer->Encode(&it_member->second.bRole, sizeof(BYTE));
  565.  
  566.             pkPeer->EncodeHeader(HEADER_DG_PARTY_SET_MEMBER_LEVEL, 0, sizeof(TPacketPartySetMemberLevel));
  567.             pkPeer->Encode(&it_party->first, sizeof(DWORD));
  568.             pkPeer->Encode(&it_member->first, sizeof(DWORD));
  569.             pkPeer->Encode(&it_member->second.bLevel, sizeof(BYTE));
  570.         }
  571.     }
  572. }
  573.  
  574. void CClientManager::QUERY_PLAYER_COUNT(CPeer * pkPeer, TPlayerCountPacket * pPacket)
  575. {
  576.     pkPeer->SetUserCount(pPacket->dwCount);
  577. }
  578.  
  579. void CClientManager::QUERY_QUEST_SAVE(CPeer * pkPeer, TQuestTable * pTable, DWORD dwLen)
  580. {
  581.     if (0 != (dwLen % sizeof(TQuestTable)))
  582.     {
  583.         sys_err("invalid packet size %d, sizeof(TQuestTable) == %d", dwLen, sizeof(TQuestTable));
  584.         return;
  585.     }
  586.  
  587.     int iSize = dwLen / sizeof(TQuestTable);
  588.  
  589.     char szQuery[1024];
  590.  
  591.     for (int i = 0; i < iSize; ++i, ++pTable)
  592.     {
  593.         if (pTable->lValue == 0)
  594.         {
  595.             snprintf(szQuery, sizeof(szQuery),
  596.                     "DELETE FROM quest%s WHERE dwPID=%d AND szName='%s' AND szState='%s'",
  597.                     GetTablePostfix(), pTable->dwPID, pTable->szName, pTable->szState);
  598.         }
  599.         else
  600.         {
  601.             snprintf(szQuery, sizeof(szQuery),
  602.                     "REPLACE INTO quest%s (dwPID, szName, szState, lValue) VALUES(%d, '%s', '%s', %ld)",
  603.                     GetTablePostfix(), pTable->dwPID, pTable->szName, pTable->szState, pTable->lValue);
  604.         }
  605.  
  606.         CDBManager::instance().ReturnQuery(szQuery, QID_QUEST_SAVE, pkPeer->GetHandle(), NULL);
  607.     }
  608. }
  609.  
  610. void CClientManager::QUERY_SAFEBOX_LOAD(CPeer * pkPeer, DWORD dwHandle, TSafeboxLoadPacket * packet, bool bMall)
  611. {
  612.     ClientHandleInfo * pi = new ClientHandleInfo(dwHandle);
  613.     strlcpy(pi->safebox_password, packet->szPassword, sizeof(pi->safebox_password));
  614.     pi->account_id = packet->dwID;
  615.     pi->account_index = 0;
  616.     pi->ip[0] = bMall ? 1 : 0;
  617.     strlcpy(pi->login, packet->szLogin, sizeof(pi->login));
  618.  
  619.     char szQuery[QUERY_MAX_LEN];
  620.     snprintf(szQuery, sizeof(szQuery),
  621.             "SELECT account_id, size, password FROM safebox%s WHERE account_id=%u",
  622.             GetTablePostfix(), packet->dwID);
  623.  
  624.     if (g_log)
  625.         sys_log(0, "HEADER_GD_SAFEBOX_LOAD (handle: %d account.id %u is_mall %d)", dwHandle, packet->dwID, bMall ? 1 : 0);
  626.  
  627.     CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_LOAD, pkPeer->GetHandle(), pi);
  628. }
  629.  
  630. void CClientManager::RESULT_SAFEBOX_LOAD(CPeer * pkPeer, SQLMsg * msg)
  631. {
  632.     CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  633.     ClientHandleInfo * pi = (ClientHandleInfo *) qi->pvData;
  634.     DWORD dwHandle = pi->dwHandle;
  635.  
  636.     if (pi->account_index == 0)
  637.     {
  638.         char szSafeboxPassword[SAFEBOX_PASSWORD_MAX_LEN + 1];
  639.         strlcpy(szSafeboxPassword, pi->safebox_password, sizeof(szSafeboxPassword));
  640.  
  641.         TSafeboxTable * pSafebox = new TSafeboxTable;
  642.         memset(pSafebox, 0, sizeof(TSafeboxTable));
  643.  
  644.         SQLResult * res = msg->Get();
  645.  
  646.         if (res->uiNumRows == 0)
  647.         {
  648.             if (strcmp("000000", szSafeboxPassword))
  649.             {
  650.                 pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_WRONG_PASSWORD, dwHandle, 0);
  651.                 delete pi;
  652.                 return;
  653.             }
  654.         }
  655.         else
  656.         {
  657.             MYSQL_ROW row = mysql_fetch_row(res->pSQLResult);
  658.  
  659.             if (((!row[2] || !*row[2]) && strcmp("000000", szSafeboxPassword)) ||
  660.                 ((row[2] && *row[2]) && strcmp(row[2], szSafeboxPassword)))
  661.             {
  662.                 pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_WRONG_PASSWORD, dwHandle, 0);
  663.                 delete pi;
  664.                 return;
  665.             }
  666.  
  667.             if (!row[0])
  668.                 pSafebox->dwID = 0;
  669.             else
  670.                 str_to_number(pSafebox->dwID, row[0]);
  671.  
  672.             if (!row[1])
  673.                 pSafebox->bSize = 0;
  674.             else
  675.                 str_to_number(pSafebox->bSize, row[1]);
  676.             /*
  677.                if (!row[3])
  678.                pSafebox->dwGold = 0;
  679.                else
  680.                pSafebox->dwGold = atoi(row[3]);
  681.                */
  682.             if (pi->ip[0] == 1)
  683.             {
  684.                 pSafebox->bSize = 1;
  685.                 sys_log(0, "MALL id[%d] size[%d]", pSafebox->dwID, pSafebox->bSize);
  686.             }
  687.             else
  688.                 sys_log(0, "SAFEBOX id[%d] size[%d]", pSafebox->dwID, pSafebox->bSize);
  689.         }
  690.  
  691.         if (0 == pSafebox->dwID)
  692.             pSafebox->dwID = pi->account_id;
  693.  
  694.         pi->pSafebox = pSafebox;
  695.  
  696.         char szQuery[512];
  697.         snprintf(szQuery, sizeof(szQuery),
  698.                 "SELECT id, `window`+0, pos, count, vnum, socket0, socket1, socket2, "
  699.                 "attrtype0, attrvalue0, "
  700.                 "attrtype1, attrvalue1, "
  701.                 "attrtype2, attrvalue2, "
  702.                 "attrtype3, attrvalue3, "
  703.                 "attrtype4, attrvalue4, "
  704.                 "attrtype5, attrvalue5, "
  705.                 "attrtype6, attrvalue6 "
  706.                 "FROM item%s WHERE owner_id=%d AND `window`='%s'",
  707.                 GetTablePostfix(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL");
  708.  
  709.         pi->account_index = 1;
  710.  
  711.         CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_LOAD, pkPeer->GetHandle(), pi);
  712.     }
  713.     else
  714.     {
  715.  
  716.         if (!pi->pSafebox)
  717.         {
  718.             sys_err("null safebox pointer!");
  719.             delete pi;
  720.             return;
  721.         }
  722.  
  723.         if (!msg->Get()->pSQLResult)
  724.         {
  725.             sys_err("null safebox result");
  726.             delete pi;
  727.             return;
  728.         }
  729.  
  730.         static std::vector<TPlayerItem> s_items;
  731.         CreateItemTableFromRes(msg->Get()->pSQLResult, &s_items, pi->account_id);
  732.  
  733.         std::set<TItemAward *> * pSet = ItemAwardManager::instance().GetByLogin(pi->login);
  734.  
  735.         if (pSet && !m_vec_itemTable.empty())
  736.         {
  737.  
  738.             CGrid grid(5, MAX(1, pi->pSafebox->bSize) * 9);
  739.             bool bEscape = false;
  740.  
  741.             for (DWORD i = 0; i < s_items.size(); ++i)
  742.             {
  743.                 TPlayerItem & r = s_items[i];
  744.  
  745.                 itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find(r.vnum);
  746.  
  747.                 if (it == m_map_itemTableByVnum.end())
  748.                 {
  749.                     bEscape = true;
  750.                     sys_err("invalid item vnum %u in safebox: login %s", r.vnum, pi->login);
  751.                     break;
  752.                 }
  753.  
  754.                 grid.Put(r.pos, 1, it->second->bSize);
  755.             }
  756.  
  757.             if (!bEscape)
  758.             {
  759.                 std::vector<std::pair<DWORD, DWORD> > vec_dwFinishedAwardID;
  760.  
  761.                 typeof(pSet->begin()) it = pSet->begin();
  762.  
  763.                 char szQuery[512];
  764.  
  765.                 while (it != pSet->end())
  766.                 {
  767.                     TItemAward * pItemAward = *(it++);
  768.                     const DWORD& dwItemVnum = pItemAward->dwVnum;
  769.  
  770.                     if (pItemAward->bTaken)
  771.                         continue;
  772.  
  773.                     if (pi->ip[0] == 0 && pItemAward->bMall)
  774.                         continue;
  775.  
  776.                     if (pi->ip[0] == 1 && !pItemAward->bMall)
  777.                         continue;
  778.  
  779.                     itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find(pItemAward->dwVnum);
  780.  
  781.                     if (it == m_map_itemTableByVnum.end())
  782.                     {
  783.                         sys_err("invalid item vnum %u in item_award: login %s", pItemAward->dwVnum, pi->login);
  784.                         continue;
  785.                     }
  786.  
  787.                     TItemTable * pItemTable = it->second;
  788.  
  789.                     int iPos;
  790.  
  791.                     if ((iPos = grid.FindBlank(1, it->second->bSize)) == -1)
  792.                         break;
  793.  
  794.                     TPlayerItem item;
  795.                     memset(&item, 0, sizeof(TPlayerItem));
  796.  
  797.                     DWORD dwSocket2 = 0;
  798.  
  799.                     if (pItemTable->bType == ITEM_UNIQUE)
  800.                     {
  801.                         if (pItemAward->dwSocket2 != 0)
  802.                             dwSocket2 = pItemAward->dwSocket2;
  803.                         else
  804.                             dwSocket2 = pItemTable->alValues[0];
  805.                     }
  806.                     else if ((dwItemVnum == 50300 || dwItemVnum == 70037) && pItemAward->dwSocket0 == 0)
  807.                     {
  808.                         DWORD dwSkillIdx;
  809.                         DWORD dwSkillVnum;
  810.  
  811.                         do
  812.                         {
  813.                             dwSkillIdx = number(0, m_vec_skillTable.size()-1);
  814.  
  815.                             dwSkillVnum = m_vec_skillTable[dwSkillIdx].dwVnum;
  816.  
  817.                             break;
  818.                         } while (1);
  819.  
  820.                         pItemAward->dwSocket0 = dwSkillVnum;
  821.                     }
  822.                     else
  823.                     {
  824.                         switch (dwItemVnum)
  825.                         {
  826.                             case 72723: case 72724: case 72725: case 72726:
  827.                             case 72727: case 72728: case 72729: case 72730:
  828.                             case 76004: case 76005: case 76021: case 76022:
  829.                             case 79012: case 79013:
  830.                                 if (pItemAward->dwSocket2 == 0)
  831.                                 {
  832.                                     dwSocket2 = pItemTable->alValues[0];
  833.                                 }
  834.                                 else
  835.                                 {
  836.                                     dwSocket2 = pItemAward->dwSocket2;
  837.                                 }
  838.                                 break;
  839.                         }
  840.                     }
  841.  
  842.                     if (GetItemID () > m_itemRange.dwMax)
  843.                     {
  844.                         sys_err("UNIQUE ID OVERFLOW!!");
  845.                         break;
  846.                     }
  847.  
  848.                     {
  849.                         itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find (dwItemVnum);
  850.                         if (it == m_map_itemTableByVnum.end())
  851.                         {
  852.                             sys_err ("Invalid item(vnum : %d). It is not in m_map_itemTableByVnum.", dwItemVnum);
  853.                             continue;
  854.                         }
  855.                         TItemTable* item_table = it->second;
  856.                         if (item_table == NULL)
  857.                         {
  858.                             sys_err ("Invalid item_table (vnum : %d). It's value is NULL in m_map_itemTableByVnum.", dwItemVnum);
  859.                             continue;
  860.                         }
  861.                         if (0 == pItemAward->dwSocket0)
  862.                         {
  863.                             for (int i = 0; i < ITEM_LIMIT_MAX_NUM; i++)
  864.                             {
  865.                                 if (LIMIT_REAL_TIME == item_table->aLimits[i].bType)
  866.                                 {
  867.                                     if (0 == item_table->aLimits[i].lValue)
  868.                                         pItemAward->dwSocket0 = time(0) + 60 * 60 * 24 * 7;
  869.                                     else
  870.                                         pItemAward->dwSocket0 = time(0) + item_table->aLimits[i].lValue;
  871.  
  872.                                     break;
  873.                                 }
  874.                                 else if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType || LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType)
  875.                                 {
  876.                                     if (0 == item_table->aLimits[i].lValue)
  877.                                         pItemAward->dwSocket0 = 60 * 60 * 24 * 7;
  878.                                     else
  879.                                         pItemAward->dwSocket0 = item_table->aLimits[i].lValue;
  880.  
  881.                                     break;
  882.                                 }
  883.                             }
  884.                         }
  885.  
  886.                         snprintf(szQuery, sizeof(szQuery),
  887.                                 "INSERT INTO item%s (id, owner_id, `window`, pos, vnum, count, socket0, socket1, socket2) "
  888.                                 "VALUES(%u, %u, '%s', %d, %u, %u, %u, %u, %u)",
  889.                                 GetTablePostfix(),
  890.                                 GainItemID(),
  891.                                 pi->account_id,
  892.                                 pi->ip[0] == 0 ? "SAFEBOX" : "MALL",
  893.                                 iPos,
  894.                                 pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2);
  895.                     }
  896.  
  897.                     std::auto_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
  898.                     SQLResult * pRes = pmsg->Get();
  899.                     sys_log(0, "SAFEBOX Query : [%s]", szQuery);
  900.  
  901.                     if (pRes->uiAffectedRows == 0 || pRes->uiInsertID == 0 || pRes->uiAffectedRows == (uint32_t)-1)
  902.                         break;
  903.  
  904.                     item.id = pmsg->Get()->uiInsertID;
  905.                     item.window = pi->ip[0] == 0 ? SAFEBOX : MALL,
  906.                     item.pos = iPos;
  907.                     item.count = pItemAward->dwCount;
  908.                     item.vnum = pItemAward->dwVnum;
  909.                     item.alSockets[0] = pItemAward->dwSocket0;
  910.                     item.alSockets[1] = pItemAward->dwSocket1;
  911.                     item.alSockets[2] = dwSocket2;
  912.                     s_items.push_back(item);
  913.  
  914.                     vec_dwFinishedAwardID.push_back(std::make_pair(pItemAward->dwID, item.id));
  915.                     grid.Put(iPos, 1, it->second->bSize);
  916.                 }
  917.  
  918.                 for (DWORD i = 0; i < vec_dwFinishedAwardID.size(); ++i)
  919.                     ItemAwardManager::instance().Taken(vec_dwFinishedAwardID[i].first, vec_dwFinishedAwardID[i].second);
  920.             }
  921.         }
  922.  
  923.         pi->pSafebox->wItemCount = s_items.size();
  924.  
  925.         pkPeer->EncodeHeader(pi->ip[0] == 0 ? HEADER_DG_SAFEBOX_LOAD : HEADER_DG_MALL_LOAD, dwHandle, sizeof(TSafeboxTable) + sizeof(TPlayerItem) * s_items.size());
  926.  
  927.         pkPeer->Encode(pi->pSafebox, sizeof(TSafeboxTable));
  928.  
  929.         if (!s_items.empty())
  930.             pkPeer->Encode(&s_items[0], sizeof(TPlayerItem) * s_items.size());
  931.  
  932.         delete pi;
  933.     }
  934. }
  935.  
  936. void CClientManager::QUERY_SAFEBOX_CHANGE_SIZE(CPeer * pkPeer, DWORD dwHandle, TSafeboxChangeSizePacket * p)
  937. {
  938.     ClientHandleInfo * pi = new ClientHandleInfo(dwHandle);
  939.     pi->account_index = p->bSize;
  940.  
  941.     char szQuery[QUERY_MAX_LEN];
  942.  
  943.     if (p->bSize == 1)
  944.         snprintf(szQuery, sizeof(szQuery), "INSERT INTO safebox%s (account_id, size) VALUES(%u, %u)", GetTablePostfix(), p->dwID, p->bSize);
  945.     else
  946.         snprintf(szQuery, sizeof(szQuery), "UPDATE safebox%s SET size=%u WHERE account_id=%u", GetTablePostfix(), p->bSize, p->dwID);
  947.  
  948.     CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_CHANGE_SIZE, pkPeer->GetHandle(), pi);
  949. }
  950.  
  951. void CClientManager::RESULT_SAFEBOX_CHANGE_SIZE(CPeer * pkPeer, SQLMsg * msg)
  952. {
  953.     CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  954.     ClientHandleInfo * p = (ClientHandleInfo *) qi->pvData;
  955.     DWORD dwHandle = p->dwHandle;
  956.     BYTE bSize = p->account_index;
  957.  
  958.     delete p;
  959.  
  960.     if (msg->Get()->uiNumRows > 0)
  961.     {
  962.         pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_CHANGE_SIZE, dwHandle, sizeof(BYTE));
  963.         pkPeer->EncodeBYTE(bSize);
  964.     }
  965. }
  966.  
  967. void CClientManager::QUERY_SAFEBOX_CHANGE_PASSWORD(CPeer * pkPeer, DWORD dwHandle, TSafeboxChangePasswordPacket * p)
  968. {
  969.     ClientHandleInfo * pi = new ClientHandleInfo(dwHandle);
  970.     strlcpy(pi->safebox_password, p->szNewPassword, sizeof(pi->safebox_password));
  971.     strlcpy(pi->login, p->szOldPassword, sizeof(pi->login));
  972.     pi->account_id = p->dwID;
  973.  
  974.     char szQuery[QUERY_MAX_LEN];
  975.     snprintf(szQuery, sizeof(szQuery), "SELECT password FROM safebox%s WHERE account_id=%u", GetTablePostfix(), p->dwID);
  976.  
  977.     CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_CHANGE_PASSWORD, pkPeer->GetHandle(), pi);
  978. }
  979.  
  980. void CClientManager::RESULT_SAFEBOX_CHANGE_PASSWORD(CPeer * pkPeer, SQLMsg * msg)
  981. {
  982.     CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  983.     ClientHandleInfo * p = (ClientHandleInfo *) qi->pvData;
  984.     DWORD dwHandle = p->dwHandle;
  985.  
  986.     if (msg->Get()->uiNumRows > 0)
  987.     {
  988.         MYSQL_ROW row = mysql_fetch_row(msg->Get()->pSQLResult);
  989.  
  990.         if ((row[0] && *row[0] && !strcasecmp(row[0], p->login)) || ((!row[0] || !*row[0]) && !strcmp("000000", p->login)))
  991.         {
  992.             char szQuery[QUERY_MAX_LEN];
  993.             char escape_pwd[64];
  994.             CDBManager::instance().EscapeString(escape_pwd, p->safebox_password, strlen(p->safebox_password));
  995.  
  996.             snprintf(szQuery, sizeof(szQuery), "UPDATE safebox%s SET password='%s' WHERE account_id=%u", GetTablePostfix(), escape_pwd, p->account_id);
  997.  
  998.             CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_CHANGE_PASSWORD_SECOND, pkPeer->GetHandle(), p);
  999.             return;
  1000.         }
  1001.     }
  1002.  
  1003.     delete p;
  1004.  
  1005.     // Wrong old password
  1006.     pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_CHANGE_PASSWORD_ANSWER, dwHandle, sizeof(BYTE));
  1007.     pkPeer->EncodeBYTE(0);
  1008. }
  1009.  
  1010. void CClientManager::RESULT_SAFEBOX_CHANGE_PASSWORD_SECOND(CPeer * pkPeer, SQLMsg * msg)
  1011. {
  1012.     CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  1013.     ClientHandleInfo * p = (ClientHandleInfo *) qi->pvData;
  1014.     DWORD dwHandle = p->dwHandle;
  1015.     delete p;
  1016.  
  1017.     pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_CHANGE_PASSWORD_ANSWER, dwHandle, sizeof(BYTE));
  1018.     pkPeer->EncodeBYTE(1);
  1019. }
  1020.  
  1021. // MYSHOP_PRICE_LIST
  1022. void CClientManager::RESULT_PRICELIST_LOAD(CPeer* peer, SQLMsg* pMsg)
  1023. {
  1024.     TItemPricelistReqInfo* pReqInfo = (TItemPricelistReqInfo*)static_cast<CQueryInfo*>(pMsg->pvUserData)->pvData;
  1025.  
  1026.     TItemPriceListTable table;
  1027.     table.dwOwnerID = pReqInfo->second;
  1028.     table.byCount = 0;
  1029.  
  1030.     MYSQL_ROW row;
  1031.  
  1032.     while ((row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
  1033.     {
  1034.         str_to_number(table.aPriceInfo[table.byCount].dwVnum, row[0]);
  1035.         str_to_number(table.aPriceInfo[table.byCount].dwPrice, row[1]);
  1036.         table.byCount++;
  1037.     }
  1038.  
  1039.     PutItemPriceListCache(&table);
  1040.  
  1041.     TPacketMyshopPricelistHeader header;
  1042.  
  1043.     header.dwOwnerID = pReqInfo->second;
  1044.     header.byCount = table.byCount;
  1045.  
  1046.     size_t sizePriceListSize = sizeof(TItemPriceInfo) * header.byCount;
  1047.  
  1048.     peer->EncodeHeader(HEADER_DG_MYSHOP_PRICELIST_RES, pReqInfo->first, sizeof(header) + sizePriceListSize);
  1049.     peer->Encode(&header, sizeof(header));
  1050.     peer->Encode(table.aPriceInfo, sizePriceListSize);
  1051.  
  1052.     sys_log(0, "Load MyShopPricelist handle[%d] pid[%d] count[%d]", pReqInfo->first, pReqInfo->second, header.byCount);
  1053.  
  1054.     delete pReqInfo;
  1055. }
  1056.  
  1057. void CClientManager::RESULT_PRICELIST_LOAD_FOR_UPDATE(SQLMsg* pMsg)
  1058. {
  1059.     TItemPriceListTable* pUpdateTable = (TItemPriceListTable*)static_cast<CQueryInfo*>(pMsg->pvUserData)->pvData;
  1060.  
  1061.     TItemPriceListTable table;
  1062.     table.dwOwnerID = pUpdateTable->dwOwnerID;
  1063.     table.byCount = 0;
  1064.  
  1065.     MYSQL_ROW row;
  1066.  
  1067.     while ((row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
  1068.     {
  1069.         str_to_number(table.aPriceInfo[table.byCount].dwVnum, row[0]);
  1070.         str_to_number(table.aPriceInfo[table.byCount].dwPrice, row[1]);
  1071.         table.byCount++;
  1072.     }
  1073.  
  1074.     PutItemPriceListCache(&table);
  1075.  
  1076.     // Update cache
  1077.     GetItemPriceListCache(pUpdateTable->dwOwnerID)->UpdateList(pUpdateTable);
  1078.  
  1079.     delete pUpdateTable;
  1080. }
  1081. // END_OF_MYSHOP_PRICE_LIST
  1082.  
  1083. void CClientManager::QUERY_SAFEBOX_SAVE(CPeer * pkPeer, TSafeboxTable * pTable)
  1084. {
  1085.     char szQuery[QUERY_MAX_LEN];
  1086.  
  1087.     snprintf(szQuery, sizeof(szQuery),
  1088.             "UPDATE safebox%s SET gold='%u' WHERE account_id=%u",
  1089.             GetTablePostfix(), pTable->dwGold, pTable->dwID);
  1090.  
  1091.     CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_SAVE, pkPeer->GetHandle(), NULL);
  1092. }
  1093.  
  1094. void CClientManager::QUERY_EMPIRE_SELECT(CPeer * pkPeer, DWORD dwHandle, TEmpireSelectPacket * p)
  1095. {
  1096.     char szQuery[QUERY_MAX_LEN];
  1097.  
  1098.     snprintf(szQuery, sizeof(szQuery), "UPDATE player_index%s SET empire=%u WHERE id=%u", GetTablePostfix(), p->bEmpire, p->dwAccountID);
  1099.     delete CDBManager::instance().DirectQuery(szQuery);
  1100.  
  1101.     sys_log(0, "EmpireSelect: %s", szQuery);
  1102.     {
  1103. #ifdef ENABLE_PLAYER_PER_ACCOUNT5
  1104.         snprintf(szQuery, sizeof(szQuery),
  1105.                 "SELECT pid1, pid2, pid3, pid4, pid5 FROM player_index%s WHERE id=%u", GetTablePostfix(), p->dwAccountID);
  1106. #else
  1107.         snprintf(szQuery, sizeof(szQuery),
  1108.                 "SELECT pid1, pid2, pid3, pid4 FROM player_index%s WHERE id=%u", GetTablePostfix(), p->dwAccountID);
  1109. #endif
  1110.  
  1111.         std::auto_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
  1112.  
  1113.         SQLResult * pRes = pmsg->Get();
  1114.  
  1115.         if (pRes->uiNumRows)
  1116.         {
  1117.             sys_log(0, "EMPIRE %lu", pRes->uiNumRows);
  1118.  
  1119.             MYSQL_ROW row = mysql_fetch_row(pRes->pSQLResult);
  1120.             DWORD pids[3];
  1121.  
  1122.             UINT g_start_map[4] =
  1123.             {
  1124.                 0,  // reserved
  1125.                 1,  
  1126.                 21,
  1127.                 41  
  1128.             };
  1129.  
  1130.             // FIXME share with game
  1131.             DWORD g_start_position[4][2]=
  1132.             {
  1133.                 {      0,      0 },
  1134.                 { 469300, 964200 },
  1135.                 {  55700, 157900 },
  1136.                 { 969600, 278400 }  
  1137.             };
  1138.  
  1139.             for (int i = 0; i < 3; ++i)
  1140.             {
  1141.                 str_to_number(pids[i], row[i]);
  1142.                 sys_log(0, "EMPIRE PIDS[%d]", pids[i]);
  1143.  
  1144.                 if (pids[i])
  1145.                 {
  1146.                     sys_log(0, "EMPIRE move to pid[%d] to villiage of %u, map_index %d",
  1147.                             pids[i], p->bEmpire, g_start_map[p->bEmpire]);
  1148.  
  1149.                     snprintf(szQuery, sizeof(szQuery), "UPDATE player%s SET map_index=%u,x=%u,y=%u WHERE id=%u",
  1150.                             GetTablePostfix(),
  1151.                             g_start_map[p->bEmpire],
  1152.                             g_start_position[p->bEmpire][0],
  1153.                             g_start_position[p->bEmpire][1],
  1154.                             pids[i]);
  1155.  
  1156.                     std::auto_ptr<SQLMsg> pmsg2(CDBManager::instance().DirectQuery(szQuery));
  1157.                 }
  1158.             }
  1159.         }
  1160.     }
  1161.  
  1162.     pkPeer->EncodeHeader(HEADER_DG_EMPIRE_SELECT, dwHandle, sizeof(BYTE));
  1163.     pkPeer->EncodeBYTE(p->bEmpire);
  1164. }
  1165.  
  1166. void CClientManager::QUERY_SETUP(CPeer * peer, DWORD dwHandle, const char * c_pData)
  1167. {
  1168.     TPacketGDSetup * p = (TPacketGDSetup *) c_pData;
  1169.     c_pData += sizeof(TPacketGDSetup);
  1170.  
  1171.     if (p->bAuthServer)
  1172.     {
  1173.         sys_log(0, "AUTH_PEER ptr %p", peer);
  1174.  
  1175.         m_pkAuthPeer = peer;
  1176.         SendAllLoginToBilling();
  1177.         return;
  1178.     }
  1179.  
  1180.     peer->SetPublicIP(p->szPublicIP);
  1181.     peer->SetChannel(p->bChannel);
  1182.     peer->SetListenPort(p->wListenPort);
  1183.     peer->SetP2PPort(p->wP2PPort);
  1184.     peer->SetMaps(p->alMaps);
  1185.  
  1186.     TMapLocation kMapLocations;
  1187.  
  1188.     strlcpy(kMapLocations.szHost, peer->GetPublicIP(), sizeof(kMapLocations.szHost));
  1189.     kMapLocations.wPort = peer->GetListenPort();
  1190.     thecore_memcpy(kMapLocations.alMaps, peer->GetMaps(), sizeof(kMapLocations.alMaps));
  1191.  
  1192.     BYTE bMapCount;
  1193.  
  1194.     std::vector<TMapLocation> vec_kMapLocations;
  1195.  
  1196.     if (peer->GetChannel() == 1)
  1197.     {
  1198.         for (itertype(m_peerList) i = m_peerList.begin(); i != m_peerList.end(); ++i)
  1199.         {
  1200.             CPeer * tmp = *i;
  1201.  
  1202.             if (tmp == peer)
  1203.                 continue;
  1204.  
  1205.             if (!tmp->GetChannel())
  1206.                 continue;
  1207.  
  1208.             if (tmp->GetChannel() == GUILD_WARP_WAR_CHANNEL || tmp->GetChannel() == peer->GetChannel())
  1209.             {
  1210.                 TMapLocation kMapLocation2;
  1211.                 strlcpy(kMapLocation2.szHost, tmp->GetPublicIP(), sizeof(kMapLocation2.szHost));
  1212.                 kMapLocation2.wPort = tmp->GetListenPort();
  1213.                 thecore_memcpy(kMapLocation2.alMaps, tmp->GetMaps(), sizeof(kMapLocation2.alMaps));
  1214.                 vec_kMapLocations.push_back(kMapLocation2);
  1215.  
  1216.                 tmp->EncodeHeader(HEADER_DG_MAP_LOCATIONS, 0, sizeof(BYTE) + sizeof(TMapLocation));
  1217.                 bMapCount = 1;
  1218.                 tmp->EncodeBYTE(bMapCount);
  1219.                 tmp->Encode(&kMapLocations, sizeof(TMapLocation));
  1220.             }
  1221.         }
  1222.     }
  1223.     else if (peer->GetChannel() == GUILD_WARP_WAR_CHANNEL)
  1224.     {
  1225.         for (itertype(m_peerList) i = m_peerList.begin(); i != m_peerList.end(); ++i)
  1226.         {
  1227.             CPeer * tmp = *i;
  1228.  
  1229.             if (tmp == peer)
  1230.                 continue;
  1231.  
  1232.             if (!tmp->GetChannel())
  1233.                 continue;
  1234.  
  1235.             if (tmp->GetChannel() == 1 || tmp->GetChannel() == peer->GetChannel())
  1236.             {
  1237.                 TMapLocation kMapLocation2;
  1238.                 strlcpy(kMapLocation2.szHost, tmp->GetPublicIP(), sizeof(kMapLocation2.szHost));
  1239.                 kMapLocation2.wPort = tmp->GetListenPort();
  1240.                 thecore_memcpy(kMapLocation2.alMaps, tmp->GetMaps(), sizeof(kMapLocation2.alMaps));
  1241.                 vec_kMapLocations.push_back(kMapLocation2);
  1242.             }
  1243.  
  1244.             tmp->EncodeHeader(HEADER_DG_MAP_LOCATIONS, 0, sizeof(BYTE) + sizeof(TMapLocation));
  1245.             bMapCount = 1;
  1246.             tmp->EncodeBYTE(bMapCount);
  1247.             tmp->Encode(&kMapLocations, sizeof(TMapLocation));
  1248.         }
  1249.     }
  1250.     else
  1251.     {
  1252.         for (itertype(m_peerList) i = m_peerList.begin(); i != m_peerList.end(); ++i)
  1253.         {
  1254.             CPeer * tmp = *i;
  1255.  
  1256.             if (tmp == peer)
  1257.                 continue;
  1258.  
  1259.             if (!tmp->GetChannel())
  1260.                 continue;
  1261.  
  1262.             if (tmp->GetChannel() == GUILD_WARP_WAR_CHANNEL || tmp->GetChannel() == peer->GetChannel())
  1263.             {
  1264.                 TMapLocation kMapLocation2;
  1265.  
  1266.                 strlcpy(kMapLocation2.szHost, tmp->GetPublicIP(), sizeof(kMapLocation2.szHost));
  1267.                 kMapLocation2.wPort = tmp->GetListenPort();
  1268.                 thecore_memcpy(kMapLocation2.alMaps, tmp->GetMaps(), sizeof(kMapLocation2.alMaps));
  1269.  
  1270.                 vec_kMapLocations.push_back(kMapLocation2);
  1271.             }
  1272.  
  1273.             if (tmp->GetChannel() == peer->GetChannel())
  1274.             {
  1275.                 tmp->EncodeHeader(HEADER_DG_MAP_LOCATIONS, 0, sizeof(BYTE) + sizeof(TMapLocation));
  1276.                 bMapCount = 1;
  1277.                 tmp->EncodeBYTE(bMapCount);
  1278.                 tmp->Encode(&kMapLocations, sizeof(TMapLocation));
  1279.             }
  1280.         }
  1281.     }
  1282.  
  1283.     vec_kMapLocations.push_back(kMapLocations);
  1284.  
  1285.     peer->EncodeHeader(HEADER_DG_MAP_LOCATIONS, 0, sizeof(BYTE) + sizeof(TMapLocation) * vec_kMapLocations.size());
  1286.     bMapCount = vec_kMapLocations.size();
  1287.     peer->EncodeBYTE(bMapCount);
  1288.     peer->Encode(&vec_kMapLocations[0], sizeof(TMapLocation) * vec_kMapLocations.size());
  1289.  
  1290.     sys_log(0, "SETUP: channel %u listen %u p2p %u count %u", peer->GetChannel(), p->wListenPort, p->wP2PPort, bMapCount);
  1291.  
  1292.     TPacketDGP2P p2pSetupPacket;
  1293.     p2pSetupPacket.wPort = peer->GetP2PPort();
  1294.     p2pSetupPacket.bChannel = peer->GetChannel();
  1295.     strlcpy(p2pSetupPacket.szHost, peer->GetPublicIP(), sizeof(p2pSetupPacket.szHost));
  1296.  
  1297.     for (itertype(m_peerList) i = m_peerList.begin(); i != m_peerList.end();++i)
  1298.     {
  1299.         CPeer * tmp = *i;
  1300.  
  1301.         if (tmp == peer)
  1302.             continue;
  1303.  
  1304.         if (0 == tmp->GetChannel())
  1305.             continue;
  1306.  
  1307.         tmp->EncodeHeader(HEADER_DG_P2P, 0, sizeof(TPacketDGP2P));
  1308.         tmp->Encode(&p2pSetupPacket, sizeof(TPacketDGP2P));
  1309.     }
  1310.  
  1311.     TPacketLoginOnSetup * pck = (TPacketLoginOnSetup *) c_pData;;
  1312.     std::vector<TPacketBillingRepair> vec_repair;
  1313.  
  1314.     for (DWORD c = 0; c < p->dwLoginCount; ++c, ++pck)
  1315.     {
  1316.         CLoginData * pkLD = new CLoginData;
  1317.  
  1318.         pkLD->SetKey(pck->dwLoginKey);
  1319.         pkLD->SetClientKey(pck->adwClientKey);
  1320.         pkLD->SetIP(pck->szHost);
  1321.  
  1322.         TAccountTable & r = pkLD->GetAccountRef();
  1323.  
  1324.         r.id = pck->dwID;
  1325.         trim_and_lower(pck->szLogin, r.login, sizeof(r.login));
  1326.         strlcpy(r.social_id, pck->szSocialID, sizeof(r.social_id));
  1327.         strlcpy(r.passwd, "TEMP", sizeof(r.passwd));
  1328.  
  1329.         InsertLoginData(pkLD);
  1330.  
  1331.         if (InsertLogonAccount(pck->szLogin, peer->GetHandle(), pck->szHost))
  1332.         {
  1333.             sys_log(0, "SETUP: login %u %s login_key %u host %s", pck->dwID, pck->szLogin, pck->dwLoginKey, pck->szHost);
  1334.             pkLD->SetPlay(true);
  1335.  
  1336.             if (m_pkAuthPeer)
  1337.             {
  1338.                 TPacketBillingRepair pck_repair;
  1339.                 pck_repair.dwLoginKey = pkLD->GetKey();
  1340.                 strlcpy(pck_repair.szLogin, pck->szLogin, sizeof(pck_repair.szLogin));
  1341.                 strlcpy(pck_repair.szHost, pck->szHost, sizeof(pck_repair.szHost));
  1342.                 vec_repair.push_back(pck_repair);
  1343.             }
  1344.         }
  1345.         else
  1346.             sys_log(0, "SETUP: login_fail %u %s login_key %u", pck->dwID, pck->szLogin, pck->dwLoginKey);
  1347.     }
  1348.  
  1349.     if (m_pkAuthPeer && !vec_repair.empty())
  1350.     {
  1351.         sys_log(0, "REPAIR size %d", vec_repair.size());
  1352.  
  1353.         m_pkAuthPeer->EncodeHeader(HEADER_DG_BILLING_REPAIR, 0, sizeof(DWORD) + sizeof(TPacketBillingRepair) * vec_repair.size());
  1354.         m_pkAuthPeer->EncodeDWORD(vec_repair.size());
  1355.         m_pkAuthPeer->Encode(&vec_repair[0], sizeof(TPacketBillingRepair) * vec_repair.size());
  1356.     }
  1357.  
  1358.     SendPartyOnSetup(peer);
  1359.     CGuildManager::instance().OnSetup(peer);
  1360.     CPrivManager::instance().SendPrivOnSetup(peer);
  1361.     SendEventFlagsOnSetup(peer);
  1362.     marriage::CManager::instance().OnSetup(peer);
  1363. }
  1364.  
  1365. void CClientManager::QUERY_ITEM_FLUSH(CPeer * pkPeer, const char * c_pData)
  1366. {
  1367.     DWORD dwID = *(DWORD *) c_pData;
  1368.  
  1369.     if (g_log)
  1370.         sys_log(0, "HEADER_GD_ITEM_FLUSH: %u", dwID);
  1371.  
  1372.     CItemCache * c = GetItemCache(dwID);
  1373.  
  1374.     if (c)
  1375.         c->Flush();
  1376. }
  1377.  
  1378. void CClientManager::QUERY_ITEM_SAVE(CPeer * pkPeer, const char * c_pData)
  1379. {
  1380.     TPlayerItem * p = (TPlayerItem *) c_pData;
  1381.  
  1382.     if (p->window == SAFEBOX || p->window == MALL)
  1383.     {
  1384.         CItemCache * c = GetItemCache(p->id);
  1385.  
  1386.         if (c)
  1387.         {
  1388.             TItemCacheSetPtrMap::iterator it = m_map_pkItemCacheSetPtr.find(c->Get()->owner);
  1389.  
  1390.             if (it != m_map_pkItemCacheSetPtr.end())
  1391.             {
  1392.                 if (g_test_server)
  1393.                     sys_log(0, "ITEM_CACHE: safebox owner %u id %u", c->Get()->owner, c->Get()->id);
  1394.  
  1395.                 it->second->erase(c);
  1396.             }
  1397.  
  1398.             m_map_itemCache.erase(p->id);
  1399.  
  1400.             delete c;
  1401.         }
  1402.         char szQuery[512];
  1403.  
  1404.         snprintf(szQuery, sizeof(szQuery),
  1405.             "REPLACE INTO item%s (id, owner_id, `window`, pos, count, vnum, socket0, socket1, socket2, "
  1406.             "attrtype0, attrvalue0, "
  1407.             "attrtype1, attrvalue1, "
  1408.             "attrtype2, attrvalue2, "
  1409.             "attrtype3, attrvalue3, "
  1410.             "attrtype4, attrvalue4, "
  1411.             "attrtype5, attrvalue5, "
  1412.             "attrtype6, attrvalue6) "
  1413.             "VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)",
  1414.             GetTablePostfix(),
  1415.             p->id,
  1416.             p->owner,
  1417.             p->window,
  1418.             p->pos,
  1419.             p->count,
  1420.             p->vnum,
  1421.             p->alSockets[0],
  1422.             p->alSockets[1],
  1423.             p->alSockets[2],
  1424.             p->aAttr[0].bType, p->aAttr[0].sValue,
  1425.             p->aAttr[1].bType, p->aAttr[1].sValue,
  1426.             p->aAttr[2].bType, p->aAttr[2].sValue,
  1427.             p->aAttr[3].bType, p->aAttr[3].sValue,
  1428.             p->aAttr[4].bType, p->aAttr[4].sValue,
  1429.             p->aAttr[5].bType, p->aAttr[5].sValue,
  1430.             p->aAttr[6].bType, p->aAttr[6].sValue);
  1431.  
  1432.         CDBManager::instance().ReturnQuery(szQuery, QID_ITEM_SAVE, pkPeer->GetHandle(), NULL);
  1433.     }
  1434. #ifdef __AUCTION__
  1435.     else if (p->window == AUCTION)
  1436.     {
  1437.         sys_err("invalid window. how can you enter this route?");
  1438.         return ;
  1439.     }
  1440. #endif
  1441.     else
  1442.     {
  1443.         if (g_test_server)
  1444.             sys_log(0, "QUERY_ITEM_SAVE => PutItemCache() owner %d id %d vnum %d ", p->owner, p->id, p->vnum);
  1445.  
  1446.         PutItemCache(p);
  1447.     }
  1448. }
  1449.  
  1450. CClientManager::TItemCacheSet * CClientManager::GetItemCacheSet(DWORD pid)
  1451. {
  1452.     TItemCacheSetPtrMap::iterator it = m_map_pkItemCacheSetPtr.find(pid);
  1453.  
  1454.     if (it == m_map_pkItemCacheSetPtr.end())
  1455.         return NULL;
  1456.  
  1457.     return it->second;
  1458. }
  1459.  
  1460. void CClientManager::CreateItemCacheSet(DWORD pid)
  1461. {
  1462.     if (m_map_pkItemCacheSetPtr.find(pid) != m_map_pkItemCacheSetPtr.end())
  1463.         return;
  1464.  
  1465.     TItemCacheSet * pSet = new TItemCacheSet;
  1466.     m_map_pkItemCacheSetPtr.insert(TItemCacheSetPtrMap::value_type(pid, pSet));
  1467.  
  1468.     if (g_log)
  1469.         sys_log(0, "ITEM_CACHE: new cache %u", pid);
  1470. }
  1471.  
  1472. void CClientManager::FlushItemCacheSet(DWORD pid)
  1473. {
  1474.     TItemCacheSetPtrMap::iterator it = m_map_pkItemCacheSetPtr.find(pid);
  1475.  
  1476.     if (it == m_map_pkItemCacheSetPtr.end())
  1477.     {
  1478.         sys_log(0, "FLUSH_ITEMCACHESET : No ItemCacheSet pid(%d)", pid);
  1479.         return;
  1480.     }
  1481.  
  1482.     TItemCacheSet * pSet = it->second;
  1483.     TItemCacheSet::iterator it_set = pSet->begin();
  1484.  
  1485.     while (it_set != pSet->end())
  1486.     {
  1487.         CItemCache * c = *it_set++;
  1488.         c->Flush();
  1489.  
  1490.         m_map_itemCache.erase(c->Get()->id);
  1491.         delete c;
  1492.     }
  1493.  
  1494.     pSet->clear();
  1495.     delete pSet;
  1496.  
  1497.     m_map_pkItemCacheSetPtr.erase(it);
  1498.  
  1499.     if (g_log)
  1500.         sys_log(0, "FLUSH_ITEMCACHESET : Deleted pid(%d)", pid);
  1501. }
  1502.  
  1503. CItemCache * CClientManager::GetItemCache(DWORD id)
  1504. {
  1505.     TItemCacheMap::iterator it = m_map_itemCache.find(id);
  1506.  
  1507.     if (it == m_map_itemCache.end())
  1508.         return NULL;
  1509.  
  1510.     return it->second;
  1511. }
  1512.  
  1513. void CClientManager::PutItemCache(TPlayerItem * pNew, bool bSkipQuery)
  1514. {
  1515.     CItemCache * c;
  1516.  
  1517.     c = GetItemCache(pNew->id);
  1518.    
  1519.     if (!c)
  1520.     {
  1521.         if (g_log)
  1522.             sys_log(0, "ITEM_CACHE: PutItemCache ==> New CItemCache id%d vnum%d new owner%d", pNew->id, pNew->vnum, pNew->owner);
  1523.  
  1524.         c = new CItemCache;
  1525.         m_map_itemCache.insert(TItemCacheMap::value_type(pNew->id, c));
  1526.     }  
  1527.     else
  1528.     {
  1529.         if (g_log)
  1530.             sys_log(0, "ITEM_CACHE: PutItemCache ==> Have Cache");
  1531.    
  1532.         if (pNew->owner != c->Get()->owner)
  1533.         {
  1534.    
  1535.             TItemCacheSetPtrMap::iterator it = m_map_pkItemCacheSetPtr.find(c->Get()->owner);
  1536.  
  1537.             if (it != m_map_pkItemCacheSetPtr.end())
  1538.             {
  1539.                 if (g_log)
  1540.                 sys_log(0, "ITEM_CACHE: delete owner %u id %u new owner %u", c->Get()->owner, c->Get()->id, pNew->owner);
  1541.                 it->second->erase(c);
  1542.             }
  1543.         }
  1544.     }
  1545.  
  1546.     c->Put(pNew, bSkipQuery);
  1547.  
  1548.     TItemCacheSetPtrMap::iterator it = m_map_pkItemCacheSetPtr.find(c->Get()->owner);
  1549.  
  1550.     if (it != m_map_pkItemCacheSetPtr.end())
  1551.     {
  1552.         if (g_log)
  1553.             sys_log(0, "ITEM_CACHE: save %u id %u", c->Get()->owner, c->Get()->id);
  1554.         else
  1555.             sys_log(1, "ITEM_CACHE: save %u id %u", c->Get()->owner, c->Get()->id);
  1556.         it->second->insert(c);
  1557.     }
  1558.     else
  1559.     {  
  1560.         if (g_log)
  1561.             sys_log(0, "ITEM_CACHE: direct save %u id %u", c->Get()->owner, c->Get()->id);
  1562.         else
  1563.             sys_log(1, "ITEM_CACHE: direct save %u id %u", c->Get()->owner, c->Get()->id);
  1564.  
  1565.         c->OnFlush();
  1566.     }
  1567. }
  1568.  
  1569. bool CClientManager::DeleteItemCache(DWORD dwID)
  1570. {
  1571.     CItemCache * c = GetItemCache(dwID);
  1572.  
  1573.     if (!c)
  1574.         return false;
  1575.  
  1576.     c->Delete();
  1577.     return true;
  1578. }
  1579.  
  1580. // MYSHOP_PRICE_LIST
  1581. CItemPriceListTableCache* CClientManager::GetItemPriceListCache(DWORD dwID)
  1582. {
  1583.     TItemPriceListCacheMap::iterator it = m_mapItemPriceListCache.find(dwID);
  1584.  
  1585.     if (it == m_mapItemPriceListCache.end())
  1586.         return NULL;
  1587.  
  1588.     return it->second;
  1589. }
  1590.  
  1591. void CClientManager::PutItemPriceListCache(const TItemPriceListTable* pItemPriceList)
  1592. {
  1593.     CItemPriceListTableCache* pCache = GetItemPriceListCache(pItemPriceList->dwOwnerID);
  1594.  
  1595.     if (!pCache)
  1596.     {
  1597.         pCache = new CItemPriceListTableCache;
  1598.         m_mapItemPriceListCache.insert(TItemPriceListCacheMap::value_type(pItemPriceList->dwOwnerID, pCache));
  1599.     }
  1600.  
  1601.     pCache->Put(const_cast<TItemPriceListTable*>(pItemPriceList), true);
  1602. }
  1603.  
  1604. void CClientManager::UpdatePlayerCache()
  1605. {
  1606.     TPlayerTableCacheMap::iterator it = m_map_playerCache.begin();
  1607.  
  1608.     while (it != m_map_playerCache.end())
  1609.     {
  1610.         CPlayerTableCache * c = (it++)->second;
  1611.  
  1612.         if (c->CheckTimeout())
  1613.         {
  1614.             if (g_log)
  1615.                 sys_log(0, "UPDATE : UpdatePlayerCache() ==> FlushPlayerCache %d %s ", c->Get(false)->id, c->Get(false)->name);
  1616.  
  1617.             c->Flush();
  1618.    
  1619.             UpdateItemCacheSet(c->Get()->id);
  1620.         }
  1621.         else if (c->CheckFlushTimeout())
  1622.             c->Flush();
  1623.     }
  1624. }
  1625. // END_OF_MYSHOP_PRICE_LIST
  1626.  
  1627. void CClientManager::SetCacheFlushCountLimit(int iLimit)
  1628. {
  1629.     m_iCacheFlushCountLimit = MAX(10, iLimit);
  1630.     sys_log(0, "CACHE_FLUSH_LIMIT_PER_SECOND: %d", m_iCacheFlushCountLimit);
  1631. }
  1632.  
  1633. void CClientManager::UpdateItemCache()
  1634. {
  1635.     if (m_iCacheFlushCount >= m_iCacheFlushCountLimit)
  1636.         return;
  1637.  
  1638.     TItemCacheMap::iterator it = m_map_itemCache.begin();
  1639.  
  1640.     while (it != m_map_itemCache.end())
  1641.     {
  1642.         CItemCache * c = (it++)->second;
  1643.  
  1644.         if (c->CheckFlushTimeout())
  1645.         {
  1646.             if (g_test_server)
  1647.                 sys_log(0, "UpdateItemCache ==> Flush() vnum %d id owner %d", c->Get()->vnum, c->Get()->id, c->Get()->owner);
  1648.  
  1649.             c->Flush();
  1650.  
  1651.             if (++m_iCacheFlushCount >= m_iCacheFlushCountLimit)
  1652.                 break;
  1653.         }
  1654.     }
  1655. }
  1656.  
  1657. void CClientManager::UpdateItemPriceListCache()
  1658. {
  1659.     TItemPriceListCacheMap::iterator it = m_mapItemPriceListCache.begin();
  1660.  
  1661.     while (it != m_mapItemPriceListCache.end())
  1662.     {
  1663.         CItemPriceListTableCache* pCache = it->second;
  1664.  
  1665.         if (pCache->CheckFlushTimeout())
  1666.         {
  1667.             pCache->Flush();
  1668.             m_mapItemPriceListCache.erase(it++);
  1669.         }
  1670.         else
  1671.             ++it;
  1672.     }
  1673. }
  1674.  
  1675. void CClientManager::QUERY_ITEM_DESTROY(CPeer * pkPeer, const char * c_pData)
  1676. {
  1677.     DWORD dwID = *(DWORD *) c_pData;
  1678.     c_pData += sizeof(DWORD);
  1679.  
  1680.     DWORD dwPID = *(DWORD *) c_pData;
  1681.  
  1682.     if (!DeleteItemCache(dwID))
  1683.     {
  1684.         char szQuery[64];
  1685.         snprintf(szQuery, sizeof(szQuery), "DELETE FROM item%s WHERE id=%u", GetTablePostfix(), dwID);
  1686.  
  1687.         if (g_log)
  1688.             sys_log(0, "HEADER_GD_ITEM_DESTROY: PID %u ID %u", dwPID, dwID);
  1689.  
  1690.         if (dwPID == 0)
  1691.             CDBManager::instance().AsyncQuery(szQuery);
  1692.         else
  1693.             CDBManager::instance().ReturnQuery(szQuery, QID_ITEM_DESTROY, pkPeer->GetHandle(), NULL);
  1694.     }
  1695. }
  1696.  
  1697. void CClientManager::QUERY_FLUSH_CACHE(CPeer * pkPeer, const char * c_pData)
  1698. {
  1699.     DWORD dwPID = *(DWORD *) c_pData;
  1700.  
  1701.     CPlayerTableCache * pkCache = GetPlayerCache(dwPID);
  1702.  
  1703.     if (!pkCache)
  1704.         return;
  1705.  
  1706.     sys_log(0, "FLUSH_CACHE: %u", dwPID);
  1707.  
  1708.     pkCache->Flush();
  1709.     FlushItemCacheSet(dwPID);
  1710.  
  1711.     m_map_playerCache.erase(dwPID);
  1712.     delete pkCache;
  1713. }
  1714.  
  1715. void CClientManager::QUERY_SMS(CPeer * pkPeer, TPacketGDSMS * pack)
  1716. {
  1717.     char szQuery[QUERY_MAX_LEN];
  1718.  
  1719.     char szMsg[256+1];
  1720.     //unsigned long len = CDBManager::instance().EscapeString(szMsg, pack->szMsg, strlen(pack->szMsg), SQL_ACCOUNT);
  1721.     unsigned long len = CDBManager::instance().EscapeString(szMsg, pack->szMsg, strlen(pack->szMsg));
  1722.     szMsg[len] = '\0';
  1723.  
  1724.     snprintf(szQuery, sizeof(szQuery),
  1725.             "INSERT INTO sms_pool (server, sender, receiver, mobile, msg) VALUES(%d, '%s', '%s', '%s', '%s')",
  1726.             (m_iPlayerIDStart + 2) / 3, pack->szFrom, pack->szTo, pack->szMobile, szMsg);
  1727.  
  1728.     CDBManager::instance().AsyncQuery(szQuery);
  1729. }
  1730.  
  1731. void CClientManager::QUERY_RELOAD_PROTO()
  1732. {
  1733.     if (!InitializeTables())
  1734.     {
  1735.         sys_err("QUERY_RELOAD_PROTO: cannot load tables");
  1736.         return;
  1737.     }
  1738.  
  1739.     for (TPeerList::iterator i = m_peerList.begin(); i != m_peerList.end(); ++i)
  1740.     {
  1741.         CPeer * tmp = *i;
  1742.  
  1743.         if (!tmp->GetChannel())
  1744.             continue;
  1745.  
  1746.         tmp->EncodeHeader(HEADER_DG_RELOAD_PROTO, 0,
  1747.                 sizeof(WORD) + sizeof(TSkillTable) * m_vec_skillTable.size() +
  1748.                 sizeof(WORD) + sizeof(TBanwordTable) * m_vec_banwordTable.size() +
  1749.                 sizeof(WORD) + sizeof(TItemTable) * m_vec_itemTable.size() +
  1750.                 sizeof(WORD) + sizeof(TMobTable) * m_vec_mobTable.size());
  1751.  
  1752.         tmp->EncodeWORD(m_vec_skillTable.size());
  1753.         tmp->Encode(&m_vec_skillTable[0], sizeof(TSkillTable) * m_vec_skillTable.size());
  1754.  
  1755.         tmp->EncodeWORD(m_vec_banwordTable.size());
  1756.         tmp->Encode(&m_vec_banwordTable[0], sizeof(TBanwordTable) * m_vec_banwordTable.size());
  1757.  
  1758.         tmp->EncodeWORD(m_vec_itemTable.size());
  1759.         tmp->Encode(&m_vec_itemTable[0], sizeof(TItemTable) * m_vec_itemTable.size());
  1760.  
  1761.         tmp->EncodeWORD(m_vec_mobTable.size());
  1762.         tmp->Encode(&m_vec_mobTable[0], sizeof(TMobTable) * m_vec_mobTable.size());
  1763.     }
  1764. }
  1765.  
  1766. // ADD_GUILD_PRIV_TIME
  1767. /**
  1768.  * @version 05/06/08 Bang2ni - Áö¼Ó½Ã°£ Ãß°¡
  1769.  */
  1770. void CClientManager::AddGuildPriv(TPacketGiveGuildPriv* p)
  1771. {
  1772.     CPrivManager::instance().AddGuildPriv(p->guild_id, p->type, p->value, p->duration_sec);
  1773. #ifdef ENABLE_DEFAULT_PRIV
  1774.     __UpdateDefaultPriv("GUILD", p->guild_id, p->type, p->value, p->duration_sec);
  1775. #endif
  1776. }
  1777.  
  1778. void CClientManager::AddEmpirePriv(TPacketGiveEmpirePriv* p)
  1779. {
  1780.     CPrivManager::instance().AddEmpirePriv(p->empire, p->type, p->value, p->duration_sec);
  1781. #ifdef ENABLE_DEFAULT_PRIV
  1782.     __UpdateDefaultPriv("EMPIRE", p->empire, p->type, p->value, p->duration_sec);
  1783. #endif
  1784. }
  1785. // END_OF_ADD_GUILD_PRIV_TIME
  1786.  
  1787. void CClientManager::AddCharacterPriv(TPacketGiveCharacterPriv* p)
  1788. {
  1789.     CPrivManager::instance().AddCharPriv(p->pid, p->type, p->value);
  1790. #ifdef ENABLE_DEFAULT_PRIV
  1791.     __UpdateDefaultPriv("PLAYER", p->pid, p->type, p->value, 0);
  1792. #endif
  1793. }
  1794.  
  1795. void CClientManager::MoneyLog(TPacketMoneyLog* p)
  1796. {
  1797.     CMoneyLog::instance().AddLog(p->type, p->vnum, p->gold);
  1798. }
  1799.  
  1800. CLoginData * CClientManager::GetLoginData(DWORD dwKey)
  1801. {
  1802.     TLoginDataByLoginKey::iterator it = m_map_pkLoginData.find(dwKey);
  1803.  
  1804.     if (it == m_map_pkLoginData.end())
  1805.         return NULL;
  1806.  
  1807.     return it->second;
  1808. }
  1809.  
  1810. CLoginData * CClientManager::GetLoginDataByLogin(const char * c_pszLogin)
  1811. {
  1812.     char szLogin[LOGIN_MAX_LEN + 1];
  1813.     trim_and_lower(c_pszLogin, szLogin, sizeof(szLogin));
  1814.  
  1815.     TLoginDataByLogin::iterator it = m_map_pkLoginDataByLogin.find(szLogin);
  1816.  
  1817.     if (it == m_map_pkLoginDataByLogin.end())
  1818.         return NULL;
  1819.  
  1820.     return it->second;
  1821. }
  1822.  
  1823. CLoginData * CClientManager::GetLoginDataByAID(DWORD dwAID)
  1824. {
  1825.     TLoginDataByAID::iterator it = m_map_pkLoginDataByAID.find(dwAID);
  1826.  
  1827.     if (it == m_map_pkLoginDataByAID.end())
  1828.         return NULL;
  1829.  
  1830.     return it->second;
  1831. }
  1832.  
  1833. void CClientManager::InsertLoginData(CLoginData * pkLD)
  1834. {
  1835.     char szLogin[LOGIN_MAX_LEN + 1];
  1836.     trim_and_lower(pkLD->GetAccountRef().login, szLogin, sizeof(szLogin));
  1837.  
  1838.     m_map_pkLoginData.insert(std::make_pair(pkLD->GetKey(), pkLD));
  1839.     m_map_pkLoginDataByLogin.insert(std::make_pair(szLogin, pkLD));
  1840.     m_map_pkLoginDataByAID.insert(std::make_pair(pkLD->GetAccountRef().id, pkLD));
  1841. }
  1842.  
  1843. void CClientManager::DeleteLoginData(CLoginData * pkLD)
  1844. {
  1845.     m_map_pkLoginData.erase(pkLD->GetKey());
  1846.     m_map_pkLoginDataByLogin.erase(pkLD->GetAccountRef().login);
  1847.     m_map_pkLoginDataByAID.erase(pkLD->GetAccountRef().id);
  1848.  
  1849.     if (m_map_kLogonAccount.find(pkLD->GetAccountRef().login) == m_map_kLogonAccount.end())
  1850.         delete pkLD;
  1851.     else
  1852.         pkLD->SetDeleted(true);
  1853. }
  1854.  
  1855. void CClientManager::QUERY_AUTH_LOGIN(CPeer * pkPeer, DWORD dwHandle, TPacketGDAuthLogin * p)
  1856. {
  1857.     if (g_test_server)
  1858.         sys_log(0, "QUERY_AUTH_LOGIN %d %d %s", p->dwID, p->dwLoginKey, p->szLogin);
  1859.     CLoginData * pkLD = GetLoginDataByLogin(p->szLogin);
  1860.  
  1861.     if (pkLD)
  1862.     {
  1863.         DeleteLoginData(pkLD);
  1864.     }
  1865.  
  1866.     BYTE bResult;
  1867.  
  1868.     if (GetLoginData(p->dwLoginKey))
  1869.     {
  1870.         sys_err("LoginData already exist key %u login %s", p->dwLoginKey, p->szLogin);
  1871.         bResult = 0;
  1872.  
  1873.         pkPeer->EncodeHeader(HEADER_DG_AUTH_LOGIN, dwHandle, sizeof(BYTE));
  1874.         pkPeer->EncodeBYTE(bResult);
  1875.     }
  1876.     else
  1877.     {
  1878.         CLoginData * pkLD = new CLoginData;
  1879.  
  1880.         pkLD->SetKey(p->dwLoginKey);
  1881.         pkLD->SetClientKey(p->adwClientKey);
  1882.         pkLD->SetBillType(p->bBillType);
  1883.         pkLD->SetBillID(p->dwBillID);
  1884.         pkLD->SetPremium(p->iPremiumTimes);
  1885.  
  1886.         TAccountTable & r = pkLD->GetAccountRef();
  1887.  
  1888.         r.id = p->dwID;
  1889.         trim_and_lower(p->szLogin, r.login, sizeof(r.login));
  1890.         strlcpy(r.social_id, p->szSocialID, sizeof(r.social_id));
  1891.         strlcpy(r.passwd, "TEMP", sizeof(r.passwd));
  1892.  
  1893.         sys_log(0, "AUTH_LOGIN id(%u) login(%s) social_id(%s) login_key(%u), client_key(%u %u %u %u)",
  1894.                 p->dwID, p->szLogin, p->szSocialID, p->dwLoginKey,
  1895.                 p->adwClientKey[0], p->adwClientKey[1], p->adwClientKey[2], p->adwClientKey[3]);
  1896.  
  1897.         bResult = 1;
  1898.  
  1899.         InsertLoginData(pkLD);
  1900.  
  1901.         pkPeer->EncodeHeader(HEADER_DG_AUTH_LOGIN, dwHandle, sizeof(BYTE));
  1902.         pkPeer->EncodeBYTE(bResult);
  1903.     }
  1904. }
  1905.  
  1906. void CClientManager::BillingExpire(TPacketBillingExpire * p)
  1907. {
  1908.     char key[LOGIN_MAX_LEN + 1];
  1909.     trim_and_lower(p->szLogin, key, sizeof(key));
  1910.  
  1911.     switch (p->bBillType)
  1912.     {
  1913.         case BILLING_IP_TIME:
  1914.         case BILLING_IP_DAY:
  1915.             {
  1916.                 DWORD dwIPID = 0;
  1917.                 str_to_number(dwIPID, p->szLogin);
  1918.  
  1919.                 TLogonAccountMap::iterator it = m_map_kLogonAccount.begin();
  1920.  
  1921.                 while (it != m_map_kLogonAccount.end())
  1922.                 {
  1923.                     CLoginData * pkLD = (it++)->second;
  1924.  
  1925.                     if (pkLD->GetBillID() == dwIPID)
  1926.                     {
  1927.                         CPeer * pkPeer = GetPeer(pkLD->GetConnectedPeerHandle());
  1928.  
  1929.                         if (pkPeer)
  1930.                         {
  1931.                             strlcpy(p->szLogin, pkLD->GetAccountRef().login, sizeof(p->szLogin));
  1932.                             pkPeer->EncodeHeader(HEADER_DG_BILLING_EXPIRE, 0, sizeof(TPacketBillingExpire));
  1933.                             pkPeer->Encode(p, sizeof(TPacketBillingExpire));
  1934.                         }
  1935.                     }
  1936.                 }
  1937.             }
  1938.             break;
  1939.  
  1940.         case BILLING_TIME:
  1941.         case BILLING_DAY:
  1942.             {
  1943.                 TLogonAccountMap::iterator it = m_map_kLogonAccount.find(key);
  1944.  
  1945.                 if (it != m_map_kLogonAccount.end())
  1946.                 {
  1947.                     CLoginData * pkLD = it->second;
  1948.  
  1949.                     CPeer * pkPeer = GetPeer(pkLD->GetConnectedPeerHandle());
  1950.  
  1951.                     if (pkPeer)
  1952.                     {
  1953.                         pkPeer->EncodeHeader(HEADER_DG_BILLING_EXPIRE, 0, sizeof(TPacketBillingExpire));
  1954.                         pkPeer->Encode(p, sizeof(TPacketBillingExpire));
  1955.                     }
  1956.                 }
  1957.             }
  1958.             break;
  1959.     }
  1960. }
  1961.  
  1962. void CClientManager::BillingCheck(const char * data)
  1963. {
  1964.     if (!m_pkAuthPeer)
  1965.         return;
  1966.  
  1967.     time_t curTime = GetCurrentTime();
  1968.  
  1969.     DWORD dwCount = *(DWORD *) data;
  1970.     data += sizeof(DWORD);
  1971.  
  1972.     std::vector<DWORD> vec;
  1973.  
  1974.     sys_log(0, "BillingCheck: size %u", dwCount);
  1975.  
  1976.     for (DWORD i = 0; i < dwCount; ++i)
  1977.     {
  1978.         DWORD dwKey = *(DWORD *) data;
  1979.         data += sizeof(DWORD);
  1980.  
  1981.         sys_log(0, "BillingCheck: %u", dwKey);
  1982.  
  1983.         TLoginDataByLoginKey::iterator it = m_map_pkLoginData.find(dwKey);
  1984.  
  1985.         if (it == m_map_pkLoginData.end())
  1986.         {
  1987.             sys_log(0, "BillingCheck: key not exist: %u", dwKey);
  1988.             vec.push_back(dwKey);
  1989.         }
  1990.         else
  1991.         {
  1992.             CLoginData * pkLD = it->second;
  1993.  
  1994.             if (!pkLD->IsPlay() && curTime - pkLD->GetLastPlayTime() > 180)
  1995.             {
  1996.                 sys_log(0, "BillingCheck: not login: %u", dwKey);
  1997.                 vec.push_back(dwKey);
  1998.             }
  1999.         }
  2000.     }
  2001.  
  2002.     m_pkAuthPeer->EncodeHeader(HEADER_DG_BILLING_CHECK, 0, sizeof(DWORD) + sizeof(DWORD) * vec.size());
  2003.     m_pkAuthPeer->EncodeDWORD(vec.size());
  2004.  
  2005.     if (!vec.empty())
  2006.         m_pkAuthPeer->Encode(&vec[0], sizeof(DWORD) * vec.size());
  2007. }
  2008.  
  2009. void CClientManager::GuildDepositMoney(TPacketGDGuildMoney* p)
  2010. {
  2011.     CGuildManager::instance().DepositMoney(p->dwGuild, p->iGold);
  2012. }
  2013.  
  2014. void CClientManager::GuildWithdrawMoney(CPeer* peer, TPacketGDGuildMoney* p)
  2015. {
  2016.     CGuildManager::instance().WithdrawMoney(peer, p->dwGuild, p->iGold);
  2017. }
  2018.  
  2019. void CClientManager::GuildWithdrawMoneyGiveReply(TPacketGDGuildMoneyWithdrawGiveReply* p)
  2020. {
  2021.     CGuildManager::instance().WithdrawMoneyReply(p->dwGuild, p->bGiveSuccess, p->iChangeGold);
  2022. }
  2023.  
  2024. void CClientManager::GuildWarBet(TPacketGDGuildWarBet * p)
  2025. {
  2026.     CGuildManager::instance().Bet(p->dwWarID, p->szLogin, p->dwGold, p->dwGuild);
  2027. }
  2028.  
  2029. void CClientManager::SendAllLoginToBilling()
  2030. {
  2031.     if (!m_pkAuthPeer)
  2032.         return;
  2033.  
  2034.     std::vector<TPacketBillingRepair> vec;
  2035.     TPacketBillingRepair p;
  2036.  
  2037.     TLogonAccountMap::iterator it = m_map_kLogonAccount.begin();
  2038.  
  2039.     while (it != m_map_kLogonAccount.end())
  2040.     {
  2041.         CLoginData * pkLD = (it++)->second;
  2042.  
  2043.         p.dwLoginKey = pkLD->GetKey();
  2044.         strlcpy(p.szLogin, pkLD->GetAccountRef().login, sizeof(p.szLogin));
  2045.         strlcpy(p.szHost, pkLD->GetIP(), sizeof(p.szHost));
  2046.         sys_log(0, "SendAllLoginToBilling %s %s", pkLD->GetAccountRef().login, pkLD->GetIP());
  2047.         vec.push_back(p);
  2048.     }
  2049.  
  2050.     if (!vec.empty())
  2051.     {
  2052.         m_pkAuthPeer->EncodeHeader(HEADER_DG_BILLING_REPAIR, 0, sizeof(DWORD) + sizeof(TPacketBillingRepair) * vec.size());
  2053.         m_pkAuthPeer->EncodeDWORD(vec.size());
  2054.         m_pkAuthPeer->Encode(&vec[0], sizeof(TPacketBillingRepair) * vec.size());
  2055.     }
  2056. }
  2057.  
  2058. void CClientManager::SendLoginToBilling(CLoginData * pkLD, bool bLogin)
  2059. {
  2060.     if (!m_pkAuthPeer)
  2061.         return;
  2062.  
  2063.     TPacketBillingLogin p;
  2064.  
  2065.     p.dwLoginKey = pkLD->GetKey();
  2066.     p.bLogin = bLogin ? 1 : 0;
  2067.  
  2068.     DWORD dwCount = 1;
  2069.     m_pkAuthPeer->EncodeHeader(HEADER_DG_BILLING_LOGIN, 0, sizeof(DWORD) + sizeof(TPacketBillingLogin));
  2070.     m_pkAuthPeer->EncodeDWORD(dwCount);
  2071.     m_pkAuthPeer->Encode(&p, sizeof(TPacketBillingLogin));
  2072. }
  2073.  
  2074. void CClientManager::CreateObject(TPacketGDCreateObject * p)
  2075. {
  2076.     using namespace building;
  2077.  
  2078.     char szQuery[512];
  2079.  
  2080.     snprintf(szQuery, sizeof(szQuery),
  2081.             "INSERT INTO object%s (land_id, vnum, map_index, x, y, x_rot, y_rot, z_rot) VALUES(%u, %u, %d, %d, %d, %f, %f, %f)",
  2082.             GetTablePostfix(), p->dwLandID, p->dwVnum, p->lMapIndex, p->x, p->y, p->xRot, p->yRot, p->zRot);
  2083.  
  2084.     std::auto_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
  2085.  
  2086.     if (pmsg->Get()->uiInsertID == 0)
  2087.     {
  2088.         sys_err("cannot insert object");
  2089.         return;
  2090.     }
  2091.  
  2092.     TObject * pkObj = new TObject;
  2093.  
  2094.     memset(pkObj, 0, sizeof(TObject));
  2095.  
  2096.     pkObj->dwID = pmsg->Get()->uiInsertID;
  2097.     pkObj->dwVnum = p->dwVnum;
  2098.     pkObj->dwLandID = p->dwLandID;
  2099.     pkObj->lMapIndex = p->lMapIndex;
  2100.     pkObj->x = p->x;
  2101.     pkObj->y = p->y;
  2102.     pkObj->xRot = p->xRot;
  2103.     pkObj->yRot = p->yRot;
  2104.     pkObj->zRot = p->zRot;
  2105.     pkObj->lLife = 0;
  2106.  
  2107.     ForwardPacket(HEADER_DG_CREATE_OBJECT, pkObj, sizeof(TObject));
  2108.  
  2109.     m_map_pkObjectTable.insert(std::make_pair(pkObj->dwID, pkObj));
  2110. }
  2111.  
  2112. void CClientManager::DeleteObject(DWORD dwID)
  2113. {
  2114.     char szQuery[128];
  2115.  
  2116.     snprintf(szQuery, sizeof(szQuery), "DELETE FROM object%s WHERE id=%u", GetTablePostfix(), dwID);
  2117.  
  2118.     std::auto_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
  2119.  
  2120.     if (pmsg->Get()->uiAffectedRows == 0 || pmsg->Get()->uiAffectedRows == (uint32_t)-1)
  2121.     {
  2122.         sys_err("no object by id %u", dwID);
  2123.         return;
  2124.     }
  2125.  
  2126.     itertype(m_map_pkObjectTable) it = m_map_pkObjectTable.find(dwID);
  2127.  
  2128.     if (it != m_map_pkObjectTable.end())
  2129.     {
  2130.         delete it->second;
  2131.         m_map_pkObjectTable.erase(it);
  2132.     }
  2133.  
  2134.     ForwardPacket(HEADER_DG_DELETE_OBJECT, &dwID, sizeof(DWORD));
  2135. }
  2136.  
  2137. void CClientManager::UpdateLand(DWORD * pdw)
  2138. {
  2139.     DWORD dwID = pdw[0];
  2140.     DWORD dwGuild = pdw[1];
  2141.  
  2142.     building::TLand * p = &m_vec_kLandTable[0];
  2143.  
  2144.     DWORD i;
  2145.  
  2146.     for (i = 0; i < m_vec_kLandTable.size(); ++i, ++p)
  2147.     {
  2148.         if (p->dwID == dwID)
  2149.         {
  2150.             char buf[256];
  2151.             snprintf(buf, sizeof(buf), "UPDATE land%s SET guild_id=%u WHERE id=%u", GetTablePostfix(), dwGuild, dwID);
  2152.             CDBManager::instance().AsyncQuery(buf);
  2153.  
  2154.             p->dwGuildID = dwGuild;
  2155.             break;
  2156.         }
  2157.     }
  2158.  
  2159.     if (i < m_vec_kLandTable.size())
  2160.         ForwardPacket(HEADER_DG_UPDATE_LAND, p, sizeof(building::TLand));
  2161. }
  2162.  
  2163. void CClientManager::VCard(TPacketGDVCard * p)
  2164. {
  2165.     sys_log(0, "VCARD: %u %s %s %s %s",
  2166.             p->dwID, p->szSellCharacter, p->szSellAccount, p->szBuyCharacter, p->szBuyAccount);
  2167.  
  2168.     m_queue_vcard.push(*p);
  2169. }
  2170.  
  2171. void CClientManager::VCardProcess()
  2172. {
  2173.     if (!m_pkAuthPeer)
  2174.         return;
  2175.  
  2176.     while (!m_queue_vcard.empty())
  2177.     {
  2178.         m_pkAuthPeer->EncodeHeader(HEADER_DG_VCARD, 0, sizeof(TPacketGDVCard));
  2179.         m_pkAuthPeer->Encode(&m_queue_vcard.front(), sizeof(TPacketGDVCard));
  2180.  
  2181.         m_queue_vcard.pop();
  2182.     }
  2183. }
  2184.  
  2185. // BLOCK_CHAT
  2186. void CClientManager::BlockChat(TPacketBlockChat* p)
  2187. {
  2188.     char szQuery[256];
  2189.  
  2190.     if (g_stLocale == "sjis")
  2191.         snprintf(szQuery, sizeof(szQuery), "SELECT id FROM player%s WHERE name = '%s' collate sjis_japanese_ci", GetTablePostfix(), p->szName);
  2192.     else
  2193.         snprintf(szQuery, sizeof(szQuery), "SELECT id FROM player%s WHERE name = '%s'", GetTablePostfix(), p->szName);
  2194.     std::auto_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
  2195.     SQLResult * pRes = pmsg->Get();
  2196.  
  2197.     if (pRes->uiNumRows)
  2198.     {
  2199.         MYSQL_ROW row = mysql_fetch_row(pRes->pSQLResult);
  2200.         DWORD pid = strtoul(row[0], NULL, 10);
  2201.  
  2202.         TPacketGDAddAffect pa;
  2203.         pa.dwPID = pid;
  2204.         pa.elem.dwType = 223;
  2205.         pa.elem.bApplyOn = 0;
  2206.         pa.elem.lApplyValue = 0;
  2207.         pa.elem.dwFlag = 0;
  2208.         pa.elem.lDuration = p->lDuration;
  2209.         pa.elem.lSPCost = 0;
  2210.         QUERY_ADD_AFFECT(NULL, &pa);
  2211.     }
  2212.     else
  2213.     {
  2214.         // cannot find user with that name
  2215.     }
  2216. }
  2217. // END_OF_BLOCK_CHAT
  2218.  
  2219. void CClientManager::MarriageAdd(TPacketMarriageAdd * p)
  2220. {
  2221.     sys_log(0, "MarriageAdd %u %u %s %s", p->dwPID1, p->dwPID2, p->szName1, p->szName2);
  2222.     marriage::CManager::instance().Add(p->dwPID1, p->dwPID2, p->szName1, p->szName2);
  2223. }
  2224.  
  2225. void CClientManager::MarriageUpdate(TPacketMarriageUpdate * p)
  2226. {
  2227.     sys_log(0, "MarriageUpdate PID:%u %u LP:%d ST:%d", p->dwPID1, p->dwPID2, p->iLovePoint, p->byMarried);
  2228.     marriage::CManager::instance().Update(p->dwPID1, p->dwPID2, p->iLovePoint, p->byMarried);
  2229. }
  2230.  
  2231. void CClientManager::MarriageRemove(TPacketMarriageRemove * p)
  2232. {
  2233.     sys_log(0, "MarriageRemove %u %u", p->dwPID1, p->dwPID2);
  2234.     marriage::CManager::instance().Remove(p->dwPID1, p->dwPID2);
  2235. }
  2236.  
  2237. void CClientManager::WeddingRequest(TPacketWeddingRequest * p)
  2238. {
  2239.     sys_log(0, "WeddingRequest %u %u", p->dwPID1, p->dwPID2);
  2240.     ForwardPacket(HEADER_DG_WEDDING_REQUEST, p, sizeof(TPacketWeddingRequest));
  2241.     //marriage::CManager::instance().RegisterWedding(p->dwPID1, p->szName1, p->dwPID2, p->szName2);
  2242. }
  2243.  
  2244. void CClientManager::WeddingReady(TPacketWeddingReady * p)
  2245. {
  2246.     sys_log(0, "WeddingReady %u %u", p->dwPID1, p->dwPID2);
  2247.     ForwardPacket(HEADER_DG_WEDDING_READY, p, sizeof(TPacketWeddingReady));
  2248.     marriage::CManager::instance().ReadyWedding(p->dwMapIndex, p->dwPID1, p->dwPID2);
  2249. }
  2250.  
  2251. void CClientManager::WeddingEnd(TPacketWeddingEnd * p)
  2252. {
  2253.     sys_log(0, "WeddingEnd %u %u", p->dwPID1, p->dwPID2);
  2254.     marriage::CManager::instance().EndWedding(p->dwPID1, p->dwPID2);
  2255. }
  2256.  
  2257. //
  2258.  
  2259.  
  2260. //
  2261. void CClientManager::MyshopPricelistUpdate(const TItemPriceListTable* pPacket) // @fixme403 (TPacketMyshopPricelistHeader to TItemPriceListTable)
  2262. {
  2263.     if (pPacket->byCount > SHOP_PRICELIST_MAX_NUM)
  2264.     {
  2265.         sys_err("count overflow!");
  2266.         return;
  2267.     }
  2268.  
  2269.     CItemPriceListTableCache* pCache = GetItemPriceListCache(pPacket->dwOwnerID);
  2270.  
  2271.     if (pCache)
  2272.     {
  2273.         TItemPriceListTable table;
  2274.  
  2275.         table.dwOwnerID = pPacket->dwOwnerID;
  2276.         table.byCount = pPacket->byCount;
  2277.  
  2278.         thecore_memcpy(table.aPriceInfo, pPacket->aPriceInfo, sizeof(TItemPriceInfo) * pPacket->byCount);
  2279.  
  2280.         pCache->UpdateList(&table);
  2281.     }
  2282.     else
  2283.     {
  2284.         TItemPriceListTable* pUpdateTable = new TItemPriceListTable;
  2285.  
  2286.         pUpdateTable->dwOwnerID = pPacket->dwOwnerID;
  2287.         pUpdateTable->byCount = pPacket->byCount;
  2288.  
  2289.         thecore_memcpy(pUpdateTable->aPriceInfo, pPacket->aPriceInfo, sizeof(TItemPriceInfo) * pPacket->byCount);
  2290.  
  2291.         char szQuery[QUERY_MAX_LEN];
  2292.         snprintf(szQuery, sizeof(szQuery), "SELECT item_vnum, price FROM myshop_pricelist%s WHERE owner_id=%u", GetTablePostfix(), pPacket->dwOwnerID);
  2293.         CDBManager::instance().ReturnQuery(szQuery, QID_ITEMPRICE_LOAD_FOR_UPDATE, 0, pUpdateTable);
  2294.     }
  2295. }
  2296.  
  2297. // MYSHOP_PRICE_LIST
  2298.  
  2299. //
  2300. void CClientManager::MyshopPricelistRequest(CPeer* peer, DWORD dwHandle, DWORD dwPlayerID)
  2301. {
  2302.     if (CItemPriceListTableCache* pCache = GetItemPriceListCache(dwPlayerID))
  2303.     {
  2304.         sys_log(0, "Cache MyShopPricelist handle[%d] pid[%d]", dwHandle, dwPlayerID);
  2305.  
  2306.         TItemPriceListTable* pTable = pCache->Get(false);
  2307.  
  2308.         TPacketMyshopPricelistHeader header =
  2309.         {
  2310.             pTable->dwOwnerID,
  2311.             pTable->byCount
  2312.         };
  2313.  
  2314.         size_t sizePriceListSize = sizeof(TItemPriceInfo) * pTable->byCount;
  2315.  
  2316.         peer->EncodeHeader(HEADER_DG_MYSHOP_PRICELIST_RES, dwHandle, sizeof(header) + sizePriceListSize);
  2317.         peer->Encode(&header, sizeof(header));
  2318.         peer->Encode(pTable->aPriceInfo, sizePriceListSize);
  2319.  
  2320.     }
  2321.     else
  2322.     {
  2323.         sys_log(0, "Query MyShopPricelist handle[%d] pid[%d]", dwHandle, dwPlayerID);
  2324.  
  2325.         char szQuery[QUERY_MAX_LEN];
  2326.         snprintf(szQuery, sizeof(szQuery), "SELECT item_vnum, price FROM myshop_pricelist%s WHERE owner_id=%u", GetTablePostfix(), dwPlayerID);
  2327.         CDBManager::instance().ReturnQuery(szQuery, QID_ITEMPRICE_LOAD, peer->GetHandle(), new TItemPricelistReqInfo(dwHandle, dwPlayerID));
  2328.     }
  2329. }
  2330. // END_OF_MYSHOP_PRICE_LIST
  2331.  
  2332. void CPacketInfo::Add(int header)
  2333. {
  2334.     itertype(m_map_info) it = m_map_info.find(header);
  2335.  
  2336.     if (it == m_map_info.end())
  2337.         m_map_info.insert(std::map<int, int>::value_type(header, 1));
  2338.     else
  2339.         ++it->second;
  2340. }
  2341.  
  2342. void CPacketInfo::Reset()
  2343. {
  2344.     m_map_info.clear();
  2345. }
  2346.  
  2347. void CClientManager::ProcessPackets(CPeer * peer)
  2348. {
  2349.     BYTE        header;
  2350.     DWORD       dwHandle;
  2351.     DWORD       dwLength;
  2352.     const char * data = NULL;
  2353.     int         i = 0;
  2354.     int         iCount = 0;
  2355.  
  2356.     while (peer->PeekPacket(i, header, dwHandle, dwLength, &data))
  2357.     {
  2358.         // DISABLE_DB_HEADER_LOG
  2359.         // sys_log(0, "header %d %p size %d", header, this, dwLength);
  2360.         // END_OF_DISABLE_DB_HEADER_LOG
  2361.         m_bLastHeader = header;
  2362.         ++iCount;
  2363.  
  2364. #ifdef _TEST
  2365.         if (header != 10)
  2366.             sys_log(0, " ProcessPacket Header [%d] Handle[%d] Length[%d] iCount[%d]", header, dwHandle, dwLength, iCount);
  2367. #endif
  2368.         if (g_test_server)
  2369.         {
  2370.             if (header != 10)
  2371.                 sys_log(0, " ProcessPacket Header [%d] Handle[%d] Length[%d] iCount[%d]", header, dwHandle, dwLength, iCount);
  2372.         }
  2373.  
  2374.  
  2375.         // test log by mhh
  2376.         {
  2377.             if (HEADER_GD_BLOCK_COUNTRY_IP == header)
  2378.                 sys_log(0, "recved : HEADER_GD_BLOCK_COUNTRY_IP");
  2379.         }
  2380.  
  2381.         switch (header)
  2382.         {
  2383.             case HEADER_GD_BOOT:
  2384.                 QUERY_BOOT(peer, (TPacketGDBoot *) data);
  2385.                 break;
  2386.  
  2387.             case HEADER_GD_HAMMER_OF_TOR:
  2388.                 break;
  2389.  
  2390.             case HEADER_GD_LOGIN_BY_KEY:
  2391.                 QUERY_LOGIN_BY_KEY(peer, dwHandle, (TPacketGDLoginByKey *) data);
  2392.                 break;
  2393.  
  2394.             case HEADER_GD_LOGOUT:
  2395.                 //sys_log(0, "HEADER_GD_LOGOUT (handle: %d length: %d)", dwHandle, dwLength);
  2396.                 QUERY_LOGOUT(peer, dwHandle, data);
  2397.                 break;
  2398.  
  2399.             case HEADER_GD_PLAYER_LOAD:
  2400.                 sys_log(1, "HEADER_GD_PLAYER_LOAD (handle: %d length: %d)", dwHandle, dwLength);
  2401.                 QUERY_PLAYER_LOAD(peer, dwHandle, (TPlayerLoadPacket *) data);
  2402.                 break;
  2403.  
  2404.             case HEADER_GD_PLAYER_SAVE:
  2405.                 sys_log(1, "HEADER_GD_PLAYER_SAVE (handle: %d length: %d)", dwHandle, dwLength);
  2406.                 QUERY_PLAYER_SAVE(peer, dwHandle, (TPlayerTable *) data);
  2407.                 break;
  2408.  
  2409.             case HEADER_GD_PLAYER_CREATE:
  2410.                 sys_log(0, "HEADER_GD_PLAYER_CREATE (handle: %d length: %d)", dwHandle, dwLength);
  2411.                 __QUERY_PLAYER_CREATE(peer, dwHandle, (TPlayerCreatePacket *) data);
  2412.                 sys_log(0, "END");
  2413.                 break;
  2414.  
  2415.             case HEADER_GD_PLAYER_DELETE:
  2416.                 sys_log(1, "HEADER_GD_PLAYER_DELETE (handle: %d length: %d)", dwHandle, dwLength);
  2417.                 __QUERY_PLAYER_DELETE(peer, dwHandle, (TPlayerDeletePacket *) data);
  2418.                 break;
  2419.  
  2420.             case HEADER_GD_PLAYER_COUNT:
  2421.                 QUERY_PLAYER_COUNT(peer, (TPlayerCountPacket *) data);
  2422.                 break;
  2423.  
  2424.             case HEADER_GD_QUEST_SAVE:
  2425.                 sys_log(1, "HEADER_GD_QUEST_SAVE (handle: %d length: %d)", dwHandle, dwLength);
  2426.                 QUERY_QUEST_SAVE(peer, (TQuestTable *) data, dwLength);
  2427.                 break;
  2428.  
  2429.             case HEADER_GD_SAFEBOX_LOAD:
  2430.                 QUERY_SAFEBOX_LOAD(peer, dwHandle, (TSafeboxLoadPacket *) data, 0);
  2431.                 break;
  2432.  
  2433.             case HEADER_GD_SAFEBOX_SAVE:
  2434.                 sys_log(1, "HEADER_GD_SAFEBOX_SAVE (handle: %d length: %d)", dwHandle, dwLength);
  2435.                 QUERY_SAFEBOX_SAVE(peer, (TSafeboxTable *) data);
  2436.                 break;
  2437.  
  2438.             case HEADER_GD_SAFEBOX_CHANGE_SIZE:
  2439.                 QUERY_SAFEBOX_CHANGE_SIZE(peer, dwHandle, (TSafeboxChangeSizePacket *) data);
  2440.                 break;
  2441.  
  2442.             case HEADER_GD_SAFEBOX_CHANGE_PASSWORD:
  2443.                 QUERY_SAFEBOX_CHANGE_PASSWORD(peer, dwHandle, (TSafeboxChangePasswordPacket *) data);
  2444.                 break;
  2445.  
  2446.             case HEADER_GD_MALL_LOAD:
  2447.                 QUERY_SAFEBOX_LOAD(peer, dwHandle, (TSafeboxLoadPacket *) data, 1);
  2448.                 break;
  2449.  
  2450.             case HEADER_GD_EMPIRE_SELECT:
  2451.                 QUERY_EMPIRE_SELECT(peer, dwHandle, (TEmpireSelectPacket *) data);
  2452.                 break;
  2453.  
  2454.             case HEADER_GD_SETUP:
  2455.                 QUERY_SETUP(peer, dwHandle, data);
  2456.                 break;
  2457.  
  2458.             case HEADER_GD_GUILD_CREATE:
  2459.                 GuildCreate(peer, *(DWORD *) data);
  2460.                 break;
  2461.  
  2462.             case HEADER_GD_GUILD_SKILL_UPDATE:
  2463.                 GuildSkillUpdate(peer, (TPacketGuildSkillUpdate *) data);
  2464.                 break;
  2465.  
  2466.             case HEADER_GD_GUILD_EXP_UPDATE:
  2467.                 GuildExpUpdate(peer, (TPacketGuildExpUpdate *) data);
  2468.                 break;
  2469.  
  2470.             case HEADER_GD_GUILD_ADD_MEMBER:
  2471.                 GuildAddMember(peer, (TPacketGDGuildAddMember*) data);
  2472.                 break;
  2473.  
  2474.             case HEADER_GD_GUILD_REMOVE_MEMBER:
  2475.                 GuildRemoveMember(peer, (TPacketGuild*) data);
  2476.                 break;
  2477.  
  2478.             case HEADER_GD_GUILD_CHANGE_GRADE:
  2479.                 GuildChangeGrade(peer, (TPacketGuild*) data);
  2480.                 break;
  2481.  
  2482.             case HEADER_GD_GUILD_CHANGE_MEMBER_DATA:
  2483.                 GuildChangeMemberData(peer, (TPacketGuildChangeMemberData*) data);
  2484.                 break;
  2485.  
  2486.             case HEADER_GD_GUILD_DISBAND:
  2487.                 GuildDisband(peer, (TPacketGuild*) data);
  2488.                 break;
  2489.  
  2490.             case HEADER_GD_GUILD_WAR:
  2491.                 GuildWar(peer, (TPacketGuildWar*) data);
  2492.                 break;
  2493.  
  2494.             case HEADER_GD_GUILD_WAR_SCORE:
  2495.                 GuildWarScore(peer, (TPacketGuildWarScore*) data);
  2496.                 break;
  2497.  
  2498.             case HEADER_GD_GUILD_CHANGE_LADDER_POINT:
  2499.                 GuildChangeLadderPoint((TPacketGuildLadderPoint*) data);
  2500.                 break;
  2501.  
  2502.             case HEADER_GD_GUILD_USE_SKILL:
  2503.                 GuildUseSkill((TPacketGuildUseSkill*) data);
  2504.                 break;
  2505.  
  2506.             case HEADER_GD_FLUSH_CACHE:
  2507.                 QUERY_FLUSH_CACHE(peer, data);
  2508.                 break;
  2509.  
  2510.             case HEADER_GD_ITEM_SAVE:
  2511.                 QUERY_ITEM_SAVE(peer, data);
  2512.                 break;
  2513.  
  2514.             case HEADER_GD_ITEM_DESTROY:
  2515.                 QUERY_ITEM_DESTROY(peer, data);
  2516.                 break;
  2517.  
  2518.             case HEADER_GD_ITEM_FLUSH:
  2519.                 QUERY_ITEM_FLUSH(peer, data);
  2520.                 break;
  2521.  
  2522.             case HEADER_GD_ADD_AFFECT:
  2523.                 sys_log(1, "HEADER_GD_ADD_AFFECT");
  2524.                 QUERY_ADD_AFFECT(peer, (TPacketGDAddAffect *) data);
  2525.                 break;
  2526.  
  2527.             case HEADER_GD_REMOVE_AFFECT:
  2528.                 sys_log(1, "HEADER_GD_REMOVE_AFFECT");
  2529.                 QUERY_REMOVE_AFFECT(peer, (TPacketGDRemoveAffect *) data);
  2530.                 break;
  2531.  
  2532.             case HEADER_GD_HIGHSCORE_REGISTER:
  2533.                 QUERY_HIGHSCORE_REGISTER(peer, (TPacketGDHighscore *) data);
  2534.                 break;
  2535.  
  2536.             case HEADER_GD_PARTY_CREATE:
  2537.                 QUERY_PARTY_CREATE(peer, (TPacketPartyCreate*) data);
  2538.                 break;
  2539.  
  2540.             case HEADER_GD_PARTY_DELETE:
  2541.                 QUERY_PARTY_DELETE(peer, (TPacketPartyDelete*) data);
  2542.                 break;
  2543.  
  2544.             case HEADER_GD_PARTY_ADD:
  2545.                 QUERY_PARTY_ADD(peer, (TPacketPartyAdd*) data);
  2546.                 break;
  2547.  
  2548.             case HEADER_GD_PARTY_REMOVE:
  2549.                 QUERY_PARTY_REMOVE(peer, (TPacketPartyRemove*) data);
  2550.                 break;
  2551.  
  2552.             case HEADER_GD_PARTY_STATE_CHANGE:
  2553.                 QUERY_PARTY_STATE_CHANGE(peer, (TPacketPartyStateChange*) data);
  2554.                 break;
  2555.  
  2556.             case HEADER_GD_PARTY_SET_MEMBER_LEVEL:
  2557.                 QUERY_PARTY_SET_MEMBER_LEVEL(peer, (TPacketPartySetMemberLevel*) data);
  2558.                 break;
  2559.  
  2560.             case HEADER_GD_RELOAD_PROTO:
  2561.                 QUERY_RELOAD_PROTO();
  2562.                 break;
  2563.  
  2564.             case HEADER_GD_CHANGE_NAME:
  2565.                 QUERY_CHANGE_NAME(peer, dwHandle, (TPacketGDChangeName *) data);
  2566.                 break;
  2567.  
  2568.             case HEADER_GD_SMS:
  2569.                 QUERY_SMS(peer, (TPacketGDSMS *) data);
  2570.                 break;
  2571.  
  2572.             case HEADER_GD_AUTH_LOGIN:
  2573.                 QUERY_AUTH_LOGIN(peer, dwHandle, (TPacketGDAuthLogin *) data);
  2574.                 break;
  2575.  
  2576.             case HEADER_GD_REQUEST_GUILD_PRIV:
  2577.                 AddGuildPriv((TPacketGiveGuildPriv*)data);
  2578.                 break;
  2579.  
  2580.             case HEADER_GD_REQUEST_EMPIRE_PRIV:
  2581.                 AddEmpirePriv((TPacketGiveEmpirePriv*)data);
  2582.                 break;
  2583.  
  2584.             case HEADER_GD_REQUEST_CHARACTER_PRIV:
  2585.                 AddCharacterPriv((TPacketGiveCharacterPriv*) data);
  2586.                 break;
  2587.  
  2588.             case HEADER_GD_MONEY_LOG:
  2589.                 MoneyLog((TPacketMoneyLog*)data);
  2590.                 break;
  2591.  
  2592.             case HEADER_GD_GUILD_DEPOSIT_MONEY:
  2593.                 GuildDepositMoney((TPacketGDGuildMoney*)data);
  2594.                 break;
  2595.  
  2596.             case HEADER_GD_GUILD_WITHDRAW_MONEY:
  2597.                 GuildWithdrawMoney(peer, (TPacketGDGuildMoney*)data);
  2598.                 break;
  2599.  
  2600.             case HEADER_GD_GUILD_WITHDRAW_MONEY_GIVE_REPLY:
  2601.                 GuildWithdrawMoneyGiveReply((TPacketGDGuildMoneyWithdrawGiveReply*)data);
  2602.                 break;
  2603.  
  2604.             case HEADER_GD_GUILD_WAR_BET:
  2605.                 GuildWarBet((TPacketGDGuildWarBet *) data);
  2606.                 break;
  2607.  
  2608.             case HEADER_GD_SET_EVENT_FLAG:
  2609.                 SetEventFlag((TPacketSetEventFlag*) data);
  2610.                 break;
  2611.  
  2612.             case HEADER_GD_BILLING_EXPIRE:
  2613.                 BillingExpire((TPacketBillingExpire *) data);
  2614.                 break;
  2615.  
  2616.             case HEADER_GD_BILLING_CHECK:
  2617.                 BillingCheck(data);
  2618.                 break;
  2619.  
  2620.             case HEADER_GD_CREATE_OBJECT:
  2621.                 CreateObject((TPacketGDCreateObject *) data);
  2622.                 break;
  2623.  
  2624.             case HEADER_GD_DELETE_OBJECT:
  2625.                 DeleteObject(*(DWORD *) data);
  2626.                 break;
  2627.  
  2628.             case HEADER_GD_UPDATE_LAND:
  2629.                 UpdateLand((DWORD *) data);
  2630.                 break;
  2631.  
  2632.             case HEADER_GD_VCARD:
  2633.                 VCard((TPacketGDVCard *) data);
  2634.                 break;
  2635.  
  2636.             case HEADER_GD_MARRIAGE_ADD:
  2637.                 MarriageAdd((TPacketMarriageAdd *) data);
  2638.                 break;
  2639.  
  2640.             case HEADER_GD_MARRIAGE_UPDATE:
  2641.                 MarriageUpdate((TPacketMarriageUpdate *) data);
  2642.                 break;
  2643.  
  2644.             case HEADER_GD_MARRIAGE_REMOVE:
  2645.                 MarriageRemove((TPacketMarriageRemove *) data);
  2646.                 break;
  2647.  
  2648.             case HEADER_GD_WEDDING_REQUEST:
  2649.                 WeddingRequest((TPacketWeddingRequest *) data);
  2650.                 break;
  2651.  
  2652.             case HEADER_GD_WEDDING_READY:
  2653.                 WeddingReady((TPacketWeddingReady *) data);
  2654.                 break;
  2655.  
  2656.             case HEADER_GD_WEDDING_END:
  2657.                 WeddingEnd((TPacketWeddingEnd *) data);
  2658.                 break;
  2659.  
  2660.                 // BLOCK_CHAT
  2661.             case HEADER_GD_BLOCK_CHAT:
  2662.                 BlockChat((TPacketBlockChat *) data);
  2663.                 break;
  2664.                 // END_OF_BLOCK_CHAT
  2665.  
  2666.                 // MYSHOP_PRICE_LIST
  2667.             case HEADER_GD_MYSHOP_PRICELIST_UPDATE:
  2668.                 MyshopPricelistUpdate((TItemPriceListTable*)data); // @fixme403 (TPacketMyshopPricelistHeader to TItemPriceListTable)
  2669.                 break;
  2670.  
  2671.             case HEADER_GD_MYSHOP_PRICELIST_REQ:
  2672.                 MyshopPricelistRequest(peer, dwHandle, *(DWORD*)data);
  2673.                 break;
  2674.                 // END_OF_MYSHOP_PRICE_LIST
  2675.  
  2676.                 //RELOAD_ADMIN
  2677.             case HEADER_GD_RELOAD_ADMIN:
  2678.                 ReloadAdmin(peer, (TPacketReloadAdmin*)data);
  2679.                 break;
  2680.                 //END_RELOAD_ADMIN
  2681.  
  2682.             case HEADER_GD_BREAK_MARRIAGE:
  2683.                 BreakMarriage(peer, data);
  2684.                 break;
  2685.  
  2686.             //MOANRCH
  2687.             case HEADER_GD_ELECT_MONARCH:
  2688.                 Election(peer, dwHandle, data);
  2689.                 break;
  2690.  
  2691.             case HEADER_GD_CANDIDACY:
  2692.                 Candidacy(peer, dwHandle, data);
  2693.                 break;
  2694.  
  2695.             case HEADER_GD_ADD_MONARCH_MONEY:
  2696.                 AddMonarchMoney(peer, dwHandle, data);
  2697.                 break;
  2698.  
  2699.             case HEADER_GD_DEC_MONARCH_MONEY:
  2700.                 DecMonarchMoney(peer, dwHandle, data);
  2701.                 break;
  2702.  
  2703.             case HEADER_GD_TAKE_MONARCH_MONEY:
  2704.                 TakeMonarchMoney(peer, dwHandle, data);
  2705.                 break;
  2706.  
  2707.             case HEADER_GD_COME_TO_VOTE:
  2708.                 ComeToVote(peer, dwHandle, data);
  2709.                 break;
  2710.  
  2711.             case HEADER_GD_RMCANDIDACY:    
  2712.                 RMCandidacy(peer, dwHandle, data);
  2713.                 break;
  2714.  
  2715.             case HEADER_GD_SETMONARCH:     
  2716.                 SetMonarch(peer, dwHandle, data);
  2717.                 break;
  2718.  
  2719.             case HEADER_GD_RMMONARCH:      
  2720.                 RMMonarch(peer, dwHandle, data);
  2721.                 break;
  2722.             //END_MONARCH
  2723.  
  2724.             case HEADER_GD_CHANGE_MONARCH_LORD :
  2725.                 ChangeMonarchLord(peer, dwHandle, (TPacketChangeMonarchLord*)data);
  2726.                 break;
  2727.  
  2728.             case HEADER_GD_BLOCK_COUNTRY_IP:
  2729.                 sys_log(0, "HEADER_GD_BLOCK_COUNTRY_IP received");
  2730.                 CBlockCountry::instance().SendBlockedCountryIp(peer);
  2731.                 CBlockCountry::instance().SendBlockException(peer);
  2732.                 break;
  2733.  
  2734.             case HEADER_GD_BLOCK_EXCEPTION:
  2735.                 sys_log(0, "HEADER_GD_BLOCK_EXCEPTION received");
  2736.                 BlockException((TPacketBlockException*) data);
  2737.                 break;
  2738.  
  2739.             case HEADER_GD_REQ_SPARE_ITEM_ID_RANGE :
  2740.                 SendSpareItemIDRange(peer);
  2741.                 break;
  2742.  
  2743.             case HEADER_GD_REQ_CHANGE_GUILD_MASTER :
  2744.                 GuildChangeMaster((TPacketChangeGuildMaster*) data);
  2745.                 break;
  2746.  
  2747.             case HEADER_GD_UPDATE_HORSE_NAME :
  2748.                 UpdateHorseName((TPacketUpdateHorseName*) data, peer);
  2749.                 break;
  2750.  
  2751.             case HEADER_GD_REQ_HORSE_NAME :
  2752.                 AckHorseName(*(DWORD*)data, peer);
  2753.                 break;
  2754.  
  2755.             case HEADER_GD_DC:
  2756.                 DeleteLoginKey((TPacketDC*) data);
  2757.                 break;
  2758.  
  2759.             case HEADER_GD_VALID_LOGOUT:
  2760.                 ResetLastPlayerID((TPacketNeedLoginLogInfo*)data);
  2761.                 break;
  2762.  
  2763.             case HEADER_GD_REQUEST_CHARGE_CASH:
  2764.                 ChargeCash((TRequestChargeCash*)data);
  2765.                 break;
  2766.  
  2767.             //delete gift notify icon
  2768.  
  2769.             case HEADER_GD_DELETE_AWARDID:
  2770.                 DeleteAwardId((TPacketDeleteAwardID*) data);
  2771.                 break;
  2772.  
  2773.             case HEADER_GD_UPDATE_CHANNELSTATUS:
  2774.                 UpdateChannelStatus((SChannelStatus*) data);
  2775.                 break;
  2776.             case HEADER_GD_REQUEST_CHANNELSTATUS:
  2777.                 RequestChannelStatus(peer, dwHandle);
  2778.                 break;
  2779. #ifdef __AUCTION__
  2780.             case HEADER_GD_COMMAND_AUCTION:
  2781.             {
  2782.                 TPacketGDCommnadAuction* auction_data = (TPacketGDCommnadAuction*)data;
  2783.  
  2784.                 switch (auction_data->get_cmd())
  2785.                 {
  2786.                 case AUCTION_ENR_AUC:
  2787.                     EnrollInAuction (peer, dwHandle, (AuctionEnrollProductInfo*)data);
  2788.                     break;
  2789.                 case AUCTION_ENR_SALE:
  2790.                     EnrollInSale (peer, dwHandle, (AuctionEnrollSaleInfo*)data);
  2791.                     break;
  2792.                 case AUCTION_ENR_WISH:
  2793.                     EnrollInWish (peer, dwHandle, (AuctionEnrollWishInfo*)data);
  2794.                     break;
  2795.                 case AUCTION_BID:
  2796.                     AuctionBid (peer, dwHandle, (AuctionBidInfo*)data);
  2797.                     break;
  2798.                 case AUCTION_IMME_PUR:
  2799.                     AuctionImpur (peer, dwHandle, (AuctionImpurInfo*)data);
  2800.                     break;
  2801.                 case AUCTION_GET_AUC:
  2802.                     AuctionGetAuctionedItem (peer, dwHandle, auction_data->get_item());
  2803.                     break;
  2804.                 case AUCTION_BUY_SOLD:
  2805.                     AuctionBuySoldItem (peer, dwHandle, auction_data->get_item());
  2806.                     break;
  2807.                 case AUCTION_CANCEL_AUC:
  2808.                     AuctionCancelAuction (peer, dwHandle, auction_data->get_item());
  2809.                     break;
  2810.                 case AUCTION_CANCEL_WISH:
  2811.                     AuctionCancelWish (peer, dwHandle, auction_data->get_item());
  2812.                     break;
  2813.                 case AUCTION_CANCEL_SALE:
  2814.                     AuctionCancelSale (peer, dwHandle, auction_data->get_item());
  2815.                     break;
  2816.                 case AUCTION_DELETE_AUCTION_ITEM:
  2817.                     AuctionDeleteAuctionItem (peer, dwHandle, auction_data->get_item());
  2818.                     break;
  2819.                 case AUCTION_DELETE_SALE_ITEM:
  2820.                     AuctionDeleteSaleItem (peer, dwHandle, auction_data->get_item());
  2821.                     break;
  2822.                 case AUCTION_REBID:
  2823.                     AuctionReBid (peer, dwHandle, (AuctionBidInfo*)data);
  2824.                     break;
  2825. //              case AUCTION_BID_CANCEL:
  2826. //                  AuctionBidCancel (peer, dwHandle, data->get_item());
  2827.                 default :
  2828.                     break;
  2829.                 }
  2830.             }
  2831.             break;
  2832. #endif
  2833.             default:
  2834.                 sys_err("Unknown header (header: %d handle: %d length: %d)", header, dwHandle, dwLength);
  2835.                 break;
  2836.         }
  2837.     }
  2838.  
  2839.     peer->RecvEnd(i);
  2840. }
  2841.  
  2842. void CClientManager::AddPeer(socket_t fd)
  2843. {
  2844.     CPeer * pPeer = new CPeer;
  2845.  
  2846.     if (pPeer->Accept(fd))
  2847.         m_peerList.push_front(pPeer);
  2848.     else
  2849.         delete pPeer;
  2850. }
  2851.  
  2852. void CClientManager::RemovePeer(CPeer * pPeer)
  2853. {
  2854.     if (m_pkAuthPeer == pPeer)
  2855.     {
  2856.         m_pkAuthPeer = NULL;
  2857.     }
  2858.     else
  2859.     {
  2860.         TLogonAccountMap::iterator it = m_map_kLogonAccount.begin();
  2861.  
  2862.         while (it != m_map_kLogonAccount.end())
  2863.         {
  2864.             CLoginData * pkLD = it->second;
  2865.  
  2866.             if (pkLD->GetConnectedPeerHandle() == pPeer->GetHandle())
  2867.             {
  2868.                 if (pkLD->IsPlay())
  2869.                 {
  2870.                     pkLD->SetPlay(false);
  2871.                     SendLoginToBilling(pkLD, false);
  2872.                 }
  2873.  
  2874.                 if (pkLD->IsDeleted())
  2875.                 {
  2876.                     sys_log(0, "DELETING LoginData");
  2877.                     delete pkLD;
  2878.                 }
  2879.  
  2880.                 m_map_kLogonAccount.erase(it++);
  2881.             }
  2882.             else
  2883.                 ++it;
  2884.         }
  2885.     }
  2886.  
  2887.     m_peerList.remove(pPeer);
  2888.     delete pPeer;
  2889. }
  2890.  
  2891. CPeer * CClientManager::GetPeer(IDENT ident)
  2892. {
  2893.     for (itertype(m_peerList) i = m_peerList.begin(); i != m_peerList.end();++i)
  2894.     {
  2895.         CPeer * tmp = *i;
  2896.  
  2897.         if (tmp->GetHandle() == ident)
  2898.             return tmp;
  2899.     }
  2900.  
  2901.     return NULL;
  2902. }
  2903.  
  2904. CPeer * CClientManager::GetAnyPeer()
  2905. {
  2906.     if (m_peerList.empty())
  2907.         return NULL;
  2908.  
  2909.     return m_peerList.front();
  2910. }
  2911.  
  2912.  
  2913. //
  2914. // @version 05/06/10 Bang2ni - °¡°ÝÁ¤º¸ °ü·Ã Äõ¸®(QID_ITEMPRICE_XXX) Ãß°¡
  2915. int CClientManager::AnalyzeQueryResult(SQLMsg * msg)
  2916. {
  2917.     CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
  2918.     CPeer * peer = GetPeer(qi->dwIdent);
  2919.  
  2920. #ifdef _TEST
  2921.     if (qi->iType != QID_ITEM_AWARD_LOAD)
  2922.     sys_log(0, "AnalyzeQueryResult %d", qi->iType);
  2923. #endif
  2924.     switch (qi->iType)
  2925.     {
  2926.         case QID_ITEM_AWARD_LOAD:
  2927.             ItemAwardManager::instance().Load(msg);
  2928.             delete qi;
  2929.             return true;
  2930.  
  2931.         case QID_GUILD_RANKING:
  2932.             CGuildManager::instance().ResultRanking(msg->Get()->pSQLResult);
  2933.             break;
  2934.  
  2935.             // MYSHOP_PRICE_LIST
  2936.         case QID_ITEMPRICE_LOAD_FOR_UPDATE:
  2937.             RESULT_PRICELIST_LOAD_FOR_UPDATE(msg);
  2938.             break;
  2939.             // END_OF_MYSHOP_PRICE_LIST
  2940.     }
  2941.  
  2942.     if (!peer)
  2943.     {
  2944.         //sys_err("CClientManager::AnalyzeQueryResult: peer not exist anymore. (ident: %d)", qi->dwIdent);
  2945.         delete qi;
  2946.         return true;
  2947.     }
  2948.  
  2949.     switch (qi->iType)
  2950.     {
  2951.         case QID_PLAYER:
  2952.         case QID_ITEM:
  2953.         case QID_QUEST:
  2954.         case QID_AFFECT:
  2955.             RESULT_COMPOSITE_PLAYER(peer, msg, qi->iType);
  2956.             break;
  2957.  
  2958.         case QID_LOGIN:
  2959.             RESULT_LOGIN(peer, msg);
  2960.             break;
  2961.  
  2962.         case QID_SAFEBOX_LOAD:
  2963.             sys_log(0, "QUERY_RESULT: HEADER_GD_SAFEBOX_LOAD");
  2964.             RESULT_SAFEBOX_LOAD(peer, msg);
  2965.             break;
  2966.  
  2967.         case QID_SAFEBOX_CHANGE_SIZE:
  2968.             sys_log(0, "QUERY_RESULT: HEADER_GD_SAFEBOX_CHANGE_SIZE");
  2969.             RESULT_SAFEBOX_CHANGE_SIZE(peer, msg);
  2970.             break;
  2971.  
  2972.         case QID_SAFEBOX_CHANGE_PASSWORD:
  2973.             sys_log(0, "QUERY_RESULT: HEADER_GD_SAFEBOX_CHANGE_PASSWORD %p", msg);
  2974.             RESULT_SAFEBOX_CHANGE_PASSWORD(peer, msg);
  2975.             break;
  2976.  
  2977.         case QID_SAFEBOX_CHANGE_PASSWORD_SECOND:
  2978.             sys_log(0, "QUERY_RESULT: HEADER_GD_SAFEBOX_CHANGE_PASSWORD %p", msg);
  2979.             RESULT_SAFEBOX_CHANGE_PASSWORD_SECOND(peer, msg);
  2980.             break;
  2981.  
  2982.         case QID_HIGHSCORE_REGISTER:
  2983.             sys_log(0, "QUERY_RESULT: HEADER_GD_HIGHSCORE_REGISTER %p", msg);
  2984.             RESULT_HIGHSCORE_REGISTER(peer, msg);
  2985.             break;
  2986.  
  2987.         case QID_SAFEBOX_SAVE:
  2988.         case QID_ITEM_SAVE:
  2989.         case QID_ITEM_DESTROY:
  2990.         case QID_QUEST_SAVE:
  2991.         case QID_PLAYER_SAVE:
  2992.         case QID_ITEM_AWARD_TAKEN:
  2993.             break;
  2994.  
  2995.             // PLAYER_INDEX_CREATE_BUG_FIX
  2996.         case QID_PLAYER_INDEX_CREATE:
  2997.             RESULT_PLAYER_INDEX_CREATE(peer, msg);
  2998.             break;
  2999.             // END_PLAYER_INDEX_CREATE_BUG_FIX
  3000.  
  3001.         case QID_PLAYER_DELETE:
  3002.             __RESULT_PLAYER_DELETE(peer, msg);
  3003.             break;
  3004.  
  3005.         case QID_LOGIN_BY_KEY:
  3006.             RESULT_LOGIN_BY_KEY(peer, msg);
  3007.             break;
  3008.  
  3009.             // MYSHOP_PRICE_LIST
  3010.         case QID_ITEMPRICE_LOAD:
  3011.             RESULT_PRICELIST_LOAD(peer, msg);
  3012.             break;
  3013.             // END_OF_MYSHOP_PRICE_LIST
  3014.  
  3015.         default:
  3016.             sys_log(0, "CClientManager::AnalyzeQueryResult unknown query result type: %d, str: %s", qi->iType, msg->stQuery.c_str());
  3017.             break;
  3018.     }
  3019.  
  3020.     delete qi;
  3021.     return true;
  3022. }
  3023.  
  3024. void UsageLog()
  3025. {
  3026.     FILE* fp = NULL;
  3027.  
  3028.     time_t      ct;
  3029.     char        *time_s;
  3030.     struct tm   lt;
  3031.  
  3032.     int         avg = g_dwUsageAvg / 3600; // 60 ÃÊ * 60 ºÐ
  3033.  
  3034.     fp = fopen("usage.txt", "a+");
  3035.  
  3036.     if (!fp)
  3037.         return;
  3038.  
  3039.     ct = time(0);
  3040.     lt = *localtime(&ct);
  3041.     time_s = asctime(&lt);
  3042.  
  3043.     time_s[strlen(time_s) - 1] = '\0';
  3044.  
  3045.     fprintf(fp, "| %4d %-15.15s | %5d | %5u |", lt.tm_year + 1900, time_s + 4, avg, g_dwUsageMax);
  3046.  
  3047.     fprintf(fp, "\n");
  3048.     fclose(fp);
  3049.  
  3050.     g_dwUsageMax = g_dwUsageAvg = 0;
  3051. }
  3052.  
  3053. #define ENABLE_ITEMAWARD_REFRESH
  3054. int CClientManager::Process()
  3055. {
  3056.     int pulses;
  3057.  
  3058.     if (!(pulses = thecore_idle()))
  3059.         return 0;
  3060.  
  3061.     while (pulses--)
  3062.     {
  3063.         ++thecore_heart->pulse;
  3064.  
  3065.         /*
  3066.        
  3067.         if (((thecore_pulse() % (60 * 30 * 10)) == 0))
  3068.         {
  3069.             g_iPlayerCacheFlushSeconds = MAX(60, rand() % 180);
  3070.             g_iItemCacheFlushSeconds = MAX(60, rand() % 180);
  3071.             sys_log(0, "[SAVE_TIME]Change saving time item %d player %d", g_iPlayerCacheFlushSeconds, g_iItemCacheFlushSeconds);
  3072.         }
  3073.         */
  3074.  
  3075.         if (!(thecore_heart->pulse % thecore_heart->passes_per_sec))
  3076.         {
  3077.             if (g_test_server)
  3078.             {
  3079.  
  3080.                 if (!(thecore_heart->pulse % thecore_heart->passes_per_sec * 10))
  3081.  
  3082.                 {
  3083.                     pt_log("[%9d] return %d/%d/%d/%d async %d/%d/%d/%d",
  3084.                             thecore_heart->pulse,
  3085.                             CDBManager::instance().CountReturnQuery(SQL_PLAYER),
  3086.                             CDBManager::instance().CountReturnResult(SQL_PLAYER),
  3087.                             CDBManager::instance().CountReturnQueryFinished(SQL_PLAYER),
  3088.                             CDBManager::instance().CountReturnCopiedQuery(SQL_PLAYER),
  3089.                             CDBManager::instance().CountAsyncQuery(SQL_PLAYER),
  3090.                             CDBManager::instance().CountAsyncResult(SQL_PLAYER),
  3091.                             CDBManager::instance().CountAsyncQueryFinished(SQL_PLAYER),
  3092.                             CDBManager::instance().CountAsyncCopiedQuery(SQL_PLAYER));
  3093.  
  3094.                     if ((thecore_heart->pulse % 50) == 0)
  3095.                         sys_log(0, "[%9d] return %d/%d/%d async %d/%d/%d",
  3096.                                 thecore_heart->pulse,
  3097.                                 CDBManager::instance().CountReturnQuery(SQL_PLAYER),
  3098.                                 CDBManager::instance().CountReturnResult(SQL_PLAYER),
  3099.                                 CDBManager::instance().CountReturnQueryFinished(SQL_PLAYER),
  3100.                                 CDBManager::instance().CountAsyncQuery(SQL_PLAYER),
  3101.                                 CDBManager::instance().CountAsyncResult(SQL_PLAYER),
  3102.                                 CDBManager::instance().CountAsyncQueryFinished(SQL_PLAYER));
  3103.                 }
  3104.             }
  3105.             else
  3106.             {
  3107.                 pt_log("[%9d] return %d/%d/%d/%d async %d/%d/%d%/%d",
  3108.                         thecore_heart->pulse,
  3109.                         CDBManager::instance().CountReturnQuery(SQL_PLAYER),
  3110.                         CDBManager::instance().CountReturnResult(SQL_PLAYER),
  3111.                         CDBManager::instance().CountReturnQueryFinished(SQL_PLAYER),
  3112.                         CDBManager::instance().CountReturnCopiedQuery(SQL_PLAYER),
  3113.                         CDBManager::instance().CountAsyncQuery(SQL_PLAYER),
  3114.                         CDBManager::instance().CountAsyncResult(SQL_PLAYER),
  3115.                         CDBManager::instance().CountAsyncQueryFinished(SQL_PLAYER),
  3116.                         CDBManager::instance().CountAsyncCopiedQuery(SQL_PLAYER));
  3117.  
  3118.                         if ((thecore_heart->pulse % 50) == 0)
  3119.                         sys_log(0, "[%9d] return %d/%d/%d async %d/%d/%d",
  3120.                             thecore_heart->pulse,
  3121.                             CDBManager::instance().CountReturnQuery(SQL_PLAYER),
  3122.                             CDBManager::instance().CountReturnResult(SQL_PLAYER),
  3123.                             CDBManager::instance().CountReturnQueryFinished(SQL_PLAYER),
  3124.                             CDBManager::instance().CountAsyncQuery(SQL_PLAYER),
  3125.                             CDBManager::instance().CountAsyncResult(SQL_PLAYER),
  3126.                             CDBManager::instance().CountAsyncQueryFinished(SQL_PLAYER));
  3127.                         }
  3128.  
  3129.             CDBManager::instance().ResetCounter();
  3130.  
  3131.             DWORD dwCount = CClientManager::instance().GetUserCount();
  3132.  
  3133.             g_dwUsageAvg += dwCount;
  3134.             g_dwUsageMax = MAX(g_dwUsageMax, dwCount);
  3135.  
  3136.             memset(&thecore_profiler[0], 0, sizeof(thecore_profiler));
  3137.  
  3138.             if (!(thecore_heart->pulse % (thecore_heart->passes_per_sec * 3600)))
  3139.                 UsageLog();
  3140.  
  3141.             m_iCacheFlushCount = 0;
  3142.  
  3143.  
  3144.            
  3145.             UpdatePlayerCache();
  3146.            
  3147.             UpdateItemCache();
  3148.            
  3149.             UpdateLogoutPlayer();
  3150.  
  3151.             // MYSHOP_PRICE_LIST
  3152.             UpdateItemPriceListCache();
  3153.             // END_OF_MYSHOP_PRICE_LIST
  3154.  
  3155.             CGuildManager::instance().Update();
  3156.             CPrivManager::instance().Update();
  3157.             marriage::CManager::instance().Update();
  3158.         }
  3159. #ifdef ENABLE_ITEMAWARD_REFRESH
  3160.         if (!(thecore_heart->pulse % (thecore_heart->passes_per_sec * 5)))
  3161.         {
  3162.             ItemAwardManager::instance().RequestLoad();
  3163.         }
  3164. #endif
  3165.         if (!(thecore_heart->pulse % (thecore_heart->passes_per_sec * 10)))
  3166.         {
  3167.             /*
  3168.             char buf[4096 + 1];
  3169.             int len
  3170.             itertype(g_query_info.m_map_info) it;
  3171.  
  3172.             /////////////////////////////////////////////////////////////////
  3173.             buf[0] = '\0';
  3174.             len = 0;
  3175.  
  3176.             it = g_query_info.m_map_info.begin();
  3177.  
  3178.             int count = 0;
  3179.  
  3180.             while (it != g_query_info.m_map_info.end())
  3181.             {
  3182.                 len += snprintf(buf + len, sizeof(buf) - len, "%2d %3d\n", it->first, it->second);
  3183.                 count += it->second;
  3184.                 it++;
  3185.             }
  3186.  
  3187.             pt_log("QUERY:\n%s-------------------- MAX : %d\n", buf, count);
  3188.             g_query_info.Reset();
  3189.             */
  3190.             pt_log("QUERY: MAIN[%d] ASYNC[%d]", g_query_count[0], g_query_count[1]);
  3191.             g_query_count[0] = 0;
  3192.             g_query_count[1] = 0;
  3193.             /////////////////////////////////////////////////////////////////
  3194.  
  3195.             /////////////////////////////////////////////////////////////////
  3196.             /*
  3197.             buf[0] = '\0';
  3198.             len = 0;
  3199.  
  3200.             it = g_item_info.m_map_info.begin();
  3201.  
  3202.             count = 0;
  3203.             while (it != g_item_info.m_map_info.end())
  3204.             {
  3205.                 len += snprintf(buf + len, sizeof(buf) - len, "%5d %3d\n", it->first, it->second);
  3206.                 count += it->second;
  3207.                 it++;
  3208.             }
  3209.  
  3210.             pt_log("ITEM:\n%s-------------------- MAX : %d\n", buf, count);
  3211.             g_item_info.Reset();
  3212.             */
  3213.             pt_log("ITEM:%d\n", g_item_count);
  3214.             g_item_count = 0;
  3215.             /////////////////////////////////////////////////////////////////
  3216.         }
  3217.  
  3218.         if (!(thecore_heart->pulse % (thecore_heart->passes_per_sec * 60)))
  3219.         {
  3220.            
  3221.             CClientManager::instance().SendTime();
  3222.  
  3223.            
  3224.             std::string st;
  3225.             CClientManager::instance().GetPeerP2PHostNames(st);
  3226.             sys_log(0, "Current Peer host names...\n%s", st.c_str());
  3227.         }
  3228.  
  3229.         if (!(thecore_heart->pulse % (thecore_heart->passes_per_sec * 3600)))  
  3230.         {
  3231.             CMoneyLog::instance().Save();
  3232.         }
  3233.     }
  3234.  
  3235.     int num_events = fdwatch(m_fdWatcher, 0);
  3236.     int idx;
  3237.     CPeer * peer;
  3238.  
  3239.     for (idx = 0; idx < num_events; ++idx)
  3240.     {
  3241.         peer = (CPeer *) fdwatch_get_client_data(m_fdWatcher, idx);
  3242.  
  3243.         if (!peer)
  3244.         {
  3245.             if (fdwatch_check_event(m_fdWatcher, m_fdAccept, idx) == FDW_READ)
  3246.             {
  3247.                 AddPeer(m_fdAccept);
  3248.                 fdwatch_clear_event(m_fdWatcher, m_fdAccept, idx);
  3249.             }
  3250.             else
  3251.             {
  3252.                 sys_log(0, "FDWATCH: peer null in event: ident %d", fdwatch_get_ident(m_fdWatcher, idx)); // @warme012
  3253.             }
  3254.  
  3255.             continue;
  3256.         }
  3257.  
  3258.         switch (fdwatch_check_event(m_fdWatcher, peer->GetFd(), idx))
  3259.         {
  3260.             case FDW_READ:
  3261.                 if (peer->Recv() < 0)
  3262.                 {
  3263.                     sys_err("Recv failed");
  3264.                     RemovePeer(peer);
  3265.                 }
  3266.                 else
  3267.                 {
  3268.                     if (peer == m_pkAuthPeer)
  3269.                         if (g_log)
  3270.                             sys_log(0, "AUTH_PEER_READ: size %d", peer->GetRecvLength());
  3271.  
  3272.                     ProcessPackets(peer);
  3273.                 }
  3274.                 break;
  3275.  
  3276.             case FDW_WRITE:
  3277.                 if (peer == m_pkAuthPeer)
  3278.                     if (g_log)
  3279.                         sys_log(0, "AUTH_PEER_WRITE: size %d", peer->GetSendLength());
  3280.  
  3281.                 if (peer->Send() < 0)
  3282.                 {
  3283.                     sys_err("Send failed");
  3284.                     RemovePeer(peer);
  3285.                 }
  3286.  
  3287.                 break;
  3288.  
  3289.             case FDW_EOF:
  3290.                 RemovePeer(peer);
  3291.                 break;
  3292.  
  3293.             default:
  3294.                 sys_err("fdwatch_check_fd returned unknown result");
  3295.                 RemovePeer(peer);
  3296.                 break;
  3297.         }
  3298.     }
  3299.  
  3300. #ifdef __WIN32__
  3301.     if (_kbhit()) {
  3302.         int c = _getch();
  3303.         switch (c) {
  3304.             case 0x1b: // Esc
  3305.                 return 0; // shutdown
  3306.                 break;
  3307.             default:
  3308.                 break;
  3309.         }
  3310.     }
  3311. #endif
  3312.  
  3313.     VCardProcess();
  3314.     return 1;
  3315. }
  3316.  
  3317. DWORD CClientManager::GetUserCount()
  3318. {
  3319.    
  3320.     return m_map_kLogonAccount.size();
  3321. }
  3322.  
  3323. void CClientManager::SendAllGuildSkillRechargePacket()
  3324. {
  3325.     ForwardPacket(HEADER_DG_GUILD_SKILL_RECHARGE, NULL, 0);
  3326. }
  3327.  
  3328. void CClientManager::SendTime()
  3329. {
  3330.     time_t now = GetCurrentTime();
  3331.     ForwardPacket(HEADER_DG_TIME, &now, sizeof(time_t));
  3332. }
  3333.  
  3334. void CClientManager::ForwardPacket(BYTE header, const void* data, int size, BYTE bChannel, CPeer* except)
  3335. {
  3336.     for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  3337.     {
  3338.         CPeer * peer = *it;
  3339.  
  3340.         if (peer == except)
  3341.             continue;
  3342.  
  3343.         if (!peer->GetChannel())
  3344.             continue;
  3345.  
  3346.         if (bChannel && peer->GetChannel() != bChannel)
  3347.             continue;
  3348.  
  3349.         peer->EncodeHeader(header, 0, size);
  3350.  
  3351.         if (size > 0 && data)
  3352.             peer->Encode(data, size);
  3353.     }
  3354. }
  3355.  
  3356. void CClientManager::SendNotice(const char * c_pszFormat, ...)
  3357. {
  3358.     char szBuf[255+1];
  3359.     va_list args;
  3360.  
  3361.     va_start(args, c_pszFormat);
  3362.     int len = vsnprintf(szBuf, sizeof(szBuf), c_pszFormat, args);
  3363.     va_end(args);
  3364.     szBuf[len] = '\0';
  3365.  
  3366.     ForwardPacket(HEADER_DG_NOTICE, szBuf, len + 1);
  3367. }
  3368.  
  3369. time_t CClientManager::GetCurrentTime()
  3370. {
  3371.     return time(0);
  3372. }
  3373.  
  3374. // ITEM_UNIQUE_ID
  3375. bool CClientManager::InitializeNowItemID()
  3376. {
  3377.     DWORD dwMin, dwMax;
  3378.  
  3379.    
  3380.     if (!CConfig::instance().GetTwoValue("ITEM_ID_RANGE", &dwMin, &dwMax))
  3381.     {
  3382.         sys_err("conf.txt: Cannot find ITEM_ID_RANGE [start_item_id] [end_item_id]");
  3383.         return false;
  3384.     }
  3385.  
  3386.     sys_log(0, "ItemRange From File %u ~ %u ", dwMin, dwMax);
  3387.  
  3388.     if (CItemIDRangeManager::instance().BuildRange(dwMin, dwMax, m_itemRange) == false)
  3389.     {
  3390.         sys_err("Can not build ITEM_ID_RANGE");
  3391.         return false;
  3392.     }
  3393.  
  3394.     sys_log(0, " Init Success Start %u End %u Now %u\n", m_itemRange.dwMin, m_itemRange.dwMax, m_itemRange.dwUsableItemIDMin);
  3395.  
  3396.     return true;
  3397. }
  3398.  
  3399. DWORD CClientManager::GainItemID()
  3400. {
  3401.     return m_itemRange.dwUsableItemIDMin++;
  3402. }
  3403.  
  3404. DWORD CClientManager::GetItemID()
  3405. {
  3406.     return m_itemRange.dwUsableItemIDMin;
  3407. }
  3408. // ITEM_UNIQUE_ID_END
  3409. //BOOT_LOCALIZATION
  3410.  
  3411. bool CClientManager::InitializeLocalization()
  3412. {
  3413.     char szQuery[512];
  3414.     snprintf(szQuery, sizeof(szQuery), "SELECT mValue, mKey FROM locale");
  3415.     SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_COMMON);
  3416.  
  3417.     if (pMsg->Get()->uiNumRows == 0)
  3418.     {
  3419.         sys_err("InitializeLocalization() ==> DirectQuery failed(%s)", szQuery);
  3420.         delete pMsg;
  3421.         return false;
  3422.     }
  3423.  
  3424.     sys_log(0, "InitializeLocalization() - LoadLocaleTable(count:%d)", pMsg->Get()->uiNumRows);
  3425.  
  3426.     m_vec_Locale.clear();
  3427.  
  3428.     MYSQL_ROW row = NULL;
  3429.  
  3430.     for (int n = 0; (row = mysql_fetch_row(pMsg->Get()->pSQLResult)) != NULL; ++n)
  3431.     {
  3432.         int col = 0;
  3433.         tLocale locale;
  3434.  
  3435.         strlcpy(locale.szValue, row[col++], sizeof(locale.szValue));
  3436.         strlcpy(locale.szKey, row[col++], sizeof(locale.szKey));
  3437.  
  3438.         //DB_NAME_COLUMN Setting
  3439.         if (strcmp(locale.szKey, "LOCALE") == 0)
  3440.         {
  3441.             if (strcmp(locale.szValue, "cibn") == 0)
  3442.             {
  3443.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3444.  
  3445.                 if (g_stLocale != locale.szValue)
  3446.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "gb2312");
  3447.  
  3448.                 g_stLocale = "gb2312";
  3449.                 g_stLocaleNameColumn = "gb2312name";
  3450.             }
  3451.             else if (strcmp(locale.szValue, "ymir") == 0)
  3452.             {
  3453.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3454.  
  3455.                 if (g_stLocale != locale.szValue)
  3456.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3457.  
  3458.                 g_stLocale = "euckr";
  3459.                 g_stLocaleNameColumn = "name";
  3460.             }
  3461.             else if (strcmp(locale.szValue, "japan") == 0)
  3462.             {
  3463.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3464.  
  3465.                 if (g_stLocale != locale.szValue)
  3466.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "sjis");
  3467.  
  3468.                 g_stLocale = "sjis";
  3469.                 g_stLocaleNameColumn = "locale_name";
  3470.             }
  3471.             else if (strcmp(locale.szValue, "english") == 0)
  3472.             {
  3473.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3474.  
  3475.                 if (g_stLocale != locale.szValue)
  3476.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3477.  
  3478.                 g_stLocale = "";
  3479.                 g_stLocaleNameColumn = "locale_name";
  3480.             }
  3481.             else if (strcmp(locale.szValue, "germany") == 0)
  3482.             {
  3483.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3484.  
  3485.                 if (g_stLocale != locale.szValue)
  3486.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3487.  
  3488.                 g_stLocale = "latin1";
  3489.                 g_stLocaleNameColumn = "locale_name";
  3490.             }
  3491.             else if (strcmp(locale.szValue, "france") == 0)
  3492.             {
  3493.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3494.  
  3495.                 if (g_stLocale != locale.szValue)
  3496.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3497.  
  3498.                 g_stLocale = "latin1";
  3499.                 g_stLocaleNameColumn = "locale_name";
  3500.             }
  3501.             else if (strcmp(locale.szValue, "italy") == 0)
  3502.             {
  3503.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3504.  
  3505.                 if (g_stLocale != locale.szValue)
  3506.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3507.  
  3508.                 g_stLocale = "latin1";
  3509.                 g_stLocaleNameColumn = "locale_name";
  3510.             }
  3511.             else if (strcmp(locale.szValue, "spain") == 0)
  3512.             {
  3513.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3514.  
  3515.                 if (g_stLocale != locale.szValue)
  3516.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3517.  
  3518.                 g_stLocale = "latin1";
  3519.                 g_stLocaleNameColumn = "locale_name";
  3520.             }
  3521.             else if (strcmp(locale.szValue, "uk") == 0)
  3522.             {
  3523.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3524.  
  3525.                 if (g_stLocale != locale.szValue)
  3526.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3527.  
  3528.                 g_stLocale = "latin1";
  3529.                 g_stLocaleNameColumn = "locale_name";
  3530.             }
  3531.             else if (strcmp(locale.szValue, "turkey") == 0)
  3532.             {
  3533.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3534.  
  3535.                 if (g_stLocale != locale.szValue)
  3536.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3537.  
  3538.                 g_stLocale = "latin5";
  3539.                 g_stLocaleNameColumn = "locale_name";
  3540.             }
  3541.             else if (strcmp(locale.szValue, "poland") == 0)
  3542.             {
  3543.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3544.  
  3545.                 if (g_stLocale != locale.szValue)
  3546.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3547.  
  3548.                 g_stLocale = "latin2";
  3549.                 g_stLocaleNameColumn = "locale_name";
  3550.             }
  3551.             else if (strcmp(locale.szValue, "portugal") == 0)
  3552.             {
  3553.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3554.  
  3555.                 if (g_stLocale != locale.szValue)
  3556.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3557.  
  3558.                 g_stLocale = "latin1";
  3559.                 g_stLocaleNameColumn = "locale_name";
  3560.             }
  3561.             else if (strcmp(locale.szValue, "hongkong") == 0)
  3562.             {
  3563.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3564.  
  3565.                 if (g_stLocale != locale.szValue)
  3566.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "big5");
  3567.  
  3568.                 g_stLocale = "big5";
  3569.                 g_stLocaleNameColumn = "locale_name";
  3570.             }
  3571.             else if (strcmp(locale.szValue, "newcibn") == 0)
  3572.             {
  3573.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3574.  
  3575.                 if (g_stLocale != locale.szValue)
  3576.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "gb2312");
  3577.  
  3578.                 g_stLocale = "gb2312";
  3579.                 g_stLocaleNameColumn = "gb2312name";
  3580.             }
  3581.             else if (strcmp(locale.szValue, "korea") == 0)
  3582.             {
  3583.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3584.  
  3585.                 if (g_stLocale != locale.szValue)
  3586.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3587.  
  3588.                 g_stLocale = "euckr";
  3589.                 g_stLocaleNameColumn = "name";
  3590.             }
  3591.             else if (strcmp(locale.szValue, "canada") == 0)
  3592.             {
  3593.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3594.  
  3595.                 if (g_stLocale != locale.szValue)
  3596.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3597.  
  3598.                 g_stLocale = "latin1";
  3599.                 g_stLocaleNameColumn = "gb2312name";
  3600.             }
  3601.             else if (strcmp(locale.szValue, "brazil") == 0)
  3602.             {
  3603.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3604.  
  3605.                 if (g_stLocale != locale.szValue)
  3606.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3607.  
  3608.                 g_stLocale = "latin1";
  3609.                 g_stLocaleNameColumn = "locale_name";
  3610.             }
  3611.             else if (strcmp(locale.szValue, "greek") == 0)
  3612.             {
  3613.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3614.  
  3615.                 if (g_stLocale != locale.szValue)
  3616.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3617.  
  3618.                 g_stLocale = "greek";
  3619.                 g_stLocaleNameColumn = "locale_name";
  3620.             }
  3621.             else if (strcmp(locale.szValue, "russia") == 0)
  3622.             {
  3623.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3624.  
  3625.                 if (g_stLocale != locale.szValue)
  3626.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3627.  
  3628.                 g_stLocale = "cp1251";
  3629.                 g_stLocaleNameColumn = "locale_name";
  3630.             }
  3631.             else if (strcmp(locale.szValue, "denmark") == 0)
  3632.             {
  3633.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3634.  
  3635.                 if (g_stLocale != locale.szValue)
  3636.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3637.  
  3638.                 g_stLocale = "latin1";
  3639.                 g_stLocaleNameColumn = "locale_name";
  3640.             }
  3641.             else if (strcmp(locale.szValue, "bulgaria") == 0)
  3642.             {
  3643.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3644.  
  3645.                 if (g_stLocale != locale.szValue)
  3646.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3647.  
  3648.                 g_stLocale = "cp1251";
  3649.                 g_stLocaleNameColumn = "locale_name";
  3650.             }
  3651.             else if (strcmp(locale.szValue, "croatia") == 0)
  3652.             {
  3653.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3654.  
  3655.                 if (g_stLocale != locale.szValue)
  3656.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3657.  
  3658.                 g_stLocale = "cp1251";
  3659.                 g_stLocaleNameColumn = "locale_name";
  3660.             }
  3661.             else if (strcmp(locale.szValue, "mexico") == 0)
  3662.             {
  3663.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3664.  
  3665.                 if (g_stLocale != locale.szValue)
  3666.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3667.  
  3668.                 g_stLocale = "latin1";
  3669.                 g_stLocaleNameColumn = "locale_name";
  3670.             }
  3671.             else if (strcmp(locale.szValue, "arabia") == 0)
  3672.             {
  3673.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3674.  
  3675.                 if (g_stLocale != locale.szValue)
  3676.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3677.  
  3678.                 g_stLocale = "cp1256";
  3679.                 g_stLocaleNameColumn = "locale_name";
  3680.             }
  3681.             else if (strcmp(locale.szValue, "czech") == 0)
  3682.             {
  3683.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3684.  
  3685.                 if (g_stLocale != locale.szValue)
  3686.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3687.  
  3688.                 g_stLocale = "latin2";
  3689.                 g_stLocaleNameColumn = "locale_name";
  3690.             }
  3691.             else if (strcmp(locale.szValue, "hungary") == 0)
  3692.             {
  3693.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3694.  
  3695.                 if (g_stLocale != locale.szValue)
  3696.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3697.  
  3698.                 g_stLocale = "latin2";
  3699.                 g_stLocaleNameColumn = "locale_name";
  3700.             }
  3701.             else if (strcmp(locale.szValue, "romania") == 0)
  3702.             {
  3703.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3704.  
  3705.                 if (g_stLocale != locale.szValue)
  3706.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3707.  
  3708.                 g_stLocale = "latin2";
  3709.                 g_stLocaleNameColumn = "locale_name";
  3710.             }
  3711.             else if (strcmp(locale.szValue, "netherlands") == 0)
  3712.             {
  3713.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3714.  
  3715.                 if (g_stLocale != locale.szValue)
  3716.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3717.  
  3718.                 g_stLocale = "latin1";
  3719.                 g_stLocaleNameColumn = "locale_name";
  3720.             }
  3721.             else if (strcmp(locale.szValue, "singapore") == 0)
  3722.             {
  3723.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3724.  
  3725.                 if (g_stLocale != locale.szValue)
  3726.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3727.  
  3728.                 g_stLocale = "latin1";
  3729.                 g_stLocaleNameColumn = "locale_name";
  3730.             }
  3731.             else if (strcmp(locale.szValue, "vietnam") == 0)
  3732.             {
  3733.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3734.  
  3735.                 if (g_stLocale != locale.szValue)
  3736.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3737.  
  3738.                 g_stLocale = "latin1";
  3739.                 g_stLocaleNameColumn = "locale_name";
  3740.             }
  3741.             else if (strcmp(locale.szValue, "thailand") == 0)
  3742.             {
  3743.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3744.  
  3745.                 if (g_stLocale != locale.szValue)
  3746.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3747.  
  3748.                 g_stLocale = "latin1";
  3749.                 g_stLocaleNameColumn = "locale_name";
  3750.             }
  3751.             else if (strcmp(locale.szValue, "usa") == 0)
  3752.             {
  3753.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3754.  
  3755.                 if (g_stLocale != locale.szValue)
  3756.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "latin1");
  3757.  
  3758.                 g_stLocale = "latin1";
  3759.                 g_stLocaleNameColumn = "locale_name";
  3760.             }
  3761.             else if (strcmp(locale.szValue, "we_korea") == 0)
  3762.             {
  3763.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3764.  
  3765.                 if (g_stLocale != locale.szValue)
  3766.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "euckr");
  3767.  
  3768.                 g_stLocale = "euckr";
  3769.                 g_stLocaleNameColumn = "name";
  3770.             }
  3771.             else if (strcmp(locale.szValue, "taiwan") == 0)
  3772.             {
  3773.                 sys_log(0, "locale[LOCALE] = %s", locale.szValue);
  3774.  
  3775.                 if (g_stLocale != locale.szValue)
  3776.                     sys_log(0, "Changed g_stLocale %s to %s", g_stLocale.c_str(), "big5");
  3777.                 g_stLocale = "big5";
  3778.                 g_stLocaleNameColumn = "locale_name";
  3779.             }
  3780.             else
  3781.             {
  3782.                 sys_err("locale[LOCALE] = UNKNOWN(%s)", locale.szValue);
  3783.                 exit(0);
  3784.             }
  3785.             // @warme007
  3786.             // sys_log(0,"before call SetLocale: %s",g_stLocale.c_str());
  3787.             // CDBManager::instance().SetLocale(g_stLocale.c_str());
  3788.             // sys_log(0,"Called SetLocale");
  3789.         }
  3790.         else if (strcmp(locale.szKey, "DB_NAME_COLUMN") == 0)
  3791.         {
  3792.             sys_log(0, "locale[DB_NAME_COLUMN] = %s", locale.szValue);
  3793.             g_stLocaleNameColumn = locale.szValue;
  3794.         }
  3795.         else
  3796.         {
  3797.             sys_log(0, "locale[UNKNOWN_KEY(%s)] = %s", locale.szKey, locale.szValue);
  3798.         }
  3799.         m_vec_Locale.push_back(locale);
  3800.     }
  3801.  
  3802.     delete pMsg;
  3803.  
  3804.     return true;
  3805. }
  3806. //END_BOOT_LOCALIZATION
  3807. //ADMIN_MANAGER
  3808.  
  3809. bool CClientManager::__GetAdminInfo(const char *szIP, std::vector<tAdminInfo> & rAdminVec)
  3810. {
  3811.    
  3812.     char szQuery[512];
  3813.     snprintf(szQuery, sizeof(szQuery),
  3814.             "SELECT mID,mAccount,mName,mContactIP,mServerIP,mAuthority FROM gmlist WHERE mServerIP='ALL' or mServerIP='%s'",
  3815.             szIP ? szIP : "ALL");
  3816.  
  3817.     SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_COMMON);
  3818.  
  3819.     if (pMsg->Get()->uiNumRows == 0)
  3820.     {
  3821.         // sys_err("__GetAdminInfo() ==> DirectQuery failed(%s)", szQuery); // @warme013
  3822.         delete pMsg;
  3823.         return false;
  3824.     }
  3825.  
  3826.     MYSQL_ROW row;
  3827.     rAdminVec.reserve(pMsg->Get()->uiNumRows);
  3828.  
  3829.     while ((row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
  3830.     {
  3831.         int idx = 0;
  3832.         tAdminInfo Info;
  3833.  
  3834.         str_to_number(Info.m_ID, row[idx++]);
  3835.         trim_and_lower(row[idx++], Info.m_szAccount, sizeof(Info.m_szAccount));
  3836.         strlcpy(Info.m_szName, row[idx++], sizeof(Info.m_szName));
  3837.         strlcpy(Info.m_szContactIP, row[idx++], sizeof(Info.m_szContactIP));
  3838.         strlcpy(Info.m_szServerIP, row[idx++], sizeof(Info.m_szServerIP));
  3839.         std::string stAuth = row[idx++];
  3840.  
  3841.         if (!stAuth.compare("IMPLEMENTOR"))
  3842.             Info.m_Authority = GM_IMPLEMENTOR;
  3843.         else if (!stAuth.compare("GOD"))
  3844.             Info.m_Authority = GM_GOD;
  3845.         else if (!stAuth.compare("HIGH_WIZARD"))
  3846.             Info.m_Authority = GM_HIGH_WIZARD;
  3847.         else if (!stAuth.compare("LOW_WIZARD"))
  3848.             Info.m_Authority = GM_LOW_WIZARD;
  3849.         else if (!stAuth.compare("WIZARD"))
  3850.             Info.m_Authority = GM_WIZARD;
  3851.         else
  3852.             continue;
  3853.  
  3854.         rAdminVec.push_back(Info);
  3855.  
  3856.         sys_log(0, "GM: PID %u Login %s Character %s ContactIP %s ServerIP %s Authority %d[%s]",
  3857.                 Info.m_ID, Info.m_szAccount, Info.m_szName, Info.m_szContactIP, Info.m_szServerIP, Info.m_Authority, stAuth.c_str());
  3858.     }
  3859.  
  3860.     delete pMsg;
  3861.  
  3862.     return true;
  3863. }
  3864.  
  3865. bool CClientManager::__GetHostInfo(std::vector<std::string> & rIPVec)
  3866. {
  3867.     char szQuery[512];
  3868.     snprintf(szQuery, sizeof(szQuery), "SELECT mIP FROM gmhost");
  3869.     SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_COMMON);
  3870.  
  3871.     if (pMsg->Get()->uiNumRows == 0)
  3872.     {
  3873.         // sys_err("__GetHostInfo() ==> DirectQuery failed(%s)", szQuery); // @warme013
  3874.         delete pMsg;
  3875.         return false;
  3876.     }
  3877.  
  3878.     rIPVec.reserve(pMsg->Get()->uiNumRows);
  3879.  
  3880.     MYSQL_ROW row;
  3881.  
  3882.     while ((row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
  3883.     {
  3884.         if (row[0] && *row[0])
  3885.         {
  3886.             rIPVec.push_back(row[0]);
  3887.             sys_log(0, "GMHOST: %s", row[0]);
  3888.         }
  3889.     }
  3890.  
  3891.     delete pMsg;
  3892.     return true;
  3893. }
  3894. //END_ADMIN_MANAGER
  3895.  
  3896. void CClientManager::ReloadAdmin(CPeer*, TPacketReloadAdmin* p)
  3897. {
  3898.     std::vector<tAdminInfo> vAdmin;
  3899.     std::vector<std::string> vHost;
  3900.  
  3901.     __GetHostInfo(vHost);
  3902.     __GetAdminInfo(p->szIP, vAdmin);
  3903.  
  3904.     DWORD dwPacketSize = sizeof(WORD) + sizeof (WORD) + sizeof(tAdminInfo) * vAdmin.size() +
  3905.           sizeof(WORD) + sizeof(WORD) + 16 * vHost.size();
  3906.  
  3907.     for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  3908.     {
  3909.         CPeer * peer = *it;
  3910.  
  3911.         if (!peer->GetChannel())
  3912.             continue;
  3913.  
  3914.         peer->EncodeHeader(HEADER_DG_RELOAD_ADMIN, 0, dwPacketSize);
  3915.  
  3916.         peer->EncodeWORD(16);
  3917.         peer->EncodeWORD(vHost.size());
  3918.  
  3919.         for (size_t n = 0; n < vHost.size(); ++n)
  3920.             peer->Encode(vHost[n].c_str(), 16);
  3921.  
  3922.         peer->EncodeWORD(sizeof(tAdminInfo));
  3923.         peer->EncodeWORD(vAdmin.size());
  3924.  
  3925.         for (size_t n = 0; n < vAdmin.size(); ++n)
  3926.             peer->Encode(&vAdmin[n], sizeof(tAdminInfo));
  3927.     }
  3928.  
  3929.     sys_log(0, "ReloadAdmin End %s", p->szIP);
  3930. }
  3931.  
  3932. //BREAK_MARRIAGE
  3933. void CClientManager::BreakMarriage(CPeer * peer, const char * data)
  3934. {
  3935.     DWORD pid1, pid2;
  3936.  
  3937.     pid1 = *(int *) data;
  3938.     data += sizeof(int);
  3939.  
  3940.     pid2 = *(int *) data;
  3941.     data += sizeof(int);
  3942.  
  3943.     sys_log(0, "Breaking off a marriage engagement! pid %d and pid %d", pid1, pid2);
  3944.     marriage::CManager::instance().Remove(pid1, pid2);
  3945. }
  3946. //END_BREAK_MARIIAGE
  3947.  
  3948. void CClientManager::UpdateItemCacheSet(DWORD pid)
  3949. {
  3950.     itertype(m_map_pkItemCacheSetPtr) it = m_map_pkItemCacheSetPtr.find(pid);
  3951.  
  3952.     if (it == m_map_pkItemCacheSetPtr.end())
  3953.     {
  3954.         if (g_test_server)
  3955.             sys_log(0, "UPDATE_ITEMCACHESET : UpdateItemCacheSet ==> No ItemCacheSet pid(%d)", pid);
  3956.         return;
  3957.     }
  3958.  
  3959.     TItemCacheSet * pSet = it->second;
  3960.     TItemCacheSet::iterator it_set = pSet->begin();
  3961.  
  3962.     while (it_set != pSet->end())
  3963.     {
  3964.         CItemCache * c = *it_set++;
  3965.         c->Flush();
  3966.     }
  3967.  
  3968.     if (g_log)
  3969.         sys_log(0, "UPDATE_ITEMCACHESET : UpdateItemCachsSet pid(%d)", pid);
  3970. }
  3971.  
  3972. void CClientManager::Election(CPeer * peer, DWORD dwHandle, const char* data)
  3973. {
  3974.     DWORD idx;
  3975.     DWORD selectingpid;
  3976.  
  3977.     idx = *(DWORD *) data;
  3978.     data += sizeof(DWORD);
  3979.  
  3980.     selectingpid = *(DWORD *) data;
  3981.     data += sizeof(DWORD);
  3982.  
  3983.     int Success = 0;
  3984.  
  3985.     if (!(Success = CMonarch::instance().VoteMonarch(selectingpid, idx)))
  3986.     {
  3987.         if (g_test_server)
  3988.         sys_log(0, "[MONARCH_VOTE] Failed %d %d", idx, selectingpid);
  3989.         peer->EncodeHeader(HEADER_DG_ELECT_MONARCH, dwHandle, sizeof(int));
  3990.         peer->Encode(&Success, sizeof(int));
  3991.         return;
  3992.     }
  3993.     else
  3994.     {
  3995.         if (g_test_server)
  3996.         sys_log(0, "[MONARCH_VOTE] Success %d %d", idx, selectingpid);
  3997.         peer->EncodeHeader(HEADER_DG_ELECT_MONARCH, dwHandle, sizeof(int));
  3998.         peer->Encode(&Success, sizeof(int));
  3999.         return;
  4000.     }
  4001.  
  4002. }
  4003. void CClientManager::Candidacy(CPeer *  peer, DWORD dwHandle, const char* data)
  4004. {
  4005.     DWORD pid;
  4006.  
  4007.     pid = *(DWORD *) data;
  4008.     data += sizeof(DWORD);
  4009.  
  4010.     if (!CMonarch::instance().AddCandidacy(pid, data))
  4011.     {
  4012.         if (g_test_server)
  4013.             sys_log(0, "[MONARCH_CANDIDACY] Failed %d %s", pid, data);
  4014.  
  4015.         peer->EncodeHeader(HEADER_DG_CANDIDACY, dwHandle, sizeof(int) + 32);
  4016.         peer->Encode(0, sizeof(int));
  4017.         peer->Encode(data, 32);
  4018.         return;
  4019.     }
  4020.     else
  4021.     {
  4022.         if (g_test_server)
  4023.             sys_log(0, "[MONARCH_CANDIDACY] Success %d %s", pid, data);
  4024.  
  4025.         for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  4026.         {
  4027.             CPeer * p = *it;
  4028.  
  4029.             if (!p->GetChannel())
  4030.                 continue;
  4031.  
  4032.             if (0 && p->GetChannel() != 0)
  4033.                 continue;
  4034.  
  4035.             if (p == peer)
  4036.             {
  4037.                 p->EncodeHeader(HEADER_DG_CANDIDACY, dwHandle, sizeof(int) + 32);
  4038.                 p->Encode(&pid, sizeof(int));
  4039.                 p->Encode(data, 32);
  4040.             }
  4041.             else
  4042.             {
  4043.                 p->EncodeHeader(HEADER_DG_CANDIDACY, 0, sizeof(int) + 32);
  4044.                 p->Encode(&pid, sizeof(int));
  4045.                 p->Encode(data, 32);
  4046.             }
  4047.         }
  4048.     }
  4049. }
  4050.  
  4051. void CClientManager::AddMonarchMoney(CPeer * peer, DWORD dwHandle, const char * data)
  4052. {
  4053.     int Empire = *(int *) data;
  4054.     data += sizeof(int);
  4055.  
  4056.     int Money = *(int *) data;
  4057.     data += sizeof(int);
  4058.  
  4059.     if (g_test_server)
  4060.         sys_log(0, "[MONARCH] Add money Empire(%d) Money(%d)", Empire, Money);
  4061.  
  4062.     CMonarch::instance().AddMoney(Empire, Money);
  4063.  
  4064.     for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  4065.     {
  4066.         CPeer * p = *it;
  4067.  
  4068.         if (!p->GetChannel())
  4069.             continue;
  4070.  
  4071.         if (p == peer)
  4072.         {
  4073.             p->EncodeHeader(HEADER_DG_ADD_MONARCH_MONEY, dwHandle, sizeof(int) + sizeof(int));
  4074.             p->Encode(&Empire, sizeof(int));
  4075.             p->Encode(&Money, sizeof(int));
  4076.         }
  4077.         else
  4078.         {
  4079.             p->EncodeHeader(HEADER_DG_ADD_MONARCH_MONEY, 0, sizeof(int) + sizeof(int));
  4080.             p->Encode(&Empire, sizeof(int));
  4081.             p->Encode(&Money, sizeof(int));
  4082.         }
  4083.  
  4084.     }
  4085. }
  4086. void CClientManager::DecMonarchMoney(CPeer * peer, DWORD dwHandle, const char * data)
  4087. {
  4088.     int Empire = *(int *) data;
  4089.     data += sizeof(int);
  4090.  
  4091.     int Money = *(int *) data;
  4092.     data += sizeof(int);
  4093.  
  4094.     if (g_test_server)
  4095.         sys_log(0, "[MONARCH] Dec money Empire(%d) Money(%d)", Empire, Money);
  4096.  
  4097.     CMonarch::instance().DecMoney(Empire, Money);
  4098.  
  4099.     for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  4100.     {
  4101.         CPeer * p = *it;
  4102.  
  4103.         if (!p->GetChannel())
  4104.             continue;
  4105.  
  4106.         if (p == peer)
  4107.         {
  4108.             p->EncodeHeader(HEADER_DG_DEC_MONARCH_MONEY, dwHandle, sizeof(int) + sizeof(int));
  4109.             p->Encode(&Empire, sizeof(int));
  4110.             p->Encode(&Money, sizeof(int));
  4111.         }
  4112.         else
  4113.         {
  4114.             p->EncodeHeader(HEADER_DG_DEC_MONARCH_MONEY, 0, sizeof(int) + sizeof(int));
  4115.             p->Encode(&Empire, sizeof(int));
  4116.             p->Encode(&Money, sizeof(int));
  4117.         }
  4118.     }
  4119. }
  4120.  
  4121. void CClientManager::TakeMonarchMoney(CPeer * peer, DWORD dwHandle, const char * data)
  4122. {
  4123.     int Empire = *(int *) data;
  4124.     data += sizeof(int);
  4125.  
  4126.     DWORD pid = *(DWORD *) data;
  4127.     data += sizeof(int);
  4128.  
  4129.     int Money = *(int *) data;
  4130.     data += sizeof(int);
  4131.  
  4132.     if (g_test_server)
  4133.         sys_log(0, "[MONARCH] Take money Empire(%d) Money(%d)", Empire, Money);
  4134.  
  4135.     if (CMonarch::instance().TakeMoney(Empire, pid, Money) == true)
  4136.     {
  4137.         peer->EncodeHeader(HEADER_DG_TAKE_MONARCH_MONEY, dwHandle, sizeof(int) + sizeof(int));
  4138.         peer->Encode(&Empire, sizeof(int));
  4139.         peer->Encode(&Money, sizeof(int));
  4140.     }
  4141.     else
  4142.     {
  4143.         Money = 0;
  4144.         peer->EncodeHeader(HEADER_DG_TAKE_MONARCH_MONEY, dwHandle, sizeof(int) + sizeof(int));
  4145.         peer->Encode(&Empire, sizeof(int));
  4146.         peer->Encode(&Money, sizeof(int));
  4147.     }
  4148. }
  4149.  
  4150. void CClientManager::ComeToVote(CPeer * peer, DWORD dwHandle, const char * data)
  4151. {
  4152.     CMonarch::instance().ElectMonarch();
  4153. }
  4154.  
  4155. void CClientManager::RMCandidacy(CPeer * peer, DWORD dwHandle, const char * data)
  4156. {
  4157.     char szName[32];
  4158.  
  4159.     strlcpy(szName, data, sizeof(szName));
  4160.     sys_log(0, "[MONARCH_GM] Remove candidacy name(%s)", szName);
  4161.  
  4162.     int iRet = CMonarch::instance().DelCandidacy(szName) ? 1 : 0;
  4163.  
  4164.     if (1 == iRet)
  4165.     {
  4166.         for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  4167.         {
  4168.             CPeer * p = *it;
  4169.  
  4170.             if (!p->GetChannel())
  4171.                 continue;
  4172.  
  4173.             if (p == peer)
  4174.             {
  4175.                 p->EncodeHeader(HEADER_DG_RMCANDIDACY, dwHandle, sizeof(int) + sizeof(szName));
  4176.                 p->Encode(&iRet, sizeof(int));
  4177.                 p->Encode(szName, sizeof(szName));
  4178.             }
  4179.             else
  4180.             {
  4181.                 p->EncodeHeader(HEADER_DG_RMCANDIDACY, dwHandle, sizeof(int) + sizeof(szName));
  4182.                 p->Encode(&iRet, sizeof(int));
  4183.                 p->Encode(szName, sizeof(szName));
  4184.             }
  4185.         }
  4186.     }
  4187.     else
  4188.     {
  4189.         CPeer * p = peer;
  4190.         p->EncodeHeader(HEADER_DG_RMCANDIDACY, dwHandle, sizeof(int) + sizeof(szName));
  4191.         p->Encode(&iRet, sizeof(int));
  4192.         p->Encode(szName, sizeof(szName));
  4193.     }
  4194. }
  4195.  
  4196. void CClientManager::SetMonarch(CPeer * peer, DWORD dwHandle, const char * data)
  4197. {
  4198.     char szName[32];
  4199.  
  4200.     strlcpy(szName, data, sizeof(szName));
  4201.  
  4202.     if (g_test_server)
  4203.         sys_log(0, "[MONARCH_GM] Set Monarch name(%s)", szName);
  4204.  
  4205.     int iRet = CMonarch::instance().SetMonarch(szName) ? 1 : 0;
  4206.  
  4207.     if (1 == iRet)
  4208.     {
  4209.         for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  4210.         {
  4211.             CPeer * p = *it;
  4212.  
  4213.             if (!p->GetChannel())
  4214.                 continue;
  4215.  
  4216.             if (p == peer)
  4217.             {
  4218.                 p->EncodeHeader(HEADER_DG_RMCANDIDACY, dwHandle, sizeof(int) + sizeof(szName));
  4219.                 p->Encode(&iRet, sizeof(int));
  4220.                 p->Encode(szName, sizeof(szName));
  4221.             }
  4222.             else
  4223.             {
  4224.                 p->EncodeHeader(HEADER_DG_RMCANDIDACY, dwHandle, sizeof(int) + sizeof(szName));
  4225.                 p->Encode(&iRet, sizeof(int));
  4226.                 p->Encode(szName, sizeof(szName));
  4227.             }
  4228.         }
  4229.     }
  4230.     else
  4231.     {
  4232.         CPeer * p = peer;
  4233.         p->EncodeHeader(HEADER_DG_RMCANDIDACY, dwHandle, sizeof(int) + sizeof(szName));
  4234.         p->Encode(&iRet, sizeof(int));
  4235.         p->Encode(szName, sizeof(szName));
  4236.     }
  4237. }
  4238.  
  4239. void CClientManager::RMMonarch(CPeer * peer, DWORD dwHandle, const char * data)
  4240. {
  4241.     char szName[32];
  4242.  
  4243.     strlcpy(szName, data, sizeof(szName));
  4244.  
  4245.     if (g_test_server)
  4246.         sys_log(0, "[MONARCH_GM] Remove Monarch name(%s)", szName);
  4247.  
  4248.     CMonarch::instance().DelMonarch(szName);
  4249.  
  4250.     int iRet = CMonarch::instance().DelMonarch(szName) ? 1 : 0;
  4251.  
  4252.     if (1 == iRet)
  4253.     {
  4254.         for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  4255.         {
  4256.             CPeer * p = *it;
  4257.  
  4258.             if (!p->GetChannel())
  4259.                 continue;
  4260.  
  4261.             if (p == peer)
  4262.             {
  4263.                 p->EncodeHeader(HEADER_DG_RMMONARCH, dwHandle, sizeof(int) + sizeof(szName));
  4264.                 p->Encode(&iRet, sizeof(int));
  4265.                 p->Encode(szName, sizeof(szName));
  4266.             }
  4267.             else
  4268.             {
  4269.                 p->EncodeHeader(HEADER_DG_RMMONARCH, dwHandle, sizeof(int) + sizeof(szName));
  4270.                 p->Encode(&iRet, sizeof(int));
  4271.                 p->Encode(szName, sizeof(szName));
  4272.             }
  4273.         }
  4274.     }
  4275.     else
  4276.     {
  4277.         CPeer * p = peer;
  4278.         p->EncodeHeader(HEADER_DG_RMCANDIDACY, dwHandle, sizeof(int) + sizeof(szName));
  4279.         p->Encode(&iRet, sizeof(int));
  4280.         p->Encode(szName, sizeof(szName));
  4281.     }
  4282. }
  4283.  
  4284. void CClientManager::ChangeMonarchLord(CPeer * peer, DWORD dwHandle, TPacketChangeMonarchLord* info)
  4285. {
  4286.     char szQuery[1024];
  4287.     snprintf(szQuery, sizeof(szQuery),
  4288.             "SELECT a.name, NOW() FROM player%s AS a, player_index%s AS b WHERE (a.account_id=b.id AND a.id=%u AND b.empire=%u) AND "
  4289. #ifdef ENABLE_PLAYER_PER_ACCOUNT5
  4290.             "(b.pid1=%u OR b.pid2=%u OR b.pid3=%u OR b.pid4=%u OR b.pid5=%u)",
  4291. #else
  4292.             "(b.pid1=%u OR b.pid2=%u OR b.pid3=%u OR b.pid4=%u)",
  4293. #endif
  4294.             GetTablePostfix(), GetTablePostfix(), info->dwPID, info->bEmpire,
  4295. #ifdef ENABLE_PLAYER_PER_ACCOUNT5
  4296.             info->dwPID, info->dwPID, info->dwPID, info->dwPID, info->dwPID);
  4297. #else
  4298.             info->dwPID, info->dwPID, info->dwPID, info->dwPID);
  4299. #endif
  4300.  
  4301.     SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER);
  4302.  
  4303.     if (pMsg->Get()->uiNumRows != 0)
  4304.     {
  4305.         TPacketChangeMonarchLordACK ack;
  4306.         ack.bEmpire = info->bEmpire;
  4307.         ack.dwPID = info->dwPID;
  4308.  
  4309.         MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
  4310.         strlcpy(ack.szName, row[0], sizeof(ack.szName));
  4311.         strlcpy(ack.szDate, row[1], sizeof(ack.szDate));
  4312.  
  4313.         snprintf(szQuery, sizeof(szQuery), "UPDATE monarch SET pid=%u, windate=NOW() WHERE empire=%d", ack.dwPID, ack.bEmpire);
  4314.         SQLMsg* pMsg2 = CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER);
  4315.  
  4316.         if (pMsg2->Get()->uiAffectedRows > 0)
  4317.         {
  4318.             CMonarch::instance().LoadMonarch();
  4319.  
  4320.             TMonarchInfo* newInfo = CMonarch::instance().GetMonarch();
  4321.  
  4322.             for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); it++)
  4323.             {
  4324.                 CPeer* client = *it;
  4325.  
  4326.                 client->EncodeHeader(HEADER_DG_CHANGE_MONARCH_LORD_ACK, 0, sizeof(TPacketChangeMonarchLordACK));
  4327.                 client->Encode(&ack, sizeof(TPacketChangeMonarchLordACK));
  4328.  
  4329.                 client->EncodeHeader(HEADER_DG_UPDATE_MONARCH_INFO, 0, sizeof(TMonarchInfo));
  4330.                 client->Encode(newInfo, sizeof(TMonarchInfo));
  4331.             }
  4332.         }
  4333.  
  4334.         delete pMsg2;
  4335.     }
  4336.  
  4337.     delete pMsg;
  4338. }
  4339.  
  4340. void CClientManager::BlockException(TPacketBlockException *data)
  4341. {
  4342.     sys_log(0, "[BLOCK_EXCEPTION] CMD(%d) login(%s)", data->cmd, data->login);
  4343.  
  4344.     // save sql
  4345.     {
  4346.         char buf[1024];
  4347.  
  4348.         switch (data->cmd)
  4349.         {
  4350.             case BLOCK_EXCEPTION_CMD_ADD:
  4351.                 snprintf(buf, sizeof(buf), "INSERT INTO block_exception VALUES('%s')", data->login);
  4352.                 CDBManager::instance().AsyncQuery(buf, SQL_ACCOUNT);
  4353.                 CBlockCountry::instance().AddBlockException(data->login);
  4354.                 break;
  4355.             case BLOCK_EXCEPTION_CMD_DEL:
  4356.                 snprintf(buf, sizeof(buf), "DELETE FROM block_exception VALUES('%s')", data->login);
  4357.                 CDBManager::instance().AsyncQuery(buf, SQL_ACCOUNT);
  4358.                 CBlockCountry::instance().DelBlockException(data->login);
  4359.                 break;
  4360.             default:
  4361.                 return;
  4362.         }
  4363.  
  4364.     }
  4365.  
  4366.     for (itertype(m_peerList) it = m_peerList.begin(); it != m_peerList.end(); ++it)
  4367.     {
  4368.         CPeer   *peer = *it;
  4369.  
  4370.         if (!peer->GetChannel())
  4371.             continue;
  4372.  
  4373.         CBlockCountry::instance().SendBlockExceptionOne(peer, data->login, data->cmd);
  4374.     }
  4375. }
  4376.  
  4377. void CClientManager::SendSpareItemIDRange(CPeer* peer)
  4378. {
  4379.     peer->SendSpareItemIDRange();
  4380. }
  4381.  
  4382. //
  4383.  
  4384. //
  4385. void CClientManager::DeleteLoginKey(TPacketDC *data)
  4386. {
  4387.     char login[LOGIN_MAX_LEN+1] = {0};
  4388.     trim_and_lower(data->login, login, sizeof(login));
  4389.  
  4390.     CLoginData *pkLD = GetLoginDataByLogin(login);
  4391.  
  4392.     if (pkLD)
  4393.     {
  4394.         TLoginDataByLoginKey::iterator it = m_map_pkLoginData.find(pkLD->GetKey());
  4395.  
  4396.         if (it != m_map_pkLoginData.end())
  4397.             m_map_pkLoginData.erase(it);
  4398.     }
  4399. }
  4400.  
  4401. // delete gift notify icon
  4402. void CClientManager::DeleteAwardId(TPacketDeleteAwardID *data)
  4403. {
  4404.     //sys_log(0,"data from game server arrived %d",data->dwID);
  4405.     std::map<DWORD, TItemAward *>::iterator it;
  4406.     it = ItemAwardManager::Instance().GetMapAward().find(data->dwID);
  4407.     if ( it != ItemAwardManager::Instance().GetMapAward().end() )
  4408.     {
  4409.         std::set<TItemAward *> & kSet = ItemAwardManager::Instance().GetMapkSetAwardByLogin()[it->second->szLogin];
  4410.         if(kSet.erase(it->second))
  4411.             sys_log(0,"erase ItemAward id: %d from cache", data->dwID);
  4412.         ItemAwardManager::Instance().GetMapAward().erase(data->dwID);
  4413.     }
  4414.     else
  4415.     {
  4416.         sys_log(0,"DELETE_AWARDID : could not find the id: %d", data->dwID);
  4417.     }
  4418.  
  4419. }
  4420.  
  4421. void CClientManager::UpdateChannelStatus(TChannelStatus* pData)
  4422. {
  4423.     TChannelStatusMap::iterator it = m_mChannelStatus.find(pData->nPort);
  4424.     if (it != m_mChannelStatus.end()) {
  4425.         it->second = pData->bStatus;
  4426.     }
  4427.     else {
  4428.         m_mChannelStatus.insert(TChannelStatusMap::value_type(pData->nPort, pData->bStatus));
  4429.     }
  4430. }
  4431.  
  4432. void CClientManager::RequestChannelStatus(CPeer* peer, DWORD dwHandle)
  4433. {
  4434.     const int nSize = m_mChannelStatus.size();
  4435.     peer->EncodeHeader(HEADER_DG_RESPOND_CHANNELSTATUS, dwHandle, sizeof(TChannelStatus)*nSize+sizeof(int));
  4436.     peer->Encode(&nSize, sizeof(int));
  4437.     for (TChannelStatusMap::iterator it = m_mChannelStatus.begin(); it != m_mChannelStatus.end(); it++) {
  4438.         peer->Encode(&it->first, sizeof(short));
  4439.         peer->Encode(&it->second, sizeof(BYTE));
  4440.     }
  4441. }
  4442.  
  4443. void CClientManager::ResetLastPlayerID(const TPacketNeedLoginLogInfo* data)
  4444. {
  4445.     CLoginData* pkLD = GetLoginDataByAID( data->dwPlayerID );
  4446.  
  4447.     if (NULL != pkLD)
  4448.     {
  4449.         pkLD->SetLastPlayerID( 0 );
  4450.     }
  4451. }
  4452.  
  4453. void CClientManager::ChargeCash(const TRequestChargeCash* packet)
  4454. {
  4455.     char szQuery[512];
  4456.  
  4457.     if (ERequestCharge_Cash == packet->eChargeType)
  4458.         sprintf(szQuery, "update account set cash = cash + %d where id = %d limit 1", packet->dwAmount, packet->dwAID);
  4459.     else if(ERequestCharge_Mileage == packet->eChargeType)
  4460.         sprintf(szQuery, "update account set mileage = mileage + %d where id = %d limit 1", packet->dwAmount, packet->dwAID);
  4461.     else
  4462.     {
  4463.         sys_err ("Invalid request charge type (type : %d, amount : %d, aid : %d)", packet->eChargeType, packet->dwAmount, packet->dwAID);
  4464.         return;
  4465.     }
  4466.  
  4467.     sys_err ("Request Charge (type : %d, amount : %d, aid : %d)", packet->eChargeType, packet->dwAmount, packet->dwAID);
  4468.  
  4469.     CDBManager::Instance().AsyncQuery(szQuery, SQL_ACCOUNT);
  4470. }
  4471.  
  4472. #ifdef __AUCTION__
  4473. void CClientManager::EnrollInAuction (CPeer * peer, DWORD owner_id, AuctionEnrollProductInfo* data)
  4474. {
  4475.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (owner_id);
  4476.  
  4477.     if (it == m_map_playerCache.end())
  4478.     {
  4479.         sys_err ("Invalid Player id %d. how can you get it?", owner_id);
  4480.         return;
  4481.     }
  4482.     CItemCache* c = GetItemCache (data->get_item_id());
  4483.  
  4484.     if (c == NULL)
  4485.     {
  4486.         sys_err ("Item %d doesn't exist in db cache.", data->get_item_id());
  4487.         return;
  4488.     }
  4489.     TPlayerItem* item = c->Get(false);
  4490.  
  4491.     if (item->owner != owner_id)
  4492.     {
  4493.         sys_err ("Player id %d doesn't have item %d.", owner_id, data->get_item_id());
  4494.         return;
  4495.     }
  4496.    
  4497.     time_t expired_time = time(0) + 24 * 60 * 60;
  4498.     TAuctionItemInfo auctioned_item_info (item->vnum, data->get_bid_price(),
  4499.         data->get_impur_price(), owner_id, "", expired_time, data->get_item_id(), 0, data->get_empire());
  4500.  
  4501.     AuctionResult result = AuctionManager::instance().EnrollInAuction( c, auctioned_item_info );
  4502.  
  4503.     if (result <= AUCTION_FAIL)
  4504.     {
  4505.         TPacketDGResultAuction enroll_result;
  4506.         enroll_result.cmd = AUCTION_ENR_AUC;
  4507.         enroll_result.target = data->get_item_id();
  4508.         enroll_result.result = result;
  4509.         peer->EncodeHeader(HEADER_DG_AUCTION_RESULT, owner_id, sizeof(TPacketDGResultAuction) + sizeof(TPlayerItem));
  4510.         peer->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4511.         peer->Encode(c->Get(false), sizeof(TPlayerItem));
  4512.     }
  4513.     else
  4514.     {
  4515.        
  4516.         TItemCacheSetPtrMap::iterator it = m_map_pkItemCacheSetPtr.find(item->owner);
  4517.  
  4518.         if (it != m_map_pkItemCacheSetPtr.end())
  4519.         {
  4520.             it->second->erase(c);
  4521.         }
  4522.         m_map_itemCache.erase(item->id);
  4523.         sys_log(0, "Enroll In Auction Success. owner_id item_id %d %d", owner_id, item->id);
  4524.  
  4525.         TPacketDGResultAuction enroll_result;
  4526.         enroll_result.cmd = AUCTION_ENR_AUC;
  4527.         enroll_result.target = data->get_item_id();
  4528.         enroll_result.result = result;
  4529.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4530.         {
  4531.             (*it)->EncodeHeader(HEADER_DG_AUCTION_RESULT, owner_id, sizeof(TPacketDGResultAuction) + sizeof(TPlayerItem) + sizeof(TAuctionItemInfo));
  4532.             (*it)->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4533.             (*it)->Encode(c->Get(false), sizeof(TPlayerItem));
  4534.             (*it)->Encode(&auctioned_item_info, sizeof(TAuctionItemInfo));
  4535.         }
  4536.     }
  4537.  
  4538.     return;
  4539. }
  4540.  
  4541. void CClientManager::EnrollInSale (CPeer * peer, DWORD owner_id, AuctionEnrollSaleInfo* data)
  4542. {
  4543.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (owner_id);
  4544.  
  4545.     if (it == m_map_playerCache.end())
  4546.     {
  4547.         sys_err ("Invalid Player id %d. how can you get it?", owner_id);
  4548.         return;
  4549.     }
  4550.  
  4551.     CPlayerTableCache* player_cache = it->second;
  4552.     TPlayerTable* player = player_cache->Get(false);
  4553.  
  4554.     CItemCache* c = GetItemCache (data->get_item_id());
  4555.  
  4556.     if (c == NULL)
  4557.     {
  4558.         sys_err ("Item %d doesn't exist in db cache.", data->get_item_id());
  4559.         return;
  4560.     }
  4561.     TPlayerItem* item = c->Get(false);
  4562.  
  4563.     if (item->owner != owner_id)
  4564.     {
  4565.         sys_err ("Player id %d doesn't have item %d.", owner_id, data->get_item_id());
  4566.         return;
  4567.     }
  4568.    
  4569.     time_t expired_time = time(0) + 24 * 60 * 60;
  4570.     TSaleItemInfo sold_item_info (item->vnum, data->get_sale_price(),
  4571.         owner_id, player->name, data->get_item_id(), data->get_wisher_id());
  4572.  
  4573.     AuctionResult result = AuctionManager::instance().EnrollInSale( c, sold_item_info );
  4574.  
  4575.     if (result <= AUCTION_FAIL)
  4576.     {
  4577.         TPacketDGResultAuction enroll_result;
  4578.         enroll_result.cmd = AUCTION_ENR_SALE;
  4579.         enroll_result.target = data->get_item_id();
  4580.         enroll_result.result = result;
  4581.         peer->EncodeHeader(HEADER_DG_AUCTION_RESULT, owner_id, sizeof(TPacketDGResultAuction) + sizeof(TPlayerItem));
  4582.         peer->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4583.         peer->Encode(c->Get(false), sizeof(TPlayerItem));
  4584.     }
  4585.     else
  4586.     {
  4587.        
  4588.         TItemCacheSetPtrMap::iterator it = m_map_pkItemCacheSetPtr.find(item->owner);
  4589.  
  4590.         if (it != m_map_pkItemCacheSetPtr.end())
  4591.         {
  4592.             it->second->erase(c);
  4593.         }
  4594.         m_map_itemCache.erase(item->id);
  4595.         sys_log(0, "Enroll In Sale Success. owner_id item_id %d %d", owner_id, item->id);
  4596.  
  4597.         TPacketDGResultAuction enroll_result;
  4598.         enroll_result.cmd = AUCTION_ENR_SALE;
  4599.         enroll_result.target = data->get_item_id();
  4600.         enroll_result.result = result;
  4601.  
  4602.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4603.         {
  4604.             (*it)->EncodeHeader(HEADER_DG_AUCTION_RESULT, owner_id, sizeof(TPacketDGResultAuction) + sizeof(TPlayerItem) + sizeof(TSaleItemInfo));
  4605.             (*it)->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4606.             (*it)->Encode(c->Get(false), sizeof(TPlayerItem));
  4607.             (*it)->Encode(&sold_item_info, sizeof(TSaleItemInfo));
  4608.         }
  4609.     }
  4610.  
  4611.     return;
  4612. }
  4613.  
  4614. void CClientManager::EnrollInWish (CPeer * peer, DWORD wisher_id, AuctionEnrollWishInfo* data)
  4615. {
  4616.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (wisher_id);
  4617.  
  4618.     if (it == m_map_playerCache.end())
  4619.     {
  4620.         sys_err ("Invalid Player id %d. how can you get it?", wisher_id);
  4621.         return;
  4622.     }
  4623.  
  4624.     CPlayerTableCache* player_cache = it->second;
  4625.     TPlayerTable* player = player_cache->Get(false);
  4626.  
  4627.    
  4628.     time_t expired_time = time(0) + 24 * 60 * 60;
  4629.     TWishItemInfo wished_item_info (data->get_item_num(), data->get_wish_price(), wisher_id, player->name, expired_time, data->get_empire());
  4630.  
  4631.     AuctionResult result = AuctionManager::instance().EnrollInWish ( wished_item_info );
  4632.  
  4633.     if (result <= AUCTION_FAIL)
  4634.     {
  4635.         sys_log(0, "Enroll In Wish Success. wisher_id item_num %d %d", wisher_id, data->get_item_num());
  4636.  
  4637.         TPacketDGResultAuction enroll_result;
  4638.         enroll_result.cmd = AUCTION_ENR_WISH;
  4639.         enroll_result.target = data->get_item_num();
  4640.         enroll_result.result = result;
  4641.         peer->EncodeHeader(HEADER_DG_AUCTION_RESULT, wisher_id, sizeof(TPacketDGResultAuction));
  4642.         peer->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4643.     }
  4644.     else
  4645.     {
  4646.         sys_log(0, "Enroll In Wish Fail. wisher_id item_num %d %d", wisher_id, data->get_item_num());
  4647.  
  4648.         TPacketDGResultAuction enroll_result;
  4649.         enroll_result.cmd = AUCTION_ENR_WISH;
  4650.         enroll_result.target = data->get_item_num();
  4651.         enroll_result.result = result;
  4652.  
  4653.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4654.         {
  4655.             (*it)->EncodeHeader(HEADER_DG_AUCTION_RESULT, wisher_id, sizeof(TPacketDGResultAuction) + sizeof(TWishItemInfo));
  4656.             (*it)->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4657.             (*it)->Encode(&wished_item_info, sizeof(TWishItemInfo));
  4658.         }
  4659.     }
  4660.  
  4661.     return;
  4662. }
  4663.  
  4664. void CClientManager::AuctionBid (CPeer * peer, DWORD bidder_id, AuctionBidInfo* data)
  4665. {
  4666.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (bidder_id);
  4667.  
  4668.     if (it == m_map_playerCache.end())
  4669.     {
  4670.         sys_err ("Invalid Player id %d. how can you get it?", bidder_id);
  4671.         return;
  4672.     }
  4673.  
  4674.     CPlayerTableCache* player_cache = it->second;
  4675.     TPlayerTable* player = player_cache->Get(false);
  4676.  
  4677.     AuctionResult result = AuctionManager::instance().Bid(bidder_id, player->name, data->get_item_id(), data->get_bid_price());
  4678.  
  4679.     if (result == AUCTION_FAIL)
  4680.     {
  4681.         sys_log(0, "Bid Fail. bidder_id item_id %d %d", bidder_id, data->get_item_id());
  4682.     }
  4683.     else
  4684.     {
  4685.         sys_log(0, "Bid Success. bidder_id item_id %d %d", bidder_id, data->get_item_id());
  4686.     }
  4687.  
  4688.     if (result <= AUCTION_FAIL)
  4689.     {
  4690.         TPacketDGResultAuction enroll_result;
  4691.         enroll_result.cmd = AUCTION_BID;
  4692.         enroll_result.target = data->get_bid_price();
  4693.         enroll_result.result = result;
  4694.  
  4695.         peer->EncodeHeader(HEADER_DG_AUCTION_RESULT, bidder_id, sizeof(TPacketDGResultAuction) + sizeof(AuctionBidInfo));
  4696.         peer->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4697.     }
  4698.     else
  4699.     {
  4700.         TPacketDGResultAuction enroll_result;
  4701.         enroll_result.cmd = AUCTION_BID;
  4702.         enroll_result.target = data->get_item_id();
  4703.         enroll_result.result = result;
  4704.  
  4705.         TAuctionItemInfo* auctioned_item_info = AuctionManager::instance().GetAuctionItemInfoCache(data->get_item_id())->Get(false);
  4706.  
  4707.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4708.         {
  4709.             (*it)->EncodeHeader(HEADER_DG_AUCTION_RESULT, bidder_id, sizeof(TPacketDGResultAuction) + sizeof(TAuctionItemInfo));
  4710.             (*it)->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4711.             (*it)->Encode(auctioned_item_info, sizeof(TAuctionItemInfo));
  4712.         }
  4713.  
  4714.     }
  4715.     return;
  4716. }
  4717.  
  4718. void CClientManager::AuctionImpur (CPeer * peer, DWORD purchaser_id, AuctionImpurInfo* data)
  4719. {
  4720.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (purchaser_id);
  4721.  
  4722.     if (it == m_map_playerCache.end())
  4723.     {
  4724.         sys_err ("Invalid Player id %d. how can you get it?", purchaser_id);
  4725.         return;
  4726.     }
  4727.  
  4728.     CPlayerTableCache* player_cache = it->second;
  4729.     TPlayerTable* player = player_cache->Get(false);
  4730.  
  4731.     AuctionResult result = AuctionManager::instance().Impur(purchaser_id, player->name, data->get_item_id());
  4732.  
  4733.     if (result == AUCTION_FAIL)
  4734.     {
  4735.         sys_log(0, "Impur Fail. purchaser_id item_id %d %d", purchaser_id, data->get_item_id());
  4736.     }
  4737.     else
  4738.     {
  4739.         sys_log(0, "Impur Success. purchaser_id item_id %d %d", purchaser_id, data->get_item_id());
  4740.     }
  4741.  
  4742.     if (result <= AUCTION_FAIL)
  4743.     {
  4744.         TPacketDGResultAuction enroll_result;
  4745.         enroll_result.cmd = AUCTION_IMME_PUR;
  4746.         enroll_result.target = data->get_item_id();
  4747.         enroll_result.result = result;
  4748.  
  4749.         peer->EncodeHeader(HEADER_DG_AUCTION_RESULT, purchaser_id, sizeof(TPacketDGResultAuction));
  4750.         peer->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4751.     }
  4752.     else
  4753.     {
  4754.         TPacketDGResultAuction enroll_result;
  4755.         enroll_result.cmd = AUCTION_IMME_PUR;
  4756.         enroll_result.target = data->get_item_id();
  4757.         enroll_result.result = result;
  4758.  
  4759.         TAuctionItemInfo* auctioned_item_info = AuctionManager::instance().GetAuctionItemInfoCache(data->get_item_id())->Get(false);
  4760.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4761.         {
  4762.             (*it)->EncodeHeader(HEADER_DG_AUCTION_RESULT, purchaser_id, sizeof(TPacketDGResultAuction) + sizeof(TAuctionItemInfo));
  4763.             (*it)->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  4764.             (*it)->Encode(auctioned_item_info, sizeof(TAuctionItemInfo));
  4765.         }
  4766.     }
  4767.     return;
  4768. }
  4769.  
  4770. void CClientManager::AuctionGetAuctionedItem (CPeer * peer, DWORD actor_id, DWORD item_id)
  4771. {
  4772.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (actor_id);
  4773.     AuctionResult result = AUCTION_FAIL;
  4774.     if (it == m_map_playerCache.end())
  4775.     {
  4776.         sys_err ("Invalid Player id %d. how can you get it?", actor_id);
  4777.         return;
  4778.     }
  4779.  
  4780.     TPlayerItem item;
  4781.     result = AuctionManager::instance().GetAuctionedItem(actor_id, item_id, item);
  4782.  
  4783.     if (result <= AUCTION_FAIL)
  4784.     {
  4785.         TPacketDGResultAuction enroll_result;
  4786.         enroll_result.cmd = AUCTION_GET_AUC;
  4787.         enroll_result.target = item_id;
  4788.         enroll_result.result = result;
  4789.  
  4790.         peer->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction));
  4791.         peer->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4792.     }
  4793.     else
  4794.     {
  4795.         TPacketDGResultAuction enroll_result;
  4796.         enroll_result.cmd = AUCTION_GET_AUC;
  4797.         enroll_result.target = item_id;
  4798.         enroll_result.result = result;
  4799.  
  4800.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4801.         {
  4802.             (*it)->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction) + sizeof(TPlayerItem));
  4803.             (*it)->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4804.             (*it)->Encode (&item, sizeof(TPlayerItem));
  4805.         }
  4806.     }
  4807.     return;
  4808. }
  4809.  
  4810. void CClientManager::AuctionBuySoldItem (CPeer * peer, DWORD actor_id, DWORD item_id)
  4811. {
  4812.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (actor_id);
  4813.     AuctionResult result = AUCTION_FAIL;
  4814.     if (it == m_map_playerCache.end())
  4815.     {
  4816.         sys_err ("Invalid Player id %d. how can you get it?", actor_id);
  4817.         return;
  4818.     }
  4819.  
  4820.     TPlayerItem item;
  4821.     result = AuctionManager::instance().BuySoldItem(actor_id, item_id, item);
  4822.  
  4823.     if (result <= AUCTION_FAIL)
  4824.     {
  4825.         TPacketDGResultAuction enroll_result;
  4826.         enroll_result.cmd = AUCTION_BUY_SOLD;
  4827.         enroll_result.target = item_id;
  4828.         enroll_result.result = result;
  4829.  
  4830.         peer->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction));
  4831.         peer->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4832.     }
  4833.     else
  4834.     {
  4835.         TPacketDGResultAuction enroll_result;
  4836.         enroll_result.cmd = AUCTION_BUY_SOLD;
  4837.         enroll_result.target = item_id;
  4838.         enroll_result.result = result;
  4839.  
  4840.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4841.         {
  4842.             (*it)->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction) + sizeof(TPlayerItem));
  4843.             (*it)->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4844.             (*it)->Encode (&item, sizeof(TPlayerItem));
  4845.         }
  4846.     }
  4847.     return;
  4848. }
  4849.  
  4850. void CClientManager::AuctionCancelAuction (CPeer * peer, DWORD actor_id, DWORD item_id)
  4851. {
  4852.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (actor_id);
  4853.     AuctionResult result = AUCTION_FAIL;
  4854.     if (it == m_map_playerCache.end())
  4855.     {
  4856.         sys_err ("Invalid Player id %d. how can you get it?", actor_id);
  4857.         return;
  4858.     }
  4859.  
  4860.     TPlayerItem item;
  4861.     result = AuctionManager::instance().CancelAuction(actor_id, item_id, item);
  4862.  
  4863.     if (result <= AUCTION_FAIL)
  4864.     {
  4865.         TPacketDGResultAuction enroll_result;
  4866.         enroll_result.cmd = AUCTION_CANCEL_AUC;
  4867.         enroll_result.target = item_id;
  4868.         enroll_result.result = result;
  4869.  
  4870.         peer->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction));
  4871.         peer->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4872.     }
  4873.     else
  4874.     {
  4875.         TPacketDGResultAuction enroll_result;
  4876.         enroll_result.cmd = AUCTION_CANCEL_AUC;
  4877.         enroll_result.target = item_id;
  4878.         enroll_result.result = result;
  4879.  
  4880.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4881.         {
  4882.             (*it)->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction) + sizeof(TPlayerItem));
  4883.             (*it)->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4884.             (*it)->Encode (&item, sizeof(TPlayerItem));
  4885.         }
  4886.     }
  4887.     return;
  4888. }
  4889.  
  4890. void CClientManager::AuctionCancelWish (CPeer * peer, DWORD actor_id, DWORD item_num)
  4891. {
  4892.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (actor_id);
  4893.     AuctionResult result = AUCTION_FAIL;
  4894.     if (it == m_map_playerCache.end())
  4895.     {
  4896.         sys_err ("Invalid Player id %d. how can you get it?", actor_id);
  4897.         return;
  4898.     }
  4899.  
  4900.     TPlayerItem item;
  4901.     result = AuctionManager::instance().CancelWish(actor_id, item_num);
  4902.  
  4903.     if (result <= AUCTION_FAIL)
  4904.     {
  4905.         TPacketDGResultAuction enroll_result;
  4906.         enroll_result.cmd = AUCTION_CANCEL_WISH;
  4907.         enroll_result.target = item_num;
  4908.         enroll_result.result = result;
  4909.  
  4910.         peer->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction));
  4911.         peer->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4912.     }
  4913.     else
  4914.     {
  4915.         TPacketDGResultAuction enroll_result;
  4916.         enroll_result.cmd = AUCTION_CANCEL_WISH;
  4917.         enroll_result.target = item_num;
  4918.         enroll_result.result = result;
  4919.  
  4920.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4921.         {
  4922.             (*it)->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction));
  4923.             (*it)->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4924.         }
  4925.     }
  4926.     return;
  4927. }
  4928.  
  4929. void CClientManager::AuctionCancelSale (CPeer * peer, DWORD actor_id, DWORD item_id)
  4930. {
  4931.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (actor_id);
  4932.     AuctionResult result = AUCTION_FAIL;
  4933.     if (it == m_map_playerCache.end())
  4934.     {
  4935.         sys_err ("Invalid Player id %d. how can you get it?", actor_id);
  4936.         return;
  4937.     }
  4938.  
  4939.     TPlayerItem item;
  4940.     result = AuctionManager::instance().CancelSale(actor_id, item_id, item);
  4941.  
  4942.     if (result <= AUCTION_FAIL)
  4943.     {
  4944.         TPacketDGResultAuction enroll_result;
  4945.         enroll_result.cmd = AUCTION_CANCEL_SALE;
  4946.         enroll_result.target = item_id;
  4947.         enroll_result.result = result;
  4948.  
  4949.         peer->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction));
  4950.         peer->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4951.     }
  4952.     else
  4953.     {
  4954.         TPacketDGResultAuction enroll_result;
  4955.         enroll_result.cmd = AUCTION_CANCEL_SALE;
  4956.         enroll_result.target = item_id;
  4957.         enroll_result.result = result;
  4958.  
  4959.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  4960.         {
  4961.             (*it)->EncodeHeader (HEADER_DG_AUCTION_RESULT, actor_id, sizeof(TPacketDGResultAuction) + sizeof(TPlayerItem));
  4962.             (*it)->Encode (&enroll_result, sizeof(TPacketDGResultAuction));
  4963.             (*it)->Encode (&item, sizeof(TPlayerItem));
  4964.         }
  4965.     }
  4966.     return;
  4967. }
  4968.  
  4969. void CClientManager::AuctionDeleteAuctionItem (CPeer * peer, DWORD actor_id, DWORD item_id)
  4970. {
  4971.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (actor_id);
  4972.     AuctionResult result = AUCTION_FAIL;
  4973.     if (it == m_map_playerCache.end())
  4974.     {
  4975.         sys_err ("Invalid Player id %d. how can you get it?", actor_id);
  4976.         return;
  4977.     }
  4978.  
  4979.     AuctionManager::instance().DeleteAuctionItem (actor_id, item_id);
  4980. }
  4981. void CClientManager::AuctionDeleteSaleItem (CPeer * peer, DWORD actor_id, DWORD item_id)
  4982. {
  4983.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (actor_id);
  4984.     AuctionResult result = AUCTION_FAIL;
  4985.     if (it == m_map_playerCache.end())
  4986.     {
  4987.         sys_err ("Invalid Player id %d. how can you get it?", actor_id);
  4988.         return;
  4989.     }
  4990.  
  4991.     AuctionManager::instance().DeleteSaleItem (actor_id, item_id);
  4992. }
  4993.  
  4994. void CClientManager::AuctionReBid (CPeer * peer, DWORD bidder_id, AuctionBidInfo* data)
  4995. {
  4996.     TPlayerTableCacheMap::iterator it = m_map_playerCache.find (bidder_id);
  4997.  
  4998.     if (it == m_map_playerCache.end())
  4999.     {
  5000.         sys_err ("Invalid Player id %d. how can you get it?", bidder_id);
  5001.         return;
  5002.     }
  5003.  
  5004.     CPlayerTableCache* player_cache = it->second;
  5005.     TPlayerTable* player = player_cache->Get(false);
  5006.  
  5007.     AuctionResult result = AuctionManager::instance().ReBid(bidder_id, player->name, data->get_item_id(), data->get_bid_price());
  5008.  
  5009.     if (result == AUCTION_FAIL)
  5010.     {
  5011.         sys_log(0, "ReBid Fail. bidder_id item_id %d %d", bidder_id, data->get_item_id());
  5012.     }
  5013.     else
  5014.     {
  5015.         sys_log(0, "ReBid Success. bidder_id item_id %d %d", bidder_id, data->get_item_id());
  5016.     }
  5017.  
  5018.     if (result <= AUCTION_FAIL)
  5019.     {
  5020.         TPacketDGResultAuction enroll_result;
  5021.         enroll_result.cmd = AUCTION_REBID;
  5022.         enroll_result.target = data->get_item_id();
  5023.         enroll_result.result = result;
  5024.  
  5025.         peer->EncodeHeader(HEADER_DG_AUCTION_RESULT, bidder_id, sizeof(TPacketDGResultAuction) + sizeof(int));
  5026.         peer->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  5027.         peer->EncodeDWORD(data->get_bid_price());
  5028.     }
  5029.     else
  5030.     {
  5031.         TPacketDGResultAuction enroll_result;
  5032.         enroll_result.cmd = AUCTION_REBID;
  5033.         enroll_result.target = data->get_item_id();
  5034.         enroll_result.result = result;
  5035.  
  5036.         TAuctionItemInfo* auctioned_item_info = AuctionManager::instance().GetAuctionItemInfoCache(data->get_item_id())->Get(false);
  5037.  
  5038.         for (TPeerList::iterator it = m_peerList.begin(); it != m_peerList.end(); it++)
  5039.         {
  5040.             (*it)->EncodeHeader(HEADER_DG_AUCTION_RESULT, bidder_id, sizeof(TPacketDGResultAuction) + sizeof(TAuctionItemInfo));
  5041.             (*it)->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  5042.             (*it)->Encode(auctioned_item_info, sizeof(TAuctionItemInfo));
  5043.         }
  5044.     }
  5045.     return;
  5046. }
  5047.  
  5048. void CClientManager::AuctionBidCancel (CPeer * peer, DWORD bidder_id, DWORD item_id)
  5049. {
  5050.     AuctionResult result = AuctionManager::instance().BidCancel (bidder_id, item_id);
  5051.  
  5052.     if (result <= AUCTION_FAIL)
  5053.     {
  5054.         TPacketDGResultAuction enroll_result;
  5055.         enroll_result.cmd = AUCTION_BID_CANCEL;
  5056.         enroll_result.target = item_id;
  5057.         enroll_result.result = result;
  5058.  
  5059.         peer->EncodeHeader(HEADER_DG_AUCTION_RESULT, bidder_id, sizeof(TPacketDGResultAuction));
  5060.         peer->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  5061.     }
  5062.     else
  5063.     {
  5064.         TPacketDGResultAuction enroll_result;
  5065.         enroll_result.cmd = AUCTION_BID_CANCEL;
  5066.         enroll_result.target = item_id;
  5067.         enroll_result.result = result;
  5068.  
  5069.         peer->EncodeHeader(HEADER_DG_AUCTION_RESULT, bidder_id, sizeof(TPacketDGResultAuction));
  5070.         peer->Encode(&enroll_result, sizeof(TPacketDGResultAuction));
  5071.     }
  5072. }
  5073. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement