1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-28 15:17:46 +00:00

Merge pull request #844 from takhlaq/ThreePointThree

fix online status
This commit is contained in:
Mordred 2023-01-21 21:07:55 +01:00 committed by GitHub
commit 9e061aefa3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 40 deletions

View file

@ -473,34 +473,40 @@ enum class OnlineStatus : uint8_t
WaitingforFreeCompanyApproval = 8, WaitingforFreeCompanyApproval = 8,
NotFound = 9, NotFound = 9,
Offline = 10, Offline = 10,
Busy = 11, Mentor = 11,
PvP = 12, Busy = 12,
PlayingTripleTriad = 13, PvP = 13,
ViewingCutscene = 14, PlayingTripleTriad = 14,
UsingaChocoboPorter = 15, ViewingCutscene = 15,
AwayfromKeyboard = 16, UsingaChocoboPorter = 16,
LookingforRepairs = 17, AwayfromKeyboard = 17,
LookingtoRepair = 18, LookingforRepairs = 18,
LookingtoMeldMateria = 19, LookingtoRepair = 19,
LookingforParty = 20, LookingtoMeldMateria = 20,
//Missing = 21 LookingforParty = 21,
WaitingforDutyFinder = 22, //Missing = 22
RecruitingPartyMembers = 23, WaitingforDutyFinder = 23,
NewAdventurer = 24, RecruitingPartyMembers = 24,
AllianceLeader = 25, Mentor25 = 25,
AlliancePartyLeader = 26, PvEMentor = 26,
AlliancePartyMember = 27, TradeMentor = 27,
PartyLeader = 28, PvPMentor = 28,
PartyMember = 29,
AnotherWorld = 30,
SharingDuty = 31,
SimilarDuty = 32,
InDuty = 33,
TrialAdventurer = 34,
FreeCompany = 35, NewAdventurer = 29,
GrandCompany = 36, AllianceLeader = 30,
Online = 37, AlliancePartyLeader = 31,
AlliancePartyMember = 32,
PartyLeader = 33,
PartyMember = 34,
AnotherWorld = 25,
SharingDuty = 36,
SimilarDuty = 37,
InDuty = 38,
TrialAdventurer = 39,
FreeCompany = 40,
GrandCompany = 41,
Online = 42,
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////

View file

@ -76,7 +76,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
uint8_t HierarchyStatus; uint8_t HierarchyStatus;
uint8_t HierarchyType; uint8_t HierarchyType;
uint8_t HierarchyGroup; uint8_t HierarchyGroup;
uint8_t HierarchyUnk; uint8_t IsDeleted;
uint16_t TerritoryType; uint16_t TerritoryType;
uint8_t GrandCompanyID; uint8_t GrandCompanyID;
uint8_t Region; uint8_t Region;
@ -114,14 +114,16 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
uint64_t SelectClassID; uint64_t SelectClassID;
uint64_t CrestID; uint64_t CrestID;
uint8_t ListType; uint8_t ListType;
char SearchComment[193]; char SearchComment[193];
char FreeCompanyName[23]; char FreeCompanyName[23];
uint8_t GrandCompanyRank[3]; uint8_t GrandCompanyRank[3];
struct ClassJobEntry struct ClassJobEntry
{ {
uint16_t id; uint16_t id;
uint16_t level; uint16_t level;
} ClassData[Common::CLASSJOB_TOTAL]; } ClassData[34]; // ClassJob::MAX
}; };
struct FFXIVIpcPcSearchResult : FFXIVIpcBasePacket< PcSearchResult > struct FFXIVIpcPcSearchResult : FFXIVIpcBasePacket< PcSearchResult >

View file

@ -44,7 +44,7 @@ void Sapphire::Network::GameConnection::getCommonlistDetailHandler( const Packet
resultPacket->data().ListType = data.ListType; resultPacket->data().ListType = data.ListType;
resultPacket->data().CommunityID = data.CommunityID; resultPacket->data().CommunityID = data.CommunityID;
resultPacket->data().DetailCharacterID = data.DetailCharacterID; resultPacket->data().DetailCharacterID = data.DetailCharacterID;
strcpy( resultPacket->data().FreeCompanyName, "ducks" ); // didn't work strcpy( resultPacket->data().FreeCompanyName, "Awooga" );
resultPacket->data().GrandCompanyRank[ 0 ] = pPlayer->getGcRankArray()[0]; resultPacket->data().GrandCompanyRank[ 0 ] = pPlayer->getGcRankArray()[0];
resultPacket->data().GrandCompanyRank[ 1 ] = pPlayer->getGcRankArray()[1]; resultPacket->data().GrandCompanyRank[ 1 ] = pPlayer->getGcRankArray()[1];
@ -54,13 +54,11 @@ void Sapphire::Network::GameConnection::getCommonlistDetailHandler( const Packet
resultPacket->data().SelectClassID = pPlayer->getSearchSelectClass(); // this is probably unused in retail resultPacket->data().SelectClassID = pPlayer->getSearchSelectClass(); // this is probably unused in retail
// serialize class data to packet // serialize class data to packet
auto classArrayLen = sizeof( resultPacket->data().ClassData ) / sizeof( resultPacket->data().ClassData[ 0 ] );
auto classDataArr = pPlayer->getClassArray(); for( size_t i = 1; i < classArrayLen; ++i )
for( size_t i = 0; i < Common::CLASSJOB_TOTAL; ++i )
{ {
resultPacket->data().ClassData[ i ].id = static_cast< uint16_t >( i ); resultPacket->data().ClassData[ i-1 ].id = static_cast< uint16_t >( i );
resultPacket->data().ClassData[ i ].level = classDataArr[ i ]; resultPacket->data().ClassData[ i-1 ].level = static_cast< uint16_t >( pPlayer->getLevelForClass( static_cast< Common::ClassJob >( i ) ) );
} }
queueOutPacket( resultPacket ); queueOutPacket( resultPacket );
@ -115,6 +113,8 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX
// user language settings flag J = 1, E = 2, D = 4, F = 8 // user language settings flag J = 1, E = 2, D = 4, F = 8
entry.SelectRegion = pPlayer->getSearchSelectRegion(); entry.SelectRegion = pPlayer->getSearchSelectRegion();
entry.OnlineStatus = pPlayer->getOnlineStatusMask() | pPlayer->getOnlineStatusCustomMask(); entry.OnlineStatus = pPlayer->getOnlineStatusMask() | pPlayer->getOnlineStatusCustomMask();
strcpy( entry.FcTag, "Awoo" );
} }
entry.CharacterID = pPlayer->getCharacterId(); entry.CharacterID = pPlayer->getCharacterId();
@ -128,7 +128,7 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX
entry.HierarchyStatus = hierarchy.data.status; entry.HierarchyStatus = hierarchy.data.status;
entry.HierarchyType = hierarchy.data.type; entry.HierarchyType = hierarchy.data.type;
entry.HierarchyGroup = hierarchy.data.group; entry.HierarchyGroup = hierarchy.data.group;
entry.HierarchyUnk = hierarchy.data.unavailable; entry.IsDeleted = hierarchy.data.unavailable;
} }
entries.emplace_back( entry ); entries.emplace_back( entry );
@ -157,6 +157,7 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX
offset = 0; offset = 0;
isLast = true; isLast = true;
if( player.getPartyId() != 0 ) if( player.getPartyId() != 0 )
{ {
auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref(); auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref();
@ -164,8 +165,18 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX
auto pParty = partyMgr.getParty( player.getPartyId() ); auto pParty = partyMgr.getParty( player.getPartyId() );
assert( pParty ); assert( pParty );
page = generateEntries( pParty->MemberId, offset, {} ); std::vector< Common::HierarchyData > hierarchyData;
for( const auto& id : pParty->MemberId )
{
Common::HierarchyData hierarchy{};
if( pParty->LeaderId == id )
hierarchy.data.status = Hierarchy::MASTER;
hierarchyData.emplace_back( hierarchy );
}
page = generateEntries( pParty->MemberId, offset, hierarchyData );
// ensure first entry is the player requesting packet // ensure first entry is the player requesting packet
for( int i = 0; i < 8; ++i ) for( int i = 0; i < 8; ++i )
{ {
@ -175,7 +186,6 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX
break; break;
} }
} }
} }
else else
{ {