From 47981612dad9c7d94466e357de003f0ba597efcb Mon Sep 17 00:00:00 2001 From: skotlex Date: Wed, 31 May 2006 15:07:37 +0000 Subject: - Some cleaning of the fame-update code, fixing a logic bug which made the ranking list fail to display the correct ranker names. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@6891 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/char_sql/char.c | 52 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 20 deletions(-) (limited to 'src/char_sql') diff --git a/src/char_sql/char.c b/src/char_sql/char.c index 614140d85..aecdb80e5 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -2746,7 +2746,7 @@ int parse_frommap(int fd) { // Update and send fame ranking list [DracoRPG] case 0x2b10: - if (RFIFOREST(fd) < 10) + if (RFIFOREST(fd) < 12) return 0; { int i, j; @@ -2756,7 +2756,8 @@ int parse_frommap(int fd) { char pos = RFIFOB(fd, 11); int size; struct fame_list *list; - + RFIFOSKIP(fd,12); + switch(type) { case 1: size = fame_list_size_smith; @@ -2771,31 +2772,42 @@ int parse_frommap(int fd) { list = taekwon_fame_list; break; default: - return 0; - } - - if(pos){ // If the player's already in the list, remove the entry and shift the following ones 1 step up - memmove(list + pos - 1, list + pos, (size - pos) * sizeof(struct fame_list)); - list[size].fame = 0; // At worst, the guy'll end up last (shouldn't happen if fame only goes up) + size = 0; + break; } - - for(i = 0; i < size; i++) // Find the position where the player has to be inserted - if(fame >= list[i].fame) { // When found someone with less or as much fame, insert just above - memmove(list + i + 1, list + i, (size - i - 1) * sizeof(struct fame_list)); - list[i].id = id; - list[i].fame = fame; - for(j = 0; j < char_num; j++) // Look for the player's name - if(char_dat[j].char_id == id) { - strncpy(list[j].name, char_dat[j].name, NAME_LENGTH); - break; - } + if(!size) break; //No list. + if(pos) + { + pos--; //Convert from pos to index. + if( + (pos == 0 || fame < list[pos-1].fame) && + (pos == size-1 || fame > list[pos+1].fame) + ) { //No change in order. + list[(int)pos].fame = fame; + char_send_fame_list(fd); break; } + // If the player's already in the list, remove the entry and shift the following ones 1 step up + memmove(list+pos, list+pos+1, (size-pos-1) * sizeof(struct fame_list)); + list[size].fame = 0; // At worst, the guy'll end up last (shouldn't happen if fame only goes up) + } + // Find the position where the player has to be inserted + for(i = 0; i < size && fame < list[i].fame; i++); + if(i>=size) break; //Out of ranking. + // When found someone with less or as much fame, insert just above + memmove(list+i+1, list+i, (size-i-1) * sizeof(struct fame_list)); + list[i].id = id; + list[i].fame = fame; + // Look for the player's name + for(j = 0; j < char_num && char_dat[j].char_id != id; j++); + if(j < char_num) + strncpy(list[i].name, char_dat[j].name, NAME_LENGTH); + else //Not found?? + strncpy(list[i].name, "Unknown", NAME_LENGTH); char_send_fame_list(fd); } - RFIFOSKIP(fd,12); break; // Recieve rates [Wizputer] -- cgit v1.2.3-70-g09d2