From 439c4cadf6176dbbff91d3c2ad8c0ac768766559 Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Tue, 21 Nov 2017 13:20:43 +0000 Subject: [PATCH] stub some party related stuff --- src/servers/Server_Common/Common.h | 24 ++++++ src/servers/Server_Common/Forwards.h | 5 ++ .../Server_Common/Network/PacketDef/Ipcs.h | 2 +- .../Network/PacketDef/Zone/ServerZoneDef.h | 25 +++++- .../Server_Zone/Actor/Group/ContentGroup.cpp | 0 .../Server_Zone/Actor/Group/ContentGroup.h | 0 .../Server_Zone/Actor/Group/FreeCompany.cpp | 0 .../Server_Zone/Actor/Group/FreeCompany.h | 0 src/servers/Server_Zone/Actor/Group/Group.cpp | 83 +++++++++++++++++++ src/servers/Server_Zone/Actor/Group/Group.h | 74 +++++++++++++++++ .../Server_Zone/Actor/Group/Linkshell.cpp | 0 .../Server_Zone/Actor/Group/Linkshell.h | 0 .../Actor/Group/Manager/ContentGroupMgr.cpp | 0 .../Actor/Group/Manager/ContentGroupMgr.h | 0 .../Actor/Group/Manager/FreeCompanyMgr.cpp | 0 .../Actor/Group/Manager/FreeCompanyMgr.h | 0 .../Actor/Group/Manager/GroupMgr.cpp | 0 .../Actor/Group/Manager/GroupMgr.h | 0 .../Actor/Group/Manager/LinkshellMgr.cpp | 0 .../Actor/Group/Manager/LinkshellMgr.h | 0 .../Actor/Group/Manager/PartyMgr.cpp | 0 .../Actor/Group/Manager/PartyMgr.h | 0 src/servers/Server_Zone/Actor/Group/Party.cpp | 0 src/servers/Server_Zone/Actor/Group/Party.h | 0 src/servers/Server_Zone/CMakeLists.txt | 4 + .../Server_Zone/Network/GameConnection.cpp | 1 + .../Server_Zone/Network/GameConnection.h | 2 +- .../Network/Handlers/PacketHandlers.cpp | 9 +- 28 files changed, 218 insertions(+), 11 deletions(-) create mode 100644 src/servers/Server_Zone/Actor/Group/ContentGroup.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/ContentGroup.h create mode 100644 src/servers/Server_Zone/Actor/Group/FreeCompany.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/FreeCompany.h create mode 100644 src/servers/Server_Zone/Actor/Group/Group.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/Group.h create mode 100644 src/servers/Server_Zone/Actor/Group/Linkshell.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/Linkshell.h create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/ContentGroupMgr.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/ContentGroupMgr.h create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/FreeCompanyMgr.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/FreeCompanyMgr.h create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.h create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/LinkshellMgr.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/LinkshellMgr.h create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/PartyMgr.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/Manager/PartyMgr.h create mode 100644 src/servers/Server_Zone/Actor/Group/Party.cpp create mode 100644 src/servers/Server_Zone/Actor/Group/Party.h diff --git a/src/servers/Server_Common/Common.h b/src/servers/Server_Common/Common.h index fae2a31b..faf95222 100644 --- a/src/servers/Server_Common/Common.h +++ b/src/servers/Server_Common/Common.h @@ -802,6 +802,30 @@ namespace Common { MountSkill = 0xD, }; + enum SocialCategory : uint8_t + { + Party = 1, + Friends = 2, + FreeCompanyPetition = 4, + FreeCompany = 5, + }; + + // todo: rename SocialRequestAction and SocialRequestResponse cause they seem ambiguous + enum class SocialRequestAction : uint8_t + { + Invite = 1, + Cancel = 2, + Accept = 3, + Decline = 4, + }; + + enum class SocialRequestResponse : uint8_t + { + Decline, + Accept, + Cancel, + }; + struct ServerEntry { uint32_t serverId; diff --git a/src/servers/Server_Common/Forwards.h b/src/servers/Server_Common/Forwards.h index 515bfe0e..0325e222 100644 --- a/src/servers/Server_Common/Forwards.h +++ b/src/servers/Server_Common/Forwards.h @@ -2,6 +2,11 @@ #define _COMMON_FORWARDS_H #include +#include + +using namespace std::chrono_literals; +using time_point = std::chrono::steady_clock::time_point; +using duration = std::chrono::steady_clock::duration; namespace Core { diff --git a/src/servers/Server_Common/Network/PacketDef/Ipcs.h b/src/servers/Server_Common/Network/PacketDef/Ipcs.h index f0f387d3..2a0cadc5 100644 --- a/src/servers/Server_Common/Network/PacketDef/Ipcs.h +++ b/src/servers/Server_Common/Network/PacketDef/Ipcs.h @@ -161,7 +161,7 @@ namespace Packets { CFDutyInfoHandler = 0x0078, // updated 4.1 ?? - SocialReqSendHandler = 0x00AE, // updated 4.1 + SocialReqSendHandler = 0x00AF, // updated 4.1 SocialListHandler = 0x00B3, // updated 4.1 SetSearchInfoHandler = 0x00B5, // updated 4.1 diff --git a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h index 81cca1df..1808a5ae 100644 --- a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h @@ -83,19 +83,36 @@ struct PlayerEntry { uint64_t contentId; uint8_t bytes[12]; uint16_t zoneId; - uint16_t zoneId1; - char bytes1[8]; + uint8_t grandCompany; + uint8_t clientLanguage; + uint8_t knownLanguages; // bitmask, J 0x01, E 0x02, D 0x04, F 0x08 + uint8_t searchComment; // bool + char bytes1[6]; uint64_t onlineStatusMask; uint8_t classJob; uint8_t padding; - uint8_t level; - uint8_t padding1; + uint16_t level; uint16_t padding2; uint8_t one; char name[0x20]; char fcTag[9]; }; +struct FFXIVIpcSocialRequestError : FFXIVIpcBasePacket +{ + +}; + +struct FFXIVIpcSocialRequestResponse : FFXIVIpcBasePacket +{ + uint64_t contentId; + uint32_t unknown; + uint8_t category; // Common::SocialCategory + uint8_t response; // Common::SocialRequestResponse + char name[0x20]; + uint16_t padding; +}; + struct FFXIVIpcSocialList : FFXIVIpcBasePacket { uint32_t padding; diff --git a/src/servers/Server_Zone/Actor/Group/ContentGroup.cpp b/src/servers/Server_Zone/Actor/Group/ContentGroup.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/ContentGroup.h b/src/servers/Server_Zone/Actor/Group/ContentGroup.h new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/FreeCompany.cpp b/src/servers/Server_Zone/Actor/Group/FreeCompany.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/FreeCompany.h b/src/servers/Server_Zone/Actor/Group/FreeCompany.h new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Group.cpp b/src/servers/Server_Zone/Actor/Group/Group.cpp new file mode 100644 index 00000000..3751e3dc --- /dev/null +++ b/src/servers/Server_Zone/Actor/Group/Group.cpp @@ -0,0 +1,83 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include "Group.h" + +// todo: i fuckin have no fuckin clue how to use group manager classes, why not just have a map of ? +// todo: invite map in g_serverZone.getGroupMgr(GroupType) and look up + +Core::Network::Packets::GamePacketPtr Core::Entity::Group::Group::addMember( PlayerPtr pSender, PlayerPtr pRecipient, uint64_t senderId, uint64_t recipientId ) +{ + constexpr uint32_t logMessages[] = { + 0, // + 1 + }; + assert( pSender != nullptr || senderId != 0 ); + + using namespace Core::Network::Packets; + + uint64_t recipientContentId = 0; + + if( pSender ) + { + senderId = pSender->getId(); + } + + if( pRecipient ) + { + recipientId = pRecipient->getId(); + recipientContentId = pRecipient->getContentId(); + } + + auto packet = GamePacketNew< Server::FFXIVIpcSocialRequestResponse, ServerZoneIpcType >( recipientId, senderId ); + packet.data().contentId = recipientContentId; + + if( m_members.size() < m_maxCapacity ) + { + // todo: broadcast join message + + m_invites.erase( m_invites.find( recipientId ), m_invites.end() ); + GroupMember member; + member.inviterId = senderId; + member.role = 0; + member.pPlayer = pRecipient; + m_members.emplace( recipientId, member ); + reload(); + } + else + { + } + + return packet; +} + +void Core::Entity::Group::Group::sendPacketToMembers( Core::Network::Packets::GamePacketPtr pPacket, bool invitesToo ) +{ + assert( pPacket ); + if( pPacket ) + { + for( const auto& member : m_members ) + { + if( member.second.pPlayer ) + { + member.second.pPlayer->queuePacket( pPacket ); + } + } + } +} + +void Core::Entity::Group::Group::reload() +{ + m_reloadGroup = true; +} + +bool Core::Entity::Group::Group::canReload() const +{ + return m_reloadGroup; +} diff --git a/src/servers/Server_Zone/Actor/Group/Group.h b/src/servers/Server_Zone/Actor/Group/Group.h new file mode 100644 index 00000000..ee4c4476 --- /dev/null +++ b/src/servers/Server_Zone/Actor/Group/Group.h @@ -0,0 +1,74 @@ +#ifndef _GROUP_H +#define _GROUP_H + +#include +#include +#include +#include +#include +#include +#include + +namespace Core { +namespace Entity { +namespace Group { + +struct GroupMember +{ + uint64_t inviterId; + PlayerPtr pPlayer; + uint32_t role; +}; + +enum class GroupType : uint8_t +{ + None, + Party, + Friends, + FreeCompany, + Linkshell, + + FreeCompanyPetition, + Blacklist, + ContentGroup +}; + +class Group : public boost::enable_shared_from_this< Group > +{ +private: + GroupType m_type{ GroupType::None }; + uint64_t m_id{ 0 }; + uint64_t m_ownerId{ 0 }; + uint32_t m_maxCapacity{ 250 }; + uint32_t m_maxRoles{ 50 }; + time_point m_createTime{ std::chrono::steady_clock::now() }; + std::map< uint64_t, GroupMember > m_members; + std::map< uint64_t, uint64_t > m_invites; // + bool m_reloadGroup; + + void addMember( uint64_t senderId = 0, uint64_t recipientId = 0 ); + void inviteMember( uint64_t senderId, uint64_t recipientId = 0 ); + void removeMember( uint64_t id = 0 ); +public: + Group( uint64_t id, uint64_t ownerId, uint32_t maxCapacity, time_point createTime ) : + m_id( id ), m_ownerId( m_ownerId ), m_maxCapacity( maxCapacity ), m_createTime( createTime ){}; + ~Group(){}; + + virtual void load() = 0; + virtual void update() = 0; + virtual void disband() = 0; + + virtual Core::Network::Packets::GamePacketPtr addMember( PlayerPtr pSender, PlayerPtr pRecipient, uint64_t senderId = 0, uint64_t recipientId = 0 ); + virtual Core::Network::Packets::GamePacketPtr inviteMember( PlayerPtr pSender, PlayerPtr pRecipient, uint64_t senderId = 0, uint64_t recipientId = 0 ); + virtual Core::Network::Packets::GamePacketPtr removeMember( PlayerPtr pSender, PlayerPtr pRecipient, uint64_t senderId = 0, uint64_t recipientId = 0 ); + virtual Core::Network::Packets::GamePacketPtr kickMember( PlayerPtr pSender, PlayerPtr pRecipient, uint64_t senderId = 0, uint64_t recipientId = 0 ); + virtual void sendPacketToMembers( Core::Network::Packets::GamePacketPtr pPacket, bool invitesToo = false ); + + void reload(); + bool canReload() const; +}; + +} +} +}; +#endif // ! _GROUP_H \ No newline at end of file diff --git a/src/servers/Server_Zone/Actor/Group/Linkshell.cpp b/src/servers/Server_Zone/Actor/Group/Linkshell.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Linkshell.h b/src/servers/Server_Zone/Actor/Group/Linkshell.h new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/ContentGroupMgr.cpp b/src/servers/Server_Zone/Actor/Group/Manager/ContentGroupMgr.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/ContentGroupMgr.h b/src/servers/Server_Zone/Actor/Group/Manager/ContentGroupMgr.h new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/FreeCompanyMgr.cpp b/src/servers/Server_Zone/Actor/Group/Manager/FreeCompanyMgr.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/FreeCompanyMgr.h b/src/servers/Server_Zone/Actor/Group/Manager/FreeCompanyMgr.h new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.cpp b/src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.h b/src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.h new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/LinkshellMgr.cpp b/src/servers/Server_Zone/Actor/Group/Manager/LinkshellMgr.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/LinkshellMgr.h b/src/servers/Server_Zone/Actor/Group/Manager/LinkshellMgr.h new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/PartyMgr.cpp b/src/servers/Server_Zone/Actor/Group/Manager/PartyMgr.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Manager/PartyMgr.h b/src/servers/Server_Zone/Actor/Group/Manager/PartyMgr.h new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Party.cpp b/src/servers/Server_Zone/Actor/Group/Party.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/Actor/Group/Party.h b/src/servers/Server_Zone/Actor/Group/Party.h new file mode 100644 index 00000000..e69de29b diff --git a/src/servers/Server_Zone/CMakeLists.txt b/src/servers/Server_Zone/CMakeLists.txt index 11d27f8d..d2239c5e 100644 --- a/src/servers/Server_Zone/CMakeLists.txt +++ b/src/servers/Server_Zone/CMakeLists.txt @@ -7,6 +7,8 @@ project(Sapphire_Zone) file(GLOB SERVER_PUBLIC_INCLUDE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} /*.h Actor/*.h + Actor/Group/*.h + Actor/Group/Manager/*.h Action/*.h DebugCommand/*.h Event/*.h @@ -22,6 +24,8 @@ file(GLOB SERVER_PUBLIC_INCLUDE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} file(GLOB SERVER_SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.c* Actor/*.c* + Actor/Group/*.c* + Actor/Group/Manager/*.c* Action/*.c* DebugCommand/*.c* Event/*.c* diff --git a/src/servers/Server_Zone/Network/GameConnection.cpp b/src/servers/Server_Zone/Network/GameConnection.cpp index 882593c8..4e4c5a90 100644 --- a/src/servers/Server_Zone/Network/GameConnection.cpp +++ b/src/servers/Server_Zone/Network/GameConnection.cpp @@ -51,6 +51,7 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, setZoneHandler( ClientZoneIpcType::PlayTimeHandler, "PlayTimeHandler", &GameConnection::playTimeHandler ); setZoneHandler( ClientZoneIpcType::LogoutHandler, "LogoutHandler", &GameConnection::logoutHandler ); + setZoneHandler( ClientZoneIpcType::SocialReqSendHandler, "SocialReqSendHandler", &GameConnection::socialReqSendHandler ); setZoneHandler( ClientZoneIpcType::SocialListHandler, "SocialListHandler", &GameConnection::socialListHandler ); setZoneHandler( ClientZoneIpcType::SetSearchInfoHandler, "SetSearchInfoHandler", &GameConnection::setSearchInfoHandler ); setZoneHandler( ClientZoneIpcType::ReqSearchInfoHandler, "ReqSearchInfoHandler", &GameConnection::reqSearchInfoHandler ); diff --git a/src/servers/Server_Zone/Network/GameConnection.h b/src/servers/Server_Zone/Network/GameConnection.h index 24ae61e5..cea1dec9 100644 --- a/src/servers/Server_Zone/Network/GameConnection.h +++ b/src/servers/Server_Zone/Network/GameConnection.h @@ -89,6 +89,7 @@ public: DECLARE_HANDLER( initHandler ); DECLARE_HANDLER( finishLoadingHandler ); DECLARE_HANDLER( blackListHandler ); + DECLARE_HANDLER( socialReqSendHandler ); DECLARE_HANDLER( socialListHandler ); DECLARE_HANDLER( linkshellListHandler ); DECLARE_HANDLER( playTimeHandler ); @@ -119,7 +120,6 @@ public: DECLARE_HANDLER( reqEquipDisplayFlagsHandler ); DECLARE_HANDLER( tellHandler ); - }; diff --git a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp index 9028feaf..7bc18fe9 100644 --- a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp @@ -452,16 +452,15 @@ void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket listPacket.data().entries[0].contentId = pPlayer->getContentId(); listPacket.data().entries[0].level = pPlayer->getLevel(); listPacket.data().entries[0].zoneId = pPlayer->getCurrentZone()->getId(); - listPacket.data().entries[0].zoneId1 = 0x0100; + listPacket.data().entries[0].grandCompany = pPlayer->getGc(); + memcpy( &listPacket.data().entries[0].fcTag[0], "Sapphire", sizeof( "Sapphire" ) ); + listPacket.data().entries[0].clientLanguage = 2; + listPacket.data().entries[0].knownLanguages = 0x0F; // TODO: no idea what this does //listPacket.data().entries[0].one = 1; memcpy( listPacket.data().entries[0].name, pPlayer->getName().c_str(), strlen( pPlayer->getName().c_str() ) ); - // TODO: actually store and read language from somewhere - listPacket.data().entries[0].bytes1[0] = 0x01;//flags (lang) - // TODO: these flags need to be figured out - //listPacket.data().entries[0].bytes1[1] = 0x00;//flags listPacket.data().entries[0].onlineStatusMask = pPlayer->getOnlineStatusMask(); queueOutPacket( listPacket );