diff options
author | Haru <haru@dotalux.com> | 2018-11-13 17:40:48 +0100 |
---|---|---|
committer | Haru <haru@dotalux.com> | 2018-11-13 17:40:48 +0100 |
commit | 60643f1b7bbc2a21f44ab6663dee03d962ff6d6b (patch) | |
tree | efe41e13e8014fe394476ce68c3e78392824de56 /src/map/atcommand.c | |
parent | 35ee16dd3908c021752e439a4fe4ea9e83af9ec0 (diff) | |
download | hercules-60643f1b7bbc2a21f44ab6663dee03d962ff6d6b.tar.gz hercules-60643f1b7bbc2a21f44ab6663dee03d962ff6d6b.tar.bz2 hercules-60643f1b7bbc2a21f44ab6663dee03d962ff6d6b.tar.xz hercules-60643f1b7bbc2a21f44ab6663dee03d962ff6d6b.zip |
Fix an issue that caused some guild channels not to be left when leaving allychat
- The issue was caused by an array compaction while iterating through the array members.
- A visible effect was that under certain conditions (depending on the
alliance size), a character that left a guild could still see allychat
messages from some of the allied guilds.
Signed-off-by: Haru <haru@dotalux.com>
Diffstat (limited to 'src/map/atcommand.c')
-rw-r--r-- | src/map/atcommand.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/src/map/atcommand.c b/src/map/atcommand.c index adf617ccd..f46ce0362 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -9125,14 +9125,12 @@ ACMD(channel) return false; } if (VECTOR_INDEX(sd->channels, k)->type == HCS_TYPE_ALLY) { - do { - for (k = 0; k < VECTOR_LENGTH(sd->channels); k++) { - if (VECTOR_INDEX(sd->channels, k)->type == HCS_TYPE_ALLY) { - channel->leave(VECTOR_INDEX(sd->channels, k), sd); - break; - } + for (k = VECTOR_LENGTH(sd->channels) - 1; k >= 0; k--) { + // Loop downward to avoid issues when channel->leave() compacts the array + if (VECTOR_INDEX(sd->channels, k)->type == HCS_TYPE_ALLY) { + channel->leave(VECTOR_INDEX(sd->channels, k), sd); } - } while (k != VECTOR_LENGTH(sd->channels)); // FIXME + } } else { channel->leave(VECTOR_INDEX(sd->channels, k), sd); } |