diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 958427ad..2b3cb211 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -221,7 +221,7 @@ namespace Sapphire::Network::Packets WeatherChange = 0x02FB, // updated 5.11 PlayerTitleList = 0x037D, // updated 5.1 - Discovery = 0x02E7, // updated 5.18 + Discovery = 0x0091, // updated 5.2 EorzeaTimeOffset = 0x03B8, // updated 5.1 @@ -334,7 +334,7 @@ namespace Sapphire::Network::Packets ZoneLineHandler = 0x00B9, // updated 5.2 ClientTrigger = 0x017C, // updated 5.2 - DiscoveryHandler = 0x017B, // updated 5.18 + DiscoveryHandler = 0x019A, // updated 5.2 PlaceFieldMarker = 0x013C, // updated 5.0 SkillHandler = 0x0225, // updated 5.2 diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index e949afab..73f420f5 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -603,8 +603,13 @@ void Sapphire::Entity::Player::discover( int16_t map_id, int16_t sub_id ) int32_t offset = 4; - auto info = exdData.get< Sapphire::Data::Map >( - exdData.get< Sapphire::Data::TerritoryType >( getCurrentTerritory()->getTerritoryTypeId() )->map ); + auto info = exdData.get< Sapphire::Data::Map >( map_id ); + if ( !info ) + { + sendDebug( "discover(): Could not obtain map data for map_id == {0}", map_id ); + return; + } + if( info->discoveryArrayByte ) offset = 5 + 2 * info->discoveryIndex; else @@ -623,7 +628,28 @@ void Sapphire::Entity::Player::discover( int16_t map_id, int16_t sub_id ) gainExp( exp ); + // gain 10x additional EXP if entire map is completed + uint32_t mask = info->discoveryFlag; + uint32_t discoveredAreas; + if( info->discoveryArrayByte ) + { + discoveredAreas = ( m_discovery[ offset + 1 ] << 8 ) | + m_discovery[ offset ]; + } + else + { + discoveredAreas = ( m_discovery[ offset + 3 ] << 24 ) | + ( m_discovery[ offset + 2 ] << 16 ) | + ( m_discovery[ offset + 1 ] << 8 ) | + m_discovery[ offset ]; + } + bool allDiscovered = ( ( discoveredAreas & mask ) == mask ); + + if( allDiscovered ) + { + gainExp( exp * 10 ); + } } bool Sapphire::Entity::Player::isNewAdventurer() const @@ -2179,4 +2205,4 @@ bool Sapphire::Entity::Player::checkAction() } return true; -} \ No newline at end of file +}