diff --git a/src/servers/Server_Zone/Actor/Group/FriendList.cpp b/src/servers/Server_Zone/Actor/Group/FriendList.cpp new file mode 100644 index 00000000..058fdab2 --- /dev/null +++ b/src/servers/Server_Zone/Actor/Group/FriendList.cpp @@ -0,0 +1,10 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include "FriendList.h" diff --git a/src/servers/Server_Zone/Actor/Group/FriendList.h b/src/servers/Server_Zone/Actor/Group/FriendList.h new file mode 100644 index 00000000..e0f0625c --- /dev/null +++ b/src/servers/Server_Zone/Actor/Group/FriendList.h @@ -0,0 +1,81 @@ +#ifndef _FRIENDLIST_H +#define _FRIENDLIST_H + +#include +#include +#include +#include +#include +#include +#include +#include + + + +namespace Core { +namespace Entity { +namespace Group { + +class FriendList; +using FriendListPtr = boost::shared_ptr< FriendList >; + +struct GroupMember +{ + uint64_t contentId; + char name[32]; + uint32_t category; + uint64_t inviterId; +}; + +enum class GroupType : uint8_t +{ + None, + Party, + FriendList, + FreeCompany, + Linkshell, + FreeCompanyPetition, + Blacklist, + ContentGroup +}; + +class FriendList : public Group +{ +private: + GroupType m_type{ GroupType::FriendList }; + uint64_t m_id{ 0 }; + uint64_t m_ownerId{ 0 }; + uint32_t m_maxCapacity{ 200 }; + uint32_t m_maxRoles{ 8 }; + time_point m_createTime{ std::chrono::steady_clock::now() }; + std::map< uint64_t, GroupMember > m_members; + std::map< uint64_t, uint64_t > m_invites; // + + + 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 ); + + virtual void load(); + virtual void update(); + virtual void disband(); +public: + FriendList( 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 ){}; + ~FriendList(){}; + + bool isParty() const; + bool isFriendList() const; + bool isFreeCompany() const; + bool isLinkshell() const; + bool isFreeCompanyPetition() const; + bool isBlacklist() const; + bool isContentGroup() const; +}; + +} +} +}; +#endif // ! _FRIENDLIST_H \ No newline at end of file diff --git a/src/servers/Server_Zone/Actor/Group/Group.cpp b/src/servers/Server_Zone/Actor/Group/Group.cpp index 5a55bc77..83f490f4 100644 --- a/src/servers/Server_Zone/Actor/Group/Group.cpp +++ b/src/servers/Server_Zone/Actor/Group/Group.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -9,6 +10,8 @@ #include #include "Group.h" +extern Core::ServerZone g_serverZone; + // 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 @@ -46,7 +49,7 @@ Core::Network::Packets::GamePacketPtr Core::Entity::Group::Group::addMember( Pla GroupMember member; member.inviterId = senderId; member.role = 0; - member.pPlayer = pRecipient; + member.contentId = recipientId; m_members.emplace( recipientId, member ); } else @@ -59,14 +62,12 @@ Core::Network::Packets::GamePacketPtr Core::Entity::Group::Group::addMember( Pla void Core::Entity::Group::Group::sendPacketToMembers( Core::Network::Packets::GamePacketPtr pPacket, bool invitesToo ) { assert( pPacket ); - if( pPacket ) + for( const auto& member : m_members ) { - for( const auto& member : m_members ) + auto pSession = g_serverZone.getSession( member.second.name ); + if( pSession ) { - if( member.second.pPlayer ) - { - member.second.pPlayer->queuePacket( pPacket ); - } + pSession->getPlayer()->queuePacket( pPacket ); } } } diff --git a/src/servers/Server_Zone/Actor/Group/Group.h b/src/servers/Server_Zone/Actor/Group/Group.h index 6e4d5e1c..d44df05b 100644 --- a/src/servers/Server_Zone/Actor/Group/Group.h +++ b/src/servers/Server_Zone/Actor/Group/Group.h @@ -19,7 +19,8 @@ using GroupPtr = boost::shared_ptr< Group >; struct GroupMember { uint64_t inviterId; - PlayerPtr pPlayer; + uint64_t contentId; + std::string name; uint32_t role; }; @@ -49,11 +50,7 @@ private: std::map< uint64_t, uint64_t > m_invites; // - 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 ); + virtual void load(); virtual void update(); @@ -70,6 +67,12 @@ public: bool isFreeCompanyPetition() const; bool isBlacklist() const; bool isContentGroup() const; + + 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); }; } diff --git a/src/servers/Server_Zone/Actor/Group/Manager/FriendListMgr.cpp b/src/servers/Server_Zone/Actor/Group/Manager/FriendListMgr.cpp new file mode 100644 index 00000000..1293cfed --- /dev/null +++ b/src/servers/Server_Zone/Actor/Group/Manager/FriendListMgr.cpp @@ -0,0 +1,2 @@ +#include "../FriendList.h" +#include "FriendListMgr.h" diff --git a/src/servers/Server_Zone/Actor/Group/Manager/FriendListMgr.h b/src/servers/Server_Zone/Actor/Group/Manager/FriendListMgr.h new file mode 100644 index 00000000..0b490137 --- /dev/null +++ b/src/servers/Server_Zone/Actor/Group/Manager/FriendListMgr.h @@ -0,0 +1,39 @@ +#ifndef _FRIENDLISTMGR_H +#define _FRIENDLISTMGR_H + +#include +#include + +#include +#include +#include + +#include + +namespace Core { +namespace Entity { +namespace Group { + +class FriendListMgr : public GroupMgr +{ +private: + GroupType m_type{ GroupType::None }; + uint64_t m_groupCount{ 0 }; + uint32_t m_maxEntries{ 0xFFFFFFFF }; + std::map< uint64_t, GroupPtr > m_groups; // < groupid, groupPtr > + std::map< uint64_t, uint64_t > m_invites; // < recipient, groupid > + virtual GroupPtr createGroup( PlayerPtr pOwner ) = 0; + +public: + FriendListMgr( GroupType type, uint32_t maxEntries ) : + m_type( type ), m_maxEntries( maxEntries ){}; + ~FriendListMgr(){}; + + GroupPtr findGroupByInviteIdForPlayer( uint64_t playerId ) const; + GroupPtr findGroupById( uint64_t groupId ) const; +}; + +} +} +}; +#endif /* ! _FRIENDLISTMGR_H */ \ No newline at end of file diff --git a/src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.h b/src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.h index 0c55a446..a26e19ba 100644 --- a/src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.h +++ b/src/servers/Server_Zone/Actor/Group/Manager/GroupMgr.h @@ -32,7 +32,7 @@ private: friend virtual void load(); friend virtual void update(); friend virtual void disband(); - //*/ + */ public: GroupMgr( GroupType type, uint32_t maxEntries ) : m_type( type ), m_maxEntries( maxEntries ){}; diff --git a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp index fd5713ec..ccd33a27 100644 --- a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp @@ -429,7 +429,7 @@ void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePac void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer ) { - + uint8_t type = inPacket.getValAt< uint8_t >( 0x2A ); uint8_t count = inPacket.getValAt< uint8_t >( 0x2B );