diff options
-rw-r--r-- | Changelog-Trunk.txt | 2 | ||||
-rw-r--r-- | src/char/char.c | 128 | ||||
-rw-r--r-- | src/char_sql/char.c | 129 |
3 files changed, 113 insertions, 146 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 477cfebb2..90858fc6d 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2007/02/16 + * Fixed the structure of packet 0x67 (new char info). It's the same as the + one used for packet 0x6b (chars info). [FlavioJS] * Updated script commands startnpctimer, stopnpctimer, initnpctimer so you can attach a player to them, this is done because the attach/detach functions can't be used to attach to a different script than the one diff --git a/src/char/char.c b/src/char/char.c index 50f796cf5..6f9c01cf5 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -1659,6 +1659,57 @@ int count_users(void) { return users; } +/// Writes char data to the buffer in the format used by the client. +/// Used in packets 0x6b (chars info) and 0x67 (new char info) +/// size = 104 +int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p) +{ + if( p == NULL || buf == NULL ) + return 1;// Fail + + WBUFL(buf,0) = p->char_id; + WBUFL(buf,4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp; + WBUFL(buf,8) = p->zeny; + WBUFL(buf,12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp; + WBUFL(buf,16) = p->job_level; + + WBUFL(buf,20) = 0;// probably opt1 + WBUFL(buf,24) = 0;// probably opt2 + WBUFL(buf,28) = p->option; + + WBUFL(buf,32) = p->karma; + WBUFL(buf,36) = p->manner; + + WBUFW(buf,40) = (p->status_point > SHRT_MAX) ? SHRT_MAX : p->status_point; + WBUFW(buf,42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp; + WBUFW(buf,44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp; + WBUFW(buf,46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp; + WBUFW(buf,48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp; + WBUFW(buf,50) = DEFAULT_WALK_SPEED; // p->speed; + WBUFW(buf,52) = p->class_; + WBUFW(buf,54) = p->hair; + WBUFW(buf,56) = p->option&0x20 ? 0 : p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!? + WBUFW(buf,58) = p->base_level; + WBUFW(buf,60) = (p->skill_point > SHRT_MAX) ? SHRT_MAX : p->skill_point; + WBUFW(buf,62) = p->head_bottom; + WBUFW(buf,64) = p->shield; + WBUFW(buf,66) = p->head_top; + WBUFW(buf,68) = p->head_mid; + WBUFW(buf,70) = p->hair_color; + WBUFW(buf,72) = p->clothes_color; + + memcpy(WBUFP(buf,74), p->name, NAME_LENGTH); + + WBUFB(buf,98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str; + WBUFB(buf,99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi; + WBUFB(buf,100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit; + WBUFB(buf,101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_; + WBUFB(buf,102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex; + WBUFB(buf,103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk; + + return 0; +} + //---------------------------------------- // Function to send characters to a player //---------------------------------------- @@ -1700,45 +1751,8 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) { j = offset + (i * 106); // increase speed of code #endif - WFIFOL(fd,j) = p->char_id; - WFIFOL(fd,j+4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp; - WFIFOL(fd,j+8) = p->zeny; - WFIFOL(fd,j+12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp; - WFIFOL(fd,j+16) = p->job_level; - - WFIFOL(fd,j+20) = 0; - WFIFOL(fd,j+24) = 0; - WFIFOL(fd,j+28) = p->option; - - WFIFOL(fd,j+32) = p->karma; - WFIFOL(fd,j+36) = p->manner; - - WFIFOW(fd,j+40) = (p->status_point > SHRT_MAX) ? SHRT_MAX : p->status_point; - WFIFOW(fd,j+42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp; - WFIFOW(fd,j+44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp; - WFIFOW(fd,j+46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp; - WFIFOW(fd,j+48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp; - WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed; - WFIFOW(fd,j+52) = p->class_; - WFIFOW(fd,j+54) = p->hair; - WFIFOW(fd,j+56) = p->option&0x20?0:p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!? - WFIFOW(fd,j+58) = p->base_level; - WFIFOW(fd,j+60) = (p->skill_point > SHRT_MAX) ? SHRT_MAX : p->skill_point; - WFIFOW(fd,j+62) = p->head_bottom; - WFIFOW(fd,j+64) = p->shield; - WFIFOW(fd,j+66) = p->head_top; - WFIFOW(fd,j+68) = p->head_mid; - WFIFOW(fd,j+70) = p->hair_color; - WFIFOW(fd,j+72) = p->clothes_color; - - memcpy(WFIFOP(fd,j+74), p->name, NAME_LENGTH); - - WFIFOB(fd,j+98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str; - WFIFOB(fd,j+99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi; - WFIFOB(fd,j+100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit; - WFIFOB(fd,j+101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_; - WFIFOB(fd,j+102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex; - WFIFOB(fd,j+103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk; + mmo_char_tobuf(WFIFOP(fd,j), p); + #if PACKETVER > 7 WFIFOW(fd,j+104) = p->char_num; WFIFOW(fd,j+106) = 1; //TODO: Handle this rename bit: 0 to enable renaming @@ -3632,40 +3646,8 @@ int parse_char(int fd) { WFIFOW(fd,0) = 0x6d; memset(WFIFOP(fd,2), 0, 108); - WFIFOL(fd,2) = char_dat[i].status.char_id; - WFIFOL(fd,2+4) = char_dat[i].status.base_exp>LONG_MAX?LONG_MAX:char_dat[i].status.base_exp; - WFIFOL(fd,2+8) = char_dat[i].status.zeny; - WFIFOL(fd,2+12) = char_dat[i].status.job_exp>LONG_MAX?LONG_MAX:char_dat[i].status.job_exp; - WFIFOL(fd,2+16) = char_dat[i].status.job_level; - - WFIFOL(fd,2+28) = char_dat[i].status.karma; - WFIFOL(fd,2+32) = char_dat[i].status.manner; - - WFIFOW(fd,2+40) = 0x30; - WFIFOW(fd,2+42) = (char_dat[i].status.hp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.hp; - WFIFOW(fd,2+44) = (char_dat[i].status.max_hp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.max_hp; - WFIFOW(fd,2+46) = (char_dat[i].status.sp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.sp; - WFIFOW(fd,2+48) = (char_dat[i].status.max_sp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.max_sp; - WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; - WFIFOW(fd,2+52) = char_dat[i].status.class_; - WFIFOW(fd,2+54) = char_dat[i].status.hair; - - WFIFOW(fd,2+58) = char_dat[i].status.base_level; - WFIFOW(fd,2+60) = (char_dat[i].status.skill_point > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.skill_point; - - WFIFOW(fd,2+64) = char_dat[i].status.shield; - WFIFOW(fd,2+66) = char_dat[i].status.head_top; - WFIFOW(fd,2+68) = char_dat[i].status.head_mid; - WFIFOW(fd,2+70) = char_dat[i].status.hair_color; - - memcpy(WFIFOP(fd,2+74), char_dat[i].status.name, NAME_LENGTH); - - WFIFOB(fd,2+98) = (char_dat[i].status.str > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.str; - WFIFOB(fd,2+99) = (char_dat[i].status.agi > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.agi; - WFIFOB(fd,2+100) = (char_dat[i].status.vit > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.vit; - WFIFOB(fd,2+101) = (char_dat[i].status.int_ > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.int_; - WFIFOB(fd,2+102) = (char_dat[i].status.dex > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.dex; - WFIFOB(fd,2+103) = (char_dat[i].status.luk > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.luk; + mmo_char_tobuf(WFIFOP(fd,2), &char_dat[i].status); + #if PACKETVER > 7 //Updated packet structure with rename-button included. Credits to Sara-chan WFIFOW(fd,2+104) = char_dat[i].status.char_num; diff --git a/src/char_sql/char.c b/src/char_sql/char.c index f81f03cad..12e1e0324 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -1682,6 +1682,57 @@ int count_users(void) { return 0; } +/// Writes char data to the buffer in the format used by the client. +/// Used in packets 0x6b (chars info) and 0x67 (new char info) +/// size = 104 +int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p) +{ + if( p == NULL || buf == NULL ) + return 1;// Fail + + WBUFL(buf,0) = p->char_id; + WBUFL(buf,4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp; + WBUFL(buf,8) = p->zeny; + WBUFL(buf,12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp; + WBUFL(buf,16) = p->job_level; + + WBUFL(buf,20) = 0;// probably opt1 + WBUFL(buf,24) = 0;// probably opt2 + WBUFL(buf,28) = p->option; + + WBUFL(buf,32) = p->karma; + WBUFL(buf,36) = p->manner; + + WBUFW(buf,40) = (p->status_point > SHRT_MAX) ? SHRT_MAX : p->status_point; + WBUFW(buf,42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp; + WBUFW(buf,44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp; + WBUFW(buf,46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp; + WBUFW(buf,48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp; + WBUFW(buf,50) = DEFAULT_WALK_SPEED; // p->speed; + WBUFW(buf,52) = p->class_; + WBUFW(buf,54) = p->hair; + WBUFW(buf,56) = p->option&0x20 ? 0 : p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!? + WBUFW(buf,58) = p->base_level; + WBUFW(buf,60) = (p->skill_point > SHRT_MAX) ? SHRT_MAX : p->skill_point; + WBUFW(buf,62) = p->head_bottom; + WBUFW(buf,64) = p->shield; + WBUFW(buf,66) = p->head_top; + WBUFW(buf,68) = p->head_mid; + WBUFW(buf,70) = p->hair_color; + WBUFW(buf,72) = p->clothes_color; + + memcpy(WBUFP(buf,74), p->name, NAME_LENGTH); + + WBUFB(buf,98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str; + WBUFB(buf,99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi; + WBUFB(buf,100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit; + WBUFB(buf,101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_; + WBUFB(buf,102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex; + WBUFB(buf,103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk; + + return 0; +} + int mmo_char_send006b(int fd, struct char_session_data *sd) { int i, j, found_num = 0; struct mmo_charstatus *p = NULL; @@ -1735,45 +1786,8 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) { j = offset + (i * 106); // increase speed of code #endif - WFIFOL(fd,j) = p->char_id; - WFIFOL(fd,j+4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp; - WFIFOL(fd,j+8) = p->zeny; - WFIFOL(fd,j+12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp; - WFIFOL(fd,j+16) = p->job_level; - - WFIFOL(fd,j+20) = 0; - WFIFOL(fd,j+24) = 0; - WFIFOL(fd,j+28) = p->option; - - WFIFOL(fd,j+32) = p->karma; - WFIFOL(fd,j+36) = p->manner; - - WFIFOW(fd,j+40) = (p->status_point > SHRT_MAX) ? SHRT_MAX : p->status_point; - WFIFOW(fd,j+42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp; - WFIFOW(fd,j+44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp; - WFIFOW(fd,j+46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp; - WFIFOW(fd,j+48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp; - WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed; - WFIFOW(fd,j+52) = p->class_; - WFIFOW(fd,j+54) = p->hair; - WFIFOW(fd,j+56) = p->option&0x20?0:p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!? - WFIFOW(fd,j+58) = p->base_level; - WFIFOW(fd,j+60) = (p->skill_point > SHRT_MAX) ? SHRT_MAX : p->skill_point; - WFIFOW(fd,j+62) = p->head_bottom; - WFIFOW(fd,j+64) = p->shield; - WFIFOW(fd,j+66) = p->head_top; - WFIFOW(fd,j+68) = p->head_mid; - WFIFOW(fd,j+70) = p->hair_color; - WFIFOW(fd,j+72) = p->clothes_color; - - memcpy(WFIFOP(fd,j+74), p->name, NAME_LENGTH); - - WFIFOB(fd,j+98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str; - WFIFOB(fd,j+99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi; - WFIFOB(fd,j+100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit; - WFIFOB(fd,j+101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_; - WFIFOB(fd,j+102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex; - WFIFOB(fd,j+103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk; + mmo_char_tobuf(WFIFOP(fd,j), p); + #if PACKETVER > 7 //Updated packet structure with rename-button included. Credits to Sara-chan WFIFOW(fd,j+104) = p->char_num; @@ -3441,40 +3455,9 @@ int parse_char(int fd) { memset(WFIFOP(fd, 2), 0x00, 108); mmo_char_fromsql_short(i, &char_dat); //Only the short data is needed. - WFIFOL(fd,2) = char_dat.char_id; - WFIFOL(fd,2+4) = char_dat.base_exp>LONG_MAX?LONG_MAX:char_dat.base_exp; - WFIFOL(fd,2+8) = char_dat.zeny; - WFIFOL(fd,2+12) = char_dat.job_exp>LONG_MAX?LONG_MAX:char_dat.job_exp; - WFIFOL(fd,2+16) = char_dat.job_level; - - WFIFOL(fd,2+28) = char_dat.karma; - WFIFOL(fd,2+32) = char_dat.manner; - - WFIFOW(fd,2+40) = 0x30; - WFIFOW(fd,2+42) = (char_dat.hp > SHRT_MAX) ? SHRT_MAX : char_dat.hp; - WFIFOW(fd,2+44) = (char_dat.max_hp > SHRT_MAX) ? SHRT_MAX : char_dat.max_hp; - WFIFOW(fd,2+46) = (char_dat.sp > SHRT_MAX) ? SHRT_MAX : char_dat.sp; - WFIFOW(fd,2+48) = (char_dat.max_sp > SHRT_MAX) ? SHRT_MAX : char_dat.max_sp; - WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed; - WFIFOW(fd,2+52) = char_dat.class_; - WFIFOW(fd,2+54) = char_dat.hair; - - WFIFOW(fd,2+58) = char_dat.base_level; - WFIFOW(fd,2+60) = (char_dat.skill_point > SHRT_MAX) ? SHRT_MAX : char_dat.skill_point; - - WFIFOW(fd,2+64) = char_dat.shield; - WFIFOW(fd,2+66) = char_dat.head_top; - WFIFOW(fd,2+68) = char_dat.head_mid; - WFIFOW(fd,2+70) = char_dat.hair_color; - - memcpy(WFIFOP(fd,2+74), char_dat.name, NAME_LENGTH); - - WFIFOB(fd,2+98) = char_dat.str>UCHAR_MAX?UCHAR_MAX:char_dat.str; - WFIFOB(fd,2+99) = char_dat.agi>UCHAR_MAX?UCHAR_MAX:char_dat.agi; - WFIFOB(fd,2+100) = char_dat.vit>UCHAR_MAX?UCHAR_MAX:char_dat.vit; - WFIFOB(fd,2+101) = char_dat.int_>UCHAR_MAX?UCHAR_MAX:char_dat.int_; - WFIFOB(fd,2+102) = char_dat.dex>UCHAR_MAX?UCHAR_MAX:char_dat.dex; - WFIFOB(fd,2+103) = char_dat.luk>UCHAR_MAX?UCHAR_MAX:char_dat.luk; + + mmo_char_tobuf(WFIFOP(fd,2), &char_dat); + #if PACKETVER > 7 //Updated packet structure with rename-button included. Credits to Sara-chan WFIFOW(fd,2+104) = char_dat.char_num; |