mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-25 11:07:45 +00:00
Reworking some more on group generation and flow;
This commit is contained in:
parent
f3e2213409
commit
9e152f253f
12 changed files with 167 additions and 67 deletions
|
@ -81,7 +81,12 @@ struct FFXIVIpcPlayTime : FFXIVIpcBasePacket<Playtime>
|
||||||
*/
|
*/
|
||||||
struct PlayerEntry {
|
struct PlayerEntry {
|
||||||
uint64_t contentId;
|
uint64_t contentId;
|
||||||
uint8_t bytes[12];
|
uint32_t timestamp;
|
||||||
|
uint8_t bytes[4];
|
||||||
|
uint8_t status; // bitmask. friend: if it's a request, if added, recipient/sender
|
||||||
|
uint8_t unknown; // maybe bitmask? a value of 4 sets it to linkshell request
|
||||||
|
uint8_t entryIcon; // observed in friend group icon, sideffects for displaying text
|
||||||
|
uint8_t unavailable; // bool
|
||||||
uint16_t zoneId;
|
uint16_t zoneId;
|
||||||
uint8_t grandCompany;
|
uint8_t grandCompany;
|
||||||
uint8_t clientLanguage;
|
uint8_t clientLanguage;
|
||||||
|
@ -95,7 +100,7 @@ struct PlayerEntry {
|
||||||
uint16_t padding2;
|
uint16_t padding2;
|
||||||
uint8_t one;
|
uint8_t one;
|
||||||
char name[0x20];
|
char name[0x20];
|
||||||
char fcTag[9];
|
char fcTag[5];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FFXIVIpcSocialRequestReceive : FFXIVIpcBasePacket<SocialRequestReceive>
|
struct FFXIVIpcSocialRequestReceive : FFXIVIpcBasePacket<SocialRequestReceive>
|
||||||
|
|
|
@ -303,9 +303,9 @@ void Core::Entity::Player::sendStats()
|
||||||
queuePacket( statPacket );
|
queuePacket( statPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
Social::FriendListPtr Core::Entity::Player::getFriendsList() const
|
uint64_t Core::Entity::Player::getFriendsListId() const
|
||||||
{
|
{
|
||||||
return m_friendsList;
|
return m_friendsListId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type )
|
void Core::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type )
|
||||||
|
@ -447,7 +447,7 @@ void Core::Entity::Player::setZone( uint32_t zoneId )
|
||||||
//todo: change this to extern, global obj
|
//todo: change this to extern, global obj
|
||||||
Core::Entity::Social::FriendListMgr fListMgr = {};
|
Core::Entity::Social::FriendListMgr fListMgr = {};
|
||||||
|
|
||||||
m_friendsList = fListMgr.getPlayerFriendsList( getId() );
|
m_friendsListId = fListMgr.fetchPlayerFriendsList( getId() );
|
||||||
|
|
||||||
m_itemLevel = getInventory()->calculateEquippedGearItemLevel();
|
m_itemLevel = getInventory()->calculateEquippedGearItemLevel();
|
||||||
sendItemLevel();
|
sendItemLevel();
|
||||||
|
|
|
@ -363,7 +363,7 @@ public:
|
||||||
// Social-based
|
// Social-based
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
Social::FriendListPtr getFriendsList() const;
|
uint64_t getFriendsListId() const;
|
||||||
|
|
||||||
|
|
||||||
// Aetheryte / Action / Attribute bitmasks
|
// Aetheryte / Action / Attribute bitmasks
|
||||||
|
@ -627,7 +627,7 @@ private:
|
||||||
|
|
||||||
// Social-based
|
// Social-based
|
||||||
|
|
||||||
Social::FriendListPtr m_friendsList;
|
uint64_t m_friendsListId;
|
||||||
|
|
||||||
uint8_t m_equipDisplayFlags;
|
uint8_t m_equipDisplayFlags;
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,9 @@ class FriendList : public Group
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FriendList( uint64_t id, uint64_t ownerId, uint32_t maxCapacity, time_point createTime ) :
|
FriendList( uint64_t id, uint64_t ownerId ) :
|
||||||
Group( id, ownerId, maxCapacity, createTime ),
|
Group( id, ownerId ),
|
||||||
m_id( id ), m_ownerId( ownerId ), m_maxCapacity( maxCapacity ), m_createTime( createTime ) {};
|
m_id( id ), m_ownerId( ownerId ) {};
|
||||||
|
|
||||||
~FriendList() {};
|
|
||||||
|
|
||||||
/*virtual void load();
|
/*virtual void load();
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
@ -48,16 +46,11 @@ public:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
GroupType m_type{ GroupType::FriendList };
|
|
||||||
uint64_t m_id{ 0 };
|
uint64_t m_id{ 0 };
|
||||||
uint64_t m_ownerId{ 0 };
|
uint64_t m_ownerId{ 0 };
|
||||||
|
GroupType m_type{ GroupType::FriendList };
|
||||||
uint32_t m_maxCapacity{ 200 };
|
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; // <recipient, sender>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include <Server_Common/Logging/Logger.h>
|
||||||
|
|
||||||
#include <Server_Zone/Session.h>
|
#include <Server_Zone/Session.h>
|
||||||
#include <Server_Common/Network/PacketDef/Ipcs.h>
|
#include <Server_Common/Network/PacketDef/Ipcs.h>
|
||||||
|
@ -12,6 +13,7 @@
|
||||||
#include "Group.h"
|
#include "Group.h"
|
||||||
|
|
||||||
extern Core::ServerZone g_serverZone;
|
extern Core::ServerZone g_serverZone;
|
||||||
|
extern Core::Logger g_log;
|
||||||
|
|
||||||
using namespace Core::Entity::Social;
|
using namespace Core::Entity::Social;
|
||||||
|
|
||||||
|
@ -43,6 +45,7 @@ Core::Network::Packets::GamePacketPtr Group::addMember( Core::Entity::PlayerPtr
|
||||||
|
|
||||||
auto packet = GamePacketNew< Server::FFXIVIpcSocialRequestResponse, ServerZoneIpcType >( recipientId, senderId );
|
auto packet = GamePacketNew< Server::FFXIVIpcSocialRequestResponse, ServerZoneIpcType >( recipientId, senderId );
|
||||||
packet.data().contentId = recipientContentId;
|
packet.data().contentId = recipientContentId;
|
||||||
|
packet.data().category = Common::SocialCategory::Friends;
|
||||||
|
|
||||||
if( m_members.size() < m_maxCapacity )
|
if( m_members.size() < m_maxCapacity )
|
||||||
{
|
{
|
||||||
|
@ -63,6 +66,40 @@ Core::Network::Packets::GamePacketPtr Group::addMember( Core::Entity::PlayerPtr
|
||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Core::Network::Packets::GamePacketPtr Group::inviteMember( Core::Entity::PlayerPtr pSender, Core::Entity::PlayerPtr pRecipient, uint64_t senderId, uint64_t recipientId )
|
||||||
|
{
|
||||||
|
assert( pSender != nullptr || senderId != 0 );
|
||||||
|
|
||||||
|
auto packet = GamePacketNew< Server::FFXIVIpcSocialRequestResponse, ServerZoneIpcType >( recipientId, senderId );
|
||||||
|
packet.data().contentId = recipientId;
|
||||||
|
packet.data().category = Common::SocialCategory::Friends;
|
||||||
|
|
||||||
|
if ( m_invites.size() < m_maxCapacity )
|
||||||
|
{
|
||||||
|
GroupMember member;
|
||||||
|
member.inviterId = senderId;
|
||||||
|
member.role = 0;
|
||||||
|
member.contentId = recipientId;
|
||||||
|
member.name = pSender->getName();
|
||||||
|
|
||||||
|
m_invites.emplace( recipientId, member );
|
||||||
|
}
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo: fix
|
||||||
|
Core::Network::Packets::GamePacketPtr Group::removeMember( Core::Entity::PlayerPtr pSender, Core::Entity::PlayerPtr pRecipient, uint64_t senderId, uint64_t recipientId )
|
||||||
|
{
|
||||||
|
assert( pSender != nullptr || senderId != 0 );
|
||||||
|
|
||||||
|
auto packet = GamePacketNew< Server::FFXIVIpcSocialRequestResponse, ServerZoneIpcType >( recipientId, senderId );
|
||||||
|
packet.data().contentId = recipientId;
|
||||||
|
packet.data().category = Common::SocialCategory::Friends;
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
void Group::sendPacketToMembers( Core::Network::Packets::GamePacketPtr pPacket, bool invitesToo )
|
void Group::sendPacketToMembers( Core::Network::Packets::GamePacketPtr pPacket, bool invitesToo )
|
||||||
{
|
{
|
||||||
assert( pPacket );
|
assert( pPacket );
|
||||||
|
@ -86,31 +123,41 @@ Core::Network::Packets::Server::PlayerEntry Group::generatePlayerEntry( GroupMem
|
||||||
// We check if player is online. If so, we can pull more data - otherwise just name
|
// We check if player is online. If so, we can pull more data - otherwise just name
|
||||||
// todo: set as offline in one of the unknown values, if session does not exist
|
// todo: set as offline in one of the unknown values, if session does not exist
|
||||||
|
|
||||||
auto pSession = g_serverZone.getSession( groupMember.contentId ); // todo: aa i don't like this. maybe just store their ID instead of contentID???
|
auto pSession = g_serverZone.getSession( groupMember.name ); // todo: aa i don't like this. maybe just store their ID instead of contentID???
|
||||||
entry.bytes[3] = 0x10;
|
|
||||||
entry.bytes[4] = 0x00;
|
entry.timestamp = 1512799339;
|
||||||
entry.bytes[6] = 0x3F;
|
entry.status = 2;
|
||||||
entry.bytes[11] = 0x10;
|
entry.unknown = 0;
|
||||||
|
//entry.entryIcon = 0xf;
|
||||||
|
entry.unavailable = 0; // unavailable (other world)
|
||||||
|
entry.one = 0;
|
||||||
|
|
||||||
if( pSession )
|
if( pSession )
|
||||||
{
|
{
|
||||||
auto pPlayer = pSession->getPlayer();
|
auto pPlayer = pSession->getPlayer();
|
||||||
entry.contentId = pPlayer->getContentId();
|
entry.contentId = pPlayer->getContentId();
|
||||||
entry.bytes[2] = pPlayer->getCurrentZone()->getId();
|
//entry.bytes[2] = pPlayer->getCurrentZone()->getId();
|
||||||
|
|
||||||
entry.classJob = pPlayer->getClass();
|
entry.classJob = pPlayer->getClass();
|
||||||
|
|
||||||
entry.level = pPlayer->getLevel();
|
entry.level = pPlayer->getLevel();
|
||||||
entry.zoneId = pPlayer->getCurrentZone()->getId();
|
entry.zoneId = pPlayer->getCurrentZone()->getId();
|
||||||
entry.grandCompany = pPlayer->getGc();
|
entry.grandCompany = pPlayer->getGc();
|
||||||
memcpy( &entry.fcTag[0], "Meme", 9 );
|
memcpy( &entry.fcTag[0], "Meme", 4 );
|
||||||
entry.clientLanguage = 2;
|
entry.clientLanguage = 2;
|
||||||
entry.knownLanguages = 0x0F;
|
entry.knownLanguages = 0x0F;
|
||||||
entry.onlineStatusMask = pPlayer->getOnlineStatusMask();
|
entry.onlineStatusMask = pPlayer->getOnlineStatusMask();
|
||||||
|
|
||||||
|
g_log.debug( std::to_string( pPlayer->getContentId() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: no idea what this does - me neither
|
// TODO: no idea what this does - me neither
|
||||||
//listPacket.data().entries[0].one = 1;
|
//listPacket.data().entries[0].one = 1;
|
||||||
|
|
||||||
|
g_log.debug( std::to_string(groupMember.contentId) );
|
||||||
|
|
||||||
|
g_log.debug( std::to_string( entry.contentId ) );
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,9 +40,8 @@ enum class GroupType : uint8_t
|
||||||
class Group : public boost::enable_shared_from_this< Group >
|
class Group : public boost::enable_shared_from_this< Group >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Group( uint64_t id, uint64_t ownerId, uint32_t maxCapacity, time_point createTime ) :
|
Group( uint64_t id, uint64_t ownerId ) :
|
||||||
m_id( id ), m_ownerId( m_ownerId ), m_maxCapacity( maxCapacity ), m_createTime( createTime ) {};
|
m_id( id ), m_ownerId( m_ownerId ) {};
|
||||||
~Group() {};
|
|
||||||
|
|
||||||
bool isParty() const;
|
bool isParty() const;
|
||||||
bool isFriendList() const;
|
bool isFriendList() const;
|
||||||
|
@ -53,10 +52,10 @@ public:
|
||||||
bool isContentGroup() 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 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 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 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 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 sendPacketToMembers( Core::Network::Packets::GamePacketPtr pPacket, bool invitesToo = false );
|
||||||
|
|
||||||
/*! generates a player entry used for lists (social, etc) */
|
/*! generates a player entry used for lists (social, etc) */
|
||||||
|
@ -69,7 +68,7 @@ public:
|
||||||
/*! get container limit */
|
/*! get container limit */
|
||||||
uint32_t getCapacity() const;
|
uint32_t getCapacity() const;
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
GroupType m_type{ GroupType::None };
|
GroupType m_type{ GroupType::None };
|
||||||
uint64_t m_id{ 0 };
|
uint64_t m_id{ 0 };
|
||||||
uint64_t m_ownerId{ 0 };
|
uint64_t m_ownerId{ 0 };
|
||||||
|
@ -77,10 +76,10 @@ private:
|
||||||
uint32_t m_maxRoles{ 50 };
|
uint32_t m_maxRoles{ 50 };
|
||||||
time_point m_createTime{ std::chrono::steady_clock::now() };
|
time_point m_createTime{ std::chrono::steady_clock::now() };
|
||||||
std::map< uint64_t, GroupMember > m_members;
|
std::map< uint64_t, GroupMember > m_members;
|
||||||
std::map< uint64_t, uint64_t > m_invites; // <recipient, sender>
|
std::map< uint64_t, GroupMember > m_invites; // <recipient, groupmember (which contains senderId)>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
/*virtual void load();
|
/*virtual void load();
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
|
|
@ -14,27 +14,22 @@ using namespace Core::Entity;
|
||||||
Core::Entity::Social::FriendListMgr::FriendListMgr()
|
Core::Entity::Social::FriendListMgr::FriendListMgr()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Entity::Social::FriendListMgr::~FriendListMgr()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Social::FriendListMgr::init()
|
bool Social::FriendListMgr::init()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Social::FriendListPtr Social::FriendListMgr::getPlayerFriendsList( uint32_t playerId )
|
uint64_t Social::FriendListMgr::fetchPlayerFriendsList( uint32_t playerId )
|
||||||
{
|
{
|
||||||
std::mt19937_64 engine( std::random_device{}( ) );
|
uint64_t newGroupId = generateGroupId();
|
||||||
std::uniform_int_distribution<uint64_t> distribution;
|
|
||||||
auto ui64 = distribution( engine );
|
|
||||||
|
|
||||||
FriendList nFriendList( ui64, playerId, 200, std::chrono::steady_clock::now() );
|
auto pFriendList = boost::make_shared< FriendList >( newGroupId, playerId );
|
||||||
|
|
||||||
FriendListPtr pFriendList = boost::make_shared< FriendList >( nFriendList );
|
m_groups.emplace( newGroupId, pFriendList );
|
||||||
pFriendList->getCapacity();
|
|
||||||
return pFriendList;
|
g_log.debug( std::to_string( m_groups.size() ) );
|
||||||
|
|
||||||
|
return newGroupId;
|
||||||
}
|
}
|
|
@ -16,22 +16,23 @@ namespace Core {
|
||||||
namespace Entity {
|
namespace Entity {
|
||||||
namespace Social {
|
namespace Social {
|
||||||
|
|
||||||
class FriendListMgr
|
class FriendListMgr : public GroupMgr
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FriendListMgr();
|
FriendListMgr();
|
||||||
~FriendListMgr();
|
|
||||||
|
|
||||||
bool init();
|
bool init();
|
||||||
|
|
||||||
FriendListPtr getPlayerFriendsList( uint32_t playerId );
|
uint64_t fetchPlayerFriendsList( uint32_t playerId );
|
||||||
|
/*
|
||||||
|
FriendListPtr findGroupByInviteIdForPlayer( uint64_t playerId ) const;
|
||||||
|
FriendListPtr findGroupById( uint64_t groupId ) const;
|
||||||
|
*/
|
||||||
|
std::map< uint64_t, FriendListPtr > m_groups;
|
||||||
private:
|
private:
|
||||||
|
// todo: can we handle this m_groups grouptype better..?
|
||||||
|
|
||||||
GroupType m_type{ GroupType::FriendList };
|
GroupType m_type{ GroupType::FriendList };
|
||||||
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 >
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,11 @@ Social::GroupMgr::GroupMgr()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Social::GroupMgr::~GroupMgr()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Social::GroupPtr Social::GroupMgr::findGroupByInviteIdForPlayer( uint64_t playerId ) const
|
Social::GroupPtr Social::GroupMgr::findGroupByInviteIdForPlayer( uint64_t playerId ) const
|
||||||
{
|
{
|
||||||
auto it = m_invites.find( playerId );
|
auto it = m_invites.find( playerId );
|
||||||
|
@ -18,7 +23,7 @@ Social::GroupPtr Social::GroupMgr::findGroupByInviteIdForPlayer( uint64_t player
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Social::GroupPtr Core::Entity::Social::GroupMgr::findGroupById( uint64_t groupId ) const
|
Social::GroupPtr Social::GroupMgr::findGroupById( uint64_t groupId ) const
|
||||||
{
|
{
|
||||||
auto it = m_groups.find( groupId );
|
auto it = m_groups.find( groupId );
|
||||||
if( it != m_groups.end() )
|
if( it != m_groups.end() )
|
||||||
|
@ -26,4 +31,20 @@ Social::GroupPtr Core::Entity::Social::GroupMgr::findGroupById( uint64_t groupId
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Social::GroupMgr::generateGroupId()
|
||||||
|
{
|
||||||
|
m_lastGroupId++;
|
||||||
|
return m_lastGroupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Social::GroupMgr::hasInvite( uint64_t playerId ) const
|
||||||
|
{
|
||||||
|
auto it = m_invites.find( playerId );
|
||||||
|
if ( it != m_invites.end() )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
|
@ -12,20 +12,38 @@ namespace Core {
|
||||||
namespace Entity {
|
namespace Entity {
|
||||||
namespace Social {
|
namespace Social {
|
||||||
|
|
||||||
class GroupMgr : public boost::enable_shared_from_this< GroupMgr >
|
class GroupMgr
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GroupMgr();
|
GroupMgr();
|
||||||
|
virtual ~GroupMgr();
|
||||||
|
|
||||||
GroupPtr findGroupByInviteIdForPlayer( uint64_t playerId ) const;
|
virtual GroupPtr findGroupByInviteIdForPlayer( uint64_t playerId ) const;
|
||||||
GroupPtr findGroupById( uint64_t groupId ) const;
|
virtual GroupPtr findGroupById( uint64_t groupId ) const;
|
||||||
|
/*
|
||||||
|
template <typename GroupPtr>
|
||||||
|
GroupPtr findGroup( uint64_t arg )
|
||||||
|
{
|
||||||
|
auto it = m_groups.find( groupId );
|
||||||
|
if ( it != m_groups.end() )
|
||||||
|
{
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}*/
|
||||||
|
|
||||||
private:
|
bool hasInvite( uint64_t playerId ) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
GroupType m_type{ GroupType::None };
|
GroupType m_type{ GroupType::None };
|
||||||
uint64_t m_groupCount{ 0 };
|
uint64_t m_groupCount{ 0 };
|
||||||
uint32_t m_maxEntries{ 0xFFFFFFFF };
|
uint32_t m_maxEntries{ 0xFFFFFFFF };
|
||||||
std::map< uint64_t, GroupPtr > m_groups;
|
|
||||||
std::map< uint64_t, uint64_t > m_invites; // < recipient, groupid >
|
std::map< uint64_t, uint64_t > m_invites;
|
||||||
|
|
||||||
|
uint64_t m_lastGroupId{ 0 };
|
||||||
|
|
||||||
|
// < recipient, groupid >
|
||||||
//virtual GroupPtr createGroup( PlayerPtr pOwner ) = 0;
|
//virtual GroupPtr createGroup( PlayerPtr pOwner ) = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -40,6 +58,11 @@ private:
|
||||||
friend virtual void disband();
|
friend virtual void disband();
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
virtual uint64_t generateGroupId();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::map< uint64_t, GroupPtr > m_groups;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "Event/EventHelper.h"
|
#include "Event/EventHelper.h"
|
||||||
#include "Action/Action.h"
|
#include "Action/Action.h"
|
||||||
#include "Action/ActionTeleport.h"
|
#include "Action/ActionTeleport.h"
|
||||||
|
#include "Actor/Social/Manager/FriendListMgr.h"
|
||||||
|
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
|
@ -43,6 +44,7 @@ extern Core::ServerZone g_serverZone;
|
||||||
extern Core::ZoneMgr g_zoneMgr;
|
extern Core::ZoneMgr g_zoneMgr;
|
||||||
extern Core::Data::ExdData g_exdData;
|
extern Core::Data::ExdData g_exdData;
|
||||||
extern Core::DebugCommandHandler g_gameCommandMgr;
|
extern Core::DebugCommandHandler g_gameCommandMgr;
|
||||||
|
extern Core::Entity::Social::FriendListMgr g_friendListMgr;
|
||||||
|
|
||||||
using namespace Core::Common;
|
using namespace Core::Common;
|
||||||
using namespace Core::Network::Packets;
|
using namespace Core::Network::Packets;
|
||||||
|
@ -476,10 +478,12 @@ void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket
|
||||||
|
|
||||||
uint16_t i = 0;
|
uint16_t i = 0;
|
||||||
|
|
||||||
g_log.debug( std::to_string( player.getFriendsList()->getMembers().size() ) );
|
auto playerFriendsList = g_friendListMgr.findGroupById( player.getFriendsListId() );
|
||||||
|
|
||||||
for ( auto member : player.getFriendsList()->getMembers() )
|
// todo: move this garbage else fucking where
|
||||||
|
for ( auto member : playerFriendsList->getMembers() )
|
||||||
{
|
{
|
||||||
|
// more elegant way to break over list entries pls
|
||||||
if ( i == 10 )
|
if ( i == 10 )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -686,7 +690,16 @@ void Core::Network::GameConnection::socialReqSendHandler( const Packets::GamePac
|
||||||
pRecipient->queuePacket( packet );
|
pRecipient->queuePacket( packet );
|
||||||
pRecipient->sendDebug( "ding ding" );
|
pRecipient->sendDebug( "ding ding" );
|
||||||
|
|
||||||
pRecipient->getFriendsList()->addMember( player.getAsPlayer(), pRecipient, player.getId(), pRecipient->getId() );
|
auto recipientFriendsList = g_friendListMgr.findGroupById( pRecipient->getFriendsListId() );
|
||||||
|
|
||||||
|
auto senderResultPacket = recipientFriendsList->inviteMember( player.getAsPlayer(), pRecipient, player.getId(), pRecipient->getId() );
|
||||||
|
|
||||||
|
player.queuePacket( senderResultPacket );
|
||||||
|
|
||||||
|
if ( recipientFriendsList->isFriendList() )
|
||||||
|
{
|
||||||
|
g_log.debug( "he HAA HAAA" );
|
||||||
|
}
|
||||||
|
|
||||||
response.data().messageId = typeMessage[category];
|
response.data().messageId = typeMessage[category];
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ Core::Data::ExdData g_exdData;
|
||||||
Core::ZoneMgr g_zoneMgr;
|
Core::ZoneMgr g_zoneMgr;
|
||||||
Core::LinkshellMgr g_linkshellMgr;
|
Core::LinkshellMgr g_linkshellMgr;
|
||||||
Core::Db::DbWorkerPool< Core::Db::CharaDbConnection > g_charaDb;
|
Core::Db::DbWorkerPool< Core::Db::CharaDbConnection > g_charaDb;
|
||||||
|
Core::Entity::Social::FriendListMgr g_friendListMgr;
|
||||||
|
|
||||||
Core::ServerZone::ServerZone( const std::string& configPath )
|
Core::ServerZone::ServerZone( const std::string& configPath )
|
||||||
: m_configPath( configPath ),
|
: m_configPath( configPath ),
|
||||||
|
@ -219,6 +220,8 @@ void Core::ServerZone::run( int32_t argc, char* argv[] )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_friendListMgr.init();
|
||||||
|
|
||||||
Network::HivePtr hive( new Network::Hive() );
|
Network::HivePtr hive( new Network::Hive() );
|
||||||
Network::addServerToHive< Network::GameConnection >( m_ip, m_port, hive );
|
Network::addServerToHive< Network::GameConnection >( m_ip, m_port, hive );
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue