diff --git a/src/world/Actor/EventObject.cpp b/src/world/Actor/EventObject.cpp index fedb6d99..b8829d30 100644 --- a/src/world/Actor/EventObject.cpp +++ b/src/world/Actor/EventObject.cpp @@ -102,12 +102,12 @@ uint32_t Sapphire::Entity::EventObject::getHousingLink() const return m_housingLink; } -void Sapphire::Entity::EventObject::setParentInstance( Sapphire::InstanceContentPtr instance ) +void Sapphire::Entity::EventObject::setParentInstance( Sapphire::ZonePtr instance ) { m_parentInstance = instance; } -Sapphire::InstanceContentPtr Sapphire::Entity::EventObject::getParentInstance() const +Sapphire::ZonePtr Sapphire::Entity::EventObject::getParentInstance() const { return m_parentInstance; } diff --git a/src/world/Actor/EventObject.h b/src/world/Actor/EventObject.h index ad6d8bc0..5e99256d 100644 --- a/src/world/Actor/EventObject.h +++ b/src/world/Actor/EventObject.h @@ -13,7 +13,7 @@ namespace Sapphire::Entity Common::FFXIVARR_POSITION3 pos, float rotation, const std::string& givenName = "none" ); using OnTalkEventHandler = std::function< void( Entity::Player&, Entity::EventObjectPtr, - InstanceContentPtr, uint64_t ) >; + ZonePtr, uint64_t ) >; uint32_t getGimmickId() const; @@ -35,9 +35,9 @@ namespace Sapphire::Entity const std::string& getName() const; - InstanceContentPtr getParentInstance() const; + ZonePtr getParentInstance() const; - void setParentInstance( InstanceContentPtr instance ); + void setParentInstance( ZonePtr instance ); void spawn( PlayerPtr pTarget ) override; @@ -56,7 +56,7 @@ namespace Sapphire::Entity uint8_t m_state; float m_scale; std::string m_name; - InstanceContentPtr m_parentInstance; + ZonePtr m_parentInstance; OnTalkEventHandler m_onTalkEventHandler; diff --git a/src/world/Script/ScriptMgr.cpp b/src/world/Script/ScriptMgr.cpp index e1512e01..9e7e85f5 100644 --- a/src/world/Script/ScriptMgr.cpp +++ b/src/world/Script/ScriptMgr.cpp @@ -5,6 +5,7 @@ #include "Territory/Zone.h" #include "Territory/InstanceContent.h" +#include "Territory/QuestBattle.h" #include "Actor/Player.h" #include "Actor/EventObject.h" #include "ServerMgr.h" @@ -461,6 +462,44 @@ bool Sapphire::Scripting::ScriptMgr::onInstanceEnterTerritory( InstanceContentPt return false; } +bool Sapphire::Scripting::ScriptMgr::onInstanceInit( QuestBattlePtr instance ) +{ + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::QuestBattleScript >( instance->getDirectorId() ); + if( script ) + { + script->onInit( *instance ); + return true; + } + + return false; +} + +bool Sapphire::Scripting::ScriptMgr::onInstanceUpdate( QuestBattlePtr instance, uint32_t currTime ) +{ + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::QuestBattleScript >( instance->getDirectorId() ); + + if( script ) + { + script->onUpdate( *instance, currTime ); + return true; + } + + return false; +} + +bool Sapphire::Scripting::ScriptMgr::onInstanceEnterTerritory( QuestBattlePtr instance, Entity::Player& player, + uint32_t eventId, uint16_t param1, uint16_t param2 ) +{ + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::QuestBattleScript >( instance->getDirectorId() ); + if( script ) + { + script->onEnterTerritory( *instance, player, eventId, param1, param2 ); + return true; + } + + return false; +} + Sapphire::Scripting::NativeScriptMgr& Sapphire::Scripting::ScriptMgr::getNativeScriptHandler() { return *m_nativeScriptMgr; diff --git a/src/world/Script/ScriptMgr.h b/src/world/Script/ScriptMgr.h index 10d676a6..97e3b345 100644 --- a/src/world/Script/ScriptMgr.h +++ b/src/world/Script/ScriptMgr.h @@ -100,6 +100,13 @@ namespace Sapphire::Scripting onInstanceEnterTerritory( InstanceContentPtr instance, Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ); + bool onInstanceInit( QuestBattlePtr instance ); + + bool onInstanceUpdate( QuestBattlePtr instance, uint32_t currTime ); + + bool onInstanceEnterTerritory( QuestBattlePtr instance, Entity::Player& player, uint32_t eventId, uint16_t param1, + uint16_t param2 ); + bool loadDir( const std::string& dirname, std::set< std::string >& files, const std::string& ext ); NativeScriptMgr& getNativeScriptHandler(); diff --git a/src/world/Territory/InstanceContent.h b/src/world/Territory/InstanceContent.h index 85a34ebc..adacd08b 100644 --- a/src/world/Territory/InstanceContent.h +++ b/src/world/Territory/InstanceContent.h @@ -5,116 +5,119 @@ #include "Event/Director.h" #include "Forwards.h" -namespace Sapphire { -namespace Data { -struct InstanceContent; -} -class InstanceContent : public Event::Director, public Zone +namespace Sapphire::Data { -public: - enum InstanceContentState + struct InstanceContent; +} + +namespace Sapphire +{ + class InstanceContent : public Event::Director, public Zone { - Created, - DutyReset, - DutyInProgress, - DutyFinished + public: + enum InstanceContentState + { + Created, + DutyReset, + DutyInProgress, + DutyFinished + }; + + InstanceContent( std::shared_ptr< Sapphire::Data::InstanceContent > pInstanceConfiguration, + uint16_t territoryType, + uint32_t guId, + const std::string& internalName, + const std::string& contentName, + uint32_t instanceContentId, + FrameworkPtr pFw ); + + virtual ~InstanceContent(); + + bool init() override; + + void onBeforePlayerZoneIn( Entity::Player& player ) override; + + void onPlayerZoneIn( Entity::Player& player ) override; + + void onLeaveTerritory( Entity::Player& player ) override; + + void onFinishLoading( Entity::Player& player ) override; + + void onInitDirector( Entity::Player& player ) override; + + void onDirectorSync( Entity::Player& player ) override; + + void onUpdate( uint32_t currTime ) override; + + void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); + + void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override; + + void onRegisterEObj( Entity::EventObjectPtr object ) override; + + void setVar( uint8_t index, uint8_t value ); + + void setSequence( uint8_t value ); + + void setBranch( uint8_t value ); + + void startQte(); + + void startEventCutscene(); + + void endEventCutscene(); + + void clearDirector( Entity::Player& player ); + + /*! set the current bgm index (inside bgm.exd) */ + void setCurrentBGM( uint16_t bgmId ); + + /*! set the current bgm for a specific player */ + void setPlayerBGM( Entity::Player& player, uint16_t bgmId ); + + /*! get the currently playing bgm index */ + uint16_t getCurrentBGM() const; + + bool hasPlayerPreviouslySpawned( Entity::Player& player ) const; + + InstanceContentState getState() const; + + std::shared_ptr< Sapphire::Data::InstanceContent > getInstanceConfiguration() const; + + uint32_t getInstanceContentId() const; + + Entity::EventObjectPtr getEObjByName( const std::string& name ); + + /*! binds a player to the instance */ + bool bindPlayer( uint32_t playerId ); + + /*! removes bind of player from the instance */ + void unbindPlayer( uint32_t playerId ); + + /*! return true if the player is bound to the instance */ + bool isPlayerBound( uint32_t playerId ) const; + + /*! number of milliseconds after all players are ready for the instance to commence (spawn circle removed) */ + const uint32_t instanceStartDelay = 1250; + + private: + std::shared_ptr< Sapphire::Data::InstanceContent > m_instanceConfiguration; + uint32_t m_instanceContentId; + InstanceContentState m_state; + uint16_t m_currentBgm; + + int64_t m_instanceExpireTime; + uint64_t m_instanceCommenceTime; + + Entity::EventObjectPtr m_pEntranceEObj; + + std::map< std::string, Entity::EventObjectPtr > m_eventObjectMap; + std::unordered_map< uint32_t, Entity::EventObjectPtr > m_eventIdToObjectMap; + std::set< uint32_t > m_spawnedPlayers; + + // the players which are bound to the instance, regardless of inside or offline + std::set< uint32_t > m_boundPlayerIds; }; - InstanceContent( std::shared_ptr< Sapphire::Data::InstanceContent > pInstanceConfiguration, - uint16_t territoryType, - uint32_t guId, - const std::string& internalName, - const std::string& contentName, - uint32_t instanceContentId, - FrameworkPtr pFw ); - - virtual ~InstanceContent(); - - bool init() override; - - void onBeforePlayerZoneIn( Entity::Player& player ) override; - - void onPlayerZoneIn( Entity::Player& player ) override; - - void onLeaveTerritory( Entity::Player& player ) override; - - void onFinishLoading( Entity::Player& player ) override; - - void onInitDirector( Entity::Player& player ) override; - - void onDirectorSync( Entity::Player& player ) override; - - void onUpdate( uint32_t currTime ) override; - - void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); - - void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override; - - void onRegisterEObj( Entity::EventObjectPtr object ) override; - - void setVar( uint8_t index, uint8_t value ); - - void setSequence( uint8_t value ); - - void setBranch( uint8_t value ); - - void startQte(); - - void startEventCutscene(); - - void endEventCutscene(); - - void clearDirector( Entity::Player& player ); - - /*! set the current bgm index (inside bgm.exd) */ - void setCurrentBGM( uint16_t bgmId ); - - /*! set the current bgm for a specific player */ - void setPlayerBGM( Entity::Player& player, uint16_t bgmId ); - - /*! get the currently playing bgm index */ - uint16_t getCurrentBGM() const; - - bool hasPlayerPreviouslySpawned( Entity::Player& player ) const; - - InstanceContentState getState() const; - - std::shared_ptr< Sapphire::Data::InstanceContent > getInstanceConfiguration() const; - - uint32_t getInstanceContentId() const; - - Entity::EventObjectPtr getEObjByName( const std::string& name ); - - /*! binds a player to the instance */ - bool bindPlayer( uint32_t playerId ); - - /*! removes bind of player from the instance */ - void unbindPlayer( uint32_t playerId ); - - /*! return true if the player is bound to the instance */ - bool isPlayerBound( uint32_t playerId ) const; - - /*! number of milliseconds after all players are ready for the instance to commence (spawn circle removed) */ - const uint32_t instanceStartDelay = 1250; - -private: - std::shared_ptr< Sapphire::Data::InstanceContent > m_instanceConfiguration; - uint32_t m_instanceContentId; - InstanceContentState m_state; - uint16_t m_currentBgm; - - int64_t m_instanceExpireTime; - uint64_t m_instanceCommenceTime; - - Entity::EventObjectPtr m_pEntranceEObj; - - std::map< std::string, Entity::EventObjectPtr > m_eventObjectMap; - std::unordered_map< uint32_t, Entity::EventObjectPtr > m_eventIdToObjectMap; - std::set< uint32_t > m_spawnedPlayers; - - // the players which are bound to the instance, regardless of inside or offline - std::set< uint32_t > m_boundPlayerIds; -}; - } #endif //SAPPHIRE_INSTANCECONTENT_H diff --git a/src/world/Territory/QuestBattle.cpp b/src/world/Territory/QuestBattle.cpp index 4bf602b8..97a83fe9 100644 --- a/src/world/Territory/QuestBattle.cpp +++ b/src/world/Territory/QuestBattle.cpp @@ -48,7 +48,7 @@ Sapphire::QuestBattle::QuestBattle( std::shared_ptr< Sapphire::Data::QuestBattle bool Sapphire::QuestBattle::init() { auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); - pScriptMgr->onInstanceInit( getAsInstanceContent() ); + pScriptMgr->onInstanceInit( getAsQuestBattle() ); return true; } @@ -152,7 +152,7 @@ void Sapphire::QuestBattle::onUpdate( uint32_t currTime ) } auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); - pScriptMgr->onInstanceUpdate( getAsInstanceContent(), currTime ); + pScriptMgr->onInstanceUpdate( getAsQuestBattle(), currTime ); } void Sapphire::QuestBattle::onFinishLoading( Entity::Player& player ) @@ -348,8 +348,8 @@ void Sapphire::QuestBattle::onTalk( Sapphire::Entity::Player& player, uint32_t e if( it == m_eventIdToObjectMap.end() ) return; - if( auto onTalk = it->second->getOnTalkHandler() ) - onTalk( player, it->second, getAsInstanceContent(), actorId ); + if( auto onTalkHandler = it->second->getOnTalkHandler() ) + onTalkHandler( player, it->second, getAsQuestBattle(), actorId ); else player.sendDebug( "No onTalk handler found for interactable eobj with EObjID#{0}, eventId#{1} ", it->second->getObjectId(), eventId ); @@ -359,7 +359,7 @@ void Sapphire::QuestBattle::onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); - pScriptMgr->onInstanceEnterTerritory( getAsInstanceContent(), player, eventId, param1, param2 ); + pScriptMgr->onInstanceEnterTerritory( getAsQuestBattle(), player, eventId, param1, param2 ); // TODO: this may or may not be correct for questbattles player.directorPlayScene( getDirectorId(), 1, NO_DEFAULT_CAMERA | CONDITION_CUTSCENE | SILENT_ENTER_TERRI_ENV | diff --git a/src/world/Territory/QuestBattle.h b/src/world/Territory/QuestBattle.h index ab43c989..4530f72c 100644 --- a/src/world/Territory/QuestBattle.h +++ b/src/world/Territory/QuestBattle.h @@ -5,104 +5,107 @@ #include "Event/Director.h" #include "Forwards.h" -namespace Sapphire { -namespace Data { +namespace Sapphire::Data +{ struct QuestBattle; } -class QuestBattle : public Event::Director, public Zone + +namespace Sapphire { -public: - QuestBattle( std::shared_ptr< Sapphire::Data::QuestBattle > pBattleDetails, - uint16_t territoryType, - uint32_t guId, - const std::string& internalName, - const std::string& contentName, - uint32_t questBattleId, - FrameworkPtr pFw ); + class QuestBattle : public Event::Director, public Zone + { + public: + QuestBattle( std::shared_ptr< Sapphire::Data::QuestBattle > pBattleDetails, + uint16_t territoryType, + uint32_t guId, + const std::string& internalName, + const std::string& contentName, + uint32_t questBattleId, + FrameworkPtr pFw ); - virtual ~QuestBattle(); + virtual ~QuestBattle(); - bool init() override; + bool init() override; - void onBeforePlayerZoneIn( Entity::Player& player ) override; + void onBeforePlayerZoneIn( Entity::Player& player ) override; - void onPlayerZoneIn( Entity::Player& player ) override; + void onPlayerZoneIn( Entity::Player& player ) override; - void onLeaveTerritory( Entity::Player& player ) override; + void onLeaveTerritory( Entity::Player& player ) override; - void onFinishLoading( Entity::Player& player ) override; + void onFinishLoading( Entity::Player& player ) override; - void onInitDirector( Entity::Player& player ) override; + void onInitDirector( Entity::Player& player ) override; - void onDirectorSync( Entity::Player& player ) override; + void onDirectorSync( Entity::Player& player ) override; - void onUpdate( uint32_t currTime ) override; + void onUpdate( uint32_t currTime ) override; - void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); + void onTalk( Entity::Player& player, uint32_t eventId, uint64_t actorId ); - void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override; + void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override; - void onRegisterEObj( Entity::EventObjectPtr object ) override; + void onRegisterEObj( Entity::EventObjectPtr object ) override; - void setVar( uint8_t index, uint8_t value ); + void setVar( uint8_t index, uint8_t value ); - void setSequence( uint8_t value ); + void setSequence( uint8_t value ); - void setBranch( uint8_t value ); + void setBranch( uint8_t value ); - void startQte(); + void startQte(); - void startEventCutscene(); + void startEventCutscene(); - void endEventCutscene(); + void endEventCutscene(); - void clearDirector( Entity::Player& player ); + void clearDirector( Entity::Player& player ); - /*! set the current bgm index (inside bgm.exd) */ - void setCurrentBGM( uint16_t bgmId ); + /*! set the current bgm index (inside bgm.exd) */ + void setCurrentBGM( uint16_t bgmId ); - /*! set the current bgm for a specific player */ - void setPlayerBGM( Entity::Player& player, uint16_t bgmId ); + /*! set the current bgm for a specific player */ + void setPlayerBGM( Entity::Player& player, uint16_t bgmId ); - /*! get the currently playing bgm index */ - uint16_t getCurrentBGM() const; + /*! get the currently playing bgm index */ + uint16_t getCurrentBGM() const; - Event::Director::DirectorState getState() const; + Event::Director::DirectorState getState() const; - std::shared_ptr< Sapphire::Data::QuestBattle > getQuestBattleDetails() const; + std::shared_ptr< Sapphire::Data::QuestBattle > getQuestBattleDetails() const; - uint32_t getQuestBattleId() const; + uint32_t getQuestBattleId() const; - Entity::EventObjectPtr getEObjByName( const std::string& name ); + Entity::EventObjectPtr getEObjByName( const std::string& name ); - /*! binds a player to the instance */ - bool bindPlayer( uint32_t playerId ); + /*! binds a player to the instance */ + bool bindPlayer( uint32_t playerId ); - /*! removes bind of player from the instance */ - void unbindPlayer( uint32_t playerId ); + /*! removes bind of player from the instance */ + void unbindPlayer( uint32_t playerId ); - /*! return true if the player is bound to the instance */ - bool isPlayerBound( uint32_t playerId ) const; + /*! return true if the player is bound to the instance */ + bool isPlayerBound( uint32_t playerId ) const; - /*! number of milliseconds after all players are ready for the instance to commence (spawn circle removed) */ - const uint32_t instanceStartDelay = 1250; + /*! number of milliseconds after all players are ready for the instance to commence (spawn circle removed) */ + const uint32_t instanceStartDelay = 1250; -private: - std::shared_ptr< Sapphire::Data::QuestBattle > m_pBattleDetails; - uint32_t m_questBattleId; - Event::Director::DirectorState m_state; - uint16_t m_currentBgm; + private: + std::shared_ptr< Sapphire::Data::QuestBattle > m_pBattleDetails; + uint32_t m_questBattleId; + Event::Director::DirectorState m_state; + uint16_t m_currentBgm; - int64_t m_instanceExpireTime; - uint64_t m_instanceCommenceTime; + int64_t m_instanceExpireTime; + uint64_t m_instanceCommenceTime; - std::map< std::string, Entity::EventObjectPtr > m_eventObjectMap; - std::unordered_map< uint32_t, Entity::EventObjectPtr > m_eventIdToObjectMap; - std::set< uint32_t > m_spawnedPlayers; + std::map< std::string, Entity::EventObjectPtr > m_eventObjectMap; + std::unordered_map< uint32_t, Entity::EventObjectPtr > m_eventIdToObjectMap; + std::set< uint32_t > m_spawnedPlayers; - // the players which are bound to the instance, regardless of inside or offline - std::set< uint32_t > m_boundPlayerIds; -}; + // the players which are bound to the instance, regardless of inside or offline + std::set< uint32_t > m_boundPlayerIds; + }; } #endif diff --git a/src/world/Territory/Zone.cpp b/src/world/Territory/Zone.cpp index 275377b1..bf55866e 100644 --- a/src/world/Territory/Zone.cpp +++ b/src/world/Territory/Zone.cpp @@ -17,6 +17,7 @@ #include "Zone.h" #include "InstanceContent.h" +#include "QuestBattle.h" #include "Manager/TerritoryMgr.h" #include "Session.h" @@ -749,6 +750,11 @@ Sapphire::InstanceContentPtr Sapphire::Zone::getAsInstanceContent() return std::dynamic_pointer_cast< InstanceContent, Zone >( shared_from_this() ); } +Sapphire::QuestBattlePtr Sapphire::Zone::getAsQuestBattle() +{ + return std::dynamic_pointer_cast< QuestBattle, Zone >( shared_from_this() ); +} + uint32_t Sapphire::Zone::getNextEObjId() { return ++m_nextEObjId; diff --git a/src/world/Territory/Zone.h b/src/world/Territory/Zone.h index 6cc085bd..cf0fddfa 100644 --- a/src/world/Territory/Zone.h +++ b/src/world/Territory/Zone.h @@ -161,6 +161,8 @@ namespace Sapphire InstanceContentPtr getAsInstanceContent(); + QuestBattlePtr getAsQuestBattle(); + void updateSpawnPoints(); uint32_t getNextEffectSequence();