metin2united

Search the Community

Showing results for tags 'error'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Community
    • Announcements
    • Feedback
  • Metin2
    • General
    • Questions and Answers
    • Guides & HowTo
    • Design
    • Private Servers
    • Services
    • Videos
  • Releases
    • General
    • Tools
    • Programming / Scripts
    • Quests
    • Binaries & Clients/Serverfiles
    • 3D Models
    • 2D Graphics
    • Operating Systems
  • Safe Zone
    • Offtopic
    • Games Talk
    • Music/Videos/Art
  • D:\YMIR WORK\'s Topics

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Website URL


Discord


Skype


ICQ


Yahoo


Location

Found 140 results

  1. Mind Rapist

    open Linker command failed

    When the compiler gets to the game link point, it throws this error: guild.cpp: cipher.cpp: Compiler: c++-devel Crypto++ version: 7
  2. Todoroki

    open Server Fall [Help]

    Hello guys i run a server online and i have some problems. Server Fall sometimes, kick some players. I don't know why, can you check the syserr and help me? Syserr Ch1 Game1 Sysser Game99 Sysser Db Sysser
  3. Mind Rapist

    open Guild member error

    I'm having a problem creating guilds. When I type the name and continue, the guild is created, everything is normal in the database, but the character does not update at all. My db syserr has this: GuildAddMember: Query failed when getting guild member data SELECT `pid`, `grade`, `is_general`, `offer`, `level`, `job`, `name` FROM guild_member, player WHERE `guild_id` = 432 and `pid` = `id` and `pid` = 191 I checked the source, there is no difference from other files, but here is the function anyway: void CClientManager::GuildAddMember(CPeer* peer, TPacketGDGuildAddMember * p) { CGuildManager::instance().TouchGuild(p->dwGuild); sys_log(0, "GuildAddMember %u %u", p->dwGuild, p->dwPID); char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "INSERT INTO guild_member%s VALUES(%u, %u, %d, 0, 0)", GetTablePostfix(), p->dwPID, p->dwGuild, p->bGrade); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "SELECT `pid`, `grade`, `is_general`, `offer`, `level`, `job`, `name` FROM guild_member%s, player%s WHERE `guild_id` = %u and `pid` = `id` and `pid` = %u", GetTablePostfix(), GetTablePostfix(), p->dwGuild, p->dwPID); std::unique_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery)); if (pmsg->Get()->uiNumRows == 0) { sys_err("Query failed when getting guild member data %s", pmsg->stQuery.c_str()); return; } MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult); if (!row[0] || !row[1]) return; TPacketDGGuildMember dg; dg.dwGuild = p->dwGuild; str_to_number(dg.dwPID, row[0]); str_to_number(dg.bGrade, row[1]); str_to_number(dg.isGeneral, row[2]); str_to_number(dg.dwOffer, row[3]); str_to_number(dg.bLevel, row[4]); str_to_number(dg.bJob, row[5]); strlcpy(dg.szName, row[6], sizeof(dg.szName)); ForwardPacket(HEADER_DG_GUILD_ADD_MEMBER, &dg, sizeof(TPacketDGGuildMember)); } EDIT: I just remembered that when I was starting with this source I had to edit the guild.cpp file in order to be compatible with C++17, so I changed some of the bind1st(mem_fun(...)) into std::bind(...). The error is referring at the db query but here are the changes in guild.cpp in case it helps: void CGuild::Load(DWORD guild_id) { Initialize(); m_data.guild_id = guild_id; DBManager::instance().FuncQuery(std::bind(&CGuild::LoadGuildData, this, std::placeholders::_1), "SELECT master, level, exp, name, skill_point, skill, sp, ladder_point, win, draw, loss, gold FROM guild%s WHERE id = %u", get_table_postfix(), m_data.guild_id); sys_log(0, "GUILD: loading guild id %12s %u", m_data.name, guild_id); DBManager::instance().FuncQuery(std::bind(&CGuild::LoadGuildGradeData, this, std::placeholders::_1), "SELECT grade, name, auth+0 FROM guild_grade%s WHERE guild_id = %u", get_table_postfix(), m_data.guild_id); DBManager::instance().FuncQuery(std::bind(&CGuild::LoadGuildMemberData, this, std::placeholders::_1), "SELECT pid, grade, is_general, offer, level, job, name FROM guild_member%s, player%s WHERE guild_id = %u and pid = id", get_table_postfix(), get_table_postfix(), guild_id); } void CGuild::P2PChangeGrade(BYTE grade) { DBManager::instance().FuncQuery(std::bind(&CGuild::__P2PUpdateGrade, this, std::placeholders::_1), "SELECT grade, name, auth+0 FROM guild_grade%s WHERE guild_id = %u and grade = %d", get_table_postfix(), m_data.guild_id, grade); } void CGuild::AddComment(LPCHARACTER ch, const std::string& str) { int player_id = ch->GetPlayerID(); if (str.length() > GUILD_COMMENT_MAX_LEN) return; char text[GUILD_COMMENT_MAX_LEN * 2 + 1]; DBManager::instance().EscapeString(text, sizeof(text), str.c_str(), str.length()); DBManager::instance().FuncAfterQuery([this, player_id] { return this->RefreshCommentForce(player_id); }, "INSERT INTO guild_comment%s(guild_id, name, notice, content, time) VALUES(%u, '%s', %d, '%s', NOW())", get_table_postfix(), m_data.guild_id, ch->GetName(), (str[0] == '!') ? 1 : 0, text); } void CGuild::SkillLevelUp(DWORD dwVnum) { DWORD dwRealVnum = dwVnum - GUILD_SKILL_START; if (dwRealVnum >= GUILD_SKILL_COUNT) return; CSkillProto* pkSk = CSkillManager::instance().Get(dwVnum); if (!pkSk) { sys_err("There is no such guild skill by number %u", dwVnum); return; } if (m_data.abySkill[dwRealVnum] >= pkSk->bMaxLevel) return; if (m_data.skill_point <= 0) return; m_data.skill_point --; m_data.abySkill[dwRealVnum] ++; ComputeGuildPoints(); SaveSkill(); SendDBSkillUpdate(); for_each(m_memberOnline.begin(), m_memberOnline.end(), std::bind(&CGuild::SendSkillInfoPacket, *this, std::placeholders::_1)); sys_log(0, "Guild SkillUp: %s %d level %d type %u", GetName(), pkSk->dwVnum, m_data.abySkill[dwRealVnum], pkSk->dwType); } void CGuild::GuildPointChange(BYTE type, int amount, bool save) { switch (type) { case POINT_SP: m_data.power += amount; m_data.power = MINMAX(0, m_data.power, m_data.max_power); if (save) { SaveSkill(); } for_each(m_memberOnline.begin(), m_memberOnline.end(), std::bind(&CGuild::SendSkillInfoPacket, *this, std::placeholders::_1)); break; case POINT_EXP: if (amount < 0 && m_data.exp < (DWORD) - amount) { m_data.exp = 0; } else { m_data.exp += amount; while (m_data.exp >= __guild_levelup_exp(m_data.level)) { if (m_data.level < gguild_max_level) { m_data.exp -= __guild_levelup_exp(m_data.level); ++m_data.level; ++m_data.skill_point; if (m_data.level > gguild_max_level) m_data.level = gguild_max_level; ComputeGuildPoints(); GuildPointChange(POINT_SP, m_data.max_power-m_data.power); if (save) ChangeLadderPoint(GUILD_LADDER_POINT_PER_LEVEL); // NOTIFY_GUILD_EXP_CHANGE for_each(m_memberOnline.begin(), m_memberOnline.end(), std::bind(&CGuild::SendGuildInfoPacket, this, std::placeholders::_1)); // END_OF_NOTIFY_GUILD_EXP_CHANGE } if (m_data.level == gguild_max_level) { m_data.exp = 0; } } } TPacketGCGuild pack; pack.header = HEADER_GC_GUILD; pack.size = sizeof(pack)+5; pack.subheader = GUILD_SUBHEADER_GC_CHANGE_EXP; TEMP_BUFFER buf; buf.write(&pack,sizeof(pack)); buf.write(&m_data.level,1); buf.write(&m_data.exp,4); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) d->Packet(buf.read_peek(), buf.size()); } if (save) SaveLevel(); break; } }
  4. Mind Rapist

    open Cannot load MOBDropItemFile

    It's been late, it's been 2 weeks, I'm tired and I just wanna move on... I've been trying to launch my server since late the afternoon but I'm stuck in this error: Boot: cannot load MOBDropItemFile: locale/germany/mob_drop_item.txt I've checked the file 1000 times, no tabulation or any other kind of error (unless I'm really blind) This is what I could find from syslog: https://pastebin.com/NhJdrVja and here is the file: https://pastebin.com/teBbemZx
  5. Mind Rapist

    open Special Item Group Error

    I'm trying to launch files by Fliege with vanilla core (latest). When I'm launching, I'm getting the following error: LoadGroup: CTextFileLoader::LoadGroup : must have a value (filename: locale/germany/special_item_group.txt line: 781 key: 1) ReadSpecialDropItemFile: ReadSpecialDropItemFile : there is no item 경험치 : node oberork Boot: cannot load SpecialItemGroup: locale/germany/special_item_group.txt The point is that: line 781 of special_item_group.txt is fine (tabs and values etc...) 경험치 == EXP from the chest - what's wrong with that??? Is there any part of the code I have to edit to make it compatible? (specify file please) Or is it something else?
  6. Hi, I compiled the source code of kraizy in debian, but the syserr I received when I started SYSERR: Dec 15 23:15:50 :: pid_init: Start of pid: 4353 SYSERR: Dec 15 23:15:52 :: socket_accept: accept: Resource temporarily unavailable (fd 18) SYSERR: Dec 15 23:15:52 :: socket_accept: accept: Resource temporarily unavailable (fd 18) SYSLOG: Dec 15 23:15:52 :: ClientManager pointer is 0xbfdb181c SYSERR: Dec 15 23:15:52 :: socket_accept: accept: Resource temporarily unavailable (fd 18) Dec 15 23:15:52 :: Connection closed. (host: È)·˜¤˜¤s (2164, 1, 2, "ÁøȲÿÿÿÿ±Ã+4) Dec 15 23:15:52 :: ItemIDRange: returned. 0 ~ 0 Dec 15 23:15:52 :: ItemIDRange: Build 0 ~ 0 start: 0 NOT USE remain count is below 10000 SYSERR: Dec 15 23:15:52 :: socket_accept: accept: Resource temporarily unavailable (fd 18) Dec 15 23:15:52 :: Connection closed. (host: ¨)·””ace into item_proto ÿÿÿÿum, ) Dec 15 23:15:52 :: ItemIDRange: returned. 0 ~ 0 Dec 15 23:15:52 :: ItemIDRange: Build 0 ~ 0 start: 0 NOT USE remain count is below 10000 SYSERR: Dec 15 23:15:53 :: socket_accept: accept: Resource temporarily unavailable (fd 18) Dec 15 23:15:53 :: Connection closed. (host: ¨)·””ace into item_proto ÿÿÿÿum, ) Dec 15 23:15:53 :: ItemIDRange: returned. 0 ~ 0 Dec 15 23:15:53 :: ItemIDRange: Build 0 ~ 0 start: 0 NOT USE remain count is below 10000 SYSERR: Dec 15 23:15:53 :: socket_accept: accept: Resource temporarily unavailable (fd 18) Dec 15 23:15:53 :: Connection closed. (host: ¨)·””ace into item_proto ÿÿÿÿum, ) Dec 15 23:15:53 :: ItemIDRange: returned. 0 ~ 0 Dec 15 23:15:53 :: ItemIDRange: Build 0 ~ 0 start: 0 NOT USE remain count is below 10000 SYSERR: Dec 15 23:15:53 :: socket_accept: accept: Resource temporarily unavailable (fd 18) Dec 15 23:15:53 :: Connection closed. (host: äh <ı­) Dec 15 23:15:53 :: ItemIDRange: returned. 0 ~ 0 Dec 15 23:15:53 :: ItemIDRange: Build 0 ~ 0 start: 0 NOT USE remain count is below 10000 SYSERR: Dec 15 23:15:53 :: socket_accept: accept: Resource temporarily unavailable (fd 18) Dec 15 23:15:53 :: Connection closed. (host: ˜(·,®) Dec 15 23:15:53 :: ItemIDRange: returned. 0 ~ 0 Dec 15 23:15:53 :: ItemIDRange: Build 0 ~ 0 start: 0 NOT USE remain count is below 10000 SYSERR: Dec 15 23:15:53 :: socket_accept: accept: Resource temporarily unavailable (fd 18) Dec 15 23:15:53 :: Connection closed. (host: ˜(·<ı­) Dec 15 23:15:53 :: ItemIDRange: returned. 0 ~ 0 Dec 15 23:15:53 :: ItemIDRange: Build 0 ~ 0 start: 0 NOT USE remain count is below 10000 SYSERR: Dec 15 23:15:53 :: socket_accept: accept: Resource temporarily unavailable (fd 18) and when I start the auth client it stays on the connecting to the server screen
  7. Hello I have this error when starting the server: http://prntscr.com/lvrxaz I have no idea what is going on or how to get more information out of this. Files with extension ".core" are being created regarding the game file (not the db)
  8. I have this error: In file included from ./any_function.h:29: ./any_function.inc:98:3: error: no matching function for call to object of type '(lambda at guild.cpp:1023:39)' held(func_arg); ^~~~ I am trying to pass this: DBManager::instance().FuncAfterQuery([this](auto&& data) { return this->RefreshCommentForce(data); }, (char*)ch->GetPlayerID(), Other methods have failed too (std::bind). I am compiling with C++17. Does anyone know what's wrong?
  9. Mind Rapist

    The Bug Database

    Ok so late night thought... We have this right? So I came up with this idea. Might be good might be bad might be shit. We'll see... So I thought we could open a post just like the above to answer to peoples' bugs. Can be python, c++, php or just anything. In the end, this post can end up like a little knowledge base and help and inspire the community. As I said it could be a nice idea or a crappy one, you'll be the judges of that And btw, if you are a newbie read before you type. No more than 1 comment per issue we don't own a data center. Best regards
  10. Mind Rapist

    open RunMain Error

    Hey guys I just compiled a new bin and the client wouldn't launch. The only thing in the syserr was: RunMain Error Anyone knows how can I find out more? The bin is custom made with a bunch of systems and changes inside would be nice to have a place to start. Thanks in advance
  11. Distraught

    open cannot start server

    Hey guys, Actually I just found a strange error. I changed the O2 optimalization flag to O3 and compiled the game and db and after all the CHs crash except for the auth. I changed them back to O2, recompiled and still this error. Put back the backup game and db and still this error. There's nothing in the syserr, only the PIDs (thats why I know that only auth is running).
  12. Well, I started messing with Metin2 very soon, so I have little experience with the subject. I created a server and wanted to have fun with a friend so we could play. I created without hamachi because the pc of some friends does not get along very well with the program. I tried editing the / CONFIG with BIND_IP: 192.168.15.XX (My local ip) but no one could get in, so they selected the character and took a disconnect back to server selection I tried to put my public IP, my no-ip, etc ... but all these give socket error If someone can help me, I would appreciate it very much, I am very happy to have entered the community and I am willing to spend some time dedicating myself to improving
  13. Hello, I wonder...is there any method to inspect these Unknown packet header error's to get rid of them. I hate to search my whole code for that shit ._. Sometimes it takes Days to find the error. I know it can be a wrong data type / size whatever, but there must be a method to inspect these. Let's disscuss this a little bit. Thank you
  14. Hello all. I have a problem which gives me headaches. I tried to compile all libraries of the external links for the binary source but still with no success. I can compile successfully the binary in release and distribute mode, but in debug mode it gives me this error: 1>eterlib.lib(GrpTextInstance.obj) : error LNK2019: unresolved external symbol "int __cdecl Ymir_WideCharToMultiByte(unsigned int,unsigned long,wchar_t const *,int,char *,int,char const *,int *)" (?Ymir_WideCharToMultiByte@@YAHIKPB_WHPADHPBDPAH@Z) referenced in function "public: static int __cdecl CGraphicTextInstance::Hyperlink_GetText(char *,int)" (?Hyperlink_GetText@CGraphicTextInstance@@SAHPADH@Z) 1>eterlib.lib(GrpTextInstance.obj) : error LNK2019: unresolved external symbol "wchar_t __cdecl Arabic_ConvSymbol(wchar_t)" (?Arabic_ConvSymbol@@YA_W_W@Z) referenced in function "public: void __thiscall CGraphicTextInstance::Update(void)" (?Update@CGraphicTextInstance@@QAEXXZ) 1>eterlib.lib(GrpTextInstance.obj) : error LNK2019: unresolved external symbol "bool __cdecl Arabic_IsInPresentation(wchar_t)" (?Arabic_IsInPresentation@@YA_N_W@Z) referenced in function "public: void __thiscall CGraphicTextInstance::Update(void)" (?Update@CGraphicTextInstance@@QAEXXZ) 1>eterlib.lib(GrpTextInstance.obj) : error LNK2019: unresolved external symbol "bool __cdecl Arabic_HasPresentation(wchar_t *,int)" (?Arabic_HasPresentation@@YA_NPA_WH@Z) referenced in function "public: void __thiscall CGraphicTextInstance::Update(void)" (?Update@CGraphicTextInstance@@QAEXXZ) 1>eterlib.lib(GrpTextInstance.obj) : error LNK2019: unresolved external symbol "bool __cdecl Arabic_IsInSymbol(wchar_t)" (?Arabic_IsInSymbol@@YA_N_W@Z) referenced in function "public: void __thiscall CGraphicTextInstance::Update(void)" (?Update@CGraphicTextInstance@@QAEXXZ) 1>eterlib.lib(GrpTextInstance.obj) : error LNK2019: unresolved external symbol "unsigned int __cdecl Arabic_MakeShape(wchar_t *,unsigned int,wchar_t *,unsigned int)" (?Arabic_MakeShape@@YAIPA_WI0I@Z) referenced in function "public: void __thiscall CGraphicTextInstance::Update(void)" (?Update@CGraphicTextInstance@@QAEXXZ) 1>eterlib.lib(GrpTextInstance.obj) : error LNK2019: unresolved external symbol "int __cdecl Ymir_MultiByteToWideChar(unsigned int,unsigned long,char const *,int,wchar_t *,int)" (?Ymir_MultiByteToWideChar@@YAHIKPBDHPA_WH@Z) referenced in function "public: void __thiscall CGraphicTextInstance::Update(void)" (?Update@CGraphicTextInstance@@QAEXXZ) What can I do?
  15. Hello , i have a problem after i implemented cython in my client with pyd lib. I search to google and i asked other persons and i not resolve this. If i try to open client i have this error: How do i resolve this? I used this for cython : https://github.com/martysama0134/how-to-cython-mt2 I'm sorry if i don't respect regulament from section .
  16. Hello guys so can you please help me to find a solution on my problem? so my problem: i put the mysql table config etc.. but i have the following error: ingame is the same problem.
  17. MonUxShen

    open Trade chat client error

    I have a problem with installation trade chat system. The problem is when i trying edit the game client and after i choose character, window of client turns off. Below i insert my syserr, uichat.py and colorinfo.py. Btw. There were no problems with bin and src compilation. https://pastebin.com/rbDWimf0 < - uichat.py https://pastebin.com/rcjdcckR < - colorinfo.py https://pastebin.com/d7rzABZ9 < - syserr
  18. Balgram

    open DB_ERROR_LOG

    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
  19. I am trying recently to learn metin2 developing found several tuts but I keep getting errors some I could fix and the other I cant such as : Can anyone help me please (Note: tried upgrading/updating to FreeBSD 10.2 as FreeBSD web said because it doesn't support 9.2 and 9.3 anymore and its still doesnt work ) I would appreciate some help ty Best Regards , BYB
  20. hovasconcelos

    open Help me compile src

    compile check_server.cpp compile dragon_soul_table.cpp compile DragonSoul.cpp In file included from ../../libserverkey/CheckServerKey.h:3:0, from check_server.h:6, from check_server.cpp:1: ../../libserverkey/SIM.h: In member function 'bool SIM::ParseLine(const char*)': ../../libserverkey/SIM.h:57:50: error: 'printf' was not declared in this scope printf("invalid MAC address - mac(%s)\n", mac); ^ ../../libserverkey/SIM.h:61:58: error: 'printf' was not declared in this scope printf("IP-MAC type added - ip(%u) mac(%s)\n", ip, mac); ^ ../../libserverkey/SIM.h:81:76: error: 'printf' was not declared in this scope printf("IP RANGE type added - begin[%u] end[%u]\n", ipr.fromip, ipr.toip); ^ ../../libserverkey/SIM.h:90:47: error: 'printf' was not declared in this scope printf("single IP type added - ip(%u)\n", ip); ^ ../../libserverkey/SIM.h: In member function 'bool SIM::checkmac(const char*)': ../../libserverkey/SIM.h:287:59: error: 'printf' was not declared in this scope printf("checkmac - invalid length (%s)(%u)\n", mac, len); ^ ../../libserverkey/SIM.h:302:53: error: 'printf' was not declared in this scope printf("checkmac - cannot find '-' (%s)\n", mac); ^ ../../libserverkey/SIM.h:313:65: error: 'printf' was not declared in this scope printf("checkmac - invalid character (%s)(%c)\n", mac, mac[i]); ^ ../../libserverkey/SIM.h: In member function 'bool SIM::mac2bin(const string&, unsigned char*)': ../../libserverkey/SIM.h:331:31: error: 'atoi' was not declared in this scope unsigned char b = atoi(buf); ^ ../../libserverkey/SIM.h:344:61: error: 'strtol' was not declared in this scope unsigned char b = (unsigned char)strtol(buf, &endptr, 16); ^ ../../libserverkey/SIM.h: In member function 'void SIM::bin2mac(unsigned char*, char*)': ../../libserverkey/SIM.h:356:47: error: 'snprintf' was not declared in this scope _snprintf(outbuf + (i*3), 3, "%02X", bin[i]); ^ gmake: *** [Makefile:131: OBJDIR/check_server.o] Error 1 gmake: *** Waiting for unfinished jobs.... compile group_text_parse_tree.cpp Why this mistake in the end?
  21. Distraught

    Quest checker

    Hey guyz, I made a quest checker that reads your quest and if it has any error then the program shows so. Download
  22. Lehel

    SEQUENCE header 254

    Hello, how can I fix this?
  23. Hello, I have such a problem I found some sf and when I started them I found out that I can not create new characters. Do not you know how to fix it? Or some advice? Thx jAk3r
  24. felixenpr

    open [ERROR] Sysser client

    Hello M2Dev, how are u? Well, i have a this error in my sysser client. I want to solve. GRANNY: Unable to find matching track_group for Model: "Acce_04_85_018" in Animation: "D:\zwork\박재관\3월21일이후의수정애니메이션\수라캐릭터수정\수라모션수정\선택\wait.max" Thanks, and pls help me!!
  25. Distraught

    mob move and attack error

    Hey guys, I use mainline source, and most of the mobs dont attack me. I mean I get the damage, but only 2-3 mobs come to me and do it visually, mostly they're just standing on their own place without doing anything (but I also get their damage too). Why does it happen? Thanks in advance!