diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index e4d0c4f0..6d22c190 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -163,14 +163,8 @@ void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::G 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() ) { - // 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 ); instance->onEnterTerritory( player, eventId, param1, param2 ); } diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 3192f94a..a953c0a5 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -36,7 +36,8 @@ Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceC m_instanceContentInfo( pInstanceContent ), m_instanceContentId( instanceContentId ), 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() || !playerIt.second->isDirectorInitialized() || - !playerIt.second->isOnEnterEventDone() ) + !playerIt.second->isOnEnterEventDone() || + playerIt.second->hasStateFlag( PlayerStateFlag::WatchingCutscene ) ) return; } + if( m_instanceCommenceTime == 0 ) + { + m_instanceCommenceTime = Util::getTimeMs() + instanceStartDelay; + return; + } + else if( Util::getTimeMs() < m_instanceCommenceTime ) + return; + for( const auto& playerIt : m_playerMap ) { auto pPlayer = playerIt.second; @@ -119,6 +129,8 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) getDirectorId(), 0x40000001, m_instanceContentInfo->timeLimitmin * 60u ) ); } + if( m_pEntranceEObj ) + m_pEntranceEObj->setState( 7 ); m_state = DutyInProgress; m_instanceExpireTime = Util::getTimeSeconds() + ( m_instanceContentInfo->timeLimitmin * 60u ); break; @@ -275,15 +287,22 @@ void Core::InstanceContent::onRegisterEObj( Entity::EventObjectPtr object ) 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 ); - player.setPos( m_pEntranceEObj->getPos() ); - } - else - { - player.setRot( PI ); - player.setPos( { 0.f, 0.f, 0.f } ); + if( m_pEntranceEObj != nullptr ) + { + player.setRot( PI ); + player.setPos( m_pEntranceEObj->getPos() ); + } + else + { + player.setRot( PI ); + player.setPos( { 0.f, 0.f, 0.f } ); + } + + m_spawnedPlayers.insert( player.getId() ); } player.resetObjSpawnIndex( ); diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index d487f86f..0dad9d5c 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -52,6 +52,8 @@ public: 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: Event::DirectorPtr m_pDirector; boost::shared_ptr< Core::Data::InstanceContent > m_instanceContentInfo; @@ -59,11 +61,13 @@ private: InstanceContentState m_state; int64_t m_instanceExpireTime; + int64_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; }; }