From ec45eda62ff8bd9dd25a05bb3fb175d0ba08d364 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 8 Feb 2018 22:39:28 +0300 Subject: Fix different clan issues. Add missing online check for clan members. Clean sd pointer after clan member went offline. --- src/map/clan.c | 5 ++++- src/map/clif.c | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/map/clan.c b/src/map/clan.c index b67726b37..6855e449d 100644 --- a/src/map/clan.c +++ b/src/map/clan.c @@ -103,7 +103,7 @@ struct map_session_data *clan_getonlinesd(struct clan *c) int i; nullpo_retr(NULL, c); - ARR_FIND(0, VECTOR_LENGTH(c->members), i, VECTOR_INDEX(c->members, i).sd != NULL); + ARR_FIND(0, VECTOR_LENGTH(c->members), i, (VECTOR_INDEX(c->members, i).sd != NULL && VECTOR_INDEX(c->members, i).online == 1)); return (i < VECTOR_LENGTH(c->members)) ? VECTOR_INDEX(c->members, i).sd : NULL; } @@ -294,6 +294,7 @@ void clan_member_online(struct map_session_data *sd, bool first) if (c->kick_time > 0 && inactivity > c->kick_time) { if (m->online == 1) { m->online = 0; + m->sd = NULL; c->connect_member--; c->member_count--; } @@ -306,6 +307,7 @@ void clan_member_online(struct map_session_data *sd, bool first) return; } + m->sd = sd; m->online = 1; m->last_login = sd->status.last_login; } @@ -403,6 +405,7 @@ void clan_member_offline(struct map_session_data *sd) if (i != INDEX_NOT_FOUND && VECTOR_INDEX(c->members, i).online == 1) { // Only if it is online, because unit->free is called twice VECTOR_INDEX(c->members, i).online = 0; + VECTOR_INDEX(c->members, i).sd = NULL; c->connect_member--; } clif->clan_onlinecount(c); diff --git a/src/map/clif.c b/src/map/clif.c index 8adb1ae58..ea239ba21 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -673,7 +673,7 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target nullpo_retr(false, c); for (i = 0; i < VECTOR_LENGTH(c->members); i++) { - if ((sd = VECTOR_INDEX(c->members, i).sd) == NULL || (fd = sd->fd) <= 0) + if (VECTOR_INDEX(c->members, i).online == 0 || (sd = VECTOR_INDEX(c->members, i).sd) == NULL || (fd = sd->fd) <= 0) continue; WFIFOHEAD(fd, len); memcpy(WFIFOP(fd, 0), buf, len); -- cgit v1.2.3-70-g09d2