#include "stdafx.h" #include "SiegeObjectMgr.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include CSiegeObjectMgr& CSiegeObjectMgr::GetInstance() { static CSiegeObjectMgr ms_this; return ms_this; } CSiegeObjectMgr::CSiegeObjectMgr() : m_lpWorldWeapon(NULL), m_cKarRemainSiegeTime(0), m_cMerRemainSiegeTime(0), m_bRequestWorldWeaponCreation(false) { } CSiegeObjectMgr::~CSiegeObjectMgr() { Destroy(); } void CSiegeObjectMgr::Destroy() { DestroyAllCamp(); if (0 == m_SiegeObjectMap.size()) return; SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); SiegeObjectMap::iterator end = m_SiegeObjectMap.end(); CSiegeObject* lpSiegeObject = NULL; while (itr != end) { lpSiegeObject = itr->second; if (lpSiegeObject) { // °´Ã¼ »èÁ¦ delete lpSiegeObject; lpSiegeObject = NULL; } ++itr; } m_SiegeObjectMap.clear(); } void CSiegeObjectMgr::DestroyAllCamp() { if (0 == m_CampMap.size()) return; CampMap::iterator itr = m_CampMap.begin(); CampMap::iterator end = m_CampMap.end(); CCamp* lpCamp = NULL; while (itr != end) { lpCamp = itr->second; if (lpCamp) { // CreatureManager ¿¡¼­ »èÁ¦ CCreatureManager::GetInstance().DeleteCreature(lpCamp->GetCID()); // SiegeObjectMap ¿¡¼­ »èÁ¦ SiegeObjectMap::iterator pos = m_SiegeObjectMap.find(lpCamp->GetCID()); if (pos != m_SiegeObjectMap.end()) { m_SiegeObjectMap.erase(pos); } // °´Ã¼ »èÁ¦ delete lpCamp; lpCamp = NULL; } ++itr; } m_CampMap.clear(); } CSiegeObject* CSiegeObjectMgr::CreateCastleObject(CastleObjectInfo& CastleObject) { int nKID = Siege::GetKID(CastleObject.m_wObjectType, CastleObject.m_cState, CastleObject.m_cUpgradeType, CastleObject.m_cUpgradeStep); CMonster::MonsterCreateInfo MonsterCreate; MonsterCreate.m_dwCID = CastleObject.m_dwCID; MonsterCreate.m_dwPID = 0x00000000; MonsterCreate.m_nKID = nKID; MonsterCreate.m_nMovingPattern = CMonster::FIXED; MonsterCreate.m_wRespawnArea = 0; MonsterCreate.m_bScout = false; MonsterCreate.m_Pos = CastleObject.m_Pos; // ŸÀÔ¿¡ ¸Â´Â °´Ã¼¸¦ »ý¼ºÇÑ´Ù. CSiegeObject* lpCastleObject = NULL; switch (CastleObject.m_wObjectType) { case Siege::EMBLEM : lpCastleObject = new CCastleEmblem(MonsterCreate, CastleObject); break; case Siege::GATE : lpCastleObject = new CCastleGate(MonsterCreate, CastleObject); break; case Siege::CASTLE_ARMS_NPC : case Siege::SHORT_RANGE_CASTLE_ARMS : case Siege::LONG_RANGE_CASTLE_ARMS : lpCastleObject = new CCastleArms(MonsterCreate, CastleObject); break; case Siege::GUARD : lpCastleObject = new CCastleGuard(MonsterCreate, CastleObject); break; default : lpCastleObject = new CSiegeObject(MonsterCreate, CastleObject); break; } if (lpCastleObject) { if ( !m_SiegeObjectMap.insert(std::make_pair(lpCastleObject->GetCID(), lpCastleObject)).second ) { DeleteSiegeObject(lpCastleObject->GetCID()); return NULL; } // CreatureManager ¿¡ µî·Ï CCreatureManager::GetInstance().AddCreature(lpCastleObject); return lpCastleObject; } return NULL; } CSiegeObject* CSiegeObjectMgr::CreateCamp(unsigned long dwCID, unsigned long dwCampID, unsigned long dwGID, unsigned long dwHP, unsigned char cState, unsigned char cUpgradeStep, const CampRight& campRight, Position Pos, unsigned char cMaterial, bool bFullHP) { int nKID = Siege::GetKID(Siege::CAMP, cState, 0, cUpgradeStep); CMonster::MonsterCreateInfo MonsterCreate; MonsterCreate.m_dwCID = dwCID; MonsterCreate.m_dwPID = 0x00000000; MonsterCreate.m_nKID = nKID; MonsterCreate.m_nMovingPattern = CMonster::FIXED; MonsterCreate.m_wRespawnArea = 0; MonsterCreate.m_bScout = false; MonsterCreate.m_Pos = Pos; CSiegeObject* lpCamp = new CCamp(MonsterCreate, dwCampID, dwGID, dwHP, Siege::CAMP, cState, 0, cUpgradeStep, cMaterial, 0, campRight, bFullHP); if (lpCamp) { if ( !m_SiegeObjectMap.insert(std::make_pair(lpCamp->GetCID(), lpCamp)).second ) { DeleteSiegeObject(lpCamp->GetCID()); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpCamp->GetCampID(), reinterpret_cast(lpCamp))).second ) { // ¿¡·¯ ·Î±× } if (bFullHP) { lpCamp->SendHPUpdateToDBAgent(true); } // CreatureManager ¿¡ µî·Ï CCreatureManager::GetInstance().AddCreature(lpCamp); // ¸®½ºÆù Æ÷ÀÎÆ® Ãß°¡ (±¸ÃàÁßÀ̰ųª, ±¸Ãà Ãë¼ÒÁß¿¡´Â ¾ÈµÊ) if (Siege::DEVELOPING != cState && Siege::CANCELING != cState) { CCharRespawnMgr::GetInstance().AddCampRespawnPoint(lpCamp->GetCampID(), lpCamp->GetGID(), lpCamp->GetPosition()); } return lpCamp; } return NULL; } CSiegeObject* CSiegeObjectMgr::CreateWorldWeapon(unsigned long dwCID, unsigned long dwCampID, unsigned long dwGID, unsigned long dwHP, unsigned char cState, unsigned char cUpgradeStep, const CampRight& campRight, Position Pos, unsigned char cMaterial, bool bFullHP, unsigned short wObjectType) { int nKID = Siege::GetKID(wObjectType, cState, 0, cUpgradeStep); CMonster::MonsterCreateInfo MonsterCreate; MonsterCreate.m_dwCID = dwCID; MonsterCreate.m_dwPID = 0x00000000; MonsterCreate.m_nKID = nKID; MonsterCreate.m_nMovingPattern = CMonster::FIXED; MonsterCreate.m_wRespawnArea = 0; MonsterCreate.m_bScout = false; MonsterCreate.m_Pos = Pos; CSiegeObject* lpCamp = new CWorldWeapon(MonsterCreate, dwCampID, dwGID, dwHP, wObjectType, cState, 0, cUpgradeStep, cMaterial, 0, campRight, bFullHP); if (lpCamp) { if ( !m_SiegeObjectMap.insert(std::make_pair(lpCamp->GetCID(), lpCamp)).second ) { DeleteSiegeObject(lpCamp->GetCID()); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpCamp->GetCampID(), reinterpret_cast(lpCamp))).second ) { // ¿¡·¯ ·Î±× } if (bFullHP) { lpCamp->SendHPUpdateToDBAgent(true); } // CreatureManager ¿¡ µî·Ï CCreatureManager::GetInstance().AddCreature(lpCamp); // ¸®½ºÆù Æ÷ÀÎÆ® Ãß°¡ (±¸ÃàÁßÀ̰ųª, ±¸Ãà Ãë¼ÒÁß¿¡´Â ¾ÈµÊ) if (Siege::DEVELOPING != cState && Siege::CANCELING != cState) { CCharRespawnMgr::GetInstance().AddCampRespawnPoint(lpCamp->GetCampID(), lpCamp->GetGID(), lpCamp->GetPosition()); } unsigned char cNation = Creature::STATELESS; switch (wObjectType) { case Siege::KARTERANT_WEAPON: cNation = Creature::KARTERANT; break; case Siege::MERKADIA_WEAPON: cNation = Creature::MERKADIA; break; } // WorldWeapon ±¹°¡ ¼³Á¤ if (NULL == m_lpWorldWeapon) { m_lpWorldWeapon = reinterpret_cast(lpCamp); } else { ERRLOG2(g_Log, "¿ùµå ¿þÆùÀÌ 2°³ ÀÌ»ó Á¸ÀçÇÕ´Ï´Ù. OldNation : %d, NewNation : %d", m_lpWorldWeapon->GetNation(), cNation); } return lpCamp; } return NULL; } CSiegeObject* CSiegeObjectMgr::CreateSiegeArms(unsigned long dwCID, unsigned long dwOwnerID, unsigned char cNation, unsigned long dwHP, unsigned short wObjectType, unsigned char cState, unsigned char cUpgradeStep, Position Pos) { if (m_SiegeObjectMap.end() != m_SiegeObjectMap.find(dwCID)) { ERRLOG1(g_Log, "CID:0x%08x ÀÌ¹Ì Á¸ÀçÇÏ´Â °ø¼º º´±â¸¦ »ý¼ºÇÏ·Á ÇÕ´Ï´Ù.", dwCID); return NULL; } int nKID = Siege::GetKID(wObjectType, cState, 0, cUpgradeStep); CMonster::MonsterCreateInfo MonsterCreate; MonsterCreate.m_dwCID = dwCID; MonsterCreate.m_dwPID = 0x00000000; MonsterCreate.m_nKID = nKID; MonsterCreate.m_nMovingPattern = CMonster::NONAREA; MonsterCreate.m_wRespawnArea = 0; MonsterCreate.m_bScout = false; MonsterCreate.m_Pos = Pos; // ŸÀÔ¿¡ ¸Â´Â °´Ã¼¸¦ »ý¼ºÇÑ´Ù. CSiegeObject* lpSiegeArms = NULL; switch (wObjectType) { case Siege::SHORT_RANGE_SIEGE_ARMS : case Siege::LONG_RANGE_SIEGE_ARMS : lpSiegeArms = new CSiegeArms(MonsterCreate, dwOwnerID, cNation, dwHP, wObjectType, cState, cUpgradeStep); break; case Siege::AIRSHIP : lpSiegeArms = new CAirship(MonsterCreate, dwOwnerID, cNation, dwHP, wObjectType, cState, cUpgradeStep); break; } if (lpSiegeArms) { if ( !m_SiegeObjectMap.insert(std::make_pair(lpSiegeArms->GetCID(), lpSiegeArms)).second ) { DeleteSiegeObject(lpSiegeArms->GetCID()); return NULL; } if (0 == dwHP) { lpSiegeArms->SendHPUpdateToDBAgent(true); } // CreatureManager ¿¡ µî·Ï CCreatureManager::GetInstance().AddCreature(lpSiegeArms); return lpSiegeArms; } return NULL; } CSiegeObject* CSiegeObjectMgr::ChangeCampType(unsigned long dwCampID, unsigned short wChangeType) { CCamp* lpCamp = GetCamp( dwCampID ); 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 = CServerSetup::GetInstance().GetServerZone(); campInfoDB.m_cChannel = CServerSetup::GetInstance().GetServerChannel(); campInfoDB.m_wObjectType = wChangeType; campInfoDB.m_cState = Siege::COMPLETE; campInfoDB.m_cSubState = Siege::NONE; campInfoDB.m_cUpgradeStep = lpCamp->GetUpgradeStep(); ::memset(&campInfoDB.m_TimeValue, 0, sizeof(TIME)); ::memset(&campInfoDB.m_LastUseTime, 0, sizeof(TIME)); ::memcpy(campInfoDB.m_szRight, lpCamp->GetCampRight().m_aryCampRight, CampRight::MAX_RIGHT_NUM); campInfoDB.m_Pos.fPointX = lpCamp->GetCurrentPos().m_fPointX; campInfoDB.m_Pos.fPointY = lpCamp->GetCurrentPos().m_fPointY; campInfoDB.m_Pos.fPointZ = lpCamp->GetCurrentPos().m_fPointZ; campInfoDB.m_cMaterial = lpCamp->GetMaterialNum(); campInfoDB.m_cSiegeCount = 0; // ±âÁ¸ °´Ã¼ »èÁ¦ DeleteCamp( dwCampID ); // »õ·Î¿î °´Ã¼·Î »õ·Î Ãß°¡ CSiegeObject* lpSiegeObject = NULL; switch ( wChangeType ) { case Siege::CAMP: lpSiegeObject = CreateCamp(reinterpret_cast(&campInfoDB), 0, dwCID); break; case Siege::MINING_CAMP: lpSiegeObject = CreateMiningCamp(reinterpret_cast(&campInfoDB), 0, dwCID); break; case Siege::CAMP_SHOP: lpSiegeObject = CreateCampShop(reinterpret_cast(&campInfoDB), 0, dwCID); break; } // ¸®½ºÆ®¿¡ Ãß°¡ if ( lpSiegeObject ) { if ( !m_SiegeObjectMap.insert(std::make_pair(lpSiegeObject->GetCID(), lpSiegeObject)).second ) { DeleteSiegeObject(lpSiegeObject->GetCID()); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpSiegeObject->GetCampID(), reinterpret_cast(lpSiegeObject))).second ) { // ¿¡·¯ ·Î±× } // CreatureManager ¿¡ µî·Ï CCreatureManager::GetInstance().AddCreature(lpSiegeObject); return lpSiegeObject; } return NULL; } return NULL; } CCamp* CSiegeObjectMgr::GetCamp(unsigned long dwCampID) { if (0 == m_CampMap.size()) return NULL; CampMap::iterator pos = m_CampMap.find(dwCampID); if (pos != m_CampMap.end()) return (pos->second); return NULL; } CSiegeObject* CSiegeObjectMgr::GetSiegeObject(unsigned long dwObjectID) { if (0 == m_SiegeObjectMap.size()) return NULL; SiegeObjectMap::iterator pos = m_SiegeObjectMap.find(dwObjectID); if (pos != m_SiegeObjectMap.end()) return (pos->second); return NULL; } void CSiegeObjectMgr::SetWorldWeaponInfo(unsigned char cKarRemainSiegeTime, unsigned char cMerRemainSiegeTime) { m_cKarRemainSiegeTime = cKarRemainSiegeTime; m_cMerRemainSiegeTime = cMerRemainSiegeTime; } void CSiegeObjectMgr::UpdateWorldWeaponInfo(unsigned char cNation, unsigned char cRemainSiegeTime) { switch (cNation) { case Creature::KARTERANT: { m_cKarRemainSiegeTime = cRemainSiegeTime; } break; case Creature::MERKADIA: { m_cMerRemainSiegeTime = cRemainSiegeTime; } break; } } bool CSiegeObjectMgr::EnableCreateWorldWeapon(unsigned char cNation, unsigned short& wError) const { // ¿ùµå ¿þÆù ±¸¼º. 12¹ø ±Û·Î¹ú¿¡¼­ »©Á³´Ù. if (SERVER_ID::CAPITAL != CServerSetup::GetInstance().GetServerZone()) { wError = PktUI::FAIL_CAPITAL_ZONE; return false; } /* // ¿ùµå ¿þÆù ±¸¼º. 12¹ø ±Û·Î¹ú¿¡¼­ »©Á³´Ù. if (SERVER_ID::ZONE12 == CServerSetup::GetInstance().GetServerZone()) { wError = PktUI::FAIL_ALMIGHTY_GROUND; return false; } */ /* // ´ÙÅ© Ä«³ª¹øµµ ¿ùµå ¿þÆùÀ» ±¸ÃàÇÒ ¼ö ÀÖµµ·Ï ·êÀÌ º¯°æµÇ¾ú½À´Ï´Ù. (2005-06-03 by ·Îµò) if (SERVER_ID::STONE_WAR == CServerSetup::GetInstance().GetServerZone()) { wError = PktUI::FAIL_STONE_BATTLE; return false; } */ if (Creature::ALMIGHTY_PIRATE == cNation) { wError = PktUI::FAIL_ALMIGHTY_PIRATE; return true; } if (NULL == m_lpWorldWeapon && false == m_bRequestWorldWeaponCreation) { switch (cNation) { case Creature::KARTERANT: { if (0 == m_cKarRemainSiegeTime) { return true; } else { switch (m_cKarRemainSiegeTime) { case 1: wError = PktUI::FAIL_REMAIN_1_DAY; break; case 2: wError = PktUI::FAIL_REMAIN_2_DAY; break; case 3: wError = PktUI::FAIL_REMAIN_3_DAY; break; default: wError = PktUI::FAIL_REMAIN_3_DAY; break; } return false; } } break; case Creature::MERKADIA: { if (0 == m_cMerRemainSiegeTime) { return true; } else { switch (m_cMerRemainSiegeTime) { case 1: wError = PktUI::FAIL_REMAIN_1_DAY; break; case 2: wError = PktUI::FAIL_REMAIN_2_DAY; break; case 3: wError = PktUI::FAIL_REMAIN_3_DAY; break; default: wError = PktUI::FAIL_REMAIN_3_DAY; break; } return false; } } break; } } wError = PktUI::FAIL_EXIST_ANOTHER_WEAPON; return false; } void CSiegeObjectMgr::DecreaseWeaponRemainSiegeTime() { if (m_cKarRemainSiegeTime > 0) { --m_cKarRemainSiegeTime; } if (m_cMerRemainSiegeTime > 0) { --m_cMerRemainSiegeTime; } } bool CSiegeObjectMgr::DeleteCamp(unsigned long dwCampID) { CampMap::iterator itr = m_CampMap.find(dwCampID); if (itr != m_CampMap.end()) { CCamp* lpCamp = itr->second; if (lpCamp) { // ¿ùµå ¿þÆù Áö¿ì±â if (Siege::KARTERANT_WEAPON == lpCamp->GetObjectType() || Siege::MERKADIA_WEAPON == lpCamp->GetObjectType()) { m_lpWorldWeapon = NULL; } // SiegeObjectMap ¿¡¼­ »èÁ¦ SiegeObjectMap::iterator pos = m_SiegeObjectMap.find(lpCamp->GetCID()); if (pos != m_SiegeObjectMap.end()) { m_SiegeObjectMap.erase(pos); } // CreatureManager ¿¡¼­ »èÁ¦ CCreatureManager::GetInstance().DeleteCreature(lpCamp->GetCID()); // °´Ã¼ »èÁ¦ delete lpCamp; lpCamp = NULL; } m_CampMap.erase(itr); } return true; } bool CSiegeObjectMgr::DeleteSiegeObject(unsigned long dwCID) { SiegeObjectMap::iterator itr = m_SiegeObjectMap.find(dwCID); if (itr != m_SiegeObjectMap.end()) { CSiegeObject* lpObject = itr->second; if (lpObject) { if (lpObject->IsCamp()) { return DeleteCamp( lpObject->GetCampID() ); } // °´Ã¼ »èÁ¦ delete lpObject; lpObject = NULL; } m_SiegeObjectMap.erase(itr); } return true; } bool CSiegeObjectMgr::DeleteSiegeObject(CSiegeObject* lpObject) { if (lpObject == NULL) return false; return DeleteSiegeObject(lpObject->GetCID()); } bool CSiegeObjectMgr::ExistBuildingOrDestroyingCamp(unsigned long dwGID) { CampMap::iterator itr = m_CampMap.begin(); while (itr != m_CampMap.end()) { CCamp* lpCamp = itr->second; if (lpCamp) { if (lpCamp->GetGID() == dwGID) { switch (lpCamp->GetState()) { case Siege::DEVELOPING : case Siege::CANCELING : case Siege::DESTROYING : return true; } } } ++itr; } return false; } bool CSiegeObjectMgr::ExistCampInRadius(const Position& Pos) { CampMap::iterator itr = m_CampMap.begin(); while (itr != m_CampMap.end()) { CCamp* lpCamp = itr->second; if (lpCamp) { const float fDX = Pos.m_fPointX - lpCamp->GetPosition().m_fPointX; const float fDZ = Pos.m_fPointZ - lpCamp->GetPosition().m_fPointZ; const float fDistance = sqrtf( (fDX * fDX) + (fDZ * fDZ) ); if (fDistance <= Siege::CAMP_BUILDING_RADIUS) { return true; } } ++itr; } return false; } bool CSiegeObjectMgr::ExistCompleteCampInRadius(const Position& Pos, unsigned long dwGID) { CampMap::iterator itr = m_CampMap.begin(); while (itr != m_CampMap.end()) { CCamp* lpCamp = itr->second; if (lpCamp) { const float fDX = Pos.m_fPointX - lpCamp->GetPosition().m_fPointX; const float fDZ = Pos.m_fPointZ - lpCamp->GetPosition().m_fPointZ; const float fDistance = sqrtf( (fDX * fDX) + (fDZ * fDZ) ); if (fDistance <= Siege::CAMP_BUILDING_RADIUS && lpCamp->GetGID() == dwGID) { switch (lpCamp->GetState()) { case Siege::COMPLETE: case Siege::UPGRADING: case Siege::REPARING: { return true; } break; } } } ++itr; } return false; } void CSiegeObjectMgr::HasCampByGID(unsigned long dwGID, bool& bHasDevelopingCamp, bool& bHasCompleteCamp) { bHasDevelopingCamp = bHasCompleteCamp = false; CampMap::iterator itr = m_CampMap.begin(); while (itr != m_CampMap.end()) { CCamp* lpCamp = itr->second; if (lpCamp && lpCamp->GetGID() == dwGID) { if (Siege::DEVELOPING == lpCamp->GetState()) { // °Ç¼³ÁßÀÎ ±æµå ¿ä»õ bHasDevelopingCamp = true; } else { // ¿Ï¼ºµÈ ±æµå ¿ä»õ bHasCompleteCamp = true; } } ++itr; } } void CSiegeObjectMgr::ProcessAllSiegeObject() { SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObject* lpSiegeObject = itr->second; if (lpSiegeObject) { if (lpSiegeObject->IsGuard() || lpSiegeObject->IsEmblem() || lpSiegeObject->IsCamp() ) { lpSiegeObject->Process(); } } ++itr; } } void CSiegeObjectMgr::ProcessCampRegenHPAndMP() { SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObject* lpSiegeObject = itr->second; if (lpSiegeObject && lpSiegeObject->IsCamp()) { lpSiegeObject->RegenHPAndMP(0, 0, true); lpSiegeObject->SendHPUpdateToDBAgent(); } ++itr; } } void CSiegeObjectMgr::ProcessWorldWeaponFire() { // 1 ÃÊ¿¡ Çѹø È£ÃâµÈ´Ù. if (NULL != m_lpWorldWeapon && Siege::WEAPON_FIRE == m_lpWorldWeapon->GetSubState()) { CWorldWeapon* lpWeapon = reinterpret_cast(m_lpWorldWeapon); if (NULL != lpWeapon) { if (0 == lpWeapon->GetFireCount()) { // ¹ß»ç ó¸® lpWeapon->Fire(); DeleteCamp(lpWeapon->GetCampID()); } else { // ¸îÃÊ ³²¾Ò´Ù´Â ¸Þ¼¼Áö Àü¼Û lpWeapon->FireWarning(); } } } } void CSiegeObjectMgr::ProcessCampShopUpdate(bool bForce) { CampMap::iterator itr = m_CampMap.begin(); CampMap::iterator end = m_CampMap.end(); while (itr != end) { CCamp* lpCamp = itr->second; if (NULL != lpCamp && Siege::CAMP_SHOP == lpCamp->GetObjectType()) { CCampShop* lpCampShop = reinterpret_cast(lpCamp); lpCampShop->DBUpdate(bForce); } ++itr; } } void CSiegeObjectMgr::ProcessMiningCamp(unsigned long dwProcessType) { // »çÀü Áغñ ÀÛ¾÷ : ä±¼ÁßÀΠä±¼±âÀÇ ¼ýÀÚ¸¦ °»½ÅÇØÁØ´Ù. CMineralVeinMgr::GetInstance().InitializeMiningCampNum(); CampMap::iterator itr = m_CampMap.begin(); CampMap::iterator end = m_CampMap.end(); while ( itr != end ) { CCamp* lpCamp = itr->second; if ( lpCamp && Siege::MINING_CAMP == lpCamp->GetObjectType() ) { CMiningCamp* lpMiningCamp = reinterpret_cast( lpCamp ); if ( lpMiningCamp && Siege::MINING_ON == lpMiningCamp->GetSubState() ) { // ÇØ´ç Áö¿ªÀÇ Ã¤±¼±â ¼ö ¾÷µ¥ÀÌÆ® CMineralVeinMgr::GetInstance().CalculateMiningCampNum( lpCamp->GetCurrentPos().m_fPointX, lpCamp->GetCurrentPos().m_fPointZ ); } } ++itr; } // 1. °¡µ¿ÁßÀÌ´ø ä±¼±âÀÇ Àӽà ±¤¹°¿¡ »õ·Î Ãß°¡ÇØÁØ´Ù. // 2. ÁöÁ¤µÈ °ø¼ºÀÌ Áö³­ ä±¼±âÀÇ Àӽà ±¤¹°À» ´©Àû ±¤¹°·Î ¿Å°ÜÁØ´Ù. itr = m_CampMap.begin(); end = m_CampMap.end(); while ( itr != end ) { CCamp* lpCamp = itr->second; if ( lpCamp && Siege::MINING_CAMP == lpCamp->GetObjectType() ) { CMiningCamp* lpMiningCamp = reinterpret_cast( lpCamp ); if ( lpMiningCamp && Siege::MINING_ON == lpMiningCamp->GetSubState() ) { lpMiningCamp->ProcessMining(dwProcessType); } } ++itr; } // 3. Áö·ÂÀ» °»½ÅÇØÁØ´Ù. CMineralVeinMgr::GetInstance().CalculateFertility(dwProcessType); GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 == lpDBAgentDispatch) { ERRLOG0(g_Log, "¿¡ÀÌÀüÆ® ¾ò±â ½ÇÆÐ."); } else { char szBuffer[ 2048 ]; unsigned short wSize = 0, wTotalSize = 0; PktFertilityInfo* lpPktFI = reinterpret_cast(szBuffer); ZoneChannelInfo* lpZoneChannel = reinterpret_cast(lpPktFI + 1); unsigned long* lpData = reinterpret_cast(lpZoneChannel + 1); lpPktFI->m_wNum = static_cast( CMineralVeinMgr::GetInstance().GetVeinNum() ); CMineralVeinMgr::GetInstance().SerializeOutFertility(lpData, wSize); lpPktFI->m_wSize = wSize; lpZoneChannel->m_cZone = CServerSetup::GetInstance().GetServerZone(); lpZoneChannel->m_cChannel = CServerSetup::GetInstance().GetServerChannel(); wTotalSize = sizeof(PktFertilityInfo) + sizeof(ZoneChannelInfo) + wSize; CSendStream& SendStream = lpDBAgentDispatch->GetSendStream(); SendStream.WrapCompress(szBuffer, wTotalSize, CmdFertilityInfo, 0, 0); } } bool CSiegeObjectMgr::SerializeIn(char* lpBuffer, unsigned short wSize, unsigned long dwCID) { if ( !lpBuffer ) { return false; } CSiegeObject* lpCamp = NULL; CampInfoDB* lpCampInfoDB = reinterpret_cast(lpBuffer); switch (lpCampInfoDB->m_wObjectType) { case Siege::CAMP: lpCamp = CreateCamp(lpBuffer, wSize, dwCID); break; case Siege::MINING_CAMP: lpCamp = CreateMiningCamp(lpBuffer, wSize, dwCID); break; case Siege::CAMP_SHOP: lpCamp = CreateCampShop(lpBuffer, wSize, dwCID); break; case Siege::KARTERANT_WEAPON: lpCamp = CreateWorldWeapon(lpBuffer, wSize, dwCID, Creature::KARTERANT); break; case Siege::MERKADIA_WEAPON: lpCamp = CreateWorldWeapon(lpBuffer, wSize, dwCID, Creature::MERKADIA); break; } if ( lpCamp ) { if ( !m_SiegeObjectMap.insert(std::make_pair(lpCamp->GetCID(), lpCamp)).second ) { DeleteSiegeObject(lpCamp->GetCID()); return NULL; } if ( !m_CampMap.insert(std::make_pair(lpCamp->GetCampID(), reinterpret_cast(lpCamp))).second ) { // ¿¡·¯ ·Î±× } // CreatureManager ¿¡ µî·Ï CCreatureManager::GetInstance().AddCreature(lpCamp); // ¸®½ºÆù Æ÷ÀÎÆ® Ãß°¡ (±¸ÃàÁßÀ̰ųª, ±¸Ãà Ãë¼ÒÁß¿¡´Â ¾ÈµÊ) if (Siege::DEVELOPING != lpCamp->GetState() && Siege::CANCELING != lpCamp->GetState()) { CCharRespawnMgr::GetInstance().AddCampRespawnPoint(lpCamp->GetCampID(), lpCamp->GetGID(), lpCamp->GetPosition()); } return true; } return false; } bool CSiegeObjectMgr::SendCampInfo(CSendStream& SendStream) { CampMap::iterator itr = m_CampMap.begin(); CampMap::iterator end = m_CampMap.end(); while (itr != end) { CCamp* lpCamp = itr->second; if (lpCamp) { char* lpBuffer = SendStream.GetBuffer(sizeof(PktCreateCamp)); if (lpBuffer) { PktCreateCamp* lpPktCreateCamp = reinterpret_cast(lpBuffer); lpPktCreateCamp->m_dwActorCID = 0; lpPktCreateCamp->m_dwCID = lpCamp->m_dwCID; lpPktCreateCamp->m_dwCampID = lpCamp->GetCampID(); lpPktCreateCamp->m_dwGID = lpCamp->m_dwGID; lpPktCreateCamp->m_dwHP = lpCamp->m_CreatureStatus.m_nNowHP; lpPktCreateCamp->m_wObjectType = lpCamp->GetObjectType(); lpPktCreateCamp->m_cZone = CServerSetup::GetInstance().GetServerZone(); lpPktCreateCamp->m_cChannel = CServerSetup::GetInstance().GetServerChannel(); lpPktCreateCamp->m_cState = lpCamp->m_cState; lpPktCreateCamp->m_cSubState = lpCamp->m_cSubState; lpPktCreateCamp->m_cUpgradeStep = lpCamp->m_cUpgradeStep; lpPktCreateCamp->m_CampRight = lpCamp->m_CampRight; lpPktCreateCamp->m_Pos.fPointX = lpCamp->m_CurrentPos.m_fPointX; lpPktCreateCamp->m_Pos.fPointY = lpCamp->m_CurrentPos.m_fPointY; lpPktCreateCamp->m_Pos.fPointZ = lpCamp->m_CurrentPos.m_fPointZ; lpPktCreateCamp->m_cMaterial = lpCamp->GetMaterialNum(); Guild::CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild( lpCamp->m_dwGID ); if (lpGuild) { lpPktCreateCamp->m_cNation = lpGuild->GetNation(); } else { // ±æµå Á¤º¸°¡ ¾øÀ» ¶§ Á¦»ï±¹ÀûÀ¸·Î Àӽà »ç¿ë lpPktCreateCamp->m_cNation = Creature::ALMIGHTY_PIRATE; } SendStream.WrapCrypt(sizeof(PktCreateCamp), CmdCreateCamp, 0, PktBase::NO_SERVER_ERR); } } ++itr; } return true; } // ÇØ´ç ¼ºÀÇ ¸ðµç ¿ÀºêÁ§Æ®ÀÇ ÁÖÀÎÀÌ ¹Ù²î¾ú´Ù´Â°ÍÀ» º´±âÀÇ ¹Ý°æ 5¼¿¿¡ Àִ ij¸¯ÅÍ¿¡°Ô ¾Ë·ÁÁØ´Ù. bool CSiegeObjectMgr::SendChangeMaster(unsigned long dwCastleID, unsigned char cNation) { SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObject* lpCastleObject = itr->second; if (lpCastleObject && lpCastleObject->GetCastleID() == dwCastleID) { lpCastleObject->SetNation(cNation); if (lpCastleObject->IsEmblem()) { lpCastleObject->SetState(Siege::COMPLETE); } PktCastleCmd pktCC; pktCC.m_dwCastleID = dwCastleID; pktCC.m_dwCastleObjectID = lpCastleObject->GetCID(); pktCC.m_cState = lpCastleObject->GetState(); pktCC.m_dwValue1 = cNation; // »õ·Î¿î ¼ºÀÇ ¼ÒÀ¯ ±¹°¡ pktCC.m_dwValue2 = 0; pktCC.m_cSubCmd = PktCastleCmd::CASTLE_ARMS_CHANGE_MASTER; char* szPacket = reinterpret_cast(&pktCC); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktCastleCmd), CmdCastleCmd, 0, 0)) { // ¹Ý°æ 5¼¿¿¡ ÆÐŶ Àü¼Û // Vincent - ºê·Îµå ij½ºÆ® º¯°æ Å×½ºÆ® ÄÚµå //lpCastleObject->SendToRadiusCell(szPacket, sizeof(PktCastleCmd), CmdCastleCmd); lpCastleObject->SendToRange(Siege::BROADCAST_RADIUS, szPacket, sizeof(PktCastleCmd), CmdCastleCmd); } } ++itr; } return true; } bool CSiegeObjectMgr::SendLoseOwnership(unsigned long dwCastleID) { SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObject* lpCastleObject = itr->second; if (lpCastleObject && lpCastleObject->GetCastleID() == dwCastleID) { lpCastleObject->SetNation(0); if (lpCastleObject->IsEmblem()) { lpCastleObject->SetState(Siege::COMPLETE); } PktCastleCmd pktCC; pktCC.m_dwCastleID = dwCastleID; pktCC.m_dwCastleObjectID = lpCastleObject->GetCID(); pktCC.m_cState = lpCastleObject->GetState(); pktCC.m_dwValue1 = Creature::STATELESS; // »õ·Î¿î ¼ºÀÇ ¼ÒÀ¯±¹°¡ (0) pktCC.m_dwValue2 = lpCastleObject->GetSubState(); // SubState pktCC.m_cSubCmd = PktCastleCmd::CASTLE_ARMS_CHANGE_MASTER; char* szPacket = reinterpret_cast(&pktCC); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktCastleCmd), CmdCastleCmd, 0, 0)) { // ¹Ý°æ 5¼¿¿¡ ÆÐŶ Àü¼Û // Vincent - ºê·Îµå ij½ºÆ® º¯°æ Å×½ºÆ® ÄÚµå //lpCastleObject->SendToRadiusCell(szPacket, sizeof(PktCastleCmd), CmdCastleCmd); lpCastleObject->SendToRange(Siege::BROADCAST_RADIUS, szPacket, sizeof(PktCastleCmd), CmdCastleCmd); } } ++itr; } return true; } CSiegeObject* CSiegeObjectMgr::CreateCamp(char* lpBuffer, unsigned short wSize, unsigned long dwCID) { CampInfoDB* lpCampInfoDB = reinterpret_cast(lpBuffer); int nKID = Siege::GetKID(lpCampInfoDB->m_wObjectType, lpCampInfoDB->m_cState, 0, lpCampInfoDB->m_cUpgradeStep); CMonster::MonsterCreateInfo MonsterCreate; MonsterCreate.m_dwCID = dwCID; MonsterCreate.m_dwPID = 0x00000000; MonsterCreate.m_nKID = nKID; MonsterCreate.m_nMovingPattern = CMonster::FIXED; MonsterCreate.m_wRespawnArea = 0; MonsterCreate.m_bScout = false; MonsterCreate.m_Pos = lpCampInfoDB->m_Pos; CampRight campRight; ::memcpy(campRight.m_aryCampRight, lpCampInfoDB->m_szRight, CampRight::MAX_RIGHT_NUM); CSiegeObject* lpCamp = new CCamp(MonsterCreate, lpCampInfoDB->m_dwCampID, lpCampInfoDB->m_dwGID, lpCampInfoDB->m_dwHP, lpCampInfoDB->m_wObjectType, lpCampInfoDB->m_cState, lpCampInfoDB->m_cSubState, lpCampInfoDB->m_cUpgradeStep, lpCampInfoDB->m_cMaterial, lpCampInfoDB->m_cSiegeCount, campRight, false); return lpCamp; } CSiegeObject* CSiegeObjectMgr::CreateMiningCamp(char* lpBuffer, unsigned short wSize, unsigned long dwCID) { CampInfoDB* lpCampInfoDB = reinterpret_cast(lpBuffer); int nKID = Siege::GetKID(lpCampInfoDB->m_wObjectType, lpCampInfoDB->m_cState, 0, lpCampInfoDB->m_cUpgradeStep); CMonster::MonsterCreateInfo MonsterCreate; MonsterCreate.m_dwCID = dwCID; MonsterCreate.m_dwPID = 0x00000000; MonsterCreate.m_nKID = nKID; MonsterCreate.m_nMovingPattern = CMonster::FIXED; MonsterCreate.m_wRespawnArea = 0; MonsterCreate.m_bScout = false; MonsterCreate.m_Pos = lpCampInfoDB->m_Pos; CampRight campRight; ::memcpy(campRight.m_aryCampRight, lpCampInfoDB->m_szRight, CampRight::MAX_RIGHT_NUM); CSiegeObject* lpCamp = new CMiningCamp(MonsterCreate, lpCampInfoDB->m_dwCampID, lpCampInfoDB->m_dwGID, lpCampInfoDB->m_dwHP, lpCampInfoDB->m_wObjectType, lpCampInfoDB->m_cState, lpCampInfoDB->m_cSubState, lpCampInfoDB->m_cUpgradeStep, lpCampInfoDB->m_cMaterial, lpCampInfoDB->m_cSiegeCount, campRight, false); if ( lpCamp && wSize > 0 ) { CMiningCamp* lpMiningCamp = reinterpret_cast(lpCamp); MiningCampInfo* lpMiningCampInfo = reinterpret_cast(lpCampInfoDB + 1); if ( lpMiningCampInfo ) { unsigned char cAccumulatedNum = lpMiningCampInfo->m_cAccumulatedNum; unsigned char cTemporaryNum = lpMiningCampInfo->m_cTemporaryNum; CampMineralInfo* lpMineralInfo = reinterpret_cast(lpMiningCampInfo + 1); // ´©Àû ±¤¹° Á¤º¸ ¼ÂÆÃ for (int i=0; iAddMineral(Siege::ACCUMULATED_MINERAL, *lpMineralInfo); } // Àӽà ±¤¹° Á¤º¸ ¼ÂÆÃ for (int i=0; iAddMineral(Siege::TEMPORARY_MINERAL, *lpMineralInfo); } } } return lpCamp; } CSiegeObject* CSiegeObjectMgr::CreateCampShop(char* lpBuffer, unsigned short wSize, unsigned long dwCID) { CampInfoDB* lpCampInfoDB = reinterpret_cast(lpBuffer); int nKID = Siege::GetKID(lpCampInfoDB->m_wObjectType, lpCampInfoDB->m_cState, 0, lpCampInfoDB->m_cUpgradeStep); CMonster::MonsterCreateInfo MonsterCreate; MonsterCreate.m_dwCID = dwCID; MonsterCreate.m_dwPID = 0x00000000; MonsterCreate.m_nKID = nKID; MonsterCreate.m_nMovingPattern = CMonster::FIXED; MonsterCreate.m_wRespawnArea = 0; MonsterCreate.m_bScout = false; MonsterCreate.m_Pos = lpCampInfoDB->m_Pos; CampRight campRight; ::memcpy(campRight.m_aryCampRight, lpCampInfoDB->m_szRight, CampRight::MAX_RIGHT_NUM); CSiegeObject* lpCamp = new CCampShop(MonsterCreate, lpCampInfoDB->m_dwCampID, lpCampInfoDB->m_dwGID, lpCampInfoDB->m_dwHP, lpCampInfoDB->m_wObjectType, lpCampInfoDB->m_cState, lpCampInfoDB->m_cSubState, lpCampInfoDB->m_cUpgradeStep, lpCampInfoDB->m_cMaterial, lpCampInfoDB->m_cSiegeCount, campRight, false); if (NULL != lpCamp && wSize > 0) { CCampShop* lpCampShop = reinterpret_cast(lpCamp); CampShopInfo* lpCampShopInfo = reinterpret_cast(lpCampInfoDB + 1); char* lpItemBuffer = reinterpret_cast(lpCampShopInfo + 1); if (NULL != lpCampShopInfo) { lpCampShop->SerializeIn(lpCampShopInfo->m_dwTempSafe, lpCampShopInfo->m_cTax, lpItemBuffer, lpCampShopInfo->m_dwBufferSize, lpCampShopInfo->m_cItemNum); } } return lpCamp; } CSiegeObject* CSiegeObjectMgr::CreateWorldWeapon(char* lpBuffer, unsigned short wSize, unsigned long dwCID, unsigned char cNation) { // WorldWeapon ±¹°¡ ¼³Á¤ if (NULL == m_lpWorldWeapon) { CampInfoDB* lpCampInfoDB = reinterpret_cast(lpBuffer); int nKID = Siege::GetKID(lpCampInfoDB->m_wObjectType, lpCampInfoDB->m_cState, 0, lpCampInfoDB->m_cUpgradeStep); CMonster::MonsterCreateInfo MonsterCreate; MonsterCreate.m_dwCID = dwCID; MonsterCreate.m_dwPID = 0x00000000; MonsterCreate.m_nKID = nKID; MonsterCreate.m_nMovingPattern = CMonster::FIXED; MonsterCreate.m_wRespawnArea = 0; MonsterCreate.m_bScout = false; MonsterCreate.m_Pos = lpCampInfoDB->m_Pos; CampRight campRight; ::memcpy(campRight.m_aryCampRight, lpCampInfoDB->m_szRight, CampRight::MAX_RIGHT_NUM); CSiegeObject* lpCamp = new CWorldWeapon(MonsterCreate, lpCampInfoDB->m_dwCampID, lpCampInfoDB->m_dwGID, lpCampInfoDB->m_dwHP, lpCampInfoDB->m_wObjectType, lpCampInfoDB->m_cState, lpCampInfoDB->m_cSubState, lpCampInfoDB->m_cUpgradeStep, lpCampInfoDB->m_cMaterial, lpCampInfoDB->m_cSiegeCount, campRight, false); if (lpCamp && Siege::DEVELOPING != lpCamp->GetState()) { m_lpWorldWeapon = reinterpret_cast(lpCamp); // ¿ùµå ¿þÆù ÀÎæƮ Àû¿ë unsigned char cNation = Creature::STATELESS; switch (lpCampInfoDB->m_wObjectType) { case Siege::KARTERANT_WEAPON: cNation = Creature::KARTERANT; break; case Siege::MERKADIA_WEAPON: cNation = Creature::MERKADIA; break; } CCreatureManager::GetInstance().AddWorldWeaponEnchant(reinterpret_cast(lpCamp), cNation); } return lpCamp; } else { ERRLOG2(g_Log, "¿ùµå ¿þÆùÀÌ 2°³ ÀÌ»ó Á¸ÀçÇÕ´Ï´Ù. OldNation : %d, NewNation : %d", m_lpWorldWeapon->GetNation(), cNation); } return NULL; } // ¸ðµç °ø¼º°ü·Ã ¿ÀºêÁ§Æ®µéÀ» ¹Ý°æ 5¼¿¿¡ Àִ ij¸¯Å͵鿡°Ô ¾Ë·ÁÁØ´Ù. void CSiegeObjectMgr::PrepareBroadCast() { SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObject* lpSiegeObject = itr->second; if (lpSiegeObject) { lpSiegeObject->GetSerializeData().PrepareData( *lpSiegeObject ); } ++itr; } } void CSiegeObjectMgr::BroadCast() { SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObject* lpSiegeObject = itr->second; if (lpSiegeObject) { lpSiegeObject->RangeTest(); } ++itr; } } bool CSiegeObjectMgr::HasSiegeArms(unsigned long dwCID) { SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObject* lpSiegeObject = itr->second; if (lpSiegeObject) { if(lpSiegeObject->IsSiegeArms()) { if(lpSiegeObject->GetOwnerID()==dwCID) { return true; } } } ++itr; } return false; } unsigned long CSiegeObjectMgr::GetSiegeObjectCount() { unsigned long dwCnt = 0; SiegeObjectMap::iterator itr = m_SiegeObjectMap.begin(); while (itr != m_SiegeObjectMap.end()) { CSiegeObject* lpSiegeObject = itr->second; if (lpSiegeObject) { if(lpSiegeObject->IsSiegeArms()) { dwCnt++; } } ++itr; } return dwCnt; }