int CInputHandshake::Analyze(LPDESC d, BYTE bHeader, const char * c_pData) { if (bHeader == 10) // 엔터는 무시 return 0; if (bHeader == HEADER_CG_TEXT) { ++c_pData; const char * c_pSep; if (!(c_pSep = strchr(c_pData, '\n'))) // \n을 찾는다. return -1; if (*(c_pSep - 1) == '\r') --c_pSep; std::string stResult; std::string stBuf; stBuf.assign(c_pData, 0, c_pSep - c_pData); sys_log(0, "SOCKET_CMD: FROM(%s) CMD(%s)", d->GetHostName(), stBuf.c_str()); if (!stBuf.compare("IS_SERVER_UP")) { if (g_bNoMoreClient) stResult = "NO"; else stResult = "YES"; } else if (!stBuf.compare("IS_PASSPOD_UP")) { if (g_bNoPasspod) stResult = "NO"; else stResult = "YES"; } //else if (!stBuf.compare("SHOWMETHEMONEY")) else if (stBuf == g_stAdminPagePassword) { if (!IsEmptyAdminPage()) { if (!IsAdminPage(inet_ntoa(d->GetAddr().sin_addr))) { char szTmp[64]; snprintf(szTmp, sizeof(szTmp), "WEBADMIN : Wrong Connector : %s", inet_ntoa(d->GetAddr().sin_addr)); stResult += szTmp; } else { d->SetAdminMode(); stResult = "UNKNOWN"; } } else { d->SetAdminMode(); stResult = "UNKNOWN"; } } else if (!stBuf.compare("USER_COUNT")) { char szTmp[64]; if (!IsEmptyAdminPage()) { if (!IsAdminPage(inet_ntoa(d->GetAddr().sin_addr))) { snprintf(szTmp, sizeof(szTmp), "WEBADMIN : Wrong Connector : %s", inet_ntoa(d->GetAddr().sin_addr)); } else { int iTotal; int * paiEmpireUserCount; int iLocal; DESC_MANAGER::instance().GetUserCount(iTotal, &paiEmpireUserCount, iLocal); snprintf(szTmp, sizeof(szTmp), "%d %d %d %d %d", iTotal, paiEmpireUserCount[1], paiEmpireUserCount[2], paiEmpireUserCount[3], iLocal); } } else { int iTotal; int * paiEmpireUserCount; int iLocal; DESC_MANAGER::instance().GetUserCount(iTotal, &paiEmpireUserCount, iLocal); snprintf(szTmp, sizeof(szTmp), "%d %d %d %d %d", iTotal, paiEmpireUserCount[1], paiEmpireUserCount[2], paiEmpireUserCount[3], iLocal); } stResult += szTmp; } else if (!stBuf.compare("CHECK_P2P_CONNECTIONS")) { std::ostringstream oss(std::ostringstream::out); oss << "P2P CONNECTION NUMBER : " << P2P_MANAGER::instance().GetDescCount() << "\n"; std::string hostNames; P2P_MANAGER::Instance().GetP2PHostNames(hostNames); oss << hostNames; stResult = oss.str(); TPacketGGCheckAwakeness packet; packet.bHeader = HEADER_GG_CHECK_AWAKENESS; P2P_MANAGER::instance().Send(&packet, sizeof(packet)); } else if (!stBuf.compare("PACKET_INFO")) { m_pMainPacketInfo->Log("packet_info.txt"); stResult = "OK"; } else if (!stBuf.compare("PROFILE")) { CProfiler::instance().Log("profile.txt"); stResult = "OK"; } //gift notify delete command else if (!stBuf.compare(0,15,"DELETE_AWARDID ")) { char szTmp[64]; std::string msg = stBuf.substr(15,26); // item_award의 id범위? TPacketDeleteAwardID p; p.dwID = (DWORD)(atoi(msg.c_str())); snprintf(szTmp,sizeof(szTmp),"Sent to DB cache to delete ItemAward, id: %d",p.dwID); //sys_log(0,"%d",p.dwID); // strlcpy(p.login, msg.c_str(), sizeof(p.login)); db_clientdesc->DBPacket(HEADER_GD_DELETE_AWARDID, 0, &p, sizeof(p)); stResult += szTmp; } else { stResult = "UNKNOWN"; if (d->IsAdminMode()) { // 어드민 명령들 if (!stBuf.compare(0, 7, "NOTICE ")) { std::string msg = stBuf.substr(7, 50); LogManager::instance().CharLog(0, 0, 0, 1, "NOTICE", msg.c_str(), d->GetHostName()); BroadcastNotice(msg.c_str()); } else if (!stBuf.compare("CLOSE_PASSPOD")) { g_bNoPasspod = true; stResult += "CLOSE_PASSPOD"; } else if (!stBuf.compare("OPEN_PASSPOD")) { g_bNoPasspod = false; stResult += "OPEN_PASSPOD"; } else if (!stBuf.compare("SHUTDOWN")) { LogManager::instance().CharLog(0, 0, 0, 2, "SHUTDOWN", "", d->GetHostName()); TPacketGGShutdown p; p.bHeader = HEADER_GG_SHUTDOWN; P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGShutdown)); sys_err("Accept shutdown command from %s.", d->GetHostName()); Shutdown(10); } else if (!stBuf.compare("SHUTDOWN_ONLY")) { LogManager::instance().CharLog(0, 0, 0, 2, "SHUTDOWN", "", d->GetHostName()); sys_err("Accept shutdown only command from %s.", d->GetHostName()); Shutdown(10); } else if (!stBuf.compare(0, 3, "DC ")) { std::string msg = stBuf.substr(3, LOGIN_MAX_LEN); dev_log(LOG_DEB0, "DC : '%s'", msg.c_str()); TPacketGGDisconnect pgg; pgg.bHeader = HEADER_GG_DISCONNECT; strlcpy(pgg.szLogin, msg.c_str(), sizeof(pgg.szLogin)); P2P_MANAGER::instance().Send(&pgg, sizeof(TPacketGGDisconnect)); // delete login key { TPacketDC p; strlcpy(p.login, msg.c_str(), sizeof(p.login)); db_clientdesc->DBPacket(HEADER_GD_DC, 0, &p, sizeof(p)); } } else if (!stBuf.compare(0, 10, "RELOAD_CRC")) { LoadValidCRCList(); BYTE bHeader = HEADER_GG_RELOAD_CRC_LIST; P2P_MANAGER::instance().Send(&bHeader, sizeof(BYTE)); stResult = "OK"; } else if (!stBuf.compare(0, 20, "CHECK_CLIENT_VERSION")) { CheckClientVersion(); BYTE bHeader = HEADER_GG_CHECK_CLIENT_VERSION; P2P_MANAGER::instance().Send(&bHeader, sizeof(BYTE)); stResult = "OK"; } else if (!stBuf.compare(0, 6, "RELOAD")) { if (stBuf.size() == 6) { LoadStateUserCount(); db_clientdesc->DBPacket(HEADER_GD_RELOAD_PROTO, 0, NULL, 0); DBManager::instance().LoadDBString(); } else { char c = stBuf[7]; switch (LOWER(c)) { case 'u': LoadStateUserCount(); break; case 'p': db_clientdesc->DBPacket(HEADER_GD_RELOAD_PROTO, 0, NULL, 0); break; case 's': DBManager::instance().LoadDBString(); break; case 'q': quest::CQuestManager::instance().Reload(); break; case 'f': fishing::Initialize(); break; case 'a': db_clientdesc->DBPacket(HEADER_GD_RELOAD_ADMIN, 0, NULL, 0); sys_log(0, "Reloading admin infomation."); break; } } } else if (!stBuf.compare(0, 6, "EVENT ")) { std::istringstream is(stBuf); std::string strEvent, strFlagName; long lValue; is >> strEvent >> strFlagName >> lValue; if (!is.fail()) { sys_log(0, "EXTERNAL EVENT FLAG name %s value %d", strFlagName.c_str(), lValue); quest::CQuestManager::instance().RequestSetEventFlag(strFlagName, lValue); stResult = "EVENT FLAG CHANGE "; stResult += strFlagName; } else { stResult = "EVENT FLAG FAIL"; } } // BLOCK_CHAT else if (!stBuf.compare(0, 11, "BLOCK_CHAT ")) { std::istringstream is(stBuf); std::string strBlockChat, strCharName; long lDuration; is >> strBlockChat >> strCharName >> lDuration; if (!is.fail()) { sys_log(0, "EXTERNAL BLOCK_CHAT name %s duration %d", strCharName.c_str(), lDuration); do_block_chat(NULL, const_cast<char*>(stBuf.c_str() + 11), 0, 0); stResult = "BLOCK_CHAT "; stResult += strCharName; } else { stResult = "BLOCK_CHAT FAIL"; } }
void CThreeWayWar::onDead(LPCHARACTER pChar, LPCHARACTER pkKiller) { if (false == pChar->IsPC()) return; if (GM_PLAYER != pChar->GetGMLevel() && false == test_server) return; if (-1 == GetRegenFlag()) return; DecreaseReviveTokenForPlayer( pChar->GetPlayerID() ); if (false == IsSungZiMapIndex(pChar->GetMapIndex())) return; if (NULL == pkKiller || true != pkKiller->IsPC()) return; // °°Ає Б¦±№Ає °и»кЗПБц ѕКАЅ if (pChar->GetEmpire() == pkKiller->GetEmpire()) return; int nKillScore = GetKillScore(pkKiller->GetEmpire()); // Б¦±№ Еі ЅєДЪѕо°Ў -1АП°жїмґВ Е»¶ф±№°ЎА̱⶧№®їЎ БЎјц ГјЕ©ё¦ ЗПёй ѕИµИґЩ. if (nKillScore >= 0) { nKillScore += GetKillValue(pChar->GetLevel()); SetKillScore(pkKiller->GetEmpire(), nKillScore); } if (nKillScore != 0 && (test_server || (nKillScore % 5) == 0)) { char szBuf[64 + 1]; snprintf(szBuf, sizeof(szBuf), LC_TEXT("ЗцАз ЅєДЪѕо ЅЕјц±№:%d ГµБ¶±№:%d Бшіл±№:%d"), GetKillScore(1), GetKillScore(2), GetKillScore(3)); SendNoticeMap(szBuf, GetSungziMapIndex(), false); } const int nVictoryScore = quest::CQuestManager::instance().GetEventFlag("threeway_war_kill_count"); if (0 == GetRegenFlag()) { int nEliminatedEmpireCount = 0; BYTE bLoseEmpire = 0; for (int n = 1; n < 4; ++n) { if (nVictoryScore > GetKillScore(n)) { ++nEliminatedEmpireCount; bLoseEmpire = n; } } if (1 != nEliminatedEmpireCount) return; //---------------------- //Д«їоЖ® ГК±вИ //---------------------- SetKillScore(1, 0); SetKillScore(2, 0); SetKillScore(3, 0); SetKillScore(bLoseEmpire, -1); quest::warp_all_to_map_my_empire_event_info * info; //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : јєБцїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetSungziMapIndex(); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(10)); //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : Ел·ОїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetPassMapIndex(bLoseEmpire); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(10)); //---------------------- //јєБцїЎ ЖГ±вґВ ±№°ЎїЎ ґлЗС АМѕЯ±вё¦ ё¶їХАМ ЗФ! //---------------------- const std::string Nation(EMPIRE_NAME(bLoseEmpire)); const std::string Script( LC_TEXT("јєБцАЗ ё¶їХ: іКИс ") + Nation + LC_TEXT("іај®µйАє АМ°ч јєБцїЎ АЦА» АЪ°ЭА» АТѕъґЩ. ёрµО јєБцїЎј №°·ЇіЄ°Е¶у~~[ENTER][ENTER] 10ГК ИДїЎ ёрµО ё¶А»·О АМµїЗП°Ф µЛґПґЩ. ") + "[ENTER][DONE]" ); CHARACTER_MANAGER::instance().SendScriptToMap(pChar->GetMapIndex(), Script); //---------------------- // °шБц ЗС№ж іЇ·ББЬ. //---------------------- char szNotice[512+1]; snprintf(szNotice, sizeof(szNotice), LC_TEXT("»п°Её® АьЕхїЎј %s ±№°Ў°Ў °ЎАеёХАъ Е»¶фА» ЗПїґЅАґПґЩ"), Nation.c_str()); BroadcastNotice(szNotice); snprintf(szNotice, sizeof(szNotice), "First Step: %s exclusion", Nation.c_str()); LogManager::instance().CharLog(0, 0, 0, 0, "THREEWAY", szNotice, NULL); //---------------------- // ёчА» ё®БЁЗСґЩ. //---------------------- regen_mob_event_info* regen_info = AllocEventInfo<regen_mob_event_info>(); regen_info->dwMapIndex = pChar->GetMapIndex(); event_create(regen_mob_event, regen_info, PASSES_PER_SEC(10)); SetRegenFlag(1); } else if (1 == GetRegenFlag()) { int nVictoryEmpireIndex = 0; for (int n = 1; n < 4; ++n) { nKillScore = GetKillScore(n); if (nKillScore == -1) continue; if (nVictoryScore <= nKillScore) { nVictoryEmpireIndex = n; break; } } if (0 == nVictoryEmpireIndex) return; for (int n = 1; n < 4; ++n) { if (n != nVictoryEmpireIndex) { BYTE bLoseEmpire = n; quest::warp_all_to_map_my_empire_event_info * info; //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : јєБцїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetSungziMapIndex(); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(5)); //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : Ел·ОїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetPassMapIndex(bLoseEmpire); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(5)); } } //------------------------------ // ГЦБѕ ЅєДЪѕо ЗҐЅГ //------------------------------ { char szBuf[64 + 1]; snprintf(szBuf, sizeof(szBuf), LC_TEXT("ЗцАз ЅєДЪѕо ЅЕјц±№:%d ГµБ¶±№:%d Бшіл±№:%d"), GetKillScore(1), GetKillScore(2), GetKillScore(3)); SendNoticeMap(szBuf, GetSungziMapIndex(), false); } // ёЮјјБцё¦ ¶зїцБШґЩ. LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap(pChar->GetMapIndex()); if (NULL != pSecMap) { const std::string EmpireName(EMPIRE_NAME(nVictoryEmpireIndex)); const std::string Script( EmpireName + LC_TEXT(". іКИс°Ў јєБцАЗ јцИЈАЪё¦ Ав°Ф µИґЩёй іКИсґВ јєБцАЗ БЦАОАМ µИґЩ.[ENTER][ENTER] ") + "[ENTER][DONE]"); struct packet_script pack_script; pack_script.header = HEADER_GC_SCRIPT; pack_script.skin = 1; pack_script.src_size = Script.size(); quest::FSendPacketToEmpire fSend; fSend.bEmpire = nVictoryEmpireIndex; pack_script.size = pack_script.src_size + sizeof(struct packet_script); fSend.buf.write(&pack_script, sizeof(struct packet_script)); fSend.buf.write(&Script[0], Script.size()); pSecMap->for_each(fSend); char szBuf[512]; snprintf(szBuf, sizeof(szBuf), "Second Step: %s remain", EMPIRE_NAME( nVictoryEmpireIndex )); LogManager::instance().CharLog(0, 0, 0, 0, "THREEWAY", szBuf, NULL); } //------------------------------ // ё¶Бцё· єё»у : Бш±ё№МИЈ јТИЇ //----------------------------- for (int n = 0; n < quest::CQuestManager::instance().GetEventFlag("threeway_war_boss_count");) { int x = pChar->GetX(); int y = pChar->GetY(); x = (thecore_random() & 1) ? x - number(200, 1000) : x + number(200, 1000); y = (thecore_random() & 1) ? y - number(200, 1000) : y + number(200, 1000); if (x < 0) x = pChar->GetX(); if (y < 0) y = pChar->GetY(); LPCHARACTER ch = CHARACTER_MANAGER::instance().SpawnMob( GetEventSungZiMapInfo().m_iBossMobVnum, pChar->GetMapIndex(), x, y, 0, false); if (NULL != ch) { ch->SetAggressive(); ++n; } } SetRegenFlag(-1); } }