1
Fork 0
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:
Mordred 2019-04-11 00:16:04 +02:00
parent 022cf1d439
commit 13ce1b47d0
3 changed files with 39 additions and 5 deletions

View file

@ -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 );
}
} );
}

View file

@ -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 );
}

View file

@ -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;