diff options
Diffstat (limited to 'src/char_sql/char.c')
-rw-r--r-- | src/char_sql/char.c | 52 |
1 files changed, 32 insertions, 20 deletions
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]
|