2851 lines
No EOL
88 KiB
C++
2851 lines
No EOL
88 KiB
C++
|
||
#include "stdafx.h"
|
||
#include "DataManager.h"
|
||
#include "XMLParser.h"
|
||
#include "Log.h"
|
||
#include "URLUpdater.h"
|
||
#include "CommonMacros.h"
|
||
#include <fstream>
|
||
#include <iostream>
|
||
#include "DNServerPacket.h"
|
||
#include "DNServerDef.h"
|
||
|
||
|
||
extern TServiceManagerConfig g_Config;
|
||
CDataManager::CDataManager()
|
||
{
|
||
memset(m_szServiceIP, 0, sizeof(m_szServiceIP));
|
||
m_nServicePort = 0;
|
||
memset(m_DoorsInfo.wszIP, 0, sizeof(m_DoorsInfo.wszIP));
|
||
m_DoorsInfo.nPort = 0;
|
||
}
|
||
|
||
CDataManager::~CDataManager()
|
||
{
|
||
ClearUserData();
|
||
ClearData();
|
||
}
|
||
|
||
bool CDataManager::SaveUser()
|
||
{
|
||
if (m_MonitorUserData.empty())
|
||
{
|
||
TMonitorUserData Eye;
|
||
strncpy_s (Eye.szUserName, "eyeadmin", NAMELENMAX);
|
||
strncpy_s (Eye.szPassWord, "1111", PASSWORDLENMAX);
|
||
Eye.nMonitorLevel = SERVERMONITOR_LEVEL_SUPERADMIN;
|
||
Eye.bDuplicateLogin = true;
|
||
m_MonitorUserData.push_back(Eye);
|
||
|
||
TMonitorUserData Super;
|
||
strncpy_s (Super.szUserName, "super", NAMELENMAX);
|
||
strncpy_s (Super.szPassWord, "1111", PASSWORDLENMAX);
|
||
Super.nMonitorLevel = SERVERMONITOR_LEVEL_SUPERADMIN;
|
||
Super.bDuplicateLogin = true;
|
||
m_MonitorUserData.push_back(Super);
|
||
|
||
TMonitorUserData Admin;
|
||
strncpy_s (Admin.szUserName, "admin", NAMELENMAX);
|
||
strncpy_s (Admin.szPassWord, "1111", PASSWORDLENMAX);
|
||
Admin.nMonitorLevel = SERVERMONITOR_LEVEL_ADMIN;
|
||
Admin.bDuplicateLogin = true;
|
||
m_MonitorUserData.push_back(Admin);
|
||
|
||
TMonitorUserData Monitor;
|
||
strncpy_s (Monitor.szUserName, "monitor", NAMELENMAX);
|
||
strncpy_s (Monitor.szPassWord, "1111", PASSWORDLENMAX);
|
||
Monitor.nMonitorLevel = SERVERMONITOR_LEVEL_MONITOR;
|
||
Monitor.bDuplicateLogin = true;
|
||
m_MonitorUserData.push_back(Monitor);
|
||
}
|
||
|
||
std::ofstream outFile("./System/MonitorUser.bin", ios::binary | ios::out);
|
||
if (!outFile)
|
||
{
|
||
g_Log.Log(LogType::_FILELOG, L"fail to write MonitorUser.bin\r\n");
|
||
return false;
|
||
}
|
||
|
||
for (int i=0; i<(int)m_MonitorUserData.size(); i++)
|
||
outFile.write ((char*)&m_MonitorUserData[i], sizeof(m_MonitorUserData[i]));
|
||
outFile.close();
|
||
|
||
return true;
|
||
}
|
||
|
||
int CDataManager::ChangeUserPassword(TChangePassword* pData)
|
||
{
|
||
bool bChange = false;
|
||
for (int i=0; i<(int)m_MonitorUserData.size(); i++)
|
||
{
|
||
if (!strcmp(m_MonitorUserData[i].szUserName, pData->szUserName))
|
||
{
|
||
strncpy_s(m_MonitorUserData[i].szPassWord, pData->szPassWord, PASSWORDLENMAX);
|
||
m_MonitorUserData[i].bDuplicateLogin = true;
|
||
m_MonitorUserData[i].nMonitorLevel = pData->nMonitorLevel;
|
||
bChange = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (!bChange)
|
||
{
|
||
TMonitorUserData New;
|
||
strncpy_s (New.szUserName, pData->szUserName, NAMELENMAX);
|
||
strncpy_s (New.szPassWord, pData->szPassWord, PASSWORDLENMAX);
|
||
New.nMonitorLevel = pData->nMonitorLevel;
|
||
New.bDuplicateLogin = true;
|
||
m_MonitorUserData.push_back(New);
|
||
}
|
||
|
||
SaveUser();
|
||
|
||
return ERROR_NONE;
|
||
}
|
||
|
||
bool CDataManager::LoadUser()
|
||
{
|
||
ClearUserData();
|
||
|
||
ifstream inFile ("./System/MonitorUser.bin", ios::binary | ios::in);
|
||
if (!inFile)
|
||
{
|
||
g_Log.Log(LogType::_FILELOG, L"fail to open MonitorUser.bin\r\n");
|
||
SaveUser();
|
||
}
|
||
|
||
TMonitorUserData User;
|
||
while (inFile.read((char*)&User, sizeof(User))) {
|
||
m_MonitorUserData.push_back(User);
|
||
}
|
||
|
||
inFile.close();
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDataManager::ConstructServerStruct()
|
||
{
|
||
//sid connection data<74><61> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
|
||
//sid con <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD>
|
||
//std::vector <std::pair<int, std::vector <const TDefaultServerConstructData*>>> vDBList, vLogList;
|
||
std::vector <std::pair<int, std::vector <const TDefaultServerConstructData*>>> vDBList;
|
||
std::vector <const TDefaultServerConstructData*> vLogList;
|
||
for (int j = 0; j < (int)m_vWorldList.size(); j++)
|
||
{
|
||
std::vector <const TDefaultServerConstructData*> vTemp;
|
||
GetServerCountFromPreconstruct(m_vWorldList[j], MANAGED_TYPE_DB, vTemp);
|
||
vDBList.push_back(std::make_pair(m_vWorldList[j], vTemp));
|
||
vTemp.clear();
|
||
|
||
GetServerCountFromPreconstruct(m_vWorldList[j], MANAGED_TYPE_LOG, vLogList);
|
||
}
|
||
std::vector <const TDefaultServerConstructData*>::iterator itorLogList = vLogList.begin();
|
||
|
||
//<2F>α<CEB1><D7BC><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǹǷ<C7B9> <20>ݺ<EFBFBD><DDBA>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
||
/*std::vector <std::pair<int, std::vector <const TDefaultServerConstructData*>::iterator>> vLogSIDItorList;
|
||
for (int j = 0; j < (int)vLogList.size(); j++)
|
||
vLogSIDItorList.push_back(std::make_pair(vLogList[j].first, vLogList[j].second.begin()));*/
|
||
|
||
CURLUpdater url;
|
||
std::map <int, TDefaultServerConstructData*>::iterator ii;
|
||
for (int h = 0; h < 2; h++)
|
||
{
|
||
for (int i = 1; i < MANAGED_TYPE_MAX; i++)
|
||
{
|
||
for (ii = m_PreServerStructData.PreStructList.begin(); ii != m_PreServerStructData.PreStructList.end(); ii++)
|
||
{
|
||
if (i == 1 && (*ii).second->nServerType != MANAGED_TYPE_LOG) continue;
|
||
else if (i == 2 && (*ii).second->nServerType != MANAGED_TYPE_DB) continue;
|
||
else if (i == 3 && (*ii).second->nServerType != MANAGED_TYPE_LOGIN) continue;
|
||
else if (i == 4 && (*ii).second->nServerType != MANAGED_TYPE_CASH) continue;
|
||
else if (i == 5 && (*ii).second->nServerType != MANAGED_TYPE_MASTER) continue;
|
||
else if (i == 6 && (*ii).second->nServerType != MANAGED_TYPE_VILLAGE) continue;
|
||
else if (i == 7 && (*ii).second->nServerType != MANAGED_TYPE_GAME) continue;
|
||
|
||
std::map <int, TServerExcuteData>::iterator itor;
|
||
if (h == 0)
|
||
{
|
||
itor = m_ServerExcuteData.find((*ii).second->nSID);
|
||
if (itor != m_ServerExcuteData.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConstructServerStruct] m_ServerExcuteData can not find SID from m_PreServerStructData 1" );
|
||
return false;
|
||
}
|
||
|
||
TServerExcuteData Excute;
|
||
|
||
Excute.nSID = (*ii).second->nSID;
|
||
Excute.nServerType = (*ii).second->nServerType;
|
||
Excute.nPatchType = url.GetPatchServerType((*ii).second->wszType);
|
||
Excute.nAssignedLauncherID = (*ii).second->nAssignedLauncher;
|
||
STRCPYW(Excute.wszType, 8, (*ii).second->wszType);
|
||
|
||
Excute.nCreateIndex = GetAssignedCreateLastIndex(Excute.nAssignedLauncherID, Excute.wszType);
|
||
Excute.nCreateCount = Excute.nCreateIndex + 1;
|
||
SetAssignedCreateCount(Excute.nAssignedLauncherID, Excute.wszType, Excute.nCreateIndex + 1);
|
||
|
||
m_ServerExcuteData.insert(std::make_pair(Excute.nSID, Excute));
|
||
|
||
itor = m_ServerExcuteData.find(Excute.nSID);
|
||
if (itor != m_ServerExcuteData.end())
|
||
{
|
||
std::map<unsigned long, TNetLauncher*>::iterator iterlauncher = m_NetLauncherList.find(Excute.nAssignedLauncherID);
|
||
if (iterlauncher == m_NetLauncherList.end())
|
||
return false;
|
||
|
||
(*iterlauncher).second->ExcuteList.push_back(&(*itor).second);
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConstructServerStruct] m_ServerExcuteData can not find Excute.nSID" );
|
||
return false;
|
||
}
|
||
|
||
if ((*ii).second->nServerType != MANAGED_TYPE_LOG) //<2F>α<EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>ƴϸ<C6B4>
|
||
{
|
||
//check log sid connection
|
||
bool bNeedLogCon = true;
|
||
std::vector <TSIDBaseConnectionInfo>::iterator tempSIDCon;
|
||
for (tempSIDCon = (*ii).second->SIDConnectionList.begin(); tempSIDCon != (*ii).second->SIDConnectionList.end(); tempSIDCon++)
|
||
{
|
||
if ((*tempSIDCon).nType == MANAGED_TYPE_LOG)
|
||
{
|
||
bNeedLogCon = false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (bNeedLogCon && itorLogList != vLogList.end())
|
||
{
|
||
//SID connection<6F><6E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴϴ<DDB4>.
|
||
TSIDBaseConnectionInfo SIDConInfo;
|
||
memset(&SIDConInfo, 0, sizeof(TSIDBaseConnectionInfo));
|
||
|
||
SIDConInfo.nSID = (*itorLogList)->nSID;
|
||
SIDConInfo.nType = GetServerType(L"Log");
|
||
(*ii).second->SIDConnectionList.push_back(SIDConInfo);
|
||
|
||
itorLogList++;
|
||
if (itorLogList == vLogList.end())
|
||
itorLogList = vLogList.begin();
|
||
|
||
//int nWorldID = (*ii).second->nWorldIDList[0]; //<2F><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD>带 <20>⺻<EFBFBD><E2BABB><EFBFBD><EFBFBD> <20>մϴ<D5B4>.
|
||
|
||
//std::vector <std::pair<int, std::vector <const TDefaultServerConstructData*>::iterator>>::iterator vWorldLogSIDItor;
|
||
//for (vWorldLogSIDItor = vLogSIDItorList.begin(); vWorldLogSIDItor != vLogSIDItorList.end(); vWorldLogSIDItor++)
|
||
//{
|
||
// if ((*vWorldLogSIDItor).first == nWorldID)
|
||
// {
|
||
// TSIDBaseConnectionInfo SIDConInfo;
|
||
// memset(&SIDConInfo, 0, sizeof(TSIDBaseConnectionInfo));
|
||
|
||
// SIDConInfo.nSID = (*(*vWorldLogSIDItor).second)->nSID;
|
||
// SIDConInfo.nType = GetServerType(L"Log");
|
||
// (*ii).second->SIDConnectionList.push_back(SIDConInfo);
|
||
|
||
// (*vWorldLogSIDItor).second++;
|
||
// for (int j = 0; j < (int)vLogList.size(); j++)
|
||
// {
|
||
// if (nWorldID == vLogList[j].first)
|
||
// {
|
||
// if ((*vWorldLogSIDItor).second == vLogList[j].second.end())
|
||
// (*vWorldLogSIDItor).second = vLogList[j].second.begin();
|
||
// break;
|
||
// }
|
||
// }
|
||
// break;
|
||
// }
|
||
//}
|
||
}
|
||
|
||
if ((*ii).second->nServerType != MANAGED_TYPE_VILLAGE && (*ii).second->nServerType != MANAGED_TYPE_GAME) continue; //<2F><><EFBFBD>Ӱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD>
|
||
bool bNeedDBCon = true;
|
||
for (tempSIDCon = (*ii).second->SIDConnectionList.begin(); tempSIDCon != (*ii).second->SIDConnectionList.end(); tempSIDCon++)
|
||
{
|
||
if ((*tempSIDCon).nType == MANAGED_TYPE_DB)
|
||
{
|
||
bNeedDBCon = false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (bNeedDBCon)
|
||
{
|
||
//SID connection<6F><6E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴϴ<DDB4>.
|
||
int nWorldID = (*ii).second->nWorldIDList[0]; //<2F><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD>带 <20>⺻<EFBFBD><E2BABB><EFBFBD><EFBFBD> <20>մϴ<D5B4>.
|
||
|
||
for (int j = 0; j < (int)vDBList.size(); j++)
|
||
{
|
||
if (vDBList[j].first == nWorldID)
|
||
{
|
||
for (int f = 0; f < (int)vDBList[j].second.size(); f++)
|
||
{
|
||
int nTempType = (*vDBList[j].second[f]).nForServerType;
|
||
if ((*vDBList[j].second[f]).nForServerType != MANAGED_TYPE_NONE)
|
||
{
|
||
//<2F><>ü<EFBFBD><C3BC> Ŀ<><C4BF><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><F1BCADB9><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> Ȯ<><C8AE>
|
||
if ((*ii).second->nServerType != (*vDBList[j].second[f]).nForServerType)
|
||
continue;
|
||
}
|
||
|
||
TSIDBaseConnectionInfo SIDConInfo;
|
||
memset(&SIDConInfo, 0, sizeof(TSIDBaseConnectionInfo));
|
||
|
||
SIDConInfo.nSID = (*vDBList[j].second[f]).nSID;
|
||
SIDConInfo.nType = GetServerType(L"DB");
|
||
(*ii).second->SIDConnectionList.push_back(SIDConInfo);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
itor = m_ServerExcuteData.find((*ii).second->nSID);
|
||
if (itor != m_ServerExcuteData.end())
|
||
MakeWord((*ii).second, (*itor).second.wstrExcuteData, (*itor).second.nCreateIndex, (*itor).second.nCreateCount);
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConstructServerStruct] m_ServerExcuteData can not find nSID from m_PreServerStructData 2" );
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
std::vector<std::pair<int, std::wstring>> vTTemp;
|
||
|
||
std::map <int, TServerExcuteData>::iterator finder;
|
||
for (finder = m_ServerExcuteData.begin(); finder != m_ServerExcuteData.end(); finder++)
|
||
{
|
||
if ((*finder).second.nServerType == MANAGED_TYPE_DB)
|
||
{
|
||
int nPort;
|
||
GetFirstRightIntValue(L"dbp", (*finder).second.wstrExcuteData.c_str(), nPort);
|
||
|
||
const TNetLauncher * pTTLauncher = GetLauncherInfobyID((*finder).second.nAssignedLauncherID);
|
||
std::wstring wwstring = pTTLauncher->szIP;
|
||
|
||
std::vector<std::pair<int, std::wstring>>::iterator iitemp;
|
||
for (iitemp = vTTemp.begin(); iitemp != vTTemp.end(); iitemp++)
|
||
{
|
||
if ((*iitemp).first == nPort && !wcsicmp((*iitemp).second.c_str(), pTTLauncher->szIP))
|
||
_ASSERT_EXPR(0, L"[ConstructServerStruct] Invalid Launcher IP" );
|
||
}
|
||
|
||
vTTemp.push_back(std::make_pair(nPort, wwstring));
|
||
}
|
||
|
||
if ((*finder).second.nServerType == MANAGED_TYPE_CASH || (*finder).second.nServerType == MANAGED_TYPE_MASTER)
|
||
{
|
||
//ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD> <20><><EFBFBD>ϸӽſ<D3BD> <20>ΰ<EFBFBD><CEB0>̻<EFBFBD> <20>Ҵ<EFBFBD><D2B4>Ǿ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>
|
||
if ((*finder).second.nCreateCount > 1)
|
||
{
|
||
int nFinderWorldID = 0;
|
||
std::wstring wstrTempKey = (*finder).second.nServerType == MANAGED_TYPE_MASTER ? L"mwi" : L"cwid";
|
||
GetFirstRightIntValue(wstrTempKey.c_str(), (*finder).second.wstrExcuteData.c_str(), nFinderWorldID);
|
||
|
||
std::map <int, TServerExcuteData>::iterator verifyer;
|
||
for (verifyer = m_ServerExcuteData.begin(); verifyer != m_ServerExcuteData.end(); verifyer++)
|
||
{
|
||
if ((*finder).second.nServerType == (*verifyer).second.nServerType && (*finder).second.nAssignedLauncherID == (*verifyer).second.nAssignedLauncherID\
|
||
&& (*finder).second.nSID != (*verifyer).second.nSID)
|
||
{
|
||
int nVerifyerWorldID = 0;
|
||
GetFirstRightIntValue(wstrTempKey.c_str(), (*verifyer).second.wstrExcuteData.c_str(), nVerifyerWorldID);
|
||
|
||
if (nFinderWorldID == nVerifyerWorldID)
|
||
{
|
||
_ASSERT_EXPR(0, L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ӽſ<D3BD> ij<><C4B3>, <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> üũ<C3BC><C5A9><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>!");
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if ((*finder).second.nServerType == MANAGED_TYPE_MASTER)
|
||
{
|
||
int nFarmServerID = 0;
|
||
if (MakeFirstGameCon((*finder).second.wstrExcuteData, nFarmServerID) == false)
|
||
_ASSERT_EXPR(0, L"can not make farm game connection info!!");
|
||
else
|
||
g_Log.Log(LogType::_FILELOG, L"Selected Farm ServerID [%d]\r\n", nFarmServerID);
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
void CDataManager::ClearPreConstructData()
|
||
{
|
||
m_DefaultServerConstructInfo.Init();
|
||
m_DefaultSQLData.Init();
|
||
|
||
std::map <int, TDefaultServerConstructData*>::iterator ii;
|
||
for (ii = m_PreServerStructData.PreStructList.begin(); ii != m_PreServerStructData.PreStructList.end(); ii++)
|
||
SAFE_DELETE((*ii).second);
|
||
m_PreServerStructData.PreStructList.clear();
|
||
}
|
||
|
||
bool CDataManager::LoadStruct()
|
||
{
|
||
if (ConvertStruct())
|
||
return LoadServerConstructData();
|
||
return false;
|
||
}
|
||
|
||
bool CDataManager::ConvertStruct()
|
||
{
|
||
bool bFlag = false;
|
||
{
|
||
int nVersion = 0;
|
||
std::string strTemp;
|
||
if (_access("./System/ServerStruct.xml", 0) == -1)
|
||
{
|
||
g_Log.Log(LogType::_FILELOG, L"ServerStruct.xml failed\r\n");
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
CXMLParser testparser;
|
||
if (testparser.Open("./System/ServerStruct.xml") == false)
|
||
{
|
||
g_Log.Log(LogType::_FILELOG, L"ServerStruct.xml failed\r\n");
|
||
return false;
|
||
}
|
||
|
||
if (testparser.FirstChildElement("ServerStruct", true))
|
||
{
|
||
if (testparser.FirstChildElement("Struct"))
|
||
{
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۾<EFBFBD><DBBE><EFBFBD> <20>Ѵ<EFBFBD>
|
||
if (testparser.GetAttribute("Version"))
|
||
nVersion = _wtoi(testparser.GetAttribute("Version"));
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
return true;
|
||
}
|
||
}
|
||
|
||
USES_CONVERSION;
|
||
time_t curtime;
|
||
time(&curtime);
|
||
|
||
struct tm structtime;
|
||
localtime_s(&structtime, &curtime);
|
||
|
||
strTemp = "./System/ServerStruct_Old_";
|
||
strTemp += I2A(structtime.tm_mday);
|
||
strTemp += I2A(structtime.tm_min);
|
||
strTemp += I2A(structtime.tm_sec);
|
||
strTemp += ".xml";
|
||
|
||
rename("./System/ServerStruct.xml", strTemp.c_str());
|
||
}
|
||
|
||
CXMLParser parser;
|
||
if (parser.Open(strTemp.c_str()) == false)
|
||
{
|
||
g_Log.Log(LogType::_FILELOG, L"ServerStruct.xml failed\r\n");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("ServerStruct", true))
|
||
{
|
||
std::map <int, TNetLauncher> NetLauncherList;
|
||
std::map <int, TNetExcuteCommand> ExcuteCmdList;
|
||
|
||
TDefaultServerInfo DefaultInfo;
|
||
TDefaultDatabaseInfo DefaultDB;
|
||
//if (nVersion <= 0)
|
||
{
|
||
std::map <int, TNetLauncher>::iterator NetItor;
|
||
if (parser.FirstChildElement("NetLauncherList", true) == true)
|
||
{
|
||
if (parser.FirstChildElement("Launcher") == true)
|
||
{
|
||
do
|
||
{
|
||
TNetLauncher Launcher;
|
||
memset(&Launcher, 0, sizeof(TNetLauncher));
|
||
|
||
if (parser.GetAttribute("WID") != NULL)
|
||
Launcher.nWID = _tstoi(parser.GetAttribute("WID"));
|
||
if (parser.GetAttribute("PID") != NULL)
|
||
Launcher.nPID = _tstoi(parser.GetAttribute("PID"));
|
||
Launcher.nID = _tstoi(parser.GetAttribute("ID"));
|
||
_tcscpy_s(Launcher.szIP, parser.GetAttribute("IP"));
|
||
Launcher.nIP = _inet_addr(Launcher.szIP);
|
||
|
||
if (NetLauncherList.find(Launcher.nID) != NetLauncherList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [Launcher] NID Duplicated");
|
||
return false;
|
||
}
|
||
NetLauncherList[Launcher.nID] = Launcher;
|
||
} while (parser.NextSiblingElement("Launcher") == true);
|
||
}
|
||
parser.GoParent();
|
||
}
|
||
|
||
CURLUpdater Url;
|
||
if (parser.FirstChildElement("ServerInfo", true) == true)
|
||
{
|
||
do {
|
||
|
||
TNetExcuteCommand Cmd;
|
||
|
||
Cmd.nSID = _tstoi(parser.GetAttribute("SID"));
|
||
_tcscpy_s(Cmd.szType, parser.GetAttribute("Type"));
|
||
|
||
Cmd.cType = (char)GetServerTypeForConvert(Cmd.szType);
|
||
Cmd.nAssignedLauncherID = _tstoi(parser.GetAttribute("AssignedLauncherID"));
|
||
_tcscpy_s(Cmd.szExcuteFile, parser.GetAttribute("ExcuteFileName"));
|
||
_tcscpy_s(Cmd.szCmd, parser.GetAttribute("cmd"));
|
||
|
||
if (parser.FirstChildElement("Command") == true)
|
||
{
|
||
do {
|
||
std::wstring wstrCmd;
|
||
wstrCmd = parser.GetAttribute("cmd");
|
||
int nType = GetServerTypeForConvert(parser.GetAttribute("Type"));
|
||
Cmd.strConList.push_back(std::make_pair(nType, wstrCmd));
|
||
} while(parser.NextSiblingElement("Command"));
|
||
}
|
||
else
|
||
return false;
|
||
|
||
if (ExcuteCmdList.find(Cmd.nSID) != ExcuteCmdList.end())
|
||
{
|
||
g_Log.Log(LogType::_FILELOG, L"Check ServerStruct <ServerInfo> SID[%d] duplicated\n", Cmd.nSID);
|
||
_ASSERT_EXPR(0, L"Check ServerStruct <ServerInfo> SID[%d] duplicated");
|
||
return false;
|
||
}
|
||
|
||
ExcuteCmdList[Cmd.nSID] = Cmd;
|
||
std::map <int, TNetExcuteCommand>::iterator finditor = ExcuteCmdList.find(Cmd.nSID);
|
||
|
||
} while (parser.NextSiblingElement("ServerInfo"));
|
||
parser.GoParent();
|
||
}
|
||
}
|
||
|
||
DefaultInfo.nSocketMax = 3000; //<2F><><EFBFBD><EFBFBD>Ʈ 3õ<33><C3B5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
DefaultInfo.nGameAffinityType = _GAMESERVER_AFFINITYTYPE_HYBRYD;
|
||
|
||
std::vector <TWorldConnectionInfo> vWorld;
|
||
std::map <int, TNetExcuteCommand>::iterator exeitor;
|
||
for (exeitor = ExcuteCmdList.begin(); exeitor != ExcuteCmdList.end(); exeitor++)
|
||
{
|
||
if ((*exeitor).second.cType == MANAGED_TYPE_MASTER)
|
||
{
|
||
std::vector<std::wstring> tokens;
|
||
TokenizeW((*exeitor).second.szCmd, tokens, L" ");
|
||
|
||
TWorldConnectionInfo info;
|
||
memset(&info, 0, sizeof(info));
|
||
|
||
info.nWorldID = _wtoi(tokens[0].c_str());
|
||
info.nVillagePort = _wtoi(tokens[1].c_str());
|
||
info.nGamePort = _wtoi(tokens[2].c_str());
|
||
|
||
std::map <int, TNetLauncher>::iterator netitor = NetLauncherList.find((*exeitor).second.nAssignedLauncherID);
|
||
if (netitor != NetLauncherList.end())
|
||
{
|
||
STRCPYW(info.wszIP, IPLENMAX, (*netitor).second.szIP);
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConvertStruct] NetLauncherList can not find nAssignedLauncherID 1" );
|
||
}
|
||
|
||
(*exeitor).second.nWorldID = info.nWorldID;
|
||
vWorld.push_back(info);
|
||
}
|
||
}
|
||
|
||
for (exeitor = ExcuteCmdList.begin(); exeitor != ExcuteCmdList.end(); exeitor++)
|
||
{
|
||
std::map <int, TNetLauncher>::iterator netitor = NetLauncherList.find((*exeitor).second.nAssignedLauncherID);
|
||
if (netitor == NetLauncherList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConvertStruct] NetLauncherList can not find nAssignedLauncherID 2" );
|
||
return false;
|
||
}
|
||
|
||
switch ((*exeitor).second.cType)
|
||
{
|
||
case MANAGED_TYPE_LOGIN:
|
||
case MANAGED_TYPE_LOG:
|
||
{
|
||
//<2F>α<CEB1> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>忡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
(*netitor).second.nWID = 0;
|
||
|
||
std::vector<std::wstring> tokens;
|
||
TokenizeW((*exeitor).second.szCmd, tokens, L" ");
|
||
|
||
{
|
||
if ((*exeitor).second.cType == MANAGED_TYPE_LOGIN)
|
||
{
|
||
if (DefaultInfo.nLoginMasterAcceptPort <= 0 || DefaultInfo.nLoginMasterAcceptPort > _wtoi(tokens[3].c_str()))
|
||
DefaultInfo.nLoginMasterAcceptPort = _wtoi(tokens[3].c_str());
|
||
|
||
if (DefaultInfo.nLoginClientAcceptPort <= 0 || DefaultInfo.nLoginClientAcceptPort > _wtoi(tokens[4].c_str()))
|
||
DefaultInfo.nLoginClientAcceptPort = _wtoi(tokens[4].c_str());
|
||
}
|
||
else if ((*exeitor).second.cType == MANAGED_TYPE_LOG)
|
||
{
|
||
if (DefaultInfo.nLogServerAcceptPort <= 0 || DefaultInfo.nLogServerAcceptPort > _wtoi(tokens[0].c_str()))
|
||
DefaultInfo.nLogServerAcceptPort = _wtoi(tokens[0].c_str());
|
||
}
|
||
|
||
std::vector <std::pair<int, std::wstring>>::iterator conitor;
|
||
for (conitor = (*exeitor).second.strConList.begin(); conitor != (*exeitor).second.strConList.end(); conitor++)
|
||
{
|
||
if ((*conitor).first != MANAGED_TYPE_DB) continue;
|
||
|
||
std::vector<std::wstring> tokens;
|
||
TokenizeW((*conitor).second, tokens, L" ");
|
||
|
||
if (wcsstr((*conitor).second.c_str(), L"Membership"))
|
||
{
|
||
if (DefaultDB.MemberShipDB.nPort <= 0)
|
||
{
|
||
STRCPYW(DefaultDB.MemberShipDB.wszIP, IPLENMAX, tokens[0].c_str());
|
||
DefaultDB.MemberShipDB.nPort = _wtoi(tokens[1].c_str());
|
||
STRCPYW(DefaultDB.MemberShipDB.wszDBID, IDLENMAX, tokens[2].c_str());
|
||
STRCPYW(DefaultDB.MemberShipDB.wszDBName, DBNAMELENMAX, tokens[3].c_str());
|
||
}
|
||
}
|
||
else if (wcsstr((*conitor).second.c_str(), L"World"))
|
||
{
|
||
std::map <int, TSQLConnectionInfo>::iterator dbitor = DefaultDB.WorldDB.find(_wtoi(tokens[0].c_str()));
|
||
if (dbitor == DefaultDB.WorldDB.end())
|
||
{
|
||
TSQLConnectionInfo sql;
|
||
STRCPYW(sql.wszIP, IPLENMAX, tokens[2].c_str());
|
||
sql.nPort = _wtoi(tokens[3].c_str());
|
||
STRCPYW(sql.wszDBID, IDLENMAX, tokens[4].c_str());
|
||
STRCPYW(sql.wszDBName, NAMELENMAX, tokens[5].c_str());
|
||
|
||
DefaultDB.WorldDB.insert(std::make_pair(_wtoi(tokens[0].c_str()), sql));
|
||
}
|
||
}
|
||
else if (wcsstr((*conitor).second.c_str(), L"ServerLog"))
|
||
{
|
||
if (DefaultDB.ServerLogDB.nPort <= 0)
|
||
{
|
||
STRCPYW(DefaultDB.ServerLogDB.wszIP, IPLENMAX, tokens[0].c_str());
|
||
DefaultDB.ServerLogDB.nPort = _wtoi(tokens[1].c_str());
|
||
STRCPYW(DefaultDB.ServerLogDB.wszDBID, IDLENMAX, tokens[2].c_str());
|
||
STRCPYW(DefaultDB.ServerLogDB.wszDBName, DBNAMELENMAX, tokens[3].c_str());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
case MANAGED_TYPE_CASH:
|
||
case MANAGED_TYPE_MASTER:
|
||
{
|
||
std::vector<std::wstring> tokens;
|
||
TokenizeW((*exeitor).second.szCmd, tokens, L" ");
|
||
|
||
if ((*exeitor).second.cType == MANAGED_TYPE_MASTER)
|
||
{
|
||
(*netitor).second.nWID = _wtoi(tokens[0].c_str());
|
||
|
||
if (DefaultInfo.nMasterVillageAcceptPort <= 0 || DefaultInfo.nMasterVillageAcceptPort > _wtoi(tokens[1].c_str()))
|
||
DefaultInfo.nMasterVillageAcceptPort = _wtoi(tokens[1].c_str());
|
||
|
||
if (DefaultInfo.nMasterGameAcceptPort <= 0 || DefaultInfo.nMasterGameAcceptPort > _wtoi(tokens[2].c_str()))
|
||
DefaultInfo.nMasterGameAcceptPort = _wtoi(tokens[2].c_str());
|
||
}
|
||
else if ((*exeitor).second.cType == MANAGED_TYPE_CASH)
|
||
{
|
||
(*netitor).second.nWID = _wtoi(tokens[0].c_str());
|
||
|
||
if (DefaultInfo.nCashAcceptPort <= 0 || DefaultInfo.nCashAcceptPort > _wtoi(tokens[1].c_str()))
|
||
DefaultInfo.nCashAcceptPort = _wtoi(tokens[1].c_str());
|
||
}
|
||
break;
|
||
}
|
||
case MANAGED_TYPE_VILLAGE:
|
||
{
|
||
std::vector<std::wstring> tokens1;
|
||
TokenizeW((*exeitor).second.szCmd, tokens1, L" ");
|
||
|
||
if (DefaultInfo.nVillageClientAcceptPort <= 0 || DefaultInfo.nVillageClientAcceptPort > _wtoi(tokens1[3].c_str()))
|
||
DefaultInfo.nVillageClientAcceptPort = _wtoi(tokens1[3].c_str());
|
||
|
||
(*exeitor).second.nVillageID = _wtoi(tokens1[1].c_str());
|
||
|
||
std::vector <std::pair<int, std::wstring>>::iterator conitor;
|
||
for (conitor = (*exeitor).second.strConList.begin(); conitor != (*exeitor).second.strConList.end(); conitor++)
|
||
{
|
||
if ((*conitor).first == MANAGED_TYPE_MASTER)
|
||
{
|
||
std::vector<std::wstring> tokens;
|
||
TokenizeW((*conitor).second, tokens, L" ");
|
||
|
||
std::vector <TWorldConnectionInfo>::iterator worlditor;
|
||
for (worlditor = vWorld.begin(); worlditor != vWorld.end(); worlditor++)
|
||
{
|
||
if (!wcscmp((*worlditor).wszIP, tokens[0].c_str()) && (*worlditor).nVillagePort == _wtoi(tokens[1].c_str()))
|
||
{
|
||
(*netitor).second.nWID = (*worlditor).nWorldID;
|
||
(*exeitor).second.nWorldID = (*worlditor).nWorldID;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else if ((*conitor).first == MANAGED_TYPE_DB)
|
||
{
|
||
std::vector<std::wstring> tokens;
|
||
TokenizeW((*conitor).second, tokens, L" ");
|
||
|
||
std::map <int, TNetExcuteCommand>::iterator secondexeitor;
|
||
for (secondexeitor = ExcuteCmdList.begin(); secondexeitor != ExcuteCmdList.end(); secondexeitor++)
|
||
{
|
||
if ((*secondexeitor).second.cType == MANAGED_TYPE_DB)
|
||
{
|
||
std::map <int, TNetLauncher>::iterator secondnetitor = NetLauncherList.find((*secondexeitor).second.nAssignedLauncherID);
|
||
if (secondnetitor == NetLauncherList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConvertStruct] NetLauncherList can not find nAssignedLauncherID in MANAGED_TYPE_VILLAGE" );
|
||
return false;
|
||
}
|
||
|
||
if (!wcscmp((*secondnetitor).second.szIP, tokens[0].c_str()))
|
||
{
|
||
if (_wtoi((*secondexeitor).second.szCmd) == _wtoi(tokens[1].c_str()))
|
||
{
|
||
std::vector <std::pair<int, int>>::iterator typeitor;
|
||
for (typeitor = (*secondexeitor).second.vAssignedTypeList.begin(); typeitor != (*secondexeitor).second.vAssignedTypeList.end(); typeitor++)
|
||
{
|
||
if ((*typeitor).first != (*exeitor).second.nWorldID)
|
||
{
|
||
//<2F>̷<EFBFBD><CCB7>ƴϵǿɴϴ<C9B4>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><F1BCADB9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD> <20>մϴ<D5B4>
|
||
_ASSERT_EXPR(0, L"<EFBFBD>̷<EFBFBD><EFBFBD>ƴϵǿɴϴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><F1BCADB9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD> <20>մϴ<D5B4>");
|
||
return false;
|
||
}
|
||
}
|
||
(*secondexeitor).second.vAssignedTypeList.push_back(std::make_pair((*exeitor).second.nWorldID, (*exeitor).second.cType));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
case MANAGED_TYPE_GAME:
|
||
{
|
||
std::vector<std::wstring> tokens1;
|
||
TokenizeW((*exeitor).second.szCmd, tokens1, L" ");
|
||
|
||
if (DefaultInfo.nGameClientAcceptUDPPort <= 0 || DefaultInfo.nGameClientAcceptUDPPort > _wtoi(tokens1[3].c_str()))
|
||
DefaultInfo.nGameClientAcceptUDPPort = _wtoi(tokens1[3].c_str());
|
||
|
||
if (DefaultInfo.nGameClientAcceptTCPPort <= 0 || DefaultInfo.nGameClientAcceptTCPPort > _wtoi(tokens1[4].c_str()))
|
||
DefaultInfo.nGameClientAcceptTCPPort = _wtoi(tokens1[4].c_str());
|
||
|
||
std::vector <std::pair<int, std::wstring>>::iterator conitor;
|
||
for (conitor = (*exeitor).second.strConList.begin(); conitor != (*exeitor).second.strConList.end(); conitor++)
|
||
{
|
||
if ((*conitor).first == MANAGED_TYPE_MASTER)
|
||
{
|
||
std::vector<std::wstring> tokens;
|
||
TokenizeW((*conitor).second, tokens, L" ");
|
||
|
||
std::vector <TWorldConnectionInfo>::iterator worlditor;
|
||
for (worlditor = vWorld.begin(); worlditor != vWorld.end(); worlditor++)
|
||
{
|
||
if (!wcscmp((*worlditor).wszIP, tokens[0].c_str()) && (*worlditor).nGamePort == _wtoi(tokens[1].c_str()))
|
||
{
|
||
(*netitor).second.nWID = (*worlditor).nWorldID;
|
||
(*exeitor).second.nWorldID = (*worlditor).nWorldID;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else if ((*conitor).first == MANAGED_TYPE_DB)
|
||
{
|
||
std::vector<std::wstring> tokens;
|
||
TokenizeW((*conitor).second, tokens, L" ");
|
||
|
||
std::map <int, TNetExcuteCommand>::iterator secondexeitor;
|
||
for (secondexeitor = ExcuteCmdList.begin(); secondexeitor != ExcuteCmdList.end(); secondexeitor++)
|
||
{
|
||
if ((*secondexeitor).second.cType == MANAGED_TYPE_DB)
|
||
{
|
||
std::map <int, TNetLauncher>::iterator secondnetitor = NetLauncherList.find((*secondexeitor).second.nAssignedLauncherID);
|
||
if (secondnetitor == NetLauncherList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConvertStruct] NetLauncherList can not find nAssignedLauncherID in MANAGED_TYPE_GAME" );
|
||
return false;
|
||
}
|
||
|
||
if (!wcscmp((*secondnetitor).second.szIP, tokens[0].c_str()))
|
||
{
|
||
if (_wtoi((*secondexeitor).second.szCmd) == _wtoi(tokens[1].c_str()))
|
||
{
|
||
std::vector <std::pair<int, int>>::iterator typeitor;
|
||
for (typeitor = (*secondexeitor).second.vAssignedTypeList.begin(); typeitor != (*secondexeitor).second.vAssignedTypeList.end(); typeitor++)
|
||
{
|
||
if ((*typeitor).first != (*exeitor).second.nWorldID)
|
||
{
|
||
//<2F>̷<EFBFBD><CCB7>ƴϵǿɴϴ<C9B4>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><F1BCADB9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD> <20>մϴ<D5B4>.
|
||
//<2F><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>? <20>ϴ<EFBFBD> <20><> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
_ASSERT_EXPR(0, L"<EFBFBD>̷<EFBFBD><EFBFBD>ƴϵǿɴϴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><F1BCADB9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD> <20>մϴ<D5B4>");
|
||
return false;
|
||
}
|
||
}
|
||
(*secondexeitor).second.vAssignedTypeList.push_back(std::make_pair((*exeitor).second.nWorldID, (*exeitor).second.cType));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
for (exeitor = ExcuteCmdList.begin(); exeitor != ExcuteCmdList.end(); exeitor++)
|
||
{
|
||
std::map <int, TNetLauncher>::iterator netitor = NetLauncherList.find((*exeitor).second.nAssignedLauncherID);
|
||
if (netitor == NetLauncherList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConvertStruct] NetLauncherList can not find nAssignedLauncherID 3" );
|
||
return false;
|
||
}
|
||
|
||
switch ((*exeitor).second.cType)
|
||
{
|
||
case MANAGED_TYPE_DB:
|
||
{
|
||
int nAssingedType = 0; //0<≯<EFBFBD> <20><><EFBFBD><EFBFBD>, 1<><31> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 2<><32> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 3<><33> <20>Ѵ<EFBFBD>
|
||
std::vector <std::pair<int, int>>::iterator typeitor;
|
||
for (typeitor = (*exeitor).second.vAssignedTypeList.begin(); typeitor != (*exeitor).second.vAssignedTypeList.end(); typeitor++)
|
||
{
|
||
if ((*netitor).second.nWID != 0 && (*netitor).second.nWID != (*typeitor).first)
|
||
{
|
||
//<2F><><EFBFBD>ó<EFBFBD> <20>̷<EFBFBD><CCB7>ø<EFBFBD> <20>ƴϵǿɴϴ<C9B4>.
|
||
_ASSERT_EXPR(0, L"[ConvertStruct] ExcuteCmdList has invalid values");
|
||
return false;
|
||
}
|
||
(*netitor).second.nWID = (*typeitor).first;
|
||
|
||
if (nAssingedType == 0)
|
||
nAssingedType = (*typeitor).second == MANAGED_TYPE_GAME ? 1 : 2;
|
||
else if (nAssingedType > 0)
|
||
{
|
||
if ((nAssingedType == 1))
|
||
{
|
||
if ((*typeitor).second != MANAGED_TYPE_GAME)
|
||
nAssingedType = 3;
|
||
}
|
||
else if ((nAssingedType == 2))
|
||
{
|
||
if ((*typeitor).second != MANAGED_TYPE_VILLAGE)
|
||
nAssingedType = 3;
|
||
}
|
||
}
|
||
}
|
||
|
||
(*exeitor).second.nAssingedType = nAssingedType;
|
||
|
||
if (DefaultInfo.nDBMiddleWareAcceptPort <= 0 || DefaultInfo.nDBMiddleWareAcceptPort > _wtoi((*exeitor).second.szCmd))
|
||
DefaultInfo.nDBMiddleWareAcceptPort = _wtoi((*exeitor).second.szCmd);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
//<2F>⺻<EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD>ο<EFBFBD> xml<6D><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
USES_CONVERSION;
|
||
|
||
CXMLCreater creater;
|
||
if (creater.Init("ServerStruct.xml") == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConvertStruct] CXMLCreater fail to create erverStruct.xml");
|
||
return false;
|
||
}
|
||
|
||
creater.AddElement("ServerStruct", true);
|
||
|
||
creater.AddElement("Struct");
|
||
creater.AddAttribute("Version", "1");
|
||
|
||
//GSM<53>뵥<EFBFBD><EBB5A5>Ÿ
|
||
parser.Reset();
|
||
|
||
if (parser.FirstChildElement("ServerStruct", true))
|
||
{
|
||
if (parser.FirstChildElement("ServiceManager"))
|
||
{
|
||
creater.AddElement("ServiceManager");
|
||
creater.AddAttribute("IP", parser.GetAttribute("IP"));
|
||
creater.AddAttribute("Port", parser.GetAttribute("Port"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("GSMInfo", true))
|
||
{
|
||
creater.AddElement("GSMInfo", true);
|
||
|
||
if (parser.FirstChildElement("GSMDB"))
|
||
{
|
||
creater.AddElement("GSMDB");
|
||
creater.AddAttribute("IP", parser.GetAttribute("IP"));
|
||
creater.AddAttribute("DBName", parser.GetAttribute("DBName"));
|
||
}
|
||
|
||
creater.GoRarent();
|
||
parser.GoParent();
|
||
}
|
||
|
||
if (parser.FirstChildElement("PartitionList", true))
|
||
{
|
||
creater.AddElement("PartitionList", true);
|
||
|
||
if (parser.FirstChildElement("PartitionInfo", true))
|
||
{
|
||
creater.AddElement("PartitionInfo", true);
|
||
creater.AddAttribute("Name", parser.GetAttribute("Name"));
|
||
creater.AddAttribute("PID", parser.GetAttribute("PID"));
|
||
|
||
if (parser.FirstChildElement("MasterLog"))
|
||
{
|
||
creater.AddElement("MasterLog");
|
||
creater.AddAttribute("IP", parser.GetAttribute("IP"));
|
||
creater.AddAttribute("DBName", parser.GetAttribute("DBName"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("GameLog"))
|
||
{
|
||
creater.AddElement("GameLog");
|
||
creater.AddAttribute("IP", parser.GetAttribute("IP"));
|
||
creater.AddAttribute("DBName", parser.GetAttribute("DBName"));
|
||
creater.AddAttribute("WorldID", parser.GetAttribute("WorldID"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("MembershipDB"))
|
||
{
|
||
creater.AddElement("MembershipDB");
|
||
creater.AddAttribute("IP", parser.GetAttribute("IP"));
|
||
creater.AddAttribute("DBName", parser.GetAttribute("DBName"));
|
||
creater.AddAttribute("WorldID", parser.GetAttribute("WorldID"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("StagingDB"))
|
||
{
|
||
creater.AddElement("StagingDB");
|
||
creater.AddAttribute("IP", parser.GetAttribute("IP"));
|
||
creater.AddAttribute("DBName", parser.GetAttribute("DBName"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("WorldDB"))
|
||
{
|
||
do {
|
||
creater.AddElement("WorldDB");
|
||
creater.AddAttribute("IP", parser.GetAttribute("IP"));
|
||
creater.AddAttribute("DBName", parser.GetAttribute("DBName"));
|
||
creater.AddAttribute("WorldID", parser.GetAttribute("WorldID"));
|
||
} while (parser.NextSiblingElement("WorldDB"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("ServerLogDB"))
|
||
{
|
||
do {
|
||
creater.AddElement("ServerLogDB");
|
||
creater.AddAttribute("IP", parser.GetAttribute("IP"));
|
||
creater.AddAttribute("DBName", parser.GetAttribute("DBName"));
|
||
creater.AddAttribute("WorldID", parser.GetAttribute("WorldID"));
|
||
} while (parser.NextSiblingElement("ServerLogDB"));
|
||
}
|
||
creater.GoRarent();
|
||
parser.GoParent();
|
||
}
|
||
|
||
creater.GoRarent();
|
||
}
|
||
}
|
||
|
||
creater.AddElement("NetLauncherList", true);
|
||
std::map <int, TNetLauncher>::iterator netitor;
|
||
for (netitor = NetLauncherList.begin(); netitor != NetLauncherList.end(); netitor++)
|
||
{
|
||
creater.AddElement("Launcher");
|
||
creater.AddAttribute("ID", I2A((*netitor).second.nID));
|
||
creater.AddAttribute("IP", (*netitor).second.szIP);
|
||
creater.AddAttribute("WID", I2A((*netitor).second.nWID));
|
||
creater.AddAttribute("PID", I2A((*netitor).second.nPID));
|
||
}
|
||
creater.GoRarent();
|
||
|
||
creater.AddElement("DefaultServerInfo", true);
|
||
|
||
creater.AddElement("SocketMax");
|
||
creater.AddAttribute("Socket", DefaultInfo.nSocketMax);
|
||
|
||
creater.AddElement("DBPort");
|
||
creater.AddAttribute("Port", DefaultInfo.nDBMiddleWareAcceptPort);
|
||
|
||
creater.AddElement("LoginMasterPort");
|
||
creater.AddAttribute("Port", DefaultInfo.nLoginMasterAcceptPort);
|
||
|
||
creater.AddElement("LoginClientPort");
|
||
creater.AddAttribute("Port", DefaultInfo.nLoginClientAcceptPort);
|
||
|
||
creater.AddElement("MasterVillagePort");
|
||
creater.AddAttribute("Port", DefaultInfo.nMasterVillageAcceptPort);
|
||
|
||
creater.AddElement("MasterGamePort");
|
||
creater.AddAttribute("Port", DefaultInfo.nMasterGameAcceptPort);
|
||
|
||
creater.AddElement("VillageClientPort");
|
||
creater.AddAttribute("Port", DefaultInfo.nVillageClientAcceptPort);
|
||
|
||
creater.AddElement("GameClientPortUDP");
|
||
creater.AddAttribute("Port", DefaultInfo.nGameClientAcceptUDPPort);
|
||
|
||
creater.AddElement("GameClientPortTCP");
|
||
creater.AddAttribute("Port", DefaultInfo.nGameClientAcceptTCPPort);
|
||
|
||
creater.AddElement("CashPort");
|
||
creater.AddAttribute("Port", DefaultInfo.nCashAcceptPort);
|
||
|
||
creater.AddElement("LogPort");
|
||
creater.AddAttribute("Port", DefaultInfo.nLogServerAcceptPort);
|
||
|
||
creater.GoRarent();
|
||
|
||
creater.AddElement("DefaultDataBaseInfo", true);
|
||
creater.AddElement("MemberShip");
|
||
creater.AddAttribute("IP", DefaultDB.MemberShipDB.wszIP);
|
||
creater.AddAttribute("Port", DefaultDB.MemberShipDB.nPort);
|
||
creater.AddAttribute("DBID", DefaultDB.MemberShipDB.wszDBID);
|
||
creater.AddAttribute("DBName", DefaultDB.MemberShipDB.wszDBName);
|
||
|
||
if (DefaultDB.ServerLogDB.nPort > 0)
|
||
{
|
||
creater.AddElement("Log");
|
||
creater.AddAttribute("IP", DefaultDB.ServerLogDB.wszIP);
|
||
creater.AddAttribute("Port", DefaultDB.ServerLogDB.nPort);
|
||
creater.AddAttribute("DBID", DefaultDB.ServerLogDB.wszDBID);
|
||
creater.AddAttribute("DBName", DefaultDB.ServerLogDB.wszDBName);
|
||
}
|
||
|
||
std::map <int, TSQLConnectionInfo>::iterator ii;
|
||
for (ii = DefaultDB.WorldDB.begin(); ii != DefaultDB.WorldDB.end(); ii++)
|
||
{
|
||
creater.AddElement("World");
|
||
creater.AddAttribute("WorldID", (*ii).first);
|
||
creater.AddAttribute("IP", (*ii).second.wszIP);
|
||
creater.AddAttribute("Port", (*ii).second.nPort);
|
||
creater.AddAttribute("DBID", (*ii).second.wszDBID);
|
||
creater.AddAttribute("DBName", (*ii).second.wszDBName);
|
||
}
|
||
|
||
creater.GoRarent();
|
||
|
||
for (exeitor = ExcuteCmdList.begin(); exeitor != ExcuteCmdList.end(); exeitor++)
|
||
{
|
||
creater.AddElement("ServerInfo", true);
|
||
creater.AddAttribute("SID", (*exeitor).second.nSID);
|
||
creater.AddAttribute("Type", (*exeitor).second.szType);
|
||
creater.AddAttribute("AssignedLauncherID", (*exeitor).second.nAssignedLauncherID);
|
||
creater.AddAttribute("ExcuteFileName", (*exeitor).second.szExcuteFile);
|
||
|
||
if ((*exeitor).second.cType == MANAGED_TYPE_DB)
|
||
{
|
||
if ((*exeitor).second.nAssingedType == 0)
|
||
{
|
||
_ASSERT_EXPR(0, L"[ConvertStruct] Type == MANAGED_TYPE_DB && nAssingedType == 0");
|
||
return false;
|
||
}
|
||
|
||
if ((*exeitor).second.nAssingedType < 3)
|
||
creater.AddAttribute("For", (*exeitor).second.nAssingedType == 1 ? "Game" : "Village");
|
||
}
|
||
|
||
if ((*exeitor).second.cType == MANAGED_TYPE_VILLAGE)
|
||
{
|
||
creater.AddElement("VillageID");
|
||
creater.AddAttribute("ID", (*exeitor).second.nVillageID);
|
||
}
|
||
|
||
creater.GoRarent();
|
||
}
|
||
|
||
//creater.GoRarent();
|
||
creater.Create();
|
||
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool CDataManager::LoadServerConstructData()
|
||
{
|
||
CXMLParser parser;
|
||
if (parser.Open("./System/ServerStruct.xml") == false)
|
||
{
|
||
g_Log.Log(LogType::_FILELOG, L"ServerStruct.xml failed\r\n");
|
||
return false;
|
||
}
|
||
|
||
//ChannelInfo<66><6F> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
ClearChannelData();
|
||
if (LoadChannelInfo() == false)
|
||
{
|
||
g_Log.Log(LogType::_FILELOG, L"ChannelInfo.xml failed\r\n");
|
||
return false;
|
||
}
|
||
|
||
ClearData();
|
||
ClearPreConstructData();
|
||
if (parser.FirstChildElement("ServerStruct", true) == true)
|
||
{ //Parse Struct
|
||
if (parser.FirstChildElement("ServiceManager") == true)
|
||
{
|
||
_tcscpy_s(m_szServiceIP, parser.GetAttribute("IP"));
|
||
m_nServicePort = _tstoi(parser.GetAttribute("Port"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("PartitionList", true) == true)
|
||
{
|
||
if (parser.FirstChildElement("PartitionInfo") == true)
|
||
{
|
||
do {
|
||
TPartitionInfo * pPInfo = new TPartitionInfo;
|
||
memset(pPInfo, 0, sizeof(TPartitionInfo));
|
||
|
||
_tcscpy_s(pPInfo->szPartitionName, parser.GetAttribute("Name"));
|
||
pPInfo->nPID = _tstoi(parser.GetAttribute("PID"));
|
||
|
||
std::map <int, TPartitionInfo*>::iterator PartItor = m_PartitionList.find(pPInfo->nPID);
|
||
if (PartItor != m_PartitionList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [PartitionInfo] PID Duplicated");
|
||
SAFE_DELETE(pPInfo);
|
||
return false;
|
||
}
|
||
m_PartitionList[pPInfo->nPID] = pPInfo;
|
||
} while (parser.NextSiblingElement("PartitionInfo") == true);
|
||
}
|
||
parser.GoParent();
|
||
}
|
||
|
||
if (parser.FirstChildElement("NetLauncherList", true) == true)
|
||
{
|
||
if (parser.FirstChildElement("Launcher") == true)
|
||
{
|
||
do
|
||
{
|
||
TNetLauncher * pNet = new TNetLauncher;
|
||
memset(pNet, 0, sizeof(TNetLauncher));
|
||
|
||
if (parser.GetAttribute("WID") != NULL)
|
||
{
|
||
pNet->nWID = _tstoi(parser.GetAttribute("WID"));
|
||
/*if (pNet->nWID <= 0)
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [Launcher][WID] cant set 0");
|
||
return false;
|
||
}*/
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [Launcher][WID]Not Found");
|
||
SAFE_DELETE(pNet);
|
||
return false;
|
||
}
|
||
|
||
if (parser.GetAttribute("PID") != NULL)
|
||
pNet->nPID = _tstoi(parser.GetAttribute("PID"));
|
||
pNet->nID = _tstoi(parser.GetAttribute("ID"));
|
||
_tcscpy_s(pNet->szIP, parser.GetAttribute("IP"));
|
||
pNet->nIP = _inet_addr(pNet->szIP);
|
||
|
||
std::map <unsigned long, TNetLauncher*>::iterator NetItor = m_NetLauncherList.find(pNet->nID);
|
||
if (NetItor != m_NetLauncherList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [Launcher] NID Duplicated");
|
||
SAFE_DELETE(pNet);
|
||
return false;
|
||
}
|
||
m_NetLauncherList[pNet->nID] = pNet;
|
||
|
||
std::vector <int>::iterator worldItor = std::find(m_vWorldList.begin(), m_vWorldList.end(), pNet->nWID);
|
||
if (worldItor == m_vWorldList.end())
|
||
m_vWorldList.push_back(pNet->nWID);
|
||
} while (parser.NextSiblingElement("Launcher") == true);
|
||
}
|
||
parser.GoParent();
|
||
}
|
||
|
||
if (parser.FirstChildElement("DefaultServerInfo", true))
|
||
{
|
||
if (parser.FirstChildElement("SocketMax"))
|
||
m_DefaultServerConstructInfo.nSocketMax = _wtoi(parser.GetAttribute("Socket"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][SocketMax]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("DBPort"))
|
||
m_DefaultServerConstructInfo.nDBMiddleWareAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][DBPort]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("LoginMasterPort"))
|
||
m_DefaultServerConstructInfo.nLoginMasterAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][LoginMasterPort]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("LoginClientPort"))
|
||
m_DefaultServerConstructInfo.nLoginClientAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][LoginClientPort]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("MasterVillagePort"))
|
||
m_DefaultServerConstructInfo.nMasterVillageAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][MasterVillagePort]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("MasterGamePort"))
|
||
m_DefaultServerConstructInfo.nMasterGameAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][MasterGamePort]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("VillageClientPort"))
|
||
m_DefaultServerConstructInfo.nVillageClientAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][VillageClientPort]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("GameClientPortUDP"))
|
||
m_DefaultServerConstructInfo.nGameClientAcceptUDPPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][GameClientPortUDP]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("GameClientPortTCP"))
|
||
m_DefaultServerConstructInfo.nGameClientAcceptTCPPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][GameClientPortTCP]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("CashPort"))
|
||
m_DefaultServerConstructInfo.nCashAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][CashPort]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("AffinityType"))
|
||
{
|
||
if (!wcsicmp(L"normal", parser.GetAttribute("Type")))
|
||
m_DefaultServerConstructInfo.nGameAffinityType = 0;
|
||
else if (!wcsicmp(L"hybrid", parser.GetAttribute("Type")))
|
||
m_DefaultServerConstructInfo.nGameAffinityType = 1;
|
||
else
|
||
m_DefaultServerConstructInfo.nGameAffinityType = 2;
|
||
}
|
||
|
||
if (parser.FirstChildElement("LogPort"))
|
||
m_DefaultServerConstructInfo.nLogServerAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultServerInfo][LogPort]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("DolbyAxon"))
|
||
{
|
||
do{
|
||
TDolbyAxon Axon;
|
||
Axon.nDolbyWorldID = _wtoi(parser.GetAttribute("WorldID"));
|
||
wcscpy_s(Axon.wszPrivateDolbyIP, parser.GetAttribute("PrivateIP"));
|
||
wcscpy_s(Axon.wszPublicDolbyIP, parser.GetAttribute("PublicIP"));
|
||
Axon.nDolbyAPort = _wtoi(parser.GetAttribute("APort"));
|
||
Axon.nDolbyCPort = _wtoi(parser.GetAttribute("CPort"));
|
||
|
||
m_DefaultServerConstructInfo.vDolbyAxonInfo.push_back(Axon);
|
||
} while (parser.NextSiblingElement("DolbyAxon"));
|
||
}
|
||
if (parser.FirstChildElement("CombineWorld"))
|
||
{
|
||
m_DefaultServerConstructInfo.bGameWorldCombine = true;
|
||
}
|
||
/*else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DolbyAxon]");
|
||
return false;
|
||
}*/
|
||
|
||
//Doors IP/Port
|
||
if(parser.FirstChildElement("DoorsInfo")== true)
|
||
{
|
||
m_DoorsInfo.nPort = _wtoi(parser.GetAttribute("Port"));
|
||
wcscpy_s(m_DoorsInfo.wszIP, parser.GetAttribute("IP"));
|
||
}
|
||
|
||
parser.GoParent();
|
||
}
|
||
|
||
if (parser.FirstChildElement("DefaultDataBaseInfo", true))
|
||
{
|
||
if (parser.FirstChildElement("MemberShip"))
|
||
{
|
||
STRCPYW(m_DefaultSQLData.MemberShipDB.wszIP, IPLENMAX, parser.GetAttribute("IP"));
|
||
m_DefaultSQLData.MemberShipDB.nPort = _wtoi(parser.GetAttribute("Port"));
|
||
STRCPYW(m_DefaultSQLData.MemberShipDB.wszDBID, IDLENMAX, parser.GetAttribute("DBID"));
|
||
STRCPYW(m_DefaultSQLData.MemberShipDB.wszDBName, DBNAMELENMAX, parser.GetAttribute("DBName"));
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultDataBaseInfo][MemberShip]");
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("Log"))
|
||
{
|
||
STRCPYW(m_DefaultSQLData.ServerLogDB.wszIP, IPLENMAX, parser.GetAttribute("IP"));
|
||
m_DefaultSQLData.ServerLogDB.nPort = _wtoi(parser.GetAttribute("Port"));
|
||
STRCPYW(m_DefaultSQLData.ServerLogDB.wszDBID, IDLENMAX, parser.GetAttribute("DBID"));
|
||
STRCPYW(m_DefaultSQLData.ServerLogDB.wszDBName, DBNAMELENMAX, parser.GetAttribute("DBName"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("World"))
|
||
{
|
||
TSQLConnectionInfo SqlCon;
|
||
std::map <int, TSQLConnectionInfo>::iterator ii;
|
||
do
|
||
{
|
||
//Verify
|
||
int nWorldID = _wtoi(parser.GetAttribute("WorldID"));
|
||
|
||
ii = m_DefaultSQLData.WorldDB.find(nWorldID);
|
||
if (ii != m_DefaultSQLData.WorldDB.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [DefaultDataBaseInfo][World] WorldID Duplicated!");
|
||
return false;
|
||
}
|
||
|
||
memset (&SqlCon, 0, sizeof(TSQLConnectionInfo));
|
||
|
||
STRCPYW(SqlCon.wszIP, IPLENMAX, parser.GetAttribute("IP"));
|
||
SqlCon.nPort = _wtoi(parser.GetAttribute("Port"));
|
||
STRCPYW(SqlCon.wszDBID, IDLENMAX, parser.GetAttribute("DBID"));
|
||
STRCPYW(SqlCon.wszDBName, DBNAMELENMAX, parser.GetAttribute("DBName"));
|
||
|
||
m_DefaultSQLData.WorldDB.insert(std::make_pair(nWorldID, SqlCon));
|
||
} while (parser.NextSiblingElement("World"));
|
||
|
||
parser.GoParent();
|
||
}
|
||
}
|
||
|
||
if (parser.FirstChildElement("ServerInfo", true))
|
||
{
|
||
int nServerType;
|
||
int nSID, nAssignedLauncher;
|
||
std::wstring wstrType, wstrExe, wstrExcutePath, wstrExcutePathTemp;
|
||
std::map <int, TDefaultServerConstructData*>::iterator ii;
|
||
bool bFirstGameServer = true;
|
||
|
||
int nServerNo;
|
||
wstrExcutePathTemp.clear();
|
||
do {
|
||
nServerType = MANAGED_TYPE_NONE;
|
||
nSID = 0;
|
||
nAssignedLauncher = 0;
|
||
nServerNo = -1;
|
||
|
||
nSID = _wtoi(parser.GetAttribute("SID"));
|
||
wstrType = parser.GetAttribute("Type");
|
||
nServerType = GetServerType(wstrType.c_str());
|
||
wstrExe = parser.GetAttribute("ExcuteFileName");
|
||
nAssignedLauncher = _wtoi(parser.GetAttribute("AssignedLauncherID"));
|
||
|
||
wstrExcutePath.clear();
|
||
if (parser.GetAttribute("x86Path"))
|
||
{
|
||
wstrExcutePath = parser.GetAttribute("x86Path");
|
||
if (!wstrExcutePathTemp.empty() && wstrExcutePathTemp != wstrExcutePath)
|
||
{
|
||
_ASSERT_EXPR(0, L"x86Path<EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><><EFBFBD>밡<EFBFBD><EBB0A1> <20>մϴ<D5B4>.");
|
||
return false;
|
||
}
|
||
}
|
||
|
||
if (parser.GetAttribute("ServerNum"))
|
||
{
|
||
nServerNo = _wtoi(parser.GetAttribute("ServerNum"));
|
||
}
|
||
|
||
//Verify IDs
|
||
ii = m_PreServerStructData.PreStructList.find(nSID);
|
||
if (ii != m_PreServerStructData.PreStructList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [ServerInfo][SID] Duplicated!");
|
||
return false;
|
||
}
|
||
|
||
int nWorldID = 0;
|
||
std::vector <int>::iterator worldItor;
|
||
TDefaultServerConstructData * pConstructData = NULL;
|
||
|
||
switch (nServerType)
|
||
{
|
||
case MANAGED_TYPE_DB:
|
||
{
|
||
TDBMiddleWareConstructData * pDB = new TDBMiddleWareConstructData;
|
||
if (!pDB)
|
||
{
|
||
_ASSERT_EXPR(0, L"[LoadServerConstructData] pDB == NULL");
|
||
SAFE_DELETE(pDB);
|
||
return false;
|
||
}
|
||
pConstructData = pDB;
|
||
|
||
if (parser.FirstChildElement("DBport"))
|
||
{
|
||
pDB->nDBMiddleWareAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
|
||
if (parser.GetAttribute("For"))
|
||
pDB->nForServerType = GetServerType(parser.GetAttribute("For"));
|
||
else
|
||
pDB->nForServerType = MANAGED_TYPE_NONE;
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_LOGIN:
|
||
{
|
||
TLoginServerConstructData * pLogin = new TLoginServerConstructData;
|
||
if (!pLogin)
|
||
{
|
||
_ASSERT_EXPR(0, L"[LoadServerConstructData] pLogin == NULL");
|
||
return false;
|
||
}
|
||
pConstructData = pLogin;
|
||
|
||
if (parser.FirstChildElement("SocketMax"))
|
||
{
|
||
pLogin->nSocketMax = _wtoi(parser.GetAttribute("Count"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("MasterPort"))
|
||
{
|
||
pLogin->nLoginMasterAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("ClientPort"))
|
||
{
|
||
pLogin->nLoginClientAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_MASTER:
|
||
{
|
||
TMasterServerConstructData * pMaster = new TMasterServerConstructData;
|
||
if (!pMaster)
|
||
{
|
||
_ASSERT_EXPR(0, L"[LoadServerConstructData] pMaster == NULL");
|
||
SAFE_DELETE(pMaster);
|
||
return false;
|
||
}
|
||
pConstructData = pMaster;
|
||
|
||
if (parser.FirstChildElement("SocketMax"))
|
||
{
|
||
pMaster->nSocketMax = _wtoi(parser.GetAttribute("Count"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("VillagePort"))
|
||
{
|
||
pMaster->nMasterVillageAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("GamePort"))
|
||
{
|
||
pMaster->nMasterGameAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_VILLAGE:
|
||
{
|
||
TVillageServerConstructData * pVillage = new TVillageServerConstructData;
|
||
if (!pVillage)
|
||
{
|
||
_ASSERT_EXPR(0, L"[LoadServerConstructData] pVillage == NULL");
|
||
SAFE_DELETE(pVillage);
|
||
return false;
|
||
}
|
||
pConstructData = pVillage;
|
||
|
||
if (parser.FirstChildElement("SocketMax"))
|
||
{
|
||
pVillage->nSocketMax = _wtoi(parser.GetAttribute("Count"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("VillageID"))
|
||
{
|
||
pVillage->nVillageID = _wtoi(parser.GetAttribute("ID"));
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"[LoadServerConstructData] Can't find VillageID");
|
||
SAFE_DELETE(pVillage);
|
||
return false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("ClientPort"))
|
||
{
|
||
pVillage->nVillageClientAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
|
||
if( m_DefaultServerConstructInfo.bGameWorldCombine )
|
||
{
|
||
std::map <int, TSQLConnectionInfo>::iterator itor = m_DefaultSQLData.WorldDB.begin();
|
||
if( itor != m_DefaultSQLData.WorldDB.end() )
|
||
{
|
||
pVillage->nCombineWorld = itor->first;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_GAME:
|
||
{
|
||
TGameServerConstructData * pGame = new TGameServerConstructData;
|
||
if (!pGame)
|
||
{
|
||
_ASSERT_EXPR(0, L"[LoadServerConstructData] pGame == NULL");
|
||
SAFE_DELETE(pGame);
|
||
return false;
|
||
}
|
||
pConstructData = pGame;
|
||
|
||
if (parser.FirstChildElement("SocketMax"))
|
||
{
|
||
pGame->nSocketMax = _wtoi(parser.GetAttribute("Count"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("PreLoad"))
|
||
{
|
||
pGame->bPreLoad = !_wcsicmp(parser.GetAttribute("Load"), L"true") ? true : false;
|
||
}
|
||
|
||
if (parser.FirstChildElement("ClientPortUDP"))
|
||
{
|
||
pGame->nGameClientAcceptUDPPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
|
||
if (parser.FirstChildElement("ClientPortTCP"))
|
||
{
|
||
pGame->nGameClientAcceptTCPPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
if( bFirstGameServer )
|
||
{
|
||
if( m_DefaultServerConstructInfo.bGameWorldCombine )
|
||
{
|
||
pGame->bGameWorldCombine = true;
|
||
}
|
||
}
|
||
|
||
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_LOG:
|
||
{
|
||
TLogServerConstructData * pLog = new TLogServerConstructData;
|
||
if (!pLog)
|
||
{
|
||
_ASSERT_EXPR(0, L"[LoadServerConstructData] pLog == NULL");
|
||
return false;
|
||
}
|
||
pConstructData = pLog;
|
||
|
||
|
||
if (parser.FirstChildElement("Logport"))
|
||
{
|
||
pLog->nLogServerAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_CASH:
|
||
{
|
||
TCashServerConstructData * pCash = new TCashServerConstructData;
|
||
if (!pCash)
|
||
{
|
||
_ASSERT_EXPR(0, L"[LoadServerConstructData] pCash == NULL");
|
||
SAFE_DELETE(pCash);
|
||
return false;
|
||
}
|
||
pConstructData = pCash;
|
||
|
||
if (parser.FirstChildElement("AcceptPort"))
|
||
{
|
||
pCash->nCashAcceptPort = _wtoi(parser.GetAttribute("Port"));
|
||
}
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_NONE:
|
||
{
|
||
pConstructData = new TDefaultServerConstructData;
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [ServerInfo][Type] Unmanaged Type!");
|
||
return false;
|
||
}
|
||
}
|
||
|
||
if (pConstructData == NULL) continue;
|
||
pConstructData->nSID = nSID;
|
||
pConstructData->nServerType = nServerType;
|
||
wcscpy_s(pConstructData->wszType, wstrType.c_str());
|
||
wcscpy_s(pConstructData->wszExcutePath, wstrExcutePath.c_str());
|
||
wcscpy_s(pConstructData->wszExcuteFile, wstrExe.c_str());
|
||
pConstructData->nServerNo = nServerNo;
|
||
pConstructData->nAssignedLauncher = nAssignedLauncher;
|
||
|
||
if (parser.FirstChildElement("WorldID"))
|
||
{
|
||
do {
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ؾ<EFBFBD><D8BE><EFBFBD>
|
||
nWorldID = _wtoi(parser.GetAttribute("ID"));
|
||
|
||
worldItor = std::find(pConstructData->nWorldIDList.begin(), pConstructData->nWorldIDList.end(), nWorldID);
|
||
if (worldItor != pConstructData->nWorldIDList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [ServerInfo][Type:DB][WorldID] Duplicated");
|
||
SAFE_DELETE(pConstructData);
|
||
return false;
|
||
}
|
||
pConstructData->nWorldIDList.push_back(nWorldID);
|
||
} while (parser.NextSiblingElement("WorldID"));
|
||
}
|
||
else
|
||
{
|
||
if (pConstructData->nServerType == MANAGED_TYPE_LOGIN)
|
||
{
|
||
//<2F>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѰ<C6B4><D1B0><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>Ƽ<EFBFBD>dz<EFBFBD><C7B3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>带 <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
for (int g = 0; g < (int)m_vWorldList.size(); g++)
|
||
pConstructData->nWorldIDList.push_back(m_vWorldList[g]);
|
||
}
|
||
else if (pConstructData->nServerType != MANAGED_TYPE_LOG) //<2F>α<CEB1><D7BC><EFBFBD><EFBFBD><EFBFBD> <20>ƴҰ<C6B4><D2B0>쿡<EFBFBD><ECBFA1> <20>˻<EFBFBD><CBBB><EFBFBD> <20>߰<EFBFBD>
|
||
{
|
||
bool bCombineCheck = false;
|
||
if( m_DefaultServerConstructInfo.bGameWorldCombine )
|
||
{
|
||
if ( pConstructData->nServerType == MANAGED_TYPE_DB || pConstructData->nServerType == MANAGED_TYPE_CASH )
|
||
{
|
||
const TNetLauncher * pNetLauncher = GetLauncherInfobyID(pConstructData->nAssignedLauncher);
|
||
|
||
if (pNetLauncher)
|
||
{
|
||
if (pNetLauncher->nWID <= 0)
|
||
{
|
||
_ASSERT_EXPR(0, L"Press Retry"); //<2F>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD>?
|
||
SAFE_DELETE(pConstructData);
|
||
return false;
|
||
}
|
||
|
||
pConstructData->nWorldIDList.push_back(pNetLauncher->nWID);
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [ServerInfo][AssignedLauncher] Not Fount!"); //<2F>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD>?
|
||
SAFE_DELETE(pConstructData);
|
||
return false;
|
||
}
|
||
|
||
for(std::map <int, TSQLConnectionInfo>::iterator itor = m_DefaultSQLData.WorldDB.begin();itor != m_DefaultSQLData.WorldDB.end();itor++)
|
||
{
|
||
nWorldID = itor->first;
|
||
|
||
if( nWorldID == pNetLauncher->nWID )
|
||
continue;
|
||
worldItor = std::find(pConstructData->nWorldIDList.begin(), pConstructData->nWorldIDList.end(), nWorldID);
|
||
if (worldItor != pConstructData->nWorldIDList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [ServerInfo][Type:DB][WorldID] Duplicated");
|
||
SAFE_DELETE(pConstructData);
|
||
return false;
|
||
}
|
||
pConstructData->nWorldIDList.push_back(nWorldID);
|
||
|
||
}
|
||
bCombineCheck = true;
|
||
}
|
||
else if( pConstructData->nServerType == MANAGED_TYPE_GAME && bFirstGameServer )
|
||
{
|
||
for(std::map <int, TSQLConnectionInfo>::iterator itor = m_DefaultSQLData.WorldDB.begin();itor != m_DefaultSQLData.WorldDB.end();itor++)
|
||
{
|
||
nWorldID = itor->first;
|
||
|
||
worldItor = std::find(pConstructData->nWorldIDList.begin(), pConstructData->nWorldIDList.end(), nWorldID);
|
||
if (worldItor != pConstructData->nWorldIDList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [ServerInfo][Type:DB][WorldID] Duplicated");
|
||
SAFE_DELETE(pConstructData);
|
||
return false;
|
||
}
|
||
pConstructData->nWorldIDList.push_back(nWorldID);
|
||
|
||
}
|
||
bCombineCheck = true;
|
||
bFirstGameServer = false;
|
||
}
|
||
}
|
||
|
||
if( !bCombineCheck )
|
||
{
|
||
const TNetLauncher * pNetLauncher = GetLauncherInfobyID(pConstructData->nAssignedLauncher);
|
||
|
||
if (pNetLauncher)
|
||
{
|
||
if (pNetLauncher->nWID <= 0)
|
||
{
|
||
_ASSERT_EXPR(0, L"Press Retry"); //<2F>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD>?
|
||
SAFE_DELETE(pConstructData);
|
||
return false;
|
||
}
|
||
|
||
pConstructData->nWorldIDList.push_back(pNetLauncher->nWID);
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"Check [ServerInfo][AssignedLauncher] Not Fount!"); //<2F>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD>?
|
||
SAFE_DELETE(pConstructData);
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (parser.FirstChildElement("SIDConnection"))
|
||
{
|
||
TSIDBaseConnectionInfo SIDConInfo;
|
||
do {
|
||
memset(&SIDConInfo, 0, sizeof(TSIDBaseConnectionInfo));
|
||
|
||
SIDConInfo.nSID = _wtoi(parser.GetAttribute("SID"));
|
||
SIDConInfo.nType = GetServerType(parser.GetAttribute("Type"));
|
||
|
||
pConstructData->SIDConnectionList.push_back(SIDConInfo);
|
||
} while (parser.NextSiblingElement("SIDConnection"));
|
||
}
|
||
|
||
m_PreServerStructData.PreStructList.insert(std::make_pair(pConstructData->nSID, pConstructData));
|
||
} while (parser.NextSiblingElement("ServerInfo"));
|
||
}
|
||
}
|
||
|
||
CheckChannelInfo(); // ServerStruct <20><> ChannelInfo <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>.
|
||
|
||
ConstructServerStruct(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
ClearPreConstructData(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
|
||
return true;
|
||
}
|
||
|
||
void CDataManager::GetServerCountFromPreconstruct(int nWorldID, int nType, std::vector <const TDefaultServerConstructData*> &vConstDatalist)
|
||
{
|
||
std::map <int, TDefaultServerConstructData*>::iterator ii;
|
||
for (ii = m_PreServerStructData.PreStructList.begin(); ii != m_PreServerStructData.PreStructList.end(); ii++)
|
||
{
|
||
if ((*ii).second->nServerType == nType)
|
||
{
|
||
if (nType == MANAGED_TYPE_LOG)
|
||
vConstDatalist.push_back((*ii).second);
|
||
else if (nType == MANAGED_TYPE_DB)
|
||
{
|
||
if ((*ii).second->nWorldIDList[0] == nWorldID)
|
||
vConstDatalist.push_back((*ii).second);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int CDataManager::GetAssingedUserCount(int nWorldID, int nVillageID)
|
||
{
|
||
const TVillageInfo * pVillageInfo = GetVillageInfo(nWorldID, nVillageID);
|
||
|
||
int nSumCount = 0, nSumCollo = 0;
|
||
|
||
if (pVillageInfo)
|
||
{
|
||
std::vector <TChannelInfo>::const_iterator ii;
|
||
for (ii = pVillageInfo->vOwnedChannelList.begin(); ii != pVillageInfo->vOwnedChannelList.end(); ii++)
|
||
{
|
||
if (!wcsicmp((*ii).wszMapName, L"ColosseumLobbyMap"))
|
||
{
|
||
//<2F>ݷμ<DDB7><CEBC><EFBFBD><EFBFBD>κ<EFBFBD><CEBA>ϰ<EFBFBD><CFB0>쿡<EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> ó<><C3B3>
|
||
nSumCollo = (*ii).nChannelMaxUser;
|
||
}
|
||
else
|
||
nSumCount += (*ii).nChannelMaxUser;
|
||
}
|
||
}
|
||
|
||
//<2F>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD>Ǯ<EFBFBD><C7AE><EFBFBD><EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD>츦 <20><><EFBFBD>Ƶα<C6B5> <20>Ѱǵ<D1B0> <20>հ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.....
|
||
if (nSumCollo > 5000)
|
||
return nSumCount + 5000;
|
||
return nSumCount + nSumCollo;
|
||
}
|
||
|
||
void CDataManager::MakeWord(const TDefaultServerConstructData * pConstruct, std::wstring &wstrMark, int nCreateIndex, int nCreateCount)
|
||
{
|
||
//DefaultSetting
|
||
std::vector <TSIDBaseConnectionInfo>::const_iterator sidItor;
|
||
|
||
USES_CONVERSION;
|
||
|
||
wstrMark = L"/usecmd";
|
||
|
||
if (wcslen(g_Config.wszRegion) > 0 && wcsicmp(g_Config.wszRegion, L"dev"))
|
||
{
|
||
wstrMark += L"/nation=";
|
||
wstrMark += L"_";
|
||
wstrMark += g_Config.wszRegion;
|
||
}
|
||
|
||
wstrMark += L"/sid=";
|
||
wstrMark += I2W(pConstruct->nSID);
|
||
|
||
if (wcslen(pConstruct->wszExcutePath) > 0)
|
||
{
|
||
wstrMark += L"/epath=";
|
||
wstrMark += pConstruct->wszExcutePath;
|
||
}
|
||
|
||
wstrMark += L"/exe=";
|
||
wstrMark += pConstruct->wszExcuteFile;
|
||
|
||
switch (pConstruct->nServerType)
|
||
{
|
||
case MANAGED_TYPE_LOG:
|
||
{
|
||
TLogServerConstructData * pLog = (TLogServerConstructData*)pConstruct;
|
||
|
||
wstrMark += L"/lgp=";
|
||
wstrMark += I2W(pLog->nLogServerAcceptPort > 0 ? pLog->nLogServerAcceptPort : m_DefaultServerConstructInfo.nLogServerAcceptPort + nCreateIndex);
|
||
|
||
if (m_DefaultSQLData.ServerLogDB.nPort > 0)
|
||
{
|
||
wstrMark += L"/sldb=";
|
||
MakeDBConInfo(&m_DefaultSQLData.ServerLogDB, wstrMark);
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_DB:
|
||
{
|
||
TDBMiddleWareConstructData * pDB = (TDBMiddleWareConstructData*)pConstruct;
|
||
|
||
wstrMark += L"/dbp=";
|
||
wstrMark += I2W(pDB->nDBMiddleWareAcceptPort > 0 ? pDB->nDBMiddleWareAcceptPort : m_DefaultServerConstructInfo.nDBMiddleWareAcceptPort + nCreateIndex);
|
||
|
||
for (sidItor = pConstruct->SIDConnectionList.begin(); sidItor != pConstruct->SIDConnectionList.end(); sidItor++)
|
||
{
|
||
if (MakeConInfo((*sidItor).nType, (*sidItor).nSID, wstrMark) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_DB");
|
||
return ;
|
||
}
|
||
}
|
||
|
||
wstrMark += L"/msdb=";
|
||
MakeDBConInfo(&m_DefaultSQLData.MemberShipDB, wstrMark);
|
||
MakeWorldDBConInfo(pDB->nWorldIDList, wstrMark);
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_LOGIN:
|
||
{
|
||
TLoginServerConstructData * pLogin = (TLoginServerConstructData*)pConstruct;
|
||
|
||
wstrMark += L"/smc=";
|
||
wstrMark += I2W(pLogin->nSocketMax > 0 ? pLogin->nSocketMax : m_DefaultServerConstructInfo.nSocketMax);
|
||
|
||
wstrMark += L"/lmp=";
|
||
wstrMark += I2W(pLogin->nLoginMasterAcceptPort > 0 ? pLogin->nLoginMasterAcceptPort : m_DefaultServerConstructInfo.nLoginMasterAcceptPort + nCreateIndex);
|
||
|
||
wstrMark += L"/lcp=";
|
||
wstrMark += I2W(pLogin->nLoginClientAcceptPort > 0 ? pLogin->nLoginClientAcceptPort : m_DefaultServerConstructInfo.nLoginClientAcceptPort + nCreateIndex);
|
||
|
||
for (sidItor = pConstruct->SIDConnectionList.begin(); sidItor != pConstruct->SIDConnectionList.end(); sidItor++)
|
||
{
|
||
if (MakeConInfo((*sidItor).nType, (*sidItor).nSID, wstrMark) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_LOGIN");
|
||
return ;
|
||
}
|
||
}
|
||
|
||
wstrMark += L"/msdb=";
|
||
MakeDBConInfo(&m_DefaultSQLData.MemberShipDB, wstrMark);
|
||
MakeWorldDBConInfo(pLogin->nWorldIDList, wstrMark);
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_CASH:
|
||
{
|
||
TCashServerConstructData * pCash = (TCashServerConstructData*)pConstruct;
|
||
|
||
wstrMark += L"/cwid=";
|
||
wstrMark += I2W(pCash->nWorldIDList[0]);
|
||
|
||
if (pConstruct->nServerNo >= 0)
|
||
{
|
||
wstrMark += L"/svrno=";
|
||
wstrMark += I2W(pConstruct->nServerNo);
|
||
}
|
||
else
|
||
{
|
||
wstrMark += L"/svrno=";
|
||
wstrMark += I2W(pCash->nWorldIDList[0] - 1);
|
||
}
|
||
|
||
wstrMark += L"/cp=";
|
||
wstrMark += I2W(pCash->nCashAcceptPort > 0 ? pCash->nCashAcceptPort : m_DefaultServerConstructInfo.nCashAcceptPort + nCreateIndex);
|
||
|
||
for (sidItor = pConstruct->SIDConnectionList.begin(); sidItor != pConstruct->SIDConnectionList.end(); sidItor++)
|
||
{
|
||
if (MakeConInfo((*sidItor).nType, (*sidItor).nSID, wstrMark) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_CASH");
|
||
return ;
|
||
}
|
||
}
|
||
|
||
wstrMark += L"/msdb=";
|
||
MakeDBConInfo(&m_DefaultSQLData.MemberShipDB, wstrMark);
|
||
MakeWorldDBConInfo(pCash->nWorldIDList, wstrMark);
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_MASTER:
|
||
{
|
||
TMasterServerConstructData * pMaster = (TMasterServerConstructData*)pConstruct;
|
||
|
||
wstrMark += L"/mwi=";
|
||
wstrMark += I2W(pMaster->nWorldIDList[0]);
|
||
|
||
wstrMark += L"/mvp=";
|
||
wstrMark += I2W(pMaster->nMasterVillageAcceptPort > 0 ? pMaster->nMasterVillageAcceptPort : m_DefaultServerConstructInfo.nMasterVillageAcceptPort + nCreateIndex);
|
||
|
||
wstrMark += L"/mgp=";
|
||
wstrMark += I2W(pMaster->nMasterGameAcceptPort > 0 ? pMaster->nMasterGameAcceptPort : m_DefaultServerConstructInfo.nMasterGameAcceptPort + nCreateIndex);
|
||
|
||
if(wcslen(m_DoorsInfo.wszIP) > 0 && m_DoorsInfo.nPort > 0){
|
||
//Doors <20><><EFBFBD><EFBFBD>
|
||
wstrMark += L"/door=";
|
||
wstrMark += m_DoorsInfo.wszIP;
|
||
wstrMark += L",";
|
||
wstrMark += I2W(m_DoorsInfo.nPort);
|
||
|
||
//MemberShipDB <20><><EFBFBD><EFBFBD>
|
||
if(wcslen(m_DefaultSQLData.MemberShipDB.wszIP) > 0 && m_DefaultSQLData.MemberShipDB.nPort > 0){
|
||
wstrMark += L"/did1=";
|
||
wstrMark += m_DefaultSQLData.MemberShipDB.wszIP;
|
||
wstrMark += L",";
|
||
wstrMark += I2W(m_DefaultSQLData.MemberShipDB.nPort);
|
||
}
|
||
|
||
//WorldDB <20><><EFBFBD><EFBFBD>
|
||
if(!m_DefaultSQLData.WorldDB.empty()){
|
||
std::map <int, TSQLConnectionInfo>::iterator worldItor;
|
||
worldItor = m_DefaultSQLData.WorldDB.find(pMaster->nWorldIDList[0]);
|
||
if (worldItor != m_DefaultSQLData.WorldDB.end())
|
||
{
|
||
wstrMark += L"/did2=";
|
||
wstrMark += worldItor->second.wszIP;
|
||
wstrMark += L",";
|
||
wstrMark += I2W(worldItor->second.nPort);
|
||
}
|
||
}
|
||
}
|
||
|
||
bool bMakeLogin = true;
|
||
for (sidItor = pConstruct->SIDConnectionList.begin(); sidItor != pConstruct->SIDConnectionList.end(); sidItor++)
|
||
{
|
||
if ((*sidItor).nType == MANAGED_TYPE_LOGIN)
|
||
bMakeLogin = false;
|
||
|
||
if (MakeConInfo((*sidItor).nType, (*sidItor).nSID, wstrMark) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_MASTER");
|
||
return ;
|
||
}
|
||
}
|
||
|
||
if (bMakeLogin && MakeConInfo(MANAGED_TYPE_LOGIN, 0, wstrMark, false, &pMaster->nWorldIDList) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] bMakeLogin && MakeConInfo(MANAGED_TYPE_LOGIN, 0, wstrMark, false, &pMaster->nWorldIDList) == false");
|
||
return ;
|
||
}
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_VILLAGE:
|
||
{
|
||
TVillageServerConstructData * pVillage = (TVillageServerConstructData*)pConstruct;
|
||
|
||
int nVillageUserCount = GetAssingedUserCount(pVillage->nWorldIDList[0], pVillage->nVillageID);
|
||
int nStructUserCount = pVillage->nSocketMax > 0 ? pVillage->nSocketMax : m_DefaultServerConstructInfo.nSocketMax;
|
||
int nSocketMax = nVillageUserCount >= nStructUserCount ? nVillageUserCount + 500 : nStructUserCount;
|
||
|
||
wstrMark += L"/smc=";
|
||
wstrMark += I2W(nSocketMax);
|
||
|
||
wstrMark += L"/vwid=";
|
||
wstrMark += I2W(pVillage->nWorldIDList[0]);
|
||
|
||
wstrMark += L"/vcwid=";
|
||
wstrMark += I2W(pVillage->nCombineWorld);
|
||
|
||
wstrMark += L"/vid=";
|
||
wstrMark += I2W(pVillage->nVillageID);
|
||
|
||
wstrMark += L"/vcp=";
|
||
wstrMark += I2W(pVillage->nVillageClientAcceptPort > 0 ? pVillage->nVillageClientAcceptPort : m_DefaultServerConstructInfo.nVillageClientAcceptPort + nCreateIndex);
|
||
|
||
MakeDolbyInfo(pVillage->nWorldIDList[0], wstrMark);
|
||
|
||
for (sidItor = pConstruct->SIDConnectionList.begin(); sidItor != pConstruct->SIDConnectionList.end(); sidItor++)
|
||
{
|
||
if (MakeConInfo((*sidItor).nType, (*sidItor).nSID, wstrMark) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_VILLAGE 0");
|
||
return ;
|
||
}
|
||
}
|
||
|
||
if (MakeConInfo(MANAGED_TYPE_CASH, 0, wstrMark, false, &pVillage->nWorldIDList) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_VILLAGE 1");
|
||
return ;
|
||
}
|
||
|
||
if (MakeConInfo(MANAGED_TYPE_MASTER, 0, wstrMark, false, &pVillage->nWorldIDList) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_VILLAGE 2");
|
||
return ;
|
||
}
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_GAME:
|
||
{
|
||
TGameServerConstructData * pGame = (TGameServerConstructData*)pConstruct;
|
||
|
||
wstrMark += L"/smc=";
|
||
wstrMark += I2W(pGame->nSocketMax > 0 ? pGame->nSocketMax : m_DefaultServerConstructInfo.nSocketMax);
|
||
|
||
wstrMark += L"/gpl=";
|
||
wstrMark += pGame->bPreLoad == true ? L"1" : L"0";
|
||
|
||
for (int j = 0; j < (int)pGame->nWorldIDList.size(); j++)
|
||
{
|
||
wstrMark += L"/gwid=";
|
||
wstrMark += I2W(pGame->nWorldIDList[j]);
|
||
}
|
||
|
||
MakeDolbyInfo(pGame->nWorldIDList[0], wstrMark);
|
||
|
||
wstrMark += L"/gat=";
|
||
wstrMark += I2W(pGame->nGameAffinityType);
|
||
|
||
wstrMark += L"/gucp=";
|
||
//wstrMark += I2W(pGame->nGameClientAcceptUDPPort > 0 ? pGame->nGameClientAcceptUDPPort : m_DefaultServerConstructInfo.nGameClientAcceptUDPPort + (nCreateIndex * 10));
|
||
wstrMark += I2W(pGame->nGameClientAcceptUDPPort > 0 ? pGame->nGameClientAcceptUDPPort : m_DefaultServerConstructInfo.nGameClientAcceptUDPPort + (nCreateIndex * 15));
|
||
|
||
wstrMark += L"/gtcp=";
|
||
wstrMark += I2W(pGame->nGameClientAcceptTCPPort > 0 ? pGame->nGameClientAcceptTCPPort : m_DefaultServerConstructInfo.nGameClientAcceptTCPPort + nCreateIndex);
|
||
|
||
wstrMark += L"/gcwg=";
|
||
wstrMark += pGame->bGameWorldCombine == true ? L"1" : L"0";
|
||
|
||
for (sidItor = pConstruct->SIDConnectionList.begin(); sidItor != pConstruct->SIDConnectionList.end(); sidItor++)
|
||
{
|
||
if (MakeConInfo((*sidItor).nType, (*sidItor).nSID, wstrMark) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_GAME 0");
|
||
return ;
|
||
}
|
||
}
|
||
|
||
if (MakeConInfo(MANAGED_TYPE_CASH, 0, wstrMark, false, &pGame->nWorldIDList) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_GAME 1");
|
||
return ;
|
||
}
|
||
|
||
if (MakeConInfo(MANAGED_TYPE_MASTER, 0, wstrMark, true, &pGame->nWorldIDList) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] fail MakeConInfo in MANAGED_TYPE_GAME 2");
|
||
return ;
|
||
}
|
||
|
||
bool bIsFirstGame = IsFirstGameCon(pGame->nSID);
|
||
if (bIsFirstGame)
|
||
{
|
||
wstrMark += L"/gsat=";
|
||
wstrMark += I2W(_GAMESERVER_AFFINITYTYPE_FARM);
|
||
}
|
||
break;
|
||
}
|
||
|
||
default:
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeWord] Invalid Type");
|
||
return ;
|
||
}
|
||
}
|
||
|
||
wstrMark += L"/pci=";
|
||
wstrMark += I2W(nCreateIndex);
|
||
|
||
wstrMark += L"/pcc=";
|
||
wstrMark += I2W(nCreateCount);
|
||
|
||
//mark set []<5D><> <20><><EFBFBD><EFBFBD>
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ(<28>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>) [/sid=1000]
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> [/exe=DBServer64.exe]
|
||
|
||
//<2F><><EFBFBD>ϸƽ<CFB8>ī<EFBFBD><C4AB>Ʈ [/smc=1000]
|
||
//<2F><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> [/pci=0]
|
||
//<2F><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> [/pcc=1]
|
||
|
||
//<2F><><EFBFBD>Ŵ<F1BDBAB8><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [/sip=10.0.3.22]
|
||
//<2F><><EFBFBD>Ŵ<F1BDBAB8><C5B4><EFBFBD><EFBFBD><EFBFBD>Ʈ [/sp=80000]
|
||
|
||
//<2F><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD>̽<EFBFBD>
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [/msdb=192.168.0.20,43002,DragonNest,DNMemberShip]
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [/wdb=9,192.168.0.20,43002,DragonNest,DNWorld]
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>α<CEB1><D7B5><EFBFBD> [/sldb=192.168.0.20,43011,DragonNest,DNServerLog]
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [/daip=10.0.3.22,30000,33000] audioport, controlport
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ [/dbp=2600]
|
||
|
||
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>
|
||
//<2F>α<EFBFBD><CEB1><EFBFBD><EFBFBD>ؼ<EFBFBD> [/log=10.0.3.22,2613]
|
||
//<2F>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> [/login=10.0.3.22,7000]
|
||
//ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> [/cash=10.0.3.22,12600]
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> [/master=10.0.3.22,8000]
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [/db=10.0.3.22,2600]
|
||
|
||
//<2F>α<EFBFBD><CEB1>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ [/lmp=7000]
|
||
//<2F>α<EFBFBD><CEB1>μ<EFBFBD><CEBC><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE>Ʈ [/lcp=14300]
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD> [/mwi=1]
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ [/mvp=8000]
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ [/mgp=9000]
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD> [/vwid=1]
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD> [/vid=1]
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE>Ʈ [/vcp=14400]
|
||
|
||
//<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD> [/gwid=1]
|
||
//<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> [/gpl=1]
|
||
//<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> UDPŬ<50><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE>Ʈ [/gucp=15100]
|
||
//<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> TCPŬ<50><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE>Ʈ [/gtcp=14500]
|
||
//<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20>Ҵ<EFBFBD>Ÿ<EFBFBD><C5B8> [/gat=1]
|
||
|
||
//ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD> [/cwid=1]
|
||
//ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ [/cp=12600]
|
||
|
||
//<2F>α<CEB1><D7BC><EFBFBD> <20><>Ʈ [/lgp=300]
|
||
}
|
||
|
||
void CDataManager::MakeDBConInfo(const TSQLConnectionInfo * pInfo, std::wstring &wstrOut)
|
||
{
|
||
USES_CONVERSION;
|
||
wstrOut += pInfo->wszIP;
|
||
wstrOut += L",";
|
||
wstrOut += I2W(pInfo->nPort);
|
||
wstrOut += L",";
|
||
wstrOut += pInfo->wszDBID;
|
||
wstrOut += L",";
|
||
wstrOut += pInfo->wszDBName;
|
||
}
|
||
|
||
void CDataManager::MakeWorldDBConInfo(std::vector <int> &vWorldIDs, std::wstring &wstrOut)
|
||
{
|
||
USES_CONVERSION;
|
||
std::vector <int>::iterator worldItor;
|
||
std::map <int, TSQLConnectionInfo>::iterator sqlItor;
|
||
for (worldItor = vWorldIDs.begin(); worldItor != vWorldIDs.end(); worldItor++)
|
||
{
|
||
sqlItor = m_DefaultSQLData.WorldDB.find((*worldItor));
|
||
if (sqlItor != m_DefaultSQLData.WorldDB.end())
|
||
{
|
||
wstrOut += L"/wdb=";
|
||
wstrOut += I2W((*worldItor));
|
||
wstrOut += L",";
|
||
MakeDBConInfo(&(*sqlItor).second, wstrOut);
|
||
}
|
||
}
|
||
}
|
||
|
||
bool CDataManager::MakeConInfo(int nType, int nSID, std::wstring &wstr, bool bCalledGame, std::vector <int> * pvWorldID)
|
||
{
|
||
std::wstring tempKey;
|
||
if (nSID > 0)
|
||
{
|
||
std::map <int, TDefaultServerConstructData*>::iterator ii = m_PreServerStructData.PreStructList.find(nSID);
|
||
if (ii != m_PreServerStructData.PreStructList.end())
|
||
{
|
||
if ((*ii).second->nServerType == nType)
|
||
{
|
||
if ((*ii).second->nServerType != MANAGED_TYPE_LOG && (*ii).second->nServerType != MANAGED_TYPE_DB && (*ii).second->nServerType != MANAGED_TYPE_LOGIN)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] (*ii).second->nServerType != MANAGED_TYPE_LOG && (*ii).second->nServerType != MANAGED_TYPE_DB && (*ii).second->nServerType != MANAGED_TYPE_LOGIN");
|
||
return false;
|
||
}
|
||
|
||
switch ((*ii).second->nServerType)
|
||
{
|
||
case MANAGED_TYPE_LOG:
|
||
{
|
||
wstr += L"/log=";
|
||
tempKey = L"lgp";
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_DB:
|
||
{
|
||
wstr += L"/db=";
|
||
tempKey = L"dbp";
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_LOGIN:
|
||
{
|
||
wstr += L"/login=";
|
||
tempKey = L"lmp";
|
||
break;
|
||
}
|
||
|
||
default:
|
||
return false;
|
||
}
|
||
|
||
//wstr += (*ii).second->nServerType == MANAGED_TYPE_LOG ? L"/log=" : L"/db=";
|
||
const TNetLauncher * pLauncher = GetLauncherInfobyID((*ii).second->nAssignedLauncher);
|
||
if (pLauncher)
|
||
{
|
||
wstr += pLauncher->szIP;
|
||
wstr += L",";
|
||
|
||
std::map <int, TServerExcuteData>::iterator itor = m_ServerExcuteData.find(nSID);
|
||
if (itor != m_ServerExcuteData.end())
|
||
{
|
||
//if (GetFirstRightValue(nType == MANAGED_TYPE_LOG ? L"lgp" : L"dbp", (*itor).second.wstrExcuteData, wstr, true) == false)
|
||
if (GetFirstRightValue(tempKey.c_str(), (*itor).second.wstrExcuteData, wstr, true) == false)
|
||
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] GetFirstRightValue(tempKey.c_str(), (*itor).second.wstrExcuteData, wstr, true) == fals");
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] m_ServerExcuteData can not find nSID");
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] pLauncher == NULL");
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pvWorldID == NULL)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] pvWorldID == NULL");
|
||
return false;
|
||
}
|
||
|
||
std::vector <int>::iterator worlditor;
|
||
std::map <int, TDefaultServerConstructData*>::iterator preconitor;
|
||
bool bFlag = false;
|
||
if (nType == MANAGED_TYPE_LOGIN || nType == MANAGED_TYPE_CASH || nType == MANAGED_TYPE_MASTER)
|
||
{
|
||
std::map <int, TServerExcuteData>::iterator ii;
|
||
for (ii = m_ServerExcuteData.begin(); ii != m_ServerExcuteData.end(); ii++)
|
||
{
|
||
preconitor = m_PreServerStructData.PreStructList.end();
|
||
if ((*ii).second.nServerType == nType)
|
||
{
|
||
bFlag = false;
|
||
const TNetLauncher * pLauncher = GetLauncherInfobyID((*ii).second.nAssignedLauncherID);
|
||
if (pLauncher == NULL)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] pLauncher == NULL");
|
||
return false;
|
||
}
|
||
|
||
//std::wstring tempKey;
|
||
switch ((*ii).second.nServerType)
|
||
{
|
||
case MANAGED_TYPE_LOGIN:
|
||
{
|
||
wstr += L"/login=";
|
||
tempKey = L"lmp";
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_CASH:
|
||
{
|
||
preconitor = m_PreServerStructData.PreStructList.find((*ii).second.nSID);
|
||
if (preconitor == m_PreServerStructData.PreStructList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] m_PreServerStructData != m_ServerExcuteData");
|
||
return false;
|
||
}
|
||
|
||
if( m_DefaultServerConstructInfo.bGameWorldCombine )
|
||
{
|
||
for (worlditor = pvWorldID->begin(); worlditor != pvWorldID->end(); worlditor++)
|
||
{
|
||
if( (*preconitor).second->nWorldIDList[0] == *worlditor )
|
||
{
|
||
bFlag = true;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (worlditor = pvWorldID->begin(); worlditor != pvWorldID->end(); worlditor++)
|
||
{
|
||
std::vector <int>::iterator finditor = std::find((*preconitor).second->nWorldIDList.begin(), (*preconitor).second->nWorldIDList.end(), (*worlditor));
|
||
if (finditor != (*preconitor).second->nWorldIDList.end())
|
||
{
|
||
bFlag = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (bFlag == false) continue;
|
||
|
||
wstr += L"/cash=";
|
||
tempKey = L"cp";
|
||
break;
|
||
}
|
||
|
||
case MANAGED_TYPE_MASTER:
|
||
{
|
||
preconitor = m_PreServerStructData.PreStructList.find((*ii).second.nSID);
|
||
if (preconitor == m_PreServerStructData.PreStructList.end())
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] m_PreServerStructData != m_ServerExcuteData");
|
||
return false;
|
||
}
|
||
|
||
for (worlditor = pvWorldID->begin(); worlditor != pvWorldID->end(); worlditor++)
|
||
{
|
||
std::vector <int>::iterator finditor = std::find((*preconitor).second->nWorldIDList.begin(), (*preconitor).second->nWorldIDList.end(), (*worlditor));
|
||
if (finditor != (*preconitor).second->nWorldIDList.end())
|
||
{
|
||
bFlag = true;
|
||
break;
|
||
}
|
||
}
|
||
if (bFlag == false) continue;
|
||
|
||
wstr += L"/master=";
|
||
tempKey = bCalledGame == false ? L"mvp" : L"mgp";
|
||
break;
|
||
}
|
||
|
||
default:
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] Invalid Server Type");
|
||
return false;
|
||
}
|
||
}
|
||
|
||
wstr += pLauncher->szIP;
|
||
wstr += L",";
|
||
|
||
if (GetFirstRightValue(tempKey.c_str(), (*ii).second.wstrExcuteData, wstr, true) == false)
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] GetFirstRightValue(tempKey.c_str(), (*ii).second.wstrExcuteData, wstr, true) == false");
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
_ASSERT_EXPR(0, L"[MakeConInfo] Invalid nType");
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
void CDataManager::MakeDolbyInfo(int nWorldID, std::wstring &wstr)
|
||
{
|
||
std::vector <TDolbyAxon>::iterator ii;
|
||
for (ii = m_DefaultServerConstructInfo.vDolbyAxonInfo.begin(); ii != m_DefaultServerConstructInfo.vDolbyAxonInfo.end(); ii++)
|
||
{
|
||
if ((*ii).nDolbyWorldID == nWorldID)
|
||
{
|
||
USES_CONVERSION;
|
||
wstr += L"/daip=";
|
||
wstr += (*ii).wszPrivateDolbyIP;
|
||
wstr += L",";
|
||
wstr += (*ii).wszPublicDolbyIP;
|
||
wstr += L",";
|
||
wstr += I2W((*ii).nDolbyAPort);
|
||
wstr += L",";
|
||
wstr += I2W((*ii).nDolbyCPort);
|
||
return ;
|
||
}
|
||
}
|
||
}
|
||
|
||
bool CDataManager::MakeFirstGameCon(wstring &wstr, int &nFarmServerID)
|
||
{
|
||
std::map <int, TServerExcuteData>::iterator verifyer;
|
||
for (verifyer = m_ServerExcuteData.begin(); verifyer != m_ServerExcuteData.end(); verifyer++)
|
||
{
|
||
std::wstring wstrTemp;
|
||
if ((*verifyer).second.nServerType == MANAGED_TYPE_GAME && GetFirstRightValue(L"gsat", (*verifyer).second.wstrExcuteData, wstrTemp))
|
||
{
|
||
USES_CONVERSION;
|
||
wstr += L"/fsid=";
|
||
wstr += I2W((*verifyer).second.nSID);
|
||
nFarmServerID = (*verifyer).second.nSID;
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
int CDataManager::VerifyNetLauncher(unsigned long nIP)
|
||
{
|
||
std::map<unsigned long, TNetLauncher*>::iterator ii;
|
||
for (ii = m_NetLauncherList.begin(); ii != m_NetLauncherList.end(); ii++)
|
||
{
|
||
if ((*ii).second->nIP == nIP)
|
||
return (*ii).second->nID;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
const TNetLauncher * CDataManager::GetLauncherInfo(unsigned int nIP)
|
||
{
|
||
std::map<unsigned long, TNetLauncher*>::iterator ii = m_NetLauncherList.find(nIP);
|
||
if (ii != m_NetLauncherList.end())
|
||
return (*ii).second;
|
||
return NULL;
|
||
}
|
||
|
||
const TNetLauncher * CDataManager::GetLauncherInfobyID(int nNID)
|
||
{
|
||
std::map<unsigned long, TNetLauncher*>::iterator ii;
|
||
for (ii = m_NetLauncherList.begin(); ii != m_NetLauncherList.end(); ii++)
|
||
{
|
||
if ((*ii).second->nID == nNID)
|
||
return (*ii).second;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
bool CDataManager::IsNeedOtherExcutePath(int nID)
|
||
{
|
||
bool bRet = false;
|
||
std::map <int, TServerExcuteData>::iterator ii;
|
||
for (ii = m_ServerExcuteData.begin(); ii != m_ServerExcuteData.end(); ii++)
|
||
{
|
||
if ((*ii).second.nAssignedLauncherID == nID)
|
||
{
|
||
std::wstring wstrExcutePath;
|
||
GetFirstRightValue(L"epath", (*ii).second.wstrExcuteData, wstrExcutePath);
|
||
|
||
bRet = wstrExcutePath.empty() ? false : true;
|
||
if (bRet) return bRet;
|
||
}
|
||
}
|
||
return bRet;
|
||
}
|
||
|
||
void CDataManager::SetLauncherPublicIP(int nID, char* szPublicIP)
|
||
{
|
||
if (m_NetLauncherList.empty())
|
||
return;
|
||
|
||
if (m_NetLauncherList[nID])
|
||
MultiByteToWideChar(CP_ACP, 0, szPublicIP, -1, m_NetLauncherList[nID]->wszPublicIP, IPLENMAX );
|
||
}
|
||
|
||
void CDataManager::GetLauncherIds(std::vector <TNetLauncherInfo> * pList)
|
||
{
|
||
std::map<unsigned long, TNetLauncher*>::iterator ii;
|
||
for (ii = m_NetLauncherList.begin(); ii != m_NetLauncherList.end(); ii++)
|
||
{
|
||
TNetLauncherInfo Info;
|
||
memset(&Info, 0, sizeof(TNetLauncherInfo));
|
||
|
||
Info.nNID = (*ii).second->nID;
|
||
wcscpy_s(Info.wszIP, (*ii).second->szIP);
|
||
wcscpy_s(Info.wszPublicIP, IPLENMAX, (*ii).second->wszPublicIP);
|
||
pList->push_back(Info);
|
||
}
|
||
}
|
||
|
||
void CDataManager::GetLauncherIds(std::map <int, TNetLauncherInfo> * pList)
|
||
{
|
||
std::map<unsigned long, TNetLauncher*>::iterator ii;
|
||
for (ii = m_NetLauncherList.begin(); ii != m_NetLauncherList.end(); ii++)
|
||
{
|
||
TNetLauncherInfo Info;
|
||
memset(&Info, 0, sizeof(TNetLauncherInfo));
|
||
|
||
Info.nNID = (*ii).second->nID;
|
||
wcscpy_s(Info.wszIP, (*ii).second->szIP);
|
||
wcscpy_s(Info.wszPublicIP, IPLENMAX, (*ii).second->wszPublicIP);
|
||
pList->insert(std::make_pair(Info.nNID, Info));
|
||
}
|
||
}
|
||
|
||
void CDataManager::GetAssingedPatchTypeList(int nID, std::list <char> * pList)
|
||
{
|
||
std::map <int, TServerExcuteData>::iterator ii;
|
||
for (ii = m_ServerExcuteData.begin(); ii != m_ServerExcuteData.end(); ii++)
|
||
{
|
||
if ((*ii).second.nAssignedLauncherID == nID)
|
||
{
|
||
bool bCheck = false;
|
||
std::list <char>::iterator il;
|
||
for (il = pList->begin(); il != pList->end(); il++)
|
||
{
|
||
if ((*il) == (*ii).second.nPatchType)
|
||
{
|
||
bCheck = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (bCheck == false)
|
||
pList->push_back((*ii).second.nPatchType);
|
||
}
|
||
}
|
||
}
|
||
|
||
int CDataManager::GetAssignedCreateLastIndex(int nID, const TCHAR * pType)
|
||
{
|
||
int nIdx = 0;
|
||
std::map<unsigned long, TNetLauncher*>::iterator ii;
|
||
for (ii = m_NetLauncherList.begin(); ii != m_NetLauncherList.end(); ii++)
|
||
{
|
||
TNetLauncher * pLauncher = (*ii).second;
|
||
if (pLauncher->nID == nID)
|
||
{
|
||
std::vector <TServerExcuteData*>::iterator ih;
|
||
for (ih = pLauncher->ExcuteList.begin(); ih != pLauncher->ExcuteList.end(); ih++)
|
||
{
|
||
TServerExcuteData * pCmd = (*ih);
|
||
if (!_tcsicmp(pCmd->wszType, pType) && pCmd->nCreateIndex + 1 > nIdx)
|
||
nIdx = pCmd->nCreateIndex + 1;
|
||
}
|
||
}
|
||
}
|
||
return nIdx;
|
||
}
|
||
|
||
void CDataManager::SetAssignedCreateCount(int nID, const TCHAR * pType, int nCreateCount)
|
||
{
|
||
std::map<unsigned long, TNetLauncher*>::iterator ii;
|
||
for (ii = m_NetLauncherList.begin(); ii != m_NetLauncherList.end(); ii++)
|
||
{
|
||
TNetLauncher * pLauncher = (*ii).second;
|
||
if (pLauncher->nID == nID)
|
||
{
|
||
std::vector <TServerExcuteData*>::iterator ih;
|
||
for (ih = pLauncher->ExcuteList.begin(); ih != pLauncher->ExcuteList.end(); ih++)
|
||
{
|
||
TServerExcuteData * pCmd = (*ih);
|
||
if (!_tcsicmp(pCmd->wszType, pType) && pCmd->nCreateCount < nCreateCount)
|
||
pCmd->nCreateCount = nCreateCount;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDataManager::GetCommandList(std::vector <int> * pvList)
|
||
{
|
||
std::map <int, TServerExcuteData>::iterator ii;
|
||
for (ii = m_ServerExcuteData.begin(); ii != m_ServerExcuteData.end(); ii++)
|
||
pvList->push_back((*ii).first);
|
||
}
|
||
|
||
void CDataManager::GetCommandListByPID(int nPID, std::vector <int> * pvList)
|
||
{
|
||
std::map <int, TPartitionInfo*>::iterator ii = m_PartitionList.find(nPID);
|
||
if (ii != m_PartitionList.end())
|
||
{
|
||
std::map <unsigned long, TNetLauncher*>::iterator ih;
|
||
for (ih = m_NetLauncherList.begin(); ih != m_NetLauncherList.end(); ih++)
|
||
{
|
||
if ((*ih).second->nPID == (*ii).second->nPID)
|
||
{
|
||
std::map <int, TServerExcuteData>::iterator ij;
|
||
for (ij = m_ServerExcuteData.begin(); ij != m_ServerExcuteData.end(); ij++)
|
||
if ((*ij).second.nAssignedLauncherID == (*ih).second->nID)
|
||
pvList->push_back((*ij).first);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDataManager::GetExeCommandList(int nNID, std::vector <TServerExcuteData> * pvList)
|
||
{
|
||
std::map <unsigned long, TNetLauncher*>::iterator ih;
|
||
for (ih = m_NetLauncherList.begin(); ih != m_NetLauncherList.end(); ih++)
|
||
{
|
||
if ((*ih).second->nID == nNID)
|
||
{
|
||
std::map <int, TServerExcuteData>::iterator ij;
|
||
for (ij = m_ServerExcuteData.begin(); ij != m_ServerExcuteData.end(); ij++)
|
||
if ((*ij).second.nAssignedLauncherID == (*ih).second->nID)
|
||
pvList->push_back(ij->second);
|
||
}
|
||
}
|
||
}
|
||
|
||
const TServerExcuteData * CDataManager::GetCommand(int nSID)
|
||
{
|
||
std::map <int, TServerExcuteData>::iterator ii = m_ServerExcuteData.find(nSID);
|
||
return ii != m_ServerExcuteData.end() ? &(*ii).second : NULL;
|
||
}
|
||
|
||
bool CDataManager::CheckMonitorUser(const char * pName, const char * pPass, int &nLevel, bool &bCanDuplicate)
|
||
{
|
||
std::vector <TMonitorUserData>::iterator ii;
|
||
for (ii = m_MonitorUserData.begin(); ii != m_MonitorUserData.end(); ii++)
|
||
{
|
||
if (!strcmp((*ii).szUserName, pName))
|
||
{
|
||
if (!strcmp((*ii).szPassWord, pPass))
|
||
{
|
||
nLevel = (*ii).nMonitorLevel;
|
||
bCanDuplicate = (*ii).bDuplicateLogin;
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void CDataManager::ClearData()
|
||
{
|
||
std::map <int, TPartitionInfo*>::iterator PartItor;
|
||
for (PartItor = m_PartitionList.begin(); PartItor != m_PartitionList.end(); PartItor++)
|
||
SAFE_DELETE((*PartItor).second);
|
||
m_PartitionList.clear();
|
||
|
||
std::map <unsigned long, TNetLauncher*>::iterator in;
|
||
for (in = m_NetLauncherList.begin(); in != m_NetLauncherList.end(); in++)
|
||
SAFE_DELETE((*in).second);
|
||
m_NetLauncherList.clear();
|
||
m_ServerExcuteData.clear();
|
||
}
|
||
|
||
void CDataManager::ClearUserData()
|
||
{
|
||
m_MonitorUserData.clear();
|
||
}
|
||
|
||
CDataManager * CDataManager::GetInstance()
|
||
{
|
||
static CDataManager s;
|
||
return &s;
|
||
}
|
||
|
||
#if defined (_SERVICEMANAGER_EX)
|
||
void CDataManager::GetPartitionList(OUT vector<const TPartitionInfo*>& list) const
|
||
{
|
||
for each (const map<int, TPartitionInfo*>::value_type v in m_PartitionList)
|
||
{
|
||
list.push_back(v.second);
|
||
}
|
||
}
|
||
void CDataManager::GetPartitionText(OUT wchar_t text[256]) const
|
||
{
|
||
if (m_PartitionList.empty())
|
||
{
|
||
::wsprintf(text, L"[%s] PID : %d, IP : %s", L"Partition", 1, m_szServiceIP);
|
||
return;
|
||
}
|
||
|
||
vector<const TPartitionInfo*> list;
|
||
for each (const map<int, TPartitionInfo*>::value_type v in m_PartitionList)
|
||
list.push_back(v.second);
|
||
|
||
if (list.empty())
|
||
return;
|
||
|
||
const TPartitionInfo* pInfo = list[0];
|
||
if (pInfo)
|
||
::wsprintf(text, L"[%s] PID : %d IP : %s", pInfo->szPartitionName, pInfo->nPID, m_szServiceIP);
|
||
}
|
||
|
||
void CDataManager::GetLauncherList(OUT vector<const TNetLauncher*>& list) const
|
||
{
|
||
for each (const map<unsigned long, TNetLauncher*>::value_type v in m_NetLauncherList)
|
||
{
|
||
list.push_back(v.second);
|
||
}
|
||
}
|
||
|
||
void CDataManager::GetWorldList(OUT vector<const TServerInfo*>& list) const
|
||
{
|
||
for each (int v in m_vWorldList)
|
||
{
|
||
const TServerInfo* pWorld = GetServerInfo(v);
|
||
if (pWorld)
|
||
list.push_back(pWorld);
|
||
}
|
||
}
|
||
#endif // #if defined (_SERVICEMANAGER_EX)
|
||
|
||
bool CDataManager::IsFirstGameCon(int nSID)
|
||
{
|
||
int nFirstGameCon = 0;
|
||
std::map <int, TServerExcuteData>::iterator verifyer;
|
||
for (verifyer = m_ServerExcuteData.begin(); verifyer != m_ServerExcuteData.end(); verifyer++)
|
||
{
|
||
if ((*verifyer).second.nServerType == MANAGED_TYPE_GAME)
|
||
{
|
||
nFirstGameCon = (*verifyer).second.nSID;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return (nFirstGameCon == nSID);
|
||
}
|
||
|
||
void CDataManager::CheckChannelInfo() const
|
||
{
|
||
USES_CONVERSION;
|
||
std::wstring wstrErrorPopup( L"ChannelInfo Not Found!!!!\r\n\r\n" );
|
||
std::wstring wstrErrorLog( L"ChannelInfo Not Found!!!! " );
|
||
int nErrorCount = 0;
|
||
|
||
typedef std::map<int, TDefaultServerConstructData*>::const_iterator
|
||
citerator;
|
||
|
||
citerator iter = m_PreServerStructData.PreStructList.begin();
|
||
while( iter != m_PreServerStructData.PreStructList.end() )
|
||
{
|
||
const TDefaultServerConstructData* pConstructData = (*iter).second;
|
||
++ iter;
|
||
|
||
if( pConstructData->nServerType != MANAGED_TYPE_VILLAGE )
|
||
{
|
||
continue;
|
||
}
|
||
|
||
const TVillageServerConstructData* pVillage = static_cast<const TVillageServerConstructData*>(pConstructData);
|
||
if( pVillage->nWorldIDList.empty() )
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if( GetVillageInfo( pVillage->nWorldIDList[0], pVillage->nVillageID ) )
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if( 0 < nErrorCount )
|
||
{
|
||
wstrErrorPopup += L"\r\n";
|
||
wstrErrorLog += L",";
|
||
}
|
||
|
||
std::wstring wstrInfo;
|
||
wstrInfo += L"[WorldID:";
|
||
wstrInfo += I2W(pVillage->nWorldIDList[0]);
|
||
wstrInfo += L"][VillageID:";
|
||
wstrInfo += I2W(pVillage->nVillageID);
|
||
wstrInfo += L"]";
|
||
|
||
wstrErrorPopup += wstrInfo;
|
||
wstrErrorLog += wstrInfo;
|
||
|
||
++ nErrorCount;
|
||
}
|
||
|
||
if(0 == nErrorCount)
|
||
{
|
||
return;
|
||
}
|
||
|
||
wstrErrorPopup += L"\r\n";
|
||
wstrErrorLog += L"\r\n";
|
||
|
||
#if defined (_SERVICEMANAGER_EX)
|
||
MessageBox( NULL, wstrErrorPopup.c_str(), L"Warning", MB_OK | MB_ICONWARNING );
|
||
#else
|
||
#endif
|
||
|
||
g_Log.Log(LogType::_ERROR, L"%s", wstrErrorLog.c_str());
|
||
} |