Group members should now always be temp removed on zoning/client deconstruct
This commit is contained in:
parent
def9e92b21
commit
45710414ec
4 changed files with 44 additions and 14 deletions
EQ2/source/WorldServer
|
@ -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();
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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__);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue