From aa7de205febfd5195c4d3233e7f5114173587109 Mon Sep 17 00:00:00 2001 From: Matheus Macabu Date: Sun, 5 Feb 2017 16:52:31 -0200 Subject: [PATCH] Update name for all party members on rename (#1715) --- src/char/char.c | 4 ++++ src/char/int_party.c | 26 ++++++++++++++++++++++++++ src/char/int_party.h | 1 + src/map/party.c | 9 +++++++++ 4 files changed, 40 insertions(+) diff --git a/src/char/char.c b/src/char/char.c index e6de4adfcd..72d20eebc8 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -1264,6 +1264,10 @@ int char_rename_char_sql(struct char_session_data *sd, uint32 char_id) Sql_ShowDebug(sql_handle); return 3; } + + // Update party and party members with the new player name + if( char_dat.party_id ) + inter_party_charname_changed(char_dat.party_id, char_id, sd->new_name); // Change character's name into guild_db. if( char_dat.guild_id ) diff --git a/src/char/int_party.c b/src/char/int_party.c index 1ba64e8a45..6a61b2990a 100644 --- a/src/char/int_party.c +++ b/src/char/int_party.c @@ -889,3 +889,29 @@ int inter_party_CharOffline(uint32 char_id, int party_id) { idb_remove(party_db_, party_id); return 1; } + +int inter_party_charname_changed(int party_id, uint32 char_id, char *name) +{ + struct party_data* p = NULL; + int i; + + p = inter_party_fromsql(party_id); + if( p == NULL || p->party.party_id == 0 ) + { + ShowError("inter_party_charname_changed: Can't find party %d.\n", party_id); + return 0; + } + + ARR_FIND(0, MAX_PARTY, i, p->party.member[i].char_id == char_id); + if( i == MAX_PARTY ) + { + ShowError("inter_party_charname_changed: Can't find character %d in party %d.\n", char_id, party_id); + return 0; + } + + safestrncpy(p->party.member[i].name, name, NAME_LENGTH); + + mapif_party_info(-1, &p->party, char_id); + + return 0; +} diff --git a/src/char/int_party.h b/src/char/int_party.h index b75975276a..016a9f6b33 100644 --- a/src/char/int_party.h +++ b/src/char/int_party.h @@ -20,6 +20,7 @@ int inter_party_parse_frommap(int fd); int inter_party_sql_init(void); void inter_party_sql_final(void); int inter_party_leave(int party_id,uint32 account_id, uint32 char_id, char *name); +int inter_party_charname_changed(int party_id, uint32 char_id, char *name); int inter_party_CharOnline(uint32 char_id, int party_id); int inter_party_CharOffline(uint32 char_id, int party_id); diff --git a/src/map/party.c b/src/map/party.c index 55246742e9..0f9e5bf083 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -262,6 +262,7 @@ int party_recv_info(struct party* sp, uint32 char_id) int added[MAX_PARTY];// member_id in new data int added_count = 0; int member_id; + bool rename = false; nullpo_ret(sp); @@ -282,6 +283,9 @@ int party_recv_info(struct party* sp, uint32 char_id) if( i == MAX_PARTY ) removed[removed_count++] = member_id; + // If the member already existed, compare the old to the (possible) new name + else if( !rename && strcmp(member->name,sp->member[i].name) ) + rename = true; } for( member_id = 0; member_id < MAX_PARTY; ++member_id ) { @@ -346,6 +350,11 @@ int party_recv_info(struct party* sp, uint32 char_id) if( p->instance_id != 0 ) instance_reqinfo(sd,p->instance_id); } + + // If a player was renamed, make sure to resend the party information + if( rename ){ + clif_party_info(p,NULL); + } if( char_id != 0 ) { // requester sd = map_charid2sd(char_id);