From 13ce1b47d0f56792431ff6f48972b8fa30aba7a4 Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 11 Apr 2019 00:16:04 +0200 Subject: [PATCH] QuestBattles can now be started from scripts, see ManFst005 --- src/scripts/quest/ManFst005.cpp | 7 ++++++- src/world/Manager/TerritoryMgr.cpp | 31 ++++++++++++++++++++++++++---- src/world/Manager/TerritoryMgr.h | 6 ++++++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/scripts/quest/ManFst005.cpp b/src/scripts/quest/ManFst005.cpp index ae3610a4..1089248b 100644 --- a/src/scripts/quest/ManFst005.cpp +++ b/src/scripts/quest/ManFst005.cpp @@ -1,5 +1,6 @@ #include #include "Manager/EventMgr.h" +#include "Manager/TerritoryMgr.h" #include #include "Framework.h" @@ -141,7 +142,11 @@ class ManFst005 : public Sapphire::ScriptAPI::EventScript { if( result.param2 == 1 ) { - // enter instance + auto pTeriMgr = framework()->get< Sapphire::World::Manager::TerritoryMgr >(); + if( !pTeriMgr ) + return; + player.eventFinish( result.eventId, 0 ); + pTeriMgr->createAndJoinQuestBattle( player, Questbattle0 ); } } ); } diff --git a/src/world/Manager/TerritoryMgr.cpp b/src/world/Manager/TerritoryMgr.cpp index d80bff60..0ad37bd1 100644 --- a/src/world/Manager/TerritoryMgr.cpp +++ b/src/world/Manager/TerritoryMgr.cpp @@ -40,6 +40,15 @@ void Sapphire::World::Manager::TerritoryMgr::loadTerritoryTypeDetailCache() if( !teri1->name.empty() ) m_territoryTypeDetailCacheMap[ id ] = teri1; } + + for( auto id : pExdData->getContentFinderConditionIdList() ) + { + auto cfc = pExdData->get< Sapphire::Data::ContentFinderCondition >( id ); + if( !cfc || cfc->contentLinkType != 5 ) + continue; + + m_questBattleToContentFinderMap[ cfc->content ] = id; + } } bool Sapphire::World::Manager::TerritoryMgr::isValidTerritory( uint32_t territoryTypeId ) const @@ -273,16 +282,20 @@ Sapphire::ZonePtr Sapphire::World::Manager::TerritoryMgr::createTerritoryInstanc return pZone; } -Sapphire::ZonePtr Sapphire::World::Manager::TerritoryMgr::createQuestBattle( uint32_t contentFinderConditionId ) +Sapphire::ZonePtr Sapphire::World::Manager::TerritoryMgr::createQuestBattle( uint32_t questBattleId ) { + auto it = m_questBattleToContentFinderMap.find( questBattleId ); + if( it == m_questBattleToContentFinderMap.end() ) + return nullptr; + + auto contentFinderConditionId = it->second; + auto pExdData = framework()->get< Data::ExdDataGenerated >(); auto pContentFinderCondition = pExdData->get< Sapphire::Data::ContentFinderCondition >( contentFinderConditionId ); if( !pContentFinderCondition ) return nullptr; - auto questBattleId = pContentFinderCondition->content; - auto pQuestBattleInfo = pExdData->get< Sapphire::Data::QuestBattle >( questBattleId ); if( !pQuestBattleInfo ) return nullptr; @@ -299,7 +312,7 @@ Sapphire::ZonePtr Sapphire::World::Manager::TerritoryMgr::createQuestBattle( uin if( !pTeri || pQuestInfo->name.empty() ) return nullptr; - Logger::debug( "Starting instance for InstanceContent id: {0} ({1})", questBattleId, pQuestInfo->name ); + Logger::debug( "Starting instance for QuestBattle id: {0} ({1})", questBattleId, pQuestInfo->name ); auto pZone = make_QuestBattle( pQuestBattleInfo, pContentFinderCondition->territoryType, getNextInstanceId(), pTeri->name, pQuestInfo->name, questBattleId, framework() ); @@ -662,4 +675,14 @@ float Sapphire::World::Manager::TerritoryMgr::getInRangeDistance() const return m_inRangeDistance; } +void Sapphire::World::Manager::TerritoryMgr::createAndJoinQuestBattle( Entity::Player& player, uint16_t questBattleId ) +{ + auto qb = createQuestBattle( questBattleId ); + if( !qb ) + return; + + player.setInstance( qb ); + +} + diff --git a/src/world/Manager/TerritoryMgr.h b/src/world/Manager/TerritoryMgr.h index 22354fe4..b9628756 100644 --- a/src/world/Manager/TerritoryMgr.h +++ b/src/world/Manager/TerritoryMgr.h @@ -108,6 +108,8 @@ namespace Sapphire::World::Manager ZonePtr createQuestBattle( uint32_t contentFinderConditionId ); + void createAndJoinQuestBattle( Entity::Player& player, uint16_t contentFinderConditionId ); + ZonePtr findOrCreateHousingInterior( const Common::LandIdent landIdent ); /*! removes instance by instanceId, return true if successful */ @@ -166,6 +168,7 @@ namespace Sapphire::World::Manager using TerritoryTypeIdToInstanceMap = std::unordered_map< uint16_t, InstanceIdToZonePtrMap >; using InstanceContentIdToInstanceMap = std::unordered_map< uint16_t, InstanceIdToZonePtrMap >; using QuestBattleIdToInstanceMap = std::unordered_map< uint16_t, InstanceIdToZonePtrMap >; + using QuestBattleIdToContentFinderCondMap = std::unordered_map< uint16_t, uint16_t >; using PlayerIdToInstanceIdMap = std::unordered_map< uint32_t, uint32_t >; using PositionMap = std::unordered_map< int32_t, ZonePositionPtr >; using InstanceIdList = std::vector< uint32_t >; @@ -213,6 +216,9 @@ namespace Sapphire::World::Manager /*! Max distance at which actors in range of a player are sent */ float m_inRangeDistance; + /*! Map used to find a contentFinderConditionID to a questBattle */ + QuestBattleIdToContentFinderCondMap m_questBattleToContentFinderMap; + public: /*! returns a list of instanceContent InstanceIds currently active */ InstanceIdList getInstanceContentIdList( uint16_t instanceContentId ) const;