From 579972278b0f31de4e52dc3652d00a4c897c4863 Mon Sep 17 00:00:00 2001 From: Sophie Hamilton Date: Mon, 2 Mar 2020 03:48:28 +0000 Subject: [PATCH 1/4] Make Player::discover() honour passed map_id The Sapphire::Entity::Player::discover() method never actually honoured the passed map_id, instead always using the ID of the map the player was currently in. --- src/world/Actor/Player.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index e949afab..cd8d6c79 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -603,8 +603,7 @@ 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->discoveryArrayByte ) offset = 5 + 2 * info->discoveryIndex; else From f8236147a66a9887cc352ea1bbb36b5cf0e2d922 Mon Sep 17 00:00:00 2001 From: Sophie Hamilton Date: Mon, 2 Mar 2020 08:52:28 +0000 Subject: [PATCH 2/4] Additional EXP bonus on full map completion When the map is fully completed, gain an additional EXP bonus equal to 10 times the regular amount. --- src/world/Actor/Player.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index cd8d6c79..89ead563 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -622,7 +622,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 From 1fc067a3e60558d25d816f18aaf04ab63cb06e57 Mon Sep 17 00:00:00 2001 From: Sophie Hamilton Date: Mon, 2 Mar 2020 09:01:00 +0000 Subject: [PATCH 3/4] New Discovery/DiscoveryHandler opcodes Add in the new opcodes for Discovery and DiscoveryHandler found by @collett8192. --- src/common/Network/PacketDef/Ipcs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 8f62c23a8b902df0d78b000a8a7925c3585b86b7 Mon Sep 17 00:00:00 2001 From: Sophie Hamilton Date: Tue, 3 Mar 2020 08:37:19 +0000 Subject: [PATCH 4/4] Check for nullptr before using returned map data It's best to not crash the server if we can help it. --- src/world/Actor/Player.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 89ead563..73f420f5 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -604,6 +604,12 @@ void Sapphire::Entity::Player::discover( int16_t map_id, int16_t sub_id ) int32_t offset = 4; 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 @@ -2199,4 +2205,4 @@ bool Sapphire::Entity::Player::checkAction() } return true; -} \ No newline at end of file +}