#include "stdafx.h" #include "ParseMoveZone.h" #include #include #include #include #include #include #include #include #include #include #include namespace DBAgent { namespace ParseMoveZone { bool CharMoveZone(CSendStream& SendStream, PktSZMvD* lpPktSZMvD); bool ServerZone(CSendStream& SendStream, PktSA* lpPktSA); bool ServerZoneEnd(CSendStream& SendStream, PktDD* lpPktDD); bool Parse(CSendStream& SendStream, PktBase* lpPktBase) { bool bResult = false; PktDD* lpPktDD = static_cast(lpPktBase); switch (lpPktDD->m_wCmd) { case PktDD::SCmdCharMoveZone: bResult = CharMoveZone(SendStream, static_cast(lpPktDD)); break; case PktDD::SCmdServerZone: bResult = ServerZone(SendStream, static_cast(lpPktDD)); break; case PktDD::SCmdServerZoneEnd: bResult = ServerZoneEnd(SendStream, lpPktDD); break; default: ERRLOG1(g_Log, "ZoneMove ÆÐŶ ó¸® ¿¡·¯ : ¾Ë ¼ö ¾ø´Â ÆÐŶ CMD:0x%02X¸¦ ¹Þ¾Ò½À´Ï´Ù.", lpPktDD->m_wCmd); bResult = true; break; } return bResult; } class CFindGameServerDispatch { public: CFindGameServerDispatch(CGameDispatch*& lpGameDispatch, SERVER_ID serverID) : m_lpGameDispatch(lpGameDispatch), m_serverID(serverID) { m_lpGameDispatch = 0; } bool operator() (unsigned long dwServerID, CPacketDispatch& packetDispatch) { if(0 == m_lpGameDispatch) { SERVER_ID serverID; serverID.dwID = dwServerID; // ¼­¹ö ID°¡ °°À¸¸é ¼±ÅÃ, ´Ù¸£´õ¶óµµ, ä³Î¸¸ -1ÀÌ°í ´Ù¸¥°Ô °°À¸¸é ¼±ÅÃ. if ((serverID.dwID == m_serverID.dwID) || (-1 == m_serverID.GetChannel() && serverID.GetZone() == m_serverID.GetZone() && serverID.GetGroup() == m_serverID.GetGroup() && serverID.GetType() == m_serverID.GetType())) { m_lpGameDispatch = &static_cast(packetDispatch); } } return true; } private: CGameDispatch*& m_lpGameDispatch; SERVER_ID m_serverID; }; bool CharMoveZone(CSendStream& SendStream, PktSZMvD* lpPktSZMvD) { unsigned long dwRequestKey = lpPktSZMvD->m_dwRequestKey; unsigned long dwUID = lpPktSZMvD->m_dwUserID; const POS& Pos = lpPktSZMvD->m_NewPos; char cZone = lpPktSZMvD->m_cZone; char cChannel = lpPktSZMvD->m_cChannel; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseMoveZone::CharMoveZone : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, 0, 0, 0); #endif unsigned short usError = 0; using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); CCharacterData* lpCharacterData = 0; SERVER_ID serverID; serverID.sID.Type = CServerSetup::GameServer; serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup(); serverID.sID.Channel = cChannel; serverID.sID.ID = cZone; CGameDispatch* lpGameDispatch = 0; CGameDispatch::GetDispatchTable().Process( CFindGameServerDispatch(lpGameDispatch, serverID)); if (0 == lpSessionData) { ERRLOG1(g_Log, "UID:%10u / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : ¼¼¼ÇÀÌ ¿­·Á ÀÖÁö ¾Ê½À´Ï´Ù.", dwUID); usError = PktSZMvDAck::FAIL_INVALID_CHAR; } else if (0 == (lpCharacterData = lpSessionData->GetCharacterData())) { ERRLOG1(g_Log, "UID:%10u / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : ij¸¯ÅÍ µ¥ÀÌÅͰ¡ ·ÎµåµÇÁö ¾Ê¾Ò½À´Ï´Ù.", dwUID); usError = PktSZMvDAck::FAIL_INVALID_CHAR; } else if (0 == lpGameDispatch) { ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : ¼­¹ö°¡ ¾ø½À´Ï´Ù.", dwUID, serverID.dwID); usError = PktSZMvDAck::FAIL_INVALID_ZONE; } else if (0 == lpSessionData->GetAdminLevel()) { // edith 2009.06.13 ¼®»óÀü À¯Àú ¼ö üũ if(SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3) { if (CServerSetup::GetInstance().GetBattleLimit() < lpGameDispatch->GetCharNum()) { // »ç¶÷ÀÌ ³Ê¹« ¸¹´Ù. ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : »ç¶÷ÀÌ ³Ê¹« ¸¹½À´Ï´Ù.", dwUID, serverID.dwID); usError = PktSZMvDAck::FAIL_PERSONNEL_OVER; } else { int maxDefaultUser = 10; float limitPer = (float)CServerSetup::GetInstance().GetBattleLimitPer()/100.f; if(limitPer < 1.0f) limitPer = 1.0f; int akhanUser = lpGameDispatch->GetCharNum(CClass::AKHAN); int humanUser = lpGameDispatch->GetCharNum(CClass::HUMAN); // ³»°¡ Àΰ£À̰í, Àΰ£ÀÌ ¾ÆÄ­º¸´Ù 1.5¹è ¸¹Àº »óȲÀ̸é ÀÔÀå ºÒ°¡. if (CClass::HUMAN == lpCharacterData->GetRace()) { int overCount = (int)((float)akhanUser * limitPer) - akhanUser; if(overCount < maxDefaultUser) overCount = maxDefaultUser; int overUser = akhanUser + overCount; if(overUser < lpGameDispatch->GetCharNum(CClass::HUMAN)) { ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : Àΰ£Á¾Á· ºÒ±ÕÇü.", dwUID, serverID.dwID); usError = PktSZMvDAck::FAIL_PERSONNEL_OVER; } } // ³»°¡ ¾ÆÄ­À̰í, ¾ÆÄ­ÀÌ Àΰ£º¸´Ù 1.5¹è ¸¹Àº »óȲÀ̸é ÀÔÀå ºÒ°¡. else if (CClass::AKHAN == lpCharacterData->GetRace()) { int overCount = (int)((float)humanUser * limitPer) - humanUser; if(overCount < maxDefaultUser) overCount = maxDefaultUser; int overUser = humanUser + overCount; if(overUser < lpGameDispatch->GetCharNum(CClass::AKHAN)) { ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : ¾ÆÄ­Á¾Á· ºÒ±ÕÇü.", dwUID, serverID.dwID); usError = PktSZMvDAck::FAIL_PERSONNEL_OVER; } } } } else if (SERVER_ID::ZONE3 == cZone) { // ¹èƲ±×¶ó¿îµåÀÇ °æ¿ì Àοø Á¦ÇÑ Ã¼Å© // 2008.10.12 ZONE3¹ø À¯Àú ¼³Á¤ Á¦°Å. ERRLOG3(g_Log, "UID:%10u / 3¹ø Á¸ Á¢¼Ó ½Ãµµ : Zone(%d,%d)", dwUID, cZone, cChannel); usError = PktSZMvDAck::FAIL_INVALID_CHAR; /* SYSTEMTIME systemTime; GetSystemTime(&systemTime); // ¹èƲ ±×¶ó¿îµå ÈÞ½Ä ½Ã°£µ¿¾È¿¡´Â °¢ Á¾Á·ÀÇ Ãʱâ Á¸À¸·Î À̵¿ ½ÃÄÑÁØ´Ù. if ((systemTime.wMinute >= STATUE_REST_TIME_1ST_START && systemTime.wMinute <= STATUE_REST_TIME_1ST_END) || (systemTime.wMinute >= STATUE_REST_TIME_2ND_START && systemTime.wMinute <= STATUE_REST_TIME_2ND_END)) { cZone = lpDataSession->GetCharDataSession().GetCharStartZone(lpCharacterData->GetRace()); } */ /* SERVER_ID serverID; serverID.sID.Type = CServerSetup::GameServer; serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup(); serverID.sID.Channel = cChannel; serverID.sID.ID = cZone; CGameDispatch* lpGameDispatch = 0; CGameDispatch::GetDispatchTable().Process( CFindGameServerDispatch(lpGameDispatch, serverID)); if (0 == lpGameDispatch) { ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : ¼­¹ö°¡ ¾ø½À´Ï´Ù.", dwUID, serverID.dwID); usError = PktSZMvDAck::FAIL_INVALID_ZONE; } else if (CServerSetup::GetInstance().GetBattleLimit() > lpGameDispatch->GetCharNum()) { // ³»°¡ Àΰ£À̰í, Àΰ£ÀÌ ¾ÆÄ­º¸´Ù 1.5¹è ¸¹Àº »óȲÀ̸é ÀÔÀå ºÒ°¡. if (CClass::HUMAN == lpCharacterData->GetRace() && lpGameDispatch->GetCharNum(CClass::AKHAN) * 1.5 < lpGameDispatch->GetCharNum(CClass::HUMAN)) { usError = PktSZMvDAck::FAIL_PERSONNEL_OVER; } // ³»°¡ ¾ÆÄ­À̰í, ¾ÆÄ­ÀÌ Àΰ£º¸´Ù 1.5¹è ¸¹Àº »óȲÀ̸é ÀÔÀå ºÒ°¡. else if (CClass::AKHAN == lpCharacterData->GetRace() && lpGameDispatch->GetCharNum(CClass::HUMAN ) * 1.5 < lpGameDispatch->GetCharNum(CClass::AKHAN)) { usError = PktSZMvDAck::FAIL_PERSONNEL_OVER; } } */ } } // if(SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3) // usError = PktSZMvDAck::FAIL_PERSONNEL_OVER; if(0 == usError && 0 != lpSessionData) { // ¹Ì¸® °¥ Á¸ ¼³Á¤ if (!lpSessionData->SetMoveZone(cZone, Pos)) { /* if(SERVER_ID::ZONE5 == cZone && !CGameTimeDBMgr::GetInstance().IsEnterTime()) { // Å×¼·¿ë ½Å±ÔÁ¸ ÁøÀÔÁ¦ÇÑ¿¡ °É·ÈÀ½. DETLOG5(g_Log, "UID:%10u / Zone:%2u / X:%f / Y:%f / Z:%f / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : ½Å±ÔÁ¸ ÁøÀÔÁ¦ÇÑ.", dwUID, cZone, Pos.fPointX, Pos.fPointY, Pos.fPointZ); } else { ERRLOG5(g_Log, "UID:%10u / Zone:%2u / X:%f / Y:%f / Z:%f / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : À߸øµÈ Á¸À¸·Î À̵¿ ½Ãµµ.", dwUID, cZone, Pos.fPointX, Pos.fPointY, Pos.fPointZ); } */ ERRLOG5(g_Log, "UID:%10u / Zone:%2u / X:%f / Y:%f / Z:%f / ij¸¯ÅÍ À̵¿ ½ÇÆÐ : À߸øµÈ Á¸À¸·Î À̵¿ ½Ãµµ.", dwUID, cZone, Pos.fPointX, Pos.fPointY, Pos.fPointZ); usError = PktSZMvDAck::FAIL_INVALID_ZONE; } } // edith 2009.06.28 Á¸À̵¿½ÇÆÐ½Ã ÀüÀï Ç÷¡±×¸¦ ²¨ÁØ´Ù. // gameserver¿¡¼­ dbagnet·Î ÆÐŶ Àü´ÞÇÏ°Ô ¼Ò½º ¼öÁ¤ÇÔ. if(0 != usError) { if(SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3) lpCharacterData->SetRealmWarFlag(Creature::WAR_OFF); else if(SERVER_ID::CAPITAL == cZone) lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF); } return (-1 == cChannel || 0 != usError) ? // ä³ÎÀÌ -1À̰ųª, ¿¡·¯°¡ ÀÖ´Â °æ¿ì ÀÌ ÆÐŶÀ» º¸³¿. SendPacket::CharMoveZone(SendStream, dwRequestKey, cZone, usError) : SendPacket::ServerZone(SendStream, dwRequestKey, cZone, cChannel); } bool ServerZone(CSendStream& SendStream, PktSA* lpPktSA) { unsigned long dwUID = lpPktSA->m_dwUserID; unsigned short usError = 0; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseMoveZone::ServerZone : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, 0, 0, 0); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); if (0 == lpSessionData) { ERRLOG1(g_Log, "UID:%10u / ServerZone ½ÇÆÐ : ¼¼¼ÇÀÌ ¿­·Á ÀÖÁö ¾Ê½À´Ï´Ù.", dwUID); usError = PktSAAck::SERVER_ERROR; } return SendPacket::ServerZone(SendStream, lpPktSA->m_dwRequestKey, lpPktSA->m_cZone, lpPktSA->m_cChannel, usError); } bool ServerZoneEnd(CSendStream& SendStream, PktDD* lpPktDD) { #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseMoveZone::ServerZoneEnd : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", 0, 0, 0, 0); #endif return SendPacket::ServerZoneEnd(SendStream, lpPktDD->m_dwRequestKey); } } }