Advertisement
Guest User

Untitled

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