diff options
author | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-05-31 15:07:37 +0000 |
---|---|---|
committer | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-05-31 15:07:37 +0000 |
commit | 47981612dad9c7d94466e357de003f0ba597efcb (patch) | |
tree | 149cca1ddc2fe13a15999585cab3631588b93880 /src/char/char.c | |
parent | 8f6123730efe4fb57d9895e032967fefb0a00d40 (diff) | |
download | hercules-47981612dad9c7d94466e357de003f0ba597efcb.tar.gz hercules-47981612dad9c7d94466e357de003f0ba597efcb.tar.bz2 hercules-47981612dad9c7d94466e357de003f0ba597efcb.tar.xz hercules-47981612dad9c7d94466e357de003f0ba597efcb.zip |
- 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
Diffstat (limited to 'src/char/char.c')
-rw-r--r-- | src/char/char.c | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/src/char/char.c b/src/char/char.c index 0617bc3b9..cd2ba683b 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -2849,7 +2849,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;
@@ -2859,7 +2859,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;
@@ -2874,31 +2875,41 @@ 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].status.char_id == id) {
- strncpy(list[j].name, char_dat[j].status.name, NAME_LENGTH);
- break;
- }
+ if(!size)
+ break;
+ 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++);
+ // When found someone with less or as much fame, insert just above
+ if(i >= size) break;//Out of ranking.
+ 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].status.char_id != id; j++);
+ if(j < char_num)
+ strncpy(list[i].name, char_dat[j].status.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]
|