From 9e830ac6777605d558b167b65e9c732fc3efa5be Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 29 Jan 2018 13:03:52 +1100 Subject: [PATCH 1/7] fix weather in zones --- src/servers/sapphire_zone/Zone/Zone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 1b8cb402..e994f249 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -208,7 +208,7 @@ void Zone::loadCellCache() uint8_t Zone::getNextWeather() { - auto zoneInfo = g_exdData.m_zoneInfoMap[getGuId() ]; + auto zoneInfo = g_exdData.m_zoneInfoMap[getTerritoryId()]; uint32_t unixTime = static_cast< uint32_t >( Util::getTimeSeconds() ); // Get Eorzea hour for weather start From 20ee459e262352a483a90d94708ffd219c6138e5 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 29 Jan 2018 13:05:33 +1100 Subject: [PATCH 2/7] instance zoning and returning implemented instancecontent uses instancecontent class instead of zone too --- src/servers/sapphire_zone/Actor/Player.cpp | 45 ++++++++++++++++++- src/servers/sapphire_zone/Actor/Player.h | 6 +++ .../DebugCommand/DebugCommandHandler.cpp | 4 ++ .../Network/Handlers/GMCommandHandlers.cpp | 2 + .../sapphire_zone/Zone/InstanceContent.cpp | 11 +++++ .../sapphire_zone/Zone/InstanceContent.h | 2 +- .../sapphire_zone/Zone/TerritoryMgr.cpp | 8 +++- 7 files changed, 75 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index d99c6470..5e5eac1b 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -365,13 +365,56 @@ void Core::Entity::Player::returnToHomepoint() void Core::Entity::Player::setZone( uint32_t zoneId ) { - if( !g_territoryMgr.movePlayer( zoneId, getAsPlayer() ) ) return; sendZonePackets(); } +bool Core::Entity::Player::setInstance( uint32_t instanceContentId ) +{ + auto instance = g_territoryMgr.getTerritoryZonePtr( instanceContentId ); + if( !instance ) + return false; + + return setInstance( instance ); +} + +bool Core::Entity::Player::setInstance( ZonePtr instance ) +{ + if( !instance ) + return false; + + // zoning within the same zone won't cause the prev data to be overwritten + if( instance->getTerritoryId() != m_zoneId ) + { + m_prevPos = m_pos; + m_prevRot = m_rot; + m_prevZoneId = m_zoneId; + } + + if( !g_territoryMgr.movePlayer( instance, getAsPlayer() ) ) + return false; + + sendZonePackets(); + + return true; +} + +bool Core::Entity::Player::exitInstance() +{ + if( !g_territoryMgr.movePlayer( m_prevZoneId, getAsPlayer() ) ) + return false; + + m_pos = m_prevPos; + m_rot = m_prevRot; + m_zoneId = m_prevZoneId; + + sendZonePackets(); + + return true; +} + uint32_t Core::Entity::Player::getPlayTime() const { return m_playTime; diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index ad38e93b..3bb6f9e5 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -309,6 +309,12 @@ public: Common::OnlineStatus getOnlineStatus(); /*! sets the players zone, initiating a zoning process */ void setZone( uint32_t zoneId ); + /*! sets the players instance & initiates zoning process */ + bool setInstance( uint32_t instanceContentId ); + /*! sets the players instance & initiates zoning process */ + bool setInstance( ZonePtr instance ); + /*! returns the player to their position before zoning into an instance */ + bool exitInstance(); /*! sets the players territoryId */ void setTerritoryId( uint32_t territoryId ); /*! gets the players territoryId */ diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index cce0746d..da18fbd9 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -697,4 +697,8 @@ void Core::DebugCommandHandler::instance( char* data, Entity::Player &player, bo else player.sendDebug( "Failed to remove instance with id: " + std::to_string( terriId ) ); } + else if( subCommand == "return" || subCommand == "ret" ) + { + player.exitInstance(); + } } diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index 096e78e9..27d4e11d 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -406,6 +406,8 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac if( auto instance = g_territoryMgr.getTerritoryZonePtr( param1 ) ) { player.sendDebug( "Found instance: " + instance->getName() + ", id: " + std::to_string( param1 ) ); + + player.setInstance( instance ); } else if( !g_territoryMgr.isValidTerritory( param1 ) ) { diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index d85019c4..fff7f2e2 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -1 +1,12 @@ #include "InstanceContent.h" + +Core::InstanceContent::InstanceContent( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName, bool bPrivate = false ) + : Zone( territoryId, guId, internalName, placeName, bPrivate ) +{ + +} + +Core::InstanceContent::~InstanceContent() +{ + +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index e6e877b4..0133eed3 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -17,7 +17,7 @@ public: DutyFinished }; - InstanceContent( uint32_t instanceContentId, uint32_t guid ); + InstanceContent( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName, bool bPrivate ); virtual ~InstanceContent(); private: diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index c36ea728..56375cb9 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -8,6 +8,7 @@ #include "Zone.h" #include "ZonePosition.h" +#include "InstanceContent.h" extern Core::Logger g_log; extern Core::Data::ExdData g_exdData; @@ -143,7 +144,12 @@ Core::ZonePtr Core::TerritoryMgr::createTerritoryInstance( uint32_t territoryTyp g_log.debug( "Starting instance for territory: " + std::to_string( territoryTypeId ) + " (" + pPlaceName->name + ")" ); - ZonePtr pZone( new Zone( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name, false ) ); + ZonePtr pZone; + if( isInstanceContentTerritory( territoryTypeId ) ) + pZone = ZonePtr( new InstanceContent( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name, false ) ); + else + pZone = ZonePtr( new Zone( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name, false ) ); + pZone->init(); m_territoryInstanceMap[pZone->getTerritoryId()][pZone->getGuId()] = pZone; From 2ad9b0efaa2424ba6c396e374a7a697b17b64803 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 29 Jan 2018 18:10:11 +1100 Subject: [PATCH 3/7] remove isPrivate param from constructors --- .../sapphire_zone/Zone/InstanceContent.cpp | 4 ++-- src/servers/sapphire_zone/Zone/InstanceContent.h | 2 +- src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 6 +++--- src/servers/sapphire_zone/Zone/Zone.cpp | 16 +++++++--------- src/servers/sapphire_zone/Zone/Zone.h | 2 +- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index fff7f2e2..d5a78112 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -1,7 +1,7 @@ #include "InstanceContent.h" -Core::InstanceContent::InstanceContent( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName, bool bPrivate = false ) - : Zone( territoryId, guId, internalName, placeName, bPrivate ) +Core::InstanceContent::InstanceContent( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName ) + : Zone( territoryId, guId, internalName, placeName ) { } diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index 0133eed3..43a29c14 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -17,7 +17,7 @@ public: DutyFinished }; - InstanceContent( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName, bool bPrivate ); + InstanceContent( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName ); virtual ~InstanceContent(); private: diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 56375cb9..f707f53a 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -118,7 +118,7 @@ bool Core::TerritoryMgr::createDefaultTerritories() "\t" + territoryInfo->name + "\t" + pPlaceName->name ); - ZonePtr pZone( new Zone( territoryId, guid, territoryInfo->name, pPlaceName->name, false ) ); + ZonePtr pZone( new Zone( territoryId, guid, territoryInfo->name, pPlaceName->name ) ); pZone->init(); InstanceIdToZonePtrMap instanceMap; @@ -146,9 +146,9 @@ Core::ZonePtr Core::TerritoryMgr::createTerritoryInstance( uint32_t territoryTyp ZonePtr pZone; if( isInstanceContentTerritory( territoryTypeId ) ) - pZone = ZonePtr( new InstanceContent( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name, false ) ); + pZone = ZonePtr( new InstanceContent( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name ) ); else - pZone = ZonePtr( new Zone( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name, false ) ); + pZone = ZonePtr( new Zone( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name ) ); pZone->init(); diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index e994f249..0e11ccd5 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -43,7 +43,6 @@ namespace Core { Zone::Zone() : m_territoryId( 0 ) , m_guId( 0 ) - , m_bPrivate( false ) , m_type( Common::RegionType::normal ) , m_currentWeather( static_cast< uint8_t >( Common::Weather::FairSkies ) ) , m_weatherOverride( 0 ) @@ -51,7 +50,7 @@ Zone::Zone() { } -Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName, bool bPrivate = false ) +Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName ) : m_type( Common::RegionType::normal ) , m_currentWeather( static_cast< uint8_t >( Common::Weather::FairSkies ) ) { @@ -60,7 +59,6 @@ Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName m_territoryId = territoryId; m_internalName = internalName; m_placeName = placeName; - m_bPrivate = bPrivate; m_lastMobUpdate = 0; m_currentWeather = getNextWeather(); @@ -452,7 +450,7 @@ void Zone::updateBnpcs( int64_t tickCount ) for( auto entry : m_BattleNpcMap ) { Entity::BattleNpcPtr pBNpc = entry.second; - + if( !pBNpc ) continue; @@ -462,7 +460,7 @@ void Zone::updateBnpcs( int64_t tickCount ) m_BattleNpcDeadMap.insert( pBNpc ); break; } - + pBNpc->update( tickCount ); } @@ -476,13 +474,13 @@ bool Zone::runZoneLogic( uint32_t currTime ) bool changedWeather = checkWeather(); auto it = m_sessionSet.begin(); - + // update sessions in this zone for( ; it != m_sessionSet.end(); ) { auto pSession = ( *it ); - + if( !pSession ) { it = m_sessionSet.erase( it ); @@ -631,8 +629,8 @@ void Zone::changeActorPosition( Entity::ActorPtr pActor ) pActor->removeInRangeActor( *iter2 ); - // @TODO FIXME! - // this break is more or less a hack, iteration will break otherwise after removing + // @TODO FIXME! + // this break is more or less a hack, iteration will break otherwise after removing break; } } diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index c2caa2e3..dcc37506 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -52,7 +52,7 @@ protected: public: Zone(); - Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName, bool bPrivate ); + Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName ); virtual ~Zone(); bool init(); From cbefc4cc1f72af20a30ca6be58c0516178711239 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 29 Jan 2018 18:10:43 +1100 Subject: [PATCH 4/7] add some more mapped TerritoryIntendedUse values --- src/servers/sapphire_zone/Zone/TerritoryMgr.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index ce05982b..fe250fd9 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -49,7 +49,10 @@ namespace Core ChocoboTutorial = 21, Wedding = 22, BeginnerTutorial = 27, + FreeCompanyGarrison = 30, PalaceOfTheDead = 31, + TreasureMapInstance = 33, + EventArea = 40, }; TerritoryMgr(); @@ -84,6 +87,8 @@ namespace Core /*! creates a new instance for a given territoryTypeId */ ZonePtr createTerritoryInstance( uint32_t territoryTypeId ); + ZonePtr createInstanceContent( uint32_t instanceContentId ); + /*! removes instance by instanceId, return true if successful */ bool removeTerritoryInstance( uint32_t territoryTypeId ); From 56c6b38966b6d796b3bc48e0e4892bc02ffb66bb Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 29 Jan 2018 19:40:27 +1100 Subject: [PATCH 5/7] 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; From 0d0db3b41c17c412a077ec26b1f18cc23a8f7431 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 29 Jan 2018 20:40:32 +1100 Subject: [PATCH 6/7] correctly remove InstanceContent zones --- .../sapphire_zone/Zone/InstanceContent.cpp | 6 ++++-- .../sapphire_zone/Zone/InstanceContent.h | 9 ++++++++- .../sapphire_zone/Zone/TerritoryMgr.cpp | 18 +++++++++++++----- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index d0d7086e..a4d72600 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -3,9 +3,11 @@ Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceContent > pInstanceContent, uint32_t guId, const std::string& internalName, - const std::string& placeName ) + const std::string& placeName, + const uint32_t instanceContentId ) : Zone( pInstanceContent->territoryType, guId, internalName, placeName ), - m_instanceContentRow( pInstanceContent ) + m_instanceContentRow( pInstanceContent ), + m_instanceContentId( instanceContentId ) { } diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index f3bc5fc3..1478eb7b 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -21,7 +21,8 @@ public: InstanceContent( boost::shared_ptr< Core::Data::InstanceContent > pInstanceContent, uint32_t guId, const std::string& internalName, - const std::string& placeName ); + const std::string& placeName, + const uint32_t instanceContentId ); virtual ~InstanceContent(); boost::shared_ptr< Core::Data::InstanceContent > getInstanceContentRow() const @@ -29,9 +30,15 @@ public: return m_instanceContentRow; } + const uint32_t getInstanceContentId() + { + return m_instanceContentId; + } + private: Event::DirectorPtr m_pDirector; boost::shared_ptr< Core::Data::InstanceContent > m_instanceContentRow; + uint32_t m_instanceContentId; }; diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 47300066..015c9122 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -174,7 +174,7 @@ Core::ZonePtr Core::TerritoryMgr::createInstanceContent( uint32_t instanceConten 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 ) ); + ZonePtr pZone = ZonePtr( new InstanceContent( pInstanceContent, getNextInstanceId(), pTeri->name, pPlaceName->name, instanceContentId ) ); pZone->init(); m_instanceContentToInstanceMap[instanceContentId][pZone->getGuId()] = pZone; @@ -185,12 +185,20 @@ Core::ZonePtr Core::TerritoryMgr::createInstanceContent( uint32_t instanceConten bool Core::TerritoryMgr::removeTerritoryInstance( uint32_t instanceId ) { - ZonePtr instance; - if( ( instance = getInstanceZonePtr( instanceId ) ) == nullptr ) + ZonePtr pZone; + if( ( pZone = getInstanceZonePtr( instanceId ) ) == nullptr ) return false; - m_instanceIdToZonePtrMap.erase( instance->getGuId() ); - m_territoryInstanceMap[instance->getTerritoryId()].erase( instance->getGuId() ); + m_instanceIdToZonePtrMap.erase( pZone->getGuId() ); + + if( isInstanceContentTerritory( pZone->getTerritoryId() ) ) + { + auto instance = boost::dynamic_pointer_cast< InstanceContent >( pZone ); + m_instanceContentToInstanceMap[instance->getInstanceContentId()].erase( pZone->getGuId() ); + } + else + m_territoryInstanceMap[pZone->getTerritoryId()].erase( pZone->getGuId() ); + return true; } From 155041498393ef275c8bc3549aa7af6bf512b05e Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 29 Jan 2018 20:41:24 +1100 Subject: [PATCH 7/7] return players to last zone if the instance doesnt exist --- src/servers/sapphire_zone/Actor/Player.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 7e271f93..fa8c1d3b 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -366,7 +366,15 @@ void Core::Entity::Player::returnToHomepoint() void Core::Entity::Player::setZone( uint32_t zoneId ) { if( !g_territoryMgr.movePlayer( zoneId, getAsPlayer() ) ) - return; + { + // todo: this will require proper handling, for now just return the player to their previous area + m_pos = m_prevPos; + m_rot = m_prevRot; + m_zoneId = m_prevZoneId; + + if( !g_territoryMgr.movePlayer( m_zoneId, getAsPlayer() ) ) + return; + } sendZonePackets(); }