bool CMonarch::LoadMonarch() { MonarchInfo * p = &m_MonarchInfo; char szQuery[256]; snprintf(szQuery, sizeof(szQuery), "SELECT empire, pid, name, money, windate FROM monarch a, player%s b where a.pid=b.id", GetTablePostfix()); SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER); if (pMsg->Get()->uiNumRows == 0) { delete pMsg; return false; } MYSQL_ROW row; for (int n = 0; (row = mysql_fetch_row(pMsg->Get()->pSQLResult)) != NULL; ++n) { int idx = 0; int Empire = 0; str_to_number(Empire, row[idx++]); str_to_number(p->pid[Empire], row[idx++]); strlcpy(p->name[Empire], row[idx++], sizeof(p->name[Empire])); str_to_number(p->money[Empire], row[idx++]); strlcpy(p->date[Empire], row[idx++], sizeof(p->date[Empire])); if (g_test_server) sys_log(0, "[LOAD_MONARCH] Empire %d pid %d money %lld windate %s", Empire, p->pid[Empire], p->money[Empire], p->date[Empire]); } delete pMsg; return true; }
void CGuildManager::ResultRanking(MYSQL_RES * pRes) { if (!pRes) return; int iLastLadderPoint = -1; int iRank = 0; map_kLadderPointRankingByGID.clear(); MYSQL_ROW row; while ((row = mysql_fetch_row(pRes))) { DWORD dwGID = 0; str_to_number(dwGID, row[0]); int iLadderPoint = 0; str_to_number(iLadderPoint, row[2]); if (iLadderPoint != iLastLadderPoint) ++iRank; sys_log(0, "GUILD_RANK: %-24s %2d %d", row[1], iRank, iLadderPoint); map_kLadderPointRankingByGID.insert(std::make_pair(dwGID, iRank)); } }
int CItem::GetRefineLevel() { const char* name = GetBaseName(); char* p = const_cast<char*>(strrchr(name, '+')); if (!p) return 0; int rtn = 0; str_to_number(rtn, p+1); const char* locale_name = GetName(); p = const_cast<char*>(strrchr(locale_name, '+')); if (p) { int locale_rtn = 0; str_to_number(locale_rtn, p+1); if (locale_rtn != rtn) { sys_err("refine_level_based_on_NAME(%d) is not equal to refine_level_based_on_LOCALE_NAME(%d).", rtn, locale_rtn); } } return rtn; }
void phone_book_find_num(Phone_Book *pb, char *num) { if (!is_num(num)) { return; } str_to_number(num, num); for (int i = 0; i < pb->used; i++) { char *cur_num = malloc(strlen(pb->v[i].num) * sizeof(char)); str_to_number(cur_num, pb->v[i].num); if (!strcmp(cur_num, num)) { record_print(&pb->v[i], stdout); } free(cur_num); } }
void AuctionManager::LoadAuctionItem() { char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "SELECT id, owner_id, count, vnum, socket0, socket1, socket2, " "attrtype0, attrvalue0, " "attrtype1, attrvalue1, " "attrtype2, attrvalue2, " "attrtype3, attrvalue3, " "attrtype4, attrvalue4, " "attrtype5, attrvalue5, " "attrtype6, attrvalue6 " "FROM item WHERE window = 'AUCTION'"); SQLMsg *msg = CDBManager::instance().DirectQuery(szQuery); MYSQL_RES *res = msg->Get()->pSQLResult; if (!res) { return; } int rows; if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음 { return; } for (int i = 0; i < rows; ++i) { MYSQL_ROW row = mysql_fetch_row(res); TPlayerItem item; int cur = 0; str_to_number(item.id, row[cur++]); str_to_number(item.owner, row[cur++]); item.window = AUCTION; str_to_number(item.count, row[cur++]); str_to_number(item.vnum, row[cur++]); str_to_number(item.alSockets[0], row[cur++]); str_to_number(item.alSockets[1], row[cur++]); str_to_number(item.alSockets[2], row[cur++]); for (int j = 0; j < ITEM_ATTRIBUTE_MAX_NUM; j++) { str_to_number(item.aAttr[j].bType, row[cur++]); str_to_number(item.aAttr[j].sValue, row[cur++]); } InsertItemCache(&item, true); } return; }
int CHARACTER::GetChangeEmpireCount() const { char szQuery[1024+1]; DWORD dwAID = GetAID(); if (dwAID == 0) return 0; snprintf(szQuery, sizeof(szQuery), "SELECT change_count FROM change_empire WHERE account_id = %u", dwAID); SQLMsg * pMsg = DBManager::instance().DirectQuery(szQuery); if (pMsg != NULL) { if (pMsg->Get()->uiNumRows == 0) { M2_DELETE(pMsg); return 0; } MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult); DWORD count = 0; str_to_number(count, row[0]); M2_DELETE(pMsg); return count; } return 0; }
DWORD CHARACTER::GetAID() const { char szQuery[1024+1]; DWORD dwAID = 0; snprintf(szQuery, sizeof(szQuery), "SELECT id FROM player_index%s WHERE pid1=%u OR pid2=%u OR pid3=%u OR pid4=%u AND empire=%u", get_table_postfix(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetEmpire()); SQLMsg* pMsg = DBManager::instance().DirectQuery(szQuery); if (pMsg != NULL) { if (pMsg->Get()->uiNumRows == 0) { M2_DELETE(pMsg); return 0; } MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult); str_to_number(dwAID, row[0]); M2_DELETE(pMsg); return dwAID; } else { return 0; } }
bool CConfig::GetValue(const char * key, DWORD *dest) { if (!Search(key)) return false; str_to_number(*dest, Get(key)); return true; }
void ItemAwardManager::Load(SQLMsg* pMsg) { MYSQL_RES * pRes = pMsg->Get()->pSQLResult; for (uint i = 0; i < pMsg->Get()->uiNumRows; ++i) { MYSQL_ROW row = mysql_fetch_row(pRes); int col = 0; DWORD dwID = 0; str_to_number(dwID, row[col++]); if (m_map_award.find(dwID) != m_map_award.end()) continue; TItemAward * kData = new TItemAward; memset(kData, 0, sizeof(TItemAward)); kData->dwID = dwID; trim_and_lower(row[col++], kData->szLogin, sizeof(kData->szLogin)); str_to_number(kData->dwVnum, row[col++]); str_to_number(kData->dwCount, row[col++]); str_to_number(kData->dwSocket0, row[col++]); str_to_number(kData->dwSocket1, row[col++]); str_to_number(kData->dwSocket2, row[col++]); str_to_number(kData->bMall, row[col++]); if (row[col]) { enhance_strlcpymt(kData->szWhy, row[col], sizeof(kData->szWhy)); //°ФАУ БЯїЎ whyДЭ·лїЎ єЇµїАМ »э±вёй char* whyStr = kData->szWhy; //why ДЭ·л АР±в char cmdStr[100] = ""; //whyДЭ·лїЎј АРАє °ЄА» АУЅГ №®АЪїїЎ є№»зЗШµТ strcpy(cmdStr,whyStr); //ён·Йѕо ѕтґВ °ъБ¤їЎј ЕдЕ«ѕІёй їшє»µµ ЕдЕ«И µЗ±в ¶§№® char command[20] = ""; strcpy(command,CClientManager::instance().GetCommand(cmdStr)); // command ѕт±в //sys_err("%d, %s",pItemAward->dwID,command); if( !(strcmp(command,"GIFT") )) // command °Ў GIFTАМёй { TPacketItemAwardInfromer giftData; strcpy(giftData.login, kData->szLogin); //·О±ЧАО ѕЖАМµр є№»з strcpy(giftData.command, command); //ён·Йѕо є№»з giftData.vnum = kData->dwVnum; //ѕЖАМЕЫ vnumµµ є№»з CClientManager::instance().ForwardPacket(HEADER_DG_ITEMAWARD_INFORMER,&giftData,sizeof(TPacketItemAwardInfromer)); } } m_map_award.insert(std::make_pair(dwID, kData)); printf("ITEM_AWARD load id %u bMall %d \n", kData->dwID, kData->bMall); sys_log(0, "ITEM_AWARD: load id %lu login %s vnum %lu count %u socket %lu", kData->dwID, kData->szLogin, kData->dwVnum, kData->dwCount, kData->dwSocket0); ItemAwardSet& kSet = m_map_kSetAwardByLogin[kData->szLogin]; kSet.insert(kData); if (dwID > g_dwLastCachedItemAwardID) g_dwLastCachedItemAwardID = dwID; } }
void CGuildManager::ParseResult(SQLResult * pRes) { MYSQL_ROW row; while ((row = mysql_fetch_row(pRes->pSQLResult))) { DWORD GID = strtoul(row[0], NULL, 10); TGuild & r_info = TouchGuild(GID); strlcpymt(r_info.szName, row[1], sizeof(r_info.szName)); str_to_number(r_info.ladder_point, row[2]); str_to_number(r_info.win, row[3]); str_to_number(r_info.draw, row[4]); str_to_number(r_info.loss, row[5]); str_to_number(r_info.gold, row[6]); str_to_number(r_info.level, row[7]); sys_log(0, "GuildWar: %-24s ladder %-5d win %-3d draw %-3d loss %-3d", r_info.szName, r_info.ladder_point, r_info.win, r_info.draw, r_info.loss); } }
void AuctionManager::LoadMyBidInfo () { char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "select * from my_bid"); SQLMsg *msg = CDBManager::instance().DirectQuery(szQuery); MYSQL_RES *res = msg->Get()->pSQLResult; if (!res) { return; } int rows; if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음 { return; } for (int i = 0; i < rows; ++i) { MYSQL_ROW row = mysql_fetch_row(res); int cur = 0; DWORD player_id; DWORD item_id; int money; str_to_number(player_id, row[cur++]); str_to_number(item_id, row[cur++]); str_to_number(money, row[cur++]); InsertMyBid (player_id, item_id, money); } return; }
bool CMonarch::SetMonarch(const char * name) { MonarchInfo * p = &m_MonarchInfo; char szQuery[256]; snprintf(szQuery, sizeof(szQuery), "SELECT empire, pid, name FROM player a where a.name = '%s'", name); SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER); if (pMsg->Get()->uiNumRows == 0) { delete pMsg; return false; } MYSQL_ROW row; int Empire = 0; for (int n = 0; (row = mysql_fetch_row(pMsg->Get()->pSQLResult)) != NULL; ++n) { int idx = 0; str_to_number(Empire, row[idx++]); str_to_number(p->pid[Empire], row[idx++]); strlcpy(p->name[Empire], row[idx++], sizeof(p->name[Empire])); p->money[Empire] = atoll(row[idx++]); if (g_test_server) sys_log(0, "[Set_MONARCH] Empire %d pid %d money %lld windate %s", Empire, p->pid[Empire], p->money[Empire], p->date[Empire]); } delete pMsg; //db¿¡ ÀÔ·Â snprintf(szQuery, sizeof(szQuery), "REPLACE INTO monarch (empire, name, windate, money) VALUES(%d, %d, now(), %lld)", Empire, p->pid[Empire], p->money[Empire]); CDBManager::instance().AsyncQuery(szQuery, SQL_PLAYER); return true; }
bool CConfig::GetParam(const char*key, int index, DWORD *Param) { std::string * pstStr = Search(key); if (!pstStr) return false; char szParam[5][32]; sscanf(pstStr->c_str(), "%s %s %s %s %s", szParam[0],szParam[1],szParam[2],szParam[3],szParam[4]); str_to_number(*Param, szParam[index]); sys_log(0, "GetParam %d", *Param); return true; }
void AuctionManager::LoadSaleInfo() { char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "select * from sale"); SQLMsg *msg = CDBManager::instance().DirectQuery(szQuery); MYSQL_RES *res = msg->Get()->pSQLResult; if (!res) { return; } int rows; if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음 { return; } for (int i = 0; i < rows; ++i) { MYSQL_ROW row = mysql_fetch_row(res); TSaleItemInfo saleItemInfo; int cur = 0; str_to_number(saleItemInfo.item_num, row[cur++]); str_to_number(saleItemInfo.offer_price, row[cur++]); str_to_number(saleItemInfo.price, row[cur++]); str_to_number(saleItemInfo.offer_id, row[cur++]); thecore_memcpy (saleItemInfo.shown_name, (char*)row[cur], strlen((char*)row[cur]) +1); cur++; str_to_number(saleItemInfo.empire, row[cur++]); str_to_number(saleItemInfo.expired_time, row[cur++]); str_to_number(saleItemInfo.item_id, row[cur++]); str_to_number(saleItemInfo.wisher_id, row[cur++]); InsertSaleItemInfoCache(&saleItemInfo, true); } return; }
BOOL CTextFileLoader::GetTokenInteger(const std::string & c_rstrKey, int * pData) { TTokenVector * pTokenVector; if (!GetTokenVector(c_rstrKey, &pTokenVector)) return FALSE; if (pTokenVector->empty()) { sys_log(2, " CTextFileLoader::GetTokenInteger - Failed to find the value %s [%s : %s]", m_strFileName.c_str(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); return FALSE; } int out = 0; str_to_number(out, pTokenVector->at(0).c_str()); *pData = out; return TRUE; }
void CClientManager::LoadEventFlag() { char szQuery[1024]; snprintf(szQuery, sizeof(szQuery), "SELECT szName, lValue FROM quest%s WHERE dwPID = 0", GetTablePostfix()); std::auto_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery)); SQLResult* pRes = pmsg->Get(); if (pRes->uiNumRows) { MYSQL_ROW row; while ((row = mysql_fetch_row(pRes->pSQLResult))) { TPacketSetEventFlag p; strlcpymt(p.szFlagName, row[0], sizeof(p.szFlagName)); str_to_number(p.lValue, row[1]); sys_log(0, "EventFlag Load %s %d", p.szFlagName, p.lValue); m_map_lEventFlag.insert(std::make_pair(std::string(p.szFlagName), p.lValue)); ForwardPacket(HEADER_DG_SET_EVENT_FLAG, &p, sizeof(TPacketSetEventFlag)); } } }
/* ECMA-262 3rd Edition 9.3 */ HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret) { switch(V_VT(v)) { case VT_EMPTY: num_set_nan(ret); break; case VT_NULL: V_VT(ret) = VT_I4; V_I4(ret) = 0; break; case VT_I4: case VT_R8: *ret = *v; break; case VT_BSTR: return str_to_number(V_BSTR(v), ret); case VT_DISPATCH: { VARIANT prim; HRESULT hres; hres = to_primitive(ctx, v, ei, &prim); if(FAILED(hres)) return hres; hres = to_number(ctx, &prim, ei, ret); VariantClear(&prim); return hres; } case VT_BOOL: V_VT(ret) = VT_I4; V_I4(ret) = V_BOOL(v) ? 1 : 0; break; default: FIXME("unimplemented for vt %d\n", V_VT(v)); return E_NOTIMPL; } return S_OK; }
/* ECMA-262 3rd Edition 9.3 */ HRESULT to_number(script_ctx_t *ctx, jsval_t val, double *ret) { switch(jsval_type(val)) { case JSV_UNDEFINED: *ret = NAN; return S_OK; case JSV_NULL: *ret = 0; return S_OK; case JSV_NUMBER: *ret = get_number(val); return S_OK; case JSV_STRING: return str_to_number(get_string(val), ret); case JSV_OBJECT: { jsval_t prim; HRESULT hres; hres = to_primitive(ctx, val, &prim, HINT_NUMBER); if(FAILED(hres)) return hres; hres = to_number(ctx, prim, ret); jsval_release(prim); return hres; } case JSV_BOOL: *ret = get_bool(val) ? 1 : 0; return S_OK; case JSV_VARIANT: FIXME("unimplemented for variant %s\n", debugstr_variant(get_variant(val))); return E_NOTIMPL; }; assert(0); return E_FAIL; }
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); std::auto_ptr<SQLMsg> pmsg_insert(CDBManager::instance().DirectQuery(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::auto_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]); strlcpymt(dg.szName, row[6], sizeof(dg.szName)); ForwardPacket(HEADER_DG_GUILD_ADD_MEMBER, &dg, sizeof(TPacketDGGuildMember)); }
bool ITEM_MANAGER::ConvSpecialDropItemFile() { char szSpecialItemGroupFileName[256]; snprintf(szSpecialItemGroupFileName, sizeof(szSpecialItemGroupFileName), "%s/special_item_group.txt", LocaleService_GetBasePath().c_str()); FILE *fp = fopen("special_item_group_vnum.txt", "w"); if (!fp) { sys_err("could not open file (%s)", "special_item_group_vnum.txt"); return false; } CTextFileLoader loader; if (!loader.Load(szSpecialItemGroupFileName)) { fclose(fp); return false; } std::string stName; for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i) { loader.SetChildNode(i); loader.GetCurrentNodeName(&stName); int iVnum; if (!loader.GetTokenInteger("vnum", &iVnum)) { sys_err("ConvSpecialDropItemFile : Syntax error %s : no vnum, node %s", szSpecialItemGroupFileName, stName.c_str()); loader.SetParentNode(); fclose(fp); return false; } std::string str; int type = 0; if (loader.GetTokenString("type", &str)) { stl_lowers(str); if (str == "pct") { type = 1; } } TTokenVector * pTok; fprintf(fp, "Group %s\n", stName.c_str()); fprintf(fp, "{\n"); fprintf(fp, " Vnum %i\n", iVnum); if (type) fprintf(fp, " Type Pct"); for (int k = 1; k < 256; ++k) { char buf[4]; snprintf(buf, sizeof(buf), "%d", k); if (loader.GetTokenVector(buf, &pTok)) { const std::string& name = pTok->at(0); DWORD dwVnum = 0; if (!GetVnumByOriginalName(name.c_str(), dwVnum)) { if ( name == "경험치" || name == "mob" || name == "slow" || name == "drain_hp" || name == "poison" || name == "group") { dwVnum = 0; } else { str_to_number(dwVnum, name.c_str()); if (!ITEM_MANAGER::instance().GetTable(dwVnum)) { sys_err("ReadSpecialDropItemFile : there is no item %s : node %s", name.c_str(), stName.c_str()); fclose(fp); return false; } } } int iCount = 0; str_to_number(iCount, pTok->at(1).c_str()); int iProb = 0; str_to_number(iProb, pTok->at(2).c_str()); int iRarePct = 0; if (pTok->size() > 3) { str_to_number(iRarePct, pTok->at(3).c_str()); } // 1 "기술 수련서" 1 100 if (0 == dwVnum) fprintf(fp, " %d %s %d %d\n", k, name.c_str(), iCount, iProb); else fprintf(fp, " %d %u %d %d\n", k, dwVnum, iCount, iProb); continue; } break; } fprintf(fp, "}\n"); fprintf(fp, "\n"); loader.SetParentNode(); } fclose(fp); return true; }
//OpenID int CInputAuth::auth_OpenID(const char *authKey, const char *ipAddr, char *rID) { //return value //0 : normal execution //1 : cannot connect to openid auth server //2 : socket_write failed //3 : openid auth server not reply //4 : Reply Error //5 : Incorrect auth key. extern char openid_host[256]; extern char openid_uri[256]; int port = 80; socket_t fd = socket_connect(openid_host, port); if (fd < 0) { sys_err("[auth_OpenID] : could not connect to OpenID server(%s)", openid_host); return 1; } socket_block(fd); socket_timeout(fd, 3, 0); // send request { char request[512]; int len = snprintf(request, sizeof(request), //"GET /kyw/gameauth.php?auth_key=%s&ip=%s HTTP/1.1\r\n" "GET %s?auth_key=%s&ip=%s HTTP/1.1\r\n" "Host: %s\r\n" "Connection: Close\r\n\r\n", //openid_uri, authKey,ipAddr);//"aaaaa", "202.31.212.73"); //authKey,ipAddr); //"/kyw/gameauth.php", authKey, ipAddr); openid_uri, authKey, ipAddr, openid_host); //#ifndef __WIN32__ // if (write(fd, request, len) < 0) //#else if (socket_write(fd, request, len) < 0) //#endif { sys_err("[auth_OpenID] : could not send auth-request (%s)", authKey); socket_close(fd); return 2; } } // read reply char reply[1024] = {0}; int len; //#ifndef __WIN32__ // len = read(fd, reply, sizeof(reply)); //#else len = socket_read(fd, reply, sizeof(reply)); //#endif socket_close(fd); if (len <= 0) { sys_err("[auth_OpenID] : could not recv auth-reply (%s)", authKey); return 3; } //결과값 파싱 char buffer[1024]; strcpy(buffer, reply); const char *delim = "\r\n"; char *last = 0; char *v = strtok(buffer, delim); char *result = 0; while (v) { result = v; v = strtok(NULL, delim); } char *id = strtok(result, "%"); char *success = strtok(NULL, "%"); if (!*id || !*success) { sys_err("[auth_OpenID] : OpenID AuthServer Reply Error (%s)", reply); return 4; } if (0 != strcmp("OK", success)) //에러 처리 { int returnNumber = 0; str_to_number(returnNumber, id); switch (returnNumber) { case 1: sys_err("[auth_OpenID] : AuthKey incorrect"); break; case 2: sys_err("[auth_OpenID] : ip incorrect"); break; case 3: sys_err("[auth_OpenID] : used AuthKey"); break; case 4: sys_err("[auth_OpenID] : AuthKey not delivered"); break; case 5: sys_err("[auth_OpenID] : ip not delivered"); break; case 6: sys_err("[auth_OpenID] : AuthKey time over"); break; default: break; return 5; } } strcpy(rID, id); return 0; }
/* Return Value 0 : 알 수 없는 에러 or 쿼리 에러 1 : 동일한 제국으로 바꾸려고함 2 : 길드 가입한 캐릭터가 있음 3 : 결혼한 캐릭터가 있음 999 : 제국 이동 성공 */ int CHARACTER::ChangeEmpire(BYTE empire) { if (GetEmpire() == empire) return 1; char szQuery[1024+1]; DWORD dwAID; DWORD dwPID[4]; memset(dwPID, 0, sizeof(dwPID)); { // 1. 내 계정의 모든 pid를 얻어 온다 snprintf(szQuery, sizeof(szQuery), "SELECT id, pid1, pid2, pid3, pid4 FROM player_index%s WHERE pid1=%u OR pid2=%u OR pid3=%u OR pid4=%u AND empire=%u", get_table_postfix(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetEmpire()); std::auto_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(szQuery)); if (msg->Get()->uiNumRows == 0) { return 0; } MYSQL_ROW row = mysql_fetch_row(msg->Get()->pSQLResult); str_to_number(dwAID, row[0]); str_to_number(dwPID[0], row[1]); str_to_number(dwPID[1], row[2]); str_to_number(dwPID[2], row[3]); str_to_number(dwPID[3], row[4]); } const int loop = 4; { // 2. 각 캐릭터의 길드 정보를 얻어온다. // 한 캐릭터라도 길드에 가입 되어 있다면, 제국 이동을 할 수 없다. DWORD dwGuildID[4]; CGuild * pGuild[4]; SQLMsg * pMsg = NULL; for (int i = 0; i < loop; ++i) { snprintf(szQuery, sizeof(szQuery), "SELECT guild_id FROM guild_member%s WHERE pid=%u", get_table_postfix(), dwPID[i]); pMsg = DBManager::instance().DirectQuery(szQuery); if (pMsg != NULL) { if (pMsg->Get()->uiNumRows > 0) { MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult); str_to_number(dwGuildID[i], row[0]); pGuild[i] = CGuildManager::instance().FindGuild(dwGuildID[i]); if (pGuild[i] != NULL) { M2_DELETE(pMsg); return 2; } } else { dwGuildID[i] = 0; pGuild[i] = NULL; } M2_DELETE(pMsg); } } } { // 3. 각 캐릭터의 결혼 정보를 얻어온다. // 한 캐릭터라도 결혼 상태라면 제국 이동을 할 수 없다. for (int i = 0; i < loop; ++i) { if (marriage::CManager::instance().IsEngagedOrMarried(dwPID[i]) == true) return 3; } } { // 4. db의 제국 정보를 업데이트 한다. snprintf(szQuery, sizeof(szQuery), "UPDATE player_index%s SET empire=%u WHERE pid1=%u OR pid2=%u OR pid3=%u OR pid4=%u AND empire=%u", get_table_postfix(), empire, GetPlayerID(), GetPlayerID(), GetPlayerID(), GetPlayerID(), GetEmpire()); std::auto_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(szQuery)); if (msg->Get()->uiAffectedRows > 0) { // 5. 제국 변경 이력을 추가한다. SetChangeEmpireCount(); return 999; } } return 0; }
bool ITEM_MANAGER::ReadSpecialDropItemFile(const char * c_pszFileName) { CTextFileLoader loader; if (!loader.Load(c_pszFileName)) return false; std::string stName; for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i) { loader.SetChildNode(i); loader.GetCurrentNodeName(&stName); int iVnum; if (!loader.GetTokenInteger("vnum", &iVnum)) { sys_err("ReadSpecialDropItemFile : Syntax error %s : no vnum, node %s", c_pszFileName, stName.c_str()); loader.SetParentNode(); return false; } sys_log(0,"DROP_ITEM_GROUP %s %d", stName.c_str(), iVnum); TTokenVector * pTok; // std::string stType; int type = CSpecialItemGroup::NORMAL; if (loader.GetTokenString("type", &stType)) { stl_lowers(stType); if (stType == "pct") { type = CSpecialItemGroup::PCT; } else if (stType == "quest") { type = CSpecialItemGroup::QUEST; quest::CQuestManager::instance().RegisterNPCVnum(iVnum); } else if (stType == "special") { type = CSpecialItemGroup::SPECIAL; } } if ("attr" == stType) { CSpecialAttrGroup * pkGroup = M2_NEW CSpecialAttrGroup(iVnum); for (int k = 1; k < 256; ++k) { char buf[4]; snprintf(buf, sizeof(buf), "%d", k); if (loader.GetTokenVector(buf, &pTok)) { DWORD apply_type = 0; int apply_value = 0; str_to_number(apply_type, pTok->at(0).c_str()); if (0 == apply_type) { apply_type = FN_get_apply_type(pTok->at(0).c_str()); if (0 == apply_type) { sys_err ("Invalid APPLY_TYPE %s in Special Item Group Vnum %d", pTok->at(0).c_str(), iVnum); return false; } } str_to_number(apply_value, pTok->at(1).c_str()); if (apply_type > MAX_APPLY_NUM) { sys_err ("Invalid APPLY_TYPE %u in Special Item Group Vnum %d", apply_type, iVnum); M2_DELETE(pkGroup); return false; } pkGroup->m_vecAttrs.push_back(CSpecialAttrGroup::CSpecialAttrInfo(apply_type, apply_value)); } else { break; } } if (loader.GetTokenVector("effect", &pTok)) { pkGroup->m_stEffectFileName = pTok->at(0); } loader.SetParentNode(); m_map_pkSpecialAttrGroup.insert(std::make_pair(iVnum, pkGroup)); } else { CSpecialItemGroup * pkGroup = M2_NEW CSpecialItemGroup(iVnum, type); for (int k = 1; k < 256; ++k) { char buf[4]; snprintf(buf, sizeof(buf), "%d", k); if (loader.GetTokenVector(buf, &pTok)) { const std::string& name = pTok->at(0); DWORD dwVnum = 0; if (!GetVnumByOriginalName(name.c_str(), dwVnum)) { if (name == "경험치" || name == "exp") { dwVnum = CSpecialItemGroup::EXP; } else if (name == "mob") { dwVnum = CSpecialItemGroup::MOB; } else if (name == "slow") { dwVnum = CSpecialItemGroup::SLOW; } else if (name == "drain_hp") { dwVnum = CSpecialItemGroup::DRAIN_HP; } else if (name == "poison") { dwVnum = CSpecialItemGroup::POISON; } else if (name == "group") { dwVnum = CSpecialItemGroup::MOB_GROUP; } else { str_to_number(dwVnum, name.c_str()); if (!ITEM_MANAGER::instance().GetTable(dwVnum)) { sys_err("ReadSpecialDropItemFile : there is no item %s : node %s", name.c_str(), stName.c_str()); M2_DELETE(pkGroup); return false; } } } int iCount = 0; str_to_number(iCount, pTok->at(1).c_str()); int iProb = 0; str_to_number(iProb, pTok->at(2).c_str()); int iRarePct = 0; if (pTok->size() > 3) { str_to_number(iRarePct, pTok->at(3).c_str()); } sys_log(0," name %s count %d prob %d rare %d", name.c_str(), iCount, iProb, iRarePct); pkGroup->AddItem(dwVnum, iCount, iProb, iRarePct); // CHECK_UNIQUE_GROUP if (iVnum < 30000) { m_ItemToSpecialGroup[dwVnum] = iVnum; } // END_OF_CHECK_UNIQUE_GROUP continue; } break; } loader.SetParentNode(); if (CSpecialItemGroup::QUEST == type) { m_map_pkQuestItemGroup.insert(std::make_pair(iVnum, pkGroup)); } else { m_map_pkSpecialItemGroup.insert(std::make_pair(iVnum, pkGroup)); } } } return true; }
bool ITEM_MANAGER::ReadMonsterDropItemGroup(const char * c_pszFileName) { CTextFileLoader loader; if (!loader.Load(c_pszFileName)) return false; for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i) { std::string stName(""); loader.GetCurrentNodeName(&stName); if (strncmp (stName.c_str(), "kr_", 3) == 0) { if (LC_IsYMIR()) { stName.assign(stName, 3, stName.size() - 3); } else { continue; } } loader.SetChildNode(i); int iMobVnum = 0; int iKillDrop = 0; int iLevelLimit = 0; std::string strType(""); if (!loader.GetTokenString("type", &strType)) { sys_err("ReadMonsterDropItemGroup : Syntax error %s : no type (kill|drop), node %s", c_pszFileName, stName.c_str()); loader.SetParentNode(); return false; } if (!loader.GetTokenInteger("mob", &iMobVnum)) { sys_err("ReadMonsterDropItemGroup : Syntax error %s : no mob vnum, node %s", c_pszFileName, stName.c_str()); loader.SetParentNode(); return false; } if (strType == "kill") { if (!loader.GetTokenInteger("kill_drop", &iKillDrop)) { sys_err("ReadMonsterDropItemGroup : Syntax error %s : no kill drop count, node %s", c_pszFileName, stName.c_str()); loader.SetParentNode(); return false; } } else { iKillDrop = 1; } if ( strType == "limit" ) { if ( !loader.GetTokenInteger("level_limit", &iLevelLimit) ) { sys_err("ReadmonsterDropItemGroup : Syntax error %s : no level_limit, node %s", c_pszFileName, stName.c_str()); loader.SetParentNode(); return false; } } else { iLevelLimit = 0; } sys_log(0,"MOB_ITEM_GROUP %s [%s] %d %d", stName.c_str(), strType.c_str(), iMobVnum, iKillDrop); if (iKillDrop == 0) { loader.SetParentNode(); continue; } TTokenVector* pTok = NULL; if (strType == "kill") { CMobItemGroup * pkGroup = M2_NEW CMobItemGroup(iMobVnum, iKillDrop, stName); for (int k = 1; k < 256; ++k) { char buf[4]; snprintf(buf, sizeof(buf), "%d", k); if (loader.GetTokenVector(buf, &pTok)) { //sys_log(1, " %s %s", pTok->at(0).c_str(), pTok->at(1).c_str()); std::string& name = pTok->at(0); DWORD dwVnum = 0; if (!GetVnumByOriginalName(name.c_str(), dwVnum)) { str_to_number(dwVnum, name.c_str()); if (!ITEM_MANAGER::instance().GetTable(dwVnum)) { sys_err("ReadMonsterDropItemGroup : there is no item %s : node %s : vnum %d", name.c_str(), stName.c_str(), dwVnum); return false; } } int iCount = 0; str_to_number(iCount, pTok->at(1).c_str()); if (iCount<1) { sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s : vnum %d, count %d", name.c_str(), stName.c_str(), dwVnum, iCount); return false; } int iPartPct = 0; str_to_number(iPartPct, pTok->at(2).c_str()); if (iPartPct == 0) { sys_err("ReadMonsterDropItemGroup : there is no drop percent for item %s : node %s : vnum %d, count %d, pct %d", name.c_str(), stName.c_str(), iPartPct); return false; } int iRarePct = 0; str_to_number(iRarePct, pTok->at(3).c_str()); iRarePct = MINMAX(0, iRarePct, 100); sys_log(0," %s count %d rare %d", name.c_str(), iCount, iRarePct); pkGroup->AddItem(dwVnum, iCount, iPartPct, iRarePct); continue; } break; } m_map_pkMobItemGroup.insert(std::map<DWORD, CMobItemGroup*>::value_type(iMobVnum, pkGroup)); } else if (strType == "drop") { CDropItemGroup* pkGroup; bool bNew = true; itertype(m_map_pkDropItemGroup) it = m_map_pkDropItemGroup.find (iMobVnum); if (it == m_map_pkDropItemGroup.end()) { pkGroup = M2_NEW CDropItemGroup(0, iMobVnum, stName); } else { bNew = false; CDropItemGroup* pkGroup = it->second; } for (int k = 1; k < 256; ++k) { char buf[4]; snprintf(buf, sizeof(buf), "%d", k); if (loader.GetTokenVector(buf, &pTok)) { std::string& name = pTok->at(0); DWORD dwVnum = 0; if (!GetVnumByOriginalName(name.c_str(), dwVnum)) { str_to_number(dwVnum, name.c_str()); if (!ITEM_MANAGER::instance().GetTable(dwVnum)) { sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str()); M2_DELETE(pkGroup); return false; } } int iCount = 0; str_to_number(iCount, pTok->at(1).c_str()); if (iCount < 1) { sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str()); M2_DELETE(pkGroup); return false; } float fPercent = atof(pTok->at(2).c_str()); DWORD dwPct = (DWORD)(10000.0f * fPercent); sys_log(0," name %s pct %d count %d", name.c_str(), dwPct, iCount); pkGroup->AddItem(dwVnum, dwPct, iCount); continue; } break; } if (bNew) m_map_pkDropItemGroup.insert(std::map<DWORD, CDropItemGroup*>::value_type(iMobVnum, pkGroup)); } else if ( strType == "limit" ) { CLevelItemGroup* pkLevelItemGroup = M2_NEW CLevelItemGroup(iLevelLimit); for ( int k=1; k < 256; k++ ) { char buf[4]; snprintf(buf, sizeof(buf), "%d", k); if ( loader.GetTokenVector(buf, &pTok) ) { std::string& name = pTok->at(0); DWORD dwItemVnum = 0; if (false == GetVnumByOriginalName(name.c_str(), dwItemVnum)) { str_to_number(dwItemVnum, name.c_str()); if ( !ITEM_MANAGER::instance().GetTable(dwItemVnum) ) { M2_DELETE(pkLevelItemGroup); return false; } } int iCount = 0; str_to_number(iCount, pTok->at(1).c_str()); if (iCount < 1) { M2_DELETE(pkLevelItemGroup); return false; } float fPct = atof(pTok->at(2).c_str()); DWORD dwPct = (DWORD)(10000.0f * fPct); pkLevelItemGroup->AddItem(dwItemVnum, dwPct, iCount); continue; } break; } m_map_pkLevelItemGroup.insert(std::map<DWORD, CLevelItemGroup*>::value_type(iMobVnum, pkLevelItemGroup)); } else if (strType == "thiefgloves") { CBuyerThiefGlovesItemGroup* pkGroup = M2_NEW CBuyerThiefGlovesItemGroup(0, iMobVnum, stName); for (int k = 1; k < 256; ++k) { char buf[4]; snprintf(buf, sizeof(buf), "%d", k); if (loader.GetTokenVector(buf, &pTok)) { std::string& name = pTok->at(0); DWORD dwVnum = 0; if (!GetVnumByOriginalName(name.c_str(), dwVnum)) { str_to_number(dwVnum, name.c_str()); if (!ITEM_MANAGER::instance().GetTable(dwVnum)) { sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str()); M2_DELETE(pkGroup); return false; } } int iCount = 0; str_to_number(iCount, pTok->at(1).c_str()); if (iCount < 1) { sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str()); M2_DELETE(pkGroup); return false; } float fPercent = atof(pTok->at(2).c_str()); DWORD dwPct = (DWORD)(10000.0f * fPercent); sys_log(0," name %s pct %d count %d", name.c_str(), dwPct, iCount); pkGroup->AddItem(dwVnum, dwPct, iCount); continue; } break; } m_map_pkGloveItemGroup.insert(std::map<DWORD, CBuyerThiefGlovesItemGroup*>::value_type(iMobVnum, pkGroup)); } else { sys_err("ReadMonsterDropItemGroup : Syntax error %s : invalid type %s (kill|drop), node %s", c_pszFileName, strType.c_str(), stName.c_str()); loader.SetParentNode(); return false; } loader.SetParentNode(); } return true; }
// // @version 05/06/13 Bang2ni - 아이템 가격정보 캐시 flush timeout 설정 추가. // int Start() { if (!CConfig::instance().LoadFile("conf.txt")) { fprintf(stderr, "Loading conf.txt failed.\n"); return false; } if (!CConfig::instance().GetValue("TEST_SERVER", &g_test_server)) { fprintf(stderr, "Real Server\n"); } else fprintf(stderr, "Test Server\n"); if (!CConfig::instance().GetValue("LOG", &g_log)) { fprintf(stderr, "Log Off"); g_log= 0; } else { g_log = 1; fprintf(stderr, "Log On"); } int tmpValue; int heart_beat = 50; if (!CConfig::instance().GetValue("CLIENT_HEART_FPS", &heart_beat)) { fprintf(stderr, "Cannot find CLIENT_HEART_FPS configuration.\n"); return false; } log_set_expiration_days(3); if (CConfig::instance().GetValue("LOG_KEEP_DAYS", &tmpValue)) { tmpValue = MINMAX(3, tmpValue, 30); log_set_expiration_days(tmpValue); fprintf(stderr, "Setting log keeping days to %d\n", tmpValue); } thecore_init(heart_beat, emptybeat); signal_timer_enable(60); char szBuf[256+1]; if (CConfig::instance().GetValue("LOCALE", szBuf, 256)) { g_stLocale = szBuf; sys_log(0, "LOCALE set to %s", g_stLocale.c_str()); // CHINA_DISABLE_HOTBACKUP if ("gb2312" == g_stLocale) { sys_log(0, "CIBN_LOCALE: DISABLE_HOTBACKUP"); g_bHotBackup = false; } // END_OF_CHINA_DISABLE_HOTBACKUP } int iDisableHotBackup; if (CConfig::instance().GetValue("DISABLE_HOTBACKUP", &iDisableHotBackup)) { if (iDisableHotBackup) { sys_log(0, "CONFIG: DISABLE_HOTBACKUP"); g_bHotBackup = false; } } if (!CConfig::instance().GetValue("TABLE_POSTFIX", szBuf, 256)) { sys_err("TABLE_POSTFIX not configured use default"); szBuf[0] = '\0'; } SetTablePostfix(szBuf); if (CConfig::instance().GetValue("PLAYER_CACHE_FLUSH_SECONDS", szBuf, 256)) { str_to_number(g_iPlayerCacheFlushSeconds, szBuf); sys_log(0, "PLAYER_CACHE_FLUSH_SECONDS: %d", g_iPlayerCacheFlushSeconds); } if (CConfig::instance().GetValue("ITEM_CACHE_FLUSH_SECONDS", szBuf, 256)) { str_to_number(g_iItemCacheFlushSeconds, szBuf); sys_log(0, "ITEM_CACHE_FLUSH_SECONDS: %d", g_iItemCacheFlushSeconds); } // MYSHOP_PRICE_LIST if (CConfig::instance().GetValue("ITEM_PRICELIST_CACHE_FLUSH_SECONDS", szBuf, 256)) { str_to_number(g_iItemPriceListTableCacheFlushSeconds, szBuf); sys_log(0, "ITEM_PRICELIST_CACHE_FLUSH_SECONDS: %d", g_iItemPriceListTableCacheFlushSeconds); } // END_OF_MYSHOP_PRICE_LIST // if (CConfig::instance().GetValue("CACHE_FLUSH_LIMIT_PER_SECOND", szBuf, 256)) { DWORD dwVal = 0; str_to_number(dwVal, szBuf); CClientManager::instance().SetCacheFlushCountLimit(dwVal); } int iIDStart; if (!CConfig::instance().GetValue("PLAYER_ID_START", &iIDStart)) { sys_err("PLAYER_ID_START not configured"); return false; } CClientManager::instance().SetPlayerIDStart(iIDStart); if (CConfig::instance().GetValue("NAME_COLUMN", szBuf, 256)) { fprintf(stderr, "%s %s", g_stLocaleNameColumn.c_str(), szBuf); g_stLocaleNameColumn = szBuf; } char szAddr[64], szDB[64], szUser[64], szPassword[64]; int iPort; char line[256+1]; if (CConfig::instance().GetValue("SQL_PLAYER", line, 256)) { sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort); sys_log(0, "connecting to MySQL server (player)"); int iRetry = 5; do { if (CDBManager::instance().Connect(SQL_PLAYER, szAddr, iPort, szDB, szUser, szPassword)) { sys_log(0, " OK"); break; } sys_log(0, " failed, retrying in 5 seconds"); fprintf(stderr, " failed, retrying in 5 seconds"); sleep(5); } while (iRetry--); fprintf(stderr, "Success PLAYER\n"); SetPlayerDBName(szDB); } else { sys_err("SQL_PLAYER not configured"); return false; } if (CConfig::instance().GetValue("SQL_ACCOUNT", line, 256)) { sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort); sys_log(0, "connecting to MySQL server (account)"); int iRetry = 5; do { if (CDBManager::instance().Connect(SQL_ACCOUNT, szAddr, iPort, szDB, szUser, szPassword)) { sys_log(0, " OK"); break; } sys_log(0, " failed, retrying in 5 seconds"); fprintf(stderr, " failed, retrying in 5 seconds"); sleep(5); } while (iRetry--); fprintf(stderr, "Success ACCOUNT\n"); } else { sys_err("SQL_ACCOUNT not configured"); return false; } if (CConfig::instance().GetValue("SQL_COMMON", line, 256)) { sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort); sys_log(0, "connecting to MySQL server (common)"); int iRetry = 5; do { if (CDBManager::instance().Connect(SQL_COMMON, szAddr, iPort, szDB, szUser, szPassword)) { sys_log(0, " OK"); break; } sys_log(0, " failed, retrying in 5 seconds"); fprintf(stderr, " failed, retrying in 5 seconds"); sleep(5); } while (iRetry--); fprintf(stderr, "Success COMMON\n"); } else { sys_err("SQL_COMMON not configured"); return false; } if (CConfig::instance().GetValue("SQL_HOTBACKUP", line, 256)) { sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort); sys_log(0, "connecting to MySQL server (hotbackup)"); int iRetry = 5; do { if (CDBManager::instance().Connect(SQL_HOTBACKUP, szAddr, iPort, szDB, szUser, szPassword)) { sys_log(0, " OK"); break; } sys_log(0, " failed, retrying in 5 seconds"); fprintf(stderr, " failed, retrying in 5 seconds"); sleep(5); } while (iRetry--); fprintf(stderr, "Success HOTBACKUP\n"); } else { sys_err("SQL_HOTBACKUP not configured"); return false; } if (!CNetPoller::instance().Create()) { sys_err("Cannot create network poller"); return false; } sys_log(0, "ClientManager initialization.. "); if (!CClientManager::instance().Initialize()) { sys_log(0, " failed"); return false; } sys_log(0, " OK"); if (!PlayerHB::instance().Initialize()) { sys_err("cannot initialize player hotbackup"); return false; } #ifndef _WIN32 signal(SIGUSR1, emergency_sig); #endif signal(SIGSEGV, emergency_sig); return true; }
bool ITEM_MANAGER::ReadDropItemGroup(const char * c_pszFileName) { CTextFileLoader loader; if (!loader.Load(c_pszFileName)) return false; std::string stName; for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i) { loader.SetChildNode(i); loader.GetCurrentNodeName(&stName); int iVnum; int iMobVnum; if (!loader.GetTokenInteger("vnum", &iVnum)) { sys_err("ReadDropItemGroup : Syntax error %s : no vnum, node %s", c_pszFileName, stName.c_str()); loader.SetParentNode(); return false; } if (!loader.GetTokenInteger("mob", &iMobVnum)) { sys_err("ReadDropItemGroup : Syntax error %s : no mob vnum, node %s", c_pszFileName, stName.c_str()); loader.SetParentNode(); return false; } sys_log(0,"DROP_ITEM_GROUP %s %d", stName.c_str(), iMobVnum); TTokenVector * pTok; itertype(m_map_pkDropItemGroup) it = m_map_pkDropItemGroup.find(iMobVnum); CDropItemGroup* pkGroup; if (it == m_map_pkDropItemGroup.end()) pkGroup = M2_NEW CDropItemGroup(iVnum, iMobVnum, stName); else pkGroup = it->second; for (int k = 1; k < 256; ++k) { char buf[4]; snprintf(buf, sizeof(buf), "%d", k); if (loader.GetTokenVector(buf, &pTok)) { std::string& name = pTok->at(0); DWORD dwVnum = 0; if (!GetVnumByOriginalName(name.c_str(), dwVnum)) { str_to_number(dwVnum, name.c_str()); if (!ITEM_MANAGER::instance().GetTable(dwVnum)) { sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str()); if (it == m_map_pkDropItemGroup.end()) M2_DELETE(pkGroup); return false; } } float fPercent = atof(pTok->at(1).c_str()); DWORD dwPct = (DWORD)(10000.0f * fPercent); int iCount = 1; if (pTok->size() > 2) str_to_number(iCount, pTok->at(2).c_str()); if (iCount < 1) { sys_err("ReadDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str()); if (it == m_map_pkDropItemGroup.end()) M2_DELETE(pkGroup); return false; } sys_log(0," %s %d %d", name.c_str(), dwPct, iCount); pkGroup->AddItem(dwVnum, dwPct, iCount); continue; } break; } if (it == m_map_pkDropItemGroup.end()) m_map_pkDropItemGroup.insert(std::map<DWORD, CDropItemGroup*>::value_type(iMobVnum, pkGroup)); loader.SetParentNode(); } return true; }
bool ITEM_MANAGER::ReadCommonDropItemFile(const char * c_pszFileName) { FILE * fp = fopen(c_pszFileName, "r"); if (!fp) { sys_err("Cannot open %s", c_pszFileName); return false; } char buf[1024]; int lines = 0; while (fgets(buf, 1024, fp)) { ++lines; if (!*buf || *buf == '\n') continue; TDropItem d[MOB_RANK_MAX_NUM]; char szTemp[64]; memset(&d, 0, sizeof(d)); char * p = buf; char * p2; for (int i = 0; i <= MOB_RANK_S_KNIGHT; ++i) { for (int j = 0; j < 6; ++j) { p2 = strchr(p, '\t'); if (!p2) break; strlcpy(szTemp, p, MIN(sizeof(szTemp), (p2 - p) + 1)); p = p2 + 1; switch (j) { case 0: break; case 1: str_to_number(d[i].iLvStart, szTemp); break; case 2: str_to_number(d[i].iLvEnd, szTemp); break; case 3: d[i].fPercent = atof(szTemp); break; case 4: strlcpy(d[i].szItemName, szTemp, sizeof(d[i].szItemName)); break; case 5: str_to_number(d[i].iCount, szTemp); break; } } DWORD dwPct = (DWORD) (d[i].fPercent * 10000.0f); DWORD dwItemVnum = 0; if (!ITEM_MANAGER::instance().GetVnumByOriginalName(d[i].szItemName, dwItemVnum)) { // 이름으로 못찾으면 번호로 검색 str_to_number(dwItemVnum, d[i].szItemName); if (!ITEM_MANAGER::instance().GetTable(dwItemVnum)) { sys_err("No such an item (name: %s)", d[i].szItemName); fclose(fp); return false; } } if (d[i].iLvStart == 0) continue; g_vec_pkCommonDropItem[i].push_back(CItemDropInfo(d[i].iLvStart, d[i].iLvEnd, dwPct, dwItemVnum)); } } fclose(fp); for (int i = 0; i < MOB_RANK_MAX_NUM; ++i) { std::vector<CItemDropInfo> & v = g_vec_pkCommonDropItem[i]; std::sort(v.begin(), v.end()); std::vector<CItemDropInfo>::iterator it = v.begin(); sys_log(1, "CommonItemDrop rank %d", i); while (it != v.end()) { const CItemDropInfo & c = *(it++); sys_log(1, "CommonItemDrop %d %d %d %u", c.m_iLevelStart, c.m_iLevelEnd, c.m_iPercent, c.m_dwVnum); } } return true; }