diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 1c5e4ebfd..5411dbf7a 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -6506,6 +6506,16 @@ void Client::Handle_OP_GroupDisband(const EQApplicationPacket *app) if (!group) //We must recheck this here.. incase the final bot disbanded the party..otherwise we crash return; #endif + Mob* memberToDisband = GetTarget(); + + if (!memberToDisband) + memberToDisband = entity_list.GetMob(gd->name2); + + if (memberToDisband) { + auto group2 = memberToDisband->GetGroup(); + if (group2 != group) // they're not in our group! + memberToDisband = this; + } if (group->GroupCount() < 3) { @@ -6527,7 +6537,7 @@ void Client::Handle_OP_GroupDisband(const EQApplicationPacket *app) GetMerc()->Suspend(); } } - else if (group->IsLeader(this) && GetTarget() == this) + else if (group->IsLeader(this) && (GetTarget() == this || memberToDisband == this)) { LeaveGroup(); if (GetMerc() && !GetMerc()->IsSuspended()) @@ -6537,12 +6547,6 @@ void Client::Handle_OP_GroupDisband(const EQApplicationPacket *app) } else { - Mob* memberToDisband = nullptr; - memberToDisband = GetTarget(); - - if (!memberToDisband) - memberToDisband = entity_list.GetMob(gd->name2); - if (memberToDisband) { if (group->IsLeader(this)) diff --git a/zone/groups.cpp b/zone/groups.cpp index 94a2b0032..e9b2ec93c 100644 --- a/zone/groups.cpp +++ b/zone/groups.cpp @@ -581,6 +581,16 @@ bool Group::DelMember(Mob* oldmember, bool ignoresender) return false; } + // TODO: fix this shit + // okay, so there is code below that tries to handle this. It does not. + // So instead of figuring it out now, lets just disband the group so the client doesn't + // sit there with a broken group and there isn't any group leader shuffling going on + // since the code below doesn't work. + if (oldmember == GetLeader()) { + DisbandGroup(); + return true; + } + for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] == oldmember)