diff options
Diffstat (limited to 'src/map/clif.c')
-rw-r--r-- | src/map/clif.c | 346 |
1 files changed, 188 insertions, 158 deletions
diff --git a/src/map/clif.c b/src/map/clif.c index 5e7635f40..9f80ba8db 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -639,19 +639,23 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target *------------------------------------------*/ void clif_authok(struct map_session_data *sd) { - int fd; - - if (!sd->fd) - return; - fd = sd->fd; +#if PACKETVER < 20080102 + const int cmd = 0x73; +#else + const int cmd = 0x2eb; +#endif + int fd = sd->fd; - WFIFOHEAD(fd, packet_len(0x73)); - WFIFOW(fd, 0) = 0x73; + WFIFOHEAD(fd,packet_len(cmd)); + WFIFOW(fd, 0) = cmd; WFIFOL(fd, 2) = gettick(); WFIFOPOS(fd, 6, sd->bl.x, sd->bl.y, sd->ud.dir); WFIFOB(fd, 9) = 5; // ignored WFIFOB(fd,10) = 5; // ignored - WFIFOSET(fd,packet_len(0x73)); +#if PACKETVER >= 20080102 + WFIFOW(fd,11) = sd->user_font; // FIXME: Font is currently not saved. +#endif + WFIFOSET(fd,packet_len(cmd)); } /*========================================== @@ -775,7 +779,7 @@ void clif_clearunit_single(int id, clr_type type, int fd) *------------------------------------------*/ void clif_clearunit_area(struct block_list* bl, clr_type type) { - unsigned char buf[16]; + unsigned char buf[8]; nullpo_retv(bl); @@ -1381,13 +1385,14 @@ void clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag) clif_send(buf,packet_len(0x22e),&sd->bl,SELF); } -void clif_send_homdata(struct map_session_data *sd, int type, int param) +void clif_send_homdata(struct map_session_data *sd, int state, int param) { //[orn] int fd = sd->fd; + WFIFOHEAD(fd, packet_len(0x230)); - nullpo_retv(sd->hd); WFIFOW(fd,0)=0x230; - WFIFOW(fd,2)=type; // FIXME: This is actually <type>.B <state>.B + WFIFOB(fd,2)=0; + WFIFOB(fd,2)=state; WFIFOL(fd,4)=sd->hd->bl.id; WFIFOL(fd,8)=param; WFIFOSET(fd,packet_len(0x230)); @@ -1543,11 +1548,11 @@ void clif_move(struct unit_data *ud) WBUFL(buf,2)=bl->id; WBUFPOS2(buf,6,bl->x,bl->y,ud->to_x,ud->to_y,8,8); WBUFL(buf,12)=gettick(); - clif_send(buf, 16, bl, AREA_WOS); + clif_send(buf, packet_len(0x86), bl, AREA_WOS); if (disguised(bl)) { WBUFL(buf,2)=-bl->id; - clif_send(buf, 16, bl, SELF); + clif_send(buf, packet_len(0x86), bl, SELF); } } @@ -2010,8 +2015,10 @@ static void clif_addcards(unsigned char* buf, struct item* item) void clif_additem(struct map_session_data *sd, int n, int amount, int fail) { int fd; -#if PACKETVER < 20071002 +#if PACKETVER < 20061218 const int cmd = 0xa0; +#elif PACKETVER < 20071002 + const int cmd = 0x29a; #else const int cmd = 0x2d4; #endif @@ -2038,10 +2045,11 @@ void clif_additem(struct map_session_data *sd, int n, int amount, int fail) WFIFOW(fd,19)=0; WFIFOB(fd,21)=0; WFIFOB(fd,22)=fail; +#if PACKETVER >= 20061218 + WFIFOL(fd,23)=0; +#endif #if PACKETVER >= 20071002 - WFIFOW(fd,23)=0; - WFIFOW(fd,25)=0; - WFIFOW(fd,27)=0; + WFIFOW(fd,27)=0; // unknown #endif } else @@ -2063,9 +2071,11 @@ void clif_additem(struct map_session_data *sd, int n, int amount, int fail) WFIFOW(fd,19)=pc_equippoint(sd,n); WFIFOB(fd,21)=itemtype(sd->inventory_data[n]->type); WFIFOB(fd,22)=fail; -#if PACKETVER >= 20071002 +#if PACKETVER >= 20061218 WFIFOL(fd,23)=sd->status.inventory[n].expire_time; - WFIFOW(fd,27)=0; +#endif +#if PACKETVER >= 20071002 + WFIFOW(fd,27)=0; // unknown #endif } @@ -2532,6 +2542,7 @@ void clif_updatestatus(struct map_session_data *sd,int type) // 00b0 case SP_WEIGHT: pc_updateweightstatus(sd); + WFIFOHEAD(fd,14); WFIFOW(fd,0)=0xb0; //Need to re-set as pc_updateweightstatus can alter the buffer. [Skotlex] WFIFOW(fd,2)=type; WFIFOL(fd,4)=sd->weight; @@ -2577,6 +2588,7 @@ void clif_updatestatus(struct map_session_data *sd,int type) break; case SP_HP: WFIFOL(fd,4)=sd->battle_status.hp; + // TODO: Won't these overwrite the current packet? if( battle_config.disp_hpmeter ) clif_hpmeter(sd); if( !battle_config.party_hp_mode && sd->status.party_id ) @@ -2606,12 +2618,13 @@ void clif_updatestatus(struct map_session_data *sd,int type) WFIFOL(fd,4)=sd->battle_status.def2; break; case SP_MDEF2: + { //negative check (in case you have something like Berserk active) - len = sd->battle_status.mdef2 - (sd->battle_status.vit>>1); - if (len < 0) len = 0; - WFIFOL(fd,4)= len; - len = 8; + int mdef2 = sd->battle_status.mdef2 - (sd->battle_status.vit>>1); + + WFIFOL(fd,4)= ( mdef2 < 0 ) ? 0 : mdef2; break; + } case SP_CRITICAL: WFIFOL(fd,4)=sd->battle_status.cri/10; break; @@ -2918,7 +2931,7 @@ void clif_refreshlook(struct block_list *bl,int id,int type,int val,enum send_ta *------------------------------------------*/ void clif_initialstatus(struct map_session_data *sd) { - int fd; + int fd, mdef2; unsigned char *buf; nullpo_retv(sd); @@ -2949,16 +2962,14 @@ void clif_initialstatus(struct map_session_data *sd) WBUFW(buf,24) = sd->battle_status.def; // def WBUFW(buf,26) = sd->battle_status.def2; WBUFW(buf,28) = sd->battle_status.mdef; // mdef - fd = sd->battle_status.mdef2 - (sd->battle_status.vit>>1); - if (fd < 0) fd = 0; //Negative check for Frenzy'ed characters. - WBUFW(buf,30) = fd; - fd = sd->fd; + mdef2 = sd->battle_status.mdef2 - (sd->battle_status.vit>>1); + WBUFW(buf,30) = ( mdef2 < 0 ) ? 0 : mdef2; //Negative check for Frenzy'ed characters. WBUFW(buf,32) = sd->battle_status.hit; WBUFW(buf,34) = sd->battle_status.flee; WBUFW(buf,36) = sd->battle_status.flee2/10; WBUFW(buf,38) = sd->battle_status.cri/10; WBUFW(buf,40) = sd->battle_status.amotion; // aspd - WBUFW(buf,42) = sd->status.manner; // FIXME: This is 'plusASPD', but what is it supposed to be? + WBUFW(buf,42) = 0; // always 0 (plusASPD) WFIFOSET(fd,packet_len(0xbd)); @@ -3282,7 +3293,7 @@ void clif_dispchat(struct chat_data* cd, int fd) WBUFW(buf,12) = cd->limit; WBUFW(buf,14) = cd->users; WBUFB(buf,16) = type; - strncpy((char*)WBUFP(buf,17), cd->title, strlen(cd->title)); // not zero-terminated + memcpy((char*)WBUFP(buf,17), cd->title, strlen(cd->title)); // not zero-terminated if( fd ) { WFIFOHEAD(fd,WBUFW(buf,2)); @@ -3300,20 +3311,25 @@ void clif_dispchat(struct chat_data* cd, int fd) void clif_changechatstatus(struct chat_data* cd) { unsigned char buf[128]; + uint8 type; if( cd == NULL || cd->usersd[0] == NULL ) return; + type = (cd->owner->type == BL_PC ) ? (cd->pub) ? 1 : 0 + : (cd->owner->type == BL_NPC) ? (cd->limit) ? 2 : 3 + : 1; + WBUFW(buf, 0) = 0xdf; WBUFW(buf, 2) = 17 + strlen(cd->title); - WBUFL(buf, 4) = cd->usersd[0]->bl.id; + WBUFL(buf, 4) = cd->owner->id; WBUFL(buf, 8) = cd->bl.id; WBUFW(buf,12) = cd->limit; WBUFW(buf,14) = cd->users; - WBUFB(buf,16) = cd->pub; - strncpy((char*)WBUFP(buf,17), cd->title, strlen(cd->title)); // not zero-terminated + WBUFB(buf,16) = type; + memcpy((char*)WBUFP(buf,17), cd->title, strlen(cd->title)); // not zero-terminated - clif_send(buf,WBUFW(buf,2),&cd->usersd[0]->bl,CHAT); + clif_send(buf,WBUFW(buf,2),cd->owner,CHAT); } /*========================================== @@ -3396,7 +3412,7 @@ void clif_addchat(struct chat_data* cd,struct map_session_data *sd) nullpo_retv(sd); nullpo_retv(cd); - WBUFW(buf, 0) = 0x0dc; + WBUFW(buf, 0) = 0xdc; WBUFW(buf, 2) = cd->users; memcpy(WBUFP(buf, 4),sd->status.name,NAME_LENGTH); clif_send(buf,packet_len(0xdc),&sd->bl,CHAT_WOS); @@ -4278,8 +4294,7 @@ void clif_skillinfoblock(struct map_session_data *sd) if( (id = sd->status.skill[i].id) != 0 ) { WFIFOW(fd,len) = id; - WFIFOW(fd,len+2) = skill_get_inf(id); - WFIFOW(fd,len+4) = 0; + WFIFOL(fd,len+2) = skill_get_inf(id); WFIFOW(fd,len+6) = sd->status.skill[i].lv; WFIFOW(fd,len+8) = skill_get_sp(id,sd->status.skill[i].lv); WFIFOW(fd,len+10)= skill_get_range2(&sd->bl, id,sd->status.skill[i].lv); @@ -4312,8 +4327,7 @@ void clif_addskill(struct map_session_data *sd, int id ) WFIFOHEAD(fd, packet_len(0x111)); WFIFOW(fd,0) = 0x111; WFIFOW(fd,2) = id; - WFIFOW(fd,4) = skill_get_inf(id); - WFIFOW(fd,6) = 0; + WFIFOL(fd,4) = skill_get_inf(id); WFIFOW(fd,8) = sd->status.skill[id].lv; WFIFOW(fd,10) = skill_get_sp(id,sd->status.skill[id].lv); WFIFOW(fd,12)= skill_get_range2(&sd->bl, id,sd->status.skill[id].lv); @@ -4415,7 +4429,7 @@ void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, WBUFL(buf,16) = property<0?0:property; //Avoid sending negatives as element [Skotlex] WBUFL(buf,20) = casttime; #if PACKETVER >= 20091124 - WBUFB(buf,24) = 1; // isDisposable + WBUFB(buf,24) = 0; // isDisposable #endif if (disguised(bl)) { @@ -4517,11 +4531,11 @@ void clif_skill_cooldown(struct map_session_data *sd, int skillid, unsigned int nullpo_retv(sd); fd=sd->fd; - WFIFOHEAD(fd,packet_len(0x043d)); - WFIFOW(fd,0) = 0x043d; + WFIFOHEAD(fd,packet_len(0x43d)); + WFIFOW(fd,0) = 0x43d; WFIFOW(fd,2) = skillid; WFIFOL(fd,4) = tick; - WFIFOSET(fd,packet_len(0x043d)); + WFIFOSET(fd,packet_len(0x43d)); #endif } @@ -4890,8 +4904,9 @@ void clif_skill_produce_mix_list(struct map_session_data *sd, int skillid , int WFIFOW(fd,c*8+ 4)= view; else WFIFOW(fd,c*8+ 4)= skill_produce_db[i].nameid; - WFIFOW(fd,c*8+ 6)= 0x0012; - WFIFOL(fd,c*8+ 8)= sd->status.char_id; + WFIFOW(fd,c*8+ 6)= 0; + WFIFOW(fd,c*8+ 8)= 0; + WFIFOW(fd,c*8+10)= 0; c++; } } @@ -4988,10 +5003,11 @@ void clif_status_change(struct block_list *bl,int type,int flag,unsigned int tic type == SI_DEVIL || type == SI_NIGHT || type == SI_INTRAVISION) tick=0; +// TODO: 0x43f PACKETVER? if( battle_config.display_status_timers && tick>0 ) - WBUFW(buf,0)=0x043f; + WBUFW(buf,0)=0x43f; else - WBUFW(buf,0)=0x0196; + WBUFW(buf,0)=0x196; WBUFW(buf,2)=type; WBUFL(buf,4)=bl->id; WBUFB(buf,8)=flag; @@ -5148,7 +5164,7 @@ void clif_resurrection(struct block_list *bl,int type) WBUFW(buf,0)=0x148; WBUFL(buf,2)=bl->id; - WBUFW(buf,6)=type; + WBUFW(buf,6)=0; clif_send(buf,packet_len(0x148),bl,type==1 ? AREA : AREA_WOS); if (disguised(bl)) @@ -5278,6 +5294,7 @@ void clif_wis_message(int fd, const char* nick, const char* mes, int mes_len) WFIFOW(fd,2) = mes_len + NAME_LENGTH + 8; safestrncpy((char*)WFIFOP(fd,4), nick, NAME_LENGTH); WFIFOL(fd,28) = 0; // isAdmin; if nonzero, also displays text above char + // TODO: WFIFOL(fd,28) = ( pc_isGM(ssd) >= battle_config.lowest_gm_level ); safestrncpy((char*)WFIFOP(fd,32), mes, mes_len); WFIFOSET(fd,WFIFOW(fd,2)); #endif @@ -5329,7 +5346,7 @@ void clif_use_card(struct map_session_data *sd,int idx) ep=sd->inventory_data[idx]->equip; WFIFOHEAD(fd,MAX_INVENTORY * 2 + 4); - WFIFOW(fd,0)=0x017b; + WFIFOW(fd,0)=0x17b; for(i=c=0;i<MAX_INVENTORY;i++){ int j; @@ -5443,9 +5460,8 @@ void clif_item_repair_list(struct map_session_data *sd,struct map_session_data * if((nameid=dstsd->status.inventory[i].nameid) > 0 && dstsd->status.inventory[i].attribute!=0){// && skill_can_repair(sd,nameid)){ WFIFOW(fd,c*13+4) = i; WFIFOW(fd,c*13+6) = nameid; - WFIFOL(fd,c*13+8) = sd->status.char_id; - WFIFOL(fd,c*13+12)= dstsd->status.char_id; - WFIFOB(fd,c*13+16)= c; + WFIFOB(fd,c*13+8) = dstsd->status.inventory[i].refine; + clif_addcards(WFIFOP(fd,c*13+9), &dstsd->status.inventory[i]); c++; } } @@ -5501,12 +5517,11 @@ void clif_item_refine_list(struct map_session_data *sd) for(i=c=0;i<MAX_INVENTORY;i++){ if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].refine < skilllv && sd->status.inventory[i].identify && (wlv=itemdb_wlv(sd->status.inventory[i].nameid)) >=1 && - refine_item[wlv]!=-1 && !(sd->status.inventory[i].equip&0x0022)){ + refine_item[wlv]!=-1 && !(sd->status.inventory[i].equip&EQP_ARMS)){ WFIFOW(fd,c*13+ 4)=i+2; WFIFOW(fd,c*13+ 6)=sd->status.inventory[i].nameid; - WFIFOW(fd,c*13+ 8)=0; //TODO: Wonder what are these for? Perhaps ID of weapon's crafter if any? - WFIFOW(fd,c*13+10)=0; - WFIFOB(fd,c*13+12)=c; + WFIFOB(fd,c*13+ 8)=sd->status.inventory[i].refine; + clif_addcards(WFIFOP(fd,c*13+9), &sd->status.inventory[i]); c++; } } @@ -5821,7 +5836,7 @@ void clif_party_created(struct map_session_data *sd,int result) void clif_party_member_info(struct party_data *p, struct map_session_data *sd) { - unsigned char buf[96]; + unsigned char buf[81]; int i; if (!sd) { //Pick any party member (this call is used when changing item share rules) @@ -5840,7 +5855,7 @@ void clif_party_member_info(struct party_data *p, struct map_session_data *sd) WBUFB(buf,14) = (p->party.member[i].online)?0:1; memcpy(WBUFP(buf,15), p->party.name, NAME_LENGTH); memcpy(WBUFP(buf,39), sd->status.name, NAME_LENGTH); - mapindex_getmapname_ext(mapindex_id2name(sd->mapindex), (char*)WBUFP(buf,63)); + mapindex_getmapname_ext(map[sd->bl.m].name, (char*)WBUFP(buf,63)); WBUFB(buf,79) = (p->party.item&1)?1:0; WBUFB(buf,80) = (p->party.item&2)?1:0; clif_send(buf,packet_len(0x1e9),&sd->bl,PARTY); @@ -5980,7 +5995,7 @@ void clif_party_inviteack(struct map_session_data* sd, const char* nick, int res void clif_party_option(struct party_data *p,struct map_session_data *sd,int flag) { unsigned char buf[16]; -#if PACKETVER<20090603 +#if PACKETVER < 20090603 const int cmd = 0x101; #else const int cmd = 0x7d8; @@ -5996,10 +6011,8 @@ void clif_party_option(struct party_data *p,struct map_session_data *sd,int flag } if(!sd) return; WBUFW(buf,0)=cmd; - // WBUFL(buf,2) // that's how the client reads it, still need to check it's uses [FlavioJS] - WBUFW(buf,2)=((flag&0x01)?2:p->party.exp); - WBUFW(buf,4)=0; -#if PACKETVER>=20090603 + WBUFL(buf,2)=((flag&0x01)?2:p->party.exp); +#if PACKETVER >= 20090603 WBUFB(buf,6)=(p->party.item&1)?1:0; WBUFB(buf,7)=(p->party.item&2)?1:0; #endif @@ -6507,7 +6520,7 @@ void clif_devotion(struct block_list *src, struct map_session_data *tsd) *------------------------------------------*/ void clif_spiritball(struct map_session_data *sd) { - unsigned char buf[16]; + unsigned char buf[8]; nullpo_retv(sd); @@ -6739,8 +6752,8 @@ void clif_guild_basicinfo(struct map_session_data *sd) WFIFOL(fd,22)=(uint32)cap_value(g->exp,0,INT32_MAX); WFIFOL(fd,26)=g->next_exp; WFIFOL(fd,30)=0; // Tax Points - WFIFOL(fd,34)=0; // Tendency: (left) Vulgar [-100,100] Famed (right) - WFIFOL(fd,38)=0; // Tendency: (down) Wicked [-100,100] Righteous (up) + WFIFOL(fd,34)=0; // Honor: (left) Vulgar [-100,100] Famed (right) + WFIFOL(fd,38)=0; // Virtue: (down) Wicked [-100,100] Righteous (up) WFIFOL(fd,42)=g->emblem_id; memcpy(WFIFOP(fd,46),g->name, NAME_LENGTH); memcpy(WFIFOP(fd,70),g->master, NAME_LENGTH); @@ -6751,9 +6764,10 @@ void clif_guild_basicinfo(struct map_session_data *sd) if(gc && g->guild_id == gc->guild_id) t++; } - strncpy((char*)WFIFOP(fd,94),msg_txt(300+t),20); // "'N' castles" + safestrncpy((char*)WFIFOP(fd,94),msg_txt(300+t),16); // "'N' castles" + WFIFOL(fd,110) = 0; // zeny - WFIFOSET(fd,packet_len(WFIFOW(fd,0))); + WFIFOSET(fd,packet_len(0x1b6)); } /*========================================== @@ -6874,18 +6888,23 @@ void clif_guild_positioninfolist(struct map_session_data *sd) *------------------------------------------*/ void clif_guild_positionchanged(struct guild *g,int idx) { + // FIXME: This packet is intended to update the clients after a + // commit of position info changes, not sending one packet per + // position. struct map_session_data *sd; unsigned char buf[128]; nullpo_retv(g); WBUFW(buf, 0)=0x174; - WBUFW(buf, 2)=44; + WBUFW(buf, 2)=44; // packet len + // GUILD_REG_POSITION_INFO{ WBUFL(buf, 4)=idx; WBUFL(buf, 8)=g->position[idx].mode; WBUFL(buf,12)=idx; WBUFL(buf,16)=g->position[idx].exp_mode; memcpy(WBUFP(buf,20),g->position[idx].name,NAME_LENGTH); + // }* if( (sd=guild_getavailablesd(g))!=NULL ) clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD); } @@ -6894,16 +6913,21 @@ void clif_guild_positionchanged(struct guild *g,int idx) *------------------------------------------*/ void clif_guild_memberpositionchanged(struct guild *g,int idx) { + // FIXME: This packet is intended to update the clients after a + // commit of member position assignment changes, not sending one + // packet per position. struct map_session_data *sd; unsigned char buf[64]; nullpo_retv(g); WBUFW(buf, 0)=0x156; - WBUFW(buf, 2)=16; + WBUFW(buf, 2)=16; // packet len + // MEMBER_POSITION_INFO{ WBUFL(buf, 4)=g->member[idx].account_id; WBUFL(buf, 8)=g->member[idx].char_id; WBUFL(buf,12)=g->member[idx].position; + // }* if( (sd=guild_getavailablesd(g))!=NULL ) clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD); } @@ -6938,7 +6962,7 @@ void clif_guild_emblem_area(struct block_list* bl) // TODO this packet doesn't force the update of ui components that have the emblem visible // (emblem in the flag npcs and emblem over the head in agit maps) [FlavioJS] - WBUFW(buf,0) = 0x1B4; + WBUFW(buf,0) = 0x1b4; WBUFL(buf,2) = bl->id; WBUFL(buf,6) = status_get_guild_id(bl); WBUFW(buf,10) = status_get_emblem_id(bl); @@ -6969,8 +6993,7 @@ void clif_guild_skillinfo(struct map_session_data* sd) int id = g->skill[i].id; int p = 6 + c*37; WFIFOW(fd,p+0) = id; - WFIFOW(fd,p+2) = skill_get_inf(id); - WFIFOW(fd,p+4) = 0; + WFIFOL(fd,p+2) = skill_get_inf(id); WFIFOW(fd,p+6) = g->skill[i].lv; WFIFOW(fd,p+8) = skill_get_sp(id, g->skill[i].lv); WFIFOW(fd,p+10) = skill_get_range(id, g->skill[i].lv); @@ -7252,15 +7275,17 @@ void clif_guild_oppositionack(struct map_session_data *sd,int flag) /*========================================== * ギルド関係追加 *------------------------------------------*/ -/*void clif_guild_allianceadded(struct guild *g,int idx) +/* +void clif_guild_allianceadded(struct guild *g,int idx) { unsigned char buf[64]; - WBUFW(fd,0)=0x185; - WBUFL(fd,2)=g->alliance[idx].opposition; - WBUFL(fd,6)=g->alliance[idx].guild_id; - memcpy(WBUFP(fd,10),g->alliance[idx].name,NAME_LENGTH); + WBUFW(buf,0)=0x185; + WBUFL(buf,2)=g->alliance[idx].opposition; + WBUFL(buf,6)=g->alliance[idx].guild_id; + memcpy(WBUFP(buf,10),g->alliance[idx].name,NAME_LENGTH); clif_send(buf,packet_len(0x185),guild_getavailablesd(g),GUILD); -}*/ +} +*/ /*========================================== * Server tells client 'sd' that guild broke because of 'flag' reason @@ -7298,7 +7323,7 @@ void clif_emotion(struct block_list *bl,int type) *------------------------------------------*/ void clif_talkiebox(struct block_list* bl, const char* talkie) { - unsigned char buf[86]; + unsigned char buf[MESSAGE_SIZE+6]; nullpo_retv(bl); WBUFW(buf,0) = 0x191; @@ -7378,12 +7403,15 @@ void clif_divorced(struct map_session_data* sd, const char* name) /*========================================== * *------------------------------------------*/ -void clif_parse_ReqMarriage(int fd, struct map_session_data *sd) +void clif_marriage_proposal(int fd, struct map_session_data *sd, struct map_session_data* ssd) { nullpo_retv(sd); WFIFOHEAD(fd,packet_len(0x1e2)); - WFIFOW(fd,0)=0x1e2; + WFIFOW(fd,0) = 0x1e2; + WFIFOL(fd,2) = ssd->status.account_id; + WFIFOL(fd,6) = ssd->status.char_id; + safestrncpy((char*)WFIFOP(fd,10), ssd->status.name, NAME_LENGTH); WFIFOSET(fd, packet_len(0x1e2)); } @@ -7672,7 +7700,7 @@ void clif_refresh(struct map_session_data *sd) if (sd->vd.cloth_color) clif_refreshlook(&sd->bl,sd->bl.id,LOOK_CLOTHES_COLOR,sd->vd.cloth_color,SELF); if(merc_is_hom_active(sd->hd)) - clif_send_homdata(sd,0,0); + clif_send_homdata(sd,SP_ACK,0); if( sd->md ) { clif_mercenary_info(sd); @@ -8206,11 +8234,6 @@ static bool clif_process_message(struct map_session_data* sd, int format, char** packetlen = RFIFOW(fd,2); // basic structure checks - if( packetlen > RFIFOREST(fd) ) - { // there has to be enough data to read - ShowWarning("clif_process_message: Received malformed packet from player '%s' (packet length is incorrect)!\n", sd->status.name); - return false; - } if( packetlen < 4 + 1 ) { // 4-byte header and at least an empty string is expected ShowWarning("clif_process_message: Received malformed packet from player '%s' (no message data)!\n", sd->status.name); @@ -8592,7 +8615,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) { map_addblock(&sd->hd->bl); clif_spawn(&sd->hd->bl); - clif_send_homdata(sd,0,0); + clif_send_homdata(sd,SP_ACK,0); clif_hominfo(sd,sd->hd,1); clif_hominfo(sd,sd->hd,0); //for some reason, at least older clients want this sent twice clif_homskillinfoblock(sd); @@ -8768,10 +8791,10 @@ void clif_hotkeys_send(struct map_session_data *sd) { #ifdef HOTKEY_SAVING const int fd = sd->fd; int i; -#if PACKETVER<20090603 - const int cmd = 0x02b9; +#if PACKETVER < 20090603 + const int cmd = 0x2b9; #else - const int cmd = 0x07d9; + const int cmd = 0x7d9; #endif if (!fd) return; WFIFOHEAD(fd, 2+MAX_HOTKEYS*7); @@ -9481,7 +9504,7 @@ void clif_parse_UseItem(int fd, struct map_session_data *sd) if(n <0 || n >= MAX_INVENTORY) return; if (!pc_useitem(sd,n)) - clif_useitemack(sd,n,0,0); //Send an empty ack packet or the client gets stuck. + clif_useitemack(sd,n,0,false); //Send an empty ack packet or the client gets stuck. } /*========================================== @@ -10080,7 +10103,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) /*========================================== * Client tells server he'd like to use AoE skill id 'skillnum' of level 'skilllv' on 'x','y' location *------------------------------------------*/ -void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, short skilllv, short skillnum, short x, short y, int skillmoreinfo) +static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, short skilllv, short skillnum, short x, short y, int skillmoreinfo) { int lv; unsigned int tick = gettick(); @@ -10286,7 +10309,7 @@ void clif_parse_WeaponRefine(int fd, struct map_session_data *sd) sd->menuskill_val = sd->menuskill_id = 0; return; } - idx = RFIFOW(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0]); + idx = RFIFOL(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0]); skill_weaponrefine(sd, idx-2); sd->menuskill_val = sd->menuskill_id = 0; } @@ -10414,7 +10437,7 @@ void clif_parse_AutoSpell(int fd,struct map_session_data *sd) { if (sd->menuskill_id != SA_AUTOSPELL) return; - skill_autospell(sd,RFIFOW(fd,2)); + skill_autospell(sd,RFIFOL(fd,2)); sd->menuskill_val = sd->menuskill_id = 0; } /*========================================== @@ -10757,9 +10780,9 @@ void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) #if PACKETVER < 20090603 //Client can't change the item-field - party_changeoption(sd, RFIFOW(fd,2), p->party.item); + party_changeoption(sd, RFIFOL(fd,2), p->party.item); #else - party_changeoption(sd, RFIFOL(fd,2), ((RFIFOB(fd,6)?1:0)+(RFIFOB(fd,7)?2:0))); + party_changeoption(sd, RFIFOL(fd,2), ((RFIFOB(fd,6)?1:0)|(RFIFOB(fd,7)?2:0))); #endif } @@ -10839,7 +10862,7 @@ void clif_parse_PartyBookingSearchReq(int fd, struct map_session_data* sd) short mapid = RFIFOW(fd,4); short job = RFIFOW(fd,6); unsigned long lastindex = RFIFOL(fd,8); - short resultcount = RFIFOB(fd,12); + short resultcount = RFIFOW(fd,12); party_booking_search(sd, level, mapid, job, lastindex, resultcount); } @@ -10861,7 +10884,7 @@ void clif_PartyBookingSearchAck(int fd, struct party_booking_ad_info** results, pb_ad = results[i]; WFIFOL(fd,i*size+5) = pb_ad->index; memcpy(WFIFOP(fd,i*size+9),pb_ad->charname,NAME_LENGTH); - WFIFOL(fd,i*size+33) = pb_ad->starttime; + WFIFOL(fd,i*size+33) = pb_ad->starttime; // FIXME: This is expire time WFIFOW(fd,i*size+37) = pb_ad->p_detail.level; WFIFOW(fd,i*size+39) = pb_ad->p_detail.mapid; for(j=0; j<PARTY_BOOKING_JOBS; j++) @@ -10910,7 +10933,7 @@ void clif_PartyBookingInsertNotify(struct map_session_data* sd, struct party_boo WBUFW(buf,0) = 0x809; WBUFL(buf,2) = pb_ad->index; memcpy(WBUFP(buf,6),pb_ad->charname,NAME_LENGTH); - WBUFL(buf,30) = pb_ad->starttime; + WBUFL(buf,30) = pb_ad->starttime; // FIXME: This is expire time WBUFW(buf,34) = pb_ad->p_detail.level; WBUFW(buf,36) = pb_ad->p_detail.mapid; for(i=0; i<PARTY_BOOKING_JOBS; i++) @@ -11217,7 +11240,7 @@ void clif_parse_GuildInvite(int fd,struct map_session_data *sd) *------------------------------------------*/ void clif_parse_GuildReplyInvite(int fd,struct map_session_data *sd) { - guild_reply_invite(sd,RFIFOL(fd,2),RFIFOB(fd,6)); + guild_reply_invite(sd,RFIFOL(fd,2),RFIFOL(fd,6)); } /*========================================== @@ -12136,7 +12159,11 @@ void clif_parse_FriendsListReply(int fd, struct map_session_data *sd) account_id = RFIFOL(fd,2); char_id = RFIFOL(fd,6); +#if PACKETVER < 6 reply = RFIFOB(fd,10); +#else + reply = RFIFOL(fd,10); +#endif if( sd->bl.id == account_id ) {// adding oneself as friend @@ -12435,6 +12462,7 @@ void clif_feel_req(int fd, struct map_session_data *sd, int skilllv) { WFIFOHEAD(fd,packet_len(0x253)); WFIFOW(fd,0)=0x253; + WFIFOB(fd,2)=TOB(skilllv-1); WFIFOSET(fd, packet_len(0x253)); sd->menuskill_id = SG_FEEL; sd->menuskill_val = skilllv; @@ -12458,7 +12486,8 @@ void clif_parse_HomMoveToMaster(int fd, struct map_session_data *sd) bl = &sd->md->bl; else if( merc_is_hom_active(sd->hd) && sd->hd->bl.id == id ) bl = &sd->hd->bl; // Moving Homunculus - else return; + else + return; unit_calc_pos(bl, sd->bl.x, sd->bl.y, sd->ud.dir); ud = unit_bl2ud(bl); @@ -12477,7 +12506,8 @@ void clif_parse_HomMoveTo(int fd, struct map_session_data *sd) bl = &sd->md->bl; // Moving Mercenary else if( merc_is_hom_active(sd->hd) && sd->hd->bl.id == id ) bl = &sd->hd->bl; // Moving Homunculus - else return; + else + return; unit_walktoxy(bl, x, y, 4); } @@ -12508,7 +12538,7 @@ void clif_parse_HomMenu(int fd, struct map_session_data *sd) if(!merc_is_hom_active(sd->hd)) return; - merc_menu(sd,RFIFOB(fd,packet_db[sd->packet_ver][cmd].pos[0])); + merc_menu(sd,RFIFOB(fd,packet_db[sd->packet_ver][cmd].pos[1])); } void clif_parse_AutoRevive(int fd, struct map_session_data *sd) @@ -12725,7 +12755,7 @@ void clif_Mail_refreshinbox(struct map_session_data *sd) WFIFOSET(fd,len); if( md->full ) - { + {// TODO: is this official? char output[100]; sprintf(output, "Inbox is full (Max %d). Delete some mails.", MAIL_MAX_INBOX); clif_disp_onlyself(sd, output, strlen(output)); @@ -13482,7 +13512,7 @@ void clif_Adopt_reply(struct map_session_data *sd, int type) int fd = sd->fd; WFIFOHEAD(fd,6); - WFIFOW(fd,0) = 0x0216; + WFIFOW(fd,0) = 0x216; WFIFOL(fd,2) = type; WFIFOSET(fd,6); } @@ -13492,7 +13522,7 @@ void clif_Adopt_request(struct map_session_data *sd, struct map_session_data *sr int fd = sd->fd; WFIFOHEAD(fd,34); - WFIFOW(fd,0) = 0x01f6; + WFIFOW(fd,0) = 0x1f6; WFIFOL(fd,2) = src->status.account_id; WFIFOL(fd,6) = p_id; memcpy(WFIFOP(fd,10), src->status.name, NAME_LENGTH); @@ -13546,7 +13576,7 @@ void clif_bossmapinfo(int fd, struct mob_data *md, short flag) { WFIFOHEAD(fd,70); memset(WFIFOP(fd,0),0,70); - WFIFOW(fd,0) = 0x0293; + WFIFOW(fd,0) = 0x293; if( md != NULL ) { @@ -13621,7 +13651,7 @@ void clif_quest_send_list(struct map_session_data * sd) int len = sd->avail_quests*5+8; WFIFOHEAD(fd,len); - WFIFOW(fd, 0) = 0x02B1; + WFIFOW(fd, 0) = 0x2b1; WFIFOW(fd, 2) = len; WFIFOL(fd, 4) = sd->avail_quests; @@ -13644,7 +13674,7 @@ void clif_quest_send_mission(struct map_session_data * sd) struct mob_db *mob; WFIFOHEAD(fd, len); - WFIFOW(fd, 0) = 0x02B2; + WFIFOW(fd, 0) = 0x2b2; WFIFOW(fd, 2) = len; WFIFOL(fd, 4) = sd->avail_quests; @@ -13674,8 +13704,8 @@ void clif_quest_add(struct map_session_data * sd, struct quest * qd, int index) int i; struct mob_db *mob; - WFIFOHEAD(fd, packet_len(0x02B3)); - WFIFOW(fd, 0) = 0x02B3; + WFIFOHEAD(fd, packet_len(0x2b3)); + WFIFOW(fd, 0) = 0x2b3; WFIFOL(fd, 2) = qd->quest_id; WFIFOB(fd, 6) = qd->state; WFIFOB(fd, 7) = qd->time - quest_db[index].time; @@ -13690,7 +13720,7 @@ void clif_quest_add(struct map_session_data * sd, struct quest * qd, int index) memcpy(WFIFOP(fd, i*30+23), mob?mob->jname:"NULL", NAME_LENGTH); } - WFIFOSET(fd, packet_len(0x02B3)); + WFIFOSET(fd, packet_len(0x2b3)); } //* 02B4 <quest_id>.L @@ -13698,10 +13728,10 @@ void clif_quest_delete(struct map_session_data * sd, int quest_id) { int fd = sd->fd; - WFIFOHEAD(fd, packet_len(0x02B4)); - WFIFOW(fd, 0) = 0x02B4; + WFIFOHEAD(fd, packet_len(0x2b4)); + WFIFOW(fd, 0) = 0x2b4; WFIFOL(fd, 2) = quest_id; - WFIFOSET(fd, packet_len(0x02B4)); + WFIFOSET(fd, packet_len(0x2b4)); } //* 02b5 <packet_len>.w <mob_num>.w { <quest_id>.d <mob_id>.d <count_total>.w <count_partial>.w }.mob_num @@ -13712,7 +13742,7 @@ void clif_quest_update_objective(struct map_session_data * sd, struct quest * qd int len = quest_db[index].num_objectives*12+6; WFIFOHEAD(fd, len); - WFIFOW(fd, 0) = 0x02B5; + WFIFOW(fd, 0) = 0x2b5; WFIFOW(fd, 2) = len; WFIFOW(fd, 4) = quest_db[index].num_objectives; @@ -13739,11 +13769,11 @@ void clif_quest_update_status(struct map_session_data * sd, int quest_id, bool a { int fd = sd->fd; - WFIFOHEAD(fd, packet_len(0x02B7)); - WFIFOW(fd, 0) = 0x02B7; + WFIFOHEAD(fd, packet_len(0x2b7)); + WFIFOW(fd, 0) = 0x2b7; WFIFOL(fd, 2) = quest_id; WFIFOB(fd, 6) = active; - WFIFOSET(fd, packet_len(0x02B7)); + WFIFOSET(fd, packet_len(0x2b7)); } void clif_quest_show_event(struct map_session_data *sd, struct block_list *bl, short state, short color) @@ -13775,8 +13805,8 @@ void clif_mercenary_updatestatus(struct map_session_data *sd, int type) fd = sd->fd; status = &md->battle_status; - WFIFOHEAD(fd,8); - WFIFOW(fd,0) = 0x02a2; + WFIFOHEAD(fd,packet_len(0x2a2)); + WFIFOW(fd,0) = 0x2a2; WFIFOW(fd,2) = type; switch( type ) { @@ -13826,7 +13856,7 @@ void clif_mercenary_updatestatus(struct map_session_data *sd, int type) WFIFOL(fd,4) = mercenary_get_faith(md); break; } - WFIFOSET(fd,8); + WFIFOSET(fd,packet_len(0x2a2)); } void clif_mercenary_info(struct map_session_data *sd) @@ -13842,8 +13872,8 @@ void clif_mercenary_info(struct map_session_data *sd) fd = sd->fd; status = &md->battle_status; - WFIFOHEAD(fd,80); - WFIFOW(fd,0) = 0x029b; + WFIFOHEAD(fd,packet_len(0x29b)); + WFIFOW(fd,0) = 0x29b; WFIFOL(fd,2) = md->bl.id; // Mercenary shows ATK as a random value between ATK ~ ATK2 @@ -13867,7 +13897,7 @@ void clif_mercenary_info(struct map_session_data *sd) WFIFOL(fd,70) = mercenary_get_calls(md); WFIFOL(fd,74) = md->mercenary.kill_count; WFIFOW(fd,78) = md->battle_status.rhw.range; - WFIFOSET(fd,80); + WFIFOSET(fd,packet_len(0x29b)); } void clif_mercenary_skillblock(struct map_session_data *sd) @@ -13880,15 +13910,14 @@ void clif_mercenary_skillblock(struct map_session_data *sd) fd = sd->fd; WFIFOHEAD(fd,4+37*MAX_MERCSKILL); - WFIFOW(fd,0) = 0x029d; + WFIFOW(fd,0) = 0x29d; for( i = 0; i < MAX_MERCSKILL; i++ ) { if( (id = md->db->skill[i].id) == 0 ) continue; j = id - MC_SKILLBASE; WFIFOW(fd,len) = id; - WFIFOW(fd,len+2) = skill_get_inf(id); - WFIFOW(fd,len+4) = 0; + WFIFOL(fd,len+2) = skill_get_inf(id); WFIFOW(fd,len+6) = md->db->skill[j].lv; WFIFOW(fd,len+8) = skill_get_sp(id, md->db->skill[j].lv); WFIFOW(fd,len+10) = skill_get_range2(&md->bl, id, md->db->skill[j].lv); @@ -13927,11 +13956,11 @@ void clif_mercenary_message(struct map_session_data* sd, int message) *------------------------------------------*/ void clif_rental_time(int fd, int nameid, int seconds) { // '<ItemName>' item will disappear in <seconds/60> minutes. - WFIFOHEAD(fd,8); - WFIFOW(fd,0) = 0x0298; + WFIFOHEAD(fd,packet_len(0x298)); + WFIFOW(fd,0) = 0x298; WFIFOW(fd,2) = nameid; WFIFOL(fd,4) = seconds; - WFIFOSET(fd,8); + WFIFOSET(fd,packet_len(0x298)); } @@ -13939,11 +13968,11 @@ void clif_rental_time(int fd, int nameid, int seconds) /// 0299 <index>.W <nameid>.W void clif_rental_expired(int fd, int index, int nameid) { // '<ItemName>' item has been deleted from the Inventory - WFIFOHEAD(fd,6); - WFIFOW(fd,0) = 0x0299; + WFIFOHEAD(fd,packet_len(0x299)); + WFIFOW(fd,0) = 0x299; WFIFOW(fd,2) = index+2; WFIFOW(fd,4) = nameid; - WFIFOSET(fd,6); + WFIFOSET(fd,packet_len(0x299)); } /*------------------------------------------ @@ -13951,11 +13980,11 @@ void clif_rental_expired(int fd, int index, int nameid) *------------------------------------------*/ void clif_readbook(int fd, int book_id, int page) { - WFIFOHEAD(fd,10); - WFIFOW(fd,0) = 0x0294; + WFIFOHEAD(fd,packet_len(0x294)); + WFIFOW(fd,0) = 0x294; WFIFOL(fd,2) = book_id; WFIFOL(fd,6) = page; - WFIFOSET(fd,10); + WFIFOSET(fd,packet_len(0x294)); } /*------------------------------------------ @@ -14034,7 +14063,8 @@ void clif_bg_message(struct battleground_data *bg, int src_id, const char *name, memcpy(WBUFP(buf,32), mes, len); clif_send(buf,WBUFW(buf,2), &sd->bl, BG); - if( buf ) aFree(buf); + if( buf ) + aFree(buf); } /*========================================== @@ -14080,7 +14110,7 @@ void clif_bg_updatescore(int m) WBUFW(buf,0) = 0x2de; WBUFW(buf,2) = map[m].bgscore_lion; WBUFW(buf,4) = map[m].bgscore_eagle; - clif_send(buf,6,&bl,ALL_SAMEMAP); + clif_send(buf,packet_len(0x2de),&bl,ALL_SAMEMAP); } void clif_bg_updatescore_single(struct map_session_data *sd) @@ -14088,12 +14118,12 @@ void clif_bg_updatescore_single(struct map_session_data *sd) int fd; nullpo_retv(sd); fd = sd->fd; - - WFIFOHEAD(fd,6); + + WFIFOHEAD(fd,packet_len(0x2de)); WFIFOW(fd,0) = 0x2de; WFIFOW(fd,2) = map[sd->bl.m].bgscore_lion; WFIFOW(fd,4) = map[sd->bl.m].bgscore_eagle; - WFIFOSET(fd,6); + WFIFOSET(fd,packet_len(0x2de)); } void clif_sendbgemblem_area(struct map_session_data *sd) @@ -14125,12 +14155,14 @@ void clif_sendbgemblem_single(int fd, struct map_session_data *sd) *------------------------------------------*/ void clif_font(struct map_session_data *sd) { +#if PACKETVER >= 20080102 unsigned char buf[8]; nullpo_retv(sd); WBUFW(buf,0) = 0x2ef; WBUFL(buf,2) = sd->bl.id; WBUFW(buf,6) = sd->user_font; clif_send(buf, packet_len(0x2ef), &sd->bl, AREA); +#endif } /*========================================== @@ -14240,7 +14272,7 @@ void clif_party_show_picker(struct map_session_data * sd, struct item * item_dat unsigned char buf[22]; struct item_data* id = itemdb_search(item_data->nameid); - WBUFW(buf,0)=0x2b8; + WBUFW(buf,0) = 0x2b8; WBUFL(buf,2) = sd->status.account_id; WBUFW(buf,6) = item_data->nameid; WBUFB(buf,8) = item_data->identify; @@ -14273,8 +14305,6 @@ void clif_displayexp(struct map_session_data *sd, unsigned int exp, char type, b WFIFOW(fd,10) = type; WFIFOW(fd,12) = quest?1:0;// Normal exp is shown in yellow, quest exp is shown in purple. WFIFOSET(fd,packet_len(0x7f6)); - - return; } /// Displays digital clock digits on top of the screen (ZC_SHOWDIGIT). @@ -15299,7 +15329,7 @@ static int packetdb_readdb(void) #else // 0x22c changed 10, -1, -1, 8, 10, 2,282, 18, 18, 15, 58, 57, 65, 5, 71, 5, #endif - 12, 26, 9, 11, -1, -1, 10, 2,282, 11, 4, 36, -1, -1, 4, 2, + 12, 26, 9, 11, -1, -1, 10, 2,282, 11, 4, 36, 6, -1, 4, 2, //#0x0240 -1, -1, -1, -1, -1, 3, 4, 8, -1, 3, 70, 4, 8, 12, 4, 10, 3, 32, -1, 3, 3, 5, 5, 8, 2, 3, -1, 6, 4, 6, 4, 6, @@ -15307,17 +15337,17 @@ static int packetdb_readdb(void) 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //#0x0280 #if PACKETVER < 20070711 - 0, 0, 0, 6, 0, 0, 0, -1, 6, 8, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 14, 0, 0, -1, 6, 8, 18, 0, 0, 0, 0, 0, #else - 0, 0, 0, 6, 0, 0, 0, -1, 10, 12, 18, 0, 0, 0, 0, 0, // 0x288, 0x289 increase by 4 (kafra points) + 0, 0, 0, 6, 14, 0, 0, -1, 10, 12, 18, 0, 0, 0, 0, 0, // 0x288, 0x289 increase by 4 (kafra points) #endif - 0, 4, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 70, 10, 0, 0, 0, 8, 6, 27, 80, 0, -1, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, -1, -1,107, 6, -1, 7, 7, 22,191, 0, 0, 0, 0, 0, 0, //#0x02C0 - 0, 0, 0, 0, 0, 30, 30, 0, 0, 3, 0, 65, 4, 71, 10, 0, - 0, 0, 0, 0, 29, 0, 6, -1, 10, 10, 3, 0, -1, 32, 6, 36, - 34, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 59, 60, 8, + 0, -1, 0, 0, 0, 30, 30, 0, 0, 3, 0, 65, 4, 71, 10, 0, + -1, -1, -1, 0, 29, 0, 6, -1, 10, 10, 3, 0, -1, 32, 6, 36, + 34, 33, 0, 0, 0, 0, 0, 0, -1, -1, -1, 13, 67, 59, 60, 8, 10, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //#0x0300 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -15421,11 +15451,11 @@ static int packetdb_readdb(void) #else // 0x7d9 changed 6, 2, -1, 4, 4, 4, 4, 8, 8,268, 6, 8, 6, 54, 30, 54, #endif - 0, 15, 0, 0, 0, 8, 8, 32, -1, 5, 0, 0, 0, 0, 0, 0, + 0, 15, 8, 0, 0, 8, 8, 32, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, -1, -1, -1, 8, 25, 0, 0, 26, 0, //#0x0800 #if PACKETVER < 20091229 - -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 20, + -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 20, #else // for Party booking ( PACKETVER >= 20091229 ) -1, -1, 18, 4, 8, 6, 2, 4, 14, 50, 18, 6, 2, 3, 14, 20, #endif |