Jump to content

Balgram

Inactive Member
  • Posts

    24
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by Balgram

  1. when i login, game crash

     

    syserr.txt

    Spoiler

    0513 00:37:08951 :: 
    networkModule.py(line:208) SetSelectCharacterPhase
    system.py(line:130) __pack_import
    system.py(line:110) _process_result
    introSelect.py(line:30) <module>
    system.py(line:130) __pack_import
    system.py(line:110) _process_result
    interfaceModule.py(line:12) <module>
    system.py(line:130) __pack_import

    networkModule.SetSelectCharacterPhase - <type 'exceptions.IndentationError'>:unindent does not match any outer indentation level (uiInventory.py, line 313)

    0513 00:37:08951 :: ============================================================================================================
    0513 00:37:08951 :: Abort!!!!


     

  2. When i SHIFT + ENTER game is shutdown... I tried change WhisperDialog.py but it still doesn't work 

     

    sysser.txt:

    0131 22:20:07967 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=137) - Strange Skill Need Weapon(CLAW)
    0131 22:20:07967 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=139) - Strange Skill Need Weapon(CLAW)
    0131 22:20:23118 :: Failed to load script file : UIScript/WhisperDialog.py
    0131 22:20:23119 :: 
    ui.py(line:2798) LoadScriptFile
    system.py(line:192) execfile
    system.py(line:163) Run
    UIScript/WhisperDialog.py(line:131) <module>
    
    LoadScriptFile!!!!!!!!!!!!!! - <type 'exceptions.AttributeError'>:'module' object has no attribute 'MINIMIZE'
    
    0131 22:20:23119 :: ============================================================================================================
    0131 22:20:23119 :: Abort!!!!
    
    
    0131 22:20:23120 :: 
    uiWhisper.py(line:72) LoadDialog
    ui.py(line:2815) LoadScriptFile
    exception.py(line:36) Abort
    
    WhisperDialog.LoadDialog.LoadScript - <type 'exceptions.SystemExit'>:
    
    0131 22:20:23120 :: ============================================================================================================
    0131 22:20:23120 :: Abort!!!!

     

  3. I have a problem with trading in a game... When i click TRADE,nothing will happen...

     

    client syserr.txt

    0131 19:35:18266 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=137) - Strange Skill Need Weapon(CLAW)
    0131 19:35:18267 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=139) - Strange Skill Need Weapon(CLAW)
    0131 19:35:47403 :: Traceback (most recent call last):
    
    0131 19:35:47403 ::   File "game.py", line 967, in StartExchange
    
    0131 19:35:47404 ::   File "interfaceModule.py", line 723, in StartExchange
    
    0131 19:35:47404 ::   File "uiExchange.py", line 85, in OpenDialog
    
    0131 19:35:47404 :: TypeError
    0131 19:35:47404 :: : 
    0131 19:35:47404 :: cannot concatenate 'str' and 'int' objects
    0131 19:35:47404 :: 

    uiExchange.py 85 line:

    	self.TitleName.SetText(localeInfo.EXCHANGE_TITLE % (exchange.GetNameFromTarget())

    game.py 967 line:

    	def StartExchange(self):
    		self.interface.StartExchange()

    interfacemodule.py 723 line:

    	def StartExchange(self):
    		self.dlgExchange.OpenDialog()
    		self.dlgExchange.Refresh()

    PLEASE HOW TO FIX?

  4. uishop.py

     

    	def Open(self, vid, type=0):
    		self.vid=int(vid)
    		isPrivateShop = False
    		isMainPlayerPrivateShop = False
    		myshop=False
    		for i in xrange(len(constInfo.MyShops)):
    			if int(constInfo.MyShops[i]["vid"]) == int(self.vid):
    				myshop=True
    				self.vid=int(constInfo.MyShops[i]["id"])
    		chr.SelectInstance(self.vid)
    		if chr.GetRace() == 30000 or not chr.IsNPC(self.vid):
    			isPrivateShop = True
    		if player.IsMainCharacterIndex(self.vid):
    			myshop=True
    			self.vid=""
    		if myshop == True:
    			isMainPlayerPrivateShop = True
    
    			self.btnBuy.Hide()
    			self.btnSell.Hide()
    			self.btnClose.Show()
    
    		else:
    
    			isMainPlayerPrivateShop = False
    
    			self.btnBuy.Show()
    			self.btnSell.Show()
    			self.btnClose.Hide()
    
    		shop.Open(isPrivateShop, isMainPlayerPrivateShop)
    
    		self.tabIdx = 0
    
    		if isPrivateShop:
    			self.__HideMiddleTabs()
    			self.__HideSmallTabs()
    		else:
    			if shop.GetTabCount() == 1:
    				self.__ShowBuySellButton()
    				self.__HideMiddleTabs()
    				self.__HideSmallTabs()
    			elif shop.GetTabCount() == 2:
    				self.__HideBuySellButton()
    				self.__ShowMiddleTabs()
    				self.__HideSmallTabs()
    				self.__SetTabNames()
    				self.middleRadioButtonGroup.OnClick(0)
    			elif shop.GetTabCount() == 3:
    				self.__HideBuySellButton()
    				self.__HideMiddleTabs()
    				self.__ShowSmallTabs()
    				self.__SetTabNames()
    				self.middleRadioButtonGroup.OnClick(1)
    
    		self.Refresh()
    		self.SetTop()
    		
    		self.Show()
    
    		(self.xShopStart, self.yShopStart, z) = player.GetMainCharacterPosition()

    i dont know... i will try to code client again
     

    FIXED... 

  5. Hello, I have a problem... When I try create offline shop, so nothing happens. I click on "create shop" and nothing...
    Here is a gif: 

    https://metin2.download/picture/PE8PVv2R6HjXmYT5vZwz5tMJ7O25UYBy/.gif

    Cllent syserr.txt

    0126 13:38:43808 :: Traceback (most recent call last):
    
    0126 13:38:43809 ::   File "ui.py", line 1024, in CallEvent
    
    0126 13:38:43809 ::   File "ui.py", line 87, in __call__
    
    0126 13:38:43809 ::   File "ui.py", line 69, in __call__
    
    0126 13:38:43809 ::   File "uiNewShop.py", line 130, in CreateShop
    
    0126 13:38:43809 :: TypeError
    0126 13:38:43809 :: : 
    0126 13:38:43809 :: Open() takes exactly 2 arguments (3 given)
    0126 13:38:43809 :: 
    

     

  6. Hello, please help me to clean DB_ERROR_LOG.txt

    DB_ERROR_LOG.txt

    ClientManagerBoot.cpp: In member function 'bool CClientManager::InitializeMobTable()':
    ClientManagerBoot.cpp:402: warning: statement has no effect
    ClientManagerBoot.cpp: In member function 'bool CClientManager::InitializeItemTable()':
    ClientManagerBoot.cpp:703: warning: unused variable 'testValue'
    ProtoReader.cpp: In function 'int get_Item_SubType_Value(int, std::string)':
    ProtoReader.cpp:204: warning: comparison between signed and unsigned integer expressions
    ProtoReader.cpp:207: warning: comparison between signed and unsigned integer expressions
    

    ClientManagerBoot.cpp

    // vim:ts=4 sw=4
    #include <map>
    #include "stdafx.h"
    #include "ClientManager.h"
    #include "Main.h"
    #include "Monarch.h"
    #include "CsvReader.h"
    #include "ProtoReader.h"
    
    using namespace std;
    
    extern int g_test_server;
    extern std::string g_stLocaleNameColumn;
    
    bool CClientManager::InitializeTables()
    {
    	if (!InitializeMobTable())
    	{
    		sys_err("InitializeMobTable FAILED");
    		return false;
    	}
    	if (!MirrorMobTableIntoDB())
    	{
    		sys_err("MirrorMobTableIntoDB FAILED");
    		return false; 
    	}
    
    	if (!InitializeItemTable())
    	{
    		sys_err("InitializeItemTable FAILED");
    		return false; 
    	}
    
    	if (!MirrorItemTableIntoDB())
    	{
    		sys_err("MirrorItemTableIntoDB FAILED");
    		return false; 
    	}
    
    	if (!InitializeShopTable())
    	{
    		sys_err("InitializeShopTable FAILED");
    		return false;
    	}
    
    	if (!InitializeSkillTable())
    	{
    		sys_err("InitializeSkillTable FAILED");
    		return false;
    	}
    
    	if (!InitializeRefineTable())
    	{
    		sys_err("InitializeRefineTable FAILED");
    		return false;
    	}
    
    	if (!InitializeItemAttrTable())
    	{
    		sys_err("InitializeItemAttrTable FAILED");
    		return false;
    	}
    
    	if (!InitializeItemRareTable())
    	{
    		sys_err("InitializeItemRareTable FAILED");
    		return false;
    	}
    
    	if (!InitializeBanwordTable())
    	{
    		sys_err("InitializeBanwordTable FAILED");
    		return false;
    	}
    
    	if (!InitializeLandTable())
    	{
    		sys_err("InitializeLandTable FAILED");
    		return false;
    	}
    
    	if (!InitializeObjectProto())
    	{
    		sys_err("InitializeObjectProto FAILED");
    		return false;
    	}
    
    	if (!InitializeObjectTable())
    	{
    		sys_err("InitializeObjectTable FAILED");
    		return false;
    	}
    
    	if (!InitializeMonarch())
    	{
    		sys_err("InitializeMonarch FAILED");
    		return false;
    	}
    
    
    	return true;
    }
    
    bool CClientManager::InitializeRefineTable()
    {
    	char query[2048];
    
    	snprintf(query, sizeof(query),
    			"SELECT id, cost, prob, vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 FROM refine_proto%s",
    			GetTablePostfix());
    
    	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
    	SQLResult * pRes = pkMsg->Get();
    
    	if (!pRes->uiNumRows)
    		return true;
    
    	if (m_pRefineTable)
    	{
    		sys_log(0, "RELOAD: refine_proto");
    		delete [] m_pRefineTable;
    		m_pRefineTable = NULL;
    	}
    
    	m_iRefineTableSize = pRes->uiNumRows;
    
    	m_pRefineTable	= new TRefineTable[m_iRefineTableSize];
    	memset(m_pRefineTable, 0, sizeof(TRefineTable) * m_iRefineTableSize);
    
    	TRefineTable* prt = m_pRefineTable;
    	MYSQL_ROW data;
    
    	while ((data = mysql_fetch_row(pRes->pSQLResult)))
    	{
    		//const char* s_szQuery = "SELECT src_vnum, result_vnum, cost, prob, "
    		//"vnum0, count0, vnum1, count1, vnum2, count2,  vnum3, count3, vnum4, count4 "
    
    		int col = 0;
    		//prt->src_vnum = atoi(data[col++]);
    		//prt->result_vnum = atoi(data[col++]);
    		str_to_number(prt->id, data[col++]);
    		str_to_number(prt->cost, data[col++]);
    		str_to_number(prt->prob, data[col++]);
    
    		for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++)
    		{
    			str_to_number(prt->materials[i].vnum, data[col++]);
    			str_to_number(prt->materials[i].count, data[col++]);
    			if (prt->materials[i].vnum == 0)
    			{
    				prt->material_count = i;
    				break;
    			}
    		}
    
    		sys_log(0, "REFINE: id %ld cost %d prob %d mat1 %lu cnt1 %d", prt->id, prt->cost, prt->prob, prt->materials[0].vnum, prt->materials[0].count);
    
    		prt++;
    	}
    	return true;
    }
    
    class FCompareVnum
    {
    	public:
    		bool operator () (const TEntityTable & a, const TEntityTable & b) const
    		{
    			return (a.dwVnum < b.dwVnum);
    		}
    };
    
    bool CClientManager::InitializeMobTable()
    {
    	//================== 함수 설명 ==================//
    	//1. 요약 : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' 파일을 읽고,
    	//		(!)[mob_table] 테이블 오브젝트를 생성한다. (타입 : TMobTable)
    	//2. 순서
    	//	1) 'mob_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
    	//	2) 'mob_proto_test.txt'파일과 (a)[localMap] 맵으로
    	//		(b)[test_map_mobTableByVnum](vnum:TMobTable) 맵을 생성한다.
    	//	3) 'mob_proto.txt' 파일과  (a)[localMap] 맵으로
    	//		(!)[mob_table] 테이블을 만든다.
    	//			<참고>
    	//			각 row 들 중, 
    	//			(b)[test_map_mobTableByVnum],(!)[mob_table] 모두에 있는 row는
    	//			(b)[test_map_mobTableByVnum]의 것을 사용한다.
    	//	4) (b)[test_map_mobTableByVnum]의 row중, (!)[mob_table]에 없는 것을 추가한다.
    	//3. 테스트
    	//	1)'mob_proto.txt' 정보가 mob_table에 잘 들어갔는지. -> 완료
    	//	2)'mob_names.txt' 정보가 mob_table에 잘 들어갔는지.
    	//	3)'mob_proto_test.txt' 에서 [겹치는] 정보가 mob_table 에 잘 들어갔는지.
    	//	4)'mob_proto_test.txt' 에서 [새로운] 정보가 mob_table 에 잘 들어갔는지.
    	//	5) (최종) 게임 클라이언트에서 제대로 작동 하는지.
    	//_______________________________________________//
    
    
    	//===============================================//
    	//	1) 'mob_names.txt' 파일을 읽어서 (a)[localMap] 맵을 만든다.
    	//<(a)localMap 맵 생성>
    	map<int,const char*> localMap;
    	bool isNameFile = true;
    	//<파일 읽기>
    	cCsvTable nameData;
    	if(!nameData.Load("mob_names.txt",'\t'))
    	{
    		fprintf(stderr, "mob_names.txt 파일을 읽어오지 못했습니다\n");
    		isNameFile = false;
    	} else {
    		nameData.Next();	//설명row 생략.
    		while(nameData.Next()) {
    			localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
    		}
    	}
    	//________________________________________________//
    
    	
    	//===============================================//
    	//	2) 'mob_proto_test.txt'파일과 (a)localMap 맵으로
    	//		(b)[test_map_mobTableByVnum](vnum:TMobTable) 맵을 생성한다.
    	//0. 
    	set<int> vnumSet;	//테스트용 파일 데이터중, 신규여부 확인에 사용.
    	//1. 파일 읽어오기
    	bool isTestFile = true;
    	cCsvTable test_data;
    	if(!test_data.Load("mob_proto_test.txt",'\t'))
    	{
    		fprintf(stderr, "테스트 파일이 없습니다. 그대로 진행합니다.\n");
    		isTestFile = false;
    	}
    	//2. (c)[test_map_mobTableByVnum](vnum:TMobTable) 맵 생성.
    	map<DWORD, TMobTable *> test_map_mobTableByVnum;
    	if (isTestFile) {
    		test_data.Next();	//설명 로우 넘어가기.
    
    		//ㄱ. 테스트 몬스터 테이블 생성.
    		TMobTable * test_mob_table = NULL;
    		int test_MobTableSize = test_data.m_File.GetRowCount()-1;
    		test_mob_table = new TMobTable[test_MobTableSize];
    		memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize);
    
    		//ㄴ. 테스트 몬스터 테이블에 값을 넣고, 맵에까지 넣기.
    		while(test_data.Next()) {
    
    			if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap))
    			{
    				fprintf(stderr, "몹 프로토 테이블 셋팅 실패.\n");			
    			}
    
    			test_map_mobTableByVnum.insert(std::map<DWORD, TMobTable *>::value_type(test_mob_table->dwVnum, test_mob_table));
    
    			
    			++test_mob_table;
    			}
    
    	}
    
    	//	3) 'mob_proto.txt' 파일과  (a)[localMap] 맵으로
    	//		(!)[mob_table] 테이블을 만든다.
    	//			<참고>
    	//			각 row 들 중, 
    	//			(b)[test_map_mobTableByVnum],(!)[mob_table] 모두에 있는 row는
    	//			(b)[test_map_mobTableByVnum]의 것을 사용한다.
    
    	//1. 파일 읽기.
    	cCsvTable data;
    	if(!data.Load("mob_proto.txt",'\t')) {
    		fprintf(stderr, "mob_proto.txt 파일을 읽어오지 못했습니다\n");
    		return false;
    	}
    	data.Next();					//설명 row 넘어가기
    	//2. (!)[mob_table] 생성하기
    	//2.1 새로 추가되는 갯수를 파악
    	int addNumber = 0;
    	while(data.Next()) {
    		int vnum = atoi(data.AsStringByIndex(0));
    		std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
    		it_map_mobTable = test_map_mobTableByVnum.find(vnum);
    		if(it_map_mobTable != test_map_mobTableByVnum.end()) {
    			addNumber++;
    		}
    	}
    	//data를 다시 첫줄로 옮긴다.(다시 읽어온다;;)
    	data.Destroy();
    	if(!data.Load("mob_proto.txt",'\t'))
    	{
    		fprintf(stderr, "mob_proto.txt 파일을 읽어오지 못했습니다\n");
    		return false;
    	}
    	data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
    	//2.2 크기에 맞게 mob_table 생성
    	if (!m_vec_mobTable.empty())
    	{
    		sys_log(0, "RELOAD: mob_proto");
    		m_vec_mobTable.clear();
    	}
    	m_vec_mobTable.resize(data.m_File.GetRowCount()-1 + addNumber);
    	memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
    	TMobTable * mob_table = &m_vec_mobTable[0];
    	//2.3 데이터 채우기
    	while (data.Next())
    	{
    		int col = 0;
    		//(b)[test_map_mobTableByVnum]에 같은 row가 있는지 조사.
    		bool isSameRow = true;
    		std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
    		it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col)));
    		if(it_map_mobTable == test_map_mobTableByVnum.end()) {
    			isSameRow = false;
    		}
    		//같은 row 가 있으면 (b)에서 읽어온다.
    		if(isSameRow) {
    			TMobTable *tempTable = it_map_mobTable->second;
    
    			mob_table->dwVnum = tempTable->dwVnum;
    			strlcpy(mob_table->szName, tempTable->szName, sizeof(tempTable->szName));
    			strlcpy(mob_table->szLocaleName, tempTable->szLocaleName, sizeof(tempTable->szName));
    			mob_table->bRank = tempTable->bRank;
    			mob_table->bType = tempTable->bType;
    			mob_table->bBattleType = tempTable->bBattleType;
    			mob_table->bLevel = tempTable->bLevel;
    			mob_table->bSize = tempTable->bSize;
    			mob_table->dwAIFlag = tempTable->dwAIFlag;
    			mob_table->dwRaceFlag = tempTable->dwRaceFlag;
    			mob_table->dwImmuneFlag = tempTable->dwImmuneFlag;
    			mob_table->bEmpire = tempTable->bEmpire;
    			strlcpy(mob_table->szFolder, tempTable->szFolder, sizeof(tempTable->szName));
    			mob_table->bOnClickType = tempTable->bOnClickType;
    			mob_table->bStr = tempTable->bStr;
    			mob_table->bDex = tempTable->bDex;
    			mob_table->bCon = tempTable->bCon;
    			mob_table->bInt = tempTable->bInt;
    			mob_table->dwDamageRange[0] = tempTable->dwDamageRange[0];
    			mob_table->dwDamageRange[1] = tempTable->dwDamageRange[1];
    			mob_table->dwMaxHP = tempTable->dwMaxHP;
    			mob_table->bRegenCycle = tempTable->bRegenCycle;
    			mob_table->bRegenPercent = tempTable->bRegenPercent;
    			mob_table->dwGoldMin = tempTable->dwGoldMin;
    			mob_table->dwGoldMax = tempTable->dwGoldMax;
    			mob_table->dwExp = tempTable->dwExp;
    			mob_table->wDef = tempTable->wDef;
    			mob_table->sAttackSpeed = tempTable->sAttackSpeed;
    			mob_table->sMovingSpeed = tempTable->sMovingSpeed;
    			mob_table->bAggresiveHPPct = tempTable->bAggresiveHPPct;
    			mob_table->wAggressiveSight = tempTable->wAggressiveSight;
    			mob_table->wAttackRange = tempTable->wAttackRange;
    				
    			mob_table->dwDropItemVnum = tempTable->dwDropItemVnum;
    			mob_table->dwResurrectionVnum = tempTable->dwResurrectionVnum;
    			for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
    				mob_table->cEnchants[i] = tempTable->cEnchants[i];
    				
    			for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
    				mob_table->cResists[i] = tempTable->cResists[i];
    				
    			mob_table->fDamMultiply = tempTable->fDamMultiply;
    			mob_table->dwSummonVnum = tempTable->dwSummonVnum;
    			mob_table->dwDrainSP = tempTable->dwDrainSP;
    			mob_table->dwPolymorphItemVnum = tempTable->dwPolymorphItemVnum;
    				
    			
    			mob_table->Skills[0].bLevel = tempTable->Skills[0].bLevel;
    			mob_table->Skills[0].dwVnum = tempTable->Skills[0].dwVnum;
    			mob_table->Skills[1].bLevel = tempTable->Skills[1].bLevel;
    			mob_table->Skills[1].dwVnum = tempTable->Skills[1].dwVnum;
    			mob_table->Skills[2].bLevel = tempTable->Skills[2].bLevel;
    			mob_table->Skills[2].dwVnum = tempTable->Skills[2].dwVnum;
    			mob_table->Skills[3].bLevel = tempTable->Skills[3].bLevel;
    			mob_table->Skills[3].dwVnum = tempTable->Skills[3].dwVnum;
    			mob_table->Skills[4].bLevel = tempTable->Skills[4].bLevel;
    			mob_table->Skills[4].dwVnum = tempTable->Skills[4].dwVnum;
    				
    			mob_table->bBerserkPoint = tempTable->bBerserkPoint;
    			mob_table->bStoneSkinPoint = tempTable->bStoneSkinPoint;
    			mob_table->bGodSpeedPoint = tempTable->bGodSpeedPoint;
    			mob_table->bDeathBlowPoint = tempTable->bDeathBlowPoint;
    			mob_table->bRevivePoint = tempTable->bRevivePoint;
    		} else {
    
    			if (!Set_Proto_Mob_Table(mob_table, data, localMap))
    			{
    				fprintf(stderr, "몹 프로토 테이블 셋팅 실패.\n");			
    			}
    
    						
    		}
    
    		//셋에 vnum 추가
    		vnumSet.insert(mob_table->dwVnum);
    		
    
    		sys_log(1, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
    		++mob_table;
    
    	}
    	//_____________________________________________________//
    
    
    	//	4) (b)[test_map_mobTableByVnum]의 row중, (!)[mob_table]에 없는 것을 추가한다.
    	//파일 다시 읽어오기.
    	test_data.Destroy();
    	isTestFile = true;
    	test_data;
    	if(!test_data.Load("mob_proto_test.txt",'\t'))
    	{
    		fprintf(stderr, "테스트 파일이 없습니다. 그대로 진행합니다.\n");
    		isTestFile = false;
    	}
    	if(isTestFile) {
    		test_data.Next();	//설명 로우 넘어가기.
    
    		while (test_data.Next())	//테스트 데이터 각각을 훑어나가며,새로운 것을 추가한다.
    		{
    			//중복되는 부분이면 넘어간다.
    			set<int>::iterator itVnum;
    			itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
    			if (itVnum != vnumSet.end()) {
    				continue;
    			}
    
    			if (!Set_Proto_Mob_Table(mob_table, test_data, localMap))
    			{
    				fprintf(stderr, "몹 프로토 테이블 셋팅 실패.\n");			
    			}
    
    			sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
    			++mob_table;
    
    		}
    	}
    	sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
    	return true;
    }
    
    bool CClientManager::InitializeShopTable()
    {
    	MYSQL_ROW	data;
    	int		col;
    
    	static const char * s_szQuery = 
    		"SELECT "
    		"shop.vnum, "
    		"shop.npc_vnum, "
    		"shop_item.item_vnum, "
    		"shop_item.count "
    		"FROM shop LEFT JOIN shop_item "
    		"ON shop.vnum = shop_item.shop_vnum ORDER BY shop.vnum, shop_item.item_vnum";
    
    	std::auto_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));
    
    	// shop의 vnum은 있는데 shop_item 이 없을경우... 실패로 처리되니 주의 요망.
    	// 고처야할부분
    	SQLResult * pRes2 = pkMsg2->Get();
    
    	if (!pRes2->uiNumRows)
    	{
    		sys_err("InitializeShopTable : Table count is zero.");
    		return false;
    	}
    
    	std::map<int, TShopTable *> map_shop;
    
    	if (m_pShopTable)
    	{
    		delete [] (m_pShopTable);
    		m_pShopTable = NULL;
    	}
    
    	TShopTable * shop_table = m_pShopTable;
    
    	while ((data = mysql_fetch_row(pRes2->pSQLResult)))
    	{
    		col = 0;
    
    		int iShopVnum = 0;
    		str_to_number(iShopVnum, data[col++]);
    
    		if (map_shop.end() == map_shop.find(iShopVnum))
    		{
    			shop_table = new TShopTable;
    			memset(shop_table, 0, sizeof(TShopTable));
    			shop_table->dwVnum	= iShopVnum;
    
    			map_shop[iShopVnum] = shop_table;
    		}
    		else
    			shop_table = map_shop[iShopVnum];
    
    		str_to_number(shop_table->dwNPCVnum, data[col++]);
    
    		if (!data[col])	// 아이템이 하나도 없으면 NULL이 리턴 되므로..
    			continue;
    
    		TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];
    
    		str_to_number(pItem->vnum, data[col++]);
    		str_to_number(pItem->count, data[col++]);
    
    		++shop_table->byItemCount;
    	}
    
    	m_pShopTable = new TShopTable[map_shop.size()];
    	m_iShopTableSize = map_shop.size();
    
    	typeof(map_shop.begin()) it = map_shop.begin();
    
    	int i = 0;
    
    	while (it != map_shop.end())
    	{
    		thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
    		sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
    		++i;
    	}
    
    	return true;
    }
    
    bool CClientManager::InitializeQuestItemTable()
    {
    	using namespace std;
    
    	static const char * s_szQuery = "SELECT vnum, name, %s FROM quest_item_proto ORDER BY vnum";
    
    	char query[1024];
    	snprintf(query, sizeof(query), s_szQuery, g_stLocaleNameColumn.c_str());
    
    	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
    	SQLResult * pRes = pkMsg->Get();
    
    	if (!pRes->uiNumRows)
    	{
    		sys_err("query error or no rows: %s", query);
    		return false;
    	}
    
    	MYSQL_ROW row;
    
    	while ((row = mysql_fetch_row(pRes->pSQLResult)))
    	{
    		int col = 0;
    
    		TItemTable tbl;
    		memset(&tbl, 0, sizeof(tbl));
    
    		str_to_number(tbl.dwVnum, row[col++]);
    
    		if (row[col])
    			strlcpy(tbl.szName, row[col], sizeof(tbl.szName));
    
    		col++;
    
    		if (row[col])
    			strlcpy(tbl.szLocaleName, row[col], sizeof(tbl.szLocaleName));
    
    		col++;
    
    		if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
    		{
    			sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
    			continue;
    		}
    
    		tbl.bType = ITEM_QUEST; // quest_item_proto 테이블에 있는 것들은 모두 ITEM_QUEST 유형
    		tbl.bSize = 1;
    
    		m_vec_itemTable.push_back(tbl);
    	}
    
    	return true;
    }
    
    bool CClientManager::InitializeItemTable()
    {
    	//================== 함수 설명 ==================//
    	//1. 요약 : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' 파일을 읽고,
    	//		<item_table>(TItemTable), <m_map_itemTableByVnum> 오브젝트를 생성한다.
    	//2. 순서
    	//	1) 'item_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
    	//	2) 'item_proto_text.txt'파일과 (a)[localMap] 맵으로
    	//		(b)[test_map_itemTableByVnum](vnum:TItemTable) 맵을 생성한다.
    	//	3) 'item_proto.txt' 파일과  (a)[localMap] 맵으로
    	//		(!)[item_table], <m_map_itemTableByVnum>을 만든다.
    	//			<참고>
    	//			각 row 들 중, 
    	//			(b)[test_map_itemTableByVnum],(!)[mob_table] 모두에 있는 row는
    	//			(b)[test_map_itemTableByVnum]의 것을 사용한다.
    	//	4) (b)[test_map_itemTableByVnum]의 row중, (!)[item_table]에 없는 것을 추가한다.
    	//3. 테스트
    	//	1)'item_proto.txt' 정보가 item_table에 잘 들어갔는지. -> 완료
    	//	2)'item_names.txt' 정보가 item_table에 잘 들어갔는지.
    	//	3)'item_proto_test.txt' 에서 [겹치는] 정보가 item_table 에 잘 들어갔는지.
    	//	4)'item_proto_test.txt' 에서 [새로운] 정보가 item_table 에 잘 들어갔는지.
    	//	5) (최종) 게임 클라이언트에서 제대로 작동 하는지.
    	//_______________________________________________//
    
    
    
    	//=================================================================================//
    	//	1) 'item_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
    	//=================================================================================//
    	bool isNameFile = true;
    	map<int,const char*> localMap;
    	cCsvTable nameData;
    	if(!nameData.Load("item_names.txt",'\t'))
    	{
    		fprintf(stderr, "item_names.txt 파일을 읽어오지 못했습니다\n");
    		isNameFile = false;
    	} else {
    		nameData.Next();
    		while(nameData.Next()) {
    			localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
    		}
    	}
    	//_________________________________________________________________//
    
    	//=================================================================//
    	//	2) 'item_proto_text.txt'파일과 (a)[localMap] 맵으로
    	//		(b)[test_map_itemTableByVnum](vnum:TItemTable) 맵을 생성한다.
    	//=================================================================//
    	map<DWORD, TItemTable *> test_map_itemTableByVnum;
    	//1. 파일 읽어오기.
    	cCsvTable test_data;
    	if(!test_data.Load("item_proto_test.txt",'\t'))
    	{
    		fprintf(stderr, "item_proto_test.txt 파일을 읽어오지 못했습니다\n");
    		//return false;
    	} else {
    		test_data.Next();	//설명 로우 넘어가기.
    
    		//2. 테스트 아이템 테이블 생성.
    		TItemTable * test_item_table = NULL;
    		int test_itemTableSize = test_data.m_File.GetRowCount()-1;
    		test_item_table = new TItemTable[test_itemTableSize];
    		memset(test_item_table, 0, sizeof(TItemTable) * test_itemTableSize);
    
    		//3. 테스트 아이템 테이블에 값을 넣고, 맵에까지 넣기.
    		while(test_data.Next()) {
    
    
    			if (!Set_Proto_Item_Table(test_item_table, test_data, localMap))
    			{
    				fprintf(stderr, "아이템 프로토 테이블 셋팅 실패.\n");			
    			}
    
    			test_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(test_item_table->dwVnum, test_item_table));
    			test_item_table++;
    
    		}
    	}
    	//______________________________________________________________________//
    
    
    	//========================================================================//
    	//	3) 'item_proto.txt' 파일과  (a)[localMap] 맵으로
    	//		(!)[item_table], <m_map_itemTableByVnum>을 만든다.
    	//			<참고>
    	//			각 row 들 중, 
    	//			(b)[test_map_itemTableByVnum],(!)[mob_table] 모두에 있는 row는
    	//			(b)[test_map_itemTableByVnum]의 것을 사용한다.
    	//========================================================================//
    
    	//vnum들을 저장할 셋. 새로운 테스트 아이템을 판별할때 사용된다.
    	set<int> vnumSet;
    
    	//파일 읽어오기.
    	cCsvTable data;
    	if(!data.Load("item_proto.txt",'\t'))
    	{
    		fprintf(stderr, "item_proto.txt 파일을 읽어오지 못했습니다\n");
    		return false;
    	}
    	data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
    
    	if (!m_vec_itemTable.empty())
    	{
    		sys_log(0, "RELOAD: item_proto");
    		m_vec_itemTable.clear();
    		m_map_itemTableByVnum.clear();
    	}
    
    	//===== 아이템 테이블 생성 =====//
    	//새로 추가되는 갯수를 파악한다.
    	int addNumber = 0;
    	while(data.Next()) {
    		int vnum = atoi(data.AsStringByIndex(0));
    		std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
    		it_map_itemTable = test_map_itemTableByVnum.find(vnum);
    		if(it_map_itemTable != test_map_itemTableByVnum.end()) {
    			addNumber++;
    		}
    	}
    	//data를 다시 첫줄로 옮긴다.(다시 읽어온다;;)
    	data.Destroy();
    	if(!data.Load("item_proto.txt",'\t'))
    	{
    		fprintf(stderr, "item_proto.txt 파일을 읽어오지 못했습니다\n");
    		return false;
    	}
    	data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
    
    	m_vec_itemTable.resize(data.m_File.GetRowCount() - 1 + addNumber);
    	memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
    	int testValue =  m_vec_itemTable.size();
    
    	TItemTable * item_table = &m_vec_itemTable[0];
    
    	while (data.Next())
    	{
    		int col = 0;
    
    		std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
    		it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col)));
    		if(it_map_itemTable == test_map_itemTableByVnum.end()) {
    			//각 칼럼 데이터 저장
    			
    			if (!Set_Proto_Item_Table(item_table, data, localMap))
    			{
    				fprintf(stderr, "아이템 프로토 테이블 셋팅 실패.\n");			
    			}
    
    
    			
    		} else {	//$$$$$$$$$$$$$$$$$$$$$$$ 테스트 아이템 정보가 있다!	
    			TItemTable *tempTable = it_map_itemTable->second;
    
    			item_table->dwVnum = tempTable->dwVnum;
    			strlcpy(item_table->szName, tempTable->szName, sizeof(item_table->szName));
    			strlcpy(item_table->szLocaleName, tempTable->szLocaleName, sizeof(item_table->szLocaleName));
    			item_table->bType = tempTable->bType;
    			item_table->bSubType = tempTable->bSubType;
    			item_table->bSize = tempTable->bSize;
    			item_table->dwAntiFlags = tempTable->dwAntiFlags;
    			item_table->dwFlags = tempTable->dwFlags;
    			item_table->dwWearFlags = tempTable->dwWearFlags;
    			item_table->dwImmuneFlag = tempTable->dwImmuneFlag;
    			item_table->dwGold = tempTable->dwGold;
    			item_table->dwShopBuyPrice = tempTable->dwShopBuyPrice;
    			item_table->dwRefinedVnum =tempTable->dwRefinedVnum;
    			item_table->wRefineSet =tempTable->wRefineSet;
    			item_table->bAlterToMagicItemPct = tempTable->bAlterToMagicItemPct;
    			item_table->cLimitRealTimeFirstUseIndex = -1;
    			item_table->cLimitTimerBasedOnWearIndex = -1;
    
    			int i;
    
    			for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
    			{
    				item_table->aLimits[i].bType = tempTable->aLimits[i].bType;
    				item_table->aLimits[i].lValue = tempTable->aLimits[i].lValue;
    
    				if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType)
    					item_table->cLimitRealTimeFirstUseIndex = (char)i;
    
    				if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType)
    					item_table->cLimitTimerBasedOnWearIndex = (char)i;
    			}
    
    			for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
    			{
    				item_table->aApplies[i].bType = tempTable->aApplies[i].bType;
    				item_table->aApplies[i].lValue = tempTable->aApplies[i].lValue;
    			}
    
    			for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
    				item_table->alValues[i] = tempTable->alValues[i];
    
    			item_table->bGainSocketPct = tempTable->bGainSocketPct;
    			item_table->sAddonType = tempTable->sAddonType;
    
    			item_table->bWeight  = tempTable->bWeight;
    
    		}
    		vnumSet.insert(item_table->dwVnum);
    		m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
    		++item_table;
    	}
    	//_______________________________________________________________________//
    
    	//========================================================================//
    	//	4) (b)[test_map_itemTableByVnum]의 row중, (!)[item_table]에 없는 것을 추가한다.
    	//========================================================================//
    	test_data.Destroy();
    	if(!test_data.Load("item_proto_test.txt",'\t'))
    	{
    		fprintf(stderr, "item_proto_test.txt 파일을 읽어오지 못했습니다\n");
    		//return false;
    	} else {
    		test_data.Next();	//설명 로우 넘어가기.
    
    		while (test_data.Next())	//테스트 데이터 각각을 훑어나가며,새로운 것을 추가한다.
    		{
    			//중복되는 부분이면 넘어간다.
    			set<int>::iterator itVnum;
    			itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
    			if (itVnum != vnumSet.end()) {
    				continue;
    			}
    			
    			if (!Set_Proto_Item_Table(item_table, test_data, localMap))
    			{
    				fprintf(stderr, "아이템 프로토 테이블 셋팅 실패.\n");			
    			}
    
    
    			m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
    
    			item_table++;
    
    		}
    	}
    
    
    
    	// QUEST_ITEM_PROTO_DISABLE
    	// InitializeQuestItemTable();
    	// END_OF_QUEST_ITEM_PROTO_DISABLE
    
    	m_map_itemTableByVnum.clear();
    
    	itertype(m_vec_itemTable) it = m_vec_itemTable.begin();
    
    	while (it != m_vec_itemTable.end())
    	{
    		TItemTable * item_table = &(*(it++));
    
    		sys_log(1, "ITEM: #%-5lu %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %lu ANTI %lu IMMUNE %lu REFINE %lu REFINE_SET %u MAGIC_PCT %u", 
    				item_table->dwVnum,
    				item_table->szName,
    				item_table->szLocaleName,
    				item_table->alValues[0],
    				item_table->alValues[1],
    				item_table->alValues[2],
    				item_table->alValues[3],
    				item_table->alValues[4],
    				item_table->alValues[5],
    				item_table->dwWearFlags,
    				item_table->dwAntiFlags,
    				item_table->dwImmuneFlag,
    				item_table->dwRefinedVnum,
    				item_table->wRefineSet,
    				item_table->bAlterToMagicItemPct);
    
    		m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
    	}
    	sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
    	return true;
    }
    
    
    bool CClientManager::InitializeSkillTable()
    {
    	char query[4096];
    	snprintf(query, sizeof(query),
    		"SELECT dwVnum, szName, bType, bMaxLevel, dwSplashRange, "
    		"szPointOn, szPointPoly, szSPCostPoly, szDurationPoly, szDurationSPCostPoly, "
    		"szCooldownPoly, szMasterBonusPoly, setFlag+0, setAffectFlag+0, "
    		"szPointOn2, szPointPoly2, szDurationPoly2, setAffectFlag2+0, "
    		"szPointOn3, szPointPoly3, szDurationPoly3, szGrandMasterAddSPCostPoly, "
    		"bLevelStep, bLevelLimit, prerequisiteSkillVnum, prerequisiteSkillLevel, iMaxHit, szSplashAroundDamageAdjustPoly, eSkillType+0, dwTargetRange "
    		"FROM skill_proto%s ORDER BY dwVnum",
    		GetTablePostfix());
    
    	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
    	SQLResult * pRes = pkMsg->Get();
    
    	if (!pRes->uiNumRows)
    	{
    		sys_err("no result from skill_proto");
    		return false;
    	}
    
    	if (!m_vec_skillTable.empty())
    	{
    		sys_log(0, "RELOAD: skill_proto");
    		m_vec_skillTable.clear();
    	}
    
    	m_vec_skillTable.reserve(pRes->uiNumRows);
    
    	MYSQL_ROW	data;
    	int		col;
    
    	while ((data = mysql_fetch_row(pRes->pSQLResult)))
    	{
    		TSkillTable t;
    		memset(&t, 0, sizeof(t));
    
    		col = 0;
    
    		str_to_number(t.dwVnum, data[col++]);
    		strlcpy(t.szName, data[col++], sizeof(t.szName));
    		str_to_number(t.bType, data[col++]);
    		str_to_number(t.bMaxLevel, data[col++]);
    		str_to_number(t.dwSplashRange, data[col++]);
    
    		strlcpy(t.szPointOn, data[col++], sizeof(t.szPointOn));
    		strlcpy(t.szPointPoly, data[col++], sizeof(t.szPointPoly));
    		strlcpy(t.szSPCostPoly, data[col++], sizeof(t.szSPCostPoly));
    		strlcpy(t.szDurationPoly, data[col++], sizeof(t.szDurationPoly));
    		strlcpy(t.szDurationSPCostPoly, data[col++], sizeof(t.szDurationSPCostPoly));
    		strlcpy(t.szCooldownPoly, data[col++], sizeof(t.szCooldownPoly));
    		strlcpy(t.szMasterBonusPoly, data[col++], sizeof(t.szMasterBonusPoly));
    
    		str_to_number(t.dwFlag, data[col++]);
    		str_to_number(t.dwAffectFlag, data[col++]);
    
    		strlcpy(t.szPointOn2, data[col++], sizeof(t.szPointOn2));
    		strlcpy(t.szPointPoly2, data[col++], sizeof(t.szPointPoly2));
    		strlcpy(t.szDurationPoly2, data[col++], sizeof(t.szDurationPoly2));
    		str_to_number(t.dwAffectFlag2, data[col++]);
    
    		// ADD_GRANDMASTER_SKILL
    		strlcpy(t.szPointOn3, data[col++], sizeof(t.szPointOn3));
    		strlcpy(t.szPointPoly3, data[col++], sizeof(t.szPointPoly3));
    		strlcpy(t.szDurationPoly3, data[col++], sizeof(t.szDurationPoly3));
    
    		strlcpy(t.szGrandMasterAddSPCostPoly, data[col++], sizeof(t.szGrandMasterAddSPCostPoly));
    		// END_OF_ADD_GRANDMASTER_SKILL
    
    		str_to_number(t.bLevelStep, data[col++]);
    		str_to_number(t.bLevelLimit, data[col++]);
    		str_to_number(t.preSkillVnum, data[col++]);
    		str_to_number(t.preSkillLevel, data[col++]);
    
    		str_to_number(t.lMaxHit, data[col++]);
    
    		strlcpy(t.szSplashAroundDamageAdjustPoly, data[col++], sizeof(t.szSplashAroundDamageAdjustPoly));
    
    		str_to_number(t.bSkillAttrType, data[col++]);
    		str_to_number(t.dwTargetRange, data[col++]);
    
    		sys_log(0, "SKILL: #%d %s flag %u point %s affect %u cooldown %s", t.dwVnum, t.szName, t.dwFlag, t.szPointOn, t.dwAffectFlag, t.szCooldownPoly);
    
    		m_vec_skillTable.push_back(t);
    	}
    
    	return true;
    }
    
    bool CClientManager::InitializeBanwordTable()
    {
    	m_vec_banwordTable.clear();
    
    	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery("SELECT word FROM banword"));
    
    	SQLResult * pRes = pkMsg->Get();
    
    	if (pRes->uiNumRows == 0)
    		return true;
    
    	MYSQL_ROW data;
    
    	while ((data = mysql_fetch_row(pRes->pSQLResult)))
    	{
    		TBanwordTable t;
    
    		if (data[0])
    		{
    			strlcpy(t.szWord, data[0], sizeof(t.szWord));
    			m_vec_banwordTable.push_back(t);
    		}
    	}
    
    	sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
    	return true;
    }
    
    bool CClientManager::InitializeItemAttrTable()
    {
    	char query[4096];
    	snprintf(query, sizeof(query),
    			"SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear FROM item_attr%s ORDER BY apply",
    			GetTablePostfix());
    
    	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
    	SQLResult * pRes = pkMsg->Get();
    
    	if (!pRes->uiNumRows)
    	{
    		sys_err("no result from item_attr");
    		return false;
    	}
    
    	if (!m_vec_itemAttrTable.empty())
    	{
    		sys_log(0, "RELOAD: item_attr");
    		m_vec_itemAttrTable.clear();
    	}
    
    	m_vec_itemAttrTable.reserve(pRes->uiNumRows);
    
    	MYSQL_ROW	data;
    
    	while ((data = mysql_fetch_row(pRes->pSQLResult)))
    	{
    		TItemAttrTable t;
    
    		memset(&t, 0, sizeof(TItemAttrTable));
    
    		int col = 0;
    
    		strlcpy(t.szApply, data[col++], sizeof(t.szApply));
    		str_to_number(t.dwApplyIndex, data[col++]);
    		str_to_number(t.dwProb, data[col++]);
    		str_to_number(t.lValues[0], data[col++]);
    		str_to_number(t.lValues[1], data[col++]);
    		str_to_number(t.lValues[2], data[col++]);
    		str_to_number(t.lValues[3], data[col++]);
    		str_to_number(t.lValues[4], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
    
    		sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
    				t.szApply,
    				t.dwProb,
    				t.lValues[0],
    				t.lValues[1],
    				t.lValues[2],
    				t.lValues[3],
    				t.lValues[4],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
    
    		m_vec_itemAttrTable.push_back(t);
    	}
    
    	return true;
    }
    
    bool CClientManager::InitializeItemRareTable()
    {
    	char query[4096];
    	snprintf(query, sizeof(query),
    			"SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear FROM item_attr_rare%s ORDER BY apply",
    			GetTablePostfix());
    
    	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
    	SQLResult * pRes = pkMsg->Get();
    
    	if (!pRes->uiNumRows)
    	{
    		sys_err("no result from item_attr_rare");
    		return false;
    	}
    
    	if (!m_vec_itemRareTable.empty())
    	{
    		sys_log(0, "RELOAD: item_attr_rare");
    		m_vec_itemRareTable.clear();
    	}
    
    	m_vec_itemRareTable.reserve(pRes->uiNumRows);
    
    	MYSQL_ROW	data;
    
    	while ((data = mysql_fetch_row(pRes->pSQLResult)))
    	{
    		TItemAttrTable t;
    
    		memset(&t, 0, sizeof(TItemAttrTable));
    
    		int col = 0;
    
    		strlcpy(t.szApply, data[col++], sizeof(t.szApply));
    		str_to_number(t.dwApplyIndex, data[col++]);
    		str_to_number(t.dwProb, data[col++]);
    		str_to_number(t.lValues[0], data[col++]);
    		str_to_number(t.lValues[1], data[col++]);
    		str_to_number(t.lValues[2], data[col++]);
    		str_to_number(t.lValues[3], data[col++]);
    		str_to_number(t.lValues[4], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
    		str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
    
    		sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
    				t.szApply,
    				t.dwProb,
    				t.lValues[0],
    				t.lValues[1],
    				t.lValues[2],
    				t.lValues[3],
    				t.lValues[4],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
    				t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
    
    		m_vec_itemRareTable.push_back(t);
    	}
    
    	return true;
    }
    
    bool CClientManager::InitializeLandTable()
    {
    	using namespace building;
    
    	char query[4096];
    
    	snprintf(query, sizeof(query),
    		"SELECT id, map_index, x, y, width, height, guild_id, guild_level_limit, price "
    		"FROM land%s WHERE enable='YES' ORDER BY id",
    		GetTablePostfix());
    
    	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
    	SQLResult * pRes = pkMsg->Get();
    
    	if (!m_vec_kLandTable.empty())
    	{
    		sys_log(0, "RELOAD: land");
    		m_vec_kLandTable.clear();
    	}
    
    	m_vec_kLandTable.reserve(pRes->uiNumRows);
    
    	MYSQL_ROW	data;
    
    	if (pRes->uiNumRows > 0)
    		while ((data = mysql_fetch_row(pRes->pSQLResult)))
    		{
    			TLand t;
    
    			memset(&t, 0, sizeof(t));
    
    			int col = 0;
    
    			str_to_number(t.dwID, data[col++]);
    			str_to_number(t.lMapIndex, data[col++]);
    			str_to_number(t.x, data[col++]);
    			str_to_number(t.y, data[col++]);
    			str_to_number(t.width, data[col++]);
    			str_to_number(t.height, data[col++]);
    			str_to_number(t.dwGuildID, data[col++]);
    			str_to_number(t.bGuildLevelLimit, data[col++]);
    			str_to_number(t.dwPrice, data[col++]);
    
    			sys_log(0, "LAND: %lu map %-4ld %7ldx%-7ld w %-4ld h %-4ld", t.dwID, t.lMapIndex, t.x, t.y, t.width, t.height);
    
    			m_vec_kLandTable.push_back(t);
    		}
    
    	return true;
    }
    
    void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<int, int> > & vec)
    {
    	// format: 10,1/20,3/300,50
    	const char * t = c_pszString;
    	const char * p = strchr(t, '/');
    	std::pair<int, int> k;
    
    	char szNum[32 + 1];
    	char * comma;
    
    	while (p)
    	{
    		if (isnhdigit(*t))
    		{
    			strlcpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));
    
    			comma = strchr(szNum, ',');
    
    			if (comma)
    			{
    				*comma = '\0';
    				str_to_number(k.second, comma+1);
    			}
    			else
    				k.second = 0;
    
    			str_to_number(k.first, szNum);
    			vec.push_back(k);
    		}
    
    		t = p + 1;
    		p = strchr(t, '/');
    	}
    
    	if (isnhdigit(*t))
    	{
    		strlcpy(szNum, t, sizeof(szNum));
    
    		comma = strchr(const_cast<char*>(t), ',');
    
    		if (comma)
    		{
    			*comma = '\0';
    			str_to_number(k.second, comma+1);
    		}
    		else
    			k.second = 0;
    
    		str_to_number(k.first, szNum);
    		vec.push_back(k);
    	}
    }
    
    bool CClientManager::InitializeObjectProto()
    {
    	using namespace building;
    
    	char query[4096];
    	snprintf(query, sizeof(query),
    			"SELECT vnum, price, materials, upgrade_vnum, upgrade_limit_time, life, reg_1, reg_2, reg_3, reg_4, npc, group_vnum, dependent_group "
    			"FROM object_proto%s ORDER BY vnum",
    			GetTablePostfix());
    
    	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
    	SQLResult * pRes = pkMsg->Get();
    
    	if (!m_vec_kObjectProto.empty())
    	{
    		sys_log(0, "RELOAD: object_proto");
    		m_vec_kObjectProto.clear();
    	}
    
    	m_vec_kObjectProto.reserve(MAX(0, pRes->uiNumRows));
    
    	MYSQL_ROW	data;
    
    	if (pRes->uiNumRows > 0)
    		while ((data = mysql_fetch_row(pRes->pSQLResult)))
    		{
    			TObjectProto t;
    
    			memset(&t, 0, sizeof(t));
    
    			int col = 0;
    
    			str_to_number(t.dwVnum, data[col++]);
    			str_to_number(t.dwPrice, data[col++]);
    
    			std::vector<std::pair<int, int> > vec;
    			parse_pair_number_string(data[col++], vec);
    
    			for (unsigned int i = 0; i < OBJECT_MATERIAL_MAX_NUM && i < vec.size(); ++i)
    			{
    				std::pair<int, int> & r = vec[i];
    
    				t.kMaterials[i].dwItemVnum = r.first;
    				t.kMaterials[i].dwCount = r.second;
    			}
    
    			str_to_number(t.dwUpgradeVnum, data[col++]);
    			str_to_number(t.dwUpgradeLimitTime, data[col++]);
    			str_to_number(t.lLife, data[col++]);
    			str_to_number(t.lRegion[0], data[col++]);
    			str_to_number(t.lRegion[1], data[col++]);
    			str_to_number(t.lRegion[2], data[col++]);
    			str_to_number(t.lRegion[3], data[col++]);
    
    			// ADD_BUILDING_NPC
    			str_to_number(t.dwNPCVnum, data[col++]);
    			str_to_number(t.dwGroupVnum, data[col++]);
    			str_to_number(t.dwDependOnGroupVnum, data[col++]);
    
    			t.lNPCX = 0;
    			t.lNPCY = MAX(t.lRegion[1], t.lRegion[3])+300;
    			// END_OF_ADD_BUILDING_NPC
    
    			sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
    					t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);
    
    			m_vec_kObjectProto.push_back(t);
    		}
    
    	return true;
    }
    
    bool CClientManager::InitializeObjectTable()
    {
    	using namespace building;
    
    	char query[4096];
    	snprintf(query, sizeof(query), "SELECT id, land_id, vnum, map_index, x, y, x_rot, y_rot, z_rot, life FROM object%s ORDER BY id", GetTablePostfix());
    
    	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
    	SQLResult * pRes = pkMsg->Get();
    
    	if (!m_map_pkObjectTable.empty())
    	{
    		sys_log(0, "RELOAD: object");
    		m_map_pkObjectTable.clear();
    	}
    
    	MYSQL_ROW data;
    
    	if (pRes->uiNumRows > 0)
    		while ((data = mysql_fetch_row(pRes->pSQLResult)))
    		{
    			TObject * k = new TObject;
    
    			memset(k, 0, sizeof(TObject));
    
    			int col = 0;
    
    			str_to_number(k->dwID, data[col++]);
    			str_to_number(k->dwLandID, data[col++]);
    			str_to_number(k->dwVnum, data[col++]);
    			str_to_number(k->lMapIndex, data[col++]);
    			str_to_number(k->x, data[col++]);
    			str_to_number(k->y, data[col++]);
    			str_to_number(k->xRot, data[col++]);
    			str_to_number(k->yRot, data[col++]);
    			str_to_number(k->zRot, data[col++]);
    			str_to_number(k->lLife, data[col++]);
    
    			sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld", 
    					k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);
    
    			m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));
    		}
    
    	return true;
    }
    
    bool CClientManager::InitializeMonarch()
    {
    	CMonarch::instance().LoadMonarch();
    
    	return true;
    }
    
    bool CClientManager::MirrorMobTableIntoDB()
    {
    	for (itertype(m_vec_mobTable) it = m_vec_mobTable.begin(); it != m_vec_mobTable.end(); it++)
    	{
    		const TMobTable& t = *it;
    		char query[4096];
    		if (g_stLocaleNameColumn == "name")
    		{
    			snprintf(query, sizeof(query),
    				"replace into mob_proto%s "
    				"("
    				"vnum, name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
    				"on_click, empire, drop_item, resurrection_vnum, folder, "
    				"st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
    				"gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
    
    				"enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
    				"resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
    				"resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
    				"dam_multiply, summon, drain_sp, "
    
    				"skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
    				"skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
    				"sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive"
    				") "
    				"values ("
    
    				"%d, \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, " 
    				"%d, %d, %d, %d, '%s', "
    				"%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d, %d, %d, %d, %d, "
    
    				"%d, %d, %d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d, "
    				"%f, %d, %d, "
    
    				"%d, %d, %d, %d, %d, %d, "
    				"%d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d"
    				")",
    				GetTablePostfix(), /*g_stLocaleNameColumn.c_str(),*/
    
    				t.dwVnum, t.szName, /*t.szLocaleName, */t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
    				t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
    				t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,
    
    				t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
    				t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
    				t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
    				t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], 
    				t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP, 
    
    				t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel, 
    				t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel, 
    				t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint
    				);
    		}
    		else
    		{
    			snprintf(query, sizeof(query),
    				"replace into mob_proto%s "
    				"("
    				"vnum, name, %s, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, "
    				"on_click, empire, drop_item, resurrection_vnum, folder, "
    				"st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
    				"gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
    
    				"enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, "
    				"resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, "
    				"resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, "
    				"dam_multiply, summon, drain_sp, "
    
    				"skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, "
    				"skill_vnum3, skill_level3, skill_vnum4, skill_level4, "
    				"sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive"
    				") "
    				"values ("
    
    				"%d, \"%s\", \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, " 
    				"%d, %d, %d, %d, '%s', "
    				"%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d, %d, %d, %d, %d, "
    
    				"%d, %d, %d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d, "
    				"%f, %d, %d, "
    
    				"%d, %d, %d, %d, %d, %d, "
    				"%d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d"
    				")",
    				GetTablePostfix(), g_stLocaleNameColumn.c_str(),
    
    				t.dwVnum, t.szName, t.szLocaleName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag,
    				t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder,
    				t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp,
    
    				t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum,
    				t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5],
    				t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5],
    				t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], 
    				t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP, 
    
    				t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel, 
    				t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel, 
    				t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint
    				);
    		}
    
    		CDBManager::instance().AsyncQuery(query);
    	}
    	return true;
    }
    
    bool CClientManager::MirrorItemTableIntoDB()
    {
    	for (itertype(m_vec_itemTable) it = m_vec_itemTable.begin(); it != m_vec_itemTable.end(); it++)
    	{
    		if (g_stLocaleNameColumn != "name")
    		{
    			const TItemTable& t = *it;
    			char query[4096];
    			snprintf(query, sizeof(query),
    				"replace into item_proto%s ("
    				"vnum, type, subtype, name, %s, gold, shop_buy_price, weight, size, "
    				"flag, wearflag, antiflag, immuneflag, "
    				"refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
    				"limittype0, limitvalue0, limittype1, limitvalue1, "
    				"applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
    				"value0, value1, value2, value3, value4, value5 ) "
    				"values ("
    				"%d, %d, %d, \"%s\", \"%s\", %d, %d, %d, %d, "
    				"%d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d, "
    				"%d, %ld, %d, %ld, "
    				"%d, %ld, %d, %ld, %d, %ld, "
    				"%ld, %ld, %ld, %ld, %ld, %ld )",
    				GetTablePostfix(), g_stLocaleNameColumn.c_str(), 
    				t.dwVnum, t.bType, t.bSubType, t.szName, t.szLocaleName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
    				t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag, 
    				t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
    				t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
    				t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
    				t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
    			CDBManager::instance().AsyncQuery(query);
    		}
    		else
    		{
    			const TItemTable& t = *it;
    			char query[4096];
    			snprintf(query, sizeof(query),
    				"replace into item_proto%s ("
    				"vnum, type, subtype, name, gold, shop_buy_price, weight, size, "
    				"flag, wearflag, antiflag, immuneflag, "
    				"refined_vnum, refine_set, magic_pct, socket_pct, addon_type, "
    				"limittype0, limitvalue0, limittype1, limitvalue1, "
    				"applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, "
    				"value0, value1, value2, value3, value4, value5 ) "
    				"values ("
    				"%d, %d, %d, \"%s\", %d, %d, %d, %d, "
    				"%d, %d, %d, %d, "
    				"%d, %d, %d, %d, %d, "
    				"%d, %ld, %d, %ld, "
    				"%d, %ld, %d, %ld, %d, %ld, "
    				"%ld, %ld, %ld, %ld, %ld, %ld )",
    				GetTablePostfix(), 
    				t.dwVnum, t.bType, t.bSubType, t.szName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize,
    				t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag, 
    				t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType,
    				t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue,
    				t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue,
    				t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]);
    			CDBManager::instance().AsyncQuery(query);
    		}
    	}
    	return true;
    }
    

    ProtoReader.cpp

    #include "stdafx.h"
    
    #include <math.h>
    #include "ProtoReader.h"
    
    #include "CsvReader.h"
    
    #include <sstream>
    
    using namespace std;
    
    inline string trim_left(const string& str)
    {
        string::size_type n = str.find_first_not_of(" \t\v\n\r");
        return n == string::npos ? str : str.substr(n, str.length());
    }
    
    inline string trim_right(const string& str)
    {
        string::size_type n = str.find_last_not_of(" \t\v\n\r");
        return n == string::npos ? str : str.substr(0, n + 1);
    }
    
    string trim(const string& str){return trim_left(trim_right(str));}
    
    static string* StringSplit(string strOrigin, string strTok)
    {
        unsigned int     cutAt;                            //자르는위치
        int     index     = 0;                    //문자열인덱스
        string* strResult = new string[30];		  //결과return 할변수
    
        //strTok을찾을때까지반복
        while ((cutAt = strOrigin.find_first_of(strTok)) != strOrigin.npos)
        {
           if (cutAt > 0)  //자르는위치가0보다크면(성공시)
           {
                strResult[index++] = strOrigin.substr(0, cutAt);  //결과배열에추가
           }
           strOrigin = strOrigin.substr(cutAt+1);  //원본은자른부분제외한나머지
        }
    
        if(strOrigin.length() > 0)  //원본이아직남았으면
        {
            strResult[index++] = strOrigin.substr(0, cutAt);  //나머지를결과배열에추가
        }
    
    	for( int i=0;i<index;i++)
    	{
    		strResult[i] = trim(strResult[i]);
    	}
    
        return strResult;  //결과return
    }
    
    
    
    int get_Item_Type_Value(string inputString)
    {
    	string arType[] = {"ITEM_NONE", "ITEM_WEAPON",
    		"ITEM_ARMOR", "ITEM_USE", 
    		"ITEM_AUTOUSE", "ITEM_MATERIAL",
    		"ITEM_SPECIAL", "ITEM_TOOL", 
    		"ITEM_LOTTERY", "ITEM_ELK",					//10개
    
    		"ITEM_METIN", "ITEM_CONTAINER", 
    		"ITEM_FISH", "ITEM_ROD", 
    		"ITEM_RESOURCE", "ITEM_CAMPFIRE",
    		"ITEM_UNIQUE", "ITEM_SKILLBOOK", 
    		"ITEM_QUEST", "ITEM_POLYMORPH",				//20개
    
    		"ITEM_TREASURE_BOX", "ITEM_TREASURE_KEY",
    		"ITEM_SKILLFORGET", "ITEM_GIFTBOX", 
    		"ITEM_PICK", "ITEM_HAIR", 
    		"ITEM_TOTEM", "ITEM_BLEND", 
    		"ITEM_COSTUME", "ITEM_DS",					//30개
    	
    		"ITEM_SPECIAL_DS",	"ITEM_EXTRACT",
    		"ITEM_SECONDARY_COIN",						//33개
    
    		"ITEM_RING",
    		"ITEM_BELT",								//35개 (EItemTypes 값으로 치면 34)
    	};
    
    	
    	int retInt = -1;
    	//cout << "Type : " << typeStr << " -> ";
    	for (unsigned int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
    		string tempString = arType[j];
    		if	(inputString.find(tempString)!=string::npos && tempString.find(inputString)!=string::npos) {
    			//cout << j << " ";
    			retInt =  j;
    			break;
    		}
    	}
    	//cout << endl;
    
    	return retInt;
    
    }
    
    int get_Item_SubType_Value(int type_value, string inputString) 
    {
    	static string arSub1[] = { "WEAPON_SWORD", "WEAPON_DAGGER", "WEAPON_BOW", "WEAPON_TWO_HANDED",
    				"WEAPON_BELL", "WEAPON_FAN", "WEAPON_ARROW", "WEAPON_MOUNT_SPEAR"};
    	static string arSub2[] = { "ARMOR_BODY", "ARMOR_HEAD", "ARMOR_SHIELD", "ARMOR_WRIST", "ARMOR_FOOTS",
    				"ARMOR_NECK", "ARMOR_EAR", "ARMOR_NUM_TYPES"};
    	static string arSub3[] = { "USE_POTION", "USE_TALISMAN", "USE_TUNING", "USE_MOVE", "USE_TREASURE_BOX", "USE_MONEYBAG", "USE_BAIT",
    				"USE_ABILITY_UP", "USE_AFFECT", "USE_CREATE_STONE", "USE_SPECIAL", "USE_POTION_NODELAY", "USE_CLEAR",
    				"USE_INVISIBILITY", "USE_DETACHMENT", "USE_BUCKET", "USE_POTION_CONTINUE", "USE_CLEAN_SOCKET",
    				"USE_CHANGE_ATTRIBUTE", "USE_ADD_ATTRIBUTE", "USE_ADD_ACCESSORY_SOCKET", "USE_PUT_INTO_ACCESSORY_SOCKET",
    				"USE_ADD_ATTRIBUTE2", "USE_RECIPE", "USE_CHANGE_ATTRIBUTE2", "USE_BIND", "USE_UNBIND", "USE_TIME_CHARGE_PER", "USE_TIME_CHARGE_FIX", "USE_PUT_INTO_BELT_SOCKET", "USE_PUT_INTO_RING_SOCKET"};
    	static string arSub4[] = { "AUTOUSE_POTION", "AUTOUSE_ABILITY_UP", "AUTOUSE_BOMB", "AUTOUSE_GOLD", "AUTOUSE_MONEYBAG", "AUTOUSE_TREASURE_BOX"};
    	static string arSub5[] = { "MATERIAL_LEATHER", "MATERIAL_BLOOD", "MATERIAL_ROOT", "MATERIAL_NEEDLE", "MATERIAL_JEWEL", 
    		"MATERIAL_DS_REFINE_NORMAL", "MATERIAL_DS_REFINE_BLESSED", "MATERIAL_DS_REFINE_HOLLY"};
    	static string arSub6[] = { "SPECIAL_MAP", "SPECIAL_KEY", "SPECIAL_DOC", "SPECIAL_SPIRIT"};
    	static string arSub7[] = { "TOOL_FISHING_ROD" };
    	static string arSub8[] = { "LOTTERY_TICKET", "LOTTERY_INSTANT" };
    	static string arSub10[] = { "METIN_NORMAL", "METIN_GOLD" };
    	static string arSub12[] = { "FISH_ALIVE", "FISH_DEAD"};
    	static string arSub14[] = { "RESOURCE_FISHBONE", "RESOURCE_WATERSTONEPIECE", "RESOURCE_WATERSTONE", "RESOURCE_BLOOD_PEARL",
    						"RESOURCE_BLUE_PEARL", "RESOURCE_WHITE_PEARL", "RESOURCE_BUCKET", "RESOURCE_CRYSTAL", "RESOURCE_GEM",
    						"RESOURCE_STONE", "RESOURCE_METIN", "RESOURCE_ORE" };
    	static string arSub16[] = { "UNIQUE_NONE", "UNIQUE_BOOK", "UNIQUE_SPECIAL_RIDE", "UNIQUE_3", "UNIQUE_4", "UNIQUE_5",
    					"UNIQUE_6", "UNIQUE_7", "UNIQUE_8", "UNIQUE_9", "USE_SPECIAL"};
    	static string arSub28[] = { "COSTUME_BODY", "COSTUME_HAIR" };
    	static string arSub29[] = { "DS_SLOT1", "DS_SLOT2", "DS_SLOT3", "DS_SLOT4", "DS_SLOT5", "DS_SLOT6" };
    	static string arSub31[] = { "EXTRACT_DRAGON_SOUL", "EXTRACT_DRAGON_HEART" };
    	
    	static string* arSubType[] = {0,	//0
    		arSub1,		//1
    		arSub2,	//2
    		arSub3,	//3
    		arSub4,	//4
    		arSub5,	//5
    		arSub6,	//6
    		arSub7,	//7
    		arSub8,	//8
    		0,			//9
    		arSub10,	//10
    		0,			//11
    		arSub12,	//12
    		0,			//13
    		arSub14,	//14
    		0,			//15
    		arSub16,	//16
    		0,			//17
    		0,			//18
    		0,			//19
    		0,			//20
    		0,			//21
    		0,			//22
    		0,			//23
    		0,			//24
    		0,			//25
    		0,			//26
    		0,			//27
    		arSub28,	//28
    		arSub29,		//29
    		arSub29,	//30
    		arSub31,	//31
    		0,			//32
    		0,			//33 반지
    		0,			//34 벨트
    	};
    	static int arNumberOfSubtype[_countof(arSubType)] = {
    		0,
    		sizeof(arSub1)/sizeof(arSub1[0]),
    		sizeof(arSub2)/sizeof(arSub2[0]),
    		sizeof(arSub3)/sizeof(arSub3[0]),
    		sizeof(arSub4)/sizeof(arSub4[0]),
    		sizeof(arSub5)/sizeof(arSub5[0]),
    		sizeof(arSub6)/sizeof(arSub6[0]),
    		sizeof(arSub7)/sizeof(arSub7[0]),
    		sizeof(arSub8)/sizeof(arSub8[0]),
    		0,
    		sizeof(arSub10)/sizeof(arSub10[0]),
    		0,
    		sizeof(arSub12)/sizeof(arSub12[0]),
    		0,
    		sizeof(arSub14)/sizeof(arSub14[0]),
    		0,
    		sizeof(arSub16)/sizeof(arSub16[0]),
    		0,
    		0,
    		0,
    		0,
    		0,
    		0,
    		0,
    		0,
    		0,
    		0,
    		0,
    		sizeof(arSub28)/sizeof(arSub28[0]),
    		sizeof(arSub29)/sizeof(arSub29[0]),
    		sizeof(arSub29)/sizeof(arSub29[0]),
    		sizeof(arSub31)/sizeof(arSub31[0]),
    		0, // 32
    		0, // 33 반지
    		0, // 34 벨트
    	};
    	
    
    	assert(_countof(arSubType) > type_value && "Subtype rule: Out of range!!");
    
    	// assert 안 먹히는 듯..
    	if (_countof(arSubType) <= type_value)
    	{
    		sys_err("SubType : Out of range!! (type_value: %d, count of registered subtype: %d", type_value, _countof(arSubType));
    		return -1;
    	}
    
    	//아이템 타입의 서브타입 어레이가 존재하는지 알아보고, 없으면 0 리턴
    	if (arSubType[type_value]==0) {
    		return 0;
    	}
    	//
    
    	int retInt = -1;
    	//cout << "SubType : " << subTypeStr << " -> ";
    	for (int j=0;j<arNumberOfSubtype[type_value];j++) {
    		string tempString = arSubType[type_value][j];
    		string tempInputString = trim(inputString);
    		if	(tempInputString.compare(tempString)==0)
    		{
    			//cout << j << " ";
    			retInt =  j;
    			break;
    		}
    	}
    	//cout << endl;
    
    	return retInt;
    }
    
    
    
    
    
    int get_Item_AntiFlag_Value(string inputString) 
    {
    
    	string arAntiFlag[] = {"ANTI_FEMALE", "ANTI_MALE", "ANTI_MUSA", "ANTI_ASSASSIN", "ANTI_SURA", "ANTI_MUDANG",
    							"ANTI_GET", "ANTI_DROP", "ANTI_SELL", "ANTI_EMPIRE_A", "ANTI_EMPIRE_B", "ANTI_EMPIRE_C",
    							"ANTI_SAVE", "ANTI_GIVE", "ANTI_PKDROP", "ANTI_STACK", "ANTI_MYSHOP", "ANTI_SAFEBOX"};
    
    
    	int retValue = 0;
    	string* arInputString = StringSplit(inputString, "|");				//프로토 정보 내용을 단어별로 쪼갠 배열.
    	for(unsigned int i =0;i<sizeof(arAntiFlag)/sizeof(arAntiFlag[0]);i++) {
    		string tempString = arAntiFlag[i];
    		for (int j=0; j<30 ; j++)		//최대 30개 단어까지. (하드코딩)
    		{
    			string tempString2 = arInputString[j];
    			if (tempString2.compare(tempString)==0) {				//일치하는지 확인.
    				retValue = retValue + pow((float)2,(float)i);
    			}
    			
    			if(tempString2.compare("") == 0)
    				break;
    		}
    	}
    	delete []arInputString;
    	//cout << "AntiFlag : " << antiFlagStr << " -> " << retValue << endl;
    
    	return retValue;
    }
    
    int get_Item_Flag_Value(string inputString) 
    {
    
    	string arFlag[] = {"ITEM_TUNABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE",
    			"ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE",
    			"QUEST_GIVE", "ITEM_QUEST", "LOG", "STACKABLE", "SLOW_QUERY", "REFINEABLE", "IRREMOVABLE", "ITEM_APPLICABLE"};
    
    
    	int retValue = 0;
    	string* arInputString = StringSplit(inputString, "|");				//프로토 정보 내용을 단어별로 쪼갠 배열.
    	for(unsigned int i =0;i<sizeof(arFlag)/sizeof(arFlag[0]);i++) {
    		string tempString = arFlag[i];
    		for (int j=0; j<30 ; j++)		//최대 30개 단어까지. (하드코딩)
    		{
    			string tempString2 = arInputString[j];
    			if (tempString2.compare(tempString)==0) {				//일치하는지 확인.
    				retValue = retValue + pow((float)2,(float)i);
    			}
    			
    			if(tempString2.compare("") == 0)
    				break;
    		}
    	}
    	delete []arInputString;
    	//cout << "Flag : " << flagStr << " -> " << retValue << endl;
    
    	return retValue;
    }
    
    int get_Item_WearFlag_Value(string inputString) 
    {
    
    	string arWearrFlag[] = {"WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_SHIELD", "WEAR_UNIQUE",
    					"WEAR_ARROW", "WEAR_HAIR", "WEAR_ABILITY"};
    
    
    	int retValue = 0;
    	string* arInputString = StringSplit(inputString, "|");				//프로토 정보 내용을 단어별로 쪼갠 배열.
    	for(unsigned int i =0;i<sizeof(arWearrFlag)/sizeof(arWearrFlag[0]);i++) {
    		string tempString = arWearrFlag[i];
    		for (int j=0; j<30 ; j++)		//최대 30개 단어까지. (하드코딩)
    		{
    			string tempString2 = arInputString[j];
    			if (tempString2.compare(tempString)==0) {				//일치하는지 확인.
    				retValue = retValue + pow((float)2,(float)i);
    			}
    			
    			if(tempString2.compare("") == 0)
    				break;
    		}
    	}
    	delete []arInputString;
    	//cout << "WearFlag : " << wearFlagStr << " -> " << retValue << endl;
    
    	return retValue;
    }
    
    int get_Item_Immune_Value(string inputString) 
    {
    
    	string arImmune[] = {"PARA","CURSE","STUN","SLEEP","SLOW","POISON","TERROR"};
    
    	int retValue = 0;
    	string* arInputString = StringSplit(inputString, "|");				//프로토 정보 내용을 단어별로 쪼갠 배열.
    	for(unsigned int i =0;i<sizeof(arImmune)/sizeof(arImmune[0]);i++) {
    		string tempString = arImmune[i];
    		for (int j=0; j<30 ; j++)		//최대 30개 단어까지. (하드코딩)
    		{
    			string tempString2 = arInputString[j];
    			if (tempString2.compare(tempString)==0) {				//일치하는지 확인.
    				retValue = retValue + pow((float)2,(float)i);
    			}
    			
    			if(tempString2.compare("") == 0)
    				break;
    		}
    	}
    	delete []arInputString;
    	//cout << "Immune : " << immuneStr << " -> " << retValue << endl;
    
    	return retValue;
    }
    
    
    
    
    int get_Item_LimitType_Value(string inputString)
    {
    	string arLimitType[] = {"LIMIT_NONE", "LEVEL", "STR", "DEX", "INT", "CON", "PC_BANG", "REAL_TIME", "REAL_TIME_FIRST_USE", "TIMER_BASED_ON_WEAR"};
    	
    	int retInt = -1;
    	//cout << "LimitType : " << limitTypeStr << " -> ";
    	for (unsigned int j=0;j<sizeof(arLimitType)/sizeof(arLimitType[0]);j++) {
    		string tempString = arLimitType[j];
    		string tempInputString = trim(inputString);
    		if	(tempInputString.compare(tempString)==0)
    		{
    			//cout << j << " ";
    			retInt =  j;
    			break;
    		}
    	}
    	//cout << endl;
    
    	return retInt;
    }
    
    
    int get_Item_ApplyType_Value(string inputString)
    {
    	string arApplyType[] = {"APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED",
    			"APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT",
    			"APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL",
    			"APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP",
    			"APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD",
    			"APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW", "APPLY_RESIST_FIRE",
    			"APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE",
    			"APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS",
    			"APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE",
    			"APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT",
    			"APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN",
    			"APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS",
    			"APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS", "APPLY_NORMAL_HIT_DAMAGE_BONUS",
    			"APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS",
    			"APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN",
    			"APPLY_ENERGY",	"APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER",
    			"APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT",
    	};
    
    	int retInt = -1;
    	//cout << "ApplyType : " << applyTypeStr << " -> ";
    	for (unsigned int j=0;j<sizeof(arApplyType)/sizeof(arApplyType[0]);j++) {
    		string tempString = arApplyType[j];
    		string tempInputString = trim(inputString);
    		if	(tempInputString.compare(tempString)==0)
    		{ 
    			//cout << j << " ";
    			retInt =  j;
    			break;
    		}
    	}
    	//cout << endl;
    
    	return retInt;
    
    }
    
    
    //몬스터 프로토도 읽는다.
    
    
    int get_Mob_Rank_Value(string inputString) 
    {
    	string arRank[] = {"PAWN", "S_PAWN", "KNIGHT", "S_KNIGHT", "BOSS", "KING"};
    
    	int retInt = -1;
    	//cout << "Rank : " << rankStr << " -> ";
    	for (unsigned int j=0;j<sizeof(arRank)/sizeof(arRank[0]);j++) {
    		string tempString = arRank[j];
    		string tempInputString = trim(inputString);
    		if	(tempInputString.compare(tempString)==0) 
    		{
    			//cout << j << " ";
    			retInt =  j;
    			break;
    		}
    	}
    	//cout << endl;
    
    	return retInt;
    }
    
    
    int get_Mob_Type_Value(string inputString)
    {
    	string arType[] = { "MONSTER", "NPC", "STONE", "WARP", "DOOR", "BUILDING", "PC", "POLYMORPH_PC", "HORSE", "GOTO"};
    
    	int retInt = -1;
    	//cout << "Type : " << typeStr << " -> ";
    	for (unsigned int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
    		string tempString = arType[j];
    		string tempInputString = trim(inputString);
    		if	(tempInputString.compare(tempString)==0) 
    		{
    			//cout << j << " ";
    			retInt =  j;
    			break;
    		}
    	}
    	//cout << endl;
    
    	return retInt;
    }
    
    int get_Mob_BattleType_Value(string inputString) 
    {
    	string arBattleType[] = { "MELEE", "RANGE", "MAGIC", "SPECIAL", "POWER", "TANKER", "SUPER_POWER", "SUPER_TANKER"};
    
    	int retInt = -1;
    	//cout << "Battle Type : " << battleTypeStr << " -> ";
    	for (unsigned int j=0;j<sizeof(arBattleType)/sizeof(arBattleType[0]);j++) {
    		string tempString = arBattleType[j];
    		string tempInputString = trim(inputString);
    		if	(tempInputString.compare(tempString)==0) 
    		{ 
    			//cout << j << " ";
    			retInt =  j;
    			break;
    		}
    	}
    	//cout << endl;
    
    	return retInt;
    }
    
    int get_Mob_Size_Value(string inputString)
    {
    	string arSize[] = { "SAMLL", "MEDIUM", "BIG"};
    
    	int retInt = 0;
    	//cout << "Size : " << sizeStr << " -> ";
    	for (unsigned int j=0;j<sizeof(arSize)/sizeof(arSize[0]);j++) {
    		string tempString = arSize[j];
    		string tempInputString = trim(inputString);
    		if	(tempInputString.compare(tempString)==0) 
    		{
    			//cout << j << " ";
    			retInt =  j + 1;
    			break;
    		}
    	}
    	//cout << endl;
    
    	return retInt;
    }
    
    int get_Mob_AIFlag_Value(string inputString)
    {
    	string arAIFlag[] = {"AGGR","NOMOVE","COWARD","NOATTSHINSU","NOATTCHUNJO","NOATTJINNO","ATTMOB","BERSERK","STONESKIN","GODSPEED","DEATHBLOW","REVIVE"};
    
    
    	int retValue = 0;
    	string* arInputString = StringSplit(inputString, ",");				//프로토 정보 내용을 단어별로 쪼갠 배열.
    	for(unsigned int i =0;i<sizeof(arAIFlag)/sizeof(arAIFlag[0]);i++) {
    		string tempString = arAIFlag[i];
    		for (int j=0; j<30 ; j++)		//최대 30개 단어까지. (하드코딩)
    		{
    			string tempString2 = arInputString[j];
    			if (tempString2.compare(tempString)==0) {				//일치하는지 확인.
    				retValue = retValue + pow((float)2,(float)i);
    			}
    			
    			if(tempString2.compare("") == 0)
    				break;
    		}
    	}
    	delete []arInputString;
    	//cout << "AIFlag : " << aiFlagStr << " -> " << retValue << endl;
    
    	return retValue;
    }
    int get_Mob_RaceFlag_Value(string inputString)
    {
    	string arRaceFlag[] = {"ANIMAL","UNDEAD","DEVIL","HUMAN","ORC","MILGYO","INSECT","FIRE","ICE","DESERT","TREE",
    		"ATT_ELEC","ATT_FIRE","ATT_ICE","ATT_WIND","ATT_EARTH","ATT_DARK"};
    
    	int retValue = 0;
    	string* arInputString = StringSplit(inputString, ",");				//프로토 정보 내용을 단어별로 쪼갠 배열.
    	for(unsigned int i =0;i<sizeof(arRaceFlag)/sizeof(arRaceFlag[0]);i++) {
    		string tempString = arRaceFlag[i];
    		for (int j=0; j<30 ; j++)		//최대 30개 단어까지. (하드코딩)
    		{
    			string tempString2 = arInputString[j];
    			if (tempString2.compare(tempString)==0) {				//일치하는지 확인.
    				retValue = retValue + pow((float)2,(float)i);
    			}
    			
    			if(tempString2.compare("") == 0)
    				break;
    		}
    	}
    	delete []arInputString;
    	//cout << "Race Flag : " << raceFlagStr << " -> " << retValue << endl;
    
    	return retValue;
    }
    int get_Mob_ImmuneFlag_Value(string inputString)
    {
    	string arImmuneFlag[] = {"STUN","SLOW","FALL","CURSE","POISON","TERROR", "REFLECT"};
    
    	int retValue = 0;
    	string* arInputString = StringSplit(inputString, ",");				//프로토 정보 내용을 단어별로 쪼갠 배열.
    	for(unsigned int i =0;i<sizeof(arImmuneFlag)/sizeof(arImmuneFlag[0]);i++) {
    		string tempString = arImmuneFlag[i];
    		for (int j=0; j<30 ; j++)		//최대 30개 단어까지. (하드코딩)
    		{
    			string tempString2 = arInputString[j];
    			if (tempString2.compare(tempString)==0) {				//일치하는지 확인.
    				retValue = retValue + pow((float)2,(float)i);
    			}
    			
    			if(tempString2.compare("") == 0)
    				break;
    		}
    	}
    	delete []arInputString;
    	//cout << "Immune Flag : " << immuneFlagStr << " -> " << retValue << endl;
    
    
    	return retValue;
    }
    
    
    #ifndef __DUMP_PROTO__
    
    //몹 테이블을 셋팅해준다.
    bool Set_Proto_Mob_Table(TMobTable *mobTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
    {
    	int col = 0;
    	str_to_number(mobTable->dwVnum, csvTable.AsStringByIndex(col++));
    	strlcpy(mobTable->szName, csvTable.AsStringByIndex(col++), sizeof(mobTable->szName));
    
    	//3. 지역별 이름 넣어주기.
    	map<int,const char*>::iterator it;
    	it = nameMap.find(mobTable->dwVnum);
    	if (it != nameMap.end()) {
    		const char * localeName = it->second;
    		strlcpy(mobTable->szLocaleName, localeName, sizeof (mobTable->szLocaleName));
    	} else {
    		strlcpy(mobTable->szLocaleName, mobTable->szName, sizeof (mobTable->szLocaleName));
    	}
    
    	//RANK
    	int rankValue = get_Mob_Rank_Value(csvTable.AsStringByIndex(col++));
    	mobTable->bRank = rankValue;
    	//TYPE
    	int typeValue = get_Mob_Type_Value(csvTable.AsStringByIndex(col++));
    	mobTable->bType = typeValue;
    	//BATTLE_TYPE
    	int battleTypeValue = get_Mob_BattleType_Value(csvTable.AsStringByIndex(col++));
    	mobTable->bBattleType = battleTypeValue;
    
    	str_to_number(mobTable->bLevel, csvTable.AsStringByIndex(col++));
    	//SIZE
    	int sizeValue = get_Mob_Size_Value(csvTable.AsStringByIndex(col++));
    	mobTable->bSize = sizeValue;
    	//AI_FLAG
    	int aiFlagValue = get_Mob_AIFlag_Value(csvTable.AsStringByIndex(col++));
    	mobTable->dwAIFlag = aiFlagValue;
    	//mount_capacity;
    	col++;
    	//RACE_FLAG
    	int raceFlagValue = get_Mob_RaceFlag_Value(csvTable.AsStringByIndex(col++));
    	mobTable->dwRaceFlag = raceFlagValue;
    	//IMMUNE_FLAG
    	int immuneFlagValue = get_Mob_ImmuneFlag_Value(csvTable.AsStringByIndex(col++));
    	mobTable->dwImmuneFlag = immuneFlagValue;
    
    	str_to_number(mobTable->bEmpire, csvTable.AsStringByIndex(col++));  //col = 11
    
    	strlcpy(mobTable->szFolder, csvTable.AsStringByIndex(col++), sizeof(mobTable->szFolder));
    
    	str_to_number(mobTable->bOnClickType, csvTable.AsStringByIndex(col++));	
    
    	str_to_number(mobTable->bStr, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bDex, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bCon, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bInt, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->dwDamageRange[0], csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->dwDamageRange[1], csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->dwMaxHP, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bRegenCycle, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bRegenPercent,	csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->dwGoldMin, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->dwGoldMax, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->dwExp,	csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->wDef, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->sAttackSpeed, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->sMovingSpeed, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bAggresiveHPPct, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->wAggressiveSight, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->wAttackRange, csvTable.AsStringByIndex(col++));
    
    	str_to_number(mobTable->dwDropItemVnum, csvTable.AsStringByIndex(col++));	//32
    	str_to_number(mobTable->dwResurrectionVnum, csvTable.AsStringByIndex(col++));
    	for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
    		str_to_number(mobTable->cEnchants[i], csvTable.AsStringByIndex(col++));
    
    	for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
    		str_to_number(mobTable->cResists[i], csvTable.AsStringByIndex(col++));
    
    	str_to_number(mobTable->fDamMultiply, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->dwSummonVnum, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->dwDrainSP, csvTable.AsStringByIndex(col++));
    
    	//Mob_Color
    	++col;
    
    	str_to_number(mobTable->dwPolymorphItemVnum, csvTable.AsStringByIndex(col++));
    
    	str_to_number(mobTable->Skills[0].bLevel, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->Skills[0].dwVnum, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->Skills[1].bLevel, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->Skills[1].dwVnum, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->Skills[2].bLevel, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->Skills[2].dwVnum, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->Skills[3].bLevel, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->Skills[3].dwVnum, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->Skills[4].bLevel, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->Skills[4].dwVnum, csvTable.AsStringByIndex(col++));
    
    	str_to_number(mobTable->bBerserkPoint, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bStoneSkinPoint, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bGodSpeedPoint, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bDeathBlowPoint, csvTable.AsStringByIndex(col++));
    	str_to_number(mobTable->bRevivePoint, csvTable.AsStringByIndex(col++));
    
    	sys_log(0, "MOB #%-5d %-24s level: %-3u rank: %u empire: %d", mobTable->dwVnum, mobTable->szLocaleName, mobTable->bLevel, mobTable->bRank, mobTable->bEmpire);
    
    	return true;
    }
    
    bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
    {
    	int col = 0;
    
    	int dataArray[33];
    	for (unsigned int i=0; i<sizeof(dataArray)/sizeof(dataArray[0]);i++) {
    		int validCheck = 0;
    		if (i==2) {
    			dataArray[i] = get_Item_Type_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==3) {
    			dataArray[i] = get_Item_SubType_Value(dataArray[i-1], csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==5) {
    			dataArray[i] = get_Item_AntiFlag_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==6) {
    			dataArray[i] = get_Item_Flag_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==7) {
    			dataArray[i] = get_Item_WearFlag_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==8) {
    			dataArray[i] = get_Item_Immune_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==14) {
    			dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==16) {
    			dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==18) {
    			dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==20) {
    			dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else if (i==22) {
    			dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
    			validCheck = dataArray[i];
    		} else {
    			str_to_number(dataArray[i], csvTable.AsStringByIndex(col));
    		}
    
    		if (validCheck == -1)
    		{
    			std::ostringstream dataStream;
    
    			for (unsigned int j = 0; j < i; ++j)
    				dataStream << dataArray[j] << ",";
    
    			//fprintf(stderr, "ItemProto Reading Failed : Invalid value.\n");
    			sys_err("ItemProto Reading Failed : Invalid value. (index: %d, col: %d, value: %s)", i, col, csvTable.AsStringByIndex(col));
    			sys_err("\t%d ~ %d Values: %s", 0, i, dataStream.str().c_str());
    
    			exit(0);
    		}
    		
    		col = col + 1;
    	}
    
    	// vnum 및 vnum range 읽기.
    	{
    		std::string s(csvTable.AsStringByIndex(0));
    		unsigned int pos = s.find("~");
    		// vnum 필드에 '~'가 없다면 패스
    		if (std::string::npos == pos)
    		{
    			itemTable->dwVnum = dataArray[0];
    			itemTable->dwVnumRange = 0;
    		}
    		else
    		{
    			std::string s_start_vnum (s.substr(0, pos));
    			std::string s_end_vnum (s.substr(pos +1 ));
    
    			int start_vnum = atoi(s_start_vnum.c_str());
    			int end_vnum = atoi(s_end_vnum.c_str());
    			if (0 == start_vnum || (0 != end_vnum && end_vnum < start_vnum))
    			{
    				sys_err ("INVALID VNUM %s", s.c_str());
    				return false;
    			}
    			itemTable->dwVnum = start_vnum;
    			itemTable->dwVnumRange = end_vnum - start_vnum;
    		}
    	}
    
    	strlcpy(itemTable->szName, csvTable.AsStringByIndex(1), sizeof(itemTable->szName));
    	//지역별 이름 넣어주기.
    	map<int,const char*>::iterator it;
    	it = nameMap.find(itemTable->dwVnum);
    	if (it != nameMap.end()) {
    		const char * localeName = it->second;
    		strlcpy(itemTable->szLocaleName, localeName, sizeof (itemTable->szLocaleName));
    	} else {
    		strlcpy(itemTable->szLocaleName, itemTable->szName, sizeof (itemTable->szLocaleName));
    	}
    	itemTable->bType = dataArray[2];
    	itemTable->bSubType = dataArray[3];
    	itemTable->bSize = dataArray[4];
    	itemTable->dwAntiFlags = dataArray[5];
    	itemTable->dwFlags = dataArray[6];
    	itemTable->dwWearFlags = dataArray[7];
    	itemTable->dwImmuneFlag = dataArray[8];
    	itemTable->dwGold = dataArray[9];
    	itemTable->dwShopBuyPrice = dataArray[10];
    	itemTable->dwRefinedVnum = dataArray[11];
    	itemTable->wRefineSet = dataArray[12];
    	itemTable->bAlterToMagicItemPct = dataArray[13];
    	itemTable->cLimitRealTimeFirstUseIndex = -1;
    	itemTable->cLimitTimerBasedOnWearIndex = -1;
    
    	int i;
    
    	for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
    	{
    		itemTable->aLimits[i].bType = dataArray[14+i*2];
    		itemTable->aLimits[i].lValue = dataArray[15+i*2];
    
    		if (LIMIT_REAL_TIME_START_FIRST_USE == itemTable->aLimits[i].bType)
    			itemTable->cLimitRealTimeFirstUseIndex = (char)i;
    
    		if (LIMIT_TIMER_BASED_ON_WEAR == itemTable->aLimits[i].bType)
    			itemTable->cLimitTimerBasedOnWearIndex = (char)i;
    
    	}
    
    	for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
    	{
    		itemTable->aApplies[i].bType = dataArray[18+i*2];
    		itemTable->aApplies[i].lValue = dataArray[19+i*2];
    	}
    
    	for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
    		itemTable->alValues[i] = dataArray[24+i];
    
    	//column for 'Specular'
    	itemTable->bGainSocketPct = dataArray[31];
    	itemTable->sAddonType = dataArray[32];
    
    	//test
    	str_to_number(itemTable->bWeight, "0");
    			
    	return true;
    }
    
    #endif
    

     

  7. Hello everyone,
    I have a problem with sash... When i start client and login, client down... 
    sysser.txt is clean, but in the client folder created ErrorLog.txt.

    ErrorLog.txt

    http://bit.ly/2qL659V

    or here

    Module Name: C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    Time Stamp: 0x5931b361 - (null)
    
    Exception Type: 0xc0000005
    
    eax: 0x00000000	ebx: 0x04ebe024
    ecx: 0x04ebe024	edx: 0x045adb40
    esi: 0x00000000	edi: 0x04ebe024
    ebp: 0x0018e9e8	esp: 0x0018e9c0
    
    0x005228e1	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x0044a06b	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x00459e00	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x1e0aee36	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f2db1	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f3b31	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f2e21	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f3b31	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f2e21	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f3b31	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f2e21	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f3b31	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f2e21	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0ef190	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0a24f9	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e07f726	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e08bcc8	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e07f726	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0eeb29	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e07f970	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x005660f7	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x00565cc5	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x00516667	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x00497d00	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x1e0f2db1	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f3b31	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f2e21	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0ef190	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0eeb6f	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f36b7	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f0921	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0ef190	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f3b94	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f2e21	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f3b31	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f2e21	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f3b31	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f2e21	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f15a4	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0ef190	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0eeb6f	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f36b7	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0f0921	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0ef190	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e0eeb6f	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e11c59e	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x1e11b036	C:\Users\jakub\Desktop\Client 2015\python27.dll
    0x005669e8	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x00566b49	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x005669a2	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x004bb7e5	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x004bacc7	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x004bbc13	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x0057424c	C:\Users\jakub\Desktop\Client 2015\*********_Distribute.exe
    0x7581336a	C:\Windows\syswow64\kernel32.dll
    0x77c29902	C:\Windows\SysWOW64\ntdll.dll
    0x77c298d5	C:\Windows\SysWOW64\ntdll.dll

    Please help, i can pay for helping.

  8. When i login, client shutdown :( I really dont know what i must doint..

    This is my syserr:

    Quote

    0416 17:37:01235 :: CSoundManager::PlayMusic - Failed to load stream sound : BGM/login_window.mp3
    0416 17:37:07584 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=107) - Strange Skill Need Weapon(byeorak)
    0416 17:37:07584 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=137) - Strange Skill Need Weapon(CLAW)
    0416 17:37:07584 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=139) - Strange Skill Need Weapon(CLAW)
    0416 17:37:08373 :: CSoundManager::PlayMusic - Failed to load stream sound : BGM/characterselect.mp3

     

  9. Hello,
    I have a problem with client part... I start metin, login and metin shutdown. 

    My syserr.txt

    Quote

     

    0416 02:37:01171 :: CSoundManager::PlayMusic - Failed to load stream sound : BGM/login_window.mp3
    0416 02:37:07505 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=107) - Strange Skill Need Weapon(byeorak)
    0416 02:37:07505 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=137) - Strange Skill Need Weapon(CLAW)
    0416 02:37:07505 :: CPythonSkill::RegisterSkillDesc(dwSkillIndex=139) - Strange Skill Need Weapon(CLAW)
    0416 02:37:07694 :: 
    networkModule.py(line:208) SetSelectCharacterPhase
    system.py(line:130) __pack_import
    system.py(line:110) _process_result
    introSelect.py(line:30) <module>
    system.py(line:130) __pack_import
    system.py(line:110) _process_result
    interfaceModule.py(line:23) <module>
    system.py(line:130) __pack_import
    system.py(line:110) _process_result
    uiExchange.py(line:15) <module>
    uiExchange.py(line:241) ExchangeDialog

    networkModule.SetSelectCharacterPhase - <type 'exceptions.NameError'>:name 'app' is not defined

    0416 02:37:07694 :: ============================================================================================================
    0416 02:37:07694 :: Abort!!!!

     

     

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.