summaryrefslogtreecommitdiff
path: root/src/char/char.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/char/char.c')
-rw-r--r--src/char/char.c55
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]