diff --git a/src/servers/sapphire_zone/Action/EventAction.cpp b/src/servers/sapphire_zone/Action/EventAction.cpp index 3370a635..b5e935cf 100644 --- a/src/servers/sapphire_zone/Action/EventAction.cpp +++ b/src/servers/sapphire_zone/Action/EventAction.cpp @@ -28,7 +28,7 @@ Core::Action::EventAction::EventAction( Entity::ActorPtr pActor, uint32_t eventI m_handleActionType = HandleActionType::Event; m_eventId = eventId; m_id = action; - m_castTime = g_exdDataGen.getEventAction( action )->castTime; // TODO: Add security checks. + m_castTime = g_exdDataGen.getEventAction( action )->castTime * 100; // TODO: Add security checks. m_onActionFinishClb = finishRef; m_onActionInterruptClb = interruptRef; m_pSource = pActor; diff --git a/src/servers/sapphire_zone/Actor/PlayerQuest.cpp b/src/servers/sapphire_zone/Actor/PlayerQuest.cpp index 88c1e82a..c750fe0a 100644 --- a/src/servers/sapphire_zone/Actor/PlayerQuest.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerQuest.cpp @@ -1043,7 +1043,7 @@ bool Core::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optional for( uint32_t i = 0; i < questInfo->itemReward0.size(); i++ ) { // TODO: add the correct amount of items instead of 1 - addItem( -1, questInfo->itemReward0.at( i ), questInfo->itemReward1.at( i ) ); + addItem( -1, questInfo->itemReward0.at( i ), questInfo->itemCountReward0.at( i ) ); } } diff --git a/src/servers/sapphire_zone/ServerZone.cpp b/src/servers/sapphire_zone/ServerZone.cpp index 4b0f724c..c4d67dd7 100644 --- a/src/servers/sapphire_zone/ServerZone.cpp +++ b/src/servers/sapphire_zone/ServerZone.cpp @@ -282,7 +282,7 @@ void Core::ServerZone::mainLoop() auto it = this->m_sessionMapById.begin(); for( ; it != this->m_sessionMapById.end(); ) { - uint32_t diff = currTime - it->second->getLastDataTime(); + int64_t diff = currTime - it->second->getLastDataTime(); auto pPlayer = it->second->getPlayer(); diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index cb5c3209..eab7bddb 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -126,6 +126,7 @@ bool Core::TerritoryMgr::createDefaultTerritories() instanceMap[guid] = pZone; m_instanceIdToZonePtrMap[guid] = pZone; m_territoryInstanceMap[territoryId] = instanceMap; + m_zoneSet.insert( { pZone } ); } @@ -180,6 +181,7 @@ Core::ZonePtr Core::TerritoryMgr::createInstanceContent( uint32_t instanceConten m_instanceContentToInstanceMap[instanceContentId][pZone->getGuId()] = pZone; m_instanceIdToZonePtrMap[pZone->getGuId()] = pZone; + m_instanceZoneSet.insert( { pZone } ); return pZone; } @@ -192,6 +194,9 @@ bool Core::TerritoryMgr::removeTerritoryInstance( uint32_t instanceId ) m_instanceIdToZonePtrMap.erase( pZone->getGuId() ); + if( m_instanceZoneSet.count( pZone ) ) + m_instanceZoneSet.erase( pZone ); + if( isInstanceContentTerritory( pZone->getTerritoryId() ) ) { auto instance = boost::dynamic_pointer_cast< InstanceContent >( pZone ); @@ -268,16 +273,14 @@ Core::ZonePtr Core::TerritoryMgr::getZoneByTerriId( uint32_t territoryId ) const void Core::TerritoryMgr::updateTerritoryInstances( uint32_t currentTime ) { - for( auto zoneMap : m_territoryInstanceMap ) + for( auto& zone : m_zoneSet ) { - for( auto zone : zoneMap.second ) - zone.second->runZoneLogic( currentTime ); + zone->runZoneLogic( currentTime ); } - for( auto zoneMap : m_instanceContentToInstanceMap ) + for( auto& zone : m_instanceZoneSet ) { - for( auto zone: zoneMap.second ) - zone.second->runZoneLogic( currentTime ); + zone->runZoneLogic( currentTime ); } } diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.h b/src/servers/sapphire_zone/Zone/TerritoryMgr.h index 24318550..1984faca 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.h +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.h @@ -3,6 +3,7 @@ #include #include "Forwards.h" +#include namespace Core { @@ -139,6 +140,12 @@ namespace Core /*! internal counter for instanceIds */ uint32_t m_lastInstanceId; + /*! set of ZonePtrs for quick iteration*/ + std::set< ZonePtr > m_zoneSet; + + /*! set of ZonePtrs for quick iteration*/ + std::set< ZonePtr > m_instanceZoneSet; + public: /*! returns a list of instanceContent InstanceIds currently active */ InstanceIdList getInstanceContentIdList( uint16_t instanceContentId ) const; diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 83b06bca..2567f6ae 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -62,8 +62,27 @@ Zone::Zone( uint16_t territoryId, uint32_t guId, const std::string& internalName m_placeName = placeName; m_lastMobUpdate = 0; - m_currentWeather = getNextWeather(); m_weatherOverride = 0; + m_territoryTypeInfo = g_exdDataGen.getTerritoryType( territoryId ); + + uint8_t weatherRateId = m_territoryTypeInfo->weatherRate > g_exdDataGen.getWeatherRateIdList().size() ? + uint8_t{ 0 } : m_territoryTypeInfo->weatherRate; + + uint8_t sumPc = 0; + auto weatherRateFields = g_exdDataGen.m_WeatherRateDat.get_row( weatherRateId ); + for( size_t i = 0; i < 16; ) + { + int32_t weatherId = boost::get< int32_t >( weatherRateFields[i] ); + + if( weatherId == 0 ) + break; + + sumPc += boost::get< uint8_t >( weatherRateFields[i + 1] ); + m_weatherRateMap[sumPc] = weatherId; + i += 2; + } + + m_currentWeather = getNextWeather(); } Zone::~Zone() @@ -207,8 +226,6 @@ void Zone::loadCellCache() uint8_t Zone::getNextWeather() { - auto zoneInfo = g_exdDataGen.getTerritoryType( getTerritoryId() ); - uint32_t unixTime = static_cast< uint32_t >( Util::getTimeSeconds() ); // Get Eorzea hour for weather start uint32_t bell = unixTime / 175; @@ -225,28 +242,7 @@ uint8_t Zone::getNextWeather() auto rate = static_cast< uint8_t >( step2 % 0x64 ); - uint8_t weatherRateNum = zoneInfo->weatherRate > g_exdDataGen.getWeatherRateIdList().size() ? 0 : zoneInfo->weatherRate; - - auto weatherRate = g_exdDataGen.getWeatherRate( weatherRateNum ); - auto weatherRateFields = g_exdDataGen.m_WeatherRateDat.get_row( weatherRateNum ); - - std::map< uint8_t, int32_t> weatherRateMap; - - uint8_t sumPc = 0; - for( size_t i = 0; i < 16; ) - { - int32_t weatherId = boost::get< int32_t >( weatherRateFields[i] ); - - if( weatherId == 0 ) - break; - - sumPc += boost::get< uint8_t >( weatherRateFields[i + 1] ); - weatherRateMap[sumPc] = weatherId; - - i += 2; - } - - for( auto entry : weatherRateMap ) + for( auto entry : m_weatherRateMap ) { uint8_t sRate = entry.first; auto weatherId = static_cast< uint8_t >( entry.second ); diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index 2c1fe699..500251f3 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -14,6 +14,7 @@ #include #include +#include namespace Core { class Session; @@ -50,6 +51,10 @@ protected: uint64_t m_lastMobUpdate; + boost::shared_ptr< Data::TerritoryType > m_territoryTypeInfo; + + std::map< uint8_t, int32_t> m_weatherRateMap; + public: Zone();