Group members should now always be temp removed on zoning/client deconstruct

This commit is contained in:
image 2020-08-30 07:30:22 -04:00
parent def9e92b21
commit 45710414ec
4 changed files with 44 additions and 14 deletions

View file

@ -752,4 +752,19 @@ bool PlayerGroupManager::IsInGroup(int32 group_id, Entity* member) {
MGroups.releasereadlock(__FUNCTION__, __LINE__);
return ret;
}
void PlayerGroup::RemoveClientReference(Client* remove) {
deque<GroupMemberInfo*>::iterator itr;
MGroupMembers.writelock();
for (itr = m_members.begin(); itr != m_members.end(); itr++) {
GroupMemberInfo* gmi = *itr;
if (gmi->client && gmi->client == remove)
{
gmi->client = 0;
gmi->member = 0;
break;
}
}
MGroupMembers.releasewritelock();
}

View file

@ -83,6 +83,8 @@ public:
void GroupChatMessage(Spawn* from, const char* message);
void MakeLeader(Entity* new_leader);
void RemoveClientReference(Client* remove);
Mutex MGroupMembers; // Mutex for the group members
private:
int32 m_id; // ID of this group
@ -177,7 +179,6 @@ public:
void UpdateGroupBuffs();
bool IsInGroup(int32 group_id, Entity* member);
// TODO: Any function below this comment
bool IsSpawnInGroup(int32 group_id, string name); // used in follow
Player* GetGroupLeader(int32 group_id);

View file

@ -199,10 +199,14 @@ Client::Client(EQStream* ieqs) : pos_update(125), quest_pos_timer(2000), lua_deb
Client::~Client() {
if (current_zone && player) {
if (player->GetGroupMemberInfo() && (player->GetActivityStatus() & ACTIVITY_STATUS_LINKDEAD) > 0)
world.GetGroupManager()->RemoveGroupMember(player->GetGroupMemberInfo()->group_id, player);
if (player->GetGroupMemberInfo())
{
if ((player->GetActivityStatus() & ACTIVITY_STATUS_LINKDEAD) > 0)
world.GetGroupManager()->RemoveGroupMember(player->GetGroupMemberInfo()->group_id, player);
else
TempRemoveGroup();
}
world.GetGroupManager()->ClearPendingInvite(player);
}
if (lua_interface)
lua_interface->RemoveDebugClients(this);
@ -3510,16 +3514,7 @@ void Client::Zone(ZoneServer* new_zone, bool set_coords) {
}
// block out the member info for the group
if (this->GetPlayer()->GetGroupMemberInfo())
{
world.GetGroupManager()->GroupLock(__FUNCTION__, __LINE__);
PlayerGroup* group = world.GetGroupManager()->GetGroup(this->GetPlayer()->GetGroupMemberInfo()->group_id);
group->MGroupMembers.writelock();
this->GetPlayer()->GetGroupMemberInfo()->client = 0;
this->GetPlayer()->GetGroupMemberInfo()->member = 0;
group->MGroupMembers.releasewritelock();
world.GetGroupManager()->ReleaseGroupLock(__FUNCTION__, __LINE__);
}
TempRemoveGroup();
client_zoning = true;
LogWrite(CCLIENT__DEBUG, 0, "Client", "%s: Setting player Resurrecting to 'true'", __FUNCTION__);
@ -9260,4 +9255,21 @@ void Client::SendShowBook(Spawn* sender, string title, vector<Item::BookPage*> p
QueuePacket(packet->serialize());
safe_delete(packet);
}
void Client::TempRemoveGroup()
{
if (this->GetPlayer()->GetGroupMemberInfo())
{
world.GetGroupManager()->GroupLock(__FUNCTION__, __LINE__);
PlayerGroup* group = world.GetGroupManager()->GetGroup(this->GetPlayer()->GetGroupMemberInfo()->group_id);
group->MGroupMembers.writelock();
this->GetPlayer()->GetGroupMemberInfo()->client = 0;
this->GetPlayer()->GetGroupMemberInfo()->member = 0;
group->MGroupMembers.releasewritelock();
group->RemoveClientReference(this);
world.GetGroupManager()->ReleaseGroupLock(__FUNCTION__, __LINE__);
}
}

View file

@ -435,6 +435,8 @@ public:
int32 GetTemporaryTransportID() { return temporary_transport_id; }
void SetRejoinGroupID(int32 id) { rejoin_group_id = id; }
void TempRemoveGroup();
private:
void SavePlayerImages();
void SkillChanged(Skill* skill, int16 previous_value, int16 new_value);