diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 5b44a401..65ab2fe5 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -73,7 +73,8 @@ Core::Entity::Player::Player() : m_markedForRemoval( false ), m_mount( 0 ), m_directorInitialized( false ), - m_objCount( 0 ) + m_objCount( 0 ), + m_onEnterEventDone( false ) { m_id = 0; m_currentStance = Stance::Passive; @@ -359,6 +360,7 @@ void Core::Entity::Player::returnToHomepoint() void Core::Entity::Player::setZone( uint32_t zoneId ) { + m_onEnterEventDone = false; if( !g_territoryMgr.movePlayer( zoneId, getAsPlayer() ) ) { // todo: this will require proper handling, for now just return the player to their previous area @@ -375,6 +377,7 @@ void Core::Entity::Player::setZone( uint32_t zoneId ) bool Core::Entity::Player::setInstance( uint32_t instanceContentId ) { + m_onEnterEventDone = false; auto instance = g_territoryMgr.getInstanceZonePtr( instanceContentId ); if( !instance ) return false; @@ -384,6 +387,7 @@ bool Core::Entity::Player::setInstance( uint32_t instanceContentId ) bool Core::Entity::Player::setInstance( ZonePtr instance ) { + m_onEnterEventDone = false; if( !instance ) return false; @@ -1620,12 +1624,12 @@ void Core::Entity::Player::finishZoning() unsetStateFlag( PlayerStateFlag::BetweenAreas ); } -void Player::emote( uint32_t emoteId, uint64_t targetId ) +void Core::Entity::Player::emote( uint32_t emoteId, uint64_t targetId ) { sendToInRangeSet( ActorControlPacket144( getId(), ActorControlType::Emote, emoteId, 0, 0, 0, targetId ) ); } -void Player::teleportQuery( uint16_t aetheryteId ) +void Core::Entity::Player::teleportQuery( uint16_t aetheryteId ) { // TODO: only register this action if enough gil is in possession auto targetAetheryte = g_exdDataGen.get< Core::Data::Aetheryte >( aetheryteId ); @@ -1655,7 +1659,17 @@ void Player::teleportQuery( uint16_t aetheryteId ) } } -uint8_t Player::getNextObjCount() +uint8_t Core::Entity::Player::getNextObjCount() { return m_objCount++; -} \ No newline at end of file +} + +void Core::Entity::Player::setOnEnterEventDone( bool isDone ) +{ + m_onEnterEventDone = isDone; +} + +bool Core::Entity::Player::isOnEnterEventDone() const +{ + return m_onEnterEventDone; +} diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index a5681055..7f362e6a 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -559,6 +559,9 @@ public: void setMarkedForRemoval(); bool isMarkedForRemoval() const; + void setOnEnterEventDone( bool isDone ); + bool isOnEnterEventDone() const; + uint8_t getNextObjCount(); private: @@ -575,6 +578,8 @@ private: bool m_directorInitialized; + bool m_onEnterEventDone; + private: Common::FFXIVARR_POSITION3 m_prevPos; diff --git a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp index 9739756a..0b4fee82 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp @@ -82,11 +82,14 @@ enum ClientTrigger AchievementCrit = 0x202, AchievementComp = 0x203, AchievementCatChat = 0x206, - + + + DirectorInitFinish = 0x321, + + EnterTerritoryEventFinished = 0x330, + AchievementCritReq = 0x3E8, AchievementList = 0x3E9, - - DirectorInitFinish = 0x321, CompanionAction = 0x6A4, CompanionSetBarding = 0x6A5, @@ -248,6 +251,12 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in player.getCurrentZone()->onInitDirector( player ); break; } + case ClientTrigger::EnterTerritoryEventFinished: + { + g_log.debug( "[DOOOOOOOOOOOOOOOOOOOOOOONE]" ); + player.setOnEnterEventDone( true ); + break; + } default: { g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Unhandled action: " + diff --git a/src/servers/sapphire_zone/Script/NativeScriptApi.h b/src/servers/sapphire_zone/Script/NativeScriptApi.h index 22c5485b..058195c6 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptApi.h +++ b/src/servers/sapphire_zone/Script/NativeScriptApi.h @@ -122,6 +122,7 @@ public: virtual void onInit( InstanceContentPtr instance ) { } virtual void onUpdate( InstanceContentPtr instance, uint32_t currTime ) { } + virtual void onEnterTerritory( Entity::Player &player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { } }; #endif \ No newline at end of file diff --git a/src/servers/sapphire_zone/Script/Scripts/instances/trials/TheNavel.cpp b/src/servers/sapphire_zone/Script/Scripts/instances/trials/TheNavel.cpp index f57654b5..b5a5a83a 100644 --- a/src/servers/sapphire_zone/Script/Scripts/instances/trials/TheNavel.cpp +++ b/src/servers/sapphire_zone/Script/Scripts/instances/trials/TheNavel.cpp @@ -23,6 +23,11 @@ public: } + void onEnterTerritory( Entity::Player &player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override + { + + } + private: static constexpr auto EXIT_OBJECT = 2000139; static constexpr auto EXIT_OBJECT_STATE = 4; diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index d2f553a4..ee0a032a 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -99,7 +99,9 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) for( const auto &playerIt : m_playerMap ) { - if( !playerIt.second->isLoadingComplete() || !playerIt.second->isDirectorInitialized() ) + if( !playerIt.second->isLoadingComplete() || + !playerIt.second->isDirectorInitialized() || + !playerIt.second->isOnEnterEventDone() ) return; } @@ -135,8 +137,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) void Core::InstanceContent::onFinishLoading( Entity::Player& player ) { - if( m_state != Created ) - sendDirectorInit( player ); + sendDirectorInit( player ); } void Core::InstanceContent::onInitDirector( Entity::Player& player ) @@ -232,9 +233,15 @@ void Core::InstanceContent::onRegisterEObj( Entity::EventObjectPtr object ) void Core::InstanceContent::onBeforeEnterTerritory( Core::Entity::Player &player ) { if( m_pEntranceEObj != nullptr ) + { + player.setRot( PI ); player.setPos( m_pEntranceEObj->getPos() ); + } else + { + player.setRot( PI ); player.setPos( { 0.f, 0.f, 0.f } ); + } } Core::Entity::EventObjectPtr Core::InstanceContent::getEObjByName( const std::string &name )