1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 14:57:44 +00:00

Merge pull request #266 from NotAdam/actor_rewrite

minor instances fixes
This commit is contained in:
Mordred 2018-03-06 08:19:01 +01:00 committed by GitHub
commit 2b3c41c1f2
3 changed files with 33 additions and 16 deletions

View file

@ -163,14 +163,8 @@ void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::G
player.sendDebug( "Calling: " + objName + "." + eventName + " - " + std::to_string( eventId ) ); player.sendDebug( "Calling: " + objName + "." + eventName + " - " + std::to_string( eventId ) );
player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 0, player.getZoneId(), 0 );
if( auto instance = player.getCurrentInstance() ) if( auto instance = player.getCurrentInstance() )
{ {
// param2 of eventStart
// 0 = default state?
// 1 = restore state?
// (^ Mordred: Nope, i don't think thats it )
player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 0, player.getZoneId(), instance->getDirectorId() & 0xFFFF ); player.eventStart( player.getId(), eventId, Event::EventHandler::EnterTerritory, 0, player.getZoneId(), instance->getDirectorId() & 0xFFFF );
instance->onEnterTerritory( player, eventId, param1, param2 ); instance->onEnterTerritory( player, eventId, param1, param2 );
} }

View file

@ -36,7 +36,8 @@ Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceC
m_instanceContentInfo( pInstanceContent ), m_instanceContentInfo( pInstanceContent ),
m_instanceContentId( instanceContentId ), m_instanceContentId( instanceContentId ),
m_state( Created ), m_state( Created ),
m_pEntranceEObj( nullptr ) m_pEntranceEObj( nullptr ),
m_instanceCommenceTime( 0 )
{ {
} }
@ -107,10 +108,19 @@ void Core::InstanceContent::onUpdate( uint32_t currTime )
{ {
if( !playerIt.second->isLoadingComplete() || if( !playerIt.second->isLoadingComplete() ||
!playerIt.second->isDirectorInitialized() || !playerIt.second->isDirectorInitialized() ||
!playerIt.second->isOnEnterEventDone() ) !playerIt.second->isOnEnterEventDone() ||
playerIt.second->hasStateFlag( PlayerStateFlag::WatchingCutscene ) )
return; return;
} }
if( m_instanceCommenceTime == 0 )
{
m_instanceCommenceTime = Util::getTimeMs() + instanceStartDelay;
return;
}
else if( Util::getTimeMs() < m_instanceCommenceTime )
return;
for( const auto& playerIt : m_playerMap ) for( const auto& playerIt : m_playerMap )
{ {
auto pPlayer = playerIt.second; auto pPlayer = playerIt.second;
@ -119,6 +129,8 @@ void Core::InstanceContent::onUpdate( uint32_t currTime )
getDirectorId(), 0x40000001, m_instanceContentInfo->timeLimitmin * 60u ) ); getDirectorId(), 0x40000001, m_instanceContentInfo->timeLimitmin * 60u ) );
} }
if( m_pEntranceEObj )
m_pEntranceEObj->setState( 7 );
m_state = DutyInProgress; m_state = DutyInProgress;
m_instanceExpireTime = Util::getTimeSeconds() + ( m_instanceContentInfo->timeLimitmin * 60u ); m_instanceExpireTime = Util::getTimeSeconds() + ( m_instanceContentInfo->timeLimitmin * 60u );
break; break;
@ -275,15 +287,22 @@ void Core::InstanceContent::onRegisterEObj( Entity::EventObjectPtr object )
void Core::InstanceContent::onBeforePlayerZoneIn( Core::Entity::Player& player ) void Core::InstanceContent::onBeforePlayerZoneIn( Core::Entity::Player& player )
{ {
if( m_pEntranceEObj != nullptr ) // if a player has already spawned once inside this instance, don't move them if they happen to zone in again
auto it = m_spawnedPlayers.find( player.getId() );
if( it == m_spawnedPlayers.end() )
{ {
player.setRot( PI ); if( m_pEntranceEObj != nullptr )
player.setPos( m_pEntranceEObj->getPos() ); {
} player.setRot( PI );
else player.setPos( m_pEntranceEObj->getPos() );
{ }
player.setRot( PI ); else
player.setPos( { 0.f, 0.f, 0.f } ); {
player.setRot( PI );
player.setPos( { 0.f, 0.f, 0.f } );
}
m_spawnedPlayers.insert( player.getId() );
} }
player.resetObjSpawnIndex( ); player.resetObjSpawnIndex( );

View file

@ -52,6 +52,8 @@ public:
Entity::EventObjectPtr getEObjByName( const std::string& name ); Entity::EventObjectPtr getEObjByName( const std::string& name );
/*! number of milliseconds after all players are ready for the instance to commence (spawn circle removed) */
const uint32_t instanceStartDelay = 1250;
private: private:
Event::DirectorPtr m_pDirector; Event::DirectorPtr m_pDirector;
boost::shared_ptr< Core::Data::InstanceContent > m_instanceContentInfo; boost::shared_ptr< Core::Data::InstanceContent > m_instanceContentInfo;
@ -59,11 +61,13 @@ private:
InstanceContentState m_state; InstanceContentState m_state;
int64_t m_instanceExpireTime; int64_t m_instanceExpireTime;
int64_t m_instanceCommenceTime;
Entity::EventObjectPtr m_pEntranceEObj; Entity::EventObjectPtr m_pEntranceEObj;
std::map< std::string, Entity::EventObjectPtr > m_eventObjectMap; std::map< std::string, Entity::EventObjectPtr > m_eventObjectMap;
std::unordered_map< uint32_t, Entity::EventObjectPtr > m_eventIdToObjectMap; std::unordered_map< uint32_t, Entity::EventObjectPtr > m_eventIdToObjectMap;
std::set< uint32_t > m_spawnedPlayers;
}; };
} }