mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-26 14:37:44 +00:00
QuestBattles can now be started from scripts, see ManFst005
This commit is contained in:
parent
022cf1d439
commit
13ce1b47d0
3 changed files with 39 additions and 5 deletions
|
@ -1,5 +1,6 @@
|
|||
#include <Actor/Player.h>
|
||||
#include "Manager/EventMgr.h"
|
||||
#include "Manager/TerritoryMgr.h"
|
||||
#include <ScriptObject.h>
|
||||
#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 );
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue