From 8dd19cf8154fc2f592722494e2813608264e29c2 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 6 Mar 2018 13:33:10 +1100 Subject: [PATCH 1/4] auto hide entrance circle --- .../sapphire_zone/Zone/InstanceContent.cpp | 15 +++++++++++++-- src/servers/sapphire_zone/Zone/InstanceContent.h | 4 ++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index bbdc2f56..39f02174 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() + INSTANCE_COMMENCE_DELAY; + return; + } + else if( Util::getTimeMs() < m_instanceCommenceTime ) + return; + for( const auto& playerIt : m_playerMap ) { auto pPlayer = playerIt.second; @@ -119,6 +129,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) getDirectorId(), 0x40000001, m_instanceContentInfo->timeLimitmin * 60u ) ); } + m_pEntranceEObj->setState( 7 ); m_state = DutyInProgress; m_instanceExpireTime = Util::getTimeSeconds() + ( m_instanceContentInfo->timeLimitmin * 60u ); break; diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index d487f86f..8f210f9b 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -22,6 +22,9 @@ public: DutyFinished }; + /*! number of milliseconds after all players are ready for the instance to commence (spawn circle removed) */ + const uint32_t INSTANCE_COMMENCE_DELAY = 1250; + InstanceContent( boost::shared_ptr< Core::Data::InstanceContent > pInstanceContent, uint32_t guId, const std::string& internalName, @@ -59,6 +62,7 @@ private: InstanceContentState m_state; int64_t m_instanceExpireTime; + int64_t m_instanceCommenceTime; Entity::EventObjectPtr m_pEntranceEObj; From 0adb47e4a5cefdd7fbfe9e3f424097c713b9335e Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 6 Mar 2018 13:34:02 +1100 Subject: [PATCH 2/4] remove double eventStart call --- .../sapphire_zone/Network/Handlers/EventHandlers.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index e59540eb..97f124de 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 ); } From 5ae1a99769ba081b3e211d51e2bcb6fdb8bbc30e Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 6 Mar 2018 14:26:21 +1100 Subject: [PATCH 3/4] if player already zoned into instance, don't teleport them back to start on zonein --- .../sapphire_zone/Zone/InstanceContent.cpp | 23 ++++++++++++------- .../sapphire_zone/Zone/InstanceContent.h | 1 + 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 39f02174..ed4e63c7 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -286,15 +286,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 8f210f9b..e58e4abd 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -68,6 +68,7 @@ private: std::map< std::string, Entity::EventObjectPtr > m_eventObjectMap; std::unordered_map< uint32_t, Entity::EventObjectPtr > m_eventIdToObjectMap; + std::set< uint32_t > m_spawnedPlayers; }; } From 4bc06c95ba6e40db1236d8925a21c05fc6e79264 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 6 Mar 2018 18:00:57 +1100 Subject: [PATCH 4/4] make mordred happy --- src/servers/sapphire_zone/Zone/InstanceContent.cpp | 5 +++-- src/servers/sapphire_zone/Zone/InstanceContent.h | 5 ++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index ed4e63c7..b56ff102 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -115,7 +115,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) if( m_instanceCommenceTime == 0 ) { - m_instanceCommenceTime = Util::getTimeMs() + INSTANCE_COMMENCE_DELAY; + m_instanceCommenceTime = Util::getTimeMs() + instanceStartDelay; return; } else if( Util::getTimeMs() < m_instanceCommenceTime ) @@ -129,7 +129,8 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) getDirectorId(), 0x40000001, m_instanceContentInfo->timeLimitmin * 60u ) ); } - m_pEntranceEObj->setState( 7 ); + if( m_pEntranceEObj ) + m_pEntranceEObj->setState( 7 ); m_state = DutyInProgress; m_instanceExpireTime = Util::getTimeSeconds() + ( m_instanceContentInfo->timeLimitmin * 60u ); break; diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index e58e4abd..0dad9d5c 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -22,9 +22,6 @@ public: DutyFinished }; - /*! number of milliseconds after all players are ready for the instance to commence (spawn circle removed) */ - const uint32_t INSTANCE_COMMENCE_DELAY = 1250; - InstanceContent( boost::shared_ptr< Core::Data::InstanceContent > pInstanceContent, uint32_t guId, const std::string& internalName, @@ -55,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;