From 56c6b38966b6d796b3bc48e0e4892bc02ffb66bb Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 29 Jan 2018 19:40:27 +1100 Subject: [PATCH] createInstanceContent and some minor refactoring --- src/servers/sapphire_zone/Actor/Player.cpp | 2 +- .../DebugCommand/DebugCommandHandler.cpp | 11 ++-- .../Network/Handlers/GMCommandHandlers.cpp | 2 +- .../sapphire_zone/Zone/InstanceContent.cpp | 8 ++- .../sapphire_zone/Zone/InstanceContent.h | 12 ++++- .../sapphire_zone/Zone/TerritoryMgr.cpp | 51 +++++++++++++++---- src/servers/sapphire_zone/Zone/TerritoryMgr.h | 2 +- 7 files changed, 68 insertions(+), 20 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 5e5eac1b..7e271f93 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -373,7 +373,7 @@ void Core::Entity::Player::setZone( uint32_t zoneId ) bool Core::Entity::Player::setInstance( uint32_t instanceContentId ) { - auto instance = g_territoryMgr.getTerritoryZonePtr( instanceContentId ); + auto instance = g_territoryMgr.getInstanceZonePtr( instanceContentId ); if( !instance ) return false; diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index da18fbd9..b51f4423 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -681,11 +681,14 @@ void Core::DebugCommandHandler::instance( char* data, Entity::Player &player, bo if( subCommand == "create" || subCommand == "cr" ) { - uint32_t terriId; - sscanf( params.c_str(), "%d", &terriId ); + uint32_t instanceContentId; + sscanf( params.c_str(), "%d", &instanceContentId ); - auto instance = g_territoryMgr.createTerritoryInstance( terriId ); - player.sendDebug( "Created instance with guid: " + std::to_string( instance->getGuId() ) ); + auto instance = g_territoryMgr.createInstanceContent( instanceContentId ); + if( instance ) + player.sendDebug( "Created instance with id: " + std::to_string( instance->getGuId() ) + " -> " + instance->getName() ); + else + player.sendDebug( "Failed to create instance with id: " + std::to_string( instanceContentId ) ); } else if( subCommand == "remove" || subCommand == "rm" ) { diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index 27d4e11d..4f6d1954 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -403,7 +403,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac } case GmCommand::Teri: { - if( auto instance = g_territoryMgr.getTerritoryZonePtr( param1 ) ) + if( auto instance = g_territoryMgr.getInstanceZonePtr( param1 ) ) { player.sendDebug( "Found instance: " + instance->getName() + ", id: " + std::to_string( param1 ) ); diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index d5a78112..d0d7086e 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -1,7 +1,11 @@ #include "InstanceContent.h" -Core::InstanceContent::InstanceContent( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName ) - : Zone( territoryId, guId, internalName, placeName ) +Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceContent > pInstanceContent, + uint32_t guId, + const std::string& internalName, + const std::string& placeName ) + : Zone( pInstanceContent->territoryType, guId, internalName, placeName ), + m_instanceContentRow( pInstanceContent ) { } diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index 43a29c14..f3bc5fc3 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -3,6 +3,7 @@ #include "Zone.h" #include "Forwards.h" +#include namespace Core { @@ -17,11 +18,20 @@ public: DutyFinished }; - InstanceContent( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName ); + InstanceContent( boost::shared_ptr< Core::Data::InstanceContent > pInstanceContent, + uint32_t guId, + const std::string& internalName, + const std::string& placeName ); virtual ~InstanceContent(); + boost::shared_ptr< Core::Data::InstanceContent > getInstanceContentRow() const + { + return m_instanceContentRow; + } + private: Event::DirectorPtr m_pDirector; + boost::shared_ptr< Core::Data::InstanceContent > m_instanceContentRow; }; diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index f707f53a..47300066 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -76,7 +76,8 @@ bool Core::TerritoryMgr::isInstanceContentTerritory( uint32_t territoryTypeId ) pTeri->territoryIntendedUse == TerritoryIntendedUse::OpenWorldInstanceBattle || pTeri->territoryIntendedUse == TerritoryIntendedUse::PalaceOfTheDead || pTeri->territoryIntendedUse == TerritoryIntendedUse::RaidFights || - pTeri->territoryIntendedUse == TerritoryIntendedUse::Raids; + pTeri->territoryIntendedUse == TerritoryIntendedUse::Raids || + pTeri->territoryIntendedUse == TerritoryIntendedUse::TreasureMapInstance; } bool Core::TerritoryMgr::isPrivateTerritory( uint32_t territoryTypeId ) const @@ -136,6 +137,9 @@ Core::ZonePtr Core::TerritoryMgr::createTerritoryInstance( uint32_t territoryTyp if( !isValidTerritory( territoryTypeId ) ) return nullptr; + if( isInstanceContentTerritory( territoryTypeId ) ) + return nullptr; + auto pTeri = getTerritoryDetail( territoryTypeId ); auto pPlaceName = g_exdDataGen.getPlaceName( pTeri->placeName ); @@ -144,12 +148,7 @@ Core::ZonePtr Core::TerritoryMgr::createTerritoryInstance( uint32_t territoryTyp g_log.debug( "Starting instance for territory: " + std::to_string( territoryTypeId ) + " (" + pPlaceName->name + ")" ); - ZonePtr pZone; - if( isInstanceContentTerritory( territoryTypeId ) ) - pZone = ZonePtr( new InstanceContent( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name ) ); - else - pZone = ZonePtr( new Zone( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name ) ); - + ZonePtr pZone = ZonePtr( new Zone( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name ) ); pZone->init(); m_territoryInstanceMap[pZone->getTerritoryId()][pZone->getGuId()] = pZone; @@ -158,10 +157,36 @@ Core::ZonePtr Core::TerritoryMgr::createTerritoryInstance( uint32_t territoryTyp return pZone; } -bool Core::TerritoryMgr::removeTerritoryInstance( uint32_t territoryTypeId ) +Core::ZonePtr Core::TerritoryMgr::createInstanceContent( uint32_t instanceContentId ) +{ + auto pInstanceContent = g_exdDataGen.getInstanceContent( instanceContentId ); + if( !pInstanceContent ) + return nullptr; + + if( !isInstanceContentTerritory( pInstanceContent->territoryType ) ) + return nullptr; + + auto pTeri = getTerritoryDetail( pInstanceContent->territoryType ); + auto pPlaceName = g_exdDataGen.getPlaceName( pTeri->placeName ); + + if( !pTeri || !pPlaceName ) + return nullptr; + + g_log.debug( "Starting instance for InstanceContent id: " + std::to_string( instanceContentId ) + " (" + pPlaceName->name + ")" ); + + ZonePtr pZone = ZonePtr( new InstanceContent( pInstanceContent, getNextInstanceId(), pTeri->name, pPlaceName->name ) ); + pZone->init(); + + m_instanceContentToInstanceMap[instanceContentId][pZone->getGuId()] = pZone; + m_instanceIdToZonePtrMap[pZone->getGuId()] = pZone; + + return pZone; +} + +bool Core::TerritoryMgr::removeTerritoryInstance( uint32_t instanceId ) { ZonePtr instance; - if( ( instance = getTerritoryZonePtr( territoryTypeId ) ) == nullptr ) + if( ( instance = getInstanceZonePtr( instanceId ) ) == nullptr ) return false; m_instanceIdToZonePtrMap.erase( instance->getGuId() ); @@ -170,7 +195,7 @@ bool Core::TerritoryMgr::removeTerritoryInstance( uint32_t territoryTypeId ) return true; } -Core::ZonePtr Core::TerritoryMgr::getTerritoryZonePtr( uint32_t instanceId ) const +Core::ZonePtr Core::TerritoryMgr::getInstanceZonePtr( uint32_t instanceId ) const { auto it = m_instanceIdToZonePtrMap.find( instanceId ); if( it == m_instanceIdToZonePtrMap.end() ) @@ -239,6 +264,12 @@ void Core::TerritoryMgr::updateTerritoryInstances( uint32_t currentTime ) for( auto zone : zoneMap.second ) zone.second->runZoneLogic( currentTime ); } + + for( auto zoneMap : m_instanceContentToInstanceMap ) + { + for( auto zone: zoneMap.second ) + zone.second->runZoneLogic( currentTime ); + } } Core::TerritoryMgr::InstanceIdList Core::TerritoryMgr::getInstanceContentIdList( uint16_t instanceContentId ) const diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index fe250fd9..24318550 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -93,7 +93,7 @@ namespace Core bool removeTerritoryInstance( uint32_t territoryTypeId ); /*! returns a ZonePtr to the instance or nullptr if not found */ - ZonePtr getTerritoryZonePtr( uint32_t instanceId ) const; + ZonePtr getInstanceZonePtr( uint32_t instanceId ) const; /*! returns the cached detail of a territory, nullptr if not found */ Data::TerritoryTypePtr getTerritoryDetail( uint32_t territoryTypeId ) const;