#include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "SiegeObjectDBMgr.h" #include "SiegeObjectDB.h" #include "CampDB.h" #include "MiningCampDB.h" #include "CampShopDB.h" #include "WorldWeaponDB.h" #include "SiegeArmsDB.h" #include "CastleEmblemDB.h" #include "CastleGateDB.h" #include "CastleArmsDB.h" CSiegeObjectDB* CSiegeObjectDBMgr::CreateCastleObjectDB(const CastleObjectInfoDB& CastleObject) { switch (CastleObject.m_wObjectType) { case Siege::EMBLEM : return (NULL != m_lpDBComponent) ? new CCastleEmblemDB(*m_lpDBComponent, CastleObject) : NULL; case Siege::GATE : return (NULL != m_lpDBComponent) ? new CCastleGateDB(*m_lpDBComponent, CastleObject) : NULL; case Siege::CASTLE_ARMS_NPC : case Siege::SHORT_RANGE_CASTLE_ARMS : case Siege::LONG_RANGE_CASTLE_ARMS : case Siege::GUARD : return (NULL != m_lpDBComponent) ? new CCastleArmsDB(*m_lpDBComponent, CastleObject) : NULL; default: return (NULL != m_lpDBComponent) ? new CSiegeObjectDB(*m_lpDBComponent, CastleObject) : NULL; } return NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateCampDB(const CampInfoDB& CampInfo) { return (NULL != m_lpDBComponent) ? new CCampDB(*m_lpDBComponent, CampInfo) : NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateMiningCampDB(const CampInfoDB& CampInfo) { return (NULL != m_lpDBComponent) ? new CMiningCampDB(*m_lpDBComponent, CampInfo) : NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateCampShopDB(const CampInfoDB& CampInfo) { return (NULL != m_lpDBComponent) ? new CCampShopDB(*m_lpDBComponent, CampInfo) : NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateWorldWeaponDB(const CampInfoDB& CampInfo) { return (NULL != m_lpDBComponent) ? new CWorldWeaponDB(*m_lpDBComponent, CampInfo) : NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateCampDB(unsigned long dwCampID, unsigned long dwGID, unsigned char cZone, unsigned char cChannel, Position Pos) { return (NULL != m_lpDBComponent) ? new CCampDB(*m_lpDBComponent, dwCampID, dwGID, cZone, cChannel, Pos) : NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateWorldWeaponDB(unsigned long dwCampID, unsigned long dwGID, unsigned short wObjectType, unsigned char cZone, unsigned char cChannel, Position Pos) { return (NULL != m_lpDBComponent) ? new CWorldWeaponDB(*m_lpDBComponent, dwCampID, dwGID, wObjectType, cZone, cChannel, Pos) : NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateSiegeArmsDB(unsigned long dwOwnerID, unsigned char cNation, unsigned short wObjectType, unsigned char cUpgradeStep, unsigned char cZone, unsigned char cChannel, Position Pos) { return (NULL != m_lpDBComponent) ? new CSiegeArmsDB(*m_lpDBComponent, dwOwnerID, cNation, wObjectType, cUpgradeStep, cZone, cChannel, Pos) : NULL; } void CSiegeObjectDBMgr::DeleteSiegeObjectDB(CSiegeObjectDB* lpSiegeObjectDB) { if ( lpSiegeObjectDB ) { delete lpSiegeObjectDB; lpSiegeObjectDB = NULL; } } CSiegeObjectDBMgr& CSiegeObjectDBMgr::GetInstance() { static CSiegeObjectDBMgr siegeObjectDBMgr; return siegeObjectDBMgr; } CSiegeObjectDBMgr::CSiegeObjectDBMgr() : m_lpDBComponent(0) { } CSiegeObjectDBMgr::~CSiegeObjectDBMgr() { if (m_SiegeObjectMap.size() > 0) { SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); SiegeObjectMap::iterator end = m_SiegeObjectMap.end(); CSiegeObjectDB* lpSiegeObject = NULL; while (itr != end) { lpSiegeObject = itr->second; if (lpSiegeObject) { DeleteSiegeObjectDB(lpSiegeObject); lpSiegeObject = NULL; } ++itr; } m_SiegeObjectMap.clear(); m_CampMap.clear(); } } bool CSiegeObjectDBMgr::Initialize(CDBComponent& DBComponent) { m_lpDBComponent = &DBComponent; if (false == CServerSetup::GetInstance().UseContents(GameRYL::CAMP)) { return true; } // ÁÖÀÇ!! ¼º Á¤º¸¸¦ ¸ÕÀú Àоî¾ß ÇÑ´Ù. if (true == CServerSetup::GetInstance().UseContents(GameRYL::SIEGE)) { if (false == ReadCastleObjectInfoDB()) { return false; } } // ÁÖÀÇ!! Ç×»ó ¿ùµå ¿þÆù Á¤º¸¸¦ ¸ÕÀú Àоî¾ßÇÑ´Ù. if (true == CServerSetup::GetInstance().UseContents(GameRYL::CAMP_UPGRADE)) { if (false == ReadWorldWeaponInfoDB()) { return false; } } if (false == ReadCampInfoDB()) { return false; } return true; } void CSiegeObjectDBMgr::Process() { if (m_SiegeObjectMap.empty()) { return; } SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); CSiegeObjectDB* lpSiegeObject = NULL; std::list DeleteObjectList; std::map ChangeObjectMap; Siege::eReturn ret; while (itr != m_SiegeObjectMap.end()) { lpSiegeObject = itr->second; if (lpSiegeObject) { ret = lpSiegeObject->Process(); switch (ret) { case Siege::RET_DESTROY_CAMP: case Siege::RET_DESTROY_SIEGE_ARMS: { DeleteObjectList.push_back(lpSiegeObject->GetCID()); } break; case Siege::RET_CHANGE_TYPE: { CCampDB* lpCamp = reinterpret_cast(lpSiegeObject); if ( lpCamp ) { ChangeObjectMap.insert( std::make_pair(lpCamp->GetCampID(), lpCamp->GetChangeType()) ); } } break; } } ++itr; } // »èÁ¦ÇÒ ¿ÀºêÁ§Æ® »èÁ¦ std::list::iterator DeleteItr = DeleteObjectList.begin(); while (DeleteItr != DeleteObjectList.end()) { DeleteSiegeObject((*DeleteItr)); ++DeleteItr; } // º¯ÇüÇÒ ¿ÀºêÁ§Æ® º¯Çü std::map::iterator ChangeItr = ChangeObjectMap.begin(); while (ChangeItr != ChangeObjectMap.end()) { ChangeCampType(ChangeItr->first, ChangeItr->second); ++ChangeItr; } } // °ø¼º½Ã°£ÀÌ ³¡³­ÈÄ ¸í¼ºÀ» º¸»óÇÑ´Ù. void CSiegeObjectDBMgr::UpdateRewardFame() { if (m_CampMap.empty()) { return; } CampMap::iterator itr = m_CampMap.begin(); CampMap::iterator end = m_CampMap.end(); CCampDB* lpCamp = NULL; while (itr != end) { lpCamp = itr->second; if (NULL != lpCamp) { switch (lpCamp->GetObjectType()) { case Siege::CAMP: lpCamp->UpdateRewardFame(100); break; case Siege::MINING_CAMP : lpCamp->UpdateRewardFame(200); break; case Siege::CAMP_SHOP : lpCamp->UpdateRewardFame(250); break; } } ++itr; } } // °ø¼º ½Ã°£ Áö³­ Ƚ¼ö Áõ°¡ ¹× ¾÷µ¥ÀÌÆ® void CSiegeObjectDBMgr::UpdateSiegeCount() { if (m_CampMap.empty()) { return; } CampMap::iterator itr = m_CampMap.begin(); CampMap::iterator end = m_CampMap.end(); CCampDB* lpCamp = NULL; unsigned char cSiegeCount; while (itr != end) { lpCamp = itr->second; if (NULL != lpCamp) { switch (lpCamp->GetObjectType()) { case Siege::MINING_CAMP : { if (Siege::MINING_ON == lpCamp->GetSubState()) { cSiegeCount = lpCamp->GetSiegeCount(); ++cSiegeCount; // °ÔÀÓ¼­¹ö¿¡¼­ ä±¼ 󸮸¦ ÇϹǷÎ, ´Ù½Ã ¸®¼Â 󸮸¦ ÇØÁà¾ßÇÑ´Ù.!! if (Siege::MINING_CAMP_GAIN_COUNT <= cSiegeCount) cSiegeCount = 0; lpCamp->SetSiegeCount(cSiegeCount); DBComponent::CastleDB::UpdateCampSiegeCount(*m_lpDBComponent, lpCamp->GetCampID(), cSiegeCount); } } break; case Siege::CAMP_SHOP : { cSiegeCount = lpCamp->GetSiegeCount(); ++cSiegeCount; lpCamp->SetSiegeCount(cSiegeCount); DBComponent::CastleDB::UpdateCampSiegeCount(*m_lpDBComponent, lpCamp->GetCampID(), cSiegeCount); } break; } } ++itr; } } // ¿ùµå ¿þÆù ÆÄ±«Á¤º¸ÀÇ °ø¼º ½Ã°£ Áö³­ Ƚ¼ö Áõ°¡ void CSiegeObjectDBMgr::DecreaseWeaponRemainSiegeTime() { WorldWeaponInfoMap::iterator itr = m_WorldWeaponInfoMap.begin(); WorldWeaponInfoMap::iterator end = m_WorldWeaponInfoMap.end(); while (itr != end) { bool bUpdate = false; WorldWeaponInfo& WeaponInfo = itr->second; // ³²Àº °ø¼º ½Ã°£ °¨¼Ò if (WeaponInfo.m_cKarRemainSiegeTime > 0) { --WeaponInfo.m_cKarRemainSiegeTime; bUpdate = true; } if (WeaponInfo.m_cMerRemainSiegeTime > 0) { --WeaponInfo.m_cMerRemainSiegeTime; bUpdate = true; } if (bUpdate) { unsigned char cZone = static_cast( (itr->first & 0xFFFF0000) >> 16 ); unsigned char cChannel = static_cast( (itr->first & 0x0000FFFF) ); if (0 == WeaponInfo.m_cKarRemainSiegeTime && 0 == WeaponInfo.m_cMerRemainSiegeTime) { DBComponent::CastleDB::DeleteWorldWeaponInfo(*m_lpDBComponent, cZone, cChannel); } else { DBComponent::CastleDB::UpdateWorldWeaponInfo(*m_lpDBComponent, cZone, cChannel, WeaponInfo.m_cKarRemainSiegeTime, WeaponInfo.m_cMerRemainSiegeTime); } } ++itr; } } CSiegeObjectDB* CSiegeObjectDBMgr::CreateCastleObject(CastleObjectInfoDB& CastleObject) { if (NULL != m_lpDBComponent) { CSiegeObjectDB* lpCastleObject = CreateCastleObjectDB(CastleObject); if (lpCastleObject) { if ( !m_SiegeObjectMap.insert(std::make_pair(lpCastleObject->GetCID(), lpCastleObject)).second ) { DeleteSiegeObject(lpCastleObject->GetCID()); return NULL; } return lpCastleObject; } } return NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateCamp(CampInfoDB& CampInfo, unsigned long dwCID) { if (NULL != m_lpDBComponent) { CSiegeObjectDB* lpCamp = CreateCampDB(CampInfo); if (lpCamp) { // CID ¼ÂÆÃ if (dwCID) { lpCamp->SetCID(dwCID); } else { lpCamp->SetCID(Creature::SIEGE_OBJECT_BIT | GetBlankIndex()); } // ¸®½ºÆ®¿¡ Ãß°¡ if ( !m_SiegeObjectMap.insert(std::make_pair(lpCamp->GetCID(), lpCamp)).second ) { DeleteSiegeObject(lpCamp); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpCamp->GetCampID(), reinterpret_cast(lpCamp))).second ) { DeleteSiegeObject(lpCamp); return NULL; } return lpCamp; } } return NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateMiningCamp(CampInfoDB& CampInfo, unsigned long dwCID) { if (false == CServerSetup::GetInstance().UseContents(GameRYL::CAMP_UPGRADE)) { return NULL; } if (NULL != m_lpDBComponent) { CSiegeObjectDB* lpCamp = CreateMiningCampDB(CampInfo); if ( lpCamp ) { const int MAX_ROWS = 10240; int nGetRows = 0; char szBuffer[CDBComponent::QUERY_BUFFER_LEN]; _snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1, "SELECT TblCampMineralInfo.nCampID, " "TblCampMineralInfo.snMineralID, " "TblCampMineralInfo.snAmount, " "TblCampMineralInfo.tnFlag " "FROM TblGuildInfo, TblCampInfo, TblCampMineralInfo " "WHERE TblGuildInfo.nGuildID = TblCampInfo.nGuildID " "AND TblCampInfo.nCampID = TblCampMineralInfo.nCampID " "AND TblCampMineralInfo.nCampID = %d " "AND TblGuildInfo.OldServerGroupID = %d", CampInfo.m_dwCampID, CServerSetup::GetInstance().GetAgentServerType()); szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0; if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer)) { ERRLOG0(g_Log, "CampMineral DB ¾ò¾î¿À±â ½ÇÆÐ"); return false; } CMiningCampDB* lpMiningCamp = reinterpret_cast(lpCamp); CampMineralInfo tempMineralInfo; CampMineralInfoDB* campMineralInfo = new CampMineralInfoDB[MAX_ROWS]; memset(campMineralInfo, 0, sizeof(CampMineralInfoDB) * MAX_ROWS); while (m_lpDBComponent->GetData((void**)campMineralInfo, sizeof(CampMineralInfoDB), MAX_ROWS, &nGetRows)) { if (0 == nGetRows) { break; } for (CampMineralInfoDB* lpCampMineralInfo = campMineralInfo; nGetRows > 0; --nGetRows, ++lpCampMineralInfo) { tempMineralInfo.m_wMineralID = lpCampMineralInfo->m_wMineralID; tempMineralInfo.m_wAmount = lpCampMineralInfo->m_wAmount; lpMiningCamp->AddMineral( lpCampMineralInfo->m_cFlag, tempMineralInfo ); } memset(campMineralInfo, 0, sizeof(CampMineralInfoDB) * MAX_ROWS); } delete [] campMineralInfo; // CID ¼ÂÆÃ if (dwCID) { lpCamp->SetCID(dwCID); } else { lpCamp->SetCID(Creature::SIEGE_OBJECT_BIT | GetBlankIndex()); } // ¸®½ºÆ®¿¡ Ãß°¡ if ( !m_SiegeObjectMap.insert(std::make_pair(lpCamp->GetCID(), lpCamp)).second ) { DeleteSiegeObject(lpCamp); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpCamp->GetCampID(), reinterpret_cast(lpCamp))).second ) { DeleteSiegeObject(lpCamp); return NULL; } return lpCamp; } } return NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateCampShop(CampInfoDB& CampInfo, unsigned long dwCID) { if (false == CServerSetup::GetInstance().UseContents(GameRYL::CAMP_UPGRADE)) { return NULL; } if (NULL != m_lpDBComponent) { CSiegeObjectDB* lpCamp = CreateCampShopDB(CampInfo); if ( lpCamp ) { const int MAX_ROWS = 256; int nGetRows = 0; char szBuffer[CDBComponent::QUERY_BUFFER_LEN]; _snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1, "SELECT TblCampShopInfo.CampID, " "TblCampShopInfo.Item, " "TblCampShopInfo.TempMoney, " "TblCampShopInfo.Tax " "FROM TblGuildInfo, TblCampInfo, TblCampShopInfo " "WHERE TblGuildInfo.nGuildID = TblCampInfo.nGuildID " "AND TblCampInfo.nCampID = TblCampShopInfo.CampID " "AND TblCampShopInfo.CampID = %d " "AND TblGuildInfo.OldServerGroupID = %d", CampInfo.m_dwCampID, CServerSetup::GetInstance().GetAgentServerType()); szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0; if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer)) { ERRLOG0(g_Log, "CampShop DB ¾ò¾î¿À±â ½ÇÆÐ"); return false; } CCampShopDB* lpCampShop = reinterpret_cast(lpCamp); CampShopInfoDB* campShopInfo = new CampShopInfoDB[MAX_ROWS]; memset(campShopInfo, 0, sizeof(CampShopInfoDB) * MAX_ROWS); while (m_lpDBComponent->GetData((void**)campShopInfo, sizeof(CampShopInfoDB), MAX_ROWS, &nGetRows)) { if (0 == nGetRows) { break; } for (CampShopInfoDB* lpCampShopInfo = campShopInfo; nGetRows > 0; --nGetRows, ++lpCampShopInfo) { if (0 != lpCampShopInfo->m_dwTotalSize) { // Àüü ¹öÆÛ Å©±â(°ª) = Àüü ¹öÆÛ Å©±â(ÀúÀå¼Ò) + ¾ÆÀÌÅÛ °¹¼ö(ÀúÀå¼Ò) + ¾ÆÀÌÅÛ ¹öÆÛ + °¡°Ý ¹öÆÛ unsigned long dwBufferSize = lpCampShopInfo->m_dwTotalSize - sizeof(unsigned long) - sizeof(unsigned char) - sizeof(unsigned long) * lpCampShopInfo->m_cItemNum; lpCampShop->SetItemContainer( reinterpret_cast(lpCampShopInfo->m_aryItemContainer), dwBufferSize, lpCampShopInfo->m_cItemNum); } lpCampShop->SetTempSafe(lpCampShopInfo->m_dwTempSafe); lpCampShop->SetTax(lpCampShopInfo->m_cTax); } memset(campShopInfo, 0, sizeof(CampShopInfoDB) * MAX_ROWS); } delete [] campShopInfo; // CID ¼ÂÆÃ if (dwCID) { lpCamp->SetCID(dwCID); } else { lpCamp->SetCID(Creature::SIEGE_OBJECT_BIT | GetBlankIndex()); } // ¸®½ºÆ®¿¡ Ãß°¡ if ( !m_SiegeObjectMap.insert(std::make_pair(lpCamp->GetCID(), lpCamp)).second ) { DeleteSiegeObject(lpCamp); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpCamp->GetCampID(), reinterpret_cast(lpCamp))).second ) { DeleteSiegeObject(lpCamp); return NULL; } return lpCamp; } } return NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateWorldWeapon(CampInfoDB& CampInfo, unsigned long dwCID) { if (false == CServerSetup::GetInstance().UseContents(GameRYL::CAMP_UPGRADE)) { return NULL; } if (NULL != m_lpDBComponent) { CSiegeObjectDB* lpCamp = NULL; unsigned char cNation = Creature::STATELESS; switch (CampInfo.m_wObjectType) { case Siege::KARTERANT_WEAPON: cNation = Creature::KARTERANT; break; case Siege::MERKADIA_WEAPON: cNation = Creature::MERKADIA; break; } // -------------------------------------------------------------------- // // µÎ°³ÀÇ ¿ùµå ¿þÆùÀÌ »ý¼ºµÇ¾ú´ÂÁö üũ ¹× ¿ùµå ¿þÆù ¼ÒÀ¯ ±¹°¡ Á¤º¸ ¼³Á¤ bool bEnableCreateWorldWeapon = true; unsigned long dwZoneChannel = static_cast(CampInfo.m_cZone << 16 | CampInfo.m_cChannel); WorldWeaponInfoMap::iterator itr = m_WorldWeaponInfoMap.find(dwZoneChannel); if (itr != m_WorldWeaponInfoMap.end()) { WorldWeaponInfo& WeaponInfo = itr->second; if (Creature::STATELESS != WeaponInfo.m_cWorldWeaponNation) { bEnableCreateWorldWeapon = false; } else { switch (cNation) { case Creature::KARTERANT: { if (WeaponInfo.m_cKarRemainSiegeTime > 0) { bEnableCreateWorldWeapon = false; } } break; case Creature::MERKADIA: { if (WeaponInfo.m_cMerRemainSiegeTime > 0) { bEnableCreateWorldWeapon = false; } } break; } } if (bEnableCreateWorldWeapon) { WeaponInfo.m_cWorldWeaponNation = cNation; } } else { WorldWeaponInfo tempInfo; tempInfo.m_cWorldWeaponNation = cNation; tempInfo.m_cKarRemainSiegeTime = 0; tempInfo.m_cMerRemainSiegeTime = 0; m_WorldWeaponInfoMap.insert(std::make_pair(dwZoneChannel, tempInfo)).second; } // -------------------------------------------------------------------- // if (bEnableCreateWorldWeapon) { lpCamp = CreateWorldWeaponDB(CampInfo); if ( lpCamp ) { // CID ¼ÂÆÃ if (dwCID) { lpCamp->SetCID(dwCID); } else { lpCamp->SetCID(Creature::SIEGE_OBJECT_BIT | GetBlankIndex()); } // ¸®½ºÆ®¿¡ Ãß°¡ if ( !m_SiegeObjectMap.insert(std::make_pair(lpCamp->GetCID(), lpCamp)).second ) { DeleteSiegeObject(lpCamp); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpCamp->GetCampID(), reinterpret_cast(lpCamp))).second ) { DeleteSiegeObject(lpCamp); return NULL; } return lpCamp; } } else { ERRLOG0(g_Log, "ÀÌ¹Ì »ý¼ºµÈ ¿ùµå ¿þÆùÀÌ 2°³ ÀÌ»óÀÔ´Ï´Ù."); } } return NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateCamp(unsigned long dwGID, unsigned char cZone, unsigned char cChannel, POS Pos) { unsigned long dwCampID = 0; unsigned short wError = 0; if (0 == m_lpDBComponent || false == DBComponent::CastleDB::InsertCampInfo(*m_lpDBComponent, dwGID, Siege::CAMP, cZone, cChannel, Pos, &dwCampID, &wError)) { SERLOG0(g_Log, "±æµå ¿ä»õ °´Ã¼¸¦ DB ¿¡¼­ »ý¼ºÇϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù."); return NULL; } if (0 == dwCampID) { return NULL; } dwCampID = (Castle::CAMP_BIT | dwCampID); CSiegeObjectDB* lpCamp = CreateCampDB(dwCampID, dwGID, cZone, cChannel, Pos); if (lpCamp) { lpCamp->SetCID(Creature::SIEGE_OBJECT_BIT | GetBlankIndex()); if ( !m_SiegeObjectMap.insert(std::make_pair(lpCamp->GetCID(), lpCamp)).second ) { DeleteSiegeObject(lpCamp->GetCID()); ERRLOG1(g_Log, "±æµå ¿ä»õ Ãß°¡ ½ÇÆÐ : CampID : 0x%10u", lpCamp->GetCampID()); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpCamp->GetCampID(), reinterpret_cast(lpCamp))).second ) { DeleteSiegeObject(lpCamp->GetCID()); ERRLOG1(g_Log, "±æµå ¿ä»õ Ãß°¡ ½ÇÆÐ : CampID : 0x%10u", lpCamp->GetCampID()); return NULL; } } return lpCamp; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateWorldWeapon(unsigned long dwGID, unsigned short wObjectType, unsigned char cZone, unsigned char cChannel, POS Pos) { unsigned long dwCampID = 0; unsigned short wError = 0; if (0 == m_lpDBComponent || false == DBComponent::CastleDB::InsertCampInfo(*m_lpDBComponent, dwGID, wObjectType, cZone, cChannel, Pos, &dwCampID, &wError)) { SERLOG0(g_Log, "¿ùµå ¿þÆù °´Ã¼¸¦ DB ¿¡¼­ »ý¼ºÇϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù."); return NULL; } if (0 == dwCampID) { return NULL; } dwCampID = (Castle::CAMP_BIT | dwCampID); CSiegeObjectDB* lpCamp = CreateWorldWeaponDB(dwCampID, dwGID, wObjectType, cZone, cChannel, Pos); if (lpCamp) { lpCamp->SetCID(Creature::SIEGE_OBJECT_BIT | GetBlankIndex()); if ( !m_SiegeObjectMap.insert(std::make_pair(lpCamp->GetCID(), lpCamp)).second ) { DeleteSiegeObject(lpCamp->GetCID()); ERRLOG1(g_Log, "Ä·ÇÁ Ãß°¡ ½ÇÆÐ : CampID : 0x%08x", lpCamp->GetCampID()); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpCamp->GetCampID(), reinterpret_cast(lpCamp))).second ) { DeleteSiegeObject(lpCamp->GetCID()); ERRLOG1(g_Log, "Ä·ÇÁ Ãß°¡ ½ÇÆÐ : CampID : 0x%08x", lpCamp->GetCampID()); return NULL; } unsigned char cNation = Creature::STATELESS; switch (wObjectType) { case Siege::KARTERANT_WEAPON: cNation = Creature::KARTERANT; break; case Siege::MERKADIA_WEAPON: cNation = Creature::MERKADIA; break; } // -------------------------------------------------------------------- // // µÎ°³ÀÇ ¿ùµå ¿þÆùÀÌ »ý¼ºµÇ¾ú´ÂÁö üũ ¹× ¿ùµå ¿þÆù ¼ÒÀ¯ ±¹°¡ Á¤º¸ ¼³Á¤ bool bEnableCreateWorldWeapon = true; unsigned long dwZoneChannel = static_cast(cZone << 16 | cChannel); WorldWeaponInfoMap::iterator itr = m_WorldWeaponInfoMap.find(dwZoneChannel); if (itr != m_WorldWeaponInfoMap.end()) { WorldWeaponInfo& WeaponInfo = itr->second; if (Creature::STATELESS != WeaponInfo.m_cWorldWeaponNation) { bEnableCreateWorldWeapon = false; } else { switch (cNation) { case Creature::KARTERANT: { if (WeaponInfo.m_cKarRemainSiegeTime > 0) { bEnableCreateWorldWeapon = false; } } break; case Creature::MERKADIA: { if (WeaponInfo.m_cMerRemainSiegeTime > 0) { bEnableCreateWorldWeapon = false; } } break; } } if (bEnableCreateWorldWeapon) { WeaponInfo.m_cWorldWeaponNation = cNation; } } else { WorldWeaponInfo tempInfo; tempInfo.m_cWorldWeaponNation = cNation; tempInfo.m_cKarRemainSiegeTime = 0; tempInfo.m_cMerRemainSiegeTime = 0; m_WorldWeaponInfoMap.insert(std::make_pair(dwZoneChannel, tempInfo)).second; } // -------------------------------------------------------------------- // if (false == bEnableCreateWorldWeapon) { ERRLOG0(g_Log, "ÀÌ¹Ì »ý¼ºµÈ ¿ùµå ¿þÆùÀÌ Á¸ÀçÇÕ´Ï´Ù."); } } return lpCamp; } CSiegeObjectDB* CSiegeObjectDBMgr::CreateSiegeArms(unsigned long dwOwnerID, unsigned char cNation, unsigned char cZone, unsigned char cChannel, unsigned short wObjectType, unsigned char cUpgradeStep, POS Pos) { CSiegeObjectDB* lpSiegeArms = 0; if (NULL != m_lpDBComponent) { lpSiegeArms = CreateSiegeArmsDB(dwOwnerID, cNation, wObjectType, cUpgradeStep, cZone, cChannel, Pos); if (lpSiegeArms) { lpSiegeArms->SetCID(Creature::SIEGE_OBJECT_BIT | GetBlankIndex()); if ( !m_SiegeObjectMap.insert(std::make_pair(lpSiegeArms->GetCID(), lpSiegeArms)).second ) { DeleteSiegeObject(lpSiegeArms->GetCID()); return NULL; } } } return lpSiegeArms; } CCampDB* CSiegeObjectDBMgr::GetCamp(unsigned long dwCampID) { CampMap::iterator itr = m_CampMap.find(dwCampID); if (itr != m_CampMap.end()) { return itr->second; } return NULL; } CSiegeObjectDB* CSiegeObjectDBMgr::GetSiegeObject(unsigned long dwObjectID) { SiegeObjectMap::iterator itr = m_SiegeObjectMap.find(dwObjectID); if (itr != m_SiegeObjectMap.end()) { return itr->second; } return NULL; } CSiegeObjectDBMgr::CampMap::iterator CSiegeObjectDBMgr::DeleteCamp(unsigned long dwCampID) { CampMap::iterator itr = m_CampMap.find(dwCampID); if (itr != m_CampMap.end()) { CCampDB* lpCamp = itr->second; if (lpCamp) { // ±æµåÀü ½Ã°£¿¡ ¸ðµç ±æµå ¿ä»õ°¡ ºÎ¼ÅÁö´Â °æ¿ì¿¡´Â °æ°è Àû´ë °ü°è¸¦ ÇØÁö ½ÃŲ´Ù. if (CGameTimeDBMgr::GetInstance().IsGuildWarTime() && !HasCampByGID(lpCamp->GetGID(), lpCamp->GetCampID())) { Guild::CGuildDBMgr::GetInstance().CancelAlertHostility(lpCamp->GetGID()); } SiegeObjectMap::iterator pos = m_SiegeObjectMap.find( lpCamp->GetCID() ); if (pos != m_SiegeObjectMap.end()) { m_SiegeObjectMap.erase(pos); } // DB ¿¡¼­ »èÁ¦ if (NULL != m_lpDBComponent) { DBComponent::CastleDB::DeleteCampInfo(*m_lpDBComponent, dwCampID, lpCamp->GetObjectType()); } DeleteSiegeObjectDB(lpCamp); lpCamp = NULL; } return m_CampMap.erase(itr); } return m_CampMap.end(); } bool CSiegeObjectDBMgr::DeleteSiegeObject(unsigned long dwCID) { SiegeObjectMap::iterator itr = m_SiegeObjectMap.find(dwCID); SiegeObjectMap::iterator end = m_SiegeObjectMap.end(); if (itr != end) { CSiegeObjectDB* lpObject = itr->second; if (lpObject) { if (lpObject->IsCamp()) { // return ( m_CampMap.end() != DeleteCamp(lpObject->GetCampID()) ); DeleteCamp(lpObject->GetCampID()); return true; } DeleteSiegeObjectDB(lpObject); lpObject = NULL; } m_SiegeObjectMap.erase(itr); } return true; } bool CSiegeObjectDBMgr::DeleteSiegeObject(CSiegeObjectDB* lpObject) { if (lpObject == NULL) return false; return DeleteSiegeObject(lpObject->GetCID()); } bool CSiegeObjectDBMgr::HasCampByGID(unsigned long dwGID, unsigned long dwExceptCampID) { CampMap::iterator itr = m_CampMap.begin(); CampMap::iterator end = m_CampMap.end(); CCampDB* lpCamp = NULL; while (itr != end) { lpCamp = itr->second; if (0 != lpCamp && lpCamp->GetCampID() != dwExceptCampID && lpCamp->GetGID() == dwGID) { return true; } ++itr; } return false; } bool CSiegeObjectDBMgr::ReadCampInfoDB() { const int MAX_ROWS = 10240; int nGetRows = 0; char szBuffer[CDBComponent::QUERY_BUFFER_LEN]; _snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1, "SELECT TblCampInfo.nCampID, " "TblCampInfo.nGuildID, " "TblCampInfo.nHP, " "TblCampInfo.tnZone, " "TblCampInfo.tnChannel, " "TblCampInfo.snObjectType, " "TblCampInfo.tnState, " "TblCampInfo.tnSubState, " "TblCampInfo.tnUpgradeStep, " "TblCampInfo.RemainTime, " "TblCampInfo.LastUseTime, " "TblCampInfo.bRight, " "TblCampInfo.fPosX, " "TblCampInfo.fPosY, " "TblCampInfo.fPosZ, " "TblCampInfo.tnMaterial, " "TblCampInfo.tnSiegeCount " "FROM TblGuildInfo, TblCampInfo " "WHERE TblGuildInfo.nGuildID = TblCampInfo.nGuildID AND TblGuildInfo.OldServerGroupID = %d", CServerSetup::GetInstance().GetAgentServerType()); szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0; if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer)) { ERRLOG2(g_Log, "Camp DB ¾ò¾î¿À±â ½ÇÆÐ : %s %s", m_lpDBComponent->GetErrorString(), m_lpDBComponent->GetQueryBuffer()); return false; } CampInfoDB* campInfo = new CampInfoDB[MAX_ROWS]; memset(campInfo, 0, sizeof(CampInfoDB) * MAX_ROWS); while (m_lpDBComponent->GetData((void**)campInfo, sizeof(CampInfoDB), MAX_ROWS, &nGetRows)) { if (0 == nGetRows) { break; } for (CampInfoDB* lpCampInfo = campInfo; nGetRows > 0; --nGetRows, ++lpCampInfo) { switch (lpCampInfo->m_wObjectType) { case Siege::CAMP: CreateCamp(*lpCampInfo); break; case Siege::MINING_CAMP: CreateMiningCamp(*lpCampInfo); break; case Siege::CAMP_SHOP: CreateCampShop(*lpCampInfo); break; case Siege::KARTERANT_WEAPON: CreateWorldWeapon(*lpCampInfo); break; case Siege::MERKADIA_WEAPON: CreateWorldWeapon(*lpCampInfo); break; } } memset(campInfo, 0, sizeof(CampInfoDB) * MAX_ROWS); } delete [] campInfo; // CreateDummyCamp(); return true; } bool CSiegeObjectDBMgr::ReadWorldWeaponInfoDB() { const int MAX_ROWS = 20; int nGetRows = 0; char szBuffer[CDBComponent::QUERY_BUFFER_LEN]; _snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1, "SELECT TblWorldWeaponInfo.tnZone, " "TblWorldWeaponInfo.tnChannel, " "TblWorldWeaponInfo.tnKarRemainSiegeTime, " "TblWorldWeaponInfo.tnMerRemainSiegeTime " "FROM TblWorldWeaponInfo "); szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0; if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer)) { ERRLOG0(g_Log, "WorldWeaponInfo DB ¾ò¾î¿À±â ½ÇÆÐ"); return false; } WorldWeaponInfoDB* weaponInfo = new WorldWeaponInfoDB[MAX_ROWS]; memset(weaponInfo, 0, sizeof(WorldWeaponInfoDB) * MAX_ROWS); while (m_lpDBComponent->GetData((void**)weaponInfo, sizeof(WorldWeaponInfoDB), MAX_ROWS, &nGetRows)) { if (0 == nGetRows) { break; } for (WorldWeaponInfoDB* lpWeaponInfo = weaponInfo; nGetRows > 0; --nGetRows, ++lpWeaponInfo) { if (NULL != lpWeaponInfo) { unsigned long dwZoneChannel = static_cast(lpWeaponInfo->m_cZone << 16 | lpWeaponInfo->m_cChannel); WorldWeaponInfoMap::iterator itr = m_WorldWeaponInfoMap.find(dwZoneChannel); if (itr == m_WorldWeaponInfoMap.end()) { WorldWeaponInfo tempInfo; tempInfo.m_cWorldWeaponNation = Creature::STATELESS; tempInfo.m_cKarRemainSiegeTime = lpWeaponInfo->m_cKarRemainSiegeTime; tempInfo.m_cMerRemainSiegeTime = lpWeaponInfo->m_cMerRemainSiegeTime; m_WorldWeaponInfoMap.insert(std::make_pair(dwZoneChannel, tempInfo)).second; } else { ERRLOG2(g_Log, "¿ùµå ¿þÆù Á¤º¸°¡ °°Àº Á¸¿¡ 2°³ ÀÌ»ó Á¸ÀçÇÕ´Ï´Ù. Zone : %d, Channel : %d", lpWeaponInfo->m_cZone, lpWeaponInfo->m_cChannel); } } } memset(weaponInfo, 0, sizeof(WorldWeaponInfoDB) * MAX_ROWS); } delete [] weaponInfo; return true; } bool CSiegeObjectDBMgr::ReadCastleObjectInfoDB() { const int MAX_ROWS = 10240; int nGetRows = 0; Castle::CCastleDB* lpCastle = NULL; char szBuffer[CDBComponent::QUERY_BUFFER_LEN]; _snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1, "SELECT " "TblCastleCreatureInfo.nCreatureID, " "TblCastleCreatureInfo.nCastleID, " "TblCastleCreatureInfo.nOwnerID, " "TblCastleCreatureInfo.nHP, " "TblCastleCreatureInfo.snObjectType, " "TblCastleCreatureInfo.fDirection, " "TblCastleCreatureInfo.tnState, " "TblCastleCreatureInfo.tnSubState, " "TblCastleCreatureInfo.tnUpgradeStep, " "TblCastleCreatureInfo.tnUpgradeType, " "TblCastleCreatureInfo.RemainTime, " "TblCastleCreatureInfo.LastUseTime, " "TblCastleCreatureInfo.fPosX, " "TblCastleCreatureInfo.fPosY, " "TblCastleCreatureInfo.fPosZ " "FROM TblCastleInfo, TblCastleCreatureInfo WHERE " "TblCastleInfo.nCastleID = TblCastleCreatureInfo.nCastleID"); szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0; if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer)) { ERRLOG0(g_Log, "¼º ¿ÀºêÁ§Æ® DB ¾ò¾î¿À±â ½ÇÆÐ"); return false; } CastleObjectInfoDB* castleObjectInfo = new CastleObjectInfoDB[MAX_ROWS]; memset(castleObjectInfo, 0, sizeof(CastleObjectInfoDB) * MAX_ROWS); while (m_lpDBComponent->GetData((void**)castleObjectInfo, sizeof(CastleObjectInfoDB), MAX_ROWS, &nGetRows)) { if (0 == nGetRows) { break; } for (CastleObjectInfoDB* lpCastleObjectInfo = castleObjectInfo; nGetRows > 0; --nGetRows, ++lpCastleObjectInfo) { lpCastleObjectInfo->m_dwCastleID = (Castle::CASTLE_BIT | lpCastleObjectInfo->m_dwCastleID); if (NULL == lpCastle || lpCastle->GetCastleID() != lpCastleObjectInfo->m_dwCastleID) { lpCastle = Castle::CCastleDBMgr::GetInstance().GetCastle(lpCastleObjectInfo->m_dwCastleID); if (NULL == lpCastle) { ERRLOG2(g_Log, "CID:0x%08x Á¸ÀçÇÏÁö¾Ê´Â ¼º¿¡ ¼ÓÇÑ ¿ÀºêÁ§Æ®ÀÔ´Ï´Ù. CastleID:0x%08x", lpCastleObjectInfo->m_dwCID, lpCastleObjectInfo->m_dwCastleID); continue; } } CSiegeObjectDB* lpCastleObject = CreateCastleObject(*lpCastleObjectInfo); lpCastle->InsertCastleObject(lpCastleObject); } memset(castleObjectInfo, 0, sizeof(CastleObjectInfoDB) * MAX_ROWS); } delete [] castleObjectInfo; return true; } void CSiegeObjectDBMgr::CreateDummyCamp() { const unsigned long DUMMY_OBJECT_BIT = 0x00010000; const unsigned long MAX_DUMMY_CAMP = 200; const float BASE_POS_X = 2500.0f; const float BASE_POS_Z = 2500.0f; CampInfoDB camp; for (unsigned long nCount = 0; nCount < MAX_DUMMY_CAMP; ++nCount) { camp.m_dwCampID = Castle::CAMP_BIT + DUMMY_OBJECT_BIT + nCount; camp.m_dwGID = 1; camp.m_dwHP = 300; camp.m_cZone = 12; camp.m_cChannel = 0; camp.m_cState = Siege::COMPLETE; camp.m_cUpgradeStep = 0; // camp.m_TimeValue // camp.m_LastUseTime // camp.m_szRight[CampRight::MAX_RIGHT_NUM] camp.m_Pos.fPointX = static_cast(BASE_POS_X + cosf(static_cast(nCount)) * (rand() % 100)); camp.m_Pos.fPointY = 0.0f; camp.m_Pos.fPointZ = static_cast(BASE_POS_Z + sinf(static_cast(nCount)) * (rand() % 100)); CreateCamp(camp); } } unsigned long CSiegeObjectDBMgr::GetBlankIndex() { static unsigned long globalIndex = Siege::VIRTUAL_CID_START_NUM; return globalIndex++; /* if (0 == m_SiegeObjectMap.size()) return 1; SiegeObjectMap::reverse_iterator LastItr = m_SiegeObjectMap.rbegin(); unsigned long dwLastIndex = LastItr->first; return (dwLastIndex & ~Creature::SIEGE_OBJECT_BIT) + 1; */ } int CSiegeObjectDBMgr::DestroyCamp(unsigned long dwGID) { int nDestroyCount = 0; if (0 == dwGID || 0 == m_CampMap.size()) return 0; CampMap::iterator itr = m_CampMap.begin(); while (itr != m_CampMap.end()) { CCampDB* lpCamp = itr->second; if (NULL == lpCamp) { ERRLOG0(g_Log, "NULL ÁøÁö°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù."); ++itr; continue; } if (lpCamp->GetGID() != dwGID) { ++itr; continue; } lpCamp->Destroy(); SERVER_ID serverID; serverID.sID.Type = CServerSetup::GameServer; serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup(); serverID.sID.Channel = lpCamp->GetChannel(); serverID.sID.ID = lpCamp->GetZone(); GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID, DBAgent::CGameDispatch, DBAgent::CGameDispatch::GetDispatchTable()); if (0 != lpGameDispatch) { CSendStream& SendStream = lpGameDispatch->GetSendStream(); char* lpBuffer = SendStream.GetBuffer(sizeof(PktCampCmd)); if (0 != lpBuffer) { PktCampCmd* lpPktCampCmd = reinterpret_cast(lpBuffer); lpPktCampCmd->m_dwCID = lpCamp->GetCID(); lpPktCampCmd->m_dwCampID = lpCamp->GetCampID(); lpPktCampCmd->m_cState = lpCamp->GetState(); lpPktCampCmd->m_dwValue1 = 0; lpPktCampCmd->m_dwValue2 = 0; lpPktCampCmd->m_cSubCmd = PktCampCmd::CAMP_DESTROY; SendStream.WrapHeader(sizeof(PktCampCmd), CmdCampCmd, 0, 0); } } itr = DeleteCamp(lpCamp->GetCampID()); ++nDestroyCount; } return nDestroyCount; } // ±æµå Å»Åð½Ã ÇØ´ç ij¸¯ÅÍÀÇ °ø¼ºº´±â¸¦ ¾ÆÀÌÅÛÀ¸·Î µ¹·ÁÁÖ±â void CSiegeObjectDBMgr::DestroySiegeArms(unsigned long dwOnwerCID) { if (0 == m_SiegeObjectMap.size()) return; std::list DeleteList; SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObjectDB* lpSiegeObject = itr->second; if (lpSiegeObject) { if (lpSiegeObject->IsSiegeArms() && lpSiegeObject->GetOwnerID() == dwOnwerCID) { lpSiegeObject->ToStartKit(); lpSiegeObject->SendSiegeArmsCmd(0, PktSiegeArmsCmd::SIEGE_TO_STARTKIT_COMPLETE); lpSiegeObject->Destroy(); DeleteList.push_back(lpSiegeObject->GetCID()); } } ++itr; } // °´Ã¼ »èÁ¦ std::list::iterator DeleteItr = DeleteList.begin(); while (DeleteItr != DeleteList.end()) { DeleteSiegeObject(*DeleteItr); ++DeleteItr; } } // °ø¼º ½Ã°£ÀÌ ³¡³µÀ»¶§ ¾ÆÀÌÅÛÀ¸·Î µ¹·ÁÁÖ±â void CSiegeObjectDBMgr::DestoryAllSiegeArms() { if (0 == m_SiegeObjectMap.size()) return; std::list DeleteList; SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObjectDB* lpSiegeObject = itr->second; if (lpSiegeObject) { if (lpSiegeObject->IsSiegeArms()) { lpSiegeObject->ToStartKit(); lpSiegeObject->SendSiegeArmsCmd(0, PktSiegeArmsCmd::SIEGE_TO_STARTKIT_COMPLETE); lpSiegeObject->Destroy(); DeleteList.push_back(lpSiegeObject->GetCID()); } } ++itr; } // °´Ã¼ »èÁ¦ std::list::iterator DeleteItr = DeleteList.begin(); while (DeleteItr != DeleteList.end()) { DeleteSiegeObject(*DeleteItr); ++DeleteItr; } } bool CSiegeObjectDBMgr::ChangeCampType(unsigned long dwCampID, unsigned short wChangeType) { CampMap::iterator itr = m_CampMap.find(dwCampID); if ( itr == m_CampMap.end() ) return false; CCampDB* lpCamp = itr->second; if ( lpCamp ) { CampInfoDB campInfoDB; unsigned long dwCID = lpCamp->GetCID(); campInfoDB.m_dwCampID = lpCamp->GetCampID(); campInfoDB.m_dwGID = lpCamp->GetGID(); campInfoDB.m_dwHP = lpCamp->GetNowHP(); campInfoDB.m_cZone = lpCamp->GetZone(); campInfoDB.m_cChannel = lpCamp->GetChannel(); campInfoDB.m_wObjectType = lpCamp->GetChangeType(); campInfoDB.m_cState = lpCamp->GetState(); campInfoDB.m_cSubState = lpCamp->GetSubState(); campInfoDB.m_cUpgradeStep = lpCamp->GetUpgradeStep(); campInfoDB.m_TimeValue = lpCamp->GetTimeValue(); campInfoDB.m_LastUseTime = lpCamp->GetLastUseTime(); memcpy(campInfoDB.m_szRight, lpCamp->GetRight().m_aryCampRight, CampRight::MAX_RIGHT_NUM); campInfoDB.m_Pos.fPointX = lpCamp->GetPosition().m_fPointX; campInfoDB.m_Pos.fPointY = lpCamp->GetPosition().m_fPointY; campInfoDB.m_Pos.fPointZ = lpCamp->GetPosition().m_fPointZ; campInfoDB.m_cMaterial = lpCamp->GetMaterialNum(); campInfoDB.m_cSiegeCount = 0; // ÀÌÀü °´Ã¼ »èÁ¦ ( DB ¿¡¼­ »èÁ¦ÇÏÁö´Â ¾Ê´Â´Ù. ) SiegeObjectMap::iterator pos = m_SiegeObjectMap.find( lpCamp->GetCID() ); if (pos != m_SiegeObjectMap.end()) { m_SiegeObjectMap.erase(pos); } m_CampMap.erase(itr); DeleteSiegeObjectDB(lpCamp); // »õ·Î¿î °´Ã¼·Î ÇÒ´ç CSiegeObjectDB* lpSiegeObject = NULL; switch (campInfoDB.m_wObjectType) { case Siege::CAMP : lpSiegeObject = CreateCamp(campInfoDB, dwCID); break; case Siege::CAMP_SHOP : lpSiegeObject = CreateCampShop(campInfoDB, dwCID); break; case Siege::MINING_CAMP : lpSiegeObject = CreateMiningCamp(campInfoDB, dwCID); break; } if ( lpSiegeObject ) { return true; } } return false; } void CSiegeObjectDBMgr::SendWorldWeaponInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel) { char szBuffer[2048]; unsigned long dwZoneChannel = static_cast(cZone << 16 | cChannel); WorldWeaponInfoMap::const_iterator itr = m_WorldWeaponInfoMap.find(dwZoneChannel); if (itr != m_WorldWeaponInfoMap.end()) { const WorldWeaponInfo& WeaponInfo = itr->second; PktWorldWeaponInfo* lpPktWeaponInfo = reinterpret_cast(szBuffer); lpPktWeaponInfo->m_cKarRemainSiegeTime = WeaponInfo.m_cKarRemainSiegeTime; lpPktWeaponInfo->m_cMerRemainSiegeTime = WeaponInfo.m_cMerRemainSiegeTime; SendStream.WrapCompress(szBuffer, sizeof(PktWorldWeaponInfo), CmdWorldWeaponInfo, 0, 0); } } void CSiegeObjectDBMgr::SendCampInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel) { char szBuffer[2048]; unsigned short usBufferSize = 0; unsigned long dwCID = 0; bool bFirst = true; for (CampMap::iterator itr = m_CampMap.begin(); itr != m_CampMap.end(); ++itr) { CCampDB* lpCamp = itr->second; if ( !lpCamp ) { ERRLOG0(g_Log, "NULL Camp°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù."); return; } if (lpCamp->GetZone() != cZone || lpCamp->GetChannel() != cChannel) { continue; } if (lpCamp->SerializeOut(szBuffer + sizeof(PktCampInfo), usBufferSize, dwCID)) { PktCampInfo* lpPktCampInfo = reinterpret_cast(szBuffer); lpPktCampInfo->m_bStartFlag = bFirst; lpPktCampInfo->m_dwCID = dwCID; lpPktCampInfo->m_wSize = usBufferSize; SendStream.WrapCompress(szBuffer, static_cast(sizeof(PktCampInfo) + usBufferSize), CmdCampInfo, 0, 0); } bFirst = false; } } void CSiegeObjectDBMgr::SendSiegeArmsInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel) { if (0 == m_SiegeObjectMap.size()) { return; } for (SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); itr != m_SiegeObjectMap.end(); ++itr) { CSiegeObjectDB* lpSiegeObject = itr->second; if (NULL == lpSiegeObject) { //ERRLOG0(g_Log, "NULL ±æµå°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù."); return; } if (lpSiegeObject->GetZone() != cZone || lpSiegeObject->GetChannel() != cChannel) { continue; } if ( lpSiegeObject->IsSiegeArms() ) { char* lpBuffer = SendStream.GetBuffer(sizeof(PktCreateSiegeArms)); if (0 != lpBuffer) { PktCreateSiegeArms* lpPktCreateSiegeArmsInfo = reinterpret_cast(lpBuffer); lpPktCreateSiegeArmsInfo->m_dwCID = lpSiegeObject->m_dwCID; lpPktCreateSiegeArmsInfo->m_dwOwnerID = lpSiegeObject->m_dwOwnerID; lpPktCreateSiegeArmsInfo->m_wObjectType = lpSiegeObject->m_wObjectType; lpPktCreateSiegeArmsInfo->m_cNation = lpSiegeObject->m_cNation; lpPktCreateSiegeArmsInfo->m_dwHP = lpSiegeObject->m_dwHP; lpPktCreateSiegeArmsInfo->m_cZone = lpSiegeObject->m_cZone; lpPktCreateSiegeArmsInfo->m_cChannel = lpSiegeObject->m_cChannel; lpPktCreateSiegeArmsInfo->m_cState = lpSiegeObject->m_cState; lpPktCreateSiegeArmsInfo->m_cUpgradeStep = lpSiegeObject->m_cUpgradeStep; lpPktCreateSiegeArmsInfo->m_Pos.fPointX = lpSiegeObject->m_Pos.m_fPointX; lpPktCreateSiegeArmsInfo->m_Pos.fPointY = lpSiegeObject->m_Pos.m_fPointY; lpPktCreateSiegeArmsInfo->m_Pos.fPointZ = lpSiegeObject->m_Pos.m_fPointZ; SendStream.WrapHeader(sizeof(PktCreateSiegeArms), CmdCreateSiegeArms, 0, 0); } } } } void CSiegeObjectDBMgr::SendProcessMining(unsigned long dwProcessType) { const unsigned short MAX_BUFFER_SIZE = sizeof(PktProcessMining); char szBuffer[MAX_BUFFER_SIZE]; PktProcessMining* lpPktPM = reinterpret_cast(szBuffer); lpPktPM->m_dwProcessType = dwProcessType; if (PacketWrap::WrapHeader(reinterpret_cast(szBuffer), sizeof(PktProcessMining), CmdProcessMining, 0, 0)) { DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer( reinterpret_cast(&szBuffer), sizeof(PktProcessMining), CmdProcessMining)); } } bool CSiegeObjectDBMgr::SerializeOutCastleObject(CSiegeObjectDB* lpObject_In, char* lpBuffer_Out, unsigned short& wBufferSize_Out) { wBufferSize_Out = 0; if (lpObject_In->IsCamp() || lpObject_In->IsSiegeArms()) return false; else { CastleObjectInfo* lpCastleObjectInfo = reinterpret_cast(lpBuffer_Out); lpCastleObjectInfo->m_dwCID = lpObject_In->m_dwCID; lpCastleObjectInfo->m_dwCastleID = lpObject_In->GetCastleID(); lpCastleObjectInfo->m_dwOwnerID = lpObject_In->m_dwOwnerID; lpCastleObjectInfo->m_cNation = lpObject_In->m_cNation; lpCastleObjectInfo->m_wObjectType = lpObject_In->m_wObjectType; lpCastleObjectInfo->m_fDefaultDir = lpObject_In->m_fDefaultDir; lpCastleObjectInfo->m_cState = lpObject_In->m_cState; lpCastleObjectInfo->m_cSubState = lpObject_In->m_cSubState; lpCastleObjectInfo->m_dwHP = lpObject_In->m_dwHP; lpCastleObjectInfo->m_Pos.fPointX = lpObject_In->m_Pos.m_fPointX; lpCastleObjectInfo->m_Pos.fPointY = lpObject_In->m_Pos.m_fPointY; lpCastleObjectInfo->m_Pos.fPointZ = lpObject_In->m_Pos.m_fPointZ; lpCastleObjectInfo->m_cUpgradeStep = lpObject_In->m_cUpgradeStep; lpCastleObjectInfo->m_cUpgradeType = lpObject_In->m_cUpgradeType; wBufferSize_Out = sizeof(CastleObjectInfo); } return true; } unsigned char CSiegeObjectDBMgr::GetWorldWeaponNation(unsigned char cZone, unsigned char cChannel) const { unsigned long dwZoneChannel = static_cast(cZone << 16 | cChannel); WorldWeaponInfoMap::const_iterator itr = m_WorldWeaponInfoMap.find(dwZoneChannel); if (itr != m_WorldWeaponInfoMap.end()) { const WorldWeaponInfo& WeaponInfo = itr->second; return WeaponInfo.m_cWorldWeaponNation; } return Creature::STATELESS; } void CSiegeObjectDBMgr::DeleteWorldWeaponNation(unsigned char cZone, unsigned char cChannel) { unsigned long dwZoneChannel = static_cast(cZone << 16 | cChannel); WorldWeaponInfoMap::iterator itr = m_WorldWeaponInfoMap.find(dwZoneChannel); if (itr != m_WorldWeaponInfoMap.end()) { WorldWeaponInfo& WeaponInfo = itr->second; WeaponInfo.m_cWorldWeaponNation = Creature::STATELESS; } } void CSiegeObjectDBMgr::UpdateWorldWeaponInfo(unsigned char cZone, unsigned char cChannel, unsigned char cOwenrNation, unsigned char cDestroyedWeaponNation, unsigned char cRemainSiegeTime) { unsigned long dwZoneChannel = static_cast(cZone << 16 | cChannel); WorldWeaponInfoMap::iterator itr = m_WorldWeaponInfoMap.find(dwZoneChannel); if (itr != m_WorldWeaponInfoMap.end()) { WorldWeaponInfo& WeaponInfo = itr->second; WeaponInfo.m_cWorldWeaponNation = cOwenrNation; switch (cDestroyedWeaponNation) { case Creature::KARTERANT: { WeaponInfo.m_cKarRemainSiegeTime = cRemainSiegeTime; } break; case Creature::MERKADIA: { WeaponInfo.m_cMerRemainSiegeTime = cRemainSiegeTime; } break; } } else { WorldWeaponInfo tempInfo; tempInfo.m_cWorldWeaponNation = cOwenrNation; switch (cDestroyedWeaponNation) { case Creature::KARTERANT: { tempInfo.m_cKarRemainSiegeTime = cRemainSiegeTime; tempInfo.m_cMerRemainSiegeTime = 0; } break; case Creature::MERKADIA: { tempInfo.m_cKarRemainSiegeTime = 0; tempInfo.m_cMerRemainSiegeTime = cRemainSiegeTime; } break; } m_WorldWeaponInfoMap.insert(std::make_pair(dwZoneChannel, tempInfo)).second; } }