Browse Source

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

image 3 years ago
parent
commit
45710414ec

+ 15 - 0
EQ2/source/WorldServer/PlayerGroups.cpp

@@ -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();
 }

+ 2 - 1
EQ2/source/WorldServer/PlayerGroups.h

@@ -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);

+ 25 - 13
EQ2/source/WorldServer/client.cpp

@@ -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__);
+	}
 }

+ 2 - 0
EQ2/source/WorldServer/client.h

@@ -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);