mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-25 14:07:46 +00:00
Improved timing on instance starting
This commit is contained in:
parent
2b3512ad64
commit
2ce7d91096
6 changed files with 52 additions and 11 deletions
|
@ -73,7 +73,8 @@ Core::Entity::Player::Player() :
|
||||||
m_markedForRemoval( false ),
|
m_markedForRemoval( false ),
|
||||||
m_mount( 0 ),
|
m_mount( 0 ),
|
||||||
m_directorInitialized( false ),
|
m_directorInitialized( false ),
|
||||||
m_objCount( 0 )
|
m_objCount( 0 ),
|
||||||
|
m_onEnterEventDone( false )
|
||||||
{
|
{
|
||||||
m_id = 0;
|
m_id = 0;
|
||||||
m_currentStance = Stance::Passive;
|
m_currentStance = Stance::Passive;
|
||||||
|
@ -359,6 +360,7 @@ void Core::Entity::Player::returnToHomepoint()
|
||||||
|
|
||||||
void Core::Entity::Player::setZone( uint32_t zoneId )
|
void Core::Entity::Player::setZone( uint32_t zoneId )
|
||||||
{
|
{
|
||||||
|
m_onEnterEventDone = false;
|
||||||
if( !g_territoryMgr.movePlayer( zoneId, getAsPlayer() ) )
|
if( !g_territoryMgr.movePlayer( zoneId, getAsPlayer() ) )
|
||||||
{
|
{
|
||||||
// todo: this will require proper handling, for now just return the player to their previous area
|
// 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 )
|
bool Core::Entity::Player::setInstance( uint32_t instanceContentId )
|
||||||
{
|
{
|
||||||
|
m_onEnterEventDone = false;
|
||||||
auto instance = g_territoryMgr.getInstanceZonePtr( instanceContentId );
|
auto instance = g_territoryMgr.getInstanceZonePtr( instanceContentId );
|
||||||
if( !instance )
|
if( !instance )
|
||||||
return false;
|
return false;
|
||||||
|
@ -384,6 +387,7 @@ bool Core::Entity::Player::setInstance( uint32_t instanceContentId )
|
||||||
|
|
||||||
bool Core::Entity::Player::setInstance( ZonePtr instance )
|
bool Core::Entity::Player::setInstance( ZonePtr instance )
|
||||||
{
|
{
|
||||||
|
m_onEnterEventDone = false;
|
||||||
if( !instance )
|
if( !instance )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -1620,12 +1624,12 @@ void Core::Entity::Player::finishZoning()
|
||||||
unsetStateFlag( PlayerStateFlag::BetweenAreas );
|
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 ) );
|
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
|
// TODO: only register this action if enough gil is in possession
|
||||||
auto targetAetheryte = g_exdDataGen.get< Core::Data::Aetheryte >( aetheryteId );
|
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++;
|
return m_objCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Core::Entity::Player::setOnEnterEventDone( bool isDone )
|
||||||
|
{
|
||||||
|
m_onEnterEventDone = isDone;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Core::Entity::Player::isOnEnterEventDone() const
|
||||||
|
{
|
||||||
|
return m_onEnterEventDone;
|
||||||
|
}
|
||||||
|
|
|
@ -559,6 +559,9 @@ public:
|
||||||
void setMarkedForRemoval();
|
void setMarkedForRemoval();
|
||||||
bool isMarkedForRemoval() const;
|
bool isMarkedForRemoval() const;
|
||||||
|
|
||||||
|
void setOnEnterEventDone( bool isDone );
|
||||||
|
bool isOnEnterEventDone() const;
|
||||||
|
|
||||||
uint8_t getNextObjCount();
|
uint8_t getNextObjCount();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -575,6 +578,8 @@ private:
|
||||||
|
|
||||||
bool m_directorInitialized;
|
bool m_directorInitialized;
|
||||||
|
|
||||||
|
bool m_onEnterEventDone;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Common::FFXIVARR_POSITION3 m_prevPos;
|
Common::FFXIVARR_POSITION3 m_prevPos;
|
||||||
|
|
|
@ -82,11 +82,14 @@ enum ClientTrigger
|
||||||
AchievementCrit = 0x202,
|
AchievementCrit = 0x202,
|
||||||
AchievementComp = 0x203,
|
AchievementComp = 0x203,
|
||||||
AchievementCatChat = 0x206,
|
AchievementCatChat = 0x206,
|
||||||
|
|
||||||
|
|
||||||
|
DirectorInitFinish = 0x321,
|
||||||
|
|
||||||
|
EnterTerritoryEventFinished = 0x330,
|
||||||
|
|
||||||
AchievementCritReq = 0x3E8,
|
AchievementCritReq = 0x3E8,
|
||||||
AchievementList = 0x3E9,
|
AchievementList = 0x3E9,
|
||||||
|
|
||||||
DirectorInitFinish = 0x321,
|
|
||||||
|
|
||||||
CompanionAction = 0x6A4,
|
CompanionAction = 0x6A4,
|
||||||
CompanionSetBarding = 0x6A5,
|
CompanionSetBarding = 0x6A5,
|
||||||
|
@ -248,6 +251,12 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
||||||
player.getCurrentZone()->onInitDirector( player );
|
player.getCurrentZone()->onInitDirector( player );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ClientTrigger::EnterTerritoryEventFinished:
|
||||||
|
{
|
||||||
|
g_log.debug( "[DOOOOOOOOOOOOOOOOOOOOOOONE]" );
|
||||||
|
player.setOnEnterEventDone( true );
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Unhandled action: " +
|
g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Unhandled action: " +
|
||||||
|
|
|
@ -122,6 +122,7 @@ public:
|
||||||
|
|
||||||
virtual void onInit( InstanceContentPtr instance ) { }
|
virtual void onInit( InstanceContentPtr instance ) { }
|
||||||
virtual void onUpdate( InstanceContentPtr instance, uint32_t currTime ) { }
|
virtual void onUpdate( InstanceContentPtr instance, uint32_t currTime ) { }
|
||||||
|
virtual void onEnterTerritory( Entity::Player &player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -23,6 +23,11 @@ public:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onEnterTerritory( Entity::Player &player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr auto EXIT_OBJECT = 2000139;
|
static constexpr auto EXIT_OBJECT = 2000139;
|
||||||
static constexpr auto EXIT_OBJECT_STATE = 4;
|
static constexpr auto EXIT_OBJECT_STATE = 4;
|
||||||
|
|
|
@ -99,7 +99,9 @@ void Core::InstanceContent::onUpdate( uint32_t currTime )
|
||||||
|
|
||||||
for( const auto &playerIt : m_playerMap )
|
for( const auto &playerIt : m_playerMap )
|
||||||
{
|
{
|
||||||
if( !playerIt.second->isLoadingComplete() || !playerIt.second->isDirectorInitialized() )
|
if( !playerIt.second->isLoadingComplete() ||
|
||||||
|
!playerIt.second->isDirectorInitialized() ||
|
||||||
|
!playerIt.second->isOnEnterEventDone() )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,8 +137,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime )
|
||||||
|
|
||||||
void Core::InstanceContent::onFinishLoading( Entity::Player& player )
|
void Core::InstanceContent::onFinishLoading( Entity::Player& player )
|
||||||
{
|
{
|
||||||
if( m_state != Created )
|
sendDirectorInit( player );
|
||||||
sendDirectorInit( player );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::InstanceContent::onInitDirector( Entity::Player& 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 )
|
void Core::InstanceContent::onBeforeEnterTerritory( Core::Entity::Player &player )
|
||||||
{
|
{
|
||||||
if( m_pEntranceEObj != nullptr )
|
if( m_pEntranceEObj != nullptr )
|
||||||
|
{
|
||||||
|
player.setRot( PI );
|
||||||
player.setPos( m_pEntranceEObj->getPos() );
|
player.setPos( m_pEntranceEObj->getPos() );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
player.setRot( PI );
|
||||||
player.setPos( { 0.f, 0.f, 0.f } );
|
player.setPos( { 0.f, 0.f, 0.f } );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Entity::EventObjectPtr Core::InstanceContent::getEObjByName( const std::string &name )
|
Core::Entity::EventObjectPtr Core::InstanceContent::getEObjByName( const std::string &name )
|
||||||
|
|
Loading…
Add table
Reference in a new issue