diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 138dde79d8..faae7cb796 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -5999,7 +5999,7 @@ ACMD_FUNC(changegm) return -1; } - guild_gm_change(sd->status.guild_id, pl_sd); + guild_gm_change(sd->status.guild_id, pl_sd->status.char_id); return 0; } diff --git a/src/map/clif.c b/src/map/clif.c index 275198a644..a6f6aa878f 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -13240,9 +13240,19 @@ void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd) if(!sd->state.gmaster_flag) return; + + // Guild leadership change + if( len == 16 && RFIFOL(fd,12) == 0 ){ + guild_gm_change(sd->status.guild_id, RFIFOL(fd, 8)); + return; + } + for(i=idxgpos;istatus.guild_id, - RFIFOL(fd,i),RFIFOL(fd,i+4),RFIFOL(fd,i+8)); + int position = RFIFOL(fd,i+8); + + if( position > 0 ){ + guild_change_memberposition(sd->status.guild_id,RFIFOL(fd,i),RFIFOL(fd,i+4),position); + } } } diff --git a/src/map/guild.c b/src/map/guild.c index 8a1f6230ff..92fc200ad9 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -1760,22 +1760,29 @@ int guild_broken(int guild_id,int flag) { * @param guild_id * @param sd New guild master */ -int guild_gm_change(int guild_id, struct map_session_data *sd) { +int guild_gm_change(int guild_id, uint32 char_id) { struct guild *g; - nullpo_ret(sd); - - if (sd->status.guild_id != guild_id) - return 0; + char *name; + int i; g = guild_search(guild_id); nullpo_ret(g); - if (strcmp(g->master, sd->status.name) == 0) //Nothing to change. + ARR_FIND(0, MAX_GUILD, i, g->member[i].char_id == char_id); + + if( i == MAX_GUILD ){ + // Not part of the guild + return 0; + } + + name = g->member[i].name; + + if (strcmp(g->master, name) == 0) //Nothing to change. return 0; //Notify servers that master has changed. - intif_guild_change_gm(guild_id, sd->status.name, strlen(sd->status.name)+1); + intif_guild_change_gm(guild_id, name, strlen(name)+1); return 1; } @@ -1827,6 +1834,7 @@ int guild_gm_changed(int guild_id, uint32 account_id, uint32 char_id) { if( g->member[i].sd && g->member[i].sd->fd ) { clif_guild_basicinfo(g->member[i].sd); clif_guild_memberlist(g->member[i].sd); + clif_guild_belonginfo(g->member[i].sd); // Update clientside guildmaster flag } } diff --git a/src/map/guild.h b/src/map/guild.h index bc1b181fd1..a5bd524857 100644 --- a/src/map/guild.h +++ b/src/map/guild.h @@ -86,7 +86,7 @@ int guild_send_dot_remove(struct map_session_data *sd); int guild_skillupack(int guild_id,uint16 skill_id,uint32 account_id); int guild_break(struct map_session_data *sd,char *name); int guild_broken(int guild_id,int flag); -int guild_gm_change(int guild_id, struct map_session_data *sd); +int guild_gm_change(int guild_id, uint32 char_id); int guild_gm_changed(int guild_id, uint32 account_id, uint32 char_id); void guild_castle_map_init(void); diff --git a/src/map/script.c b/src/map/script.c index 706573ee95..13ad722f77 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -10112,7 +10112,7 @@ BUILDIN_FUNC(guildchangegm) if (!sd) script_pushint(st,0); else - script_pushint(st,guild_gm_change(guild_id, sd)); + script_pushint(st,guild_gm_change(guild_id, sd->status.char_id)); return SCRIPT_CMD_SUCCESS; }