diff --git a/src/common/CommonGen.h b/src/common/CommonGen.h index e0005ada..5e9bf149 100644 --- a/src/common/CommonGen.h +++ b/src/common/CommonGen.h @@ -463,6 +463,7 @@ namespace Common { //Weather.exd enum class Weather : uint8_t { + None = 0, ClearSkies = 1, FairSkies = 2, Clouds = 3, diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index 9ba5c2b9..865ffdc1 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -139,7 +139,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac player.sendNotice( "Race for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); targetPlayer->spawn( targetPlayer ); auto inRange = targetPlayer->getInRangeActors(); - for ( auto actor : inRange ) + for( auto actor : inRange ) { targetPlayer->despawn( actor->getAsPlayer() ); targetPlayer->spawn( actor->getAsPlayer() ); @@ -152,7 +152,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac player.sendNotice( "Tribe for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); targetPlayer->spawn( targetPlayer ); auto inRange = targetPlayer->getInRangeActors(); - for ( auto actor : inRange ) + for( auto actor : inRange ) { targetPlayer->despawn( actor->getAsPlayer() ); targetPlayer->spawn( actor->getAsPlayer() ); @@ -165,7 +165,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac player.sendNotice( "Sex for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); targetPlayer->spawn( targetPlayer ); auto inRange = targetActor->getInRangeActors(); - for ( auto actor : inRange ) + for( auto actor : inRange ) { targetPlayer->despawn( actor->getAsPlayer() ); targetPlayer->spawn( actor->getAsPlayer() ); @@ -180,14 +180,14 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac } case GmCommand::Weather: { - targetPlayer->getCurrentZone()->setWeatherOverride( param1 ); + targetPlayer->getCurrentZone()->setWeatherOverride( static_cast< Common::Weather >( param1 ) ); player.sendNotice( "Weather in Zone \"" + targetPlayer->getCurrentZone()->getName() + "\" of " + targetPlayer->getName() + " set in range." ); break; } case GmCommand::Call: { - if ( targetPlayer->getZoneId() != player.getZoneId() ) + if( targetPlayer->getZoneId() != player.getZoneId() ) targetPlayer->setZone( player.getZoneId() ); targetPlayer->changePosition( player.getPos().x, player.getPos().y, player.getPos().z, @@ -266,7 +266,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac } case GmCommand::Inv: { - if ( targetActor->getInvincibilityType() == Common::InvincibilityType::InvincibilityRefill ) + if( targetActor->getInvincibilityType() == Common::InvincibilityType::InvincibilityRefill ) targetActor->setInvincibilityType( Common::InvincibilityType::InvincibilityNone ); else targetActor->setInvincibilityType( Common::InvincibilityType::InvincibilityRefill ); @@ -277,11 +277,11 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac } case GmCommand::Orchestrion: { - if ( param1 == 1 ) + if( param1 == 1 ) { - if ( param2 == 0 ) + if( param2 == 0 ) { - for ( uint8_t i = 0; i < 255; i++ ) + for( uint8_t i = 0; i < 255; i++ ) targetActor->getAsPlayer()->learnSong( i, 0 ); player.sendNotice( "All Songs for " + targetPlayer->getName() + @@ -324,7 +324,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac { uint32_t gil = targetPlayer->getCurrency( 1 ); - if ( gil < param1 ) + if( gil < param1 ) { player.sendUrgent( "Player does not have enough Gil(" + std::to_string( gil ) + ")" ); } @@ -379,11 +379,11 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac } case GmCommand::Aetheryte: { - if ( param1 == 0 ) + if( param1 == 0 ) { - if ( param2 == 0 ) + if( param2 == 0 ) { - for ( uint8_t i = 0; i < 255; i++ ) + for( uint8_t i = 0; i < 255; i++ ) targetActor->getAsPlayer()->registerAetheryte( i ); player.sendNotice( "All Aetherytes for " + targetPlayer->getName() + @@ -427,23 +427,23 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac } case GmCommand::TeriInfo: { + auto pCurrentZone = player.getCurrentZone(); player.sendNotice( "ZoneId: " + std::to_string( player.getZoneId() ) + "\nName: " + - player.getCurrentZone()->getName() + "\nInternalName: " + - player.getCurrentZone()->getInternalName() + "\nPopCount: " + - std::to_string( player.getCurrentZone()->getPopCount() ) + - "\nCurrentWeather:" + std::to_string( player.getCurrentZone()->getCurrentWeather() ) + - "\nNextWeather:" + std::to_string( player.getCurrentZone()->getNextWeather() ) ); + pCurrentZone->getName() + "\nInternalName: " + + pCurrentZone->getInternalName() + "\nPopCount: " + + std::to_string( pCurrentZone->getPopCount() ) + + "\nCurrentWeather:" + std::to_string( static_cast< uint8_t >( pCurrentZone->getCurrentWeather() ) ) + + "\nNextWeather:" + std::to_string( static_cast< uint8_t >( pCurrentZone->getNextWeather() ) ) ); break; } case GmCommand::Jump: { auto inRange = player.getInRangeActors(); - for( auto actor : inRange ) - { - player.changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z, - targetActor->getRotation() ); - } + + player.changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z, + targetActor->getRotation() ); + player.sendNotice( "Jumping to " + targetPlayer->getName() + " in range." ); break; } @@ -517,7 +517,7 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac } case GmCommand::Call: { - if ( targetPlayer->getZoneId() != player.getZoneId() ) + if( targetPlayer->getZoneId() != player.getZoneId() ) targetPlayer->setZone( player.getZoneId() ); targetPlayer->changePosition( player.getPos().x, player.getPos().y, player.getPos().z, diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index eee90859..30d7e399 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -44,15 +44,15 @@ extern Core::TerritoryMgr g_territoryMgr; Core::Zone::Zone() : m_territoryId( 0 ), m_guId( 0 ), - m_currentWeather( static_cast< uint8_t >( Common::Weather::FairSkies ) ), - m_weatherOverride( 0 ), + m_currentWeather( Common::Weather::FairSkies ), + m_weatherOverride( Common::Weather::None ), m_lastMobUpdate( 0 ), m_currentFestivalId( 0 ) { } Core::Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName, const std::string& placeName ) : - m_currentWeather( static_cast< uint8_t >( Common::Weather::FairSkies ) ) + m_currentWeather( Common::Weather::FairSkies ) { m_guId = guId; @@ -61,9 +61,22 @@ Core::Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& intern m_placeName = placeName; m_lastMobUpdate = 0; - m_weatherOverride = 0; + m_weatherOverride = Common::Weather::None; m_territoryTypeInfo = g_exdDataGen.get< Core::Data::TerritoryType >( territoryId ); + loadWeatherRates(); + + m_currentWeather = getNextWeather(); +} + +void Core::Zone::loadWeatherRates() +{ + if( !m_territoryTypeInfo ) + { + g_log.error( std::string( __FUNCTION__ ) + " TerritoryTypeInfo not loaded!" ); + return; + } + uint8_t weatherRateId = m_territoryTypeInfo->weatherRate > g_exdDataGen.getWeatherRateIdList().size() ? uint8_t{ 0 } : m_territoryTypeInfo->weatherRate; @@ -80,8 +93,6 @@ Core::Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& intern m_weatherRateMap[sumPc] = weatherId; i += 2; } - - m_currentWeather = getNextWeather(); } Core::Zone::~Zone() @@ -102,12 +113,12 @@ bool Core::Zone::init() return true; } -void Core::Zone::setWeatherOverride( uint8_t weather ) +void Core::Zone::setWeatherOverride( Common::Weather weather ) { m_weatherOverride = weather; } -uint8_t Core::Zone::getCurrentWeather() const +Core::Common::Weather Core::Zone::getCurrentWeather() const { return m_currentWeather; } @@ -227,7 +238,7 @@ void Core::Zone::loadCellCache() } -uint8_t Core::Zone::getNextWeather() +Core::Common::Weather Core::Zone::getNextWeather() { uint32_t unixTime = static_cast< uint32_t >( Util::getTimeSeconds() ); // Get Eorzea hour for weather start @@ -248,13 +259,13 @@ uint8_t Core::Zone::getNextWeather() for( auto entry : m_weatherRateMap ) { uint8_t sRate = entry.first; - auto weatherId = static_cast< uint8_t >( entry.second ); + auto weatherId = static_cast< Common::Weather >( entry.second ); if( rate <= sRate ) return weatherId; } - return 1; + return Common::Weather::FairSkies; } void Core::Zone::pushActor( Entity::ActorPtr pActor ) @@ -407,22 +418,24 @@ std::size_t Core::Zone::getPopCount() const bool Core::Zone::checkWeather() { - if ( m_weatherOverride != 0 ) + if( m_weatherOverride != Common::Weather::None ) { - if ( m_weatherOverride != m_currentWeather ) + if( m_weatherOverride != m_currentWeather ) { m_currentWeather = m_weatherOverride; - g_log.debug( "[Zone:" + m_internalName + "] overriding weather to : " + std::to_string( m_weatherOverride ) ); + g_log.debug( "[Zone:" + m_internalName + "] overriding weather to : " + + std::to_string( static_cast< uint8_t >( m_weatherOverride ) ) ); return true; } } else { auto nextWeather = getNextWeather(); - if ( nextWeather != m_currentWeather ) + if( nextWeather != m_currentWeather ) { m_currentWeather = nextWeather; - g_log.debug( "[Zone:" + m_internalName + "] changing weather to : " + std::to_string( nextWeather ) ); + g_log.debug( "[Zone:" + m_internalName + "] changing weather to : " + + std::to_string( static_cast< uint8_t >( nextWeather ) ) ); return true; } } @@ -522,7 +535,7 @@ void Core::Zone::updateSessions( bool changedWeather ) { Core::Network::Packets::ZoneChannelPacket< Core::Network::Packets::Server::FFXIVIpcWeatherChange > weatherChangePacket( pSession->getPlayer()->getId() ); - weatherChangePacket.data().weatherId = m_currentWeather; + weatherChangePacket.data().weatherId = static_cast< uint8_t >( m_currentWeather ); weatherChangePacket.data().delay = 5.0f; pSession->getPlayer()->queuePacket( weatherChangePacket ); } diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index a9b09ecc..3a84eaee 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -44,8 +44,8 @@ protected: CellCache** m_pCellCache[_sizeX]; - uint8_t m_currentWeather; - uint8_t m_weatherOverride; + Common::Weather m_currentWeather; + Common::Weather m_weatherOverride; uint64_t m_lastMobUpdate; @@ -65,9 +65,9 @@ public: bool init(); /*! overrides the zone's weather, set to 0 to unlock */ - void setWeatherOverride( uint8_t weather ); + void setWeatherOverride( Common::Weather weather ); - uint8_t getCurrentWeather() const; + Common::Weather getCurrentWeather() const; uint16_t getCurrentFestival() const; void setCurrentFestival( uint16_t festivalId ); @@ -84,7 +84,7 @@ public: virtual void onLeaveTerritory( Entity::Player& player ); virtual void onUpdate( uint32_t currTime ); - uint8_t getNextWeather(); + Common::Weather getNextWeather(); void pushActor( Entity::ActorPtr pActor ); @@ -106,6 +106,7 @@ public: const std::string& getInternalName() const; std::size_t getPopCount() const; + void loadWeatherRates(); bool checkWeather(); void updateBnpcs( int64_t tickCount );