1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-25 05:57:45 +00:00

Improved timing on instance starting

This commit is contained in:
Mordred 2018-02-24 23:53:32 +01:00
parent 2b3512ad64
commit 2ce7d91096
6 changed files with 52 additions and 11 deletions

View file

@ -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++;
}
}
void Core::Entity::Player::setOnEnterEventDone( bool isDone )
{
m_onEnterEventDone = isDone;
}
bool Core::Entity::Player::isOnEnterEventDone() const
{
return m_onEnterEventDone;
}

View file

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

View file

@ -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: " +

View file

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

View file

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

View file

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