From 5121edf6aeba4650889ec80889f57b4258336be8 Mon Sep 17 00:00:00 2001 From: Tahir Date: Sat, 21 Jan 2023 00:37:36 +0000 Subject: [PATCH] fix online status - fix level display in common list detail - show disband button for party leader in common list - todo: dont allow social invites to self; figure out why unable to kick party member from menu --- src/common/CommonGen.h | 60 ++++++++++--------- .../Network/PacketDef/Zone/ServerZoneDef.h | 6 +- .../Network/Handlers/CommonListHandler.cpp | 32 ++++++---- 3 files changed, 58 insertions(+), 40 deletions(-) diff --git a/src/common/CommonGen.h b/src/common/CommonGen.h index 5ccefb40..b1ed10a6 100644 --- a/src/common/CommonGen.h +++ b/src/common/CommonGen.h @@ -473,34 +473,40 @@ enum class OnlineStatus : uint8_t WaitingforFreeCompanyApproval = 8, NotFound = 9, Offline = 10, - Busy = 11, - PvP = 12, - PlayingTripleTriad = 13, - ViewingCutscene = 14, - UsingaChocoboPorter = 15, - AwayfromKeyboard = 16, - LookingforRepairs = 17, - LookingtoRepair = 18, - LookingtoMeldMateria = 19, - LookingforParty = 20, - //Missing = 21 - WaitingforDutyFinder = 22, - RecruitingPartyMembers = 23, - NewAdventurer = 24, - AllianceLeader = 25, - AlliancePartyLeader = 26, - AlliancePartyMember = 27, - PartyLeader = 28, - PartyMember = 29, - AnotherWorld = 30, - SharingDuty = 31, - SimilarDuty = 32, - InDuty = 33, - TrialAdventurer = 34, + Mentor = 11, + Busy = 12, + PvP = 13, + PlayingTripleTriad = 14, + ViewingCutscene = 15, + UsingaChocoboPorter = 16, + AwayfromKeyboard = 17, + LookingforRepairs = 18, + LookingtoRepair = 19, + LookingtoMeldMateria = 20, + LookingforParty = 21, + //Missing = 22 + WaitingforDutyFinder = 23, + RecruitingPartyMembers = 24, + Mentor25 = 25, + PvEMentor = 26, + TradeMentor = 27, + PvPMentor = 28, - FreeCompany = 35, - GrandCompany = 36, - Online = 37, + NewAdventurer = 29, + AllianceLeader = 30, + AlliancePartyLeader = 31, + AlliancePartyMember = 32, + PartyLeader = 33, + PartyMember = 34, + AnotherWorld = 25, + SharingDuty = 36, + SimilarDuty = 37, + InDuty = 38, + TrialAdventurer = 39, + + FreeCompany = 40, + GrandCompany = 41, + Online = 42, }; /////////////////////////////////////////////////////////// diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index a4949892..d7379ec2 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -76,7 +76,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server uint8_t HierarchyStatus; uint8_t HierarchyType; uint8_t HierarchyGroup; - uint8_t HierarchyUnk; + uint8_t IsDeleted; uint16_t TerritoryType; uint8_t GrandCompanyID; uint8_t Region; @@ -114,14 +114,16 @@ namespace Sapphire::Network::Packets::WorldPackets::Server uint64_t SelectClassID; uint64_t CrestID; uint8_t ListType; + char SearchComment[193]; char FreeCompanyName[23]; uint8_t GrandCompanyRank[3]; + struct ClassJobEntry { uint16_t id; uint16_t level; - } ClassData[Common::CLASSJOB_TOTAL]; + } ClassData[34]; // ClassJob::MAX }; struct FFXIVIpcPcSearchResult : FFXIVIpcBasePacket< PcSearchResult > diff --git a/src/world/Network/Handlers/CommonListHandler.cpp b/src/world/Network/Handlers/CommonListHandler.cpp index 35b6b7c6..a1390f24 100644 --- a/src/world/Network/Handlers/CommonListHandler.cpp +++ b/src/world/Network/Handlers/CommonListHandler.cpp @@ -44,8 +44,8 @@ void Sapphire::Network::GameConnection::getCommonlistDetailHandler( const Packet resultPacket->data().ListType = data.ListType; resultPacket->data().CommunityID = data.CommunityID; 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[ 1 ] = pPlayer->getGcRankArray()[1]; resultPacket->data().GrandCompanyRank[ 2 ] = pPlayer->getGcRankArray()[2]; @@ -54,13 +54,11 @@ void Sapphire::Network::GameConnection::getCommonlistDetailHandler( const Packet resultPacket->data().SelectClassID = pPlayer->getSearchSelectClass(); // this is probably unused in retail // serialize class data to packet - - auto classDataArr = pPlayer->getClassArray(); - - for( size_t i = 0; i < Common::CLASSJOB_TOTAL; ++i ) + auto classArrayLen = sizeof( resultPacket->data().ClassData ) / sizeof( resultPacket->data().ClassData[ 0 ] ); + for( size_t i = 1; i < classArrayLen; ++i ) { - resultPacket->data().ClassData[ i ].id = static_cast< uint16_t >( i ); - resultPacket->data().ClassData[ i ].level = classDataArr[ i ]; + resultPacket->data().ClassData[ i-1 ].id = static_cast< uint16_t >( i ); + resultPacket->data().ClassData[ i-1 ].level = static_cast< uint16_t >( pPlayer->getLevelForClass( static_cast< Common::ClassJob >( i ) ) ); } 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 entry.SelectRegion = pPlayer->getSearchSelectRegion(); entry.OnlineStatus = pPlayer->getOnlineStatusMask() | pPlayer->getOnlineStatusCustomMask(); + + strcpy( entry.FcTag, "Awoo" ); } entry.CharacterID = pPlayer->getCharacterId(); @@ -128,7 +128,7 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX entry.HierarchyStatus = hierarchy.data.status; entry.HierarchyType = hierarchy.data.type; entry.HierarchyGroup = hierarchy.data.group; - entry.HierarchyUnk = hierarchy.data.unavailable; + entry.IsDeleted = hierarchy.data.unavailable; } entries.emplace_back( entry ); @@ -157,6 +157,7 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX offset = 0; isLast = true; + if( player.getPartyId() != 0 ) { 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() ); 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 for( int i = 0; i < 8; ++i ) { @@ -175,7 +186,6 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX break; } } - } else {