leave(): Zuhoerer raus vor Auswahl neuer SV
leave() waehlt beim Verlassen eines Zuhoerers ggf.
einen neuen Supervisor aus, wenn das verlassende
Objekt der alte SV ist. Allerdings wird die Auswahl
gemacht bevor das alte Objekt ausgetragen wird und
dabei der zweitaelteste verbliebene Zuhoerer
gewaehlt. Das basiert wohl auf der Annahme, dass
das verlassende Objekt das aelteste ist.
Allerdings kann das verlassende Objekt ja genau das
zweitaelteste Objekt sein, d.h. SV ist dann ein
Objekt, was nicht auf der Ebene ist.
Daher erst den verlassenden Zuhoerer austragen,
dann einen neuen SV waehlen.
Change-Id: Ie0705476226e8c606117ed0ba194dbe7f7de3890
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index d1a2f0f..92140df 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -856,11 +856,14 @@
if (!IsChannelMember(ch, pl))
return E_NOT_MEMBER;
+ // Erstmal den Zuhoerer raus.
+ channels[ch][I_MEMBER] -= ({pl});
+
// Kontrolle an jemand anderen uebergeben, wenn der Ebenenbesitzer diese
// verlaesst.
- if (pl == channels[ch][I_SUPERVISOR] && sizeof(channels[ch][I_MEMBER]) > 1)
+ if (pl == channels[ch][I_SUPERVISOR] && sizeof(channels[ch][I_MEMBER]))
{
- channels[ch][I_SUPERVISOR] = channels[ch][I_MEMBER][1];
+ channels[ch][I_SUPERVISOR] = channels[ch][I_MEMBER][0];
if (!pl->QueryProp(P_INVIS))
{
@@ -874,7 +877,6 @@
channels[ch][I_SUPERVISOR]->name(WEN) + ".", MSG_EMOTE);
}
}
- channels[ch][I_MEMBER] -= ({pl});
// Ebene loeschen, wenn keiner zuhoert und auch kein Masterobjekt
// existiert.