ソースを参照

Added support for 2017's guild leader change

Lemongrass3110 8 年 前
コミット
b51617cb73
5 ファイル変更30 行追加12 行削除
  1. 1 1
      src/map/atcommand.c
  2. 12 2
      src/map/clif.c
  3. 15 7
      src/map/guild.c
  4. 1 1
      src/map/guild.h
  5. 1 1
      src/map/script.c

+ 1 - 1
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;
 }
 

+ 12 - 2
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;i<len;i+=12){
-		guild_change_memberposition(sd->status.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);
+		}
 	}
 }
 

+ 15 - 7
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
 		}
 	}
 

+ 1 - 1
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);

+ 1 - 1
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;
 }